From 436de2efd65a1d430528b9f435910e0365a71598 Mon Sep 17 00:00:00 2001 From: manhlab Date: Wed, 7 Apr 2021 19:25:18 -0400 Subject: [PATCH] update inbox list --- .env | 46 + .env.example | 46 + database/seeds/BookSeeder.php | 2 +- public/8.js | 2 +- .../src/components/document/CLinkDocument.vue | 2 +- vendor/asm89/stack-cors/LICENSE | 19 + vendor/asm89/stack-cors/README.md | 83 + vendor/asm89/stack-cors/composer.json | 43 + .../asm89/stack-cors/src/Asm89/Stack/Cors.php | 64 + .../src/Asm89/Stack/CorsService.php | 205 + vendor/autoload.php | 7 + vendor/bin/carbon | 1 + vendor/bin/commonmark | 1 + vendor/bin/php-parse | 1 + vendor/bin/phpunit | 1 + vendor/bin/psysh | 1 + vendor/bin/var-dump-server | 1 + vendor/brick/math/.github/FUNDING.yml | 1 + vendor/brick/math/LICENSE | 20 + vendor/brick/math/SECURITY.md | 16 + vendor/brick/math/composer.json | 35 + vendor/brick/math/psalm-baseline.xml | 40 + vendor/brick/math/psalm.xml | 56 + vendor/brick/math/src/BigDecimal.php | 855 + vendor/brick/math/src/BigInteger.php | 904 + vendor/brick/math/src/BigNumber.php | 528 + vendor/brick/math/src/BigRational.php | 479 + .../src/Exception/DivisionByZeroException.php | 31 + .../Exception/IntegerOverflowException.php | 27 + .../math/src/Exception/MathException.php | 14 + .../src/Exception/NegativeNumberException.php | 12 + .../src/Exception/NumberFormatException.php | 35 + .../Exception/RoundingNecessaryException.php | 21 + vendor/brick/math/src/Internal/Calculator.php | 686 + .../Internal/Calculator/BcMathCalculator.php | 92 + .../src/Internal/Calculator/GmpCalculator.php | 142 + .../Internal/Calculator/NativeCalculator.php | 616 + vendor/brick/math/src/RoundingMode.php | 107 + vendor/composer/ClassLoader.php | 479 + vendor/composer/InstalledVersions.php | 1533 + vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 4979 +++ vendor/composer/autoload_files.php | 94 + vendor/composer/autoload_namespaces.php | 12 + vendor/composer/autoload_psr4.php | 91 + vendor/composer/autoload_real.php | 75 + vendor/composer/autoload_static.php | 5582 ++++ vendor/composer/installed.json | 7438 +++++ vendor/composer/installed.php | 1274 + vendor/composer/platform_check.php | 26 + vendor/dnoegel/php-xdg-base-dir/LICENSE | 19 + vendor/dnoegel/php-xdg-base-dir/README.md | 41 + vendor/dnoegel/php-xdg-base-dir/composer.json | 17 + vendor/dnoegel/php-xdg-base-dir/src/Xdg.php | 132 + vendor/doctrine/inflector/LICENSE | 19 + vendor/doctrine/inflector/README.md | 8 + vendor/doctrine/inflector/composer.json | 40 + vendor/doctrine/inflector/docs/en/index.rst | 226 + .../Inflector/CachedWordInflector.php | 24 + .../GenericLanguageInflectorFactory.php | 65 + .../lib/Doctrine/Inflector/Inflector.php | 506 + .../Doctrine/Inflector/InflectorFactory.php | 45 + .../lib/Doctrine/Inflector/Language.php | 19 + .../Inflector/LanguageInflectorFactory.php | 33 + .../Doctrine/Inflector/NoopWordInflector.php | 13 + .../Inflector/Rules/English/Inflectible.php | 182 + .../Rules/English/InflectorFactory.php | 21 + .../Inflector/Rules/English/Rules.php | 31 + .../Inflector/Rules/English/Uninflected.php | 193 + .../Inflector/Rules/French/Inflectible.php | 49 + .../Rules/French/InflectorFactory.php | 21 + .../Doctrine/Inflector/Rules/French/Rules.php | 31 + .../Inflector/Rules/French/Uninflected.php | 34 + .../Rules/NorwegianBokmal/Inflectible.php | 40 + .../NorwegianBokmal/InflectorFactory.php | 21 + .../Inflector/Rules/NorwegianBokmal/Rules.php | 31 + .../Rules/NorwegianBokmal/Uninflected.php | 36 + .../lib/Doctrine/Inflector/Rules/Pattern.php | 42 + .../lib/Doctrine/Inflector/Rules/Patterns.php | 34 + .../Rules/Portuguese/Inflectible.php | 104 + .../Rules/Portuguese/InflectorFactory.php | 21 + .../Inflector/Rules/Portuguese/Rules.php | 31 + .../Rules/Portuguese/Uninflected.php | 38 + .../lib/Doctrine/Inflector/Rules/Ruleset.php | 39 + .../Inflector/Rules/Spanish/Inflectible.php | 53 + .../Rules/Spanish/InflectorFactory.php | 21 + .../Inflector/Rules/Spanish/Rules.php | 31 + .../Inflector/Rules/Spanish/Uninflected.php | 36 + .../Doctrine/Inflector/Rules/Substitution.php | 30 + .../Inflector/Rules/Substitutions.php | 56 + .../Inflector/Rules/Transformation.php | 38 + .../Inflector/Rules/Transformations.php | 29 + .../Inflector/Rules/Turkish/Inflectible.php | 40 + .../Rules/Turkish/InflectorFactory.php | 21 + .../Inflector/Rules/Turkish/Rules.php | 31 + .../Inflector/Rules/Turkish/Uninflected.php | 36 + .../lib/Doctrine/Inflector/Rules/Word.php | 21 + .../Doctrine/Inflector/RulesetInflector.php | 55 + .../lib/Doctrine/Inflector/WordInflector.php | 10 + vendor/doctrine/inflector/phpstan.neon.dist | 13 + .../instantiator/.doctrine-project.json | 26 + .../doctrine/instantiator/.github/FUNDING.yml | 3 + vendor/doctrine/instantiator/CONTRIBUTING.md | 35 + vendor/doctrine/instantiator/LICENSE | 19 + vendor/doctrine/instantiator/README.md | 39 + vendor/doctrine/instantiator/composer.json | 52 + .../doctrine/instantiator/docs/en/index.rst | 68 + .../doctrine/instantiator/docs/en/sidebar.rst | 4 + vendor/doctrine/instantiator/phpbench.json | 4 + vendor/doctrine/instantiator/phpcs.xml.dist | 35 + .../doctrine/instantiator/phpstan.neon.dist | 19 + .../Exception/ExceptionInterface.php | 12 + .../Exception/InvalidArgumentException.php | 37 + .../Exception/UnexpectedValueException.php | 48 + .../Doctrine/Instantiator/Instantiator.php | 203 + .../Instantiator/InstantiatorInterface.php | 20 + vendor/doctrine/lexer/LICENSE | 19 + vendor/doctrine/lexer/README.md | 9 + vendor/doctrine/lexer/composer.json | 41 + .../Doctrine/Common/Lexer/AbstractLexer.php | 328 + .../cron-expression/.editorconfig | 16 + .../cron-expression/CHANGELOG.md | 76 + vendor/dragonmantank/cron-expression/LICENSE | 19 + .../dragonmantank/cron-expression/README.md | 78 + .../cron-expression/composer.json | 40 + .../src/Cron/AbstractField.php | 286 + .../src/Cron/CronExpression.php | 413 + .../src/Cron/DayOfMonthField.php | 145 + .../src/Cron/DayOfWeekField.php | 196 + .../cron-expression/src/Cron/FieldFactory.php | 54 + .../src/Cron/FieldInterface.php | 41 + .../cron-expression/src/Cron/HoursField.php | 85 + .../cron-expression/src/Cron/MinutesField.php | 75 + .../cron-expression/src/Cron/MonthField.php | 59 + .../tests/Cron/AbstractFieldTest.php | 139 + .../tests/Cron/CronExpressionTest.php | 586 + .../tests/Cron/DayOfMonthFieldTest.php | 77 + .../tests/Cron/DayOfWeekFieldTest.php | 154 + .../tests/Cron/FieldFactoryTest.php | 42 + .../tests/Cron/HoursFieldTest.php | 99 + .../tests/Cron/MinutesFieldTest.php | 73 + .../tests/Cron/MonthFieldTest.php | 103 + vendor/egulias/email-validator/LICENSE | 19 + vendor/egulias/email-validator/composer.json | 38 + .../email-validator/src/EmailLexer.php | 279 + .../email-validator/src/EmailParser.php | 137 + .../email-validator/src/EmailValidator.php | 67 + .../src/Exception/AtextAfterCFWS.php | 9 + .../src/Exception/CRLFAtTheEnd.php | 9 + .../email-validator/src/Exception/CRLFX2.php | 9 + .../email-validator/src/Exception/CRNoLF.php | 9 + .../src/Exception/CharNotAllowed.php | 9 + .../src/Exception/CommaInDomain.php | 9 + .../src/Exception/ConsecutiveAt.php | 9 + .../src/Exception/ConsecutiveDot.php | 9 + .../src/Exception/DomainHyphened.php | 9 + .../src/Exception/DotAtEnd.php | 9 + .../src/Exception/DotAtStart.php | 9 + .../src/Exception/ExpectingAT.php | 9 + .../src/Exception/ExpectingATEXT.php | 9 + .../src/Exception/ExpectingCTEXT.php | 9 + .../src/Exception/ExpectingDTEXT.php | 9 + .../Exception/ExpectingDomainLiteralClose.php | 9 + .../src/Exception/ExpectingQPair.php | 9 + .../src/Exception/InvalidEmail.php | 14 + .../src/Exception/NoDNSRecord.php | 9 + .../src/Exception/NoDomainPart.php | 9 + .../src/Exception/NoLocalPart.php | 9 + .../src/Exception/UnclosedComment.php | 9 + .../src/Exception/UnclosedQuotedString.php | 9 + .../src/Exception/UnopenedComment.php | 9 + .../email-validator/src/Parser/DomainPart.php | 414 + .../email-validator/src/Parser/LocalPart.php | 145 + .../email-validator/src/Parser/Parser.php | 249 + .../src/Validation/DNSCheckValidation.php | 77 + .../src/Validation/EmailValidation.php | 34 + .../src/Validation/Error/RFCWarnings.php | 11 + .../src/Validation/Error/SpoofEmail.php | 11 + .../Exception/EmptyValidationList.php | 16 + .../src/Validation/MultipleErrors.php | 32 + .../Validation/MultipleValidationWithAnd.php | 124 + .../Validation/NoRFCWarningsValidation.php | 41 + .../src/Validation/RFCValidation.php | 49 + .../src/Validation/SpoofCheckValidation.php | 51 + .../src/Warning/AddressLiteral.php | 14 + .../src/Warning/CFWSNearAt.php | 13 + .../src/Warning/CFWSWithFWS.php | 13 + .../email-validator/src/Warning/Comment.php | 13 + .../src/Warning/DeprecatedComment.php | 13 + .../src/Warning/DomainLiteral.php | 14 + .../src/Warning/DomainTooLong.php | 14 + .../src/Warning/EmailTooLong.php | 15 + .../src/Warning/IPV6BadChar.php | 14 + .../src/Warning/IPV6ColonEnd.php | 14 + .../src/Warning/IPV6ColonStart.php | 14 + .../src/Warning/IPV6Deprecated.php | 14 + .../src/Warning/IPV6DoubleColon.php | 14 + .../src/Warning/IPV6GroupCount.php | 14 + .../src/Warning/IPV6MaxGroups.php | 14 + .../src/Warning/LabelTooLong.php | 14 + .../src/Warning/LocalTooLong.php | 15 + .../src/Warning/NoDNSMXRecord.php | 14 + .../src/Warning/ObsoleteDTEXT.php | 14 + .../src/Warning/QuotedPart.php | 17 + .../src/Warning/QuotedString.php | 17 + .../email-validator/src/Warning/TLD.php | 13 + .../email-validator/src/Warning/Warning.php | 47 + .../flare-client-php/.github/FUNDING.yml | 1 + .../.github/workflows/run-tests.yml | 47 + vendor/facade/flare-client-php/CHANGELOG.md | 56 + vendor/facade/flare-client-php/LICENSE.md | 21 + vendor/facade/flare-client-php/README.md | 38 + vendor/facade/flare-client-php/composer.json | 50 + vendor/facade/flare-client-php/src/Api.php | 76 + .../src/Concerns/HasContext.php | 51 + .../src/Concerns/UsesTime.php | 24 + .../src/Context/ConsoleContext.php | 21 + .../src/Context/ContextContextDetector.php | 24 + .../src/Context/ContextDetectorInterface.php | 8 + .../src/Context/ContextInterface.php | 8 + .../src/Context/RequestContext.php | 127 + .../src/Contracts/ProvidesFlareContext.php | 8 + .../src/Enums/GroupingTypes.php | 10 + .../src/Enums/MessageLevels.php | 16 + vendor/facade/flare-client-php/src/Flare.php | 251 + vendor/facade/flare-client-php/src/Frame.php | 66 + .../flare-client-php/src/Glows/Glow.php | 42 + .../flare-client-php/src/Glows/Recorder.php | 27 + .../flare-client-php/src/Http/Client.php | 210 + .../src/Http/Exceptions/BadResponse.php | 21 + .../src/Http/Exceptions/BadResponseCode.php | 33 + .../src/Http/Exceptions/InvalidData.php | 13 + .../src/Http/Exceptions/MissingParameter.php | 13 + .../src/Http/Exceptions/NotFound.php | 13 + .../flare-client-php/src/Http/Response.php | 65 + .../src/Middleware/AddGlows.php | 26 + .../src/Middleware/AnonymizeIp.php | 19 + vendor/facade/flare-client-php/src/Report.php | 266 + .../src/Solutions/ReportSolution.php | 36 + .../src/Stacktrace/Codesnippet.php | 72 + .../flare-client-php/src/Stacktrace/File.php | 41 + .../flare-client-php/src/Stacktrace/Frame.php | 71 + .../src/Stacktrace/Stacktrace.php | 126 + .../flare-client-php/src/Time/SystemTime.php | 13 + .../facade/flare-client-php/src/Time/Time.php | 8 + .../Truncation/AbstractTruncationStrategy.php | 14 + .../src/Truncation/ReportTrimmer.php | 41 + .../Truncation/TrimContextItemsStrategy.php | 44 + .../src/Truncation/TrimStringsStrategy.php | 35 + .../src/Truncation/TruncationStrategy.php | 8 + vendor/facade/flare-client-php/src/View.php | 51 + .../facade/flare-client-php/src/helpers.php | 17 + vendor/facade/ignition-contracts/.styleci.yml | 5 + vendor/facade/ignition-contracts/CHANGELOG.md | 7 + .../facade/ignition-contracts/CONTRIBUTING.md | 55 + vendor/facade/ignition-contracts/LICENSE.md | 21 + vendor/facade/ignition-contracts/README.md | 36 + .../ignition-contracts/Tests/SolutionTest.php | 18 + .../facade/ignition-contracts/composer.json | 40 + .../ignition-contracts/docs/screenshot.png | Bin 0 -> 406900 bytes .../ignition-contracts/src/BaseSolution.php | 56 + .../src/HasSolutionsForThrowable.php | 14 + .../src/ProvidesSolution.php | 8 + .../src/RunnableSolution.php | 14 + .../ignition-contracts/src/Solution.php | 12 + .../src/SolutionProviderRepository.php | 21 + vendor/facade/ignition/CHANGELOG.md | 289 + vendor/facade/ignition/LICENSE.md | 21 + vendor/facade/ignition/README.md | 27 + vendor/facade/ignition/composer.json | 77 + vendor/facade/ignition/config/flare.php | 48 + vendor/facade/ignition/config/ignition.php | 125 + vendor/facade/ignition/package.json | 65 + vendor/facade/ignition/resources/.gitignore | 3 + .../ignition/resources/compiled/ignition.js | 32 + .../ignition/resources/compiled/index.html | 12 + .../ignition/resources/views/errorPage.php | 63 + .../src/Actions/ShareReportAction.php | 167 + .../src/Commands/SolutionMakeCommand.php | 65 + .../ignition/src/Commands/TestCommand.php | 85 + .../src/Commands/stubs/runnable-solution.stub | 43 + .../ignition/src/Commands/stubs/solution.stub | 23 + .../src/Context/LaravelConsoleContext.php | 9 + .../src/Context/LaravelContextDetector.php | 19 + .../src/Context/LaravelRequestContext.php | 76 + .../facade/ignition/src/DumpRecorder/Dump.php | 36 + .../ignition/src/DumpRecorder/DumpHandler.php | 23 + .../src/DumpRecorder/DumpRecorder.php | 89 + .../ignition/src/DumpRecorder/HtmlDumper.php | 29 + .../src/DumpRecorder/MultiDumpHandler.php | 23 + .../src/ErrorPage/ErrorPageHandler.php | 76 + .../src/ErrorPage/ErrorPageViewModel.php | 185 + .../src/ErrorPage/IgnitionWhoopsHandler.php | 48 + .../ignition/src/ErrorPage/Renderer.php | 43 + .../ignition/src/Exceptions/InvalidConfig.php | 29 + .../UnableToShareErrorException.php | 9 + .../ignition/src/Exceptions/ViewException.php | 51 + .../Exceptions/ViewExceptionWithSolution.php | 22 + vendor/facade/ignition/src/Facades/Flare.php | 22 + .../Controllers/ExecuteSolutionController.php | 23 + .../Controllers/HealthCheckController.php | 25 + .../src/Http/Controllers/ScriptController.php | 20 + .../Controllers/ShareReportController.php | 19 + .../src/Http/Controllers/StyleController.php | 17 + .../Middleware/IgnitionConfigValueEnabled.php | 27 + .../src/Http/Middleware/IgnitionEnabled.php | 30 + .../Http/Requests/ExecuteSolutionRequest.php | 40 + .../src/Http/Requests/ShareReportRequest.php | 17 + vendor/facade/ignition/src/Ignition.php | 43 + vendor/facade/ignition/src/IgnitionConfig.php | 75 + .../ignition/src/IgnitionServiceProvider.php | 433 + .../ignition/src/LogRecorder/LogMessage.php | 47 + .../ignition/src/LogRecorder/LogRecorder.php | 71 + .../ignition/src/Logger/FlareHandler.php | 78 + .../ignition/src/Middleware/AddDumps.php | 24 + .../Middleware/AddEnvironmentInformation.php | 22 + .../src/Middleware/AddGitInformation.php | 58 + .../ignition/src/Middleware/AddLogs.php | 24 + .../ignition/src/Middleware/AddQueries.php | 24 + .../ignition/src/Middleware/AddSolutions.php | 30 + .../src/Middleware/CustomizeGrouping.php | 27 + .../src/Middleware/SetNotifierName.php | 17 + .../ignition/src/QueryRecorder/Query.php | 58 + .../src/QueryRecorder/QueryRecorder.php | 54 + .../BadMethodCallSolutionProvider.php | 79 + .../DefaultDbNameSolutionProvider.php | 43 + ...rectValetDbCredentialsSolutionProvider.php | 67 + .../InvalidRouteActionSolutionProvider.php | 79 + .../MergeConflictSolutionProvider.php | 61 + .../MissingAppKeySolutionProvider.php | 25 + .../MissingColumnSolutionProvider.php | 35 + .../MissingImportSolutionProvider.php | 48 + .../MissingPackageSolutionProvider.php | 58 + .../RouteNotDefinedSolutionProvider.php | 63 + ...RunningLaravelDuskInProductionProvider.php | 30 + .../SolutionProviderRepository.php | 95 + .../TableNotFoundSolutionProvider.php | 35 + .../UndefinedVariableSolutionProvider.php | 82 + .../UnknownValidationSolutionProvider.php | 83 + .../ViewNotFoundSolutionProvider.php | 117 + .../src/Solutions/GenerateAppKeySolution.php | 46 + .../MakeViewVariableOptionalSolution.php | 106 + .../src/Solutions/MissingPackageSolution.php | 42 + .../src/Solutions/RunMigrationsSolution.php | 53 + .../src/Solutions/SolutionTransformer.php | 45 + .../SuggestCorrectVariableNameSolution.php | 43 + .../src/Solutions/SuggestImportSolution.php | 31 + .../SuggestUsingCorrectDbNameSolution.php | 27 + .../UseDefaultValetDbCredentialsSolution.php | 64 + .../ignition/src/Support/ComposerClassMap.php | 125 + .../ignition/src/Support/FakeComposer.php | 21 + .../src/Support/Packagist/Package.php | 50 + .../src/Support/Packagist/Packagist.php | 29 + .../ignition/src/Support/StringComparator.php | 51 + vendor/facade/ignition/src/Tabs/Tab.php | 75 + .../Compilers/BladeSourceMapCompiler.php | 88 + .../Views/Concerns/CollectsViewExceptions.php | 67 + .../src/Views/Engines/CompilerEngine.php | 116 + .../ignition/src/Views/Engines/PhpEngine.php | 47 + vendor/facade/ignition/src/helpers.php | 29 + vendor/fideloper/proxy/LICENSE.md | 13 + vendor/fideloper/proxy/composer.json | 35 + .../fideloper/proxy/config/trustedproxy.php | 50 + vendor/fideloper/proxy/src/TrustProxies.php | 129 + .../proxy/src/TrustedProxyServiceProvider.php | 41 + vendor/filp/whoops/CHANGELOG.md | 57 + vendor/filp/whoops/LICENSE.md | 19 + vendor/filp/whoops/composer.json | 42 + .../src/Whoops/Exception/ErrorException.php | 17 + .../whoops/src/Whoops/Exception/Formatter.php | 73 + .../whoops/src/Whoops/Exception/Frame.php | 295 + .../src/Whoops/Exception/FrameCollection.php | 203 + .../whoops/src/Whoops/Exception/Inspector.php | 323 + .../src/Whoops/Handler/CallbackHandler.php | 52 + .../whoops/src/Whoops/Handler/Handler.php | 95 + .../src/Whoops/Handler/HandlerInterface.php | 36 + .../Whoops/Handler/JsonResponseHandler.php | 88 + .../src/Whoops/Handler/PlainTextHandler.php | 354 + .../src/Whoops/Handler/PrettyPageHandler.php | 815 + .../src/Whoops/Handler/XmlResponseHandler.php | 107 + .../src/Whoops/Resources/css/whoops.base.css | 604 + .../src/Whoops/Resources/js/clipboard.min.js | 7 + .../src/Whoops/Resources/js/prettify.min.js | 28 + .../src/Whoops/Resources/js/whoops.base.js | 210 + .../src/Whoops/Resources/js/zepto.min.js | 2 + .../Resources/views/env_details.html.php | 42 + .../Resources/views/frame_code.html.php | 63 + .../Resources/views/frame_list.html.php | 17 + .../Resources/views/frames_container.html.php | 3 + .../views/frames_description.html.php | 14 + .../Whoops/Resources/views/header.html.php | 96 + .../Resources/views/header_outer.html.php | 3 + .../Whoops/Resources/views/layout.html.php | 33 + .../Resources/views/panel_details.html.php | 2 + .../views/panel_details_outer.html.php | 3 + .../Resources/views/panel_left.html.php | 4 + .../Resources/views/panel_left_outer.html.php | 3 + vendor/filp/whoops/src/Whoops/Run.php | 452 + .../filp/whoops/src/Whoops/RunInterface.php | 131 + .../src/Whoops/Util/HtmlDumperOutput.php | 36 + vendor/filp/whoops/src/Whoops/Util/Misc.php | 77 + .../whoops/src/Whoops/Util/SystemFacade.php | 137 + .../whoops/src/Whoops/Util/TemplateHelper.php | 352 + .../laravel-cors/.github/FUNDING.yml | 12 + vendor/fruitcake/laravel-cors/LICENSE | 21 + vendor/fruitcake/laravel-cors/changelog.md | 32 + vendor/fruitcake/laravel-cors/composer.json | 58 + vendor/fruitcake/laravel-cors/config/cors.php | 60 + vendor/fruitcake/laravel-cors/readme.md | 165 + .../laravel-cors/src/CorsServiceProvider.php | 97 + .../fruitcake/laravel-cors/src/HandleCors.php | 119 + .../.github/ISSUE_TEMPLATE/bug_report.md | 39 + vendor/fzaninotto/faker/.travis/xdebug.sh | 22 + vendor/fzaninotto/faker/CHANGELOG.md | 744 + vendor/fzaninotto/faker/LICENSE | 22 + vendor/fzaninotto/faker/composer.json | 42 + vendor/fzaninotto/faker/readme.md | 1798 ++ .../faker/src/Faker/Calculator/Ean.php | 55 + .../faker/src/Faker/Calculator/Iban.php | 73 + .../faker/src/Faker/Calculator/Inn.php | 34 + .../faker/src/Faker/Calculator/Luhn.php | 75 + .../faker/src/Faker/Calculator/TCNo.php | 52 + .../faker/src/Faker/DefaultGenerator.php | 38 + .../fzaninotto/faker/src/Faker/Documentor.php | 66 + vendor/fzaninotto/faker/src/Faker/Factory.php | 61 + .../fzaninotto/faker/src/Faker/Generator.php | 292 + .../faker/src/Faker/Guesser/Name.php | 156 + .../Faker/ORM/CakePHP/ColumnTypeGuesser.php | 71 + .../src/Faker/ORM/CakePHP/EntityPopulator.php | 166 + .../faker/src/Faker/ORM/CakePHP/Populator.php | 109 + .../Faker/ORM/Doctrine/ColumnTypeGuesser.php | 81 + .../Faker/ORM/Doctrine/EntityPopulator.php | 251 + .../src/Faker/ORM/Doctrine/Populator.php | 110 + .../Faker/ORM/Mandango/ColumnTypeGuesser.php | 49 + .../Faker/ORM/Mandango/EntityPopulator.php | 122 + .../src/Faker/ORM/Mandango/Populator.php | 65 + .../Faker/ORM/Propel/ColumnTypeGuesser.php | 107 + .../src/Faker/ORM/Propel/EntityPopulator.php | 191 + .../faker/src/Faker/ORM/Propel/Populator.php | 89 + .../Faker/ORM/Propel2/ColumnTypeGuesser.php | 107 + .../src/Faker/ORM/Propel2/EntityPopulator.php | 192 + .../faker/src/Faker/ORM/Propel2/Populator.php | 92 + .../src/Faker/ORM/Spot/ColumnTypeGuesser.php | 77 + .../src/Faker/ORM/Spot/EntityPopulator.php | 219 + .../faker/src/Faker/ORM/Spot/Populator.php | 88 + .../faker/src/Faker/Provider/Address.php | 139 + .../faker/src/Faker/Provider/Barcode.php | 114 + .../faker/src/Faker/Provider/Base.php | 612 + .../faker/src/Faker/Provider/Biased.php | 64 + .../faker/src/Faker/Provider/Color.php | 143 + .../faker/src/Faker/Provider/Company.php | 50 + .../faker/src/Faker/Provider/DateTime.php | 340 + .../faker/src/Faker/Provider/File.php | 606 + .../faker/src/Faker/Provider/HtmlLorem.php | 276 + .../faker/src/Faker/Provider/Image.php | 105 + .../faker/src/Faker/Provider/Internet.php | 362 + .../faker/src/Faker/Provider/Lorem.php | 203 + .../src/Faker/Provider/Miscellaneous.php | 323 + .../faker/src/Faker/Provider/Payment.php | 286 + .../faker/src/Faker/Provider/Person.php | 126 + .../faker/src/Faker/Provider/PhoneNumber.php | 43 + .../faker/src/Faker/Provider/Text.php | 141 + .../faker/src/Faker/Provider/UserAgent.php | 165 + .../faker/src/Faker/Provider/Uuid.php | 58 + .../src/Faker/Provider/ar_JO/Address.php | 152 + .../src/Faker/Provider/ar_JO/Company.php | 63 + .../src/Faker/Provider/ar_JO/Internet.php | 55 + .../faker/src/Faker/Provider/ar_JO/Person.php | 108 + .../faker/src/Faker/Provider/ar_JO/Text.php | 271 + .../src/Faker/Provider/ar_SA/Address.php | 146 + .../faker/src/Faker/Provider/ar_SA/Color.php | 81 + .../src/Faker/Provider/ar_SA/Company.php | 74 + .../src/Faker/Provider/ar_SA/Internet.php | 55 + .../src/Faker/Provider/ar_SA/Payment.php | 19 + .../faker/src/Faker/Provider/ar_SA/Person.php | 118 + .../faker/src/Faker/Provider/ar_SA/Text.php | 271 + .../src/Faker/Provider/at_AT/Payment.php | 44 + .../src/Faker/Provider/bg_BG/Internet.php | 9 + .../src/Faker/Provider/bg_BG/Payment.php | 43 + .../faker/src/Faker/Provider/bg_BG/Person.php | 114 + .../src/Faker/Provider/bg_BG/PhoneNumber.php | 20 + .../src/Faker/Provider/bn_BD/Address.php | 310 + .../src/Faker/Provider/bn_BD/Company.php | 28 + .../faker/src/Faker/Provider/bn_BD/Person.php | 36 + .../src/Faker/Provider/bn_BD/PhoneNumber.php | 14 + .../faker/src/Faker/Provider/bn_BD/Utils.php | 14 + .../src/Faker/Provider/cs_CZ/Address.php | 149 + .../src/Faker/Provider/cs_CZ/Company.php | 120 + .../src/Faker/Provider/cs_CZ/DateTime.php | 61 + .../src/Faker/Provider/cs_CZ/Internet.php | 9 + .../src/Faker/Provider/cs_CZ/Payment.php | 19 + .../faker/src/Faker/Provider/cs_CZ/Person.php | 533 + .../src/Faker/Provider/cs_CZ/PhoneNumber.php | 14 + .../faker/src/Faker/Provider/cs_CZ/Text.php | 7185 +++++ .../src/Faker/Provider/da_DK/Address.php | 287 + .../src/Faker/Provider/da_DK/Company.php | 70 + .../src/Faker/Provider/da_DK/Internet.php | 30 + .../src/Faker/Provider/da_DK/Payment.php | 19 + .../faker/src/Faker/Provider/da_DK/Person.php | 195 + .../src/Faker/Provider/da_DK/PhoneNumber.php | 21 + .../src/Faker/Provider/de_AT/Address.php | 127 + .../src/Faker/Provider/de_AT/Company.php | 13 + .../src/Faker/Provider/de_AT/Internet.php | 9 + .../src/Faker/Provider/de_AT/Payment.php | 19 + .../faker/src/Faker/Provider/de_AT/Person.php | 120 + .../src/Faker/Provider/de_AT/PhoneNumber.php | 19 + .../faker/src/Faker/Provider/de_AT/Text.php | 7 + .../src/Faker/Provider/de_CH/Address.php | 185 + .../src/Faker/Provider/de_CH/Company.php | 15 + .../src/Faker/Provider/de_CH/Internet.php | 17 + .../src/Faker/Provider/de_CH/Payment.php | 19 + .../faker/src/Faker/Provider/de_CH/Person.php | 117 + .../src/Faker/Provider/de_CH/PhoneNumber.php | 43 + .../faker/src/Faker/Provider/de_CH/Text.php | 2036 ++ .../src/Faker/Provider/de_DE/Address.php | 125 + .../src/Faker/Provider/de_DE/Company.php | 24 + .../src/Faker/Provider/de_DE/Internet.php | 26 + .../src/Faker/Provider/de_DE/Payment.php | 56 + .../faker/src/Faker/Provider/de_DE/Person.php | 129 + .../src/Faker/Provider/de_DE/PhoneNumber.php | 20 + .../faker/src/Faker/Provider/de_DE/Text.php | 2036 ++ .../src/Faker/Provider/el_CY/Address.php | 55 + .../src/Faker/Provider/el_CY/Company.php | 18 + .../src/Faker/Provider/el_CY/Internet.php | 9 + .../src/Faker/Provider/el_CY/Payment.php | 49 + .../faker/src/Faker/Provider/el_CY/Person.php | 97 + .../src/Faker/Provider/el_CY/PhoneNumber.php | 32 + .../src/Faker/Provider/el_GR/Address.php | 61 + .../src/Faker/Provider/el_GR/Company.php | 84 + .../src/Faker/Provider/el_GR/Payment.php | 19 + .../faker/src/Faker/Provider/el_GR/Person.php | 178 + .../src/Faker/Provider/el_GR/PhoneNumber.php | 85 + .../faker/src/Faker/Provider/el_GR/Text.php | 2581 ++ .../src/Faker/Provider/en_AU/Address.php | 110 + .../src/Faker/Provider/en_AU/Internet.php | 9 + .../src/Faker/Provider/en_AU/PhoneNumber.php | 56 + .../src/Faker/Provider/en_CA/Address.php | 64 + .../src/Faker/Provider/en_CA/PhoneNumber.php | 18 + .../src/Faker/Provider/en_GB/Address.php | 143 + .../src/Faker/Provider/en_GB/Internet.php | 9 + .../src/Faker/Provider/en_GB/Payment.php | 19 + .../faker/src/Faker/Provider/en_GB/Person.php | 93 + .../src/Faker/Provider/en_GB/PhoneNumber.php | 43 + .../src/Faker/Provider/en_HK/Address.php | 240 + .../src/Faker/Provider/en_HK/Internet.php | 14 + .../src/Faker/Provider/en_HK/PhoneNumber.php | 38 + .../src/Faker/Provider/en_IN/Address.php | 182 + .../src/Faker/Provider/en_IN/Internet.php | 9 + .../faker/src/Faker/Provider/en_IN/Person.php | 127 + .../src/Faker/Provider/en_IN/PhoneNumber.php | 35 + .../src/Faker/Provider/en_NG/Address.php | 98 + .../src/Faker/Provider/en_NG/Internet.php | 8 + .../faker/src/Faker/Provider/en_NG/Person.php | 89 + .../src/Faker/Provider/en_NG/PhoneNumber.php | 133 + .../src/Faker/Provider/en_NZ/Address.php | 78 + .../src/Faker/Provider/en_NZ/Internet.php | 16 + .../src/Faker/Provider/en_NZ/PhoneNumber.php | 93 + .../src/Faker/Provider/en_PH/Address.php | 417 + .../src/Faker/Provider/en_PH/PhoneNumber.php | 58 + .../src/Faker/Provider/en_SG/Address.php | 126 + .../src/Faker/Provider/en_SG/PhoneNumber.php | 107 + .../src/Faker/Provider/en_UG/Address.php | 101 + .../src/Faker/Provider/en_UG/Internet.php | 9 + .../faker/src/Faker/Provider/en_UG/Person.php | 132 + .../src/Faker/Provider/en_UG/PhoneNumber.php | 17 + .../src/Faker/Provider/en_US/Address.php | 97 + .../src/Faker/Provider/en_US/Company.php | 116 + .../src/Faker/Provider/en_US/Payment.php | 37 + .../faker/src/Faker/Provider/en_US/Person.php | 131 + .../src/Faker/Provider/en_US/PhoneNumber.php | 108 + .../faker/src/Faker/Provider/en_US/Text.php | 3720 +++ .../src/Faker/Provider/en_ZA/Address.php | 70 + .../src/Faker/Provider/en_ZA/Company.php | 29 + .../src/Faker/Provider/en_ZA/Internet.php | 18 + .../faker/src/Faker/Provider/en_ZA/Person.php | 178 + .../src/Faker/Provider/en_ZA/PhoneNumber.php | 100 + .../src/Faker/Provider/es_AR/Address.php | 68 + .../src/Faker/Provider/es_AR/Company.php | 66 + .../faker/src/Faker/Provider/es_AR/Person.php | 90 + .../src/Faker/Provider/es_AR/PhoneNumber.php | 42 + .../src/Faker/Provider/es_ES/Address.php | 101 + .../faker/src/Faker/Provider/es_ES/Color.php | 24 + .../src/Faker/Provider/es_ES/Company.php | 80 + .../src/Faker/Provider/es_ES/Internet.php | 9 + .../src/Faker/Provider/es_ES/Payment.php | 39 + .../faker/src/Faker/Provider/es_ES/Person.php | 149 + .../src/Faker/Provider/es_ES/PhoneNumber.php | 47 + .../faker/src/Faker/Provider/es_ES/Text.php | 687 + .../src/Faker/Provider/es_PE/Address.php | 65 + .../src/Faker/Provider/es_PE/Company.php | 66 + .../faker/src/Faker/Provider/es_PE/Person.php | 106 + .../src/Faker/Provider/es_PE/PhoneNumber.php | 17 + .../src/Faker/Provider/es_VE/Address.php | 72 + .../src/Faker/Provider/es_VE/Company.php | 40 + .../src/Faker/Provider/es_VE/Internet.php | 9 + .../faker/src/Faker/Provider/es_VE/Person.php | 167 + .../src/Faker/Provider/es_VE/PhoneNumber.php | 29 + .../faker/src/Faker/Provider/et_EE/Person.php | 89 + .../src/Faker/Provider/fa_IR/Address.php | 100 + .../src/Faker/Provider/fa_IR/Company.php | 57 + .../src/Faker/Provider/fa_IR/Internet.php | 102 + .../faker/src/Faker/Provider/fa_IR/Person.php | 201 + .../src/Faker/Provider/fa_IR/PhoneNumber.php | 75 + .../faker/src/Faker/Provider/fa_IR/Text.php | 546 + .../src/Faker/Provider/fi_FI/Address.php | 85 + .../src/Faker/Provider/fi_FI/Company.php | 64 + .../src/Faker/Provider/fi_FI/Internet.php | 9 + .../src/Faker/Provider/fi_FI/Payment.php | 19 + .../faker/src/Faker/Provider/fi_FI/Person.php | 145 + .../src/Faker/Provider/fi_FI/PhoneNumber.php | 99 + .../src/Faker/Provider/fr_BE/Address.php | 72 + .../src/Faker/Provider/fr_BE/Company.php | 13 + .../src/Faker/Provider/fr_BE/Internet.php | 9 + .../src/Faker/Provider/fr_BE/Payment.php | 39 + .../faker/src/Faker/Provider/fr_BE/Person.php | 49 + .../src/Faker/Provider/fr_BE/PhoneNumber.php | 20 + .../src/Faker/Provider/fr_CA/Address.php | 125 + .../src/Faker/Provider/fr_CA/Company.php | 7 + .../faker/src/Faker/Provider/fr_CA/Person.php | 82 + .../faker/src/Faker/Provider/fr_CA/Text.php | 2448 ++ .../src/Faker/Provider/fr_CH/Address.php | 140 + .../src/Faker/Provider/fr_CH/Company.php | 15 + .../src/Faker/Provider/fr_CH/Internet.php | 9 + .../src/Faker/Provider/fr_CH/Payment.php | 19 + .../faker/src/Faker/Provider/fr_CH/Person.php | 115 + .../src/Faker/Provider/fr_CH/PhoneNumber.php | 43 + .../faker/src/Faker/Provider/fr_CH/Text.php | 8 + .../src/Faker/Provider/fr_FR/Address.php | 147 + .../src/Faker/Provider/fr_FR/Company.php | 476 + .../src/Faker/Provider/fr_FR/Internet.php | 9 + .../src/Faker/Provider/fr_FR/Payment.php | 44 + .../faker/src/Faker/Provider/fr_FR/Person.php | 129 + .../src/Faker/Provider/fr_FR/PhoneNumber.php | 141 + .../faker/src/Faker/Provider/fr_FR/Text.php | 15531 ++++++++++ .../src/Faker/Provider/he_IL/Address.php | 122 + .../src/Faker/Provider/he_IL/Company.php | 14 + .../src/Faker/Provider/he_IL/Payment.php | 19 + .../faker/src/Faker/Provider/he_IL/Person.php | 132 + .../src/Faker/Provider/he_IL/PhoneNumber.php | 14 + .../src/Faker/Provider/hr_HR/Address.php | 69 + .../src/Faker/Provider/hr_HR/Company.php | 25 + .../src/Faker/Provider/hr_HR/Payment.php | 19 + .../faker/src/Faker/Provider/hr_HR/Person.php | 27 + .../src/Faker/Provider/hr_HR/PhoneNumber.php | 14 + .../src/Faker/Provider/hu_HU/Address.php | 149 + .../src/Faker/Provider/hu_HU/Company.php | 13 + .../src/Faker/Provider/hu_HU/Payment.php | 19 + .../faker/src/Faker/Provider/hu_HU/Person.php | 91 + .../src/Faker/Provider/hu_HU/PhoneNumber.php | 14 + .../faker/src/Faker/Provider/hu_HU/Text.php | 3407 +++ .../src/Faker/Provider/hy_AM/Address.php | 132 + .../faker/src/Faker/Provider/hy_AM/Color.php | 12 + .../src/Faker/Provider/hy_AM/Company.php | 54 + .../src/Faker/Provider/hy_AM/Internet.php | 9 + .../faker/src/Faker/Provider/hy_AM/Person.php | 112 + .../src/Faker/Provider/hy_AM/PhoneNumber.php | 40 + .../src/Faker/Provider/id_ID/Address.php | 316 + .../faker/src/Faker/Provider/id_ID/Color.php | 41 + .../src/Faker/Provider/id_ID/Company.php | 43 + .../src/Faker/Provider/id_ID/Internet.php | 25 + .../faker/src/Faker/Provider/id_ID/Person.php | 343 + .../src/Faker/Provider/id_ID/PhoneNumber.php | 55 + .../src/Faker/Provider/is_IS/Address.php | 178 + .../src/Faker/Provider/is_IS/Company.php | 53 + .../src/Faker/Provider/is_IS/Internet.php | 23 + .../src/Faker/Provider/is_IS/Payment.php | 19 + .../faker/src/Faker/Provider/is_IS/Person.php | 140 + .../src/Faker/Provider/is_IS/PhoneNumber.php | 20 + .../src/Faker/Provider/it_CH/Address.php | 139 + .../src/Faker/Provider/it_CH/Company.php | 15 + .../src/Faker/Provider/it_CH/Internet.php | 9 + .../src/Faker/Provider/it_CH/Payment.php | 19 + .../faker/src/Faker/Provider/it_CH/Person.php | 101 + .../src/Faker/Provider/it_CH/PhoneNumber.php | 43 + .../faker/src/Faker/Provider/it_CH/Text.php | 8 + .../src/Faker/Provider/it_IT/Address.php | 97 + .../src/Faker/Provider/it_IT/Company.php | 78 + .../src/Faker/Provider/it_IT/Internet.php | 9 + .../src/Faker/Provider/it_IT/Payment.php | 19 + .../faker/src/Faker/Provider/it_IT/Person.php | 98 + .../src/Faker/Provider/it_IT/PhoneNumber.php | 21 + .../faker/src/Faker/Provider/it_IT/Text.php | 1994 ++ .../src/Faker/Provider/ja_JP/Address.php | 137 + .../src/Faker/Provider/ja_JP/Company.php | 17 + .../src/Faker/Provider/ja_JP/Internet.php | 93 + .../faker/src/Faker/Provider/ja_JP/Person.php | 141 + .../src/Faker/Provider/ja_JP/PhoneNumber.php | 19 + .../faker/src/Faker/Provider/ja_JP/Text.php | 635 + .../src/Faker/Provider/ka_GE/Address.php | 140 + .../faker/src/Faker/Provider/ka_GE/Color.php | 16 + .../src/Faker/Provider/ka_GE/Company.php | 54 + .../src/Faker/Provider/ka_GE/DateTime.php | 42 + .../src/Faker/Provider/ka_GE/Internet.php | 15 + .../src/Faker/Provider/ka_GE/Payment.php | 53 + .../faker/src/Faker/Provider/ka_GE/Person.php | 63 + .../src/Faker/Provider/ka_GE/PhoneNumber.php | 14 + .../faker/src/Faker/Provider/ka_GE/Text.php | 1000 + .../src/Faker/Provider/kk_KZ/Address.php | 105 + .../faker/src/Faker/Provider/kk_KZ/Color.php | 12 + .../src/Faker/Provider/kk_KZ/Company.php | 72 + .../src/Faker/Provider/kk_KZ/Internet.php | 9 + .../src/Faker/Provider/kk_KZ/Payment.php | 33 + .../faker/src/Faker/Provider/kk_KZ/Person.php | 257 + .../src/Faker/Provider/kk_KZ/PhoneNumber.php | 16 + .../faker/src/Faker/Provider/kk_KZ/Text.php | 490 + .../src/Faker/Provider/ko_KR/Address.php | 96 + .../src/Faker/Provider/ko_KR/Company.php | 31 + .../src/Faker/Provider/ko_KR/Internet.php | 86 + .../faker/src/Faker/Provider/ko_KR/Person.php | 55 + .../src/Faker/Provider/ko_KR/PhoneNumber.php | 42 + .../faker/src/Faker/Provider/ko_KR/Text.php | 1723 ++ .../src/Faker/Provider/lt_LT/Address.php | 131 + .../src/Faker/Provider/lt_LT/Company.php | 15 + .../src/Faker/Provider/lt_LT/Internet.php | 18 + .../src/Faker/Provider/lt_LT/Payment.php | 19 + .../faker/src/Faker/Provider/lt_LT/Person.php | 371 + .../src/Faker/Provider/lt_LT/PhoneNumber.php | 17 + .../src/Faker/Provider/lv_LV/Address.php | 117 + .../faker/src/Faker/Provider/lv_LV/Color.php | 19 + .../src/Faker/Provider/lv_LV/Internet.php | 9 + .../src/Faker/Provider/lv_LV/Payment.php | 19 + .../faker/src/Faker/Provider/lv_LV/Person.php | 128 + .../src/Faker/Provider/lv_LV/PhoneNumber.php | 15 + .../src/Faker/Provider/me_ME/Address.php | 119 + .../src/Faker/Provider/me_ME/Company.php | 49 + .../src/Faker/Provider/me_ME/Payment.php | 19 + .../faker/src/Faker/Provider/me_ME/Person.php | 102 + .../src/Faker/Provider/me_ME/PhoneNumber.php | 15 + .../faker/src/Faker/Provider/mn_MN/Person.php | 100 + .../src/Faker/Provider/mn_MN/PhoneNumber.php | 13 + .../src/Faker/Provider/ms_MY/Address.php | 708 + .../src/Faker/Provider/ms_MY/Company.php | 105 + .../Faker/Provider/ms_MY/Miscellaneous.php | 169 + .../src/Faker/Provider/ms_MY/Payment.php | 244 + .../faker/src/Faker/Provider/ms_MY/Person.php | 813 + .../src/Faker/Provider/ms_MY/PhoneNumber.php | 217 + .../src/Faker/Provider/nb_NO/Address.php | 195 + .../src/Faker/Provider/nb_NO/Company.php | 55 + .../src/Faker/Provider/nb_NO/Payment.php | 19 + .../faker/src/Faker/Provider/nb_NO/Person.php | 326 + .../src/Faker/Provider/nb_NO/PhoneNumber.php | 41 + .../src/Faker/Provider/ne_NP/Address.php | 129 + .../src/Faker/Provider/ne_NP/Internet.php | 32 + .../faker/src/Faker/Provider/ne_NP/Person.php | 121 + .../src/Faker/Provider/ne_NP/PhoneNumber.php | 19 + .../src/Faker/Provider/nl_BE/Address.php | 124 + .../src/Faker/Provider/nl_BE/Company.php | 13 + .../src/Faker/Provider/nl_BE/Internet.php | 9 + .../src/Faker/Provider/nl_BE/Payment.php | 39 + .../faker/src/Faker/Provider/nl_BE/Person.php | 106 + .../src/Faker/Provider/nl_BE/PhoneNumber.php | 20 + .../faker/src/Faker/Provider/nl_BE/Text.php | 25347 ++++++++++++++++ .../src/Faker/Provider/nl_NL/Address.php | 153 + .../faker/src/Faker/Provider/nl_NL/Color.php | 36 + .../src/Faker/Provider/nl_NL/Company.php | 115 + .../src/Faker/Provider/nl_NL/Internet.php | 9 + .../src/Faker/Provider/nl_NL/Payment.php | 19 + .../faker/src/Faker/Provider/nl_NL/Person.php | 349 + .../src/Faker/Provider/nl_NL/PhoneNumber.php | 39 + .../faker/src/Faker/Provider/nl_NL/Text.php | 3932 +++ .../src/Faker/Provider/pl_PL/Address.php | 210 + .../src/Faker/Provider/pl_PL/Company.php | 80 + .../src/Faker/Provider/pl_PL/Internet.php | 9 + .../src/Faker/Provider/pl_PL/Payment.php | 115 + .../faker/src/Faker/Provider/pl_PL/Person.php | 227 + .../src/Faker/Provider/pl_PL/PhoneNumber.php | 18 + .../faker/src/Faker/Provider/pl_PL/Text.php | 2866 ++ .../src/Faker/Provider/pt_BR/Address.php | 154 + .../src/Faker/Provider/pt_BR/Company.php | 33 + .../src/Faker/Provider/pt_BR/Internet.php | 9 + .../src/Faker/Provider/pt_BR/Payment.php | 146 + .../faker/src/Faker/Provider/pt_BR/Person.php | 133 + .../src/Faker/Provider/pt_BR/PhoneNumber.php | 137 + .../src/Faker/Provider/pt_BR/check_digit.php | 35 + .../src/Faker/Provider/pt_PT/Address.php | 124 + .../src/Faker/Provider/pt_PT/Company.php | 16 + .../src/Faker/Provider/pt_PT/Internet.php | 9 + .../src/Faker/Provider/pt_PT/Payment.php | 19 + .../faker/src/Faker/Provider/pt_PT/Person.php | 146 + .../src/Faker/Provider/pt_PT/PhoneNumber.php | 50 + .../src/Faker/Provider/ro_MD/Address.php | 148 + .../src/Faker/Provider/ro_MD/Payment.php | 19 + .../faker/src/Faker/Provider/ro_MD/Person.php | 90 + .../src/Faker/Provider/ro_MD/PhoneNumber.php | 33 + .../faker/src/Faker/Provider/ro_MD/Text.php | 2463 ++ .../src/Faker/Provider/ro_RO/Address.php | 176 + .../src/Faker/Provider/ro_RO/Payment.php | 19 + .../faker/src/Faker/Provider/ro_RO/Person.php | 238 + .../src/Faker/Provider/ro_RO/PhoneNumber.php | 66 + .../faker/src/Faker/Provider/ro_RO/Text.php | 154 + .../src/Faker/Provider/ru_RU/Address.php | 139 + .../faker/src/Faker/Provider/ru_RU/Color.php | 23 + .../src/Faker/Provider/ru_RU/Company.php | 119 + .../src/Faker/Provider/ru_RU/Internet.php | 9 + .../src/Faker/Provider/ru_RU/Payment.php | 811 + .../faker/src/Faker/Provider/ru_RU/Person.php | 179 + .../src/Faker/Provider/ru_RU/PhoneNumber.php | 14 + .../faker/src/Faker/Provider/ru_RU/Text.php | 4550 +++ .../src/Faker/Provider/sk_SK/Address.php | 344 + .../src/Faker/Provider/sk_SK/Company.php | 64 + .../src/Faker/Provider/sk_SK/Internet.php | 9 + .../src/Faker/Provider/sk_SK/Payment.php | 19 + .../faker/src/Faker/Provider/sk_SK/Person.php | 168 + .../src/Faker/Provider/sk_SK/PhoneNumber.php | 15 + .../src/Faker/Provider/sl_SI/Address.php | 107 + .../src/Faker/Provider/sl_SI/Company.php | 14 + .../src/Faker/Provider/sl_SI/Internet.php | 11 + .../src/Faker/Provider/sl_SI/Payment.php | 19 + .../faker/src/Faker/Provider/sl_SI/Person.php | 149 + .../src/Faker/Provider/sl_SI/PhoneNumber.php | 18 + .../src/Faker/Provider/sr_Cyrl_RS/Address.php | 58 + .../src/Faker/Provider/sr_Cyrl_RS/Payment.php | 19 + .../src/Faker/Provider/sr_Cyrl_RS/Person.php | 242 + .../src/Faker/Provider/sr_Latn_RS/Address.php | 58 + .../src/Faker/Provider/sr_Latn_RS/Payment.php | 19 + .../src/Faker/Provider/sr_Latn_RS/Person.php | 213 + .../src/Faker/Provider/sr_RS/Address.php | 58 + .../src/Faker/Provider/sr_RS/Payment.php | 19 + .../faker/src/Faker/Provider/sr_RS/Person.php | 145 + .../src/Faker/Provider/sv_SE/Address.php | 150 + .../src/Faker/Provider/sv_SE/Company.php | 26 + .../src/Faker/Provider/sv_SE/Payment.php | 19 + .../faker/src/Faker/Provider/sv_SE/Person.php | 143 + .../src/Faker/Provider/sv_SE/PhoneNumber.php | 37 + .../src/Faker/Provider/th_TH/Address.php | 139 + .../faker/src/Faker/Provider/th_TH/Color.php | 16 + .../src/Faker/Provider/th_TH/Company.php | 32 + .../src/Faker/Provider/th_TH/Internet.php | 8 + .../src/Faker/Provider/th_TH/Payment.php | 43 + .../faker/src/Faker/Provider/th_TH/Person.php | 85 + .../src/Faker/Provider/th_TH/PhoneNumber.php | 37 + .../src/Faker/Provider/tr_TR/Address.php | 93 + .../faker/src/Faker/Provider/tr_TR/Color.php | 58 + .../src/Faker/Provider/tr_TR/Company.php | 99 + .../src/Faker/Provider/tr_TR/DateTime.php | 46 + .../src/Faker/Provider/tr_TR/Internet.php | 9 + .../src/Faker/Provider/tr_TR/Payment.php | 19 + .../faker/src/Faker/Provider/tr_TR/Person.php | 112 + .../src/Faker/Provider/tr_TR/PhoneNumber.php | 33 + .../src/Faker/Provider/uk_UA/Address.php | 362 + .../faker/src/Faker/Provider/uk_UA/Color.php | 23 + .../src/Faker/Provider/uk_UA/Company.php | 74 + .../src/Faker/Provider/uk_UA/Internet.php | 9 + .../src/Faker/Provider/uk_UA/Payment.php | 41 + .../faker/src/Faker/Provider/uk_UA/Person.php | 99 + .../src/Faker/Provider/uk_UA/PhoneNumber.php | 51 + .../faker/src/Faker/Provider/uk_UA/Text.php | 4511 +++ .../src/Faker/Provider/vi_VN/Address.php | 170 + .../faker/src/Faker/Provider/vi_VN/Color.php | 36 + .../src/Faker/Provider/vi_VN/Internet.php | 8 + .../faker/src/Faker/Provider/vi_VN/Person.php | 184 + .../src/Faker/Provider/vi_VN/PhoneNumber.php | 61 + .../src/Faker/Provider/zh_CN/Address.php | 149 + .../faker/src/Faker/Provider/zh_CN/Color.php | 66 + .../src/Faker/Provider/zh_CN/Company.php | 234 + .../src/Faker/Provider/zh_CN/DateTime.php | 46 + .../src/Faker/Provider/zh_CN/Internet.php | 24 + .../src/Faker/Provider/zh_CN/Payment.php | 41 + .../faker/src/Faker/Provider/zh_CN/Person.php | 83 + .../src/Faker/Provider/zh_CN/PhoneNumber.php | 23 + .../src/Faker/Provider/zh_TW/Address.php | 419 + .../faker/src/Faker/Provider/zh_TW/Color.php | 66 + .../src/Faker/Provider/zh_TW/Company.php | 265 + .../src/Faker/Provider/zh_TW/DateTime.php | 46 + .../src/Faker/Provider/zh_TW/Internet.php | 16 + .../src/Faker/Provider/zh_TW/Payment.php | 11 + .../faker/src/Faker/Provider/zh_TW/Person.php | 201 + .../src/Faker/Provider/zh_TW/PhoneNumber.php | 19 + .../faker/src/Faker/Provider/zh_TW/Text.php | 898 + .../faker/src/Faker/UniqueGenerator.php | 58 + .../faker/src/Faker/ValidGenerator.php | 65 + vendor/fzaninotto/faker/src/autoload.php | 26 + vendor/guzzlehttp/guzzle/.php_cs | 23 + vendor/guzzlehttp/guzzle/CHANGELOG.md | 1338 + vendor/guzzlehttp/guzzle/Dockerfile | 18 + vendor/guzzlehttp/guzzle/LICENSE | 19 + vendor/guzzlehttp/guzzle/README.md | 90 + vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 + vendor/guzzlehttp/guzzle/composer.json | 59 + vendor/guzzlehttp/guzzle/src/Client.php | 501 + .../guzzlehttp/guzzle/src/ClientInterface.php | 87 + .../guzzle/src/Cookie/CookieJar.php | 316 + .../guzzle/src/Cookie/CookieJarInterface.php | 84 + .../guzzle/src/Cookie/FileCookieJar.php | 91 + .../guzzle/src/Cookie/SessionCookieJar.php | 72 + .../guzzle/src/Cookie/SetCookie.php | 403 + .../src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 9 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 23 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 192 + .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 9 + .../Exception/TooManyRedirectsException.php | 6 + .../src/Exception/TransferException.php | 6 + .../guzzle/src/Handler/CurlFactory.php | 585 + .../src/Handler/CurlFactoryInterface.php | 27 + .../guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 219 + .../guzzle/src/Handler/EasyHandle.php | 92 + .../guzzle/src/Handler/MockHandler.php | 195 + .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 545 + vendor/guzzlehttp/guzzle/src/HandlerStack.php | 277 + .../guzzle/src/MessageFormatter.php | 185 + vendor/guzzlehttp/guzzle/src/Middleware.php | 254 + vendor/guzzlehttp/guzzle/src/Pool.php | 134 + .../guzzle/src/PrepareBodyMiddleware.php | 111 + .../guzzle/src/RedirectMiddleware.php | 255 + .../guzzlehttp/guzzle/src/RequestOptions.php | 263 + .../guzzlehttp/guzzle/src/RetryMiddleware.php | 128 + .../guzzlehttp/guzzle/src/TransferStats.php | 126 + vendor/guzzlehttp/guzzle/src/UriTemplate.php | 237 + vendor/guzzlehttp/guzzle/src/Utils.php | 92 + vendor/guzzlehttp/guzzle/src/functions.php | 334 + .../guzzle/src/functions_include.php | 6 + vendor/guzzlehttp/promises/CHANGELOG.md | 65 + vendor/guzzlehttp/promises/LICENSE | 19 + vendor/guzzlehttp/promises/Makefile | 13 + vendor/guzzlehttp/promises/README.md | 504 + vendor/guzzlehttp/promises/composer.json | 34 + .../promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + vendor/guzzlehttp/promises/src/Coroutine.php | 151 + .../guzzlehttp/promises/src/EachPromise.php | 229 + .../promises/src/FulfilledPromise.php | 82 + vendor/guzzlehttp/promises/src/Promise.php | 280 + .../promises/src/PromiseInterface.php | 93 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 87 + .../promises/src/RejectionException.php | 47 + vendor/guzzlehttp/promises/src/TaskQueue.php | 66 + .../promises/src/TaskQueueInterface.php | 25 + vendor/guzzlehttp/promises/src/functions.php | 457 + .../promises/src/functions_include.php | 6 + vendor/guzzlehttp/psr7/CHANGELOG.md | 246 + vendor/guzzlehttp/psr7/LICENSE | 19 + vendor/guzzlehttp/psr7/README.md | 745 + vendor/guzzlehttp/psr7/composer.json | 49 + vendor/guzzlehttp/psr7/src/AppendStream.php | 241 + vendor/guzzlehttp/psr7/src/BufferStream.php | 137 + vendor/guzzlehttp/psr7/src/CachingStream.php | 138 + vendor/guzzlehttp/psr7/src/DroppingStream.php | 42 + vendor/guzzlehttp/psr7/src/FnStream.php | 158 + vendor/guzzlehttp/psr7/src/InflateStream.php | 52 + vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 39 + vendor/guzzlehttp/psr7/src/LimitStream.php | 155 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 213 + .../guzzlehttp/psr7/src/MultipartStream.php | 153 + vendor/guzzlehttp/psr7/src/NoSeekStream.php | 22 + vendor/guzzlehttp/psr7/src/PumpStream.php | 165 + vendor/guzzlehttp/psr7/src/Request.php | 151 + vendor/guzzlehttp/psr7/src/Response.php | 154 + vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + vendor/guzzlehttp/psr7/src/ServerRequest.php | 376 + vendor/guzzlehttp/psr7/src/Stream.php | 267 + .../psr7/src/StreamDecoratorTrait.php | 149 + vendor/guzzlehttp/psr7/src/StreamWrapper.php | 161 + vendor/guzzlehttp/psr7/src/UploadedFile.php | 316 + vendor/guzzlehttp/psr7/src/Uri.php | 760 + vendor/guzzlehttp/psr7/src/UriNormalizer.php | 216 + vendor/guzzlehttp/psr7/src/UriResolver.php | 219 + vendor/guzzlehttp/psr7/src/functions.php | 899 + .../guzzlehttp/psr7/src/functions_include.php | 6 + vendor/hamcrest/hamcrest-php/.coveralls.yml | 1 + vendor/hamcrest/hamcrest-php/.gitignore | 1 + vendor/hamcrest/hamcrest-php/.gush.yml | 7 + vendor/hamcrest/hamcrest-php/.travis.yml | 24 + vendor/hamcrest/hamcrest-php/CHANGES.txt | 167 + vendor/hamcrest/hamcrest-php/LICENSE.txt | 27 + vendor/hamcrest/hamcrest-php/README.md | 53 + vendor/hamcrest/hamcrest-php/TODO.txt | 22 + vendor/hamcrest/hamcrest-php/composer.json | 38 + vendor/hamcrest/hamcrest-php/composer.lock | 1493 + .../hamcrest-php/generator/FactoryCall.php | 41 + .../hamcrest-php/generator/FactoryClass.php | 72 + .../hamcrest-php/generator/FactoryFile.php | 122 + .../generator/FactoryGenerator.php | 115 + .../hamcrest-php/generator/FactoryMethod.php | 231 + .../generator/FactoryParameter.php | 69 + .../generator/GlobalFunctionFile.php | 42 + .../generator/StaticMethodFile.php | 38 + .../generator/parts/file_header.txt | 7 + .../generator/parts/functions_footer.txt | 0 .../generator/parts/functions_header.txt | 24 + .../generator/parts/functions_imports.txt | 0 .../generator/parts/matchers_footer.txt | 1 + .../generator/parts/matchers_header.txt | 7 + .../generator/parts/matchers_imports.txt | 2 + .../hamcrest/hamcrest-php/generator/run.php | 37 + .../hamcrest-php/hamcrest/Hamcrest.php | 805 + .../hamcrest/Hamcrest/Arrays/IsArray.php | 118 + .../Hamcrest/Arrays/IsArrayContaining.php | 63 + .../Arrays/IsArrayContainingInAnyOrder.php | 59 + .../Arrays/IsArrayContainingInOrder.php | 57 + .../Hamcrest/Arrays/IsArrayContainingKey.php | 75 + .../Arrays/IsArrayContainingKeyValuePair.php | 80 + .../Hamcrest/Arrays/IsArrayWithSize.php | 73 + .../hamcrest/Hamcrest/Arrays/MatchingOnce.php | 69 + .../Hamcrest/Arrays/SeriesMatchingOnce.php | 75 + .../hamcrest/Hamcrest/AssertionError.php | 10 + .../hamcrest/Hamcrest/BaseDescription.php | 132 + .../hamcrest/Hamcrest/BaseMatcher.php | 25 + .../Collection/IsEmptyTraversable.php | 71 + .../Collection/IsTraversableWithSize.php | 47 + .../hamcrest/Hamcrest/Core/AllOf.php | 59 + .../hamcrest/Hamcrest/Core/AnyOf.php | 58 + .../Hamcrest/Core/CombinableMatcher.php | 78 + .../hamcrest/Hamcrest/Core/DescribedAs.php | 68 + .../hamcrest/Hamcrest/Core/Every.php | 56 + .../hamcrest/Hamcrest/Core/HasToString.php | 56 + .../hamcrest/Hamcrest/Core/Is.php | 57 + .../hamcrest/Hamcrest/Core/IsAnything.php | 45 + .../Hamcrest/Core/IsCollectionContaining.php | 93 + .../hamcrest/Hamcrest/Core/IsEqual.php | 44 + .../hamcrest/Hamcrest/Core/IsIdentical.php | 38 + .../hamcrest/Hamcrest/Core/IsInstanceOf.php | 67 + .../hamcrest/Hamcrest/Core/IsNot.php | 44 + .../hamcrest/Hamcrest/Core/IsNull.php | 56 + .../hamcrest/Hamcrest/Core/IsSame.php | 51 + .../hamcrest/Hamcrest/Core/IsTypeOf.php | 71 + .../hamcrest/Hamcrest/Core/Set.php | 95 + .../Hamcrest/Core/ShortcutCombination.php | 43 + .../hamcrest/Hamcrest/Description.php | 70 + .../hamcrest/Hamcrest/DiagnosingMatcher.php | 25 + .../hamcrest/Hamcrest/FeatureMatcher.php | 67 + .../Hamcrest/Internal/SelfDescribingValue.php | 27 + .../hamcrest/Hamcrest/Matcher.php | 50 + .../hamcrest/Hamcrest/MatcherAssert.php | 118 + .../hamcrest/Hamcrest/Matchers.php | 713 + .../hamcrest/Hamcrest/NullDescription.php | 43 + .../hamcrest/Hamcrest/Number/IsCloseTo.php | 67 + .../Hamcrest/Number/OrderingComparison.php | 132 + .../hamcrest/Hamcrest/SelfDescribing.php | 23 + .../hamcrest/Hamcrest/StringDescription.php | 57 + .../hamcrest/Hamcrest/Text/IsEmptyString.php | 85 + .../Hamcrest/Text/IsEqualIgnoringCase.php | 52 + .../Text/IsEqualIgnoringWhiteSpace.php | 66 + .../hamcrest/Hamcrest/Text/MatchesPattern.php | 40 + .../hamcrest/Hamcrest/Text/StringContains.php | 45 + .../Text/StringContainsIgnoringCase.php | 40 + .../Hamcrest/Text/StringContainsInOrder.php | 66 + .../hamcrest/Hamcrest/Text/StringEndsWith.php | 40 + .../Hamcrest/Text/StringStartsWith.php | 40 + .../Hamcrest/Text/SubstringMatcher.php | 45 + .../hamcrest/Hamcrest/Type/IsArray.php | 32 + .../hamcrest/Hamcrest/Type/IsBoolean.php | 32 + .../hamcrest/Hamcrest/Type/IsCallable.php | 37 + .../hamcrest/Hamcrest/Type/IsDouble.php | 34 + .../hamcrest/Hamcrest/Type/IsInteger.php | 32 + .../hamcrest/Hamcrest/Type/IsNumeric.php | 54 + .../hamcrest/Hamcrest/Type/IsObject.php | 32 + .../hamcrest/Hamcrest/Type/IsResource.php | 32 + .../hamcrest/Hamcrest/Type/IsScalar.php | 34 + .../hamcrest/Hamcrest/Type/IsString.php | 32 + .../Hamcrest/TypeSafeDiagnosingMatcher.php | 29 + .../hamcrest/Hamcrest/TypeSafeMatcher.php | 107 + .../hamcrest-php/hamcrest/Hamcrest/Util.php | 76 + .../hamcrest/Hamcrest/Xml/HasXPath.php | 195 + .../tests/Hamcrest/AbstractMatcherTest.php | 66 + .../Array/IsArrayContainingInAnyOrderTest.php | 54 + .../Array/IsArrayContainingInOrderTest.php | 44 + .../Array/IsArrayContainingKeyTest.php | 62 + .../IsArrayContainingKeyValuePairTest.php | 36 + .../Hamcrest/Array/IsArrayContainingTest.php | 50 + .../tests/Hamcrest/Array/IsArrayTest.php | 89 + .../Hamcrest/Array/IsArrayWithSizeTest.php | 37 + .../tests/Hamcrest/BaseMatcherTest.php | 23 + .../Collection/IsEmptyTraversableTest.php | 77 + .../Collection/IsTraversableWithSizeTest.php | 57 + .../tests/Hamcrest/Core/AllOfTest.php | 56 + .../tests/Hamcrest/Core/AnyOfTest.php | 79 + .../Hamcrest/Core/CombinableMatcherTest.php | 59 + .../tests/Hamcrest/Core/DescribedAsTest.php | 36 + .../tests/Hamcrest/Core/EveryTest.php | 30 + .../tests/Hamcrest/Core/HasToStringTest.php | 108 + .../tests/Hamcrest/Core/IsAnythingTest.php | 29 + .../Core/IsCollectionContainingTest.php | 91 + .../tests/Hamcrest/Core/IsEqualTest.php | 102 + .../tests/Hamcrest/Core/IsIdenticalTest.php | 30 + .../tests/Hamcrest/Core/IsInstanceOfTest.php | 51 + .../tests/Hamcrest/Core/IsNotTest.php | 31 + .../tests/Hamcrest/Core/IsNullTest.php | 20 + .../tests/Hamcrest/Core/IsSameTest.php | 30 + .../tests/Hamcrest/Core/IsTest.php | 33 + .../tests/Hamcrest/Core/IsTypeOfTest.php | 45 + .../tests/Hamcrest/Core/SampleBaseClass.php | 18 + .../tests/Hamcrest/Core/SampleSubClass.php | 6 + .../tests/Hamcrest/Core/SetTest.php | 116 + .../tests/Hamcrest/FeatureMatcherTest.php | 73 + .../tests/Hamcrest/MatcherAssertTest.php | 190 + .../tests/Hamcrest/Number/IsCloseToTest.php | 27 + .../Number/OrderingComparisonTest.php | 41 + .../tests/Hamcrest/StringDescriptionTest.php | 160 + .../tests/Hamcrest/Text/IsEmptyStringTest.php | 86 + .../Hamcrest/Text/IsEqualIgnoringCaseTest.php | 40 + .../Text/IsEqualIgnoringWhiteSpaceTest.php | 51 + .../Hamcrest/Text/MatchesPatternTest.php | 30 + .../Text/StringContainsIgnoringCaseTest.php | 80 + .../Text/StringContainsInOrderTest.php | 42 + .../Hamcrest/Text/StringContainsTest.php | 86 + .../Hamcrest/Text/StringEndsWithTest.php | 62 + .../Hamcrest/Text/StringStartsWithTest.php | 62 + .../tests/Hamcrest/Type/IsArrayTest.php | 35 + .../tests/Hamcrest/Type/IsBooleanTest.php | 35 + .../tests/Hamcrest/Type/IsCallableTest.php | 103 + .../tests/Hamcrest/Type/IsDoubleTest.php | 35 + .../tests/Hamcrest/Type/IsIntegerTest.php | 36 + .../tests/Hamcrest/Type/IsNumericTest.php | 53 + .../tests/Hamcrest/Type/IsObjectTest.php | 34 + .../tests/Hamcrest/Type/IsResourceTest.php | 34 + .../tests/Hamcrest/Type/IsScalarTest.php | 39 + .../tests/Hamcrest/Type/IsStringTest.php | 35 + .../hamcrest-php/tests/Hamcrest/UtilTest.php | 80 + .../tests/Hamcrest/Xml/HasXPathTest.php | 198 + .../hamcrest/hamcrest-php/tests/bootstrap.php | 11 + .../hamcrest-php/tests/phpunit.xml.dist | 22 + vendor/laravel/framework/LICENSE.md | 21 + vendor/laravel/framework/README.md | 45 + vendor/laravel/framework/composer.json | 154 + .../Auth/Access/AuthorizationException.php | 64 + .../src/Illuminate/Auth/Access/Gate.php | 769 + .../Auth/Access/HandlesAuthorization.php | 30 + .../src/Illuminate/Auth/Access/Response.php | 149 + .../src/Illuminate/Auth/AuthManager.php | 309 + .../Illuminate/Auth/AuthServiceProvider.php | 132 + .../src/Illuminate/Auth/Authenticatable.php | 78 + .../Auth/AuthenticationException.php | 58 + .../Auth/Console/ClearResetsCommand.php | 34 + .../Console/stubs/make/views/layouts/app.stub | 80 + .../Illuminate/Auth/CreatesUserProviders.php | 94 + .../Illuminate/Auth/DatabaseUserProvider.php | 159 + .../Illuminate/Auth/EloquentUserProvider.php | 231 + .../src/Illuminate/Auth/Events/Attempting.php | 42 + .../Illuminate/Auth/Events/Authenticated.php | 37 + .../Auth/Events/CurrentDeviceLogout.php | 37 + .../src/Illuminate/Auth/Events/Failed.php | 42 + .../src/Illuminate/Auth/Events/Lockout.php | 26 + .../src/Illuminate/Auth/Events/Login.php | 46 + .../src/Illuminate/Auth/Events/Logout.php | 37 + .../Auth/Events/OtherDeviceLogout.php | 37 + .../Illuminate/Auth/Events/PasswordReset.php | 28 + .../src/Illuminate/Auth/Events/Registered.php | 28 + .../src/Illuminate/Auth/Events/Validated.php | 37 + .../src/Illuminate/Auth/Events/Verified.php | 28 + .../src/Illuminate/Auth/GenericUser.php | 132 + .../src/Illuminate/Auth/GuardHelpers.php | 118 + .../framework/src/Illuminate/Auth/LICENSE.md | 21 + .../SendEmailVerificationNotification.php | 22 + .../Auth/Middleware/Authenticate.php | 97 + .../Middleware/AuthenticateWithBasicAuth.php | 45 + .../Illuminate/Auth/Middleware/Authorize.php | 93 + .../Auth/Middleware/EnsureEmailIsVerified.php | 31 + .../Auth/Middleware/RequirePassword.php | 84 + .../src/Illuminate/Auth/MustVerifyEmail.php | 50 + .../Auth/Notifications/ResetPassword.php | 104 + .../Auth/Notifications/VerifyEmail.php | 81 + .../Auth/Passwords/CanResetPassword.php | 29 + .../Passwords/DatabaseTokenRepository.php | 246 + .../Auth/Passwords/PasswordBroker.php | 185 + .../Auth/Passwords/PasswordBrokerManager.php | 146 + .../PasswordResetServiceProvider.php | 45 + .../Passwords/TokenRepositoryInterface.php | 48 + .../src/Illuminate/Auth/Recaller.php | 88 + .../src/Illuminate/Auth/RequestGuard.php | 87 + .../src/Illuminate/Auth/SessionGuard.php | 856 + .../src/Illuminate/Auth/TokenGuard.php | 149 + .../src/Illuminate/Auth/composer.json | 42 + .../Broadcasting/BroadcastController.php | 25 + .../Broadcasting/BroadcastEvent.php | 127 + .../Broadcasting/BroadcastException.php | 10 + .../Broadcasting/BroadcastManager.php | 322 + .../Broadcasting/BroadcastServiceProvider.php | 45 + .../Broadcasting/Broadcasters/Broadcaster.php | 330 + .../Broadcasters/LogBroadcaster.php | 54 + .../Broadcasters/NullBroadcaster.php | 30 + .../Broadcasters/PusherBroadcaster.php | 135 + .../Broadcasters/RedisBroadcaster.php | 151 + .../UsePusherChannelConventions.php | 36 + .../src/Illuminate/Broadcasting/Channel.php | 34 + .../Broadcasting/EncryptedPrivateChannel.php | 17 + .../Broadcasting/InteractsWithSockets.php | 39 + .../src/Illuminate/Broadcasting/LICENSE.md | 21 + .../Broadcasting/PendingBroadcast.php | 59 + .../Broadcasting/PresenceChannel.php | 17 + .../Broadcasting/PrivateChannel.php | 17 + .../src/Illuminate/Broadcasting/composer.json | 42 + .../src/Illuminate/Bus/BusServiceProvider.php | 48 + .../src/Illuminate/Bus/Dispatcher.php | 224 + .../framework/src/Illuminate/Bus/LICENSE.md | 21 + .../src/Illuminate/Bus/Queueable.php | 196 + .../src/Illuminate/Bus/composer.json | 39 + .../src/Illuminate/Cache/ApcStore.php | 130 + .../src/Illuminate/Cache/ApcWrapper.php | 92 + .../src/Illuminate/Cache/ArrayLock.php | 102 + .../src/Illuminate/Cache/ArrayStore.php | 218 + .../src/Illuminate/Cache/CacheManager.php | 385 + .../Illuminate/Cache/CacheServiceProvider.php | 46 + .../Cache/Console/CacheTableCommand.php | 81 + .../Illuminate/Cache/Console/ClearCommand.php | 145 + .../Cache/Console/ForgetCommand.php | 57 + .../Illuminate/Cache/Console/stubs/cache.stub | 32 + .../src/Illuminate/Cache/DatabaseLock.php | 138 + .../src/Illuminate/Cache/DatabaseStore.php | 376 + .../src/Illuminate/Cache/DynamoDbLock.php | 75 + .../src/Illuminate/Cache/DynamoDbStore.php | 528 + .../Illuminate/Cache/Events/CacheEvent.php | 46 + .../src/Illuminate/Cache/Events/CacheHit.php | 28 + .../Illuminate/Cache/Events/CacheMissed.php | 8 + .../Illuminate/Cache/Events/KeyForgotten.php | 8 + .../Illuminate/Cache/Events/KeyWritten.php | 37 + .../src/Illuminate/Cache/FileStore.php | 301 + .../framework/src/Illuminate/Cache/LICENSE.md | 21 + .../framework/src/Illuminate/Cache/Lock.php | 167 + .../src/Illuminate/Cache/LuaScripts.php | 25 + .../Illuminate/Cache/MemcachedConnector.php | 87 + .../src/Illuminate/Cache/MemcachedLock.php | 75 + .../src/Illuminate/Cache/MemcachedStore.php | 279 + .../src/Illuminate/Cache/NullStore.php | 99 + .../src/Illuminate/Cache/RateLimiter.php | 133 + .../src/Illuminate/Cache/RedisLock.php | 73 + .../src/Illuminate/Cache/RedisStore.php | 308 + .../src/Illuminate/Cache/RedisTaggedCache.php | 198 + .../src/Illuminate/Cache/Repository.php | 658 + .../Cache/RetrievesMultipleKeys.php | 45 + .../framework/src/Illuminate/Cache/TagSet.php | 110 + .../src/Illuminate/Cache/TaggableStore.php | 19 + .../src/Illuminate/Cache/TaggedCache.php | 125 + .../src/Illuminate/Cache/composer.json | 42 + .../src/Illuminate/Config/LICENSE.md | 21 + .../src/Illuminate/Config/Repository.php | 179 + .../src/Illuminate/Config/composer.json | 35 + .../src/Illuminate/Console/Application.php | 316 + .../src/Illuminate/Console/Command.php | 200 + .../Console/Concerns/CallsCommands.php | 92 + .../Console/Concerns/HasParameters.php | 56 + .../Console/Concerns/InteractsWithIO.php | 397 + .../Illuminate/Console/ConfirmableTrait.php | 52 + .../Console/Events/ArtisanStarting.php | 24 + .../Console/Events/CommandFinished.php | 54 + .../Console/Events/CommandStarting.php | 45 + .../Console/Events/ScheduledTaskFinished.php | 35 + .../Console/Events/ScheduledTaskSkipped.php | 26 + .../Console/Events/ScheduledTaskStarting.php | 26 + .../Illuminate/Console/GeneratorCommand.php | 380 + .../src/Illuminate/Console/LICENSE.md | 21 + .../src/Illuminate/Console/OutputStyle.php | 71 + .../src/Illuminate/Console/Parser.php | 144 + .../Console/Scheduling/CacheAware.php | 14 + .../Console/Scheduling/CacheEventMutex.php | 81 + .../Scheduling/CacheSchedulingMutex.php | 75 + .../Console/Scheduling/CallbackEvent.php | 166 + .../Console/Scheduling/CommandBuilder.php | 75 + .../Illuminate/Console/Scheduling/Event.php | 900 + .../Console/Scheduling/EventMutex.php | 30 + .../Console/Scheduling/ManagesFrequencies.php | 423 + .../Console/Scheduling/Schedule.php | 312 + .../Scheduling/ScheduleFinishCommand.php | 42 + .../Console/Scheduling/ScheduleRunCommand.php | 154 + .../Console/Scheduling/SchedulingMutex.php | 26 + .../src/Illuminate/Console/composer.json | 45 + .../src/Illuminate/Container/BoundMethod.php | 192 + .../src/Illuminate/Container/Container.php | 1330 + .../Container/ContextualBindingBuilder.php | 84 + .../Container/EntryNotFoundException.php | 11 + .../src/Illuminate/Container/LICENSE.md | 21 + .../Container/RewindableGenerator.php | 60 + .../src/Illuminate/Container/Util.php | 64 + .../src/Illuminate/Container/composer.json | 38 + .../Contracts/Auth/Access/Authorizable.php | 15 + .../Illuminate/Contracts/Auth/Access/Gate.php | 150 + .../Contracts/Auth/Authenticatable.php | 49 + .../Contracts/Auth/CanResetPassword.php | 21 + .../src/Illuminate/Contracts/Auth/Factory.php | 22 + .../src/Illuminate/Contracts/Auth/Guard.php | 50 + .../Auth/Middleware/AuthenticatesRequests.php | 8 + .../Contracts/Auth/MustVerifyEmail.php | 34 + .../Contracts/Auth/PasswordBroker.php | 60 + .../Contracts/Auth/PasswordBrokerFactory.php | 14 + .../Contracts/Auth/StatefulGuard.php | 63 + .../Contracts/Auth/SupportsBasicAuth.php | 24 + .../Contracts/Auth/UserProvider.php | 49 + .../Contracts/Broadcasting/Broadcaster.php | 33 + .../Contracts/Broadcasting/Factory.php | 14 + .../Broadcasting/ShouldBroadcast.php | 13 + .../Broadcasting/ShouldBroadcastNow.php | 8 + .../Illuminate/Contracts/Bus/Dispatcher.php | 55 + .../Contracts/Bus/QueueingDispatcher.php | 14 + .../Illuminate/Contracts/Cache/Factory.php | 14 + .../src/Illuminate/Contracts/Cache/Lock.php | 44 + .../Contracts/Cache/LockProvider.php | 25 + .../Contracts/Cache/LockTimeoutException.php | 10 + .../Illuminate/Contracts/Cache/Repository.php | 108 + .../src/Illuminate/Contracts/Cache/Store.php | 92 + .../Contracts/Config/Repository.php | 57 + .../Contracts/Console/Application.php | 23 + .../Illuminate/Contracts/Console/Kernel.php | 57 + .../Container/BindingResolutionException.php | 11 + .../Contracts/Container/Container.php | 183 + .../Container/ContextualBindingBuilder.php | 22 + .../Illuminate/Contracts/Cookie/Factory.php | 47 + .../Contracts/Cookie/QueueingFactory.php | 30 + .../Contracts/Database/Eloquent/Castable.php | 13 + .../Database/Eloquent/CastsAttributes.php | 28 + .../Eloquent/CastsInboundAttributes.php | 17 + .../Database/Events/MigrationEvent.php | 8 + .../Contracts/Database/ModelIdentifier.php | 53 + .../Contracts/Debug/ExceptionHandler.php | 46 + .../Contracts/Encryption/DecryptException.php | 10 + .../Contracts/Encryption/EncryptException.php | 10 + .../Contracts/Encryption/Encrypter.php | 28 + .../Contracts/Events/Dispatcher.php | 82 + .../Illuminate/Contracts/Filesystem/Cloud.php | 14 + .../Contracts/Filesystem/Factory.php | 14 + .../Filesystem/FileExistsException.php | 10 + .../Filesystem/FileNotFoundException.php | 10 + .../Contracts/Filesystem/Filesystem.php | 198 + .../Contracts/Foundation/Application.php | 215 + .../Foundation/CachesConfiguration.php | 27 + .../Contracts/Foundation/CachesRoutes.php | 20 + .../Illuminate/Contracts/Hashing/Hasher.php | 42 + .../src/Illuminate/Contracts/Http/Kernel.php | 37 + .../src/Illuminate/Contracts/LICENSE.md | 21 + .../src/Illuminate/Contracts/Mail/Factory.php | 14 + .../Illuminate/Contracts/Mail/MailQueue.php | 25 + .../Illuminate/Contracts/Mail/Mailable.php | 76 + .../src/Illuminate/Contracts/Mail/Mailer.php | 48 + .../Contracts/Notifications/Dispatcher.php | 24 + .../Contracts/Notifications/Factory.php | 32 + .../Pagination/LengthAwarePaginator.php | 29 + .../Contracts/Pagination/Paginator.php | 124 + .../src/Illuminate/Contracts/Pipeline/Hub.php | 15 + .../Contracts/Pipeline/Pipeline.php | 40 + .../Queue/EntityNotFoundException.php | 22 + .../Contracts/Queue/EntityResolver.php | 15 + .../Illuminate/Contracts/Queue/Factory.php | 14 + .../src/Illuminate/Contracts/Queue/Job.php | 166 + .../Illuminate/Contracts/Queue/Monitor.php | 30 + .../src/Illuminate/Contracts/Queue/Queue.php | 99 + .../Contracts/Queue/QueueableCollection.php | 34 + .../Contracts/Queue/QueueableEntity.php | 27 + .../Contracts/Queue/ShouldQueue.php | 8 + .../Illuminate/Contracts/Redis/Connection.php | 35 + .../Illuminate/Contracts/Redis/Connector.php | 25 + .../Illuminate/Contracts/Redis/Factory.php | 14 + .../Redis/LimiterTimeoutException.php | 10 + .../Contracts/Routing/BindingRegistrar.php | 23 + .../Contracts/Routing/Registrar.php | 105 + .../Contracts/Routing/ResponseFactory.php | 155 + .../Contracts/Routing/UrlGenerator.php | 79 + .../Contracts/Routing/UrlRoutable.php | 39 + .../Illuminate/Contracts/Session/Session.php | 165 + .../Contracts/Support/Arrayable.php | 13 + .../Contracts/Support/DeferrableProvider.php | 13 + .../Support/DeferringDisplayableValue.php | 13 + .../Illuminate/Contracts/Support/Htmlable.php | 13 + .../Illuminate/Contracts/Support/Jsonable.php | 14 + .../Contracts/Support/MessageBag.php | 107 + .../Contracts/Support/MessageProvider.php | 13 + .../Contracts/Support/Renderable.php | 13 + .../Contracts/Support/Responsable.php | 14 + .../Translation/HasLocalePreference.php | 13 + .../Contracts/Translation/Loader.php | 40 + .../Contracts/Translation/Translator.php | 42 + .../Contracts/Validation/Factory.php | 46 + .../Contracts/Validation/ImplicitRule.php | 8 + .../Illuminate/Contracts/Validation/Rule.php | 22 + .../Validation/ValidatesWhenResolved.php | 13 + .../Contracts/Validation/Validator.php | 61 + .../src/Illuminate/Contracts/View/Engine.php | 15 + .../src/Illuminate/Contracts/View/Factory.php | 79 + .../src/Illuminate/Contracts/View/View.php | 31 + .../src/Illuminate/Contracts/composer.json | 35 + .../src/Illuminate/Cookie/CookieJar.php | 217 + .../Cookie/CookieServiceProvider.php | 24 + .../src/Illuminate/Cookie/LICENSE.md | 21 + .../Middleware/AddQueuedCookiesToResponse.php | 45 + .../Cookie/Middleware/EncryptCookies.php | 183 + .../src/Illuminate/Cookie/composer.json | 37 + .../Illuminate/Database/Capsule/Manager.php | 202 + .../Database/Concerns/BuildsQueries.php | 227 + .../Database/Concerns/ManagesTransactions.php | 286 + .../Database/ConfigurationUrlParser.php | 10 + .../src/Illuminate/Database/Connection.php | 1291 + .../Database/ConnectionInterface.php | 163 + .../Database/ConnectionResolver.php | 92 + .../Database/ConnectionResolverInterface.php | 29 + .../Database/Connectors/ConnectionFactory.php | 289 + .../Database/Connectors/Connector.php | 139 + .../Connectors/ConnectorInterface.php | 14 + .../Database/Connectors/MySqlConnector.php | 188 + .../Database/Connectors/PostgresConnector.php | 176 + .../Database/Connectors/SQLiteConnector.php | 39 + .../Connectors/SqlServerConnector.php | 201 + .../Console/Factories/FactoryMakeCommand.php | 108 + .../Console/Factories/stubs/factory.stub | 12 + .../Console/Migrations/BaseCommand.php | 51 + .../Console/Migrations/FreshCommand.php | 106 + .../Console/Migrations/InstallCommand.php | 70 + .../Console/Migrations/MigrateCommand.php | 99 + .../Console/Migrations/MigrateMakeCommand.php | 145 + .../Console/Migrations/RefreshCommand.php | 151 + .../Console/Migrations/ResetCommand.php | 93 + .../Console/Migrations/RollbackCommand.php | 91 + .../Console/Migrations/StatusCommand.php | 115 + .../Console/Migrations/TableGuesser.php | 37 + .../Database/Console/Seeds/SeedCommand.php | 116 + .../Console/Seeds/SeederMakeCommand.php | 109 + .../Database/Console/Seeds/stubs/seeder.stub | 16 + .../Database/Console/WipeCommand.php | 112 + .../Illuminate/Database/DatabaseManager.php | 369 + .../Database/DatabaseServiceProvider.php | 114 + .../Database/DetectsConcurrencyErrors.php | 37 + .../Database/DetectsLostConnections.php | 50 + .../Illuminate/Database/Eloquent/Builder.php | 1474 + .../Database/Eloquent/Collection.php | 632 + .../Eloquent/Concerns/GuardsAttributes.php | 219 + .../Eloquent/Concerns/HasAttributes.php | 1512 + .../Database/Eloquent/Concerns/HasEvents.php | 415 + .../Eloquent/Concerns/HasGlobalScopes.php | 71 + .../Eloquent/Concerns/HasRelationships.php | 870 + .../Eloquent/Concerns/HasTimestamps.php | 149 + .../Eloquent/Concerns/HidesAttributes.php | 130 + .../Concerns/QueriesRelationships.php | 498 + .../Illuminate/Database/Eloquent/Factory.php | 271 + .../Database/Eloquent/FactoryBuilder.php | 449 + .../Eloquent/HigherOrderBuilderProxy.php | 50 + .../Eloquent/JsonEncodingException.php | 49 + .../Eloquent/MassAssignmentException.php | 10 + .../Illuminate/Database/Eloquent/Model.php | 1780 ++ .../Eloquent/ModelNotFoundException.php | 66 + .../Database/Eloquent/QueueEntityResolver.php | 29 + .../Eloquent/RelationNotFoundException.php | 41 + .../Database/Eloquent/Relations/BelongsTo.php | 362 + .../Eloquent/Relations/BelongsToMany.php | 1325 + .../Eloquent/Relations/Concerns/AsPivot.php | 317 + .../Concerns/InteractsWithPivotTable.php | 670 + .../Concerns/SupportsDefaultModels.php | 63 + .../Database/Eloquent/Relations/HasMany.php | 49 + .../Eloquent/Relations/HasManyThrough.php | 688 + .../Database/Eloquent/Relations/HasOne.php | 68 + .../Eloquent/Relations/HasOneOrMany.php | 437 + .../Eloquent/Relations/HasOneThrough.php | 76 + .../Database/Eloquent/Relations/MorphMany.php | 49 + .../Database/Eloquent/Relations/MorphOne.php | 68 + .../Eloquent/Relations/MorphOneOrMany.php | 127 + .../Eloquent/Relations/MorphPivot.php | 160 + .../Database/Eloquent/Relations/MorphTo.php | 353 + .../Eloquent/Relations/MorphToMany.php | 209 + .../Database/Eloquent/Relations/Pivot.php | 25 + .../Database/Eloquent/Relations/Relation.php | 403 + .../Illuminate/Database/Eloquent/Scope.php | 15 + .../Database/Eloquent/SoftDeletes.php | 199 + .../Database/Eloquent/SoftDeletingScope.php | 131 + .../Database/Events/ConnectionEvent.php | 32 + .../Database/Events/MigrationEnded.php | 8 + .../Database/Events/MigrationEvent.php | 36 + .../Database/Events/MigrationStarted.php | 8 + .../Database/Events/MigrationsEnded.php | 10 + .../Database/Events/MigrationsStarted.php | 10 + .../Database/Events/NoPendingMigrations.php | 24 + .../Database/Events/QueryExecuted.php | 59 + .../Database/Events/StatementPrepared.php | 33 + .../Database/Events/TransactionBeginning.php | 8 + .../Database/Events/TransactionCommitted.php | 8 + .../Database/Events/TransactionRolledBack.php | 8 + .../src/Illuminate/Database/Grammar.php | 221 + .../src/Illuminate/Database/LICENSE.md | 21 + .../Database/MigrationServiceProvider.php | 225 + .../DatabaseMigrationRepository.php | 212 + .../Database/Migrations/Migration.php | 30 + .../Database/Migrations/MigrationCreator.php | 233 + .../MigrationRepositoryInterface.php | 81 + .../Database/Migrations/Migrator.php | 659 + .../Migrations/stubs/migration.create.stub | 31 + .../Database/Migrations/stubs/migration.stub | 28 + .../Migrations/stubs/migration.update.stub | 32 + .../Illuminate/Database/MySqlConnection.php | 66 + .../Database/PostgresConnection.php | 93 + .../src/Illuminate/Database/Query/Builder.php | 3167 ++ .../Illuminate/Database/Query/Expression.php | 44 + .../Database/Query/Grammars/Grammar.php | 1251 + .../Database/Query/Grammars/MySqlGrammar.php | 284 + .../Query/Grammars/PostgresGrammar.php | 388 + .../Database/Query/Grammars/SQLiteGrammar.php | 318 + .../Query/Grammars/SqlServerGrammar.php | 456 + .../Illuminate/Database/Query/JoinClause.php | 146 + .../Query/Processors/MySqlProcessor.php | 19 + .../Query/Processors/PostgresProcessor.php | 45 + .../Database/Query/Processors/Processor.php | 49 + .../Query/Processors/SQLiteProcessor.php | 19 + .../Query/Processors/SqlServerProcessor.php | 70 + .../Illuminate/Database/QueryException.php | 79 + .../src/Illuminate/Database/README.md | 69 + .../Illuminate/Database/SQLiteConnection.php | 100 + .../Illuminate/Database/Schema/Blueprint.php | 1545 + .../Illuminate/Database/Schema/Builder.php | 375 + .../Database/Schema/ColumnDefinition.php | 33 + .../Schema/ForeignIdColumnDefinition.php | 52 + .../Database/Schema/ForeignKeyDefinition.php | 26 + .../Database/Schema/Grammars/ChangeColumn.php | 247 + .../Database/Schema/Grammars/Grammar.php | 286 + .../Database/Schema/Grammars/MySqlGrammar.php | 1051 + .../Schema/Grammars/PostgresGrammar.php | 983 + .../Database/Schema/Grammars/RenameColumn.php | 71 + .../Schema/Grammars/SQLiteGrammar.php | 864 + .../Schema/Grammars/SqlServerGrammar.php | 896 + .../Database/Schema/MySqlBuilder.php | 114 + .../Database/Schema/PostgresBuilder.php | 177 + .../Database/Schema/SQLiteBuilder.php | 52 + .../Database/Schema/SqlServerBuilder.php | 28 + .../src/Illuminate/Database/Seeder.php | 137 + .../Database/SqlServerConnection.php | 108 + .../src/Illuminate/Database/composer.json | 48 + .../src/Illuminate/Encryption/Encrypter.php | 255 + .../Encryption/EncryptionServiceProvider.php | 86 + .../src/Illuminate/Encryption/LICENSE.md | 21 + .../src/Illuminate/Encryption/composer.json | 38 + .../Illuminate/Events/CallQueuedListener.php | 167 + .../src/Illuminate/Events/Dispatcher.php | 602 + .../Events/EventServiceProvider.php | 23 + .../src/Illuminate/Events/LICENSE.md | 21 + .../src/Illuminate/Events/NullDispatcher.php | 141 + .../src/Illuminate/Events/composer.json | 36 + .../src/Illuminate/Filesystem/Cache.php | 71 + .../src/Illuminate/Filesystem/Filesystem.php | 654 + .../Filesystem/FilesystemAdapter.php | 744 + .../Filesystem/FilesystemManager.php | 370 + .../Filesystem/FilesystemServiceProvider.php | 82 + .../src/Illuminate/Filesystem/LICENSE.md | 21 + .../src/Illuminate/Filesystem/composer.json | 46 + .../src/Illuminate/Foundation/AliasLoader.php | 243 + .../src/Illuminate/Foundation/Application.php | 1295 + .../Foundation/Auth/Access/Authorizable.php | 44 + .../Auth/Access/AuthorizesRequests.php | 127 + .../src/Illuminate/Foundation/Auth/User.php | 20 + .../Foundation/Bootstrap/BootProviders.php | 19 + .../Foundation/Bootstrap/HandleExceptions.php | 166 + .../Bootstrap/LoadConfiguration.php | 116 + .../Bootstrap/LoadEnvironmentVariables.php | 110 + .../Foundation/Bootstrap/RegisterFacades.php | 29 + .../Bootstrap/RegisterProviders.php | 19 + .../Bootstrap/SetRequestForConsole.php | 35 + .../Foundation/Bus/Dispatchable.php | 76 + .../Foundation/Bus/DispatchesJobs.php | 30 + .../Foundation/Bus/PendingChain.php | 54 + .../Foundation/Bus/PendingDispatch.php | 137 + .../Illuminate/Foundation/ComposerScripts.php | 65 + .../Foundation/Console/CastMakeCommand.php | 50 + .../Foundation/Console/ChannelMakeCommand.php | 65 + .../Console/ClearCompiledCommand.php | 40 + .../Foundation/Console/ClosureCommand.php | 71 + .../Console/ComponentMakeCommand.php | 144 + .../Foundation/Console/ConfigCacheCommand.php | 92 + .../Foundation/Console/ConfigClearCommand.php | 55 + .../Foundation/Console/ConsoleMakeCommand.php | 94 + .../Foundation/Console/DownCommand.php | 83 + .../Foundation/Console/EnvironmentCommand.php | 32 + .../Foundation/Console/EventCacheCommand.php | 58 + .../Foundation/Console/EventClearCommand.php | 57 + .../Console/EventGenerateCommand.php | 78 + .../Foundation/Console/EventListCommand.php | 91 + .../Foundation/Console/EventMakeCommand.php | 62 + .../Console/ExceptionMakeCommand.php | 84 + .../Foundation/Console/JobMakeCommand.php | 78 + .../Illuminate/Foundation/Console/Kernel.php | 380 + .../Foundation/Console/KeyGenerateCommand.php | 111 + .../Console/ListenerMakeCommand.php | 112 + .../Foundation/Console/MailMakeCommand.php | 116 + .../Foundation/Console/ModelMakeCommand.php | 178 + .../Console/NotificationMakeCommand.php | 116 + .../Console/ObserverMakeCommand.php | 113 + .../Console/OptimizeClearCommand.php | 38 + .../Foundation/Console/OptimizeCommand.php | 35 + .../Console/PackageDiscoverCommand.php | 40 + .../Foundation/Console/PolicyMakeCommand.php | 182 + .../Console/ProviderMakeCommand.php | 50 + .../Foundation/Console/QueuedCommand.php | 42 + .../Foundation/Console/RequestMakeCommand.php | 63 + .../Console/ResourceMakeCommand.php | 91 + .../Foundation/Console/RouteCacheCommand.php | 109 + .../Foundation/Console/RouteClearCommand.php | 55 + .../Foundation/Console/RouteListCommand.php | 264 + .../Foundation/Console/RuleMakeCommand.php | 54 + .../Foundation/Console/ServeCommand.php | 121 + .../Foundation/Console/StorageLinkCommand.php | 75 + .../Foundation/Console/StubPublishCommand.php | 71 + .../Foundation/Console/TestMakeCommand.php | 93 + .../Foundation/Console/UpCommand.php | 49 + .../Console/VendorPublishCommand.php | 283 + .../Foundation/Console/ViewCacheCommand.php | 87 + .../Foundation/Console/ViewClearCommand.php | 66 + .../Foundation/Console/stubs/cast.stub | 36 + .../Foundation/Console/stubs/channel.stub | 29 + .../Foundation/Console/stubs/console.stub | 42 + .../Foundation/Console/stubs/event.stub | 36 + .../stubs/exception-render-report.stub | 29 + .../Console/stubs/exception-render.stub | 19 + .../Console/stubs/exception-report.stub | 18 + .../Foundation/Console/stubs/exception.stub | 10 + .../Foundation/Console/stubs/job.queued.stub | 34 + .../Foundation/Console/stubs/job.stub | 31 + .../Console/stubs/listener-duck.stub | 30 + .../Console/stubs/listener-queued-duck.stub | 32 + .../Console/stubs/listener-queued.stub | 33 + .../Foundation/Console/stubs/listener.stub | 31 + .../Foundation/Console/stubs/mail.stub | 33 + .../Console/stubs/markdown-mail.stub | 33 + .../Console/stubs/markdown-notification.stub | 58 + .../Foundation/Console/stubs/markdown.stub | 12 + .../Foundation/Console/stubs/model.pivot.stub | 10 + .../Foundation/Console/stubs/model.stub | 10 + .../Console/stubs/notification.stub | 61 + .../Console/stubs/observer.plain.stub | 8 + .../Foundation/Console/stubs/observer.stub | 63 + .../Console/stubs/policy.plain.stub | 21 + .../Foundation/Console/stubs/policy.stub | 94 + .../Foundation/Console/stubs/provider.stub | 28 + .../Foundation/Console/stubs/request.stub | 30 + .../Console/stubs/resource-collection.stub | 19 + .../Foundation/Console/stubs/resource.stub | 19 + .../Foundation/Console/stubs/routes.stub | 16 + .../Foundation/Console/stubs/rule.stub | 40 + .../Foundation/Console/stubs/test.stub | 22 + .../Foundation/Console/stubs/test.unit.stub | 18 + .../Console/stubs/view-component.stub | 28 + .../Foundation/EnvironmentDetector.php | 74 + .../Foundation/Events/DiscoverEvents.php | 86 + .../Foundation/Events/Dispatchable.php | 52 + .../Foundation/Events/LocaleUpdated.php | 24 + .../Foundation/Exceptions/Handler.php | 521 + .../Foundation/Exceptions/WhoopsHandler.php | 86 + .../Foundation/Exceptions/views/401.blade.php | 5 + .../Foundation/Exceptions/views/403.blade.php | 5 + .../Foundation/Exceptions/views/404.blade.php | 5 + .../Foundation/Exceptions/views/419.blade.php | 5 + .../Foundation/Exceptions/views/429.blade.php | 5 + .../Foundation/Exceptions/views/500.blade.php | 5 + .../Foundation/Exceptions/views/503.blade.php | 5 + .../views/illustrated-layout.blade.php | 486 + .../Exceptions/views/layout.blade.php | 57 + .../Exceptions/views/minimal.blade.php | 62 + .../Foundation/Http/Events/RequestHandled.php | 33 + .../Exceptions/MaintenanceModeException.php | 55 + .../Foundation/Http/FormRequest.php | 249 + .../src/Illuminate/Foundation/Http/Kernel.php | 447 + .../Middleware/CheckForMaintenanceMode.php | 86 + .../Middleware/ConvertEmptyStringsToNull.php | 18 + .../Http/Middleware/TransformsRequest.php | 93 + .../Http/Middleware/TrimStrings.php | 31 + .../Http/Middleware/ValidatePostSize.php | 55 + .../Http/Middleware/VerifyCsrfToken.php | 204 + .../src/Illuminate/Foundation/Inspiring.php | 50 + .../src/Illuminate/Foundation/Mix.php | 68 + .../Illuminate/Foundation/PackageManifest.php | 184 + .../Foundation/ProviderRepository.php | 210 + .../Providers/ArtisanServiceProvider.php | 954 + .../Providers/ComposerServiceProvider.php | 32 + .../ConsoleSupportServiceProvider.php | 21 + .../Providers/FormRequestServiceProvider.php | 39 + .../Providers/FoundationServiceProvider.php | 83 + .../Support/Providers/AuthServiceProvider.php | 38 + .../Providers/EventServiceProvider.php | 126 + .../Providers/RouteServiceProvider.php | 104 + .../Concerns/InteractsWithAuthentication.php | 151 + .../Testing/Concerns/InteractsWithConsole.php | 68 + .../Concerns/InteractsWithContainer.php | 111 + .../Concerns/InteractsWithDatabase.php | 150 + .../InteractsWithExceptionHandling.php | 149 + .../Testing/Concerns/InteractsWithRedis.php | 115 + .../Testing/Concerns/InteractsWithSession.php | 64 + .../Testing/Concerns/MakesHttpRequests.php | 607 + .../Concerns/MocksApplicationServices.php | 286 + .../Foundation/Testing/DatabaseMigrations.php | 26 + .../Testing/DatabaseTransactions.php | 40 + .../Foundation/Testing/RefreshDatabase.php | 129 + .../Testing/RefreshDatabaseState.php | 13 + .../Foundation/Testing/TestCase.php | 243 + .../Foundation/Testing/WithFaker.php | 54 + .../Foundation/Testing/WithoutEvents.php | 22 + .../Foundation/Testing/WithoutMiddleware.php | 22 + .../Validation/ValidatesRequests.php | 83 + .../src/Illuminate/Foundation/helpers.php | 963 + .../Illuminate/Foundation/stubs/facade.stub | 21 + .../src/Illuminate/Hashing/AbstractHasher.php | 34 + .../src/Illuminate/Hashing/Argon2IdHasher.php | 41 + .../src/Illuminate/Hashing/ArgonHasher.php | 192 + .../src/Illuminate/Hashing/BcryptHasher.php | 114 + .../src/Illuminate/Hashing/HashManager.php | 97 + .../Hashing/HashServiceProvider.php | 35 + .../src/Illuminate/Hashing/LICENSE.md | 21 + .../src/Illuminate/Hashing/composer.json | 35 + .../Http/Client/ConnectionException.php | 10 + .../src/Illuminate/Http/Client/Factory.php | 285 + .../Illuminate/Http/Client/PendingRequest.php | 679 + .../src/Illuminate/Http/Client/Request.php | 305 + .../Http/Client/RequestException.php | 28 + .../src/Illuminate/Http/Client/Response.php | 285 + .../Http/Client/ResponseSequence.php | 153 + .../Concerns/InteractsWithContentTypes.php | 171 + .../Http/Concerns/InteractsWithFlashData.php | 64 + .../Http/Concerns/InteractsWithInput.php | 414 + .../Http/Exceptions/HttpResponseException.php | 37 + .../Http/Exceptions/PostTooLargeException.php | 23 + .../Exceptions/ThrottleRequestsException.php | 23 + .../framework/src/Illuminate/Http/File.php | 10 + .../src/Illuminate/Http/FileHelpers.php | 56 + .../src/Illuminate/Http/JsonResponse.php | 121 + .../framework/src/Illuminate/Http/LICENSE.md | 21 + .../CheckResponseForModifications.php | 27 + .../Illuminate/Http/Middleware/FrameGuard.php | 24 + .../Http/Middleware/SetCacheHeaders.php | 64 + .../Illuminate/Http/Middleware/TrustHosts.php | 73 + .../src/Illuminate/Http/RedirectResponse.php | 258 + .../framework/src/Illuminate/Http/Request.php | 702 + .../Http/Resources/CollectsResources.php | 64 + .../ConditionallyLoadsAttributes.php | 226 + .../Http/Resources/DelegatesToResource.php | 150 + .../Json/AnonymousResourceCollection.php | 27 + .../Http/Resources/Json/JsonResource.php | 233 + .../Json/PaginatedResourceResponse.php | 84 + .../Resources/Json/ResourceCollection.php | 134 + .../Http/Resources/Json/ResourceResponse.php | 120 + .../Illuminate/Http/Resources/MergeValue.php | 33 + .../Http/Resources/MissingValue.php | 16 + .../Http/Resources/PotentiallyMissing.php | 13 + .../src/Illuminate/Http/Response.php | 101 + .../src/Illuminate/Http/ResponseTrait.php | 153 + .../src/Illuminate/Http/Testing/File.php | 147 + .../Illuminate/Http/Testing/FileFactory.php | 89 + .../src/Illuminate/Http/Testing/MimeType.php | 65 + .../src/Illuminate/Http/UploadedFile.php | 149 + .../src/Illuminate/Http/composer.json | 43 + .../Illuminate/Log/Events/MessageLogged.php | 42 + .../framework/src/Illuminate/Log/LICENSE.md | 21 + .../src/Illuminate/Log/LogManager.php | 632 + .../src/Illuminate/Log/LogServiceProvider.php | 20 + .../framework/src/Illuminate/Log/Logger.php | 275 + .../Illuminate/Log/ParsesLogConfiguration.php | 62 + .../src/Illuminate/Log/composer.json | 36 + .../Illuminate/Mail/Events/MessageSending.php | 33 + .../Illuminate/Mail/Events/MessageSent.php | 74 + .../framework/src/Illuminate/Mail/LICENSE.md | 21 + .../src/Illuminate/Mail/MailManager.php | 468 + .../Illuminate/Mail/MailServiceProvider.php | 73 + .../src/Illuminate/Mail/Mailable.php | 914 + .../framework/src/Illuminate/Mail/Mailer.php | 626 + .../src/Illuminate/Mail/Markdown.php | 173 + .../framework/src/Illuminate/Mail/Message.php | 329 + .../src/Illuminate/Mail/PendingMail.php | 176 + .../Illuminate/Mail/SendQueuedMailable.php | 101 + .../Mail/Transport/ArrayTransport.php | 58 + .../Mail/Transport/LogTransport.php | 69 + .../Mail/Transport/MailgunTransport.php | 215 + .../Mail/Transport/SesTransport.php | 92 + .../Illuminate/Mail/Transport/Transport.php | 108 + .../src/Illuminate/Mail/composer.json | 46 + .../resources/views/html/button.blade.php | 19 + .../resources/views/html/footer.blade.php | 11 + .../resources/views/html/header.blade.php | 11 + .../resources/views/html/layout.blade.php | 54 + .../resources/views/html/message.blade.php | 27 + .../Mail/resources/views/html/panel.blade.php | 14 + .../resources/views/html/subcopy.blade.php | 7 + .../Mail/resources/views/html/table.blade.php | 3 + .../resources/views/html/themes/default.css | 289 + .../resources/views/text/button.blade.php | 1 + .../resources/views/text/footer.blade.php | 1 + .../resources/views/text/header.blade.php | 1 + .../resources/views/text/layout.blade.php | 9 + .../resources/views/text/message.blade.php | 27 + .../Mail/resources/views/text/panel.blade.php | 1 + .../resources/views/text/subcopy.blade.php | 1 + .../Mail/resources/views/text/table.blade.php | 1 + .../src/Illuminate/Notifications/Action.php | 33 + .../Notifications/AnonymousNotifiable.php | 72 + .../Notifications/ChannelManager.php | 162 + .../Channels/BroadcastChannel.php | 75 + .../Channels/DatabaseChannel.php | 63 + .../Notifications/Channels/MailChannel.php | 251 + .../Console/NotificationTableCommand.php | 81 + .../Console/stubs/notifications.stub | 35 + .../Notifications/DatabaseNotification.php | 111 + .../DatabaseNotificationCollection.php | 28 + .../Events/BroadcastNotificationCreated.php | 112 + .../Events/NotificationFailed.php | 56 + .../Events/NotificationSending.php | 47 + .../Notifications/Events/NotificationSent.php | 56 + .../HasDatabaseNotifications.php | 36 + .../src/Illuminate/Notifications/LICENSE.md | 21 + .../Messages/BroadcastMessage.php | 41 + .../Messages/DatabaseMessage.php | 24 + .../Notifications/Messages/MailMessage.php | 335 + .../Notifications/Messages/SimpleMessage.php | 245 + .../Illuminate/Notifications/Notifiable.php | 8 + .../Illuminate/Notifications/Notification.php | 47 + .../Notifications/NotificationSender.php | 230 + .../NotificationServiceProvider.php | 46 + .../Notifications/RoutesNotifications.php | 53 + .../Notifications/SendQueuedNotifications.php | 158 + .../Illuminate/Notifications/composer.json | 44 + .../resources/views/email.blade.php | 62 + .../Pagination/AbstractPaginator.php | 726 + .../src/Illuminate/Pagination/LICENSE.md | 21 + .../Pagination/LengthAwarePaginator.php | 200 + .../Pagination/PaginationServiceProvider.php | 54 + .../src/Illuminate/Pagination/Paginator.php | 176 + .../src/Illuminate/Pagination/UrlWindow.php | 220 + .../src/Illuminate/Pagination/composer.json | 36 + .../resources/views/bootstrap-4.blade.php | 46 + .../resources/views/default.blade.php | 46 + .../resources/views/semantic-ui.blade.php | 36 + .../views/simple-bootstrap-4.blade.php | 27 + .../resources/views/simple-default.blade.php | 19 + .../resources/views/simple-tailwind.blade.php | 25 + .../resources/views/tailwind.blade.php | 102 + .../framework/src/Illuminate/Pipeline/Hub.php | 74 + .../src/Illuminate/Pipeline/LICENSE.md | 21 + .../src/Illuminate/Pipeline/Pipeline.php | 245 + .../Pipeline/PipelineServiceProvider.php | 34 + .../src/Illuminate/Pipeline/composer.json | 35 + .../src/Illuminate/Queue/BeanstalkdQueue.php | 172 + .../Illuminate/Queue/CallQueuedClosure.php | 74 + .../Illuminate/Queue/CallQueuedHandler.php | 177 + .../src/Illuminate/Queue/Capsule/Manager.php | 187 + .../Queue/Connectors/BeanstalkdConnector.php | 41 + .../Queue/Connectors/ConnectorInterface.php | 14 + .../Queue/Connectors/DatabaseConnector.php | 43 + .../Queue/Connectors/NullConnector.php | 19 + .../Queue/Connectors/RedisConnector.php | 52 + .../Queue/Connectors/SqsConnector.php | 46 + .../Queue/Connectors/SyncConnector.php | 19 + .../Queue/Console/FailedTableCommand.php | 102 + .../Queue/Console/FlushFailedCommand.php | 34 + .../Queue/Console/ForgetFailedCommand.php | 36 + .../Queue/Console/ListFailedCommand.php | 114 + .../Queue/Console/ListenCommand.php | 114 + .../Queue/Console/RestartCommand.php | 58 + .../Illuminate/Queue/Console/RetryCommand.php | 93 + .../Illuminate/Queue/Console/TableCommand.php | 102 + .../Illuminate/Queue/Console/WorkCommand.php | 226 + .../Queue/Console/stubs/failed_jobs.stub | 35 + .../Illuminate/Queue/Console/stubs/jobs.stub | 36 + .../src/Illuminate/Queue/DatabaseQueue.php | 344 + .../Queue/Events/JobExceptionOccurred.php | 42 + .../src/Illuminate/Queue/Events/JobFailed.php | 42 + .../Illuminate/Queue/Events/JobProcessed.php | 33 + .../Illuminate/Queue/Events/JobProcessing.php | 33 + .../src/Illuminate/Queue/Events/Looping.php | 33 + .../Queue/Events/WorkerStopping.php | 24 + .../Failed/DatabaseFailedJobProvider.php | 117 + .../Failed/DynamoDbFailedJobProvider.php | 175 + .../Failed/FailedJobProviderInterface.php | 47 + .../Queue/Failed/NullFailedJobProvider.php | 62 + .../Illuminate/Queue/InteractsWithQueue.php | 76 + .../Queue/InvalidPayloadException.php | 19 + .../Illuminate/Queue/Jobs/BeanstalkdJob.php | 135 + .../src/Illuminate/Queue/Jobs/DatabaseJob.php | 100 + .../Queue/Jobs/DatabaseJobRecord.php | 63 + .../src/Illuminate/Queue/Jobs/Job.php | 349 + .../src/Illuminate/Queue/Jobs/JobName.php | 35 + .../src/Illuminate/Queue/Jobs/RedisJob.php | 139 + .../src/Illuminate/Queue/Jobs/SqsJob.php | 124 + .../src/Illuminate/Queue/Jobs/SyncJob.php | 91 + .../framework/src/Illuminate/Queue/LICENSE.md | 21 + .../src/Illuminate/Queue/Listener.php | 230 + .../src/Illuminate/Queue/ListenerOptions.php | 32 + .../src/Illuminate/Queue/LuaScripts.php | 129 + .../Queue/ManuallyFailedException.php | 10 + .../Queue/MaxAttemptsExceededException.php | 10 + .../src/Illuminate/Queue/NullQueue.php | 70 + .../framework/src/Illuminate/Queue/Queue.php | 290 + .../src/Illuminate/Queue/QueueManager.php | 260 + .../Illuminate/Queue/QueueServiceProvider.php | 278 + .../framework/src/Illuminate/Queue/README.md | 34 + .../src/Illuminate/Queue/RedisQueue.php | 310 + .../Illuminate/Queue/SerializableClosure.php | 40 + .../SerializesAndRestoresModelIdentifiers.php | 116 + .../src/Illuminate/Queue/SerializesModels.php | 135 + .../src/Illuminate/Queue/SqsQueue.php | 166 + .../src/Illuminate/Queue/SyncQueue.php | 160 + .../framework/src/Illuminate/Queue/Worker.php | 700 + .../src/Illuminate/Queue/WorkerOptions.php | 78 + .../src/Illuminate/Queue/composer.json | 51 + .../Redis/Connections/Connection.php | 222 + .../Connections/PhpRedisClusterConnection.php | 8 + .../Redis/Connections/PhpRedisConnection.php | 566 + .../Connections/PredisClusterConnection.php | 11 + .../Redis/Connections/PredisConnection.php | 72 + .../Redis/Connectors/PhpRedisConnector.php | 168 + .../Redis/Connectors/PredisConnector.php | 48 + .../Redis/Events/CommandExecuted.php | 59 + .../framework/src/Illuminate/Redis/LICENSE.md | 21 + .../Redis/Limiters/ConcurrencyLimiter.php | 166 + .../Limiters/ConcurrencyLimiterBuilder.php | 122 + .../Redis/Limiters/DurationLimiter.php | 148 + .../Redis/Limiters/DurationLimiterBuilder.php | 122 + .../src/Illuminate/Redis/RedisManager.php | 259 + .../Illuminate/Redis/RedisServiceProvider.php | 38 + .../src/Illuminate/Redis/composer.json | 39 + .../Routing/AbstractRouteCollection.php | 249 + .../Routing/CompiledRouteCollection.php | 329 + .../Routing/Console/ControllerMakeCommand.php | 212 + .../Routing/Console/MiddlewareMakeCommand.php | 63 + .../Routing/Console/stubs/controller.api.stub | 64 + .../Console/stubs/controller.invokable.stub | 20 + .../Console/stubs/controller.model.api.stub | 65 + .../Console/stubs/controller.model.stub | 86 + .../Console/stubs/controller.nested.api.stub | 71 + .../Console/stubs/controller.nested.stub | 94 + .../Console/stubs/controller.plain.stub | 11 + .../Routing/Console/stubs/controller.stub | 85 + .../Routing/Console/stubs/middleware.stub | 20 + .../Contracts/ControllerDispatcher.php | 27 + .../src/Illuminate/Routing/Controller.php | 72 + .../Routing/ControllerDispatcher.php | 81 + .../Routing/ControllerMiddlewareOptions.php | 50 + .../Routing/Events/RouteMatched.php | 33 + .../Exceptions/InvalidSignatureException.php | 18 + .../Exceptions/UrlGenerationException.php | 19 + .../Routing/ImplicitRouteBinding.php | 71 + .../src/Illuminate/Routing/LICENSE.md | 21 + .../Routing/Matching/HostValidator.php | 27 + .../Routing/Matching/MethodValidator.php | 21 + .../Routing/Matching/SchemeValidator.php | 27 + .../Routing/Matching/UriValidator.php | 23 + .../Routing/Matching/ValidatorInterface.php | 18 + .../Routing/Middleware/SubstituteBindings.php | 43 + .../Routing/Middleware/ThrottleRequests.php | 198 + .../Middleware/ThrottleRequestsWithRedis.php | 121 + .../Routing/Middleware/ValidateSignature.php | 27 + .../Routing/MiddlewareNameResolver.php | 85 + .../Routing/PendingResourceRegistration.php | 210 + .../src/Illuminate/Routing/Pipeline.php | 59 + .../Illuminate/Routing/RedirectController.php | 44 + .../src/Illuminate/Routing/Redirector.php | 262 + .../Illuminate/Routing/ResourceRegistrar.php | 476 + .../Illuminate/Routing/ResponseFactory.php | 266 + .../src/Illuminate/Routing/Route.php | 1158 + .../src/Illuminate/Routing/RouteAction.php | 96 + .../src/Illuminate/Routing/RouteBinding.php | 84 + .../Illuminate/Routing/RouteCollection.php | 268 + .../Routing/RouteCollectionInterface.php | 98 + .../Routing/RouteDependencyResolverTrait.php | 113 + .../Illuminate/Routing/RouteFileRegistrar.php | 37 + .../src/Illuminate/Routing/RouteGroup.php | 101 + .../Routing/RouteParameterBinder.php | 117 + .../src/Illuminate/Routing/RouteRegistrar.php | 213 + .../Routing/RouteSignatureParameters.php | 46 + .../src/Illuminate/Routing/RouteUri.php | 62 + .../Illuminate/Routing/RouteUrlGenerator.php | 321 + .../src/Illuminate/Routing/Router.php | 1248 + .../Routing/RoutingServiceProvider.php | 183 + .../Illuminate/Routing/SortedMiddleware.php | 122 + .../src/Illuminate/Routing/UrlGenerator.php | 775 + .../src/Illuminate/Routing/ViewController.php | 39 + .../src/Illuminate/Routing/composer.json | 48 + .../Session/ArraySessionHandler.php | 124 + .../Session/CacheBasedSessionHandler.php | 94 + .../Session/Console/SessionTableCommand.php | 81 + .../Session/Console/stubs/database.stub | 35 + .../Session/CookieSessionHandler.php | 121 + .../Session/DatabaseSessionHandler.php | 294 + .../src/Illuminate/Session/EncryptedStore.php | 69 + .../Session/ExistenceAwareInterface.php | 14 + .../Illuminate/Session/FileSessionHandler.php | 113 + .../src/Illuminate/Session/LICENSE.md | 21 + .../Middleware/AuthenticateSession.php | 96 + .../Session/Middleware/StartSession.php | 291 + .../Illuminate/Session/NullSessionHandler.php | 56 + .../src/Illuminate/Session/SessionManager.php | 255 + .../Session/SessionServiceProvider.php | 55 + .../src/Illuminate/Session/Store.php | 672 + .../Session/TokenMismatchException.php | 10 + .../src/Illuminate/Session/composer.json | 42 + .../Support/AggregateServiceProvider.php | 52 + .../framework/src/Illuminate/Support/Arr.php | 664 + .../src/Illuminate/Support/Carbon.php | 10 + .../src/Illuminate/Support/Collection.php | 1380 + .../src/Illuminate/Support/Composer.php | 110 + .../Support/ConfigurationUrlParser.php | 189 + .../src/Illuminate/Support/DateFactory.php | 231 + .../src/Illuminate/Support/Enumerable.php | 928 + .../framework/src/Illuminate/Support/Env.php | 108 + .../src/Illuminate/Support/Facades/App.php | 58 + .../Illuminate/Support/Facades/Artisan.php | 29 + .../src/Illuminate/Support/Facades/Auth.php | 61 + .../src/Illuminate/Support/Facades/Blade.php | 42 + .../Illuminate/Support/Facades/Broadcast.php | 26 + .../src/Illuminate/Support/Facades/Bus.php | 60 + .../src/Illuminate/Support/Facades/Cache.php | 39 + .../src/Illuminate/Support/Facades/Config.php | 26 + .../src/Illuminate/Support/Facades/Cookie.php | 46 + .../src/Illuminate/Support/Facades/Crypt.php | 27 + .../src/Illuminate/Support/Facades/DB.php | 42 + .../src/Illuminate/Support/Facades/Date.php | 120 + .../src/Illuminate/Support/Facades/Event.php | 76 + .../src/Illuminate/Support/Facades/Facade.php | 263 + .../src/Illuminate/Support/Facades/File.php | 58 + .../src/Illuminate/Support/Facades/Gate.php | 38 + .../src/Illuminate/Support/Facades/Hash.php | 24 + .../src/Illuminate/Support/Facades/Http.php | 52 + .../src/Illuminate/Support/Facades/Lang.php | 24 + .../src/Illuminate/Support/Facades/Log.php | 31 + .../src/Illuminate/Support/Facades/Mail.php | 52 + .../Support/Facades/Notification.php | 59 + .../Illuminate/Support/Facades/Password.php | 52 + .../src/Illuminate/Support/Facades/Queue.php | 50 + .../Illuminate/Support/Facades/Redirect.php | 34 + .../src/Illuminate/Support/Facades/Redis.php | 24 + .../Illuminate/Support/Facades/Request.php | 100 + .../Illuminate/Support/Facades/Response.php | 36 + .../src/Illuminate/Support/Facades/Route.php | 53 + .../src/Illuminate/Support/Facades/Schema.php | 43 + .../Illuminate/Support/Facades/Session.php | 44 + .../Illuminate/Support/Facades/Storage.php | 89 + .../src/Illuminate/Support/Facades/URL.php | 34 + .../Illuminate/Support/Facades/Validator.php | 24 + .../src/Illuminate/Support/Facades/View.php | 28 + .../src/Illuminate/Support/Fluent.php | 192 + .../Support/HigherOrderCollectionProxy.php | 63 + .../Support/HigherOrderTapProxy.php | 38 + .../Support/HigherOrderWhenProxy.php | 63 + .../src/Illuminate/Support/HtmlString.php | 56 + .../Illuminate/Support/InteractsWithTime.php | 64 + .../src/Illuminate/Support/LICENSE.md | 21 + .../src/Illuminate/Support/LazyCollection.php | 1346 + .../src/Illuminate/Support/Manager.php | 168 + .../src/Illuminate/Support/MessageBag.php | 417 + .../Support/NamespacedItemResolver.php | 102 + .../src/Illuminate/Support/Optional.php | 130 + .../src/Illuminate/Support/Pluralizer.php | 147 + .../src/Illuminate/Support/ProcessUtils.php | 69 + .../src/Illuminate/Support/Reflector.php | 48 + .../Illuminate/Support/ServiceProvider.php | 364 + .../framework/src/Illuminate/Support/Str.php | 733 + .../src/Illuminate/Support/Stringable.php | 676 + .../Support/Testing/Fakes/BusFake.php | 372 + .../Support/Testing/Fakes/EventFake.php | 272 + .../Support/Testing/Fakes/MailFake.php | 389 + .../Testing/Fakes/NotificationFake.php | 271 + .../Support/Testing/Fakes/PendingMailFake.php | 54 + .../Support/Testing/Fakes/QueueFake.php | 414 + .../Support/Traits/CapsuleManagerTrait.php | 69 + .../Support/Traits/EnumeratesValues.php | 993 + .../Support/Traits/ForwardsCalls.php | 54 + .../Illuminate/Support/Traits/Localizable.php | 34 + .../Illuminate/Support/Traits/Macroable.php | 116 + .../Support/Traits/ReflectsClosures.php | 55 + .../Illuminate/Support/Traits/Tappable.php | 17 + .../src/Illuminate/Support/ViewErrorBag.php | 130 + .../src/Illuminate/Support/composer.json | 53 + .../src/Illuminate/Support/helpers.php | 560 + .../src/Illuminate/Testing/Assert.php | 88 + .../Testing/Constraints/ArraySubset.php | 279 + .../Testing/Constraints/CountInDatabase.php | 83 + .../Testing/Constraints/HasInDatabase.php | 116 + .../Testing/Constraints/SeeInOrder.php | 88 + .../Constraints/SoftDeletedInDatabase.php | 117 + .../src/Illuminate/Testing/LICENSE.md | 21 + .../src/Illuminate/Testing/PendingCommand.php | 293 + .../src/Illuminate/Testing/TestResponse.php | 1327 + .../src/Illuminate/Testing/composer.json | 43 + .../Illuminate/Translation/ArrayLoader.php | 81 + .../src/Illuminate/Translation/FileLoader.php | 187 + .../src/Illuminate/Translation/LICENSE.md | 21 + .../Translation/MessageSelector.php | 412 + .../TranslationServiceProvider.php | 56 + .../src/Illuminate/Translation/Translator.php | 449 + .../src/Illuminate/Translation/composer.json | 37 + .../Validation/ClosureValidationRule.php | 70 + .../Concerns/FilterEmailValidation.php | 71 + .../Validation/Concerns/FormatsMessages.php | 390 + .../Concerns/ReplacesAttributes.php | 508 + .../Concerns/ValidatesAttributes.php | 1905 ++ .../Validation/DatabasePresenceVerifier.php | 138 + .../DatabasePresenceVerifierInterface.php | 14 + .../src/Illuminate/Validation/Factory.php | 283 + .../src/Illuminate/Validation/LICENSE.md | 21 + .../Validation/PresenceVerifierInterface.php | 30 + .../src/Illuminate/Validation/Rule.php | 93 + .../Validation/Rules/DatabaseRule.php | 198 + .../Validation/Rules/Dimensions.php | 131 + .../Illuminate/Validation/Rules/Exists.php | 22 + .../src/Illuminate/Validation/Rules/In.php | 45 + .../src/Illuminate/Validation/Rules/NotIn.php | 43 + .../Validation/Rules/RequiredIf.php | 38 + .../Illuminate/Validation/Rules/Unique.php | 74 + .../Validation/UnauthorizedException.php | 10 + .../Validation/ValidatesWhenResolvedTrait.php | 100 + .../Illuminate/Validation/ValidationData.php | 113 + .../Validation/ValidationException.php | 138 + .../Validation/ValidationRuleParser.php | 277 + .../Validation/ValidationServiceProvider.php | 66 + .../src/Illuminate/Validation/Validator.php | 1354 + .../src/Illuminate/Validation/composer.json | 44 + .../Illuminate/View/AnonymousComponent.php | 55 + .../View/Compilers/BladeCompiler.php | 719 + .../Illuminate/View/Compilers/Compiler.php | 74 + .../View/Compilers/CompilerInterface.php | 30 + .../View/Compilers/ComponentTagCompiler.php | 462 + .../Concerns/CompilesAuthorizations.php | 102 + .../Compilers/Concerns/CompilesComments.php | 19 + .../Compilers/Concerns/CompilesComponents.php | 176 + .../Concerns/CompilesConditionals.php | 271 + .../View/Compilers/Concerns/CompilesEchos.php | 94 + .../Compilers/Concerns/CompilesErrors.php | 37 + .../Compilers/Concerns/CompilesHelpers.php | 49 + .../Compilers/Concerns/CompilesIncludes.php | 82 + .../Compilers/Concerns/CompilesInjections.php | 23 + .../View/Compilers/Concerns/CompilesJson.php | 30 + .../Compilers/Concerns/CompilesLayouts.php | 116 + .../View/Compilers/Concerns/CompilesLoops.php | 180 + .../Compilers/Concerns/CompilesRawPhp.php | 32 + .../Compilers/Concerns/CompilesStacks.php | 59 + .../Concerns/CompilesTranslations.php | 44 + .../src/Illuminate/View/Component.php | 276 + .../Illuminate/View/ComponentAttributeBag.php | 246 + .../View/Concerns/ManagesComponents.php | 157 + .../View/Concerns/ManagesEvents.php | 192 + .../View/Concerns/ManagesLayouts.php | 220 + .../Illuminate/View/Concerns/ManagesLoops.php | 94 + .../View/Concerns/ManagesStacks.php | 179 + .../View/Concerns/ManagesTranslations.php | 38 + .../View/Engines/CompilerEngine.php | 100 + .../src/Illuminate/View/Engines/Engine.php | 23 + .../View/Engines/EngineResolver.php | 60 + .../Illuminate/View/Engines/FileEngine.php | 20 + .../src/Illuminate/View/Engines/PhpEngine.php | 66 + .../framework/src/Illuminate/View/Factory.php | 568 + .../src/Illuminate/View/FileViewFinder.php | 332 + .../View/InvokableComponentVariable.php | 95 + .../framework/src/Illuminate/View/LICENSE.md | 21 + .../Middleware/ShareErrorsFromSession.php | 51 + .../framework/src/Illuminate/View/View.php | 438 + .../Illuminate/View/ViewFinderInterface.php | 71 + .../src/Illuminate/View/ViewName.php | 25 + .../Illuminate/View/ViewServiceProvider.php | 154 + .../src/Illuminate/View/composer.json | 39 + vendor/laravel/sanctum/LICENSE.md | 21 + vendor/laravel/sanctum/README.md | 32 + vendor/laravel/sanctum/composer.json | 53 + vendor/laravel/sanctum/config/sanctum.php | 47 + ...01_create_personal_access_tokens_table.php | 36 + .../sanctum/src/Contracts/HasAbilities.php | 22 + vendor/laravel/sanctum/src/Guard.php | 107 + vendor/laravel/sanctum/src/HasApiTokens.php | 77 + .../Http/Controllers/CsrfCookieController.php | 18 + .../EnsureFrontendRequestsAreStateful.php | 68 + vendor/laravel/sanctum/src/NewAccessToken.php | 60 + .../sanctum/src/PersonalAccessToken.php | 91 + vendor/laravel/sanctum/src/Sanctum.php | 98 + .../sanctum/src/SanctumServiceProvider.php | 132 + vendor/laravel/sanctum/src/TransientToken.php | 30 + vendor/laravel/tinker/CHANGELOG.md | 50 + vendor/laravel/tinker/LICENSE.md | 21 + vendor/laravel/tinker/README.md | 32 + vendor/laravel/tinker/composer.json | 54 + vendor/laravel/tinker/config/tinker.php | 50 + .../tinker/src/ClassAliasAutoloader.php | 163 + .../tinker/src/Console/TinkerCommand.php | 156 + vendor/laravel/tinker/src/TinkerCaster.php | 108 + .../tinker/src/TinkerServiceProvider.php | 54 + vendor/laravel/ui/CHANGELOG.md | 67 + vendor/laravel/ui/LICENSE.md | 21 + vendor/laravel/ui/README.md | 31 + .../ui/auth-backend/AuthenticatesUsers.php | 199 + .../ui/auth-backend/ConfirmsPasswords.php | 71 + .../ui/auth-backend/RedirectsUsers.php | 20 + .../ui/auth-backend/RegistersUsers.php | 68 + .../ui/auth-backend/ResetsPasswords.php | 186 + .../auth-backend/SendsPasswordResetEmails.php | 109 + .../ui/auth-backend/ThrottlesLogins.php | 125 + .../ui/auth-backend/VerifiesEmails.php | 95 + vendor/laravel/ui/composer.json | 45 + .../src/Auth/bootstrap-stubs/auth/login.stub | 73 + .../auth/passwords/confirm.stub | 49 + .../bootstrap-stubs/auth/passwords/email.stub | 47 + .../bootstrap-stubs/auth/passwords/reset.stub | 65 + .../Auth/bootstrap-stubs/auth/register.stub | 77 + .../src/Auth/bootstrap-stubs/auth/verify.stub | 28 + .../ui/src/Auth/bootstrap-stubs/home.stub | 23 + .../src/Auth/bootstrap-stubs/layouts/app.stub | 80 + .../stubs/controllers/HomeController.stub | 28 + vendor/laravel/ui/src/Auth/stubs/routes.stub | 4 + vendor/laravel/ui/src/AuthCommand.php | 164 + vendor/laravel/ui/src/AuthRouteMethods.php | 86 + vendor/laravel/ui/src/ControllersCommand.php | 49 + vendor/laravel/ui/src/Presets/Bootstrap.php | 55 + vendor/laravel/ui/src/Presets/Preset.php | 65 + vendor/laravel/ui/src/Presets/React.php | 76 + vendor/laravel/ui/src/Presets/Vue.php | 82 + .../Presets/bootstrap-stubs/_variables.scss | 19 + .../ui/src/Presets/bootstrap-stubs/app.scss | 8 + .../src/Presets/bootstrap-stubs/bootstrap.js | 41 + .../ui/src/Presets/react-stubs/Example.js | 24 + .../laravel/ui/src/Presets/react-stubs/app.js | 15 + .../ui/src/Presets/react-stubs/webpack.mix.js | 15 + .../Presets/vue-stubs/ExampleComponent.vue | 23 + .../laravel/ui/src/Presets/vue-stubs/app.js | 32 + .../ui/src/Presets/vue-stubs/webpack.mix.js | 15 + vendor/laravel/ui/src/UiCommand.php | 91 + vendor/laravel/ui/src/UiServiceProvider.php | 35 + .../stubs/Auth/ConfirmPasswordController.stub | 40 + .../stubs/Auth/ForgotPasswordController.stub | 22 + .../ui/stubs/Auth/LoginController.stub | 40 + .../ui/stubs/Auth/RegisterController.stub | 73 + .../stubs/Auth/ResetPasswordController.stub | 30 + .../ui/stubs/Auth/VerificationController.stub | 42 + ...12_100000_create_password_resets_table.php | 32 + vendor/league/commonmark/.phpstorm.meta.php | 34 + vendor/league/commonmark/CHANGELOG-0.x.md | 842 + vendor/league/commonmark/CHANGELOG.md | 326 + vendor/league/commonmark/CODE_OF_CONDUCT.md | 22 + vendor/league/commonmark/LICENSE | 28 + vendor/league/commonmark/README.md | 219 + vendor/league/commonmark/bin/commonmark | 181 + vendor/league/commonmark/composer.json | 94 + .../src/Block/Element/AbstractBlock.php | 222 + .../Element/AbstractStringContainerBlock.php | 55 + .../src/Block/Element/BlockQuote.php | 51 + .../commonmark/src/Block/Element/Document.php | 58 + .../src/Block/Element/FencedCode.php | 201 + .../commonmark/src/Block/Element/Heading.php | 80 + .../src/Block/Element/HtmlBlock.php | 104 + .../src/Block/Element/IndentedCode.php | 72 + .../Element/InlineContainerInterface.php | 20 + .../src/Block/Element/ListBlock.php | 123 + .../commonmark/src/Block/Element/ListData.php | 60 + .../commonmark/src/Block/Element/ListItem.php | 73 + .../src/Block/Element/Paragraph.php | 98 + .../Element/StringContainerInterface.php | 44 + .../src/Block/Element/ThematicBreak.php | 35 + .../src/Block/Parser/ATXHeadingParser.php | 51 + .../src/Block/Parser/BlockParserInterface.php | 29 + .../src/Block/Parser/BlockQuoteParser.php | 41 + .../src/Block/Parser/FencedCodeParser.php | 47 + .../src/Block/Parser/HtmlBlockParser.php | 59 + .../src/Block/Parser/IndentedCodeParser.php | 43 + .../src/Block/Parser/LazyParagraphParser.php | 32 + .../src/Block/Parser/ListParser.php | 147 + .../src/Block/Parser/SetExtHeadingParser.php | 81 + .../src/Block/Parser/ThematicBreakParser.php | 43 + .../src/Block/Renderer/BlockQuoteRenderer.php | 50 + .../Block/Renderer/BlockRendererInterface.php | 31 + .../src/Block/Renderer/DocumentRenderer.php | 40 + .../src/Block/Renderer/FencedCodeRenderer.php | 52 + .../src/Block/Renderer/HeadingRenderer.php | 43 + .../src/Block/Renderer/HtmlBlockRenderer.php | 59 + .../Block/Renderer/IndentedCodeRenderer.php | 46 + .../src/Block/Renderer/ListBlockRenderer.php | 56 + .../src/Block/Renderer/ListItemRenderer.php | 60 + .../src/Block/Renderer/ParagraphRenderer.php | 45 + .../Block/Renderer/ThematicBreakRenderer.php | 41 + .../commonmark/src/CommonMarkConverter.php | 57 + .../src/ConfigurableEnvironmentInterface.php | 108 + vendor/league/commonmark/src/Context.php | 200 + .../commonmark/src/ContextInterface.php | 99 + vendor/league/commonmark/src/Converter.php | 84 + .../commonmark/src/ConverterInterface.php | 21 + vendor/league/commonmark/src/Cursor.php | 496 + .../commonmark/src/Delimiter/Delimiter.php | 152 + .../src/Delimiter/DelimiterInterface.php | 71 + .../src/Delimiter/DelimiterStack.php | 234 + .../DelimiterProcessorCollection.php | 73 + .../DelimiterProcessorCollectionInterface.php | 48 + .../Processor/DelimiterProcessorInterface.php | 86 + .../Processor/EmphasisDelimiterProcessor.php | 105 + .../Processor/StaggeredDelimiterProcessor.php | 106 + vendor/league/commonmark/src/DocParser.php | 229 + .../commonmark/src/DocParserInterface.php | 26 + .../src/ElementRendererInterface.php | 64 + vendor/league/commonmark/src/Environment.php | 424 + .../src/EnvironmentAwareInterface.php | 22 + .../commonmark/src/EnvironmentInterface.php | 83 + .../commonmark/src/Event/AbstractEvent.php | 50 + .../src/Event/DocumentParsedEvent.php | 33 + .../src/Event/DocumentPreParsedEvent.php | 48 + .../src/Exception/InvalidOptionException.php | 16 + .../Exception/UnexpectedEncodingException.php | 16 + .../Extension/Autolink/AutolinkExtension.php | 25 + .../Autolink/EmailAutolinkProcessor.php | 78 + .../Autolink/InlineMentionParser.php | 90 + .../Autolink/UrlAutolinkProcessor.php | 153 + .../src/Extension/CommonMarkCoreExtension.php | 80 + .../DisallowedRawHtmlBlockRenderer.php | 48 + .../DisallowedRawHtmlExtension.php | 28 + .../DisallowedRawHtmlInlineRenderer.php | 48 + .../src/Extension/ExtensionInterface.php | 27 + .../ExternalLink/ExternalLinkExtension.php | 24 + .../ExternalLink/ExternalLinkProcessor.php | 99 + .../GithubFlavoredMarkdownExtension.php | 31 + .../HeadingPermalink/HeadingPermalink.php | 33 + .../HeadingPermalinkExtension.php | 28 + .../HeadingPermalinkProcessor.php | 94 + .../HeadingPermalinkRenderer.php | 62 + .../Slug/DefaultSlugGenerator.php | 32 + .../Slug/SlugGeneratorInterface.php | 24 + .../Extension/InlinesOnly/ChildRenderer.php | 46 + .../InlinesOnly/InlinesOnlyExtension.php | 63 + .../SmartPunct/PunctuationParser.php | 70 + .../src/Extension/SmartPunct/Quote.php | 28 + .../src/Extension/SmartPunct/QuoteParser.php | 104 + .../Extension/SmartPunct/QuoteProcessor.php | 90 + .../Extension/SmartPunct/QuoteRenderer.php | 47 + .../SmartPunct/SmartPunctExtension.php | 49 + .../Extension/Strikethrough/Strikethrough.php | 22 + .../StrikethroughDelimiterProcessor.php | 55 + .../Strikethrough/StrikethroughExtension.php | 24 + .../Strikethrough/StrikethroughRenderer.php | 29 + .../commonmark/src/Extension/Table/Table.php | 69 + .../src/Extension/Table/TableCell.php | 66 + .../src/Extension/Table/TableCellRenderer.php | 39 + .../src/Extension/Table/TableExtension.php | 34 + .../src/Extension/Table/TableParser.php | 283 + .../src/Extension/Table/TableRenderer.php | 39 + .../src/Extension/Table/TableRow.php | 48 + .../src/Extension/Table/TableRowRenderer.php | 37 + .../src/Extension/Table/TableSection.php | 66 + .../Extension/Table/TableSectionRenderer.php | 41 + .../Normalizer/AsIsNormalizerStrategy.php | 65 + .../Normalizer/FlatNormalizerStrategy.php | 31 + .../NormalizerStrategyInterface.php | 19 + .../Normalizer/RelativeNormalizerStrategy.php | 62 + .../TableOfContents/TableOfContents.php | 18 + .../TableOfContentsBuilder.php | 166 + .../TableOfContentsExtension.php | 24 + .../Extension/TaskList/TaskListExtension.php | 24 + .../Extension/TaskList/TaskListItemMarker.php | 37 + .../TaskList/TaskListItemMarkerParser.php | 55 + .../TaskList/TaskListItemMarkerRenderer.php | 44 + .../src/GithubFlavoredMarkdownConverter.php | 33 + vendor/league/commonmark/src/HtmlElement.php | 146 + vendor/league/commonmark/src/HtmlRenderer.php | 126 + .../src/Inline/AdjacentTextMerger.php | 91 + .../src/Inline/Element/AbstractInline.php | 46 + .../Element/AbstractStringContainer.php | 53 + .../Inline/Element/AbstractWebResource.php | 53 + .../commonmark/src/Inline/Element/Code.php | 19 + .../src/Inline/Element/Emphasis.php | 23 + .../src/Inline/Element/HtmlInline.php | 19 + .../commonmark/src/Inline/Element/Image.php | 31 + .../commonmark/src/Inline/Element/Link.php | 31 + .../commonmark/src/Inline/Element/Newline.php | 35 + .../commonmark/src/Inline/Element/Strong.php | 23 + .../commonmark/src/Inline/Element/Text.php | 28 + .../src/Inline/Parser/AutolinkParser.php | 48 + .../src/Inline/Parser/BacktickParser.php | 64 + .../src/Inline/Parser/BangParser.php | 45 + .../src/Inline/Parser/CloseBracketParser.php | 205 + .../src/Inline/Parser/EntityParser.php | 39 + .../src/Inline/Parser/EscapableParser.php | 51 + .../src/Inline/Parser/HtmlInlineParser.php | 38 + .../Inline/Parser/InlineParserInterface.php | 29 + .../src/Inline/Parser/NewlineParser.php | 51 + .../src/Inline/Parser/OpenBracketParser.php | 40 + .../src/Inline/Renderer/CodeRenderer.php | 41 + .../src/Inline/Renderer/EmphasisRenderer.php | 40 + .../Inline/Renderer/HtmlInlineRenderer.php | 58 + .../src/Inline/Renderer/ImageRenderer.php | 68 + .../Renderer/InlineRendererInterface.php | 30 + .../src/Inline/Renderer/LinkRenderer.php | 66 + .../src/Inline/Renderer/NewlineRenderer.php | 42 + .../src/Inline/Renderer/StrongRenderer.php | 40 + .../src/Inline/Renderer/TextRenderer.php | 38 + .../commonmark/src/InlineParserContext.php | 60 + .../commonmark/src/InlineParserEngine.php | 191 + .../commonmark/src/Input/MarkdownInput.php | 82 + .../src/Input/MarkdownInputInterface.php | 24 + .../src/MarkdownConverterInterface.php | 31 + vendor/league/commonmark/src/Node/Node.php | 258 + .../league/commonmark/src/Node/NodeWalker.php | 89 + .../commonmark/src/Node/NodeWalkerEvent.php | 48 + .../commonmark/src/Reference/Reference.php | 90 + .../src/Reference/ReferenceInterface.php | 27 + .../commonmark/src/Reference/ReferenceMap.php | 55 + .../src/Reference/ReferenceMapInterface.php | 49 + .../src/Reference/ReferenceParser.php | 123 + .../commonmark/src/UnmatchedBlockCloser.php | 90 + .../commonmark/src/Util/ArrayCollection.php | 349 + .../commonmark/src/Util/Configuration.php | 111 + .../src/Util/ConfigurationAwareInterface.php | 25 + .../src/Util/ConfigurationInterface.php | 57 + .../commonmark/src/Util/Html5Entities.php | 2303 ++ .../src/Util/Html5EntityDecoder.php | 63 + .../commonmark/src/Util/LinkParserHelper.php | 125 + .../commonmark/src/Util/PrioritizedList.php | 70 + .../commonmark/src/Util/RegexHelper.php | 208 + .../league/commonmark/src/Util/UrlEncoder.php | 54 + vendor/league/commonmark/src/Util/Xml.php | 31 + vendor/league/flysystem/LICENSE | 19 + vendor/league/flysystem/SECURITY.md | 16 + vendor/league/flysystem/composer.json | 71 + vendor/league/flysystem/deprecations.md | 19 + .../flysystem/src/Adapter/AbstractAdapter.php | 72 + .../src/Adapter/AbstractFtpAdapter.php | 697 + .../src/Adapter/CanOverwriteFiles.php | 12 + vendor/league/flysystem/src/Adapter/Ftp.php | 574 + vendor/league/flysystem/src/Adapter/Ftpd.php | 45 + vendor/league/flysystem/src/Adapter/Local.php | 532 + .../flysystem/src/Adapter/NullAdapter.php | 144 + .../Polyfill/NotSupportingVisibilityTrait.php | 33 + .../Adapter/Polyfill/StreamedCopyTrait.php | 51 + .../Adapter/Polyfill/StreamedReadingTrait.php | 44 + .../src/Adapter/Polyfill/StreamedTrait.php | 9 + .../Adapter/Polyfill/StreamedWritingTrait.php | 60 + .../flysystem/src/Adapter/SynologyFtp.php | 8 + .../league/flysystem/src/AdapterInterface.php | 118 + vendor/league/flysystem/src/Config.php | 107 + .../league/flysystem/src/ConfigAwareTrait.php | 49 + .../src/ConnectionErrorException.php | 9 + .../src/ConnectionRuntimeException.php | 9 + vendor/league/flysystem/src/Directory.php | 31 + vendor/league/flysystem/src/Exception.php | 8 + vendor/league/flysystem/src/File.php | 205 + .../flysystem/src/FileExistsException.php | 37 + .../flysystem/src/FileNotFoundException.php | 37 + vendor/league/flysystem/src/Filesystem.php | 408 + .../flysystem/src/FilesystemException.php | 7 + .../flysystem/src/FilesystemInterface.php | 284 + .../src/FilesystemNotFoundException.php | 12 + vendor/league/flysystem/src/Handler.php | 137 + .../flysystem/src/InvalidRootException.php | 9 + vendor/league/flysystem/src/MountManager.php | 650 + .../flysystem/src/NotSupportedException.php | 37 + .../flysystem/src/Plugin/AbstractPlugin.php | 24 + .../league/flysystem/src/Plugin/EmptyDir.php | 34 + .../flysystem/src/Plugin/ForcedCopy.php | 44 + .../flysystem/src/Plugin/ForcedRename.php | 44 + .../flysystem/src/Plugin/GetWithMetadata.php | 51 + .../league/flysystem/src/Plugin/ListFiles.php | 35 + .../league/flysystem/src/Plugin/ListPaths.php | 36 + .../league/flysystem/src/Plugin/ListWith.php | 60 + .../flysystem/src/Plugin/PluggableTrait.php | 97 + .../src/Plugin/PluginNotFoundException.php | 10 + .../league/flysystem/src/PluginInterface.php | 20 + vendor/league/flysystem/src/ReadInterface.php | 88 + .../flysystem/src/RootViolationException.php | 10 + vendor/league/flysystem/src/SafeStorage.php | 39 + .../flysystem/src/UnreadableFileException.php | 18 + vendor/league/flysystem/src/Util.php | 353 + .../src/Util/ContentListingFormatter.php | 122 + vendor/league/flysystem/src/Util/MimeType.php | 249 + .../flysystem/src/Util/StreamHasher.php | 36 + vendor/maatwebsite/excel/.styleci.yml | 20 + vendor/maatwebsite/excel/CODE_OF_CONDUCT.md | 46 + vendor/maatwebsite/excel/CONTRIBUTING.md | 3 + vendor/maatwebsite/excel/LICENSE | 21 + vendor/maatwebsite/excel/README.md | 101 + vendor/maatwebsite/excel/SECURITY.md | 15 + vendor/maatwebsite/excel/composer.json | 57 + vendor/maatwebsite/excel/config/excel.php | 186 + vendor/maatwebsite/excel/src/Cell.php | 82 + vendor/maatwebsite/excel/src/ChunkReader.php | 85 + .../excel/src/Concerns/Exportable.php | 105 + .../excel/src/Concerns/FromArray.php | 11 + .../excel/src/Concerns/FromCollection.php | 13 + .../excel/src/Concerns/FromGenerator.php | 13 + .../excel/src/Concerns/FromIterator.php | 13 + .../excel/src/Concerns/FromQuery.php | 13 + .../excel/src/Concerns/FromView.php | 13 + .../excel/src/Concerns/Importable.php | 149 + .../excel/src/Concerns/MapsCsvSettings.php | 69 + .../excel/src/Concerns/OnEachRow.php | 13 + .../src/Concerns/RegistersEventListeners.php | 52 + .../excel/src/Concerns/ShouldAutoSize.php | 7 + .../excel/src/Concerns/SkipsErrors.php | 31 + .../excel/src/Concerns/SkipsFailures.php | 30 + .../excel/src/Concerns/SkipsOnError.php | 13 + .../excel/src/Concerns/SkipsOnFailure.php | 13 + .../excel/src/Concerns/SkipsUnknownSheets.php | 11 + .../excel/src/Concerns/ToArray.php | 11 + .../excel/src/Concerns/ToCollection.php | 13 + .../excel/src/Concerns/ToModel.php | 15 + .../excel/src/Concerns/WithBatchInserts.php | 11 + .../src/Concerns/WithCalculatedFormulas.php | 7 + .../excel/src/Concerns/WithCharts.php | 13 + .../excel/src/Concerns/WithChunkReading.php | 11 + .../src/Concerns/WithColumnFormatting.php | 11 + .../src/Concerns/WithConditionalSheets.php | 38 + .../src/Concerns/WithCustomChunkSize.php | 11 + .../src/Concerns/WithCustomCsvSettings.php | 11 + .../src/Concerns/WithCustomQuerySize.php | 17 + .../src/Concerns/WithCustomStartCell.php | 11 + .../src/Concerns/WithCustomValueBinder.php | 9 + .../excel/src/Concerns/WithDrawings.php | 13 + .../excel/src/Concerns/WithEvents.php | 11 + .../excel/src/Concerns/WithHeadingRow.php | 7 + .../excel/src/Concerns/WithHeadings.php | 11 + .../excel/src/Concerns/WithLimit.php | 11 + .../excel/src/Concerns/WithMappedCells.php | 11 + .../excel/src/Concerns/WithMapping.php | 13 + .../excel/src/Concerns/WithMultipleSheets.php | 11 + .../src/Concerns/WithPreCalculateFormulas.php | 7 + .../excel/src/Concerns/WithProgressBar.php | 13 + .../excel/src/Concerns/WithStartRow.php | 11 + .../src/Concerns/WithStrictNullComparison.php | 7 + .../excel/src/Concerns/WithTitle.php | 11 + .../excel/src/Concerns/WithValidation.php | 11 + .../excel/src/Console/ExportMakeCommand.php | 97 + .../excel/src/Console/ImportMakeCommand.php | 93 + .../excel/src/Console/WithModelStub.php | 48 + .../excel/src/Console/stubs/export.model.stub | 17 + .../excel/src/Console/stubs/export.plain.stub | 16 + .../src/Console/stubs/export.query-model.stub | 17 + .../excel/src/Console/stubs/export.query.stub | 16 + .../src/Console/stubs/import.collection.stub | 17 + .../excel/src/Console/stubs/import.model.stub | 21 + .../excel/src/DefaultValueBinder.php | 24 + .../excel/src/DelegatedMacroable.php | 36 + .../excel/src/Events/AfterImport.php | 52 + .../excel/src/Events/AfterSheet.php | 52 + .../excel/src/Events/BeforeExport.php | 52 + .../excel/src/Events/BeforeImport.php | 52 + .../excel/src/Events/BeforeSheet.php | 52 + .../excel/src/Events/BeforeWriting.php | 52 + vendor/maatwebsite/excel/src/Events/Event.php | 26 + .../excel/src/Events/ImportFailed.php | 29 + vendor/maatwebsite/excel/src/Excel.php | 197 + .../excel/src/ExcelServiceProvider.php | 94 + .../Exceptions/ConcernConflictException.php | 16 + .../src/Exceptions/LaravelExcelException.php | 9 + .../Exceptions/NoFilePathGivenException.php | 38 + .../Exceptions/NoFilenameGivenException.php | 22 + .../Exceptions/NoTypeDetectedException.php | 22 + .../src/Exceptions/RowSkippedException.php | 41 + .../src/Exceptions/SheetNotFoundException.php | 27 + .../Exceptions/UnreadableFileException.php | 22 + vendor/maatwebsite/excel/src/Exporter.php | 53 + .../maatwebsite/excel/src/Facades/Excel.php | 48 + .../excel/src/Factories/ReaderFactory.php | 67 + .../excel/src/Factories/WriterFactory.php | 86 + .../maatwebsite/excel/src/Fakes/ExcelFake.php | 342 + vendor/maatwebsite/excel/src/Fakes/fake_file | 0 vendor/maatwebsite/excel/src/Files/Disk.php | 99 + .../excel/src/Files/Filesystem.php | 36 + .../excel/src/Files/LocalTemporaryFile.php | 73 + .../excel/src/Files/RemoteTemporaryFile.php | 131 + .../excel/src/Files/TemporaryFile.php | 71 + .../excel/src/Files/TemporaryFileFactory.php | 84 + .../excel/src/Filters/ChunkReadFilter.php | 56 + vendor/maatwebsite/excel/src/HasEventBus.php | 64 + .../excel/src/HeadingRowImport.php | 53 + .../excel/src/Helpers/ArrayHelper.php | 33 + .../excel/src/Helpers/CellHelper.php | 16 + .../excel/src/Helpers/FileTypeDetector.php | 54 + vendor/maatwebsite/excel/src/Importer.php | 51 + .../excel/src/Imports/EndRowFinder.php | 29 + .../excel/src/Imports/HeadingRowExtractor.php | 64 + .../excel/src/Imports/HeadingRowFormatter.php | 103 + .../excel/src/Imports/ModelImporter.php | 72 + .../excel/src/Imports/ModelManager.php | 181 + .../excel/src/Jobs/AfterImportJob.php | 60 + .../excel/src/Jobs/AppendDataToSheet.php | 82 + .../excel/src/Jobs/AppendQueryToSheet.php | 98 + .../excel/src/Jobs/AppendViewToSheet.php | 77 + .../maatwebsite/excel/src/Jobs/CloseSheet.php | 76 + .../excel/src/Jobs/ExtendedQueueable.php | 26 + .../excel/src/Jobs/ProxyFailures.php | 18 + .../excel/src/Jobs/QueueExport.php | 75 + .../excel/src/Jobs/QueueImport.php | 37 + .../maatwebsite/excel/src/Jobs/ReadChunk.php | 156 + .../excel/src/Jobs/StoreQueuedExport.php | 59 + vendor/maatwebsite/excel/src/MappedReader.php | 49 + .../excel/src/Mixins/DownloadCollection.php | 73 + .../excel/src/Mixins/StoreCollection.php | 67 + vendor/maatwebsite/excel/src/QueuedWriter.php | 210 + vendor/maatwebsite/excel/src/Reader.php | 422 + .../excel/src/RegistersCustomConcerns.php | 39 + vendor/maatwebsite/excel/src/Row.php | 86 + vendor/maatwebsite/excel/src/Sheet.php | 637 + .../src/Transactions/DbTransactionHandler.php | 32 + .../Transactions/NullTransactionHandler.php | 16 + .../src/Transactions/TransactionHandler.php | 13 + .../src/Transactions/TransactionManager.php | 34 + .../excel/src/Validators/Failure.php | 84 + .../excel/src/Validators/RowValidator.php | 144 + .../src/Validators/ValidationException.php | 39 + vendor/maatwebsite/excel/src/Writer.php | 204 + .../zipstream-php/.github/FUNDING.yml | 1 + .../zipstream-php/.github/ISSUE_TEMPLATE.md | 12 + vendor/maennchen/zipstream-php/.gitignore | 6 + vendor/maennchen/zipstream-php/.travis.yml | 12 + vendor/maennchen/zipstream-php/CHANGELOG.md | 51 + .../maennchen/zipstream-php/CONTRIBUTING.md | 25 + vendor/maennchen/zipstream-php/LICENSE | 24 + vendor/maennchen/zipstream-php/README.md | 123 + vendor/maennchen/zipstream-php/composer.json | 41 + .../maennchen/zipstream-php/phpunit.xml.dist | 17 + vendor/maennchen/zipstream-php/psalm.xml | 55 + vendor/maennchen/zipstream-php/src/Bigint.php | 172 + .../zipstream-php/src/DeflateStream.php | 70 + .../maennchen/zipstream-php/src/Exception.php | 11 + .../src/Exception/EncodingException.php | 13 + .../src/Exception/FileNotFoundException.php | 22 + .../Exception/FileNotReadableException.php | 22 + .../IncompatibleOptionsException.php | 13 + .../src/Exception/OverflowException.php | 17 + .../Exception/StreamNotReadableException.php | 22 + vendor/maennchen/zipstream-php/src/File.php | 477 + .../zipstream-php/src/Option/Archive.php | 261 + .../zipstream-php/src/Option/File.php | 116 + .../zipstream-php/src/Option/Method.php | 19 + .../zipstream-php/src/Option/Version.php | 22 + vendor/maennchen/zipstream-php/src/Stream.php | 253 + .../maennchen/zipstream-php/src/ZipStream.php | 599 + .../zipstream-php/test/BigintTest.php | 65 + .../zipstream-php/test/ZipStreamTest.php | 586 + .../zipstream-php/test/bootstrap.php | 6 + .../test/bug/BugHonorFileTimeTest.php | 39 + vendor/markbaker/complex/README.md | 156 + .../markbaker/complex/classes/Autoloader.php | 53 + .../markbaker/complex/classes/Bootstrap.php | 38 + .../markbaker/complex/classes/src/Complex.php | 390 + .../complex/classes/src/Exception.php | 13 + .../complex/classes/src/functions/abs.php | 29 + .../complex/classes/src/functions/acos.php | 38 + .../complex/classes/src/functions/acosh.php | 34 + .../complex/classes/src/functions/acot.php | 25 + .../complex/classes/src/functions/acoth.php | 25 + .../complex/classes/src/functions/acsc.php | 29 + .../complex/classes/src/functions/acsch.php | 29 + .../classes/src/functions/argument.php | 28 + .../complex/classes/src/functions/asec.php | 29 + .../complex/classes/src/functions/asech.php | 29 + .../complex/classes/src/functions/asin.php | 37 + .../complex/classes/src/functions/asinh.php | 33 + .../complex/classes/src/functions/atan.php | 45 + .../complex/classes/src/functions/atanh.php | 38 + .../classes/src/functions/conjugate.php | 28 + .../complex/classes/src/functions/cos.php | 34 + .../complex/classes/src/functions/cosh.php | 32 + .../complex/classes/src/functions/cot.php | 29 + .../complex/classes/src/functions/coth.php | 24 + .../complex/classes/src/functions/csc.php | 29 + .../complex/classes/src/functions/csch.php | 29 + .../complex/classes/src/functions/exp.php | 34 + .../complex/classes/src/functions/inverse.php | 29 + .../complex/classes/src/functions/ln.php | 33 + .../complex/classes/src/functions/log10.php | 32 + .../complex/classes/src/functions/log2.php | 32 + .../classes/src/functions/negative.php | 31 + .../complex/classes/src/functions/pow.php | 40 + .../complex/classes/src/functions/rho.php | 28 + .../complex/classes/src/functions/sec.php | 25 + .../complex/classes/src/functions/sech.php | 25 + .../complex/classes/src/functions/sin.php | 32 + .../complex/classes/src/functions/sinh.php | 32 + .../complex/classes/src/functions/sqrt.php | 29 + .../complex/classes/src/functions/tan.php | 40 + .../complex/classes/src/functions/tanh.php | 35 + .../complex/classes/src/functions/theta.php | 38 + .../complex/classes/src/operations/add.php | 46 + .../classes/src/operations/divideby.php | 56 + .../classes/src/operations/divideinto.php | 56 + .../classes/src/operations/multiply.php | 48 + .../classes/src/operations/subtract.php | 46 + vendor/markbaker/complex/composer.json | 94 + .../complex/examples/complexTest.php | 154 + .../complex/examples/testFunctions.php | 52 + .../complex/examples/testOperations.php | 34 + vendor/markbaker/complex/license.md | 25 + vendor/markbaker/matrix/README.md | 165 + vendor/markbaker/matrix/buildPhar.php | 62 + .../markbaker/matrix/classes/Autoloader.php | 53 + vendor/markbaker/matrix/classes/Bootstrap.php | 38 + .../markbaker/matrix/classes/src/Builder.php | 70 + .../matrix/classes/src/Exception.php | 13 + .../matrix/classes/src/Functions.php | 337 + .../markbaker/matrix/classes/src/Matrix.php | 400 + .../matrix/classes/src/Operators/Addition.php | 68 + .../classes/src/Operators/DirectSum.php | 64 + .../matrix/classes/src/Operators/Division.php | 38 + .../classes/src/Operators/Multiplication.php | 77 + .../matrix/classes/src/Operators/Operator.php | 78 + .../classes/src/Operators/Subtraction.php | 68 + .../matrix/classes/src/functions/adjoint.php | 30 + .../classes/src/functions/antidiagonal.php | 29 + .../classes/src/functions/cofactors.php | 30 + .../classes/src/functions/determinant.php | 30 + .../matrix/classes/src/functions/diagonal.php | 30 + .../matrix/classes/src/functions/identity.php | 30 + .../matrix/classes/src/functions/inverse.php | 30 + .../matrix/classes/src/functions/minors.php | 30 + .../matrix/classes/src/functions/trace.php | 30 + .../classes/src/functions/transpose.php | 30 + .../matrix/classes/src/operations/add.php | 44 + .../classes/src/operations/directsum.php | 44 + .../classes/src/operations/divideby.php | 44 + .../classes/src/operations/divideinto.php | 44 + .../classes/src/operations/multiply.php | 44 + .../classes/src/operations/subtract.php | 44 + vendor/markbaker/matrix/composer.7.2.json | 86 + vendor/markbaker/matrix/composer.json | 81 + vendor/markbaker/matrix/examples/test.php | 19 + vendor/markbaker/matrix/infection.json.dist | 17 + vendor/markbaker/matrix/license.md | 25 + vendor/markbaker/matrix/phpstan.neon | 4 + vendor/mockery/mockery/.phpstorm.meta.php | 11 + vendor/mockery/mockery/CHANGELOG.md | 140 + vendor/mockery/mockery/CONTRIBUTING.md | 88 + vendor/mockery/mockery/LICENSE | 27 + vendor/mockery/mockery/README.md | 292 + vendor/mockery/mockery/composer.json | 59 + vendor/mockery/mockery/docs/README.md | 4 + vendor/mockery/mockery/docs/conf.py | 267 + .../docs/cookbook/big_parent_class.rst | 52 + .../mockery/docs/cookbook/class_constants.rst | 183 + .../docs/cookbook/default_expectations.rst | 17 + .../docs/cookbook/detecting_mock_objects.rst | 13 + .../mockery/mockery/docs/cookbook/index.rst | 16 + .../mockery/mockery/docs/cookbook/map.rst.inc | 7 + .../mockery/docs/cookbook/mockery_on.rst | 85 + .../cookbook/mocking_class_within_class.rst | 146 + .../cookbook/mocking_hard_dependencies.rst | 137 + .../cookbook/not_calling_the_constructor.rst | 63 + .../mockery/docs/getting_started/index.rst | 12 + .../docs/getting_started/installation.rst | 49 + .../mockery/docs/getting_started/map.rst.inc | 4 + .../docs/getting_started/quick_reference.rst | 200 + .../docs/getting_started/simple_example.rst | 70 + .../docs/getting_started/upgrading.rst | 82 + vendor/mockery/mockery/docs/index.rst | 76 + .../mockery/docs/mockery/configuration.rst | 77 + .../mockery/docs/mockery/exceptions.rst | 65 + .../mockery/mockery/docs/mockery/gotchas.rst | 42 + vendor/mockery/mockery/docs/mockery/index.rst | 12 + .../mockery/mockery/docs/mockery/map.rst.inc | 4 + .../docs/mockery/reserved_method_names.rst | 20 + .../alternative_should_receive_syntax.rst | 91 + .../docs/reference/argument_validation.rst | 338 + .../docs/reference/creating_test_doubles.rst | 435 + .../mockery/docs/reference/demeter_chains.rst | 38 + .../mockery/docs/reference/expectations.rst | 505 + .../docs/reference/final_methods_classes.rst | 28 + .../mockery/mockery/docs/reference/index.rst | 22 + .../docs/reference/instance_mocking.rst | 22 + .../mockery/docs/reference/magic_methods.rst | 16 + .../mockery/docs/reference/map.rst.inc | 14 + .../mockery/docs/reference/partial_mocks.rst | 108 + .../pass_by_reference_behaviours.rst | 130 + .../docs/reference/phpunit_integration.rst | 145 + .../docs/reference/protected_methods.rst | 26 + .../docs/reference/public_properties.rst | 20 + .../reference/public_static_properties.rst | 15 + .../mockery/mockery/docs/reference/spies.rst | 154 + vendor/mockery/mockery/library/Mockery.php | 965 + .../Phpunit/MockeryPHPUnitIntegration.php | 90 + ...PHPUnitIntegrationAssertPostConditions.php | 31 + .../Adapter/Phpunit/MockeryTestCase.php | 35 + .../Adapter/Phpunit/MockeryTestCaseSetUp.php | 38 + .../Mockery/Adapter/Phpunit/TestListener.php | 48 + .../Adapter/Phpunit/TestListenerTrait.php | 87 + .../library/Mockery/ClosureWrapper.php | 42 + .../library/Mockery/CompositeExpectation.php | 154 + .../mockery/library/Mockery/Configuration.php | 190 + .../mockery/library/Mockery/Container.php | 545 + .../Mockery/CountValidator/AtLeast.php | 62 + .../library/Mockery/CountValidator/AtMost.php | 51 + .../CountValidator/CountValidatorAbstract.php | 69 + .../library/Mockery/CountValidator/Exact.php | 54 + .../Mockery/CountValidator/Exception.php | 25 + .../mockery/library/Mockery/Exception.php | 25 + .../Exception/BadMethodCallException.php | 23 + .../Exception/InvalidArgumentException.php | 25 + .../Exception/InvalidCountException.php | 102 + .../Exception/InvalidOrderException.php | 83 + .../NoMatchingExpectationException.php | 70 + .../Mockery/Exception/RuntimeException.php | 25 + .../mockery/library/Mockery/Expectation.php | 910 + .../library/Mockery/ExpectationDirector.php | 218 + .../library/Mockery/ExpectationInterface.php | 46 + .../Mockery/ExpectsHigherOrderMessage.php | 38 + .../Mockery/Generator/CachingGenerator.php | 45 + .../Mockery/Generator/DefinedTargetClass.php | 110 + .../library/Mockery/Generator/Generator.php | 27 + .../library/Mockery/Generator/Method.php | 73 + .../Mockery/Generator/MockConfiguration.php | 584 + .../Generator/MockConfigurationBuilder.php | 174 + .../Mockery/Generator/MockDefinition.php | 51 + .../Mockery/Generator/MockNameBuilder.php | 46 + .../library/Mockery/Generator/Parameter.php | 105 + .../Pass/AvoidMethodClashPass.php | 49 + .../Pass/CallTypeHintPass.php | 47 + .../StringManipulation/Pass/ClassNamePass.php | 49 + .../StringManipulation/Pass/ClassPass.php | 58 + .../StringManipulation/Pass/ConstantsPass.php | 33 + .../Pass/InstanceMockPass.php | 83 + .../StringManipulation/Pass/InterfacePass.php | 48 + .../Pass/MagicMethodTypeHintsPass.php | 208 + .../Pass/MethodDefinitionPass.php | 175 + .../StringManipulation/Pass/Pass.php | 28 + .../RemoveBuiltinMethodsThatAreFinalPass.php | 53 + .../Pass/RemoveDestructorPass.php | 45 + ...lizeForInternalSerializableClassesPass.php | 58 + .../StringManipulation/Pass/TraitPass.php | 47 + .../Generator/StringManipulationGenerator.php | 89 + .../Generator/TargetClassInterface.php | 107 + .../Generator/UndefinedTargetClass.php | 94 + .../library/Mockery/HigherOrderMessage.php | 49 + .../mockery/library/Mockery/Instantiator.php | 209 + .../library/Mockery/LegacyMockInterface.php | 240 + .../library/Mockery/Loader/EvalLoader.php | 36 + .../mockery/library/Mockery/Loader/Loader.php | 28 + .../library/Mockery/Loader/RequireLoader.php | 46 + .../Mockery/Matcher/AndAnyOtherArgs.php | 45 + .../mockery/library/Mockery/Matcher/Any.php | 45 + .../library/Mockery/Matcher/AnyArgs.php | 40 + .../mockery/library/Mockery/Matcher/AnyOf.php | 46 + .../Mockery/Matcher/ArgumentListMatcher.php | 25 + .../library/Mockery/Matcher/Closure.php | 47 + .../library/Mockery/Matcher/Contains.php | 64 + .../library/Mockery/Matcher/Ducktype.php | 53 + .../library/Mockery/Matcher/HasKey.php | 45 + .../library/Mockery/Matcher/HasValue.php | 46 + .../Mockery/Matcher/MatcherAbstract.php | 58 + .../Mockery/Matcher/MultiArgumentClosure.php | 49 + .../library/Mockery/Matcher/MustBe.php | 52 + .../library/Mockery/Matcher/NoArgs.php | 40 + .../mockery/library/Mockery/Matcher/Not.php | 46 + .../library/Mockery/Matcher/NotAnyOf.php | 51 + .../Mockery/Matcher/PHPUnitConstraint.php | 76 + .../library/Mockery/Matcher/Pattern.php | 45 + .../library/Mockery/Matcher/Subset.php | 92 + .../mockery/library/Mockery/Matcher/Type.php | 56 + .../mockery/library/Mockery/MethodCall.php | 43 + .../mockery/mockery/library/Mockery/Mock.php | 962 + .../mockery/library/Mockery/MockInterface.php | 38 + .../library/Mockery/ReceivedMethodCalls.php | 48 + .../mockery/library/Mockery/Undefined.php | 46 + .../library/Mockery/VerificationDirector.php | 107 + .../Mockery/VerificationExpectation.php | 35 + vendor/mockery/mockery/library/helpers.php | 65 + vendor/monolog/monolog/CHANGELOG.md | 490 + vendor/monolog/monolog/LICENSE | 19 + vendor/monolog/monolog/README.md | 105 + vendor/monolog/monolog/UPGRADE.md | 72 + vendor/monolog/monolog/composer.json | 75 + .../monolog/src/Monolog/DateTimeImmutable.php | 49 + .../monolog/src/Monolog/ErrorHandler.php | 267 + .../Monolog/Formatter/ChromePHPFormatter.php | 81 + .../Monolog/Formatter/ElasticaFormatter.php | 80 + .../Formatter/ElasticsearchFormatter.php | 89 + .../Monolog/Formatter/FlowdockFormatter.php | 107 + .../Monolog/Formatter/FluentdFormatter.php | 88 + .../Monolog/Formatter/FormatterInterface.php | 36 + .../Formatter/GelfMessageFormatter.php | 146 + .../src/Monolog/Formatter/HtmlFormatter.php | 139 + .../src/Monolog/Formatter/JsonFormatter.php | 190 + .../src/Monolog/Formatter/LineFormatter.php | 199 + .../src/Monolog/Formatter/LogglyFormatter.php | 45 + .../Monolog/Formatter/LogmaticFormatter.php | 66 + .../Monolog/Formatter/LogstashFormatter.php | 101 + .../Monolog/Formatter/MongoDBFormatter.php | 141 + .../Monolog/Formatter/NormalizerFormatter.php | 260 + .../src/Monolog/Formatter/ScalarFormatter.php | 48 + .../Monolog/Formatter/WildfireFormatter.php | 118 + .../src/Monolog/Handler/AbstractHandler.php | 96 + .../Handler/AbstractProcessingHandler.php | 58 + .../Monolog/Handler/AbstractSyslogHandler.php | 102 + .../src/Monolog/Handler/AmqpHandler.php | 137 + .../Monolog/Handler/BrowserConsoleHandler.php | 243 + .../src/Monolog/Handler/BufferHandler.php | 152 + .../src/Monolog/Handler/ChromePHPHandler.php | 193 + .../src/Monolog/Handler/CouchDBHandler.php | 73 + .../src/Monolog/Handler/CubeHandler.php | 155 + .../monolog/src/Monolog/Handler/Curl/Util.php | 68 + .../Monolog/Handler/DeduplicationHandler.php | 173 + .../Handler/DoctrineCouchDBHandler.php | 46 + .../src/Monolog/Handler/DynamoDbHandler.php | 101 + .../src/Monolog/Handler/ElasticaHandler.php | 124 + .../Monolog/Handler/ElasticsearchHandler.php | 189 + .../src/Monolog/Handler/ErrorLogHandler.php | 86 + .../Monolog/Handler/FallbackGroupHandler.php | 60 + .../src/Monolog/Handler/FilterHandler.php | 177 + .../ActivationStrategyInterface.php | 25 + .../ChannelLevelActivationStrategy.php | 66 + .../ErrorLevelActivationStrategy.php | 40 + .../Monolog/Handler/FingersCrossedHandler.php | 215 + .../src/Monolog/Handler/FirePHPHandler.php | 166 + .../src/Monolog/Handler/FleepHookHandler.php | 116 + .../src/Monolog/Handler/FlowdockHandler.php | 116 + .../Handler/FormattableHandlerInterface.php | 37 + .../Handler/FormattableHandlerTrait.php | 61 + .../src/Monolog/Handler/GelfHandler.php | 59 + .../src/Monolog/Handler/GroupHandler.php | 124 + .../monolog/src/Monolog/Handler/Handler.php | 53 + .../src/Monolog/Handler/HandlerInterface.php | 76 + .../src/Monolog/Handler/HandlerWrapper.php | 134 + .../src/Monolog/Handler/IFTTTHandler.php | 70 + .../src/Monolog/Handler/InsightOpsHandler.php | 59 + .../src/Monolog/Handler/LogEntriesHandler.php | 53 + .../src/Monolog/Handler/LogglyHandler.php | 159 + .../src/Monolog/Handler/LogmaticHandler.php | 88 + .../src/Monolog/Handler/MailHandler.php | 85 + .../src/Monolog/Handler/MandrillHandler.php | 78 + .../Handler/MissingExtensionException.php | 21 + .../src/Monolog/Handler/MongoDBHandler.php | 85 + .../Monolog/Handler/NativeMailerHandler.php | 176 + .../src/Monolog/Handler/NewRelicHandler.php | 197 + .../src/Monolog/Handler/NoopHandler.php | 40 + .../src/Monolog/Handler/NullHandler.php | 54 + .../src/Monolog/Handler/OverflowHandler.php | 146 + .../src/Monolog/Handler/PHPConsoleHandler.php | 243 + .../src/Monolog/Handler/ProcessHandler.php | 193 + .../Handler/ProcessableHandlerInterface.php | 38 + .../Handler/ProcessableHandlerTrait.php | 71 + .../src/Monolog/Handler/PsrHandler.php | 97 + .../src/Monolog/Handler/PushoverHandler.php | 203 + .../src/Monolog/Handler/RedisHandler.php | 96 + .../src/Monolog/Handler/RollbarHandler.php | 130 + .../Monolog/Handler/RotatingFileHandler.php | 194 + .../src/Monolog/Handler/SamplingHandler.php | 113 + .../src/Monolog/Handler/SendGridHandler.php | 100 + .../src/Monolog/Handler/Slack/SlackRecord.php | 356 + .../src/Monolog/Handler/SlackHandler.php | 233 + .../Monolog/Handler/SlackWebhookHandler.php | 130 + .../src/Monolog/Handler/SocketHandler.php | 379 + .../src/Monolog/Handler/SqsHandler.php | 64 + .../src/Monolog/Handler/StreamHandler.php | 177 + .../Monolog/Handler/SwiftMailerHandler.php | 102 + .../src/Monolog/Handler/SyslogHandler.php | 67 + .../Monolog/Handler/SyslogUdp/UdpSocket.php | 61 + .../src/Monolog/Handler/SyslogUdpHandler.php | 125 + .../Monolog/Handler/TelegramBotHandler.php | 159 + .../src/Monolog/Handler/TestHandler.php | 190 + .../Handler/WebRequestRecognizerTrait.php | 24 + .../Handler/WhatFailureGroupHandler.php | 63 + .../Monolog/Handler/ZendMonitorHandler.php | 96 + vendor/monolog/monolog/src/Monolog/Logger.php | 613 + .../src/Monolog/Processor/GitProcessor.php | 63 + .../Monolog/Processor/HostnameProcessor.php | 32 + .../Processor/IntrospectionProcessor.php | 108 + .../Processor/MemoryPeakUsageProcessor.php | 34 + .../src/Monolog/Processor/MemoryProcessor.php | 61 + .../Processor/MemoryUsageProcessor.php | 34 + .../Monolog/Processor/MercurialProcessor.php | 63 + .../Monolog/Processor/ProcessIdProcessor.php | 27 + .../Monolog/Processor/ProcessorInterface.php | 25 + .../Processor/PsrLogMessageProcessor.php | 87 + .../src/Monolog/Processor/TagProcessor.php | 48 + .../src/Monolog/Processor/UidProcessor.php | 55 + .../src/Monolog/Processor/WebProcessor.php | 100 + .../monolog/monolog/src/Monolog/Registry.php | 133 + .../src/Monolog/ResettableInterface.php | 34 + .../monolog/src/Monolog/SignalHandler.php | 102 + .../monolog/src/Monolog/Test/TestCase.php | 66 + vendor/monolog/monolog/src/Monolog/Utils.php | 199 + vendor/myclabs/deep-copy/.github/FUNDING.yml | 12 + vendor/myclabs/deep-copy/LICENSE | 20 + vendor/myclabs/deep-copy/README.md | 375 + vendor/myclabs/deep-copy/composer.json | 38 + vendor/myclabs/deep-copy/doc/clone.png | Bin 0 -> 12380 bytes vendor/myclabs/deep-copy/doc/deep-clone.png | Bin 0 -> 14009 bytes vendor/myclabs/deep-copy/doc/deep-copy.png | Bin 0 -> 10895 bytes vendor/myclabs/deep-copy/doc/graph.png | Bin 0 -> 6436 bytes .../deep-copy/src/DeepCopy/DeepCopy.php | 298 + .../src/DeepCopy/Exception/CloneException.php | 9 + .../DeepCopy/Exception/PropertyException.php | 9 + .../Doctrine/DoctrineCollectionFilter.php | 33 + .../DoctrineEmptyCollectionFilter.php | 28 + .../Filter/Doctrine/DoctrineProxyFilter.php | 22 + .../deep-copy/src/DeepCopy/Filter/Filter.php | 18 + .../src/DeepCopy/Filter/KeepFilter.php | 16 + .../src/DeepCopy/Filter/ReplaceFilter.php | 39 + .../src/DeepCopy/Filter/SetNullFilter.php | 24 + .../Matcher/Doctrine/DoctrineProxyMatcher.php | 22 + .../src/DeepCopy/Matcher/Matcher.php | 14 + .../src/DeepCopy/Matcher/PropertyMatcher.php | 39 + .../DeepCopy/Matcher/PropertyNameMatcher.php | 32 + .../DeepCopy/Matcher/PropertyTypeMatcher.php | 46 + .../DeepCopy/Reflection/ReflectionHelper.php | 78 + .../TypeFilter/Date/DateIntervalFilter.php | 33 + .../src/DeepCopy/TypeFilter/ReplaceFilter.php | 30 + .../DeepCopy/TypeFilter/ShallowCopyFilter.php | 17 + .../TypeFilter/Spl/ArrayObjectFilter.php | 36 + .../TypeFilter/Spl/SplDoublyLinkedList.php | 10 + .../Spl/SplDoublyLinkedListFilter.php | 51 + .../src/DeepCopy/TypeFilter/TypeFilter.php | 13 + .../src/DeepCopy/TypeMatcher/TypeMatcher.php | 29 + .../deep-copy/src/DeepCopy/deep_copy.php | 20 + vendor/myclabs/php-enum/LICENSE | 18 + vendor/myclabs/php-enum/README.md | 132 + vendor/myclabs/php-enum/SECURITY.md | 11 + vendor/myclabs/php-enum/composer.json | 33 + vendor/myclabs/php-enum/psalm.xml | 20 + vendor/myclabs/php-enum/src/Enum.php | 239 + .../php-enum/src/PHPUnit/Comparator.php | 54 + vendor/nesbot/carbon/.github/FUNDING.yml | 3 + .../nesbot/carbon/.github/ISSUE_TEMPLATE.md | 69 + vendor/nesbot/carbon/.multi-tester.yml | 6 + vendor/nesbot/carbon/LICENSE | 19 + vendor/nesbot/carbon/bin/carbon | 21 + vendor/nesbot/carbon/bin/carbon.bat | 4 + vendor/nesbot/carbon/composer.json | 86 + vendor/nesbot/carbon/contributing.md | 154 + vendor/nesbot/carbon/phpmd.xml | 45 + vendor/nesbot/carbon/readme.md | 141 + vendor/nesbot/carbon/src/Carbon/Carbon.php | 525 + .../carbon/src/Carbon/CarbonImmutable.php | 515 + .../carbon/src/Carbon/CarbonInterface.php | 4850 +++ .../carbon/src/Carbon/CarbonInterval.php | 2504 ++ .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 2358 ++ .../carbon/src/Carbon/CarbonTimeZone.php | 291 + .../nesbot/carbon/src/Carbon/Cli/Invoker.php | 29 + .../Carbon/Doctrine/CarbonDoctrineType.php | 18 + .../Carbon/Doctrine/CarbonImmutableType.php | 28 + .../carbon/src/Carbon/Doctrine/CarbonType.php | 28 + .../Carbon/Doctrine/CarbonTypeConverter.php | 96 + .../Doctrine/DateTimeDefaultPrecision.php | 32 + .../Carbon/Doctrine/DateTimeImmutableType.php | 20 + .../src/Carbon/Doctrine/DateTimeType.php | 14 + .../Exceptions/BadComparisonUnitException.php | 28 + .../BadFluentConstructorException.php | 29 + .../Exceptions/BadFluentSetterException.php | 29 + .../Exceptions/BadMethodCallException.php | 15 + .../src/Carbon/Exceptions/Exception.php | 15 + .../Carbon/Exceptions/ImmutableException.php | 29 + .../Exceptions/InvalidArgumentException.php | 15 + .../Exceptions/InvalidCastException.php | 29 + .../Exceptions/InvalidDateException.php | 66 + .../Exceptions/InvalidFormatException.php | 29 + .../Exceptions/InvalidIntervalException.php | 29 + .../Exceptions/InvalidPeriodDateException.php | 29 + .../InvalidPeriodParameterException.php | 29 + .../Exceptions/InvalidTimeZoneException.php | 29 + .../Exceptions/InvalidTypeException.php | 29 + .../Exceptions/NotACarbonClassException.php | 34 + .../Carbon/Exceptions/NotAPeriodException.php | 29 + .../Exceptions/NotLocaleAwareException.php | 31 + .../Carbon/Exceptions/OutOfRangeException.php | 100 + .../Carbon/Exceptions/ParseErrorException.php | 32 + .../Carbon/Exceptions/RuntimeException.php | 15 + .../src/Carbon/Exceptions/UnitException.php | 29 + .../Exceptions/UnitNotConfiguredException.php | 28 + .../Exceptions/UnknownGetterException.php | 29 + .../Exceptions/UnknownMethodException.php | 29 + .../Exceptions/UnknownSetterException.php | 29 + .../Exceptions/UnknownUnitException.php | 28 + .../Exceptions/UnreachableException.php | 29 + vendor/nesbot/carbon/src/Carbon/Factory.php | 273 + .../carbon/src/Carbon/FactoryImmutable.php | 215 + vendor/nesbot/carbon/src/Carbon/Lang/aa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/aa_DJ.php | 44 + .../nesbot/carbon/src/Carbon/Lang/aa_ER.php | 28 + .../carbon/src/Carbon/Lang/aa_ER@saaho.php | 28 + .../nesbot/carbon/src/Carbon/Lang/aa_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/af.php | 79 + .../nesbot/carbon/src/Carbon/Lang/af_NA.php | 27 + .../nesbot/carbon/src/Carbon/Lang/af_ZA.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/agq.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/agr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/agr_PE.php | 44 + vendor/nesbot/carbon/src/Carbon/Lang/ak.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ak_GH.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/am.php | 15 + .../nesbot/carbon/src/Carbon/Lang/am_ET.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/an.php | 15 + .../nesbot/carbon/src/Carbon/Lang/an_ES.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/anp.php | 15 + .../nesbot/carbon/src/Carbon/Lang/anp_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ar.php | 93 + .../nesbot/carbon/src/Carbon/Lang/ar_AE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_BH.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_DJ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_DZ.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_EG.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_EH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_ER.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_IL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ar_IQ.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_JO.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_KM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_KW.php | 93 + .../nesbot/carbon/src/Carbon/Lang/ar_LB.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_LY.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_MA.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_MR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_OM.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_PS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_QA.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SA.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_SD.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_SS.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SY.php | 27 + .../carbon/src/Carbon/Lang/ar_Shakl.php | 95 + .../nesbot/carbon/src/Carbon/Lang/ar_TD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ar_TN.php | 91 + .../nesbot/carbon/src/Carbon/Lang/ar_YE.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/as.php | 15 + .../nesbot/carbon/src/Carbon/Lang/as_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/asa.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ast.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ast_ES.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ayc.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ayc_PE.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/az.php | 128 + .../nesbot/carbon/src/Carbon/Lang/az_AZ.php | 21 + .../nesbot/carbon/src/Carbon/Lang/az_Cyrl.php | 19 + .../nesbot/carbon/src/Carbon/Lang/az_IR.php | 27 + .../nesbot/carbon/src/Carbon/Lang/az_Latn.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/bas.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/be.php | 167 + .../nesbot/carbon/src/Carbon/Lang/be_BY.php | 22 + .../carbon/src/Carbon/Lang/be_BY@latin.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bem.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bem_ZM.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ber.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ber_DZ.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ber_MA.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bez.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bg.php | 111 + .../nesbot/carbon/src/Carbon/Lang/bg_BG.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/bhb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bhb_IN.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/bho.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bho_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/bi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bi_VU.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/bm.php | 70 + vendor/nesbot/carbon/src/Carbon/Lang/bn.php | 100 + .../nesbot/carbon/src/Carbon/Lang/bn_BD.php | 27 + .../nesbot/carbon/src/Carbon/Lang/bn_IN.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/bo.php | 71 + .../nesbot/carbon/src/Carbon/Lang/bo_CN.php | 11 + .../nesbot/carbon/src/Carbon/Lang/bo_IN.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/br.php | 76 + .../nesbot/carbon/src/Carbon/Lang/br_FR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/brx.php | 15 + .../nesbot/carbon/src/Carbon/Lang/brx_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bs.php | 94 + .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 11 + .../nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php | 27 + .../nesbot/carbon/src/Carbon/Lang/bs_Latn.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/byn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/byn_ER.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ca.php | 114 + .../nesbot/carbon/src/Carbon/Lang/ca_AD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ca_ES.php | 11 + .../carbon/src/Carbon/Lang/ca_ES_Valencia.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ca_FR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ca_IT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ccp.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ccp_IN.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/ce.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ce_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/cgg.php | 30 + vendor/nesbot/carbon/src/Carbon/Lang/chr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/chr_US.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/cmn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/cmn_TW.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/crh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/crh_UA.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/cs.php | 122 + .../nesbot/carbon/src/Carbon/Lang/cs_CZ.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/csb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/csb_PL.php | 41 + vendor/nesbot/carbon/src/Carbon/Lang/cu.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/cv.php | 65 + .../nesbot/carbon/src/Carbon/Lang/cv_RU.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/cy.php | 79 + .../nesbot/carbon/src/Carbon/Lang/cy_GB.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/da.php | 80 + .../nesbot/carbon/src/Carbon/Lang/da_DK.php | 11 + .../nesbot/carbon/src/Carbon/Lang/da_GL.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/dav.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/de.php | 105 + .../nesbot/carbon/src/Carbon/Lang/de_AT.php | 27 + .../nesbot/carbon/src/Carbon/Lang/de_BE.php | 20 + .../nesbot/carbon/src/Carbon/Lang/de_CH.php | 20 + .../nesbot/carbon/src/Carbon/Lang/de_DE.php | 16 + .../nesbot/carbon/src/Carbon/Lang/de_IT.php | 16 + .../nesbot/carbon/src/Carbon/Lang/de_LI.php | 11 + .../nesbot/carbon/src/Carbon/Lang/de_LU.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/dje.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/doi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/doi_IN.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/dsb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/dsb_DE.php | 60 + vendor/nesbot/carbon/src/Carbon/Lang/dua.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/dv.php | 88 + .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 87 + vendor/nesbot/carbon/src/Carbon/Lang/dyo.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/dz.php | 15 + .../nesbot/carbon/src/Carbon/Lang/dz_BT.php | 43 + vendor/nesbot/carbon/src/Carbon/Lang/ebu.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/ee.php | 55 + .../nesbot/carbon/src/Carbon/Lang/ee_TG.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/el.php | 90 + .../nesbot/carbon/src/Carbon/Lang/el_CY.php | 19 + .../nesbot/carbon/src/Carbon/Lang/el_GR.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/en.php | 78 + .../nesbot/carbon/src/Carbon/Lang/en_001.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_150.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_AG.php | 21 + .../nesbot/carbon/src/Carbon/Lang/en_AI.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_AS.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_AT.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_AU.php | 31 + .../nesbot/carbon/src/Carbon/Lang/en_BB.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_BE.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_BI.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_BM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_BS.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_BW.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_BZ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_CA.php | 29 + .../nesbot/carbon/src/Carbon/Lang/en_CC.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_CH.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_CK.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_CM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_CX.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_CY.php | 28 + .../nesbot/carbon/src/Carbon/Lang/en_DE.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_DG.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_DK.php | 22 + .../nesbot/carbon/src/Carbon/Lang/en_DM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_ER.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_FI.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_FJ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_FK.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_FM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_GB.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_GD.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_GG.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_GH.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_GI.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_GM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_GU.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_GY.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_HK.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_IE.php | 31 + .../nesbot/carbon/src/Carbon/Lang/en_IL.php | 29 + .../nesbot/carbon/src/Carbon/Lang/en_IM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/en_IO.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_ISO.php | 20 + .../nesbot/carbon/src/Carbon/Lang/en_JE.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_JM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_KE.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_KI.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_KN.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_KY.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_LC.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_LR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_LS.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_MG.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_MH.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_MO.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_MP.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_MS.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_MT.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_MU.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_MW.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_MY.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_NA.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_NF.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_NG.php | 17 + .../nesbot/carbon/src/Carbon/Lang/en_NL.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_NR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_NU.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_NZ.php | 31 + .../nesbot/carbon/src/Carbon/Lang/en_PG.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_PH.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_PK.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_PN.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_PR.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_PW.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_RW.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SB.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SC.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SD.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SE.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SG.php | 23 + .../nesbot/carbon/src/Carbon/Lang/en_SH.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SI.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SL.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SS.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SX.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_SZ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_TC.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_TK.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_TO.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_TT.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_TV.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_TZ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_UG.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_UM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_US.php | 11 + .../carbon/src/Carbon/Lang/en_US_Posix.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_VC.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_VG.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_VI.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_VU.php | 13 + .../nesbot/carbon/src/Carbon/Lang/en_WS.php | 11 + .../nesbot/carbon/src/Carbon/Lang/en_ZA.php | 26 + .../nesbot/carbon/src/Carbon/Lang/en_ZM.php | 22 + .../nesbot/carbon/src/Carbon/Lang/en_ZW.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/eo.php | 77 + vendor/nesbot/carbon/src/Carbon/Lang/es.php | 105 + .../nesbot/carbon/src/Carbon/Lang/es_419.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_AR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_BO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_BR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/es_BZ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/es_CL.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CU.php | 13 + .../nesbot/carbon/src/Carbon/Lang/es_DO.php | 31 + .../nesbot/carbon/src/Carbon/Lang/es_EA.php | 13 + .../nesbot/carbon/src/Carbon/Lang/es_EC.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_ES.php | 16 + .../nesbot/carbon/src/Carbon/Lang/es_GQ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/es_GT.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_HN.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_IC.php | 13 + .../nesbot/carbon/src/Carbon/Lang/es_MX.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_NI.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PA.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PE.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PH.php | 21 + .../nesbot/carbon/src/Carbon/Lang/es_PR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PY.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_SV.php | 20 + .../nesbot/carbon/src/Carbon/Lang/es_US.php | 38 + .../nesbot/carbon/src/Carbon/Lang/es_UY.php | 21 + .../nesbot/carbon/src/Carbon/Lang/es_VE.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/et.php | 91 + .../nesbot/carbon/src/Carbon/Lang/et_EE.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/eu.php | 67 + .../nesbot/carbon/src/Carbon/Lang/eu_ES.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ewo.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/fa.php | 84 + .../nesbot/carbon/src/Carbon/Lang/fa_AF.php | 20 + .../nesbot/carbon/src/Carbon/Lang/fa_IR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ff.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ff_CM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ff_GN.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ff_MR.php | 20 + .../nesbot/carbon/src/Carbon/Lang/ff_SN.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/fi.php | 86 + .../nesbot/carbon/src/Carbon/Lang/fi_FI.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/fil.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fil_PH.php | 62 + vendor/nesbot/carbon/src/Carbon/Lang/fo.php | 69 + .../nesbot/carbon/src/Carbon/Lang/fo_DK.php | 18 + .../nesbot/carbon/src/Carbon/Lang/fo_FO.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/fr.php | 111 + .../nesbot/carbon/src/Carbon/Lang/fr_BE.php | 18 + .../nesbot/carbon/src/Carbon/Lang/fr_BF.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_BI.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_BJ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_BL.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_CA.php | 25 + .../nesbot/carbon/src/Carbon/Lang/fr_CD.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_CF.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_CG.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_CH.php | 24 + .../nesbot/carbon/src/Carbon/Lang/fr_CI.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_CM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/fr_DJ.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_DZ.php | 22 + .../nesbot/carbon/src/Carbon/Lang/fr_FR.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_GA.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_GF.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_GN.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_GP.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_GQ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_HT.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_KM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_LU.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_MA.php | 14 + .../nesbot/carbon/src/Carbon/Lang/fr_MC.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_MF.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_MG.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_ML.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_MQ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_MR.php | 20 + .../nesbot/carbon/src/Carbon/Lang/fr_MU.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_NC.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_NE.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_PF.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_PM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_RE.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_RW.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_SC.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_SN.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_SY.php | 22 + .../nesbot/carbon/src/Carbon/Lang/fr_TD.php | 20 + .../nesbot/carbon/src/Carbon/Lang/fr_TG.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_TN.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_VU.php | 20 + .../nesbot/carbon/src/Carbon/Lang/fr_WF.php | 11 + .../nesbot/carbon/src/Carbon/Lang/fr_YT.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/fur.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fur_IT.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/fy.php | 76 + .../nesbot/carbon/src/Carbon/Lang/fy_DE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/fy_NL.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ga.php | 77 + .../nesbot/carbon/src/Carbon/Lang/ga_IE.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/gd.php | 75 + .../nesbot/carbon/src/Carbon/Lang/gd_GB.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/gez.php | 15 + .../nesbot/carbon/src/Carbon/Lang/gez_ER.php | 56 + .../nesbot/carbon/src/Carbon/Lang/gez_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/gl.php | 95 + .../nesbot/carbon/src/Carbon/Lang/gl_ES.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/gom.php | 15 + .../carbon/src/Carbon/Lang/gom_Latn.php | 78 + vendor/nesbot/carbon/src/Carbon/Lang/gsw.php | 49 + .../nesbot/carbon/src/Carbon/Lang/gsw_CH.php | 11 + .../nesbot/carbon/src/Carbon/Lang/gsw_FR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/gsw_LI.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/gu.php | 82 + .../nesbot/carbon/src/Carbon/Lang/gu_IN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/guz.php | 46 + vendor/nesbot/carbon/src/Carbon/Lang/gv.php | 15 + .../nesbot/carbon/src/Carbon/Lang/gv_GB.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ha.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ha_GH.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ha_NE.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ha_NG.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/hak.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hak_TW.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/haw.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/he.php | 85 + .../nesbot/carbon/src/Carbon/Lang/he_IL.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/hi.php | 82 + .../nesbot/carbon/src/Carbon/Lang/hi_IN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/hif.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hif_FJ.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/hne.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hne_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/hr.php | 108 + .../nesbot/carbon/src/Carbon/Lang/hr_BA.php | 32 + .../nesbot/carbon/src/Carbon/Lang/hr_HR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/hsb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hsb_DE.php | 60 + vendor/nesbot/carbon/src/Carbon/Lang/ht.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ht_HT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/hu.php | 115 + .../nesbot/carbon/src/Carbon/Lang/hu_HU.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/hy.php | 95 + .../nesbot/carbon/src/Carbon/Lang/hy_AM.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/i18n.php | 22 + vendor/nesbot/carbon/src/Carbon/Lang/ia.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ia_FR.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/id.php | 92 + .../nesbot/carbon/src/Carbon/Lang/id_ID.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ig.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ig_NG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ii.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/ik.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ik_CA.php | 50 + vendor/nesbot/carbon/src/Carbon/Lang/in.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/is.php | 55 + .../nesbot/carbon/src/Carbon/Lang/is_IS.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/it.php | 100 + .../nesbot/carbon/src/Carbon/Lang/it_CH.php | 20 + .../nesbot/carbon/src/Carbon/Lang/it_IT.php | 16 + .../nesbot/carbon/src/Carbon/Lang/it_SM.php | 11 + .../nesbot/carbon/src/Carbon/Lang/it_VA.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/iu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/iu_CA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/iw.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/ja.php | 99 + .../nesbot/carbon/src/Carbon/Lang/ja_JP.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/jgo.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/jmc.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/jv.php | 71 + vendor/nesbot/carbon/src/Carbon/Lang/ka.php | 201 + .../nesbot/carbon/src/Carbon/Lang/ka_GE.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/kab.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kab_DZ.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/kam.php | 49 + vendor/nesbot/carbon/src/Carbon/Lang/kde.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/kea.php | 48 + vendor/nesbot/carbon/src/Carbon/Lang/khq.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ki.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/kk.php | 103 + .../nesbot/carbon/src/Carbon/Lang/kk_KZ.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/kkj.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kl.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kl_GL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/kln.php | 30 + vendor/nesbot/carbon/src/Carbon/Lang/km.php | 71 + .../nesbot/carbon/src/Carbon/Lang/km_KH.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/kn.php | 75 + .../nesbot/carbon/src/Carbon/Lang/kn_IN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ko.php | 91 + .../nesbot/carbon/src/Carbon/Lang/ko_KP.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ko_KR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/kok.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kok_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ks.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ks_IN.php | 51 + .../src/Carbon/Lang/ks_IN@devanagari.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ksb.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ksf.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ksh.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ku.php | 41 + .../nesbot/carbon/src/Carbon/Lang/ku_TR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/kw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kw_GB.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ky.php | 106 + .../nesbot/carbon/src/Carbon/Lang/ky_KG.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/lag.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/lb.php | 79 + .../nesbot/carbon/src/Carbon/Lang/lb_LU.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/lg.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lg_UG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/li.php | 15 + .../nesbot/carbon/src/Carbon/Lang/li_NL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/lij.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lij_IT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/lkt.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/ln.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ln_AO.php | 16 + .../nesbot/carbon/src/Carbon/Lang/ln_CD.php | 16 + .../nesbot/carbon/src/Carbon/Lang/ln_CF.php | 16 + .../nesbot/carbon/src/Carbon/Lang/ln_CG.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/lo.php | 62 + .../nesbot/carbon/src/Carbon/Lang/lo_LA.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/lrc.php | 16 + .../nesbot/carbon/src/Carbon/Lang/lrc_IQ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lt.php | 133 + .../nesbot/carbon/src/Carbon/Lang/lt_LT.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/lu.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/luo.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/luy.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/lv.php | 114 + .../nesbot/carbon/src/Carbon/Lang/lv_LV.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/lzh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lzh_TW.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/mag.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mag_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mai.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mai_IN.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/mas.php | 50 + .../nesbot/carbon/src/Carbon/Lang/mas_TZ.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/mer.php | 42 + vendor/nesbot/carbon/src/Carbon/Lang/mfe.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mfe_MU.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/mg.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mg_MG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/mgh.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/mgo.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/mhr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mhr_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/mi.php | 66 + .../nesbot/carbon/src/Carbon/Lang/mi_NZ.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/miq.php | 15 + .../nesbot/carbon/src/Carbon/Lang/miq_NI.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mjw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mjw_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mk.php | 113 + .../nesbot/carbon/src/Carbon/Lang/mk_MK.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ml.php | 76 + .../nesbot/carbon/src/Carbon/Lang/ml_IN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/mn.php | 101 + .../nesbot/carbon/src/Carbon/Lang/mn_MN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/mni.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mni_IN.php | 35 + vendor/nesbot/carbon/src/Carbon/Lang/mo.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/mr.php | 86 + .../nesbot/carbon/src/Carbon/Lang/mr_IN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ms.php | 84 + .../nesbot/carbon/src/Carbon/Lang/ms_BN.php | 21 + .../nesbot/carbon/src/Carbon/Lang/ms_MY.php | 18 + .../nesbot/carbon/src/Carbon/Lang/ms_SG.php | 21 + vendor/nesbot/carbon/src/Carbon/Lang/mt.php | 65 + .../nesbot/carbon/src/Carbon/Lang/mt_MT.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/mua.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/my.php | 70 + .../nesbot/carbon/src/Carbon/Lang/my_MM.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/mzn.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/nan.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nan_TW.php | 55 + .../carbon/src/Carbon/Lang/nan_TW@latin.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/naq.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/nb.php | 84 + .../nesbot/carbon/src/Carbon/Lang/nb_NO.php | 11 + .../nesbot/carbon/src/Carbon/Lang/nb_SJ.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/nd.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/nds.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nds_DE.php | 55 + .../nesbot/carbon/src/Carbon/Lang/nds_NL.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ne.php | 82 + .../nesbot/carbon/src/Carbon/Lang/ne_IN.php | 24 + .../nesbot/carbon/src/Carbon/Lang/ne_NP.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/nhn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nhn_MX.php | 50 + vendor/nesbot/carbon/src/Carbon/Lang/niu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/niu_NU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/nl.php | 113 + .../nesbot/carbon/src/Carbon/Lang/nl_AW.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_BE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_BQ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/nl_CW.php | 11 + .../nesbot/carbon/src/Carbon/Lang/nl_NL.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_SR.php | 11 + .../nesbot/carbon/src/Carbon/Lang/nl_SX.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/nmg.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/nn.php | 68 + .../nesbot/carbon/src/Carbon/Lang/nn_NO.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/nnh.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/no.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/nr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nr_ZA.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/nso.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nso_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/nus.php | 35 + vendor/nesbot/carbon/src/Carbon/Lang/nyn.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/oc.php | 101 + .../nesbot/carbon/src/Carbon/Lang/oc_FR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/om.php | 60 + .../nesbot/carbon/src/Carbon/Lang/om_ET.php | 11 + .../nesbot/carbon/src/Carbon/Lang/om_KE.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/or.php | 15 + .../nesbot/carbon/src/Carbon/Lang/or_IN.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/os.php | 15 + .../nesbot/carbon/src/Carbon/Lang/os_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/pa.php | 73 + .../nesbot/carbon/src/Carbon/Lang/pa_Arab.php | 25 + .../nesbot/carbon/src/Carbon/Lang/pa_Guru.php | 26 + .../nesbot/carbon/src/Carbon/Lang/pa_IN.php | 19 + .../nesbot/carbon/src/Carbon/Lang/pa_PK.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/pap.php | 39 + .../nesbot/carbon/src/Carbon/Lang/pap_AW.php | 16 + .../nesbot/carbon/src/Carbon/Lang/pap_CW.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/pl.php | 116 + .../nesbot/carbon/src/Carbon/Lang/pl_PL.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/prg.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/ps.php | 55 + .../nesbot/carbon/src/Carbon/Lang/ps_AF.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/pt.php | 98 + .../nesbot/carbon/src/Carbon/Lang/pt_AO.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 39 + .../nesbot/carbon/src/Carbon/Lang/pt_CH.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_CV.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_GQ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_GW.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_LU.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_MO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/pt_MZ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/pt_PT.php | 27 + .../nesbot/carbon/src/Carbon/Lang/pt_ST.php | 11 + .../nesbot/carbon/src/Carbon/Lang/pt_TL.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/qu.php | 21 + .../nesbot/carbon/src/Carbon/Lang/qu_BO.php | 13 + .../nesbot/carbon/src/Carbon/Lang/qu_EC.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/quz.php | 15 + .../nesbot/carbon/src/Carbon/Lang/quz_PE.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/raj.php | 15 + .../nesbot/carbon/src/Carbon/Lang/raj_IN.php | 47 + vendor/nesbot/carbon/src/Carbon/Lang/rm.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/rn.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ro.php | 77 + .../nesbot/carbon/src/Carbon/Lang/ro_MD.php | 20 + .../nesbot/carbon/src/Carbon/Lang/ro_RO.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/rof.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ru.php | 188 + .../nesbot/carbon/src/Carbon/Lang/ru_BY.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ru_KG.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ru_KZ.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ru_MD.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ru_RU.php | 11 + .../nesbot/carbon/src/Carbon/Lang/ru_UA.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/rw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/rw_RW.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/rwk.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/sa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sa_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sah.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sah_RU.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/saq.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/sat.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sat_IN.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/sbp.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/sc.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sc_IT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sd.php | 80 + .../nesbot/carbon/src/Carbon/Lang/sd_IN.php | 26 + .../src/Carbon/Lang/sd_IN@devanagari.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/se.php | 73 + .../nesbot/carbon/src/Carbon/Lang/se_FI.php | 26 + .../nesbot/carbon/src/Carbon/Lang/se_NO.php | 11 + .../nesbot/carbon/src/Carbon/Lang/se_SE.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/seh.php | 25 + vendor/nesbot/carbon/src/Carbon/Lang/ses.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sg.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/sgs.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sgs_LT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sh.php | 65 + vendor/nesbot/carbon/src/Carbon/Lang/shi.php | 56 + .../carbon/src/Carbon/Lang/shi_Latn.php | 32 + .../carbon/src/Carbon/Lang/shi_Tfng.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/shn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/shn_MM.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/shs.php | 15 + .../nesbot/carbon/src/Carbon/Lang/shs_CA.php | 38 + vendor/nesbot/carbon/src/Carbon/Lang/si.php | 78 + .../nesbot/carbon/src/Carbon/Lang/si_LK.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/sid.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sid_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/sk.php | 81 + .../nesbot/carbon/src/Carbon/Lang/sk_SK.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/sl.php | 126 + .../nesbot/carbon/src/Carbon/Lang/sl_SI.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/sm.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sm_WS.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/smn.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/sn.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/so.php | 15 + .../nesbot/carbon/src/Carbon/Lang/so_DJ.php | 56 + .../nesbot/carbon/src/Carbon/Lang/so_ET.php | 27 + .../nesbot/carbon/src/Carbon/Lang/so_KE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/so_SO.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sq.php | 79 + .../nesbot/carbon/src/Carbon/Lang/sq_AL.php | 11 + .../nesbot/carbon/src/Carbon/Lang/sq_MK.php | 18 + .../nesbot/carbon/src/Carbon/Lang/sq_XK.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/sr.php | 109 + .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 109 + .../carbon/src/Carbon/Lang/sr_Cyrl_BA.php | 22 + .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 106 + .../carbon/src/Carbon/Lang/sr_Cyrl_XK.php | 13 + .../nesbot/carbon/src/Carbon/Lang/sr_Latn.php | 11 + .../carbon/src/Carbon/Lang/sr_Latn_BA.php | 22 + .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 63 + .../carbon/src/Carbon/Lang/sr_Latn_XK.php | 13 + .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 11 + .../nesbot/carbon/src/Carbon/Lang/sr_RS.php | 16 + .../carbon/src/Carbon/Lang/sr_RS@latin.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ss.php | 78 + .../nesbot/carbon/src/Carbon/Lang/ss_ZA.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/st.php | 15 + .../nesbot/carbon/src/Carbon/Lang/st_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/sv.php | 87 + .../nesbot/carbon/src/Carbon/Lang/sv_AX.php | 18 + .../nesbot/carbon/src/Carbon/Lang/sv_FI.php | 11 + .../nesbot/carbon/src/Carbon/Lang/sv_SE.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/sw.php | 74 + .../nesbot/carbon/src/Carbon/Lang/sw_CD.php | 16 + .../nesbot/carbon/src/Carbon/Lang/sw_KE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/sw_TZ.php | 28 + .../nesbot/carbon/src/Carbon/Lang/sw_UG.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/szl.php | 15 + .../nesbot/carbon/src/Carbon/Lang/szl_PL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ta.php | 97 + .../nesbot/carbon/src/Carbon/Lang/ta_IN.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ta_LK.php | 28 + .../nesbot/carbon/src/Carbon/Lang/ta_MY.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ta_SG.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/tcy.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tcy_IN.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/te.php | 89 + .../nesbot/carbon/src/Carbon/Lang/te_IN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/teo.php | 27 + .../nesbot/carbon/src/Carbon/Lang/teo_KE.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/tet.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/tg.php | 104 + .../nesbot/carbon/src/Carbon/Lang/tg_TJ.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/th.php | 73 + .../nesbot/carbon/src/Carbon/Lang/th_TH.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/the.php | 15 + .../nesbot/carbon/src/Carbon/Lang/the_NP.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ti.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ti_ER.php | 56 + .../nesbot/carbon/src/Carbon/Lang/ti_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/tig.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tig_ER.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/tk.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tk_TM.php | 77 + vendor/nesbot/carbon/src/Carbon/Lang/tl.php | 61 + .../nesbot/carbon/src/Carbon/Lang/tl_PH.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/tlh.php | 72 + vendor/nesbot/carbon/src/Carbon/Lang/tn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tn_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/to.php | 15 + .../nesbot/carbon/src/Carbon/Lang/to_TO.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/tpi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tpi_PG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/tr.php | 121 + .../nesbot/carbon/src/Carbon/Lang/tr_CY.php | 22 + .../nesbot/carbon/src/Carbon/Lang/tr_TR.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ts.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ts_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/tt.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tt_RU.php | 39 + .../carbon/src/Carbon/Lang/tt_RU@iqtelif.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/twq.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/tzl.php | 65 + vendor/nesbot/carbon/src/Carbon/Lang/tzm.php | 57 + .../carbon/src/Carbon/Lang/tzm_Latn.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/ug.php | 90 + .../nesbot/carbon/src/Carbon/Lang/ug_CN.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/uk.php | 208 + .../nesbot/carbon/src/Carbon/Lang/uk_UA.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/unm.php | 15 + .../nesbot/carbon/src/Carbon/Lang/unm_US.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/ur.php | 93 + .../nesbot/carbon/src/Carbon/Lang/ur_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ur_PK.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/uz.php | 85 + .../nesbot/carbon/src/Carbon/Lang/uz_Arab.php | 27 + .../nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php | 19 + .../nesbot/carbon/src/Carbon/Lang/uz_Latn.php | 74 + .../nesbot/carbon/src/Carbon/Lang/uz_UZ.php | 27 + .../carbon/src/Carbon/Lang/uz_UZ@cyrillic.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/vai.php | 34 + .../carbon/src/Carbon/Lang/vai_Latn.php | 26 + .../carbon/src/Carbon/Lang/vai_Vaii.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/ve.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ve_ZA.php | 49 + vendor/nesbot/carbon/src/Carbon/Lang/vi.php | 76 + .../nesbot/carbon/src/Carbon/Lang/vi_VN.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/vo.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/vun.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/wa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wa_BE.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/wae.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wae_CH.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/wal.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wal_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/wo.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wo_SN.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/xh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/xh_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/xog.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/yav.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/yi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yi_US.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/yo.php | 65 + .../nesbot/carbon/src/Carbon/Lang/yo_BJ.php | 27 + .../nesbot/carbon/src/Carbon/Lang/yo_NG.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/yue.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yue_HK.php | 28 + .../carbon/src/Carbon/Lang/yue_Hans.php | 11 + .../carbon/src/Carbon/Lang/yue_Hant.php | 11 + vendor/nesbot/carbon/src/Carbon/Lang/yuw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yuw_PG.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/zgh.php | 80 + vendor/nesbot/carbon/src/Carbon/Lang/zh.php | 29 + .../nesbot/carbon/src/Carbon/Lang/zh_CN.php | 33 + .../nesbot/carbon/src/Carbon/Lang/zh_HK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_Hans.php | 109 + .../carbon/src/Carbon/Lang/zh_Hans_HK.php | 11 + .../carbon/src/Carbon/Lang/zh_Hans_MO.php | 11 + .../carbon/src/Carbon/Lang/zh_Hans_SG.php | 11 + .../nesbot/carbon/src/Carbon/Lang/zh_Hant.php | 111 + .../carbon/src/Carbon/Lang/zh_Hant_HK.php | 11 + .../carbon/src/Carbon/Lang/zh_Hant_MO.php | 11 + .../carbon/src/Carbon/Lang/zh_Hant_TW.php | 11 + .../nesbot/carbon/src/Carbon/Lang/zh_MO.php | 21 + .../nesbot/carbon/src/Carbon/Lang/zh_SG.php | 26 + .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_YUE.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/zu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/zu_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Language.php | 339 + .../src/Carbon/Laravel/ServiceProvider.php | 72 + .../carbon/src/Carbon/List/languages.php | 1239 + .../nesbot/carbon/src/Carbon/List/regions.php | 265 + .../carbon/src/Carbon/Traits/Boundaries.php | 442 + .../nesbot/carbon/src/Carbon/Traits/Cast.php | 34 + .../carbon/src/Carbon/Traits/Comparison.php | 988 + .../carbon/src/Carbon/Traits/Converter.php | 640 + .../carbon/src/Carbon/Traits/Creator.php | 905 + .../nesbot/carbon/src/Carbon/Traits/Date.php | 2611 ++ .../carbon/src/Carbon/Traits/Difference.php | 1092 + .../src/Carbon/Traits/IntervalRounding.php | 56 + .../carbon/src/Carbon/Traits/Localization.php | 808 + .../nesbot/carbon/src/Carbon/Traits/Macro.php | 148 + .../nesbot/carbon/src/Carbon/Traits/Mixin.php | 176 + .../carbon/src/Carbon/Traits/Modifiers.php | 467 + .../carbon/src/Carbon/Traits/Mutability.php | 70 + .../Carbon/Traits/ObjectInitialisation.php | 21 + .../carbon/src/Carbon/Traits/Options.php | 442 + .../carbon/src/Carbon/Traits/Rounding.php | 227 + .../src/Carbon/Traits/Serialization.php | 193 + .../nesbot/carbon/src/Carbon/Traits/Test.php | 132 + .../carbon/src/Carbon/Traits/Timestamp.php | 122 + .../nesbot/carbon/src/Carbon/Traits/Units.php | 357 + .../nesbot/carbon/src/Carbon/Traits/Week.php | 218 + .../nesbot/carbon/src/Carbon/Translator.php | 403 + vendor/nikic/php-parser/LICENSE | 31 + vendor/nikic/php-parser/README.md | 225 + vendor/nikic/php-parser/bin/php-parse | 205 + vendor/nikic/php-parser/composer.json | 41 + vendor/nikic/php-parser/grammar/README.md | 30 + .../nikic/php-parser/grammar/parser.template | 106 + vendor/nikic/php-parser/grammar/php5.y | 1026 + vendor/nikic/php-parser/grammar/php7.y | 1036 + .../php-parser/grammar/rebuildParsers.php | 261 + .../nikic/php-parser/grammar/tokens.template | 17 + vendor/nikic/php-parser/grammar/tokens.y | 114 + .../php-parser/lib/PhpParser/Builder.php | 13 + .../lib/PhpParser/Builder/Class_.php | 122 + .../lib/PhpParser/Builder/Declaration.php | 43 + .../lib/PhpParser/Builder/FunctionLike.php | 74 + .../lib/PhpParser/Builder/Function_.php | 50 + .../lib/PhpParser/Builder/Interface_.php | 75 + .../lib/PhpParser/Builder/Method.php | 129 + .../lib/PhpParser/Builder/Namespace_.php | 45 + .../lib/PhpParser/Builder/Param.php | 106 + .../lib/PhpParser/Builder/Property.php | 132 + .../lib/PhpParser/Builder/TraitUse.php | 64 + .../PhpParser/Builder/TraitUseAdaptation.php | 148 + .../lib/PhpParser/Builder/Trait_.php | 60 + .../php-parser/lib/PhpParser/Builder/Use_.php | 49 + .../lib/PhpParser/BuilderFactory.php | 348 + .../lib/PhpParser/BuilderHelpers.php | 285 + .../php-parser/lib/PhpParser/Comment.php | 239 + .../php-parser/lib/PhpParser/Comment/Doc.php | 7 + .../ConstExprEvaluationException.php | 6 + .../lib/PhpParser/ConstExprEvaluator.php | 226 + .../nikic/php-parser/lib/PhpParser/Error.php | 180 + .../php-parser/lib/PhpParser/ErrorHandler.php | 13 + .../lib/PhpParser/ErrorHandler/Collecting.php | 46 + .../lib/PhpParser/ErrorHandler/Throwing.php | 18 + .../lib/PhpParser/Internal/DiffElem.php | 27 + .../lib/PhpParser/Internal/Differ.php | 164 + .../Internal/PrintableNewAnonClassNode.php | 57 + .../lib/PhpParser/Internal/TokenStream.php | 256 + .../php-parser/lib/PhpParser/JsonDecoder.php | 103 + .../nikic/php-parser/lib/PhpParser/Lexer.php | 422 + .../lib/PhpParser/Lexer/Emulative.php | 250 + .../CoaleseEqualTokenEmulator.php | 41 + .../Lexer/TokenEmulator/FnTokenEmulator.php | 53 + .../NumericLiteralSeparatorEmulator.php | 99 + .../TokenEmulator/TokenEmulatorInterface.php | 14 + .../php-parser/lib/PhpParser/NameContext.php | 285 + .../nikic/php-parser/lib/PhpParser/Node.php | 151 + .../php-parser/lib/PhpParser/Node/Arg.php | 38 + .../php-parser/lib/PhpParser/Node/Const_.php | 37 + .../php-parser/lib/PhpParser/Node/Expr.php | 9 + .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 34 + .../lib/PhpParser/Node/Expr/ArrayItem.php | 41 + .../lib/PhpParser/Node/Expr/Array_.php | 34 + .../lib/PhpParser/Node/Expr/ArrowFunction.php | 71 + .../lib/PhpParser/Node/Expr/Assign.php | 34 + .../lib/PhpParser/Node/Expr/AssignOp.php | 30 + .../Node/Expr/AssignOp/BitwiseAnd.php | 12 + .../Node/Expr/AssignOp/BitwiseOr.php | 12 + .../Node/Expr/AssignOp/BitwiseXor.php | 12 + .../PhpParser/Node/Expr/AssignOp/Coalesce.php | 12 + .../PhpParser/Node/Expr/AssignOp/Concat.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Div.php | 12 + .../PhpParser/Node/Expr/AssignOp/Minus.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Mod.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Mul.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Plus.php | 12 + .../lib/PhpParser/Node/Expr/AssignOp/Pow.php | 12 + .../Node/Expr/AssignOp/ShiftLeft.php | 12 + .../Node/Expr/AssignOp/ShiftRight.php | 12 + .../lib/PhpParser/Node/Expr/AssignRef.php | 34 + .../lib/PhpParser/Node/Expr/BinaryOp.php | 40 + .../Node/Expr/BinaryOp/BitwiseAnd.php | 16 + .../Node/Expr/BinaryOp/BitwiseOr.php | 16 + .../Node/Expr/BinaryOp/BitwiseXor.php | 16 + .../Node/Expr/BinaryOp/BooleanAnd.php | 16 + .../Node/Expr/BinaryOp/BooleanOr.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Coalesce.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Concat.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Div.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Equal.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Greater.php | 16 + .../Node/Expr/BinaryOp/GreaterOrEqual.php | 16 + .../Node/Expr/BinaryOp/Identical.php | 16 + .../Node/Expr/BinaryOp/LogicalAnd.php | 16 + .../Node/Expr/BinaryOp/LogicalOr.php | 16 + .../Node/Expr/BinaryOp/LogicalXor.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Minus.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Mod.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Mul.php | 16 + .../PhpParser/Node/Expr/BinaryOp/NotEqual.php | 16 + .../Node/Expr/BinaryOp/NotIdentical.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Plus.php | 16 + .../lib/PhpParser/Node/Expr/BinaryOp/Pow.php | 16 + .../Node/Expr/BinaryOp/ShiftLeft.php | 16 + .../Node/Expr/BinaryOp/ShiftRight.php | 16 + .../PhpParser/Node/Expr/BinaryOp/Smaller.php | 16 + .../Node/Expr/BinaryOp/SmallerOrEqual.php | 16 + .../Node/Expr/BinaryOp/Spaceship.php | 16 + .../lib/PhpParser/Node/Expr/BitwiseNot.php | 30 + .../lib/PhpParser/Node/Expr/BooleanNot.php | 30 + .../lib/PhpParser/Node/Expr/Cast.php | 26 + .../lib/PhpParser/Node/Expr/Cast/Array_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Bool_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Double.php | 17 + .../lib/PhpParser/Node/Expr/Cast/Int_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Object_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/String_.php | 12 + .../lib/PhpParser/Node/Expr/Cast/Unset_.php | 12 + .../PhpParser/Node/Expr/ClassConstFetch.php | 36 + .../lib/PhpParser/Node/Expr/Clone_.php | 30 + .../lib/PhpParser/Node/Expr/Closure.php | 71 + .../lib/PhpParser/Node/Expr/ClosureUse.php | 34 + .../lib/PhpParser/Node/Expr/ConstFetch.php | 31 + .../lib/PhpParser/Node/Expr/Empty_.php | 30 + .../lib/PhpParser/Node/Expr/Error.php | 31 + .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 30 + .../lib/PhpParser/Node/Expr/Eval_.php | 30 + .../lib/PhpParser/Node/Expr/Exit_.php | 34 + .../lib/PhpParser/Node/Expr/FuncCall.php | 35 + .../lib/PhpParser/Node/Expr/Include_.php | 39 + .../lib/PhpParser/Node/Expr/Instanceof_.php | 35 + .../lib/PhpParser/Node/Expr/Isset_.php | 30 + .../lib/PhpParser/Node/Expr/List_.php | 30 + .../lib/PhpParser/Node/Expr/MethodCall.php | 40 + .../lib/PhpParser/Node/Expr/New_.php | 35 + .../lib/PhpParser/Node/Expr/PostDec.php | 30 + .../lib/PhpParser/Node/Expr/PostInc.php | 30 + .../lib/PhpParser/Node/Expr/PreDec.php | 30 + .../lib/PhpParser/Node/Expr/PreInc.php | 30 + .../lib/PhpParser/Node/Expr/Print_.php | 30 + .../lib/PhpParser/Node/Expr/PropertyFetch.php | 35 + .../lib/PhpParser/Node/Expr/ShellExec.php | 30 + .../lib/PhpParser/Node/Expr/StaticCall.php | 40 + .../Node/Expr/StaticPropertyFetch.php | 36 + .../lib/PhpParser/Node/Expr/Ternary.php | 38 + .../lib/PhpParser/Node/Expr/UnaryMinus.php | 30 + .../lib/PhpParser/Node/Expr/UnaryPlus.php | 30 + .../lib/PhpParser/Node/Expr/Variable.php | 30 + .../lib/PhpParser/Node/Expr/YieldFrom.php | 30 + .../lib/PhpParser/Node/Expr/Yield_.php | 34 + .../lib/PhpParser/Node/FunctionLike.php | 36 + .../lib/PhpParser/Node/Identifier.php | 75 + .../php-parser/lib/PhpParser/Node/Name.php | 242 + .../PhpParser/Node/Name/FullyQualified.php | 50 + .../lib/PhpParser/Node/Name/Relative.php | 50 + .../lib/PhpParser/Node/NullableType.php | 30 + .../php-parser/lib/PhpParser/Node/Param.php | 49 + .../php-parser/lib/PhpParser/Node/Scalar.php | 7 + .../lib/PhpParser/Node/Scalar/DNumber.php | 70 + .../lib/PhpParser/Node/Scalar/Encapsed.php | 31 + .../Node/Scalar/EncapsedStringPart.php | 30 + .../lib/PhpParser/Node/Scalar/LNumber.php | 73 + .../lib/PhpParser/Node/Scalar/MagicConst.php | 28 + .../Node/Scalar/MagicConst/Class_.php | 16 + .../PhpParser/Node/Scalar/MagicConst/Dir.php | 16 + .../PhpParser/Node/Scalar/MagicConst/File.php | 16 + .../Node/Scalar/MagicConst/Function_.php | 16 + .../PhpParser/Node/Scalar/MagicConst/Line.php | 16 + .../Node/Scalar/MagicConst/Method.php | 16 + .../Node/Scalar/MagicConst/Namespace_.php | 16 + .../Node/Scalar/MagicConst/Trait_.php | 16 + .../lib/PhpParser/Node/Scalar/String_.php | 141 + .../php-parser/lib/PhpParser/Node/Stmt.php | 9 + .../lib/PhpParser/Node/Stmt/Break_.php | 30 + .../lib/PhpParser/Node/Stmt/Case_.php | 34 + .../lib/PhpParser/Node/Stmt/Catch_.php | 41 + .../lib/PhpParser/Node/Stmt/ClassConst.php | 62 + .../lib/PhpParser/Node/Stmt/ClassLike.php | 107 + .../lib/PhpParser/Node/Stmt/ClassMethod.php | 151 + .../lib/PhpParser/Node/Stmt/Class_.php | 105 + .../lib/PhpParser/Node/Stmt/Const_.php | 30 + .../lib/PhpParser/Node/Stmt/Continue_.php | 30 + .../PhpParser/Node/Stmt/DeclareDeclare.php | 34 + .../lib/PhpParser/Node/Stmt/Declare_.php | 34 + .../lib/PhpParser/Node/Stmt/Do_.php | 34 + .../lib/PhpParser/Node/Stmt/Echo_.php | 30 + .../lib/PhpParser/Node/Stmt/ElseIf_.php | 34 + .../lib/PhpParser/Node/Stmt/Else_.php | 30 + .../lib/PhpParser/Node/Stmt/Expression.php | 33 + .../lib/PhpParser/Node/Stmt/Finally_.php | 30 + .../lib/PhpParser/Node/Stmt/For_.php | 43 + .../lib/PhpParser/Node/Stmt/Foreach_.php | 47 + .../lib/PhpParser/Node/Stmt/Function_.php | 69 + .../lib/PhpParser/Node/Stmt/Global_.php | 30 + .../lib/PhpParser/Node/Stmt/Goto_.php | 31 + .../lib/PhpParser/Node/Stmt/GroupUse.php | 39 + .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 30 + .../lib/PhpParser/Node/Stmt/If_.php | 43 + .../lib/PhpParser/Node/Stmt/InlineHTML.php | 30 + .../lib/PhpParser/Node/Stmt/Interface_.php | 35 + .../lib/PhpParser/Node/Stmt/Label.php | 31 + .../lib/PhpParser/Node/Stmt/Namespace_.php | 38 + .../lib/PhpParser/Node/Stmt/Nop.php | 17 + .../lib/PhpParser/Node/Stmt/Property.php | 79 + .../PhpParser/Node/Stmt/PropertyProperty.php | 34 + .../lib/PhpParser/Node/Stmt/Return_.php | 30 + .../lib/PhpParser/Node/Stmt/StaticVar.php | 37 + .../lib/PhpParser/Node/Stmt/Static_.php | 30 + .../lib/PhpParser/Node/Stmt/Switch_.php | 34 + .../lib/PhpParser/Node/Stmt/Throw_.php | 30 + .../lib/PhpParser/Node/Stmt/TraitUse.php | 34 + .../Node/Stmt/TraitUseAdaptation.php | 13 + .../Node/Stmt/TraitUseAdaptation/Alias.php | 38 + .../Stmt/TraitUseAdaptation/Precedence.php | 34 + .../lib/PhpParser/Node/Stmt/Trait_.php | 30 + .../lib/PhpParser/Node/Stmt/TryCatch.php | 38 + .../lib/PhpParser/Node/Stmt/Unset_.php | 30 + .../lib/PhpParser/Node/Stmt/UseUse.php | 52 + .../lib/PhpParser/Node/Stmt/Use_.php | 47 + .../lib/PhpParser/Node/Stmt/While_.php | 34 + .../lib/PhpParser/Node/UnionType.php | 30 + .../lib/PhpParser/Node/VarLikeIdentifier.php | 17 + .../php-parser/lib/PhpParser/NodeAbstract.php | 178 + .../php-parser/lib/PhpParser/NodeDumper.php | 203 + .../php-parser/lib/PhpParser/NodeFinder.php | 81 + .../lib/PhpParser/NodeTraverser.php | 291 + .../lib/PhpParser/NodeTraverserInterface.php | 29 + .../php-parser/lib/PhpParser/NodeVisitor.php | 72 + .../PhpParser/NodeVisitor/CloningVisitor.php | 20 + .../PhpParser/NodeVisitor/FindingVisitor.php | 48 + .../NodeVisitor/FirstFindingVisitor.php | 50 + .../PhpParser/NodeVisitor/NameResolver.php | 228 + .../lib/PhpParser/NodeVisitorAbstract.php | 25 + .../nikic/php-parser/lib/PhpParser/Parser.php | 18 + .../lib/PhpParser/Parser/Multiple.php | 55 + .../php-parser/lib/PhpParser/Parser/Php5.php | 2640 ++ .../php-parser/lib/PhpParser/Parser/Php7.php | 2480 ++ .../lib/PhpParser/Parser/Tokens.php | 146 + .../lib/PhpParser/ParserAbstract.php | 1025 + .../lib/PhpParser/ParserFactory.php | 44 + .../lib/PhpParser/PrettyPrinter/Standard.php | 1003 + .../lib/PhpParser/PrettyPrinterAbstract.php | 1425 + .../nunomaduro/collision/.github/FUNDING.yml | 5 + vendor/nunomaduro/collision/.php_cs | 29 + vendor/nunomaduro/collision/LICENSE.md | 21 + vendor/nunomaduro/collision/README.md | 76 + vendor/nunomaduro/collision/composer.json | 71 + vendor/nunomaduro/collision/phpstan.neon.dist | 19 + vendor/nunomaduro/collision/phpunit.xml.dist | 28 + .../Laravel/CollisionServiceProvider.php | 90 + .../Adapters/Laravel/Commands/TestCommand.php | 143 + .../src/Adapters/Laravel/ExceptionHandler.php | 96 + .../Laravel/IgnitionSolutionsRepository.php | 49 + .../src/Adapters/Laravel/Inspector.php | 30 + .../src/Adapters/Phpunit/ConfigureIO.php | 38 + .../src/Adapters/Phpunit/Printer.php | 56 + .../src/Adapters/Phpunit/PrinterContents.php | 224 + .../collision/src/Adapters/Phpunit/State.php | 194 + .../collision/src/Adapters/Phpunit/Style.php | 239 + .../src/Adapters/Phpunit/TestResult.php | 156 + .../collision/src/Adapters/Phpunit/Timer.php | 47 + .../collision/src/ArgumentFormatter.php | 50 + .../nunomaduro/collision/src/ConsoleColor.php | 310 + .../Phpunit/HasPrintableTestCaseName.php | 23 + .../Contracts/Adapters/Phpunit/Listener.php | 31 + .../src/Contracts/ArgumentFormatter.php | 26 + .../collision/src/Contracts/Handler.php | 37 + .../collision/src/Contracts/Highlighter.php | 25 + .../collision/src/Contracts/Provider.php | 34 + .../src/Contracts/SolutionsRepository.php | 30 + .../collision/src/Contracts/Writer.php | 71 + .../src/Exceptions/ShouldNotHappen.php | 27 + vendor/nunomaduro/collision/src/Handler.php | 68 + .../nunomaduro/collision/src/Highlighter.php | 279 + vendor/nunomaduro/collision/src/Provider.php | 67 + .../NullSolutionsRepository.php | 31 + vendor/nunomaduro/collision/src/Writer.php | 361 + .../opis/closure/.github/workflows/tests.yml | 43 + vendor/opis/closure/CHANGELOG.md | 239 + vendor/opis/closure/LICENSE | 20 + vendor/opis/closure/NOTICE | 9 + vendor/opis/closure/README.md | 92 + vendor/opis/closure/autoload.php | 39 + vendor/opis/closure/composer.json | 40 + vendor/opis/closure/functions.php | 43 + vendor/opis/closure/src/Analyzer.php | 62 + vendor/opis/closure/src/ClosureContext.php | 34 + vendor/opis/closure/src/ClosureScope.php | 25 + vendor/opis/closure/src/ClosureStream.php | 99 + vendor/opis/closure/src/ISecurityProvider.php | 25 + vendor/opis/closure/src/ReflectionClosure.php | 1022 + vendor/opis/closure/src/SecurityException.php | 18 + vendor/opis/closure/src/SecurityProvider.php | 42 + vendor/opis/closure/src/SelfReference.php | 31 + .../opis/closure/src/SerializableClosure.php | 666 + vendor/phar-io/manifest/.gitignore | 7 + vendor/phar-io/manifest/.php_cs | 67 + vendor/phar-io/manifest/.travis.yml | 33 + vendor/phar-io/manifest/LICENSE | 31 + vendor/phar-io/manifest/README.md | 30 + vendor/phar-io/manifest/build.xml | 50 + vendor/phar-io/manifest/composer.json | 42 + vendor/phar-io/manifest/composer.lock | 69 + .../phar-io/manifest/examples/example-01.php | 23 + vendor/phar-io/manifest/phive.xml | 4 + vendor/phar-io/manifest/phpunit.xml | 20 + .../manifest/src/ManifestDocumentMapper.php | 193 + .../phar-io/manifest/src/ManifestLoader.php | 66 + .../manifest/src/ManifestSerializer.php | 163 + .../manifest/src/exceptions/Exception.php | 14 + .../InvalidApplicationNameException.php | 16 + .../src/exceptions/InvalidEmailException.php | 14 + .../src/exceptions/InvalidUrlException.php | 14 + .../exceptions/ManifestDocumentException.php | 6 + .../ManifestDocumentMapperException.php | 6 + .../exceptions/ManifestElementException.php | 6 + .../exceptions/ManifestLoaderException.php | 6 + .../manifest/src/values/Application.php | 20 + .../manifest/src/values/ApplicationName.php | 65 + vendor/phar-io/manifest/src/values/Author.php | 57 + .../manifest/src/values/AuthorCollection.php | 43 + .../src/values/AuthorCollectionIterator.php | 56 + .../manifest/src/values/BundledComponent.php | 48 + .../src/values/BundledComponentCollection.php | 43 + .../BundledComponentCollectionIterator.php | 56 + .../src/values/CopyrightInformation.php | 42 + vendor/phar-io/manifest/src/values/Email.php | 47 + .../phar-io/manifest/src/values/Extension.php | 75 + .../phar-io/manifest/src/values/Library.php | 20 + .../phar-io/manifest/src/values/License.php | 42 + .../phar-io/manifest/src/values/Manifest.php | 138 + .../src/values/PhpExtensionRequirement.php | 32 + .../src/values/PhpVersionRequirement.php | 31 + .../manifest/src/values/Requirement.php | 14 + .../src/values/RequirementCollection.php | 43 + .../values/RequirementCollectionIterator.php | 56 + vendor/phar-io/manifest/src/values/Type.php | 60 + vendor/phar-io/manifest/src/values/Url.php | 47 + .../manifest/src/xml/AuthorElement.php | 21 + .../src/xml/AuthorElementCollection.php | 19 + .../manifest/src/xml/BundlesElement.php | 19 + .../manifest/src/xml/ComponentElement.php | 21 + .../src/xml/ComponentElementCollection.php | 19 + .../manifest/src/xml/ContainsElement.php | 31 + .../manifest/src/xml/CopyrightElement.php | 25 + .../manifest/src/xml/ElementCollection.php | 58 + .../phar-io/manifest/src/xml/ExtElement.php | 17 + .../manifest/src/xml/ExtElementCollection.php | 20 + .../manifest/src/xml/ExtensionElement.php | 21 + .../manifest/src/xml/LicenseElement.php | 21 + .../manifest/src/xml/ManifestDocument.php | 118 + .../xml/ManifestDocumentLoadingException.php | 48 + .../manifest/src/xml/ManifestElement.php | 100 + .../phar-io/manifest/src/xml/PhpElement.php | 27 + .../manifest/src/xml/RequiresElement.php | 19 + .../tests/ManifestDocumentMapperTest.php | 110 + .../manifest/tests/ManifestLoaderTest.php | 83 + .../manifest/tests/ManifestSerializerTest.php | 114 + .../manifest/tests/_fixture/custom.xml | 10 + .../_fixture/extension-invalidcompatible.xml | 13 + .../manifest/tests/_fixture/extension.xml | 13 + .../tests/_fixture/invalidversion.xml | 11 + .../_fixture/invalidversionconstraint.xml | 11 + .../manifest/tests/_fixture/library.xml | 11 + .../manifest/tests/_fixture/manifest.xml | 11 + .../manifest/tests/_fixture/phpunit-5.6.5.xml | 46 + .../phar-io/manifest/tests/_fixture/test.phar | Bin 0 -> 7165 bytes .../ManifestDocumentLoadingExceptionTest.php | 19 + .../tests/values/ApplicationNameTest.php | 57 + .../manifest/tests/values/ApplicationTest.php | 44 + .../tests/values/AuthorCollectionTest.php | 62 + .../manifest/tests/values/AuthorTest.php | 45 + .../values/BundledComponentCollectionTest.php | 63 + .../tests/values/BundledComponentTest.php | 42 + .../tests/values/CopyrightInformationTest.php | 62 + .../manifest/tests/values/EmailTest.php | 35 + .../manifest/tests/values/ExtensionTest.php | 109 + .../manifest/tests/values/LibraryTest.php | 44 + .../manifest/tests/values/LicenseTest.php | 41 + .../manifest/tests/values/ManifestTest.php | 187 + .../values/PhpExtensionRequirementTest.php | 26 + .../values/PhpVersionRequirementTest.php | 38 + .../values/RequirementCollectionTest.php | 63 + .../phar-io/manifest/tests/values/UrlTest.php | 35 + .../tests/xml/AuthorElementCollectionTest.php | 18 + .../manifest/tests/xml/AuthorElementTest.php | 25 + .../manifest/tests/xml/BundlesElementTest.php | 41 + .../xml/ComponentElementCollectionTest.php | 18 + .../tests/xml/ComponentElementTest.php | 25 + .../tests/xml/ContainsElementTest.php | 63 + .../tests/xml/CopyrightElementTest.php | 52 + .../tests/xml/ExtElementCollectionTest.php | 19 + .../manifest/tests/xml/ExtElementTest.php | 21 + .../tests/xml/ExtensionElementTest.php | 25 + .../manifest/tests/xml/LicenseElementTest.php | 25 + .../tests/xml/ManifestDocumentTest.php | 110 + .../manifest/tests/xml/PhpElementTest.php | 48 + .../tests/xml/RequiresElementTest.php | 37 + vendor/phar-io/version/.gitignore | 7 + vendor/phar-io/version/.php_cs | 67 + vendor/phar-io/version/.travis.yml | 33 + vendor/phar-io/version/CHANGELOG.md | 44 + vendor/phar-io/version/LICENSE | 31 + vendor/phar-io/version/README.md | 61 + vendor/phar-io/version/build.xml | 41 + vendor/phar-io/version/composer.json | 34 + vendor/phar-io/version/phive.xml | 5 + vendor/phar-io/version/phpunit.xml | 19 + .../phar-io/version/src/PreReleaseSuffix.php | 95 + vendor/phar-io/version/src/Version.php | 175 + .../version/src/VersionConstraintParser.php | 122 + .../version/src/VersionConstraintValue.php | 123 + vendor/phar-io/version/src/VersionNumber.php | 41 + .../constraints/AbstractVersionConstraint.php | 32 + .../constraints/AndVersionConstraintGroup.php | 43 + .../src/constraints/AnyVersionConstraint.php | 29 + .../constraints/ExactVersionConstraint.php | 22 + .../GreaterThanOrEqualToVersionConstraint.php | 38 + .../constraints/OrVersionConstraintGroup.php | 43 + ...SpecificMajorAndMinorVersionConstraint.php | 48 + .../SpecificMajorVersionConstraint.php | 37 + .../src/constraints/VersionConstraint.php | 26 + .../version/src/exceptions/Exception.php | 14 + .../InvalidPreReleaseSuffixException.php | 7 + .../exceptions/InvalidVersionException.php | 6 + .../UnsupportedVersionConstraintException.php | 14 + .../VersionConstraintParserTest.php | 146 + .../Unit/AbstractVersionConstraintTest.php | 25 + .../Unit/AndVersionConstraintGroupTest.php | 52 + .../tests/Unit/AnyVersionConstraintTest.php | 41 + .../tests/Unit/ExactVersionConstraintTest.php | 58 + ...aterThanOrEqualToVersionConstraintTest.php | 47 + .../Unit/OrVersionConstraintGroupTest.php | 65 + .../tests/Unit/PreReleaseSuffixTest.php | 46 + ...ificMajorAndMinorVersionConstraintTest.php | 45 + .../SpecificMajorVersionConstraintTest.php | 44 + .../version/tests/Unit/VersionTest.php | 113 + .../.github/workflows/push.yml | 223 + .../reflection-common/.scrutinizer.yml | 48 + .../reflection-common/.travis.yml | 49 + .../phpdocumentor/reflection-common/LICENSE | 22 + .../phpdocumentor/reflection-common/Makefile | 35 + .../phpdocumentor/reflection-common/README.md | 12 + .../reflection-common/appveyor.yml | 52 + .../reflection-common/composer.json | 28 + .../easy-coding-standard.neon | 17 + .../phpdocumentor/reflection-common/phive.xml | 5 + .../reflection-common/phpcs.xml.dist | 11 + .../reflection-common/phpmd.xml.dist | 23 + .../reflection-common/phpstan.neon | 2 + .../phpdocumentor/reflection-common/psalm.xml | 14 + .../reflection-common/src/Element.php | 30 + .../reflection-common/src/File.php | 35 + .../reflection-common/src/Fqsen.php | 89 + .../reflection-common/src/Location.php | 53 + .../reflection-common/src/Project.php | 25 + .../reflection-common/src/ProjectFactory.php | 28 + .../.dependabot/config.yml | 12 + .../.github/workflows/push.yml | 250 + .../phpdocumentor/reflection-docblock/LICENSE | 21 + .../reflection-docblock/Makefile | 37 + .../reflection-docblock/README.md | 75 + .../composer-require-config.json | 15 + .../reflection-docblock/composer.json | 42 + .../reflection-docblock/phive.xml | 5 + .../reflection-docblock/phpcs.xml.dist | 17 + .../reflection-docblock/phpstan.neon | 8 + .../reflection-docblock/psalm.xml | 45 + .../reflection-docblock/src/DocBlock.php | 204 + .../src/DocBlock/Description.php | 114 + .../src/DocBlock/DescriptionFactory.php | 181 + .../src/DocBlock/ExampleFinder.php | 157 + .../src/DocBlock/Serializer.php | 151 + .../src/DocBlock/StandardTagFactory.php | 339 + .../reflection-docblock/src/DocBlock/Tag.php | 32 + .../src/DocBlock/TagFactory.php | 84 + .../src/DocBlock/Tags/Author.php | 92 + .../src/DocBlock/Tags/BaseTag.php | 53 + .../src/DocBlock/Tags/Covers.php | 78 + .../src/DocBlock/Tags/Deprecated.php | 100 + .../src/DocBlock/Tags/Example.php | 179 + .../DocBlock/Tags/Factory/StaticMethod.php | 25 + .../src/DocBlock/Tags/Formatter.php | 24 + .../Tags/Formatter/AlignFormatter.php | 49 + .../Tags/Formatter/PassthroughFormatter.php | 29 + .../src/DocBlock/Tags/Generic.php | 82 + .../src/DocBlock/Tags/InvalidTag.php | 133 + .../src/DocBlock/Tags/Link.php | 71 + .../src/DocBlock/Tags/Method.php | 265 + .../src/DocBlock/Tags/Param.php | 128 + .../src/DocBlock/Tags/Property.php | 104 + .../src/DocBlock/Tags/PropertyRead.php | 104 + .../src/DocBlock/Tags/PropertyWrite.php | 104 + .../src/DocBlock/Tags/Reference/Fqsen.php | 38 + .../src/DocBlock/Tags/Reference/Reference.php | 22 + .../src/DocBlock/Tags/Reference/Url.php | 36 + .../src/DocBlock/Tags/Return_.php | 56 + .../src/DocBlock/Tags/See.php | 83 + .../src/DocBlock/Tags/Since.php | 94 + .../src/DocBlock/Tags/Source.php | 103 + .../src/DocBlock/Tags/TagWithType.php | 65 + .../src/DocBlock/Tags/Throws.php | 56 + .../src/DocBlock/Tags/Uses.php | 78 + .../src/DocBlock/Tags/Var_.php | 105 + .../src/DocBlock/Tags/Version.php | 98 + .../src/DocBlockFactory.php | 286 + .../src/DocBlockFactoryInterface.php | 23 + .../type-resolver/.github/workflows/push.yml | 201 + vendor/phpdocumentor/type-resolver/LICENSE | 21 + vendor/phpdocumentor/type-resolver/Makefile | 32 + vendor/phpdocumentor/type-resolver/README.md | 177 + .../composer-require-config.json | 15 + .../phpdocumentor/type-resolver/composer.json | 35 + .../phpdocumentor/type-resolver/composer.lock | 429 + vendor/phpdocumentor/type-resolver/phive.xml | 4 + .../type-resolver/phpcs.xml.dist | 16 + .../phpdocumentor/type-resolver/phpstan.neon | 4 + vendor/phpdocumentor/type-resolver/psalm.xml | 18 + .../type-resolver/src/FqsenResolver.php | 74 + .../phpdocumentor/type-resolver/src/Type.php | 22 + .../type-resolver/src/TypeResolver.php | 515 + .../type-resolver/src/Types/AbstractList.php | 85 + .../type-resolver/src/Types/Array_.php | 27 + .../type-resolver/src/Types/Boolean.php | 30 + .../type-resolver/src/Types/Callable_.php | 30 + .../type-resolver/src/Types/ClassString.php | 54 + .../type-resolver/src/Types/Collection.php | 66 + .../type-resolver/src/Types/Compound.php | 105 + .../type-resolver/src/Types/Context.php | 88 + .../src/Types/ContextFactory.php | 359 + .../type-resolver/src/Types/Float_.php | 30 + .../type-resolver/src/Types/Integer.php | 27 + .../type-resolver/src/Types/Iterable_.php | 36 + .../type-resolver/src/Types/Mixed_.php | 30 + .../type-resolver/src/Types/Null_.php | 30 + .../type-resolver/src/Types/Nullable.php | 49 + .../type-resolver/src/Types/Object_.php | 66 + .../type-resolver/src/Types/Parent_.php | 32 + .../type-resolver/src/Types/Resource_.php | 30 + .../type-resolver/src/Types/Scalar.php | 30 + .../type-resolver/src/Types/Self_.php | 32 + .../type-resolver/src/Types/Static_.php | 37 + .../type-resolver/src/Types/String_.php | 30 + .../type-resolver/src/Types/This.php | 33 + .../type-resolver/src/Types/Void_.php | 33 + vendor/phpoffice/phpspreadsheet/CHANGELOG.md | 497 + .../phpoffice/phpspreadsheet/CONTRIBUTING.md | 11 + vendor/phpoffice/phpspreadsheet/LICENSE | 21 + vendor/phpoffice/phpspreadsheet/README.md | 29 + vendor/phpoffice/phpspreadsheet/composer.json | 87 + .../Calculation/Calculation.php | 4831 +++ .../PhpSpreadsheet/Calculation/Category.php | 19 + .../PhpSpreadsheet/Calculation/Database.php | 608 + .../PhpSpreadsheet/Calculation/DateTime.php | 1649 + .../Engine/CyclicReferenceStack.php | 73 + .../Calculation/Engine/Logger.php | 126 + .../Calculation/Engineering.php | 2757 ++ .../PhpSpreadsheet/Calculation/Exception.php | 26 + .../Calculation/ExceptionHandler.php | 22 + .../PhpSpreadsheet/Calculation/Financial.php | 2461 ++ .../Calculation/FormulaParser.php | 619 + .../Calculation/FormulaToken.php | 150 + .../PhpSpreadsheet/Calculation/Functions.php | 656 + .../PhpSpreadsheet/Calculation/Logical.php | 355 + .../PhpSpreadsheet/Calculation/LookupRef.php | 957 + .../PhpSpreadsheet/Calculation/MathTrig.php | 1798 ++ .../Calculation/Statistical.php | 3713 +++ .../PhpSpreadsheet/Calculation/TextData.php | 674 + .../Calculation/Token/Stack.php | 149 + .../Calculation/functionlist.txt | 394 + .../Calculation/locale/bg/config | 27 + .../Calculation/locale/bg/functions | 417 + .../Calculation/locale/cs/config | 23 + .../Calculation/locale/cs/functions | 416 + .../Calculation/locale/da/config | 25 + .../Calculation/locale/da/functions | 416 + .../Calculation/locale/de/config | 24 + .../Calculation/locale/de/functions | 416 + .../Calculation/locale/en/uk/config | 8 + .../Calculation/locale/es/config | 24 + .../Calculation/locale/es/functions | 416 + .../Calculation/locale/fi/config | 24 + .../Calculation/locale/fi/functions | 416 + .../Calculation/locale/fr/config | 24 + .../Calculation/locale/fr/functions | 416 + .../Calculation/locale/hu/config | 23 + .../Calculation/locale/hu/functions | 416 + .../Calculation/locale/it/config | 24 + .../Calculation/locale/it/functions | 416 + .../Calculation/locale/nl/config | 24 + .../Calculation/locale/nl/functions | 416 + .../Calculation/locale/no/config | 24 + .../Calculation/locale/no/functions | 416 + .../Calculation/locale/pl/config | 24 + .../Calculation/locale/pl/functions | 416 + .../Calculation/locale/pt/br/config | 24 + .../Calculation/locale/pt/br/functions | 408 + .../Calculation/locale/pt/config | 24 + .../Calculation/locale/pt/functions | 408 + .../Calculation/locale/ru/config | 24 + .../Calculation/locale/ru/functions | 416 + .../Calculation/locale/sv/config | 24 + .../Calculation/locale/sv/functions | 408 + .../Calculation/locale/tr/config | 24 + .../Calculation/locale/tr/functions | 416 + .../Cell/AdvancedValueBinder.php | 174 + .../src/PhpSpreadsheet/Cell/Cell.php | 676 + .../src/PhpSpreadsheet/Cell/Coordinate.php | 512 + .../src/PhpSpreadsheet/Cell/DataType.php | 85 + .../PhpSpreadsheet/Cell/DataValidation.php | 481 + .../src/PhpSpreadsheet/Cell/DataValidator.php | 77 + .../Cell/DefaultValueBinder.php | 82 + .../src/PhpSpreadsheet/Cell/Hyperlink.php | 113 + .../src/PhpSpreadsheet/Cell/IValueBinder.php | 16 + .../PhpSpreadsheet/Cell/StringValueBinder.php | 29 + .../src/PhpSpreadsheet/Chart/Axis.php | 556 + .../src/PhpSpreadsheet/Chart/Chart.php | 663 + .../src/PhpSpreadsheet/Chart/DataSeries.php | 394 + .../PhpSpreadsheet/Chart/DataSeriesValues.php | 397 + .../src/PhpSpreadsheet/Chart/Exception.php | 9 + .../src/PhpSpreadsheet/Chart/GridLines.php | 454 + .../src/PhpSpreadsheet/Chart/Layout.php | 481 + .../src/PhpSpreadsheet/Chart/Legend.php | 157 + .../src/PhpSpreadsheet/Chart/PlotArea.php | 111 + .../src/PhpSpreadsheet/Chart/Properties.php | 369 + .../Chart/Renderer/IRenderer.php | 22 + .../PhpSpreadsheet/Chart/Renderer/JpGraph.php | 870 + .../Chart/Renderer/PHP Charting Libraries.txt | 20 + .../Chart/Renderer/Polyfill.php | 9 + .../src/PhpSpreadsheet/Chart/Title.php | 65 + .../src/PhpSpreadsheet/Collection/Cells.php | 498 + .../Collection/CellsFactory.php | 21 + .../src/PhpSpreadsheet/Collection/Memory.php | 79 + .../src/PhpSpreadsheet/Comment.php | 329 + .../PhpSpreadsheet/Document/Properties.php | 629 + .../src/PhpSpreadsheet/Document/Security.php | 205 + .../src/PhpSpreadsheet/DocumentGenerator.php | 97 + .../src/PhpSpreadsheet/Exception.php | 7 + .../src/PhpSpreadsheet/HashTable.php | 175 + .../src/PhpSpreadsheet/Helper/Html.php | 839 + .../src/PhpSpreadsheet/Helper/Sample.php | 229 + .../src/PhpSpreadsheet/IComparable.php | 13 + .../src/PhpSpreadsheet/IOFactory.php | 217 + .../src/PhpSpreadsheet/NamedRange.php | 235 + .../src/PhpSpreadsheet/Reader/BaseReader.php | 158 + .../src/PhpSpreadsheet/Reader/Csv.php | 533 + .../Reader/DefaultReadFilter.php | 20 + .../src/PhpSpreadsheet/Reader/Exception.php | 9 + .../src/PhpSpreadsheet/Reader/Gnumeric.php | 882 + .../src/PhpSpreadsheet/Reader/Html.php | 952 + .../src/PhpSpreadsheet/Reader/IReadFilter.php | 17 + .../src/PhpSpreadsheet/Reader/IReader.php | 133 + .../src/PhpSpreadsheet/Reader/Ods.php | 699 + .../PhpSpreadsheet/Reader/Ods/Properties.php | 136 + .../Reader/Security/XmlScanner.php | 150 + .../src/PhpSpreadsheet/Reader/Slk.php | 489 + .../src/PhpSpreadsheet/Reader/Xls.php | 7933 +++++ .../src/PhpSpreadsheet/Reader/Xls/Color.php | 36 + .../PhpSpreadsheet/Reader/Xls/Color/BIFF5.php | 81 + .../PhpSpreadsheet/Reader/Xls/Color/BIFF8.php | 81 + .../Reader/Xls/Color/BuiltIn.php | 35 + .../PhpSpreadsheet/Reader/Xls/ErrorCode.php | 32 + .../src/PhpSpreadsheet/Reader/Xls/Escher.php | 677 + .../src/PhpSpreadsheet/Reader/Xls/MD5.php | 184 + .../src/PhpSpreadsheet/Reader/Xls/RC4.php | 61 + .../Reader/Xls/Style/Border.php | 42 + .../Reader/Xls/Style/FillPattern.php | 47 + .../src/PhpSpreadsheet/Reader/Xlsx.php | 2054 ++ .../PhpSpreadsheet/Reader/Xlsx/AutoFilter.php | 146 + .../Reader/Xlsx/BaseParserClass.php | 19 + .../src/PhpSpreadsheet/Reader/Xlsx/Chart.php | 567 + .../Reader/Xlsx/ColumnAndRowAttributes.php | 205 + .../Reader/Xlsx/ConditionalStyles.php | 95 + .../Reader/Xlsx/DataValidations.php | 51 + .../PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php | 59 + .../PhpSpreadsheet/Reader/Xlsx/PageSetup.php | 151 + .../PhpSpreadsheet/Reader/Xlsx/Properties.php | 92 + .../Reader/Xlsx/SheetViewOptions.php | 125 + .../PhpSpreadsheet/Reader/Xlsx/SheetViews.php | 138 + .../src/PhpSpreadsheet/Reader/Xlsx/Styles.php | 282 + .../src/PhpSpreadsheet/Reader/Xlsx/Theme.php | 93 + .../src/PhpSpreadsheet/Reader/Xml.php | 858 + .../src/PhpSpreadsheet/ReferenceHelper.php | 898 + .../PhpSpreadsheet/RichText/ITextElement.php | 36 + .../src/PhpSpreadsheet/RichText/RichText.php | 170 + .../src/PhpSpreadsheet/RichText/Run.php | 65 + .../PhpSpreadsheet/RichText/TextElement.php | 86 + .../src/PhpSpreadsheet/Settings.php | 159 + .../src/PhpSpreadsheet/Shared/CodePage.php | 92 + .../src/PhpSpreadsheet/Shared/Date.php | 483 + .../src/PhpSpreadsheet/Shared/Drawing.php | 249 + .../src/PhpSpreadsheet/Shared/Escher.php | 64 + .../Shared/Escher/DgContainer.php | 52 + .../Escher/DgContainer/SpgrContainer.php | 79 + .../DgContainer/SpgrContainer/SpContainer.php | 369 + .../Shared/Escher/DggContainer.php | 175 + .../Escher/DggContainer/BstoreContainer.php | 34 + .../DggContainer/BstoreContainer/BSE.php | 89 + .../DggContainer/BstoreContainer/BSE/Blip.php | 60 + .../src/PhpSpreadsheet/Shared/File.php | 142 + .../src/PhpSpreadsheet/Shared/Font.php | 759 + .../PhpSpreadsheet/Shared/JAMA/CHANGELOG.TXT | 16 + .../Shared/JAMA/CholeskyDecomposition.php | 147 + .../Shared/JAMA/EigenvalueDecomposition.php | 861 + .../Shared/JAMA/LUDecomposition.php | 282 + .../src/PhpSpreadsheet/Shared/JAMA/Matrix.php | 1202 + .../Shared/JAMA/QRDecomposition.php | 249 + .../JAMA/SingularValueDecomposition.php | 528 + .../Shared/JAMA/utils/Maths.php | 30 + .../src/PhpSpreadsheet/Shared/OLE.php | 567 + .../Shared/OLE/ChainedBlockStream.php | 196 + .../src/PhpSpreadsheet/Shared/OLE/PPS.php | 236 + .../PhpSpreadsheet/Shared/OLE/PPS/File.php | 64 + .../PhpSpreadsheet/Shared/OLE/PPS/Root.php | 426 + .../src/PhpSpreadsheet/Shared/OLERead.php | 350 + .../PhpSpreadsheet/Shared/PasswordHasher.php | 100 + .../PhpSpreadsheet/Shared/StringHelper.php | 722 + .../src/PhpSpreadsheet/Shared/TimeZone.php | 81 + .../PhpSpreadsheet/Shared/Trend/BestFit.php | 463 + .../Shared/Trend/ExponentialBestFit.php | 122 + .../Shared/Trend/LinearBestFit.php | 81 + .../Shared/Trend/LogarithmicBestFit.php | 90 + .../Shared/Trend/PolynomialBestFit.php | 200 + .../Shared/Trend/PowerBestFit.php | 114 + .../src/PhpSpreadsheet/Shared/Trend/Trend.php | 120 + .../src/PhpSpreadsheet/Shared/XMLWriter.php | 92 + .../src/PhpSpreadsheet/Shared/Xls.php | 279 + .../src/PhpSpreadsheet/Spreadsheet.php | 1443 + .../src/PhpSpreadsheet/Style/Alignment.php | 462 + .../src/PhpSpreadsheet/Style/Border.php | 231 + .../src/PhpSpreadsheet/Style/Borders.php | 411 + .../src/PhpSpreadsheet/Style/Color.php | 407 + .../src/PhpSpreadsheet/Style/Conditional.php | 274 + .../src/PhpSpreadsheet/Style/Fill.php | 314 + .../src/PhpSpreadsheet/Style/Font.php | 548 + .../src/PhpSpreadsheet/Style/NumberFormat.php | 873 + .../src/PhpSpreadsheet/Style/Protection.php | 186 + .../src/PhpSpreadsheet/Style/Style.php | 639 + .../src/PhpSpreadsheet/Style/Supervisor.php | 117 + .../PhpSpreadsheet/Worksheet/AutoFilter.php | 857 + .../Worksheet/AutoFilter/Column.php | 380 + .../Worksheet/AutoFilter/Column/Rule.php | 445 + .../PhpSpreadsheet/Worksheet/BaseDrawing.php | 532 + .../PhpSpreadsheet/Worksheet/CellIterator.php | 57 + .../src/PhpSpreadsheet/Worksheet/Column.php | 64 + .../Worksheet/ColumnCellIterator.php | 189 + .../Worksheet/ColumnDimension.php | 115 + .../Worksheet/ColumnIterator.php | 172 + .../PhpSpreadsheet/Worksheet/Dimension.php | 163 + .../src/PhpSpreadsheet/Worksheet/Drawing.php | 114 + .../Worksheet/Drawing/Shadow.php | 289 + .../PhpSpreadsheet/Worksheet/HeaderFooter.php | 490 + .../Worksheet/HeaderFooterDrawing.php | 24 + .../src/PhpSpreadsheet/Worksheet/Iterator.php | 85 + .../Worksheet/MemoryDrawing.php | 169 + .../PhpSpreadsheet/Worksheet/PageMargins.php | 214 + .../PhpSpreadsheet/Worksheet/PageSetup.php | 835 + .../PhpSpreadsheet/Worksheet/Protection.php | 698 + .../src/PhpSpreadsheet/Worksheet/Row.php | 74 + .../Worksheet/RowCellIterator.php | 195 + .../PhpSpreadsheet/Worksheet/RowDimension.php | 115 + .../PhpSpreadsheet/Worksheet/RowIterator.php | 167 + .../PhpSpreadsheet/Worksheet/SheetView.php | 193 + .../PhpSpreadsheet/Worksheet/Worksheet.php | 3013 ++ .../src/PhpSpreadsheet/Writer/BaseWriter.php | 131 + .../src/PhpSpreadsheet/Writer/Csv.php | 334 + .../src/PhpSpreadsheet/Writer/Exception.php | 9 + .../src/PhpSpreadsheet/Writer/Html.php | 1846 ++ .../src/PhpSpreadsheet/Writer/IWriter.php | 87 + .../src/PhpSpreadsheet/Writer/Ods.php | 156 + .../Writer/Ods/Cell/Comment.php | 30 + .../src/PhpSpreadsheet/Writer/Ods/Content.php | 367 + .../src/PhpSpreadsheet/Writer/Ods/Meta.php | 75 + .../src/PhpSpreadsheet/Writer/Ods/MetaInf.php | 60 + .../PhpSpreadsheet/Writer/Ods/Mimetype.php | 20 + .../PhpSpreadsheet/Writer/Ods/Settings.php | 52 + .../src/PhpSpreadsheet/Writer/Ods/Styles.php | 68 + .../PhpSpreadsheet/Writer/Ods/Thumbnails.php | 20 + .../PhpSpreadsheet/Writer/Ods/WriterPart.php | 33 + .../src/PhpSpreadsheet/Writer/Pdf.php | 253 + .../src/PhpSpreadsheet/Writer/Pdf/Dompdf.php | 72 + .../src/PhpSpreadsheet/Writer/Pdf/Mpdf.php | 106 + .../src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php | 104 + .../src/PhpSpreadsheet/Writer/Xls.php | 946 + .../PhpSpreadsheet/Writer/Xls/BIFFwriter.php | 224 + .../src/PhpSpreadsheet/Writer/Xls/Escher.php | 510 + .../src/PhpSpreadsheet/Writer/Xls/Font.php | 147 + .../src/PhpSpreadsheet/Writer/Xls/Parser.php | 1438 + .../PhpSpreadsheet/Writer/Xls/Workbook.php | 1147 + .../PhpSpreadsheet/Writer/Xls/Worksheet.php | 4484 +++ .../src/PhpSpreadsheet/Writer/Xls/Xf.php | 548 + .../src/PhpSpreadsheet/Writer/Xlsx.php | 538 + .../src/PhpSpreadsheet/Writer/Xlsx/Chart.php | 1516 + .../PhpSpreadsheet/Writer/Xlsx/Comments.php | 232 + .../Writer/Xlsx/ContentTypes.php | 240 + .../PhpSpreadsheet/Writer/Xlsx/DocProps.php | 239 + .../PhpSpreadsheet/Writer/Xlsx/Drawing.php | 505 + .../src/PhpSpreadsheet/Writer/Xlsx/Rels.php | 449 + .../PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php | 45 + .../PhpSpreadsheet/Writer/Xlsx/RelsVBA.php | 40 + .../Writer/Xlsx/StringTable.php | 278 + .../src/PhpSpreadsheet/Writer/Xlsx/Style.php | 668 + .../src/PhpSpreadsheet/Writer/Xlsx/Theme.php | 837 + .../PhpSpreadsheet/Writer/Xlsx/Workbook.php | 406 + .../PhpSpreadsheet/Writer/Xlsx/Worksheet.php | 1275 + .../PhpSpreadsheet/Writer/Xlsx/WriterPart.php | 33 + .../src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php | 159 + vendor/phpoption/phpoption/LICENSE | 201 + vendor/phpoption/phpoption/composer.json | 42 + .../phpoption/src/PhpOption/LazyOption.php | 169 + .../phpoption/src/PhpOption/None.php | 136 + .../phpoption/src/PhpOption/Option.php | 434 + .../phpoption/src/PhpOption/Some.php | 165 + vendor/phpspec/prophecy/CHANGES.md | 248 + vendor/phpspec/prophecy/LICENSE | 23 + vendor/phpspec/prophecy/README.md | 402 + vendor/phpspec/prophecy/composer.json | 50 + .../prophecy/src/Prophecy/Argument.php | 212 + .../Prophecy/Argument/ArgumentsWildcard.php | 101 + .../Prophecy/Argument/Token/AnyValueToken.php | 52 + .../Argument/Token/AnyValuesToken.php | 52 + .../Argument/Token/ApproximateValueToken.php | 55 + .../Argument/Token/ArrayCountToken.php | 86 + .../Argument/Token/ArrayEntryToken.php | 143 + .../Argument/Token/ArrayEveryEntryToken.php | 82 + .../Prophecy/Argument/Token/CallbackToken.php | 75 + .../Argument/Token/ExactValueToken.php | 118 + .../Argument/Token/IdenticalValueToken.php | 74 + .../Argument/Token/LogicalAndToken.php | 80 + .../Argument/Token/LogicalNotToken.php | 73 + .../Argument/Token/ObjectStateToken.php | 104 + .../Argument/Token/StringContainsToken.php | 67 + .../Argument/Token/TokenInterface.php | 43 + .../src/Prophecy/Argument/Token/TypeToken.php | 76 + .../prophecy/src/Prophecy/Call/Call.php | 162 + .../prophecy/src/Prophecy/Call/CallCenter.php | 248 + .../Prophecy/Comparator/ClosureComparator.php | 44 + .../src/Prophecy/Comparator/Factory.php | 47 + .../Comparator/ProphecyComparator.php | 28 + .../src/Prophecy/Doubler/CachedDoubler.php | 66 + .../ClassPatch/ClassPatchInterface.php | 48 + .../ClassPatch/DisableConstructorPatch.php | 76 + .../Doubler/ClassPatch/HhvmExceptionPatch.php | 63 + .../Doubler/ClassPatch/KeywordPatch.php | 140 + .../Doubler/ClassPatch/MagicCallPatch.php | 94 + .../ClassPatch/ProphecySubjectPatch.php | 104 + .../ReflectionClassNewInstancePatch.php | 57 + .../Doubler/ClassPatch/SplFileInfoPatch.php | 123 + .../Doubler/ClassPatch/ThrowablePatch.php | 95 + .../Doubler/ClassPatch/TraversablePatch.php | 83 + .../src/Prophecy/Doubler/DoubleInterface.php | 22 + .../prophecy/src/Prophecy/Doubler/Doubler.php | 146 + .../Doubler/Generator/ClassCodeGenerator.php | 129 + .../Doubler/Generator/ClassCreator.php | 67 + .../Doubler/Generator/ClassMirror.php | 260 + .../Doubler/Generator/Node/ArgumentNode.php | 102 + .../Doubler/Generator/Node/ClassNode.php | 169 + .../Doubler/Generator/Node/MethodNode.php | 198 + .../Doubler/Generator/ReflectionInterface.php | 22 + .../Doubler/Generator/TypeHintReference.php | 46 + .../src/Prophecy/Doubler/LazyDouble.php | 127 + .../src/Prophecy/Doubler/NameGenerator.php | 52 + .../Call/UnexpectedCallException.php | 40 + .../Doubler/ClassCreatorException.php | 31 + .../Doubler/ClassMirrorException.php | 31 + .../Doubler/ClassNotFoundException.php | 33 + .../Exception/Doubler/DoubleException.php | 18 + .../Exception/Doubler/DoublerException.php | 18 + .../Doubler/InterfaceNotFoundException.php | 20 + .../Doubler/MethodNotExtendableException.php | 41 + .../Doubler/MethodNotFoundException.php | 60 + .../Doubler/ReturnByReferenceException.php | 41 + .../src/Prophecy/Exception/Exception.php | 26 + .../Exception/InvalidArgumentException.php | 16 + .../Prediction/AggregateException.php | 51 + .../Prediction/FailedPredictionException.php | 24 + .../Exception/Prediction/NoCallsException.php | 18 + .../Prediction/PredictionException.php | 18 + .../UnexpectedCallsCountException.php | 31 + .../Prediction/UnexpectedCallsException.php | 32 + .../Prophecy/MethodProphecyException.php | 34 + .../Prophecy/ObjectProphecyException.php | 34 + .../Exception/Prophecy/ProphecyException.php | 18 + .../ClassAndInterfaceTagRetriever.php | 69 + .../PhpDocumentor/ClassTagRetriever.php | 60 + .../PhpDocumentor/LegacyClassTagRetriever.php | 35 + .../MethodTagRetrieverInterface.php | 30 + .../Prophecy/Prediction/CallPrediction.php | 86 + .../Prediction/CallTimesPrediction.php | 107 + .../Prediction/CallbackPrediction.php | 65 + .../Prophecy/Prediction/NoCallsPrediction.php | 68 + .../Prediction/PredictionInterface.php | 37 + .../src/Prophecy/Promise/CallbackPromise.php | 66 + .../src/Prophecy/Promise/PromiseInterface.php | 35 + .../Promise/ReturnArgumentPromise.php | 61 + .../src/Prophecy/Promise/ReturnPromise.php | 55 + .../src/Prophecy/Promise/ThrowPromise.php | 100 + .../src/Prophecy/Prophecy/MethodProphecy.php | 522 + .../src/Prophecy/Prophecy/ObjectProphecy.php | 286 + .../Prophecy/Prophecy/ProphecyInterface.php | 27 + .../Prophecy/ProphecySubjectInterface.php | 34 + .../src/Prophecy/Prophecy/Revealer.php | 44 + .../Prophecy/Prophecy/RevealerInterface.php | 29 + .../phpspec/prophecy/src/Prophecy/Prophet.php | 138 + .../prophecy/src/Prophecy/Util/ExportUtil.php | 210 + .../prophecy/src/Prophecy/Util/StringUtil.php | 99 + .../phpunit/php-code-coverage/.gitattributes | 3 + .../php-code-coverage/.github/CONTRIBUTING.md | 1 + .../php-code-coverage/.github/FUNDING.yml | 1 + .../.github/ISSUE_TEMPLATE.md | 18 + vendor/phpunit/php-code-coverage/.gitignore | 7 + vendor/phpunit/php-code-coverage/.php_cs.dist | 197 + vendor/phpunit/php-code-coverage/.travis.yml | 60 + vendor/phpunit/php-code-coverage/ChangeLog.md | 131 + vendor/phpunit/php-code-coverage/LICENSE | 33 + vendor/phpunit/php-code-coverage/README.md | 40 + vendor/phpunit/php-code-coverage/build.xml | 30 + .../phpunit/php-code-coverage/composer.json | 61 + vendor/phpunit/php-code-coverage/phive.xml | 4 + vendor/phpunit/php-code-coverage/phpunit.xml | 21 + .../php-code-coverage/src/CodeCoverage.php | 1006 + .../php-code-coverage/src/Driver/Driver.php | 47 + .../php-code-coverage/src/Driver/PCOV.php | 45 + .../php-code-coverage/src/Driver/PHPDBG.php | 96 + .../php-code-coverage/src/Driver/Xdebug.php | 112 + .../CoveredCodeNotExecutedException.php | 17 + .../src/Exception/Exception.php | 17 + .../Exception/InvalidArgumentException.php | 36 + .../MissingCoversAnnotationException.php | 17 + .../src/Exception/RuntimeException.php | 14 + .../UnintentionallyCoveredCodeException.php | 44 + .../phpunit/php-code-coverage/src/Filter.php | 174 + .../src/Node/AbstractNode.php | 328 + .../php-code-coverage/src/Node/Builder.php | 227 + .../php-code-coverage/src/Node/Directory.php | 427 + .../php-code-coverage/src/Node/File.php | 611 + .../php-code-coverage/src/Node/Iterator.php | 89 + .../php-code-coverage/src/Report/Clover.php | 258 + .../php-code-coverage/src/Report/Crap4j.php | 165 + .../src/Report/Html/Facade.php | 167 + .../src/Report/Html/Renderer.php | 277 + .../src/Report/Html/Renderer/Dashboard.php | 281 + .../src/Report/Html/Renderer/Directory.php | 98 + .../src/Report/Html/Renderer/File.php | 529 + .../Renderer/Template/coverage_bar.html.dist | 5 + .../Renderer/Template/css/bootstrap.min.css | 7 + .../Html/Renderer/Template/css/custom.css | 0 .../Html/Renderer/Template/css/nv.d3.min.css | 1 + .../Html/Renderer/Template/css/octicons.css | 5 + .../Html/Renderer/Template/css/style.css | 122 + .../Renderer/Template/dashboard.html.dist | 281 + .../Renderer/Template/directory.html.dist | 60 + .../Template/directory_item.html.dist | 13 + .../Html/Renderer/Template/file.html.dist | 72 + .../Renderer/Template/file_item.html.dist | 14 + .../Renderer/Template/icons/file-code.svg | 1 + .../Template/icons/file-directory.svg | 1 + .../Renderer/Template/js/bootstrap.min.js | 7 + .../Html/Renderer/Template/js/d3.min.js | 5 + .../Report/Html/Renderer/Template/js/file.js | 62 + .../Html/Renderer/Template/js/jquery.min.js | 2 + .../Html/Renderer/Template/js/nv.d3.min.js | 8 + .../Html/Renderer/Template/js/popper.min.js | 5 + .../Renderer/Template/method_item.html.dist | 11 + .../php-code-coverage/src/Report/PHP.php | 64 + .../php-code-coverage/src/Report/Text.php | 283 + .../src/Report/Xml/BuildInformation.php | 81 + .../src/Report/Xml/Coverage.php | 69 + .../src/Report/Xml/Directory.php | 14 + .../src/Report/Xml/Facade.php | 287 + .../php-code-coverage/src/Report/Xml/File.php | 81 + .../src/Report/Xml/Method.php | 56 + .../php-code-coverage/src/Report/Xml/Node.php | 87 + .../src/Report/Xml/Project.php | 85 + .../src/Report/Xml/Report.php | 92 + .../src/Report/Xml/Source.php | 38 + .../src/Report/Xml/Tests.php | 46 + .../src/Report/Xml/Totals.php | 140 + .../php-code-coverage/src/Report/Xml/Unit.php | 95 + vendor/phpunit/php-code-coverage/src/Util.php | 40 + .../phpunit/php-code-coverage/src/Version.php | 30 + .../php-code-coverage/tests/TestCase.php | 395 + .../tests/_files/BankAccount-clover.xml | 26 + .../tests/_files/BankAccount-crap4j.xml | 59 + .../tests/_files/BankAccount-text.txt | 12 + .../tests/_files/BankAccount.php | 33 + .../tests/_files/BankAccountTest.php | 66 + .../_files/CoverageClassExtendedTest.php | 14 + .../tests/_files/CoverageClassTest.php | 14 + .../CoverageFunctionParenthesesTest.php | 13 + ...erageFunctionParenthesesWhitespaceTest.php | 13 + .../tests/_files/CoverageFunctionTest.php | 13 + .../CoverageMethodOneLineAnnotationTest.php | 12 + .../_files/CoverageMethodParenthesesTest.php | 14 + ...overageMethodParenthesesWhitespaceTest.php | 14 + .../tests/_files/CoverageMethodTest.php | 14 + .../tests/_files/CoverageNoneTest.php | 11 + .../tests/_files/CoverageNotPrivateTest.php | 14 + .../tests/_files/CoverageNotProtectedTest.php | 14 + .../tests/_files/CoverageNotPublicTest.php | 14 + .../tests/_files/CoverageNothingTest.php | 15 + .../tests/_files/CoveragePrivateTest.php | 14 + .../tests/_files/CoverageProtectedTest.php | 14 + .../tests/_files/CoveragePublicTest.php | 14 + .../CoverageTwoDefaultClassAnnotations.php | 17 + .../tests/_files/CoveredClass.php | 36 + .../tests/_files/CoveredFunction.php | 4 + .../php-code-coverage/tests/_files/Crash.php | 2 + .../NamespaceCoverageClassExtendedTest.php | 14 + .../_files/NamespaceCoverageClassTest.php | 14 + ...NamespaceCoverageCoversClassPublicTest.php | 17 + .../NamespaceCoverageCoversClassTest.php | 22 + .../_files/NamespaceCoverageMethodTest.php | 14 + .../NamespaceCoverageNotPrivateTest.php | 14 + .../NamespaceCoverageNotProtectedTest.php | 14 + .../_files/NamespaceCoverageNotPublicTest.php | 14 + .../_files/NamespaceCoveragePrivateTest.php | 14 + .../_files/NamespaceCoverageProtectedTest.php | 14 + .../_files/NamespaceCoveragePublicTest.php | 14 + .../tests/_files/NamespaceCoveredClass.php | 38 + .../_files/NotExistingCoveredElementTest.php | 26 + .../BankAccount.php.html | 249 + .../CoverageForBankAccount/dashboard.html | 287 + .../HTML/CoverageForBankAccount/index.html | 118 + .../dashboard.html | 285 + .../index.html | 118 + ...with_class_and_anonymous_function.php.html | 172 + .../dashboard.html | 283 + .../index.html | 108 + .../source_with_ignore.php.html | 196 + .../BankAccount.php.xml | 262 + .../XML/CoverageForBankAccount/index.xml | 33 + .../index.xml | 30 + ..._with_class_and_anonymous_function.php.xml | 161 + .../CoverageForFileWithIgnoredLines/index.xml | 30 + .../source_with_ignore.php.xml | 187 + .../class-with-anonymous-function-clover.xml | 21 + .../class-with-anonymous-function-crap4j.xml | 26 + .../class-with-anonymous-function-text.txt | 12 + .../tests/_files/ignored-lines-clover.xml | 17 + .../tests/_files/ignored-lines-crap4j.xml | 37 + .../tests/_files/ignored-lines-text.txt | 10 + ...urce_with_class_and_anonymous_function.php | 19 + .../tests/_files/source_with_ignore.php | 37 + .../tests/_files/source_with_namespace.php | 20 + .../source_with_oneline_annotations.php | 36 + .../_files/source_with_use_statements.php | 23 + .../tests/_files/source_without_ignore.php | 4 + .../tests/_files/source_without_namespace.php | 18 + .../php-code-coverage/tests/bootstrap.php | 7 + .../tests/tests/BuilderTest.php | 246 + .../tests/tests/CloverTest.php | 48 + .../tests/tests/CodeCoverageTest.php | 359 + .../tests/tests/Crap4jTest.php | 48 + ...nintentionallyCoveredCodeExceptionTest.php | 51 + .../tests/tests/FilterTest.php | 213 + .../tests/tests/HTMLTest.php | 102 + .../tests/tests/TextTest.php | 48 + .../tests/tests/UtilTest.php | 28 + .../php-code-coverage/tests/tests/XmlTest.php | 97 + .../phpunit/php-file-iterator/.gitattributes | 1 + .../php-file-iterator/.github/stale.yml | 40 + vendor/phpunit/php-file-iterator/.gitignore | 5 + vendor/phpunit/php-file-iterator/.php_cs.dist | 168 + vendor/phpunit/php-file-iterator/.travis.yml | 32 + vendor/phpunit/php-file-iterator/ChangeLog.md | 70 + vendor/phpunit/php-file-iterator/LICENSE | 33 + vendor/phpunit/php-file-iterator/README.md | 14 + .../phpunit/php-file-iterator/composer.json | 37 + vendor/phpunit/php-file-iterator/phpunit.xml | 21 + .../phpunit/php-file-iterator/src/Facade.php | 112 + .../phpunit/php-file-iterator/src/Factory.php | 83 + .../php-file-iterator/src/Iterator.php | 112 + .../php-file-iterator/tests/FactoryTest.php | 50 + .../phpunit/php-text-template/.gitattributes | 1 + vendor/phpunit/php-text-template/.gitignore | 5 + vendor/phpunit/php-text-template/LICENSE | 33 + vendor/phpunit/php-text-template/README.md | 14 + .../phpunit/php-text-template/composer.json | 29 + .../php-text-template/src/Template.php | 135 + vendor/phpunit/php-timer/.gitattributes | 1 + vendor/phpunit/php-timer/.github/FUNDING.yml | 1 + vendor/phpunit/php-timer/.github/stale.yml | 40 + vendor/phpunit/php-timer/.gitignore | 5 + vendor/phpunit/php-timer/.php_cs.dist | 197 + vendor/phpunit/php-timer/.travis.yml | 23 + vendor/phpunit/php-timer/ChangeLog.md | 36 + vendor/phpunit/php-timer/LICENSE | 33 + vendor/phpunit/php-timer/README.md | 49 + vendor/phpunit/php-timer/build.xml | 20 + vendor/phpunit/php-timer/composer.json | 42 + vendor/phpunit/php-timer/phpunit.xml | 19 + vendor/phpunit/php-timer/src/Exception.php | 14 + .../php-timer/src/RuntimeException.php | 14 + vendor/phpunit/php-timer/src/Timer.php | 100 + vendor/phpunit/php-timer/tests/TimerTest.php | 134 + .../phpunit/php-token-stream/.gitattributes | 1 + .../php-token-stream/.github/FUNDING.yml | 1 + vendor/phpunit/php-token-stream/.gitignore | 3 + vendor/phpunit/php-token-stream/.travis.yml | 26 + vendor/phpunit/php-token-stream/ChangeLog.md | 57 + vendor/phpunit/php-token-stream/LICENSE | 33 + vendor/phpunit/php-token-stream/README.md | 14 + vendor/phpunit/php-token-stream/build.xml | 21 + vendor/phpunit/php-token-stream/composer.json | 39 + vendor/phpunit/php-token-stream/phpunit.xml | 21 + vendor/phpunit/php-token-stream/src/Token.php | 1361 + .../php-token-stream/src/Token/Stream.php | 609 + .../src/Token/Stream/CachingFactory.php | 46 + .../php-token-stream/src/Token/Util.php | 19 + .../tests/Token/ClassTest.php | 152 + .../tests/Token/ClosureTest.php | 64 + .../tests/Token/FunctionTest.php | 124 + .../tests/Token/IncludeTest.php | 53 + .../tests/Token/InterfaceTest.php | 169 + .../tests/Token/NamespaceTest.php | 62 + .../_fixture/classExtendsNamespacedClass.php | 10 + .../tests/_fixture/classInNamespace.php | 6 + .../tests/_fixture/classInScopedNamespace.php | 9 + .../_fixture/classUsesNamespacedFunction.php | 8 + .../class_with_method_named_empty.php | 7 + ...h_method_that_declares_anonymous_class.php | 15 + ..._method_that_declares_anonymous_class2.php | 16 + ...ltiple_anonymous_classes_and_functions.php | 26 + .../tests/_fixture/closure.php | 7 + .../tests/_fixture/issue19.php | 3 + .../tests/_fixture/issue30.php | 8 + ...tipleNamespacesWithOneClassUsingBraces.php | 12 + ...espacesWithOneClassUsingNonBraceSyntax.php | 14 + .../_fixture/php-code-coverage-issue-424.php | 13 + .../tests/_fixture/source.php | 42 + .../tests/_fixture/source2.php | 6 + .../tests/_fixture/source3.php | 14 + .../tests/_fixture/source4.php | 30 + .../tests/_fixture/source5.php | 5 + .../php-token-stream/tests/bootstrap.php | 15 + vendor/phpunit/phpunit/.gitattributes | 14 + vendor/phpunit/phpunit/.gitignore | 30 + vendor/phpunit/phpunit/.phive/phars.xml | 8 + vendor/phpunit/phpunit/.phpstorm.meta.php | 45 + vendor/phpunit/phpunit/ChangeLog-8.5.md | 73 + vendor/phpunit/phpunit/LICENSE | 33 + vendor/phpunit/phpunit/README.md | 41 + vendor/phpunit/phpunit/composer.json | 89 + vendor/phpunit/phpunit/phpunit | 61 + vendor/phpunit/phpunit/phpunit.xsd | 317 + vendor/phpunit/phpunit/src/Exception.php | 17 + .../phpunit/phpunit/src/Framework/Assert.php | 3556 +++ .../src/Framework/Assert/Functions.php | 2597 ++ .../src/Framework/Constraint/ArrayHasKey.php | 80 + .../src/Framework/Constraint/ArraySubset.php | 129 + .../src/Framework/Constraint/Attribute.php | 79 + .../src/Framework/Constraint/Callback.php | 45 + .../Constraint/ClassHasAttribute.php | 86 + .../Constraint/ClassHasStaticAttribute.php | 59 + .../src/Framework/Constraint/Composite.php | 68 + .../src/Framework/Constraint/Constraint.php | 154 + .../src/Framework/Constraint/Count.php | 123 + .../Framework/Constraint/DirectoryExists.php | 53 + .../src/Framework/Constraint/Exception.php | 80 + .../Framework/Constraint/ExceptionCode.php | 61 + .../Framework/Constraint/ExceptionMessage.php | 71 + .../ExceptionMessageRegularExpression.php | 69 + .../src/Framework/Constraint/FileExists.php | 53 + .../src/Framework/Constraint/GreaterThan.php | 51 + .../src/Framework/Constraint/IsAnything.php | 51 + .../src/Framework/Constraint/IsEmpty.php | 65 + .../src/Framework/Constraint/IsEqual.php | 138 + .../src/Framework/Constraint/IsFalse.php | 35 + .../src/Framework/Constraint/IsFinite.php | 35 + .../src/Framework/Constraint/IsIdentical.php | 138 + .../src/Framework/Constraint/IsInfinite.php | 35 + .../src/Framework/Constraint/IsInstanceOf.php | 86 + .../src/Framework/Constraint/IsJson.php | 73 + .../src/Framework/Constraint/IsNan.php | 35 + .../src/Framework/Constraint/IsNull.php | 35 + .../src/Framework/Constraint/IsReadable.php | 53 + .../src/Framework/Constraint/IsTrue.php | 35 + .../src/Framework/Constraint/IsType.php | 199 + .../src/Framework/Constraint/IsWritable.php | 53 + .../src/Framework/Constraint/JsonMatches.php | 107 + .../JsonMatchesErrorMessageProvider.php | 62 + .../src/Framework/Constraint/LessThan.php | 51 + .../src/Framework/Constraint/LogicalAnd.php | 119 + .../src/Framework/Constraint/LogicalNot.php | 165 + .../src/Framework/Constraint/LogicalOr.php | 116 + .../src/Framework/Constraint/LogicalXor.php | 121 + .../Constraint/ObjectHasAttribute.php | 32 + .../Constraint/RegularExpression.php | 54 + .../src/Framework/Constraint/SameSize.php | 18 + .../Framework/Constraint/StringContains.php | 74 + .../Framework/Constraint/StringEndsWith.php | 46 + .../StringMatchesFormatDescription.php | 101 + .../Framework/Constraint/StringStartsWith.php | 52 + .../Constraint/TraversableContains.php | 115 + .../Constraint/TraversableContainsEqual.php | 84 + .../TraversableContainsIdentical.php | 83 + .../Constraint/TraversableContainsOnly.php | 87 + .../src/Framework/DataProviderTestSuite.php | 61 + .../src/Framework/Error/Deprecated.php | 14 + .../phpunit/src/Framework/Error/Error.php | 23 + .../phpunit/src/Framework/Error/Notice.php | 14 + .../phpunit/src/Framework/Error/Warning.php | 14 + .../Exception/AssertionFailedError.php | 24 + .../Exception/CodeCoverageException.php | 17 + .../CoveredCodeNotExecutedException.php | 17 + .../src/Framework/Exception/Exception.php | 77 + .../Exception/ExpectationFailedException.php | 41 + .../Exception/IncompleteTestError.php | 17 + .../Exception/InvalidArgumentException.php | 37 + .../InvalidCoversTargetException.php | 17 + .../InvalidDataProviderException.php | 17 + .../MissingCoversAnnotationException.php | 17 + .../Exception/NoChildTestSuiteException.php | 17 + .../src/Framework/Exception/OutputError.php | 17 + .../Exception/PHPTAssertionFailedError.php | 32 + .../Framework/Exception/RiskyTestError.php | 17 + .../Framework/Exception/SkippedTestError.php | 17 + .../Exception/SkippedTestSuiteError.php | 17 + .../Framework/Exception/SyntheticError.php | 61 + .../Exception/SyntheticSkippedError.php | 17 + .../UnintentionallyCoveredCodeError.php | 17 + .../src/Framework/Exception/Warning.php | 24 + .../src/Framework/ExceptionWrapper.php | 117 + .../phpunit/src/Framework/IncompleteTest.php | 17 + .../src/Framework/IncompleteTestCase.php | 71 + .../InvalidParameterGroupException.php | 17 + .../src/Framework/MockObject/Api/Api.php | 97 + .../src/Framework/MockObject/Api/Method.php | 28 + .../MockObject/Api/MockedCloneMethod.php | 21 + .../MockObject/Api/UnmockedCloneMethod.php | 23 + .../Framework/MockObject/Builder/Identity.php | 25 + .../MockObject/Builder/InvocationMocker.php | 293 + .../MockObject/Builder/InvocationStubber.php | 61 + .../Framework/MockObject/Builder/Match.php | 26 + .../MockObject/Builder/MethodNameMatch.php | 26 + .../MockObject/Builder/ParametersMatch.php | 48 + .../src/Framework/MockObject/Builder/Stub.php | 24 + .../MockObject/ConfigurableMethod.php | 53 + .../Exception/BadMethodCallException.php | 17 + ...ableMethodsAlreadyInitializedException.php | 17 + .../MockObject/Exception/Exception.php | 17 + .../IncompatibleReturnValueException.php | 17 + .../MockObject/Exception/RuntimeException.php | 17 + .../src/Framework/MockObject/Generator.php | 1050 + .../MockObject/Generator/deprecation.tpl | 2 + .../MockObject/Generator/mocked_class.tpl | 6 + .../MockObject/Generator/mocked_method.tpl | 22 + .../Generator/mocked_method_void.tpl | 20 + .../Generator/mocked_static_method.tpl | 5 + .../MockObject/Generator/proxied_method.tpl | 22 + .../Generator/proxied_method_void.tpl | 22 + .../MockObject/Generator/trait_class.tpl | 6 + .../MockObject/Generator/wsdl_class.tpl | 9 + .../MockObject/Generator/wsdl_method.tpl | 4 + .../src/Framework/MockObject/Invocation.php | 190 + .../MockObject/InvocationHandler.php | 194 + .../src/Framework/MockObject/Matcher.php | 274 + .../MockObject/MethodNameConstraint.php | 45 + .../src/Framework/MockObject/MockBuilder.php | 506 + .../src/Framework/MockObject/MockClass.php | 60 + .../src/Framework/MockObject/MockMethod.php | 372 + .../Framework/MockObject/MockMethodSet.php | 41 + .../src/Framework/MockObject/MockObject.php | 25 + .../src/Framework/MockObject/MockTrait.php | 46 + .../src/Framework/MockObject/MockType.php | 18 + .../MockObject/Rule/AnyInvokedCount.php | 36 + .../MockObject/Rule/AnyParameters.php | 31 + .../MockObject/Rule/ConsecutiveParameters.php | 132 + .../MockObject/Rule/InvocationOrder.php | 46 + .../MockObject/Rule/InvokedAtIndex.php | 71 + .../MockObject/Rule/InvokedAtLeastCount.php | 64 + .../MockObject/Rule/InvokedAtLeastOnce.php | 50 + .../MockObject/Rule/InvokedAtMostCount.php | 64 + .../MockObject/Rule/InvokedCount.php | 101 + .../Framework/MockObject/Rule/MethodName.php | 63 + .../Framework/MockObject/Rule/Parameters.php | 156 + .../MockObject/Rule/ParametersRule.php | 25 + .../phpunit/src/Framework/MockObject/Stub.php | 24 + .../MockObject/Stub/ConsecutiveCalls.php | 55 + .../Framework/MockObject/Stub/Exception.php | 44 + .../MockObject/Stub/ReturnArgument.php | 40 + .../MockObject/Stub/ReturnCallback.php | 54 + .../MockObject/Stub/ReturnReference.php | 44 + .../Framework/MockObject/Stub/ReturnSelf.php | 32 + .../Framework/MockObject/Stub/ReturnStub.php | 44 + .../MockObject/Stub/ReturnValueMap.php | 50 + .../src/Framework/MockObject/Stub/Stub.php | 27 + .../src/Framework/MockObject/Verifiable.php | 26 + .../phpunit/src/Framework/SelfDescribing.php | 21 + .../phpunit/src/Framework/SkippedTest.php | 17 + .../phpunit/src/Framework/SkippedTestCase.php | 71 + vendor/phpunit/phpunit/src/Framework/Test.php | 23 + .../phpunit/src/Framework/TestBuilder.php | 232 + .../phpunit/src/Framework/TestCase.php | 2526 ++ .../phpunit/src/Framework/TestFailure.php | 154 + .../phpunit/src/Framework/TestListener.php | 82 + .../TestListenerDefaultImplementation.php | 56 + .../phpunit/src/Framework/TestResult.php | 1220 + .../phpunit/src/Framework/TestSuite.php | 780 + .../src/Framework/TestSuiteIterator.php | 79 + .../phpunit/src/Framework/WarningTestCase.php | 73 + .../phpunit/src/Runner/BaseTestRunner.php | 156 + .../src/Runner/DefaultTestResultCache.php | 217 + .../phpunit/phpunit/src/Runner/Exception.php | 17 + .../Filter/ExcludeGroupFilterIterator.php | 21 + .../phpunit/src/Runner/Filter/Factory.php | 54 + .../src/Runner/Filter/GroupFilterIterator.php | 54 + .../Filter/IncludeGroupFilterIterator.php | 21 + .../src/Runner/Filter/NameFilterIterator.php | 126 + .../Runner/Hook/AfterIncompleteTestHook.php | 15 + .../src/Runner/Hook/AfterLastTestHook.php | 15 + .../src/Runner/Hook/AfterRiskyTestHook.php | 15 + .../src/Runner/Hook/AfterSkippedTestHook.php | 15 + .../Runner/Hook/AfterSuccessfulTestHook.php | 15 + .../src/Runner/Hook/AfterTestErrorHook.php | 15 + .../src/Runner/Hook/AfterTestFailureHook.php | 15 + .../phpunit/src/Runner/Hook/AfterTestHook.php | 21 + .../src/Runner/Hook/AfterTestWarningHook.php | 15 + .../src/Runner/Hook/BeforeFirstTestHook.php | 15 + .../src/Runner/Hook/BeforeTestHook.php | 15 + .../phpunit/phpunit/src/Runner/Hook/Hook.php | 14 + .../phpunit/src/Runner/Hook/TestHook.php | 14 + .../src/Runner/Hook/TestListenerAdapter.php | 140 + .../src/Runner/NullTestResultCache.php | 42 + .../phpunit/src/Runner/PhptTestCase.php | 751 + .../src/Runner/ResultCacheExtension.php | 107 + .../src/Runner/StandardTestSuiteLoader.php | 153 + .../phpunit/src/Runner/TestResultCache.php | 28 + .../phpunit/src/Runner/TestSuiteLoader.php | 22 + .../phpunit/src/Runner/TestSuiteSorter.php | 434 + vendor/phpunit/phpunit/src/Runner/Version.php | 66 + vendor/phpunit/phpunit/src/TextUI/Command.php | 1332 + .../phpunit/phpunit/src/TextUI/Exception.php | 17 + vendor/phpunit/phpunit/src/TextUI/Help.php | 246 + .../phpunit/src/TextUI/ResultPrinter.php | 570 + .../phpunit/phpunit/src/TextUI/TestRunner.php | 1357 + .../phpunit/src/Util/Annotation/DocBlock.php | 578 + .../phpunit/src/Util/Annotation/Registry.php | 89 + vendor/phpunit/phpunit/src/Util/Blacklist.php | 216 + vendor/phpunit/phpunit/src/Util/Color.php | 143 + .../phpunit/src/Util/Configuration.php | 1205 + .../src/Util/ConfigurationGenerator.php | 64 + .../phpunit/phpunit/src/Util/ErrorHandler.php | 145 + vendor/phpunit/phpunit/src/Util/Exception.php | 17 + .../phpunit/phpunit/src/Util/FileLoader.php | 77 + .../phpunit/phpunit/src/Util/Filesystem.php | 35 + vendor/phpunit/phpunit/src/Util/Filter.php | 107 + vendor/phpunit/phpunit/src/Util/Getopt.php | 181 + .../phpunit/phpunit/src/Util/GlobalState.php | 179 + .../src/Util/InvalidDataSetException.php | 17 + vendor/phpunit/phpunit/src/Util/Json.php | 86 + vendor/phpunit/phpunit/src/Util/Log/JUnit.php | 422 + .../phpunit/phpunit/src/Util/Log/TeamCity.php | 378 + .../src/Util/PHP/AbstractPhpProcess.php | 399 + .../src/Util/PHP/DefaultPhpProcess.php | 216 + .../src/Util/PHP/Template/PhptTestCase.tpl | 40 + .../src/Util/PHP/Template/TestCaseClass.tpl | 108 + .../src/Util/PHP/Template/TestCaseMethod.tpl | 111 + .../src/Util/PHP/WindowsPhpProcess.php | 46 + vendor/phpunit/phpunit/src/Util/Printer.php | 145 + .../phpunit/src/Util/RegularExpression.php | 28 + vendor/phpunit/phpunit/src/Util/Test.php | 894 + .../src/Util/TestDox/CliTestDoxPrinter.php | 352 + .../src/Util/TestDox/HtmlResultPrinter.php | 131 + .../src/Util/TestDox/NamePrettifier.php | 291 + .../src/Util/TestDox/ResultPrinter.php | 339 + .../src/Util/TestDox/TestDoxPrinter.php | 377 + .../src/Util/TestDox/TextResultPrinter.php | 46 + .../src/Util/TestDox/XmlResultPrinter.php | 248 + .../phpunit/src/Util/TextTestListRenderer.php | 49 + vendor/phpunit/phpunit/src/Util/Type.php | 50 + .../src/Util/VersionComparisonOperator.php | 54 + .../src/Util/XdebugFilterScriptGenerator.php | 75 + vendor/phpunit/phpunit/src/Util/Xml.php | 293 + .../phpunit/src/Util/XmlTestListRenderer.php | 85 + vendor/prettus/l5-repository/.editorconfig | 38 + vendor/prettus/l5-repository/.gitignore | 3 + .../prettus/l5-repository/CODE_OF_CONDUCT.md | 46 + vendor/prettus/l5-repository/CONTRIBUTING.md | 18 + vendor/prettus/l5-repository/LICENSE.md | 19 + vendor/prettus/l5-repository/README.md | 1226 + vendor/prettus/l5-repository/_config.yml | 1 + vendor/prettus/l5-repository/composer.json | 54 + vendor/prettus/l5-repository/composer.lock | 1280 + .../prettus/l5-repository/migration-to-2.0.md | 41 + .../prettus/l5-repository/migration-to-2.1.md | 32 + vendor/prettus/l5-repository/phpunit.xml | 18 + .../Contracts/CacheableInterface.php | 55 + .../Contracts/CriteriaInterface.php | 20 + .../Repository/Contracts/Presentable.php | 22 + .../Contracts/PresenterInterface.php | 19 + .../Contracts/RepositoryCriteriaInterface.php | 64 + .../Contracts/RepositoryInterface.php | 319 + .../Repository/Contracts/Transformable.php | 15 + .../Repository/Criteria/RequestCriteria.php | 267 + .../Repository/Eloquent/BaseRepository.php | 1098 + .../Events/RepositoryEntityCreated.php | 15 + .../Events/RepositoryEntityDeleted.php | 15 + .../Events/RepositoryEntityUpdated.php | 15 + .../Repository/Events/RepositoryEventBase.php | 62 + .../Exceptions/RepositoryException.php | 14 + .../Generators/ApiControllerGenerator.php | 149 + .../ApiRepositoryEloquentGenerator.php | 149 + .../Generators/BindingsGenerator.php | 128 + .../Commands/ApiControllerCommand.php | 134 + .../Commands/ApiRepositoryCommand.php | 191 + .../Generators/Commands/BindingsCommand.php | 120 + .../Generators/Commands/ControllerCommand.php | 127 + .../Generators/Commands/CriteriaCommand.php | 103 + .../Generators/Commands/EntityCommand.php | 174 + .../Generators/Commands/PresenterCommand.php | 117 + .../Generators/Commands/RepositoryCommand.php | 191 + .../Commands/TransformerCommand.php | 105 + .../Generators/Commands/ValidatorCommand.php | 114 + .../Generators/ControllerGenerator.php | 149 + .../Generators/CriteriaGenerator.php | 57 + .../Generators/FileAlreadyExistsException.php | 13 + .../Repository/Generators/Generator.php | 368 + .../Generators/MigrationGenerator.php | 169 + .../Generators/Migrations/NameParser.php | 211 + .../Generators/Migrations/RulesParser.php | 106 + .../Generators/Migrations/SchemaParser.php | 237 + .../Repository/Generators/ModelGenerator.php | 103 + .../Generators/PresenterGenerator.php | 79 + .../RepositoryEloquentGenerator.php | 149 + .../RepositoryInterfaceGenerator.php | 102 + .../Prettus/Repository/Generators/Stub.php | 150 + .../Generators/Stubs/api/controller.stub | 102 + .../Generators/Stubs/api/eloquent.stub | 35 + .../Generators/Stubs/bindings/bindings.stub | 3 + .../Stubs/controller/controller.stub | 204 + .../Generators/Stubs/criteria/criteria.stub | 27 + .../Generators/Stubs/migration/change.stub | 34 + .../Generators/Stubs/migration/create.stub | 34 + .../Repository/Generators/Stubs/model.stub | 25 + .../Generators/Stubs/presenter/presenter.stub | 24 + .../Generators/Stubs/repository/eloquent.stub | 38 + .../Stubs/repository/interface.stub | 15 + .../Repository/Generators/Stubs/seed.stub | 25 + .../Stubs/transformer/transformer.stub | 33 + .../Generators/Stubs/validator/validator.stub | 24 + .../Generators/TransformerGenerator.php | 78 + .../Generators/ValidatorGenerator.php | 103 + .../Prettus/Repository/Helpers/CacheKeys.php | 129 + .../Listeners/CleanCacheRepository.php | 76 + .../Repository/Presenter/FractalPresenter.php | 164 + .../Presenter/ModelFractalPresenter.php | 29 + .../Providers/EventServiceProvider.php | 64 + .../LumenRepositoryServiceProvider.php | 40 + .../Providers/RepositoryServiceProvider.php | 68 + .../Repository/Traits/CacheableRepository.php | 343 + .../Traits/ComparesVersionsTrait.php | 30 + .../Repository/Traits/PresentableTrait.php | 69 + .../Prettus/Repository/Traits/Respondable.php | 121 + .../Repository/Traits/TransformableTrait.php | 19 + .../Transformer/ModelTransformer.php | 17 + .../src/resources/config/repository.php | 246 + .../src/resources/lang/cn/criteria.php | 4 + .../src/resources/lang/cn/packages.php | 5 + .../src/resources/lang/en/criteria.php | 4 + .../src/resources/lang/en/packages.php | 5 + .../src/resources/lang/it/criteria.php | 4 + .../src/resources/lang/it/packages.php | 5 + .../src/resources/lang/nl/criteria.php | 4 + .../src/resources/lang/nl/packages.php | 5 + .../src/resources/lang/pt-br/criteria.php | 4 + .../src/resources/lang/pt-br/packages.php | 5 + .../src/resources/lang/pt/criteria.php | 4 + .../src/resources/lang/pt/packages.php | 5 + .../src/resources/lang/ro/criteria.php | 4 + .../src/resources/lang/ro/packages.php | 5 + .../src/resources/lang/zh_CN/criteria.php | 4 + .../src/resources/lang/zh_CN/packages.php | 5 + .../src/resources/lang/zh_TW/criteria.php | 4 + .../src/resources/lang/zh_TW/packages.php | 5 + .../prettus/laravel-validation/.editorconfig | 38 + vendor/prettus/laravel-validation/.gitignore | 60 + vendor/prettus/laravel-validation/.travis.yml | 13 + vendor/prettus/laravel-validation/LICENSE | 21 + vendor/prettus/laravel-validation/README.md | 182 + vendor/prettus/laravel-validation/_config.yml | 1 + .../prettus/laravel-validation/composer.json | 32 + .../prettus/laravel-validation/composer.lock | 449 + vendor/prettus/laravel-validation/phpunit.xml | 18 + .../Prettus/Validator/AbstractValidator.php | 250 + .../Contracts/ValidatorInterface.php | 80 + .../Exceptions/ValidatorException.php | 58 + .../Prettus/Validator/LaravelValidator.php | 49 + .../prettus/laravel-validation/tests/.gitkeep | 0 vendor/psr/container/.gitignore | 3 + vendor/psr/container/LICENSE | 21 + vendor/psr/container/README.md | 5 + vendor/psr/container/composer.json | 27 + .../src/ContainerExceptionInterface.php | 13 + .../psr/container/src/ContainerInterface.php | 37 + .../src/NotFoundExceptionInterface.php | 13 + vendor/psr/event-dispatcher/.editorconfig | 15 + vendor/psr/event-dispatcher/.gitignore | 2 + vendor/psr/event-dispatcher/LICENSE | 21 + vendor/psr/event-dispatcher/README.md | 6 + vendor/psr/event-dispatcher/composer.json | 26 + .../src/EventDispatcherInterface.php | 21 + .../src/ListenerProviderInterface.php | 19 + .../src/StoppableEventInterface.php | 26 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/README.md | 13 + vendor/psr/http-message/composer.json | 26 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 129 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 + .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + vendor/psr/http-message/src/UriInterface.php | 323 + vendor/psr/log/LICENSE | 19 + vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 26 + vendor/psr/log/Psr/Log/LoggerInterface.php | 125 + vendor/psr/log/Psr/Log/LoggerTrait.php | 142 + vendor/psr/log/Psr/Log/NullLogger.php | 30 + vendor/psr/log/Psr/Log/Test/DummyTest.php | 18 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 138 + vendor/psr/log/Psr/Log/Test/TestLogger.php | 147 + vendor/psr/log/README.md | 58 + vendor/psr/log/composer.json | 26 + vendor/psr/simple-cache/.editorconfig | 12 + vendor/psr/simple-cache/LICENSE.md | 21 + vendor/psr/simple-cache/README.md | 8 + vendor/psr/simple-cache/composer.json | 25 + .../psr/simple-cache/src/CacheException.php | 10 + .../psr/simple-cache/src/CacheInterface.php | 114 + .../src/InvalidArgumentException.php | 13 + vendor/psy/psysh/.phan/config.php | 40 + vendor/psy/psysh/LICENSE | 21 + vendor/psy/psysh/README.md | 35 + vendor/psy/psysh/bin/psysh | 148 + vendor/psy/psysh/composer.json | 52 + vendor/psy/psysh/src/CodeCleaner.php | 353 + .../src/CodeCleaner/AbstractClassPass.php | 71 + .../CodeCleaner/AssignThisVariablePass.php | 39 + .../CallTimePassByReferencePass.php | 50 + .../psysh/src/CodeCleaner/CalledClassPass.php | 83 + .../psysh/src/CodeCleaner/CodeCleanerPass.php | 22 + .../CodeCleaner/EmptyArrayDimFetchPass.php | 50 + vendor/psy/psysh/src/CodeCleaner/ExitPass.php | 33 + .../psysh/src/CodeCleaner/FinalClassPass.php | 70 + .../src/CodeCleaner/FunctionContextPass.php | 61 + .../FunctionReturnInWriteContextPass.php | 70 + .../src/CodeCleaner/ImplicitReturnPass.php | 128 + .../psysh/src/CodeCleaner/InstanceOfPass.php | 55 + .../src/CodeCleaner/LabelContextPass.php | 91 + .../src/CodeCleaner/LeavePsyshAlonePass.php | 36 + vendor/psy/psysh/src/CodeCleaner/ListPass.php | 112 + .../psysh/src/CodeCleaner/LoopContextPass.php | 103 + .../src/CodeCleaner/MagicConstantsPass.php | 42 + .../src/CodeCleaner/NamespaceAwarePass.php | 71 + .../psysh/src/CodeCleaner/NamespacePass.php | 88 + .../psysh/src/CodeCleaner/NoReturnValue.php | 35 + .../CodeCleaner/PassableByReferencePass.php | 115 + .../psy/psysh/src/CodeCleaner/RequirePass.php | 100 + .../psysh/src/CodeCleaner/ReturnTypePass.php | 118 + .../psysh/src/CodeCleaner/StrictTypesPass.php | 87 + .../src/CodeCleaner/UseStatementPass.php | 136 + .../src/CodeCleaner/ValidClassNamePass.php | 405 + .../src/CodeCleaner/ValidConstantPass.php | 90 + .../src/CodeCleaner/ValidConstructorPass.php | 112 + .../src/CodeCleaner/ValidFunctionNamePass.php | 97 + .../psy/psysh/src/Command/BufferCommand.php | 79 + vendor/psy/psysh/src/Command/ClearCommand.php | 51 + vendor/psy/psysh/src/Command/Command.php | 289 + vendor/psy/psysh/src/Command/DocCommand.php | 225 + vendor/psy/psysh/src/Command/DumpCommand.php | 96 + vendor/psy/psysh/src/Command/EditCommand.php | 190 + vendor/psy/psysh/src/Command/ExitCommand.php | 52 + vendor/psy/psysh/src/Command/HelpCommand.php | 107 + .../psy/psysh/src/Command/HistoryCommand.php | 248 + vendor/psy/psysh/src/Command/ListCommand.php | 280 + .../ListCommand/ClassConstantEnumerator.php | 124 + .../Command/ListCommand/ClassEnumerator.php | 132 + .../ListCommand/ConstantEnumerator.php | 175 + .../src/Command/ListCommand/Enumerator.php | 106 + .../ListCommand/FunctionEnumerator.php | 116 + .../ListCommand/GlobalVariableEnumerator.php | 92 + .../Command/ListCommand/MethodEnumerator.php | 146 + .../ListCommand/PropertyEnumerator.php | 178 + .../ListCommand/VariableEnumerator.php | 137 + vendor/psy/psysh/src/Command/ParseCommand.php | 182 + .../psysh/src/Command/PsyVersionCommand.php | 43 + .../psysh/src/Command/ReflectingCommand.php | 327 + vendor/psy/psysh/src/Command/ShowCommand.php | 290 + vendor/psy/psysh/src/Command/SudoCommand.php | 145 + .../psy/psysh/src/Command/ThrowUpCommand.php | 166 + .../psy/psysh/src/Command/TimeitCommand.php | 197 + .../Command/TimeitCommand/TimeitVisitor.php | 140 + vendor/psy/psysh/src/Command/TraceCommand.php | 97 + .../psy/psysh/src/Command/WhereamiCommand.php | 159 + vendor/psy/psysh/src/Command/WtfCommand.php | 134 + vendor/psy/psysh/src/ConfigPaths.php | 254 + vendor/psy/psysh/src/Configuration.php | 1761 ++ vendor/psy/psysh/src/ConsoleColorFactory.php | 39 + vendor/psy/psysh/src/Context.php | 320 + vendor/psy/psysh/src/ContextAware.php | 28 + .../psysh/src/Exception/BreakException.php | 51 + .../src/Exception/DeprecatedException.php | 20 + .../psysh/src/Exception/ErrorException.php | 114 + vendor/psy/psysh/src/Exception/Exception.php | 27 + .../src/Exception/FatalErrorException.php | 52 + .../src/Exception/ParseErrorException.php | 42 + .../psysh/src/Exception/RuntimeException.php | 43 + .../psysh/src/Exception/ThrowUpException.php | 57 + .../src/Exception/TypeErrorException.php | 55 + .../Exception/UnexpectedTargetException.php | 37 + vendor/psy/psysh/src/ExecutionClosure.php | 98 + .../src/ExecutionLoop/AbstractListener.php | 62 + .../psy/psysh/src/ExecutionLoop/Listener.php | 83 + .../psysh/src/ExecutionLoop/ProcessForker.php | 284 + .../src/ExecutionLoop/RunkitReloader.php | 135 + vendor/psy/psysh/src/ExecutionLoopClosure.php | 102 + .../psy/psysh/src/Formatter/CodeFormatter.php | 320 + .../psysh/src/Formatter/DocblockFormatter.php | 174 + vendor/psy/psysh/src/Formatter/Formatter.php | 21 + .../src/Formatter/ReflectorFormatter.php | 25 + .../src/Formatter/SignatureFormatter.php | 308 + .../psysh/src/Formatter/TraceFormatter.php | 116 + vendor/psy/psysh/src/Input/CodeArgument.php | 50 + vendor/psy/psysh/src/Input/FilterOptions.php | 145 + vendor/psy/psysh/src/Input/ShellInput.php | 336 + vendor/psy/psysh/src/Input/SilentInput.php | 44 + vendor/psy/psysh/src/Output/OutputPager.php | 26 + vendor/psy/psysh/src/Output/PassthruPager.php | 39 + .../psy/psysh/src/Output/ProcOutputPager.php | 104 + vendor/psy/psysh/src/Output/ShellOutput.php | 208 + vendor/psy/psysh/src/ParserFactory.php | 91 + vendor/psy/psysh/src/Readline/GNUReadline.php | 175 + vendor/psy/psysh/src/Readline/HoaConsole.php | 121 + vendor/psy/psysh/src/Readline/Libedit.php | 107 + vendor/psy/psysh/src/Readline/Readline.php | 76 + vendor/psy/psysh/src/Readline/Transient.php | 147 + .../Reflection/ReflectionClassConstant.php | 228 + .../src/Reflection/ReflectionConstant.php | 30 + .../src/Reflection/ReflectionConstant_.php | 182 + .../ReflectionLanguageConstruct.php | 164 + .../ReflectionLanguageConstructParameter.php | 103 + .../src/Reflection/ReflectionNamespace.php | 60 + vendor/psy/psysh/src/Shell.php | 1505 + vendor/psy/psysh/src/Sudo.php | 150 + vendor/psy/psysh/src/Sudo/SudoVisitor.php | 123 + .../psysh/src/TabCompletion/AutoCompleter.php | 110 + .../Matcher/AbstractContextAwareMatcher.php | 65 + .../AbstractDefaultParametersMatcher.php | 76 + .../TabCompletion/Matcher/AbstractMatcher.php | 195 + .../Matcher/ClassAttributesMatcher.php | 87 + .../ClassMethodDefaultParametersMatcher.php | 64 + .../Matcher/ClassMethodsMatcher.php | 84 + .../Matcher/ClassNamesMatcher.php | 77 + .../TabCompletion/Matcher/CommandsMatcher.php | 114 + .../Matcher/ConstantsMatcher.php | 54 + .../FunctionDefaultParametersMatcher.php | 53 + .../Matcher/FunctionsMatcher.php | 56 + .../TabCompletion/Matcher/KeywordsMatcher.php | 85 + .../Matcher/MongoClientMatcher.php | 71 + .../Matcher/MongoDatabaseMatcher.php | 67 + .../Matcher/ObjectAttributesMatcher.php | 78 + .../ObjectMethodDefaultParametersMatcher.php | 71 + .../Matcher/ObjectMethodsMatcher.php | 80 + .../Matcher/VariablesMatcher.php | 51 + vendor/psy/psysh/src/Util/Docblock.php | 246 + vendor/psy/psysh/src/Util/Json.php | 33 + vendor/psy/psysh/src/Util/Mirror.php | 150 + vendor/psy/psysh/src/Util/Str.php | 114 + vendor/psy/psysh/src/VarDumper/Cloner.php | 42 + vendor/psy/psysh/src/VarDumper/Dumper.php | 109 + vendor/psy/psysh/src/VarDumper/Presenter.php | 137 + .../psysh/src/VarDumper/PresenterAware.php | 26 + .../psy/psysh/src/VersionUpdater/Checker.php | 31 + .../src/VersionUpdater/GitHubChecker.php | 89 + .../src/VersionUpdater/IntervalChecker.php | 67 + .../psysh/src/VersionUpdater/NoopChecker.php | 36 + vendor/psy/psysh/src/functions.php | 400 + vendor/ralouphie/getallheaders/LICENSE | 21 + vendor/ralouphie/getallheaders/README.md | 27 + vendor/ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + vendor/ramsey/collection/CHANGELOG.md | 103 + vendor/ramsey/collection/LICENSE | 19 + vendor/ramsey/collection/README.md | 72 + vendor/ramsey/collection/composer.json | 67 + vendor/ramsey/collection/phpstan-tests.neon | 3 + .../ramsey/collection/src/AbstractArray.php | 180 + .../collection/src/AbstractCollection.php | 355 + vendor/ramsey/collection/src/AbstractSet.php | 64 + .../ramsey/collection/src/ArrayInterface.php | 47 + vendor/ramsey/collection/src/Collection.php | 106 + .../collection/src/CollectionInterface.php | 196 + .../collection/src/DoubleEndedQueue.php | 288 + .../src/DoubleEndedQueueInterface.php | 309 + .../Exception/CollectionMismatchException.php | 22 + .../Exception/InvalidArgumentException.php | 22 + .../Exception/InvalidSortOrderException.php | 22 + .../src/Exception/NoSuchElementException.php | 22 + .../src/Exception/OutOfBoundsException.php | 22 + .../UnsupportedOperationException.php | 22 + .../Exception/ValueExtractionException.php | 22 + vendor/ramsey/collection/src/GenericArray.php | 22 + .../ramsey/collection/src/Map/AbstractMap.php | 226 + .../collection/src/Map/AbstractTypedMap.php | 57 + .../src/Map/AssociativeArrayMap.php | 22 + .../collection/src/Map/MapInterface.php | 138 + .../collection/src/Map/NamedParameterMap.php | 118 + vendor/ramsey/collection/src/Map/TypedMap.php | 137 + .../collection/src/Map/TypedMapInterface.php | 32 + vendor/ramsey/collection/src/Queue.php | 226 + .../ramsey/collection/src/QueueInterface.php | 198 + vendor/ramsey/collection/src/Set.php | 69 + .../ramsey/collection/src/Tool/TypeTrait.php | 73 + .../src/Tool/ValueExtractorTrait.php | 54 + .../src/Tool/ValueToStringTrait.php | 89 + vendor/ramsey/uuid/CHANGELOG.md | 1244 + vendor/ramsey/uuid/LICENSE | 21 + vendor/ramsey/uuid/README.md | 79 + vendor/ramsey/uuid/composer.json | 98 + vendor/ramsey/uuid/src/BinaryUtils.php | 63 + .../uuid/src/Builder/BuilderCollection.php | 73 + .../uuid/src/Builder/DefaultUuidBuilder.php | 26 + .../uuid/src/Builder/DegradedUuidBuilder.php | 76 + .../uuid/src/Builder/FallbackBuilder.php | 75 + .../uuid/src/Builder/UuidBuilderInterface.php | 39 + .../ramsey/uuid/src/Codec/CodecInterface.php | 71 + .../ramsey/uuid/src/Codec/GuidStringCodec.php | 55 + .../uuid/src/Codec/OrderedTimeCodec.php | 112 + vendor/ramsey/uuid/src/Codec/StringCodec.php | 137 + .../src/Codec/TimestampFirstCombCodec.php | 112 + .../uuid/src/Codec/TimestampLastCombCodec.php | 51 + .../Converter/Number/BigNumberConverter.php | 57 + .../Number/DegradedNumberConverter.php | 25 + .../Number/GenericNumberConverter.php | 62 + .../Converter/NumberConverterInterface.php | 57 + .../Converter/Time/BigNumberTimeConverter.php | 51 + .../Converter/Time/DegradedTimeConverter.php | 25 + .../Converter/Time/GenericTimeConverter.php | 124 + .../src/Converter/Time/PhpTimeConverter.php | 183 + .../src/Converter/TimeConverterInterface.php | 58 + vendor/ramsey/uuid/src/DegradedUuid.php | 25 + .../uuid/src/DeprecatedUuidInterface.php | 147 + .../uuid/src/DeprecatedUuidMethodsTrait.php | 370 + .../Exception/BuilderNotFoundException.php | 24 + .../uuid/src/Exception/DateTimeException.php | 24 + .../src/Exception/DceSecurityException.php | 25 + .../Exception/InvalidArgumentException.php | 24 + .../src/Exception/InvalidBytesException.php | 24 + .../Exception/InvalidUuidStringException.php | 25 + .../uuid/src/Exception/NameException.php | 25 + .../uuid/src/Exception/NodeException.php | 24 + .../src/Exception/RandomSourceException.php | 27 + .../src/Exception/TimeSourceException.php | 24 + .../Exception/UnableToBuildUuidException.php | 24 + .../UnsupportedOperationException.php | 24 + vendor/ramsey/uuid/src/FeatureSet.php | 448 + .../uuid/src/Fields/FieldsInterface.php | 32 + .../src/Fields/SerializableFieldsTrait.php | 56 + .../uuid/src/Generator/CombGenerator.php | 127 + .../src/Generator/DceSecurityGenerator.php | 161 + .../DceSecurityGeneratorInterface.php | 53 + .../src/Generator/DefaultNameGenerator.php | 43 + .../src/Generator/DefaultTimeGenerator.php | 147 + .../src/Generator/NameGeneratorFactory.php | 30 + .../src/Generator/NameGeneratorInterface.php | 38 + .../src/Generator/PeclUuidNameGenerator.php | 54 + .../src/Generator/PeclUuidRandomGenerator.php | 32 + .../src/Generator/PeclUuidTimeGenerator.php | 36 + .../src/Generator/RandomBytesGenerator.php | 44 + .../src/Generator/RandomGeneratorFactory.php | 30 + .../Generator/RandomGeneratorInterface.php | 30 + .../uuid/src/Generator/RandomLibAdapter.php | 55 + .../src/Generator/TimeGeneratorFactory.php | 63 + .../src/Generator/TimeGeneratorInterface.php | 38 + vendor/ramsey/uuid/src/Guid/Fields.php | 190 + vendor/ramsey/uuid/src/Guid/Guid.php | 62 + vendor/ramsey/uuid/src/Guid/GuidBuilder.php | 89 + .../uuid/src/Math/BrickMathCalculator.php | 144 + .../uuid/src/Math/CalculatorInterface.php | 106 + vendor/ramsey/uuid/src/Math/RoundingMode.php | 146 + vendor/ramsey/uuid/src/Nonstandard/Fields.php | 133 + vendor/ramsey/uuid/src/Nonstandard/Uuid.php | 38 + .../uuid/src/Nonstandard/UuidBuilder.php | 88 + vendor/ramsey/uuid/src/Nonstandard/UuidV6.php | 132 + .../Dce/SystemDceSecurityProvider.php | 235 + .../Provider/DceSecurityProviderInterface.php | 41 + .../Provider/Node/FallbackNodeProvider.php | 61 + .../Provider/Node/NodeProviderCollection.php | 54 + .../src/Provider/Node/RandomNodeProvider.php | 68 + .../src/Provider/Node/StaticNodeProvider.php | 76 + .../src/Provider/Node/SystemNodeProvider.php | 173 + .../src/Provider/NodeProviderInterface.php | 30 + .../src/Provider/Time/FixedTimeProvider.php | 63 + .../src/Provider/Time/SystemTimeProvider.php | 33 + .../src/Provider/TimeProviderInterface.php | 28 + vendor/ramsey/uuid/src/Rfc4122/Fields.php | 193 + .../uuid/src/Rfc4122/FieldsInterface.php | 126 + vendor/ramsey/uuid/src/Rfc4122/NilTrait.php | 41 + vendor/ramsey/uuid/src/Rfc4122/NilUuid.php | 27 + .../ramsey/uuid/src/Rfc4122/UuidBuilder.php | 111 + .../ramsey/uuid/src/Rfc4122/UuidInterface.php | 36 + vendor/ramsey/uuid/src/Rfc4122/UuidV1.php | 92 + vendor/ramsey/uuid/src/Rfc4122/UuidV2.php | 143 + vendor/ramsey/uuid/src/Rfc4122/UuidV3.php | 58 + vendor/ramsey/uuid/src/Rfc4122/UuidV4.php | 58 + vendor/ramsey/uuid/src/Rfc4122/UuidV5.php | 58 + vendor/ramsey/uuid/src/Rfc4122/Validator.php | 49 + .../ramsey/uuid/src/Rfc4122/VariantTrait.php | 89 + .../ramsey/uuid/src/Rfc4122/VersionTrait.php | 57 + vendor/ramsey/uuid/src/Type/Decimal.php | 112 + vendor/ramsey/uuid/src/Type/Hexadecimal.php | 91 + vendor/ramsey/uuid/src/Type/Integer.php | 122 + .../ramsey/uuid/src/Type/NumberInterface.php | 28 + vendor/ramsey/uuid/src/Type/Time.php | 111 + vendor/ramsey/uuid/src/Type/TypeInterface.php | 30 + vendor/ramsey/uuid/src/Uuid.php | 573 + vendor/ramsey/uuid/src/UuidFactory.php | 463 + .../ramsey/uuid/src/UuidFactoryInterface.php | 182 + vendor/ramsey/uuid/src/UuidInterface.php | 99 + .../uuid/src/Validator/GenericValidator.php | 50 + .../uuid/src/Validator/ValidatorInterface.php | 41 + vendor/ramsey/uuid/src/functions.php | 117 + vendor/scrivo/highlight.php/.editorconfig | 14 + vendor/scrivo/highlight.php/.gitattributes | 6 + .../scrivo/highlight.php/.github/FUNDING.yml | 1 + vendor/scrivo/highlight.php/.gitignore | 9 + vendor/scrivo/highlight.php/.php_cs.dist | 33 + vendor/scrivo/highlight.php/.travis.yml | 53 + .../highlight.php/.travis/hasGitChanges.sh | 12 + vendor/scrivo/highlight.php/AUTHORS.txt | 306 + vendor/scrivo/highlight.php/CONTRIBUTING.md | 106 + .../highlight.php/Highlight/Autoloader.php | 73 + .../Highlight/HighlightResult.php | 60 + .../highlight.php/Highlight/Highlighter.php | 867 + .../highlight.php/Highlight/JsonRef.php | 177 + .../highlight.php/Highlight/Language.php | 413 + .../scrivo/highlight.php/Highlight/Mode.php | 195 + .../Highlight/ModeDeprecations.php | 50 + .../scrivo/highlight.php/Highlight/RegEx.php | 107 + .../highlight.php/Highlight/RegExMatch.php | 108 + .../highlight.php/Highlight/RegExUtils.php | 61 + .../highlight.php/Highlight/Terminators.php | 245 + .../highlight.php/Highlight/languages/1c.json | 130 + .../Highlight/languages/abnf.json | 58 + .../Highlight/languages/accesslog.json | 55 + .../Highlight/languages/actionscript.json | 148 + .../Highlight/languages/ada.json | 118 + .../Highlight/languages/angelscript.json | 138 + .../Highlight/languages/apache.json | 78 + .../Highlight/languages/applescript.json | 116 + .../Highlight/languages/arcade.json | 250 + .../Highlight/languages/arduino.json | 334 + .../Highlight/languages/armasm.json | 107 + .../Highlight/languages/asciidoc.json | 186 + .../Highlight/languages/aspectj.json | 219 + .../Highlight/languages/autohotkey.json | 96 + .../Highlight/languages/autoit.json | 197 + .../Highlight/languages/avrasm.json | 87 + .../Highlight/languages/awk.json | 120 + .../Highlight/languages/axapta.json | 85 + .../Highlight/languages/bash.json | 92 + .../Highlight/languages/basic.json | 72 + .../Highlight/languages/bnf.json | 74 + .../Highlight/languages/brainfuck.json | 47 + .../Highlight/languages/cal.json | 126 + .../Highlight/languages/capnproto.json | 87 + .../Highlight/languages/ceylon.json | 90 + .../Highlight/languages/clean.json | 75 + .../Highlight/languages/clojure-repl.json | 12 + .../Highlight/languages/clojure.json | 139 + .../Highlight/languages/cmake.json | 48 + .../Highlight/languages/coffeescript.json | 267 + .../Highlight/languages/coq.json | 49 + .../Highlight/languages/cos.json | 105 + .../Highlight/languages/cpp.json | 334 + .../Highlight/languages/crmsh.json | 101 + .../Highlight/languages/crystal.json | 482 + .../highlight.php/Highlight/languages/cs.json | 364 + .../Highlight/languages/csp.json | 20 + .../Highlight/languages/css.json | 185 + .../highlight.php/Highlight/languages/d.json | 121 + .../Highlight/languages/dart.json | 208 + .../Highlight/languages/delphi.json | 156 + .../Highlight/languages/diff.json | 65 + .../Highlight/languages/django.json | 101 + .../Highlight/languages/dns.json | 44 + .../Highlight/languages/dockerfile.json | 60 + .../Highlight/languages/dos.json | 54 + .../Highlight/languages/dsconfig.json | 63 + .../Highlight/languages/dts.json | 193 + .../Highlight/languages/dust.json | 46 + .../Highlight/languages/ebnf.json | 69 + .../Highlight/languages/elixir.json | 256 + .../Highlight/languages/elm.json | 161 + .../Highlight/languages/erb.json | 27 + .../Highlight/languages/erlang-repl.json | 76 + .../Highlight/languages/erlang.json | 222 + .../Highlight/languages/excel.json | 70 + .../Highlight/languages/fix.json | 28 + .../Highlight/languages/flix.json | 68 + .../Highlight/languages/fortran.json | 78 + .../Highlight/languages/fsharp.json | 114 + .../Highlight/languages/gams.json | 286 + .../Highlight/languages/gauss.json | 281 + .../Highlight/languages/gcode.json | 123 + .../Highlight/languages/gherkin.json | 64 + .../Highlight/languages/glsl.json | 51 + .../Highlight/languages/gml.json | 73 + .../highlight.php/Highlight/languages/go.json | 114 + .../Highlight/languages/golo.json | 44 + .../Highlight/languages/gradle.json | 87 + .../Highlight/languages/groovy.json | 160 + .../Highlight/languages/haml.json | 136 + .../Highlight/languages/handlebars.json | 131 + .../Highlight/languages/haskell.json | 225 + .../Highlight/languages/haxe.json | 197 + .../Highlight/languages/hsp.json | 131 + .../Highlight/languages/htmlbars.json | 88 + .../Highlight/languages/http.json | 57 + .../highlight.php/Highlight/languages/hy.json | 149 + .../Highlight/languages/inform7.json | 47 + .../Highlight/languages/ini.json | 128 + .../Highlight/languages/irpf90.json | 90 + .../Highlight/languages/isbl.json | 137 + .../Highlight/languages/java.json | 166 + .../Highlight/languages/javascript.json | 398 + .../Highlight/languages/jboss-cli.json | 71 + .../Highlight/languages/json.json | 109 + .../Highlight/languages/julia-repl.json | 16 + .../Highlight/languages/julia.json | 111 + .../Highlight/languages/kotlin.json | 316 + .../Highlight/languages/lasso.json | 253 + .../Highlight/languages/ldif.json | 45 + .../Highlight/languages/leaf.json | 38 + .../Highlight/languages/less.json | 314 + .../Highlight/languages/lisp.json | 190 + .../Highlight/languages/livecodeserver.json | 220 + .../Highlight/languages/livescript.json | 267 + .../Highlight/languages/llvm.json | 90 + .../Highlight/languages/lsl.json | 98 + .../Highlight/languages/lua.json | 118 + .../Highlight/languages/makefile.json | 90 + .../Highlight/languages/markdown.json | 121 + .../Highlight/languages/mathematica.json | 43 + .../Highlight/languages/matlab.json | 126 + .../Highlight/languages/maxima.json | 51 + .../Highlight/languages/mel.json | 77 + .../Highlight/languages/mercury.json | 122 + .../Highlight/languages/mipsasm.json | 101 + .../Highlight/languages/mizar.json | 20 + .../Highlight/languages/mojolicious.json | 21 + .../Highlight/languages/monkey.json | 119 + .../Highlight/languages/moonscript.json | 187 + .../Highlight/languages/n1ql.json | 74 + .../Highlight/languages/nginx.json | 147 + .../Highlight/languages/nimrod.json | 83 + .../Highlight/languages/nix.json | 84 + .../Highlight/languages/nsis.json | 127 + .../Highlight/languages/objectivec.json | 147 + .../Highlight/languages/ocaml.json | 84 + .../Highlight/languages/openscad.json | 108 + .../Highlight/languages/oxygene.json | 133 + .../Highlight/languages/parser3.json | 79 + .../Highlight/languages/perl.json | 208 + .../highlight.php/Highlight/languages/pf.json | 54 + .../Highlight/languages/pgsql.json | 330 + .../Highlight/languages/php.json | 261 + .../Highlight/languages/plaintext.json | 3 + .../Highlight/languages/pony.json | 81 + .../Highlight/languages/powershell.json | 270 + .../Highlight/languages/processing.json | 68 + .../Highlight/languages/profile.json | 61 + .../Highlight/languages/prolog.json | 150 + .../Highlight/languages/properties.json | 68 + .../Highlight/languages/protobuf.json | 70 + .../Highlight/languages/puppet.json | 123 + .../Highlight/languages/purebasic.json | 58 + .../Highlight/languages/python.json | 268 + .../highlight.php/Highlight/languages/q.json | 47 + .../Highlight/languages/qml.json | 228 + .../highlight.php/Highlight/languages/r.json | 77 + .../Highlight/languages/reasonml.json | 344 + .../Highlight/languages/rib.json | 49 + .../Highlight/languages/roboconf.json | 82 + .../Highlight/languages/routeros.json | 174 + .../Highlight/languages/rsl.json | 81 + .../Highlight/languages/ruby.json | 385 + .../Highlight/languages/ruleslanguage.json | 78 + .../Highlight/languages/rust.json | 152 + .../Highlight/languages/sas.json | 96 + .../Highlight/languages/scala.json | 163 + .../Highlight/languages/scheme.json | 190 + .../Highlight/languages/scilab.json | 83 + .../Highlight/languages/scss.json | 154 + .../Highlight/languages/shell.json | 15 + .../Highlight/languages/smali.json | 72 + .../Highlight/languages/smalltalk.json | 86 + .../Highlight/languages/sml.json | 83 + .../Highlight/languages/sqf.json | 114 + .../Highlight/languages/sql.json | 103 + .../Highlight/languages/stan.json | 102 + .../Highlight/languages/stata.json | 82 + .../Highlight/languages/step21.json | 112 + .../Highlight/languages/stylus.json | 168 + .../Highlight/languages/subunit.json | 36 + .../Highlight/languages/swift.json | 173 + .../Highlight/languages/taggerscript.json | 37 + .../Highlight/languages/tap.json | 52 + .../Highlight/languages/tcl.json | 102 + .../Highlight/languages/tex.json | 87 + .../Highlight/languages/thrift.json | 81 + .../highlight.php/Highlight/languages/tp.json | 130 + .../Highlight/languages/twig.json | 79 + .../Highlight/languages/typescript.json | 334 + .../Highlight/languages/vala.json | 93 + .../Highlight/languages/vbnet.json | 73 + .../Highlight/languages/vbscript-html.json | 10 + .../Highlight/languages/vbscript.json | 46 + .../Highlight/languages/verilog.json | 99 + .../Highlight/languages/vhdl.json | 76 + .../Highlight/languages/vim.json | 66 + .../Highlight/languages/x86asm.json | 98 + .../highlight.php/Highlight/languages/xl.json | 100 + .../Highlight/languages/xml.json | 260 + .../Highlight/languages/xquery.json | 133 + .../Highlight/languages/yaml.json | 123 + .../Highlight/languages/zephir.json | 224 + .../HighlightUtilities/_internals.php | 46 + .../HighlightUtilities/_themeColors.php | 479 + .../HighlightUtilities/functions.php | 200 + vendor/scrivo/highlight.php/LICENSE.md | 30 + vendor/scrivo/highlight.php/README.md | 144 + vendor/scrivo/highlight.php/composer.json | 62 + vendor/scrivo/highlight.php/demo/.htaccess | 5 + vendor/scrivo/highlight.php/demo/compare.php | 132 + vendor/scrivo/highlight.php/demo/demo.php | 269 + vendor/scrivo/highlight.php/demo/example.php | 45 + .../highlight.php/demo/highlight.pack.js | 3 + .../highlight.php/demo/line-numbers.php | 101 + vendor/scrivo/highlight.php/phpunit.xml.dist | 22 + .../scrivo/highlight.php/styles/a11y-dark.css | 99 + .../highlight.php/styles/a11y-light.css | 99 + vendor/scrivo/highlight.php/styles/agate.css | 108 + .../highlight.php/styles/an-old-hope.css | 89 + .../highlight.php/styles/androidstudio.css | 66 + .../highlight.php/styles/arduino-light.css | 87 + vendor/scrivo/highlight.php/styles/arta.css | 73 + .../scrivo/highlight.php/styles/ascetic.css | 45 + .../styles/atelier-cave-dark.css | 83 + .../styles/atelier-cave-light.css | 85 + .../styles/atelier-dune-dark.css | 69 + .../styles/atelier-dune-light.css | 69 + .../styles/atelier-estuary-dark.css | 84 + .../styles/atelier-estuary-light.css | 84 + .../styles/atelier-forest-dark.css | 69 + .../styles/atelier-forest-light.css | 69 + .../styles/atelier-heath-dark.css | 69 + .../styles/atelier-heath-light.css | 69 + .../styles/atelier-lakeside-dark.css | 69 + .../styles/atelier-lakeside-light.css | 69 + .../styles/atelier-plateau-dark.css | 84 + .../styles/atelier-plateau-light.css | 84 + .../styles/atelier-savanna-dark.css | 84 + .../styles/atelier-savanna-light.css | 84 + .../styles/atelier-seaside-dark.css | 69 + .../styles/atelier-seaside-light.css | 69 + .../styles/atelier-sulphurpool-dark.css | 69 + .../styles/atelier-sulphurpool-light.css | 69 + .../styles/atom-one-dark-reasonable.css | 75 + .../highlight.php/styles/atom-one-dark.css | 96 + .../highlight.php/styles/atom-one-light.css | 96 + .../highlight.php/styles/brown-paper.css | 64 + .../highlight.php/styles/brown-papersq.png | Bin 0 -> 18198 bytes .../highlight.php/styles/codepen-embed.css | 60 + .../highlight.php/styles/color-brewer.css | 71 + .../scrivo/highlight.php/styles/darcula.css | 74 + vendor/scrivo/highlight.php/styles/dark.css | 63 + .../scrivo/highlight.php/styles/darkula.css | 6 + .../scrivo/highlight.php/styles/default.css | 99 + vendor/scrivo/highlight.php/styles/docco.css | 97 + .../scrivo/highlight.php/styles/dracula.css | 76 + vendor/scrivo/highlight.php/styles/far.css | 71 + .../highlight.php/styles/foundation.css | 89 + .../highlight.php/styles/github-gist.css | 79 + vendor/scrivo/highlight.php/styles/github.css | 99 + vendor/scrivo/highlight.php/styles/gml.css | 78 + .../highlight.php/styles/googlecode.css | 89 + .../highlight.php/styles/gradient-dark.css | 122 + .../scrivo/highlight.php/styles/grayscale.css | 101 + .../highlight.php/styles/gruvbox-dark.css | 108 + .../highlight.php/styles/gruvbox-light.css | 108 + .../scrivo/highlight.php/styles/hopscotch.css | 84 + vendor/scrivo/highlight.php/styles/hybrid.css | 102 + vendor/scrivo/highlight.php/styles/idea.css | 97 + .../scrivo/highlight.php/styles/ir-black.css | 73 + .../highlight.php/styles/isbl-editor-dark.css | 112 + .../styles/isbl-editor-light.css | 111 + .../highlight.php/styles/kimbie.dark.css | 74 + .../highlight.php/styles/kimbie.light.css | 74 + .../scrivo/highlight.php/styles/lightfair.css | 88 + vendor/scrivo/highlight.php/styles/magula.css | 70 + .../scrivo/highlight.php/styles/mono-blue.css | 56 + .../highlight.php/styles/monokai-sublime.css | 83 + .../scrivo/highlight.php/styles/monokai.css | 71 + .../scrivo/highlight.php/styles/night-owl.css | 182 + vendor/scrivo/highlight.php/styles/nord.css | 309 + .../scrivo/highlight.php/styles/obsidian.css | 88 + vendor/scrivo/highlight.php/styles/ocean.css | 74 + .../highlight.php/styles/paraiso-dark.css | 72 + .../highlight.php/styles/paraiso-light.css | 72 + .../scrivo/highlight.php/styles/pojoaque.css | 83 + .../scrivo/highlight.php/styles/pojoaque.jpg | Bin 0 -> 1186 bytes .../scrivo/highlight.php/styles/purebasic.css | 96 + .../highlight.php/styles/qtcreator_dark.css | 83 + .../highlight.php/styles/qtcreator_light.css | 83 + .../highlight.php/styles/railscasts.css | 106 + .../scrivo/highlight.php/styles/rainbow.css | 85 + .../scrivo/highlight.php/styles/routeros.css | 108 + .../highlight.php/styles/school-book.css | 69 + .../highlight.php/styles/school-book.png | Bin 0 -> 486 bytes .../highlight.php/styles/shades-of-purple.css | 96 + .../highlight.php/styles/solarized-dark.css | 84 + .../highlight.php/styles/solarized-light.css | 84 + .../scrivo/highlight.php/styles/sunburst.css | 102 + .../styles/tomorrow-night-blue.css | 75 + .../styles/tomorrow-night-bright.css | 74 + .../styles/tomorrow-night-eighties.css | 74 + .../highlight.php/styles/tomorrow-night.css | 75 + .../scrivo/highlight.php/styles/tomorrow.css | 72 + vendor/scrivo/highlight.php/styles/vs.css | 68 + vendor/scrivo/highlight.php/styles/vs2015.css | 115 + vendor/scrivo/highlight.php/styles/xcode.css | 104 + vendor/scrivo/highlight.php/styles/xt256.css | 92 + .../scrivo/highlight.php/styles/zenburn.css | 80 + .../highlight.php/test/DetectionTest.php | 98 + .../test/HighlightUtilitiesTest.php | 132 + .../highlight.php/test/HighlighterTest.php | 130 + .../scrivo/highlight.php/test/MarkupTest.php | 101 + .../scrivo/highlight.php/test/SpecialTest.php | 84 + .../scrivo/highlight.php/test/bootstrap.php | 43 + .../highlight.php/test/detect/1c/default.txt | 30 + .../test/detect/abnf/default.txt | 22 + .../test/detect/accesslog/default.txt | 1 + .../test/detect/actionscript/default.txt | 24 + .../highlight.php/test/detect/ada/default.txt | 17 + .../test/detect/angelscript/default.txt | 56 + .../test/detect/apache/default.txt | 19 + .../test/detect/applescript/default.txt | 14 + .../test/detect/arcade/default.txt | 14 + .../test/detect/arduino/default.txt | 24 + .../test/detect/armasm/default.txt | 36 + .../test/detect/asciidoc/default.txt | 65 + .../test/detect/aspectj/default.txt | 23 + .../test/detect/autohotkey/default.txt | 24 + .../test/detect/autoit/default.txt | 16 + .../test/detect/avrasm/default.txt | 19 + .../highlight.php/test/detect/awk/default.txt | 16 + .../test/detect/axapta/default.txt | 32 + .../test/detect/bash/default.txt | 17 + .../test/detect/basic/default.txt | 22 + .../highlight.php/test/detect/bnf/default.txt | 8 + .../test/detect/brainfuck/default.txt | 17 + .../highlight.php/test/detect/cal/default.txt | 33 + .../test/detect/capnproto/default.txt | 55 + .../test/detect/ceylon/default.txt | 8 + .../test/detect/clean/default.txt | 30 + .../test/detect/clojure-repl/default.txt | 7 + .../test/detect/clojure/default.txt | 11 + .../test/detect/cmake/default.txt | 19 + .../test/detect/coffeescript/default.txt | 13 + .../highlight.php/test/detect/coq/default.txt | 41 + .../highlight.php/test/detect/cos/default.txt | 21 + .../highlight.php/test/detect/cpp/comment.txt | 16 + .../highlight.php/test/detect/cpp/default.txt | 14 + .../test/detect/crmsh/default.txt | 48 + .../test/detect/crystal/default.txt | 29 + .../highlight.php/test/detect/cs/default.txt | 16 + .../highlight.php/test/detect/csp/default.txt | 5 + .../highlight.php/test/detect/css/default.txt | 16 + .../highlight.php/test/detect/d/default.txt | 44 + .../test/detect/dart/default.txt | 37 + .../test/detect/delphi/default.txt | 30 + .../test/detect/diff/default.txt | 30 + .../test/detect/django/default.txt | 15 + .../highlight.php/test/detect/dns/default.txt | 17 + .../test/detect/dockerfile/default.txt | 56 + .../highlight.php/test/detect/dos/default.txt | 24 + .../test/detect/dsconfig/default.txt | 22 + .../highlight.php/test/detect/dts/default.txt | 71 + .../test/detect/dust/default.txt | 7 + .../test/detect/ebnf/default.txt | 12 + .../test/detect/elixir/default.txt | 49 + .../highlight.php/test/detect/elm/default.txt | 22 + .../highlight.php/test/detect/erb/default.txt | 10 + .../test/detect/erlang-repl/default.txt | 27 + .../test/detect/erlang/default.txt | 60 + .../test/detect/excel/default.txt | 1 + .../highlight.php/test/detect/fix/default.txt | 4 + .../test/detect/flix/default.txt | 49 + .../test/detect/fortran/default.txt | 22 + .../test/detect/fsharp/default.txt | 48 + .../test/detect/gams/default.txt | 31 + .../test/detect/gauss/default.txt | 28 + .../test/detect/gcode/default.txt | 31 + .../test/detect/gherkin/default.txt | 25 + .../test/detect/glsl/default.txt | 37 + .../highlight.php/test/detect/gml/default.txt | 22 + .../highlight.php/test/detect/go/default.txt | 12 + .../test/detect/go/swift-like.txt | 15 + .../test/detect/golo/default.txt | 15 + .../test/detect/gradle/default.txt | 62 + .../test/detect/groovy/default.txt | 56 + .../test/detect/haml/default.txt | 14 + .../test/detect/handlebars/default.txt | 6 + .../test/detect/haskell/default.txt | 38 + .../test/detect/haxe/default.txt | 142 + .../highlight.php/test/detect/hsp/default.txt | 23 + .../test/detect/htmlbars/default.txt | 9 + .../test/detect/http/default.txt | 13 + .../highlight.php/test/detect/hy/default.txt | 37 + .../test/detect/inform7/default.txt | 24 + .../highlight.php/test/detect/ini/default.txt | 12 + .../test/detect/irpf90/default.txt | 37 + .../test/detect/isbl/default.txt | 27 + .../test/detect/java/default.txt | 16 + .../test/detect/javascript/default.txt | 21 + .../test/detect/javascript/sample1.txt | 20 + .../test/detect/javascript/short-plain.txt | 8 + .../test/detect/jboss-cli/default.txt | 24 + .../test/detect/json/default.txt | 12 + .../test/detect/julia-repl/default.txt | 36 + .../test/detect/julia/default.txt | 104 + .../test/detect/kotlin/default.txt | 12 + .../test/detect/lasso/default.txt | 48 + .../test/detect/ldif/default.txt | 48 + .../test/detect/leaf/default.txt | 21 + .../test/detect/less/default.txt | 27 + .../test/detect/lisp/default.txt | 22 + .../test/detect/livecodeserver/default.txt | 30 + .../test/detect/livescript/default.txt | 66 + .../test/detect/llvm/default.txt | 61 + .../highlight.php/test/detect/lsl/default.txt | 12 + .../highlight.php/test/detect/lua/default.txt | 32 + .../test/detect/makefile/default.txt | 13 + .../test/detect/markdown/default.txt | 23 + .../test/detect/mathematica/default.txt | 14 + .../test/detect/matlab/default.txt | 45 + .../test/detect/maxima/default.txt | 57 + .../highlight.php/test/detect/mel/default.txt | 25 + .../test/detect/mercury/default.txt | 24 + .../test/detect/mipsasm/default.txt | 22 + .../test/detect/mizar/default.txt | 86 + .../test/detect/mojolicious/default.txt | 20 + .../test/detect/monkey/default.txt | 37 + .../test/detect/moonscript/default.txt | 37 + .../test/detect/n1ql/default.txt | 19 + .../test/detect/nginx/default.txt | 47 + .../test/detect/nimrod/default.txt | 21 + .../highlight.php/test/detect/nix/default.txt | 24 + .../test/detect/nsis/default.txt | 37 + .../test/detect/objectivec/default.txt | 13 + .../test/detect/ocaml/default.txt | 23 + .../test/detect/openscad/default.txt | 15 + .../test/detect/oxygene/default.txt | 56 + .../test/detect/parser3/default.txt | 34 + .../test/detect/perl/default.txt | 41 + .../highlight.php/test/detect/pf/default.txt | 43 + .../test/detect/pgsql/default.txt | 13 + .../highlight.php/test/detect/php/default.txt | 52 + .../test/detect/plaintext/default.txt | 6 + .../test/detect/pony/default.txt | 20 + .../test/detect/powershell/default.txt | 11 + .../test/detect/processing/default.txt | 17 + .../test/detect/profile/default.txt | 8 + .../test/detect/prolog/default.txt | 11 + .../test/detect/properties/default.txt | 11 + .../test/detect/protobuf/default.txt | 23 + .../test/detect/puppet/default.txt | 33 + .../test/detect/purebasic/default.txt | 29 + .../test/detect/python/default.txt | 12 + .../highlight.php/test/detect/q/default.txt | 9 + .../highlight.php/test/detect/qml/default.txt | 49 + .../highlight.php/test/detect/r/default.txt | 69 + .../test/detect/reasonml/default.txt | 47 + .../highlight.php/test/detect/rib/default.txt | 25 + .../test/detect/roboconf/default.txt | 54 + .../test/detect/routeros/default.txt | 17 + .../highlight.php/test/detect/rsl/default.txt | 15 + .../test/detect/ruby/default.txt | 13 + .../test/detect/ruby/double-colon.txt | 3 + .../test/detect/ruleslanguage/default.txt | 36 + .../test/detect/rust/default.txt | 16 + .../highlight.php/test/detect/sas/default.txt | 48 + .../test/detect/scala/default.txt | 58 + .../test/detect/scheme/default.txt | 28 + .../test/detect/scilab/default.txt | 14 + .../test/detect/scss/default.txt | 73 + .../test/detect/shell/default.txt | 11 + .../test/detect/smali/default.txt | 75 + .../test/detect/smalltalk/default.txt | 39 + .../highlight.php/test/detect/sml/default.txt | 26 + .../highlight.php/test/detect/sqf/default.txt | 16 + .../highlight.php/test/detect/sql/default.txt | 12 + .../test/detect/stan/default.txt | 39 + .../test/detect/stata/default.txt | 40 + .../test/detect/step21/default.txt | 33 + .../test/detect/stylus/default.txt | 28 + .../test/detect/subunit/default.txt | 18 + .../test/detect/swift/default.txt | 15 + .../test/detect/taggerscript/default.txt | 12 + .../highlight.php/test/detect/tap/default.txt | 24 + .../highlight.php/test/detect/tcl/default.txt | 26 + .../highlight.php/test/detect/tex/default.txt | 17 + .../test/detect/thrift/default.txt | 40 + .../highlight.php/test/detect/tp/default.txt | 156 + .../test/detect/twig/default.txt | 21 + .../test/detect/typescript/default.txt | 14 + .../test/detect/vala/default.txt | 46 + .../test/detect/vbnet/default.txt | 42 + .../test/detect/vbscript-html/default.txt | 7 + .../test/detect/vbscript/default.txt | 29 + .../test/detect/verilog/default.txt | 58 + .../test/detect/vhdl/default.txt | 41 + .../highlight.php/test/detect/vim/default.txt | 17 + .../test/detect/x86asm/default.txt | 40 + .../highlight.php/test/detect/xl/default.txt | 28 + .../highlight.php/test/detect/xml/default.txt | 13 + .../test/detect/xml/groovy-julia.txt | 5 + .../highlight.php/test/detect/xml/js.txt | 1 + .../test/detect/xquery/default.txt | 30 + .../test/detect/yaml/default.txt | 39 + .../test/detect/zephir/default.txt | 55 + .../test/markup/abnf/default.expect.txt | 22 + .../test/markup/abnf/default.txt | 22 + .../test/markup/accesslog/default.expect.txt | 5 + .../test/markup/accesslog/default.txt | 5 + .../actionscript/method-call.expect.txt | 1 + .../test/markup/actionscript/method-call.txt | 1 + .../test/markup/arcade/profile.expect.txt | 9 + .../test/markup/arcade/profile.txt | 9 + .../test/markup/arduino/default.expect.txt | 24 + .../test/markup/arduino/default.txt | 25 + .../aspectj/intertype-constructor.expect.txt | 3 + .../markup/aspectj/intertype-constructor.txt | 3 + .../aspectj/intertype-method.expect.txt | 6 + .../test/markup/aspectj/intertype-method.txt | 6 + .../test/markup/bash/escaped-quote.expect.txt | 2 + .../test/markup/bash/escaped-quote.txt | 2 + .../test/markup/bash/no-numbers.expect.txt | 3 + .../test/markup/bash/no-numbers.txt | 3 + .../markup/ceylon/nested-comments.expect.txt | 5 + .../test/markup/ceylon/nested-comments.txt | 5 + .../markup/clojure-repl/prompt.expect.txt | 2 + .../test/markup/clojure-repl/prompt.txt | 2 + .../test/markup/clojure/hint_col.expect.txt | 34 + .../test/markup/clojure/hint_col.txt | 34 + .../markup/clojure/symbols-numbers.expect.txt | 1 + .../test/markup/clojure/symbols-numbers.txt | 1 + .../markup/coffeescript/division.expect.txt | 8 + .../test/markup/coffeescript/division.txt | 8 + .../markup/coffeescript/freeze_bug.expect.txt | 2 + .../test/markup/coffeescript/freeze_bug.txt | 2 + .../markup/coffeescript/function.expect.txt | 14 + .../test/markup/coffeescript/function.txt | 14 + .../test/markup/coffeescript/regex.expect.txt | 18 + .../test/markup/coffeescript/regex.txt | 18 + .../test/markup/cos/basic.expect.txt | 7 + .../highlight.php/test/markup/cos/basic.txt | 7 + .../test/markup/cos/embedded.expect.txt | 5 + .../test/markup/cos/embedded.txt | 5 + .../markup/cpp/expression-keywords.expect.txt | 2 + .../test/markup/cpp/expression-keywords.txt | 2 + .../cpp/function-declarations.expect.txt | 16 + .../test/markup/cpp/function-declarations.txt | 16 + .../markup/cpp/function-params.expect.txt | 7 + .../test/markup/cpp/function-params.txt | 7 + .../test/markup/cpp/function-title.expect.txt | 9 + .../test/markup/cpp/function-title.txt | 9 + .../markup/cpp/number-literals.expect.txt | 6 + .../test/markup/cpp/number-literals.txt | 6 + .../markup/cpp/pointers-returns.expect.txt | 4 + .../test/markup/cpp/pointers-returns.txt | 4 + .../test/markup/cpp/preprocessor.expect.txt | 19 + .../test/markup/cpp/preprocessor.txt | 19 + .../markup/cpp/primitive-types.expect.txt | 3 + .../test/markup/cpp/primitive-types.txt | 3 + .../markup/cpp/string-literals.expect.txt | 69 + .../test/markup/cpp/string-literals.txt | 69 + .../test/markup/crystal/defs.expect.txt | 14 + .../test/markup/crystal/defs.txt | 14 + .../test/markup/crystal/literals.expect.txt | 98 + .../test/markup/crystal/literals.txt | 98 + .../test/markup/crystal/macro.expect.txt | 9 + .../test/markup/crystal/macro.txt | 9 + .../test/markup/crystal/operators.expect.txt | 34 + .../test/markup/crystal/operators.txt | 33 + .../test/markup/crystal/regexes.expect.txt | 12 + .../test/markup/crystal/regexes.txt | 12 + .../crystal/toplevel-keywords.expect.txt | 4 + .../test/markup/crystal/toplevel-keywords.txt | 4 + .../markup/cs/dotted-namespace.expect.txt | 6 + .../test/markup/cs/dotted-namespace.txt | 6 + .../test/markup/cs/floats.expect.txt | 4 + .../highlight.php/test/markup/cs/floats.txt | 4 + .../test/markup/cs/functions.expect.txt | 16 + .../test/markup/cs/functions.txt | 16 + .../markup/cs/string-interpolation.expect.txt | 9 + .../test/markup/cs/string-interpolation.txt | 9 + .../test/markup/cs/titles.expect.txt | 19 + .../highlight.php/test/markup/cs/titles.txt | 19 + .../markup/css/pseudo-selector.expect.txt | 2 + .../test/markup/css/pseudo-selector.txt | 2 + .../test/markup/css/sample.expect.txt | 45 + .../highlight.php/test/markup/css/sample.txt | 45 + .../test/markup/css/url.expect.txt | 6 + .../highlight.php/test/markup/css/url.txt | 6 + .../markup/dart/comment-markdown.expect.txt | 9 + .../test/markup/dart/comment-markdown.txt | 9 + .../dart/string-interpolation.expect.txt | 3 + .../test/markup/dart/string-interpolation.txt | 3 + .../delphi/compiler-directive.expect.txt | 4 + .../test/markup/delphi/compiler-directive.txt | 4 + .../test/markup/diff/comments.expect.txt | 10 + .../test/markup/diff/comments.txt | 10 + .../test/markup/dockerfile/default.expect.txt | 23 + .../test/markup/dockerfile/default.txt | 23 + .../test/markup/dos/comments.expect.txt | 3 + .../test/markup/dos/comments.txt | 3 + .../test/markup/dsconfig/default.expect.txt | 24 + .../test/markup/dsconfig/default.txt | 24 + .../test/markup/ebnf/quote-symbols.expect.txt | 8 + .../test/markup/ebnf/quote-symbols.txt | 8 + .../test/markup/ebnf/terminators.expect.txt | 3 + .../test/markup/ebnf/terminators.txt | 3 + .../ebnf/underscore-production.expect.txt | 1 + .../markup/ebnf/underscore-production.txt | 1 + .../markup/elixir/function-title.expect.txt | 15 + .../test/markup/elixir/function-title.txt | 15 + .../test/markup/elixir/numbers.expect.txt | 14 + .../test/markup/elixir/numbers.txt | 14 + .../test/markup/elixir/sigils.expect.txt | 23 + .../test/markup/elixir/sigils.txt | 23 + .../test/markup/elixir/strings.expect.txt | 4 + .../test/markup/elixir/strings.txt | 4 + .../elixir/uppercase-string-sigil.expect.txt | 17 + .../markup/elixir/uppercase-string-sigil.txt | 17 + .../test/markup/excel/comments.expect.txt | 1 + .../test/markup/excel/comments.txt | 1 + .../test/markup/fortran/numbers.expect.txt | 19 + .../test/markup/fortran/numbers.txt | 19 + .../markup/fsharp/bang-keywords.expect.txt | 1 + .../test/markup/fsharp/bang-keywords.txt | 1 + .../markup/gauss/function_defs.expect.txt | 7 + .../test/markup/gauss/function_defs.txt | 7 + .../markup/gauss/function_refs.expect.txt | 5 + .../test/markup/gauss/function_refs.txt | 5 + .../test/markup/gauss/keywords.expect.txt | 7 + .../test/markup/gauss/keywords.txt | 7 + .../test/markup/go/functions.expect.txt | 9 + .../test/markup/go/functions.txt | 9 + .../test/markup/go/numbers.expect.txt | 3 + .../highlight.php/test/markup/go/numbers.txt | 3 + .../test/markup/go/strings.expect.txt | 7 + .../highlight.php/test/markup/go/strings.txt | 7 + .../test/markup/golo/default.expect.txt | 15 + .../test/markup/golo/default.txt | 15 + ...ession-variants-as-path-segment.expect.txt | 9 + ...ck-expression-variants-as-path-segment.txt | 8 + ...ression-variants-in-helper-name.expect.txt | 14 + ...ock-expression-variants-in-helper-name.txt | 13 + ...ck-expression-variants-in-param.expect.txt | 8 + .../block-expression-variants-in-param.txt | 7 + .../handlebars/block-with-param.expect.txt | 2 + .../markup/handlebars/block-with-param.txt | 1 + .../test/markup/handlebars/block.expect.txt | 2 + .../test/markup/handlebars/block.txt | 1 + .../markup/handlebars/built-ins.expect.txt | 12 + .../test/markup/handlebars/built-ins.txt | 11 + .../markup/handlebars/comments.expect.txt | 4 + .../test/markup/handlebars/comments.txt | 3 + .../handlebars/escaped-mustaches.expect.txt | 22 + .../markup/handlebars/escaped-mustaches.txt | 21 + .../handlebars/expression-variants.expect.txt | 27 + .../markup/handlebars/expression-variants.txt | 26 + .../markup/handlebars/partial-call.expect.txt | 2 + .../test/markup/handlebars/partial-call.txt | 1 + .../markup/handlebars/raw-block.expect.txt | 2 + .../test/markup/handlebars/raw-block.txt | 1 + .../handlebars/simple-expression.expect.txt | 2 + .../markup/handlebars/simple-expression.txt | 1 + .../handlebars/sub-expressions.expect.txt | 2 + .../markup/handlebars/sub-expressions.txt | 1 + .../handlebars/triple-mustache.expect.txt | 2 + .../markup/handlebars/triple-mustache.txt | 1 + .../test/markup/haskell/infix.expect.txt | 3 + .../test/markup/haskell/infix.txt | 3 + .../markup/haskell/nested-comments.expect.txt | 1 + .../test/markup/haskell/nested-comments.txt | 1 + .../test/markup/http/default.expect.txt | 7 + .../test/markup/http/default.txt | 6 + .../test/markup/ini/array.expect.txt | 9 + .../highlight.php/test/markup/ini/array.txt | 10 + .../test/markup/ini/comments.expect.txt | 5 + .../test/markup/ini/comments.txt | 5 + .../test/markup/ini/tables.expect.txt | 4 + .../highlight.php/test/markup/ini/tables.txt | 4 + .../test/markup/ini/types.expect.txt | 20 + .../highlight.php/test/markup/ini/types.txt | 20 + .../test/markup/ini/variable.expect.txt | 2 + .../test/markup/ini/variable.txt | 2 + .../test/markup/java/gh1031.expect.txt | 7 + .../highlight.php/test/markup/java/gh1031.txt | 7 + .../test/markup/java/numbers.expect.txt | 9 + .../test/markup/java/numbers.txt | 9 + .../test/markup/java/titles.expect.txt | 10 + .../highlight.php/test/markup/java/titles.txt | 10 + .../javascript/arrow-function.expect.txt | 4 + .../test/markup/javascript/arrow-function.txt | 4 + .../test/markup/javascript/class.expect.txt | 11 + .../test/markup/javascript/class.txt | 11 + .../javascript/default-parameters.expect.txt | 1 + .../markup/javascript/default-parameters.txt | 1 + .../javascript/inline-languages.expect.txt | 24 + .../markup/javascript/inline-languages.txt | 24 + .../test/markup/javascript/jsdoc.expect.txt | 17 + .../test/markup/javascript/jsdoc.txt | 17 + .../markup/javascript/jsx-fragment.expect.txt | 10 + .../test/markup/javascript/jsx-fragment.txt | 10 + .../test/markup/javascript/jsx.expect.txt | 27 + .../test/markup/javascript/jsx.txt | 27 + .../markup/javascript/keywords.expect.txt | 13 + .../test/markup/javascript/keywords.txt | 13 + .../markup/javascript/method-call.expect.txt | 1 + .../test/markup/javascript/method-call.txt | 1 + .../test/markup/javascript/modules.expect.txt | 8 + .../test/markup/javascript/modules.txt | 8 + .../markup/javascript/object-attr.expect.txt | 6 + .../test/markup/javascript/object-attr.txt | 6 + .../test/markup/javascript/shebang.expect.txt | 3 + .../test/markup/javascript/shebang.txt | 3 + .../javascript/template-strings.expect.txt | 1 + .../markup/javascript/template-strings.txt | 1 + .../test/markup/json/comments.expect.txt | 18 + .../test/markup/json/comments.txt | 18 + .../test/markup/kotlin/class.expect.txt | 16 + .../test/markup/kotlin/class.txt | 16 + .../test/markup/kotlin/function.expect.txt | 16 + .../test/markup/kotlin/function.txt | 16 + .../markup/kotlin/nested_comment.expect.txt | 9 + .../test/markup/kotlin/nested_comment.txt | 9 + .../test/markup/kotlin/string.expect.txt | 8 + .../test/markup/kotlin/string.txt | 8 + .../test/markup/lasso/delimiters.expect.txt | 7 + .../test/markup/lasso/delimiters.txt | 7 + .../test/markup/ldif/ldapmodify.expect.txt | 7 + .../test/markup/ldif/ldapmodify.txt | 7 + .../test/markup/ldif/schema.expect.txt | 15 + .../highlight.php/test/markup/ldif/schema.txt | 15 + .../test/markup/less/selectors.expect.txt | 8 + .../test/markup/less/selectors.txt | 8 + .../test/markup/lisp/mec.expect.txt | 4 + .../highlight.php/test/markup/lisp/mec.txt | 4 + .../test/markup/markdown/code.expect.txt | 8 + .../test/markup/markdown/code.txt | 8 + .../test/markup/markdown/list.expect.txt | 5 + .../test/markup/markdown/list.txt | 5 + .../markup/matlab/block_comment.expect.txt | 27 + .../test/markup/matlab/block_comment.txt | 27 + .../test/markup/matlab/transpose.expect.txt | 40 + .../test/markup/matlab/transpose.txt | 40 + .../test/markup/maxima/example.expect.txt | 42 + .../test/markup/maxima/example.txt | 42 + .../test/markup/maxima/numbers.expect.txt | 24 + .../test/markup/maxima/numbers.txt | 24 + .../test/markup/maxima/symbols.expect.txt | 18 + .../test/markup/maxima/symbols.txt | 18 + .../markup/objectivec/preprocessor.expect.txt | 19 + .../test/markup/objectivec/preprocessor.txt | 19 + .../objectivec/string-literals.expect.txt | 7 + .../markup/objectivec/string-literals.txt | 7 + .../test/markup/ocaml/literals.expect.txt | 29 + .../test/markup/ocaml/literals.txt | 29 + .../test/markup/ocaml/types.expect.txt | 17 + .../highlight.php/test/markup/ocaml/types.txt | 17 + .../test/markup/pgsql/clauses.expect.txt | 67 + .../test/markup/pgsql/clauses.txt | 67 + .../test/markup/pgsql/clauses2.expect.txt | 160 + .../test/markup/pgsql/clauses2.txt | 160 + .../test/markup/pgsql/constraints.expect.txt | 21 + .../test/markup/pgsql/constraints.txt | 21 + .../test/markup/pgsql/options.expect.txt | 44 + .../test/markup/pgsql/options.txt | 44 + .../test/markup/pgsql/plpgsql.expect.txt | 61 + .../test/markup/pgsql/plpgsql.txt | 61 + .../test/markup/pgsql/sql-commands.expect.txt | 99 + .../test/markup/pgsql/sql-commands.txt | 99 + .../markup/pgsql/window-functions.expect.txt | 35 + .../test/markup/pgsql/window-functions.txt | 35 + .../test/markup/pgsql/xml.expect.txt | 47 + .../highlight.php/test/markup/pgsql/xml.txt | 47 + .../test/markup/php/comments.expect.txt | 19 + .../test/markup/php/comments.txt | 19 + .../test/markup/php/heredoc.expect.txt | 14 + .../highlight.php/test/markup/php/heredoc.txt | 14 + .../test/markup/pony/control-flow.expect.txt | 21 + .../test/markup/pony/control-flow.txt | 21 + .../test/markup/pony/creator.expect.txt | 3 + .../test/markup/pony/creator.txt | 3 + .../markup/pony/iterface-trait.expect.txt | 9 + .../test/markup/pony/iterface-trait.txt | 9 + .../test/markup/pony/lambda.expect.txt | 1 + .../highlight.php/test/markup/pony/lambda.txt | 1 + .../test/markup/pony/match.expect.txt | 8 + .../highlight.php/test/markup/pony/match.txt | 8 + .../test/markup/pony/method.expect.txt | 8 + .../highlight.php/test/markup/pony/method.txt | 8 + .../markup/pony/number-literals.expect.txt | 15 + .../test/markup/pony/number-literals.txt | 15 + .../test/markup/pony/objects.expect.txt | 11 + .../test/markup/pony/objects.txt | 11 + .../test/markup/pony/prime.expect.txt | 2 + .../highlight.php/test/markup/pony/prime.txt | 2 + .../test/markup/pony/triple-quote.expect.txt | 5 + .../test/markup/pony/triple-quote.txt | 5 + .../powershell/apos-herestring.expect.txt | 11 + .../markup/powershell/apos-herestring.txt | 11 + .../test/markup/powershell/classes.expect.txt | 57 + .../test/markup/powershell/classes.txt | 57 + .../test/markup/powershell/misc.expect.txt | 35 + .../test/markup/powershell/misc.txt | 35 + .../powershell/quote-herestring.expect.txt | 11 + .../markup/powershell/quote-herestring.txt | 11 + .../test/markup/properties/syntax.expect.txt | 14 + .../test/markup/properties/syntax.txt | 14 + .../protobuf/message-message.expect.txt | 7 + .../test/markup/protobuf/message-message.txt | 7 + .../markup/python/escaped-quotes.expect.txt | 43 + .../test/markup/python/escaped-quotes.txt | 43 + .../test/markup/python/f-strings.expect.txt | 13 + .../test/markup/python/f-strings.txt | 13 + .../function-header-comments.expect.txt | 10 + .../python/function-header-comments.txt | 10 + .../markup/python/function-header.expect.txt | 2 + .../test/markup/python/function-header.txt | 2 + .../python/matrix-multiplication.expect.txt | 7 + .../markup/python/matrix-multiplication.txt | 7 + .../test/markup/reasonml/functions.expect.txt | 22 + .../test/markup/reasonml/functions.txt | 22 + .../test/markup/reasonml/literals.expect.txt | 41 + .../test/markup/reasonml/literals.txt | 41 + .../test/markup/reasonml/modules.expect.txt | 19 + .../test/markup/reasonml/modules.txt | 19 + .../reasonml/pattern-matching.expect.txt | 20 + .../test/markup/reasonml/pattern-matching.txt | 20 + .../test/markup/ruby/gemfile.expect.txt | 3 + .../test/markup/ruby/gemfile.txt | 3 + .../test/markup/ruby/heredoc.expect.txt | 15 + .../test/markup/ruby/heredoc.txt | 15 + .../test/markup/ruby/prompt.expect.txt | 23 + .../highlight.php/test/markup/ruby/prompt.txt | 23 + .../test/markup/ruby/regexes.expect.txt | 5 + .../test/markup/ruby/regexes.txt | 5 + .../test/markup/rust/comments.expect.txt | 3 + .../test/markup/rust/comments.txt | 3 + .../test/markup/rust/numbers.expect.txt | 13 + .../test/markup/rust/numbers.txt | 13 + .../test/markup/rust/strings.expect.txt | 14 + .../test/markup/rust/strings.txt | 14 + .../test/markup/rust/traits.expect.txt | 3 + .../highlight.php/test/markup/rust/traits.txt | 3 + .../test/markup/rust/types.expect.txt | 4 + .../highlight.php/test/markup/rust/types.txt | 4 + .../test/markup/rust/variables.expect.txt | 3 + .../test/markup/rust/variables.txt | 3 + .../test/markup/scala/case-classes.expect.txt | 3 + .../test/markup/scala/case-classes.txt | 3 + .../test/markup/scheme/lambda.expect.txt | 1 + .../test/markup/scheme/lambda.txt | 1 + .../test/markup/scheme/quoted.expect.txt | 1 + .../test/markup/scheme/quoted.txt | 1 + .../test/markup/shell/plain-prompt.expect.txt | 2 + .../test/markup/shell/plain-prompt.txt | 2 + .../markup/shell/prompt-with-slash.expect.txt | 13 + .../test/markup/shell/prompt-with-slash.txt | 13 + .../test/markup/sql/interval.expect.txt | 17 + .../test/markup/sql/interval.txt | 17 + .../test/markup/sql/join.expect.txt | 17 + .../highlight.php/test/markup/sql/join.txt | 17 + .../test/markup/sql/keywords.expect.txt | 1 + .../test/markup/sql/keywords.txt | 1 + .../test/markup/sql/lateral-view.expect.txt | 7 + .../test/markup/sql/lateral-view.txt | 7 + .../test/markup/sql/numeric-types.expect.txt | 1 + .../test/markup/sql/numeric-types.txt | 1 + .../test/markup/sql/set-operator.expect.txt | 1 + .../test/markup/sql/set-operator.txt | 1 + .../test/markup/sql/string-types.expect.txt | 5 + .../test/markup/sql/string-types.txt | 5 + .../test/markup/sql/tablesample.expect.txt | 5 + .../test/markup/sql/tablesample.txt | 5 + .../markup/sql/values-statement.expect.txt | 7 + .../test/markup/sql/values-statement.txt | 7 + .../markup/sql/window-function.expect.txt | 23 + .../test/markup/sql/window-function.txt | 23 + .../test/markup/stata/built_ins.expect.txt | 3 + .../test/markup/stata/built_ins.txt | 3 + .../subunit/subunit-errorline.expect.txt | 2 + .../test/markup/subunit/subunit-errorline.txt | 2 + .../subunit/subunit-failureline.expect.txt | 4 + .../markup/subunit/subunit-failureline.txt | 4 + .../subunit/subunit-progressline.expect.txt | 7 + .../markup/subunit/subunit-progressline.txt | 7 + .../subunit/subunit-skipline.expect.txt | 3 + .../test/markup/subunit/subunit-skipline.txt | 3 + .../subunit/subunit-successline.expect.txt | 8 + .../markup/subunit/subunit-successline.txt | 8 + .../markup/subunit/subunit-tagline.expect.txt | 5 + .../test/markup/subunit/subunit-tagline.txt | 5 + .../subunit/subunit-testline.expect.txt | 10 + .../test/markup/subunit/subunit-testline.txt | 10 + .../subunit/subunit-timeline.expect.txt | 3 + .../test/markup/subunit/subunit-timeline.txt | 3 + .../subunit/subunit-uxsuccessline.expect.txt | 3 + .../markup/subunit/subunit-uxsuccessline.txt | 3 + .../subunit/subunit-xfailline.expect.txt | 3 + .../test/markup/subunit/subunit-xfailline.txt | 3 + .../test/markup/swift/functions.expect.txt | 10 + .../test/markup/swift/functions.txt | 10 + .../markup/swift/multiline-string.expect.txt | 3 + .../test/markup/swift/multiline-string.txt | 3 + .../test/markup/tap/basic.expect.txt | 5 + .../highlight.php/test/markup/tap/basic.txt | 5 + .../markup/tap/without-numbers.expect.txt | 6 + .../test/markup/tap/without-numbers.txt | 6 + .../test/markup/tap/yaml-block.expect.txt | 26 + .../test/markup/tap/yaml-block.txt | 26 + .../twig/filter_with_underscore.expect.txt | 1 + .../markup/twig/filter_with_underscore.txt | 1 + .../test/markup/twig/template_tags.expect.txt | 12 + .../test/markup/twig/template_tags.txt | 11 + .../test/markup/typescript/class.expect.txt | 11 + .../test/markup/typescript/class.txt | 11 + .../markup/typescript/declares.expect.txt | 8 + .../test/markup/typescript/declares.txt | 8 + .../typescript/decorator-factories.expect.txt | 13 + .../markup/typescript/decorator-factories.txt | 13 + .../markup/typescript/functions.expect.txt | 15 + .../test/markup/typescript/functions.txt | 15 + .../typescript/inline-languages.expect.txt | 24 + .../markup/typescript/inline-languages.txt | 24 + .../test/markup/typescript/jsx.expect.txt | 41 + .../test/markup/typescript/jsx.txt | 41 + .../markup/typescript/module-id.expect.txt | 14 + .../test/markup/typescript/module-id.txt | 14 + .../typescript/nested-templates.expect.txt | 3 + .../markup/typescript/nested-templates.txt | 3 + .../test/markup/verilog/misc.expect.txt | 37 + .../test/markup/verilog/misc.txt | 37 + .../test/markup/verilog/numbers.expect.txt | 8 + .../test/markup/verilog/numbers.txt | 8 + .../markup/vim/strings-comments.expect.txt | 4 + .../test/markup/vim/strings-comments.txt | 4 + .../x86asm/labels-directives.expect.txt | 6 + .../test/markup/x86asm/labels-directives.txt | 6 + .../xml/document-type-variations.expect.txt | 38 + .../markup/xml/document-type-variations.txt | 38 + .../markup/xml/space-attributes.expect.txt | 3 + .../test/markup/xml/space-attributes.txt | 3 + .../markup/xml/unquoted-attributes.expect.txt | 9 + .../test/markup/xml/unquoted-attributes.txt | 9 + .../markup/xquery/computed_inbuilt.expect.txt | 9 + .../test/markup/xquery/computed_inbuilt.txt | 9 + .../markup/xquery/direct_method.expect.txt | 12 + .../test/markup/xquery/direct_method.txt | 12 + .../markup/xquery/function_body.expect.txt | 11 + .../test/markup/xquery/function_body.txt | 11 + .../xquery/prolog_declarations.expect.txt | 22 + .../markup/xquery/prolog_declarations.txt | 22 + .../test/markup/yaml/block.expect.txt | 30 + .../highlight.php/test/markup/yaml/block.txt | 30 + .../test/markup/yaml/keys.expect.txt | 32 + .../highlight.php/test/markup/yaml/keys.txt | 32 + .../test/markup/yaml/numbers.expect.txt | 5 + .../test/markup/yaml/numbers.txt | 5 + .../test/markup/yaml/string.expect.txt | 7 + .../highlight.php/test/markup/yaml/string.txt | 7 + .../test/markup/yaml/tag.expect.txt | 4 + .../highlight.php/test/markup/yaml/tag.txt | 4 + .../test/special/languagealias.expect.txt | 1 + .../test/special/languagealias.txt | 1 + .../test/special/line-endings.crlf.expect.txt | 4 + .../test/special/line-endings.crlf.txt | 4 + .../test/special/sublanguages.expect.txt | 4 + .../test/special/sublanguages.txt | 4 + .../test/special/tabreplace.expect.txt | 2 + .../highlight.php/test/special/tabreplace.txt | 2 + vendor/scrivo/highlight.php/tools/.htaccess | 5 + vendor/scrivo/highlight.php/tools/export.js | 82 + .../tools/get_language_definitions.php | 100 + .../highlight.php/tools/get_styles_colors.php | 109 + vendor/scrivo/highlight.php/tools/launcher.js | 16 + .../highlight.php/tools/lodash.cloneDeep.js | 1748 ++ vendor/scrivo/highlight.php/tools/process.sh | 42 + .../code-unit-reverse-lookup/.gitignore | 4 + .../code-unit-reverse-lookup/.php_cs | 67 + .../code-unit-reverse-lookup/.travis.yml | 25 + .../code-unit-reverse-lookup/ChangeLog.md | 10 + .../code-unit-reverse-lookup/LICENSE | 33 + .../code-unit-reverse-lookup/README.md | 14 + .../code-unit-reverse-lookup/build.xml | 22 + .../code-unit-reverse-lookup/composer.json | 28 + .../code-unit-reverse-lookup/phpunit.xml | 21 + .../code-unit-reverse-lookup/src/Wizard.php | 111 + .../tests/WizardTest.php | 45 + vendor/sebastian/comparator/.github/stale.yml | 40 + vendor/sebastian/comparator/.gitignore | 4 + vendor/sebastian/comparator/.php_cs.dist | 189 + vendor/sebastian/comparator/.travis.yml | 33 + vendor/sebastian/comparator/ChangeLog.md | 59 + vendor/sebastian/comparator/LICENSE | 33 + vendor/sebastian/comparator/README.md | 37 + vendor/sebastian/comparator/build.xml | 21 + vendor/sebastian/comparator/composer.json | 54 + vendor/sebastian/comparator/phpunit.xml | 21 + .../comparator/src/ArrayComparator.php | 130 + .../sebastian/comparator/src/Comparator.php | 61 + .../comparator/src/ComparisonFailure.php | 128 + .../comparator/src/DOMNodeComparator.php | 86 + .../comparator/src/DateTimeComparator.php | 86 + .../comparator/src/DoubleComparator.php | 56 + .../comparator/src/ExceptionComparator.php | 52 + vendor/sebastian/comparator/src/Factory.php | 138 + .../comparator/src/MockObjectComparator.php | 47 + .../comparator/src/NumericComparator.php | 68 + .../comparator/src/ObjectComparator.php | 106 + .../comparator/src/ResourceComparator.php | 52 + .../comparator/src/ScalarComparator.php | 91 + .../src/SplObjectStorageComparator.php | 69 + .../comparator/src/TypeComparator.php | 59 + .../comparator/tests/ArrayComparatorTest.php | 161 + .../tests/ComparisonFailureTest.php | 59 + .../tests/DOMNodeComparatorTest.php | 180 + .../tests/DateTimeComparatorTest.php | 213 + .../comparator/tests/DoubleComparatorTest.php | 135 + .../tests/ExceptionComparatorTest.php | 136 + .../comparator/tests/FactoryTest.php | 117 + .../tests/MockObjectComparatorTest.php | 168 + .../tests/NumericComparatorTest.php | 123 + .../comparator/tests/ObjectComparatorTest.php | 150 + .../tests/ResourceComparatorTest.php | 122 + .../comparator/tests/ScalarComparatorTest.php | 164 + .../tests/SplObjectStorageComparatorTest.php | 145 + .../comparator/tests/TypeComparatorTest.php | 107 + .../comparator/tests/_fixture/Author.php | 26 + .../comparator/tests/_fixture/Book.php | 19 + .../tests/_fixture/ClassWithToString.php | 18 + .../comparator/tests/_fixture/SampleClass.php | 29 + .../comparator/tests/_fixture/Struct.php | 23 + .../comparator/tests/_fixture/TestClass.php | 14 + .../tests/_fixture/TestClassComparator.php | 14 + vendor/sebastian/diff/.github/stale.yml | 40 + vendor/sebastian/diff/.gitignore | 6 + vendor/sebastian/diff/.php_cs.dist | 168 + vendor/sebastian/diff/.travis.yml | 26 + vendor/sebastian/diff/ChangeLog.md | 53 + vendor/sebastian/diff/LICENSE | 33 + vendor/sebastian/diff/README.md | 195 + vendor/sebastian/diff/build.xml | 22 + vendor/sebastian/diff/composer.json | 39 + vendor/sebastian/diff/phpunit.xml | 21 + vendor/sebastian/diff/src/Chunk.php | 90 + vendor/sebastian/diff/src/Diff.php | 67 + vendor/sebastian/diff/src/Differ.php | 330 + .../src/Exception/ConfigurationException.php | 40 + .../diff/src/Exception/Exception.php | 15 + .../Exception/InvalidArgumentException.php | 15 + vendor/sebastian/diff/src/Line.php | 44 + .../LongestCommonSubsequenceCalculator.php | 24 + ...ientLongestCommonSubsequenceCalculator.php | 81 + .../src/Output/AbstractChunkOutputBuilder.php | 56 + .../diff/src/Output/DiffOnlyOutputBuilder.php | 68 + .../src/Output/DiffOutputBuilderInterface.php | 20 + .../Output/StrictUnifiedDiffOutputBuilder.php | 318 + .../src/Output/UnifiedDiffOutputBuilder.php | 264 + vendor/sebastian/diff/src/Parser.php | 106 + ...ientLongestCommonSubsequenceCalculator.php | 66 + vendor/sebastian/diff/tests/ChunkTest.php | 73 + vendor/sebastian/diff/tests/DiffTest.php | 55 + vendor/sebastian/diff/tests/DifferTest.php | 444 + .../Exception/ConfigurationExceptionTest.php | 41 + .../InvalidArgumentExceptionTest.php | 33 + vendor/sebastian/diff/tests/LineTest.php | 44 + .../tests/LongestCommonSubsequenceTest.php | 201 + .../MemoryEfficientImplementationTest.php | 22 + .../Output/AbstractChunkOutputBuilderTest.php | 152 + .../Output/DiffOnlyOutputBuilderTest.php | 76 + ...nifiedDiffOutputBuilderIntegrationTest.php | 299 + ...nifiedDiffOutputBuilderIntegrationTest.php | 163 + ...ctUnifiedDiffOutputBuilderDataProvider.php | 189 + .../StrictUnifiedDiffOutputBuilderTest.php | 684 + .../UnifiedDiffOutputBuilderDataProvider.php | 396 + .../Output/UnifiedDiffOutputBuilderTest.php | 90 + vendor/sebastian/diff/tests/ParserTest.php | 170 + .../tests/TimeEfficientImplementationTest.php | 22 + .../sebastian/diff/tests/Utils/FileUtils.php | 31 + .../tests/Utils/UnifiedDiffAssertTrait.php | 277 + .../UnifiedDiffAssertTraitIntegrationTest.php | 129 + .../Utils/UnifiedDiffAssertTraitTest.php | 434 + .../diff/tests/fixtures/.editorconfig | 1 + .../1_a.txt | 1 + .../1_b.txt | 0 .../2_a.txt | 35 + .../2_b.txt | 18 + .../diff/tests/fixtures/out/.editorconfig | 1 + .../diff/tests/fixtures/out/.gitignore | 2 + .../sebastian/diff/tests/fixtures/patch.txt | 9 + .../sebastian/diff/tests/fixtures/patch2.txt | 21 + .../diff/tests/fixtures/serialized_diff.bin | Bin 0 -> 4143 bytes .../sebastian/environment/.github/FUNDING.yml | 1 + vendor/sebastian/environment/.gitignore | 6 + vendor/sebastian/environment/.php_cs.dist | 199 + vendor/sebastian/environment/.travis.yml | 28 + vendor/sebastian/environment/ChangeLog.md | 120 + vendor/sebastian/environment/LICENSE | 33 + vendor/sebastian/environment/README.md | 17 + vendor/sebastian/environment/build.xml | 19 + vendor/sebastian/environment/composer.json | 37 + vendor/sebastian/environment/phpunit.xml | 20 + vendor/sebastian/environment/src/Console.php | 164 + .../environment/src/OperatingSystem.php | 48 + vendor/sebastian/environment/src/Runtime.php | 265 + .../environment/tests/ConsoleTest.php | 64 + .../environment/tests/OperatingSystemTest.php | 60 + .../environment/tests/RuntimeTest.php | 165 + vendor/sebastian/exporter/.github/FUNDING.yml | 1 + vendor/sebastian/exporter/.gitignore | 5 + vendor/sebastian/exporter/.php_cs.dist | 190 + vendor/sebastian/exporter/.travis.yml | 24 + vendor/sebastian/exporter/ChangeLog.md | 15 + vendor/sebastian/exporter/LICENSE | 33 + vendor/sebastian/exporter/README.md | 171 + vendor/sebastian/exporter/build.xml | 19 + vendor/sebastian/exporter/composer.json | 53 + vendor/sebastian/exporter/phpunit.xml | 19 + vendor/sebastian/exporter/src/Exporter.php | 303 + .../sebastian/exporter/tests/ExporterTest.php | 432 + .../sebastian/global-state/.github/stale.yml | 40 + vendor/sebastian/global-state/.gitignore | 6 + vendor/sebastian/global-state/.php_cs.dist | 197 + vendor/sebastian/global-state/.travis.yml | 24 + vendor/sebastian/global-state/ChangeLog.md | 16 + vendor/sebastian/global-state/LICENSE | 33 + vendor/sebastian/global-state/README.md | 16 + vendor/sebastian/global-state/build.xml | 19 + vendor/sebastian/global-state/composer.json | 48 + vendor/sebastian/global-state/phpunit.xml | 27 + .../sebastian/global-state/src/Blacklist.php | 118 + .../global-state/src/CodeExporter.php | 91 + .../sebastian/global-state/src/Restorer.php | 132 + .../sebastian/global-state/src/Snapshot.php | 419 + .../global-state/src/exceptions/Exception.php | 14 + .../src/exceptions/RuntimeException.php | 14 + .../global-state/tests/BlacklistTest.php | 117 + .../global-state/tests/CodeExporterTest.php | 35 + .../global-state/tests/RestorerTest.php | 68 + .../global-state/tests/SnapshotTest.php | 120 + .../tests/_fixture/BlacklistedChildClass.php | 14 + .../tests/_fixture/BlacklistedClass.php | 15 + .../tests/_fixture/BlacklistedImplementor.php | 15 + .../tests/_fixture/BlacklistedInterface.php | 14 + .../tests/_fixture/SnapshotClass.php | 35 + .../tests/_fixture/SnapshotDomDocument.php | 16 + .../tests/_fixture/SnapshotFunctions.php | 14 + .../tests/_fixture/SnapshotTrait.php | 14 + vendor/sebastian/object-enumerator/.gitignore | 8 + vendor/sebastian/object-enumerator/.php_cs | 67 + .../sebastian/object-enumerator/.travis.yml | 26 + .../sebastian/object-enumerator/ChangeLog.md | 53 + vendor/sebastian/object-enumerator/LICENSE | 33 + vendor/sebastian/object-enumerator/README.md | 14 + vendor/sebastian/object-enumerator/build.xml | 22 + .../sebastian/object-enumerator/composer.json | 35 + .../sebastian/object-enumerator/phpunit.xml | 20 + .../object-enumerator/src/Enumerator.php | 85 + .../object-enumerator/src/Exception.php | 15 + .../src/InvalidArgumentException.php | 15 + .../tests/EnumeratorTest.php | 139 + .../tests/_fixture/ExceptionThrower.php | 28 + vendor/sebastian/object-reflector/.gitignore | 4 + vendor/sebastian/object-reflector/.php_cs | 79 + vendor/sebastian/object-reflector/.travis.yml | 26 + .../sebastian/object-reflector/ChangeLog.md | 20 + vendor/sebastian/object-reflector/LICENSE | 33 + vendor/sebastian/object-reflector/README.md | 14 + vendor/sebastian/object-reflector/build.xml | 22 + .../sebastian/object-reflector/composer.json | 33 + vendor/sebastian/object-reflector/phpunit.xml | 19 + .../object-reflector/src/Exception.php | 17 + .../src/InvalidArgumentException.php | 17 + .../object-reflector/src/ObjectReflector.php | 51 + .../tests/ObjectReflectorTest.php | 70 + .../tests/_fixture/ChildClass.php | 25 + .../ClassWithIntegerAttributeName.php | 22 + .../tests/_fixture/ParentClass.php | 20 + vendor/sebastian/recursion-context/.gitignore | 3 + .../sebastian/recursion-context/.travis.yml | 23 + vendor/sebastian/recursion-context/LICENSE | 33 + vendor/sebastian/recursion-context/README.md | 14 + vendor/sebastian/recursion-context/build.xml | 21 + .../sebastian/recursion-context/composer.json | 36 + .../sebastian/recursion-context/phpunit.xml | 19 + .../recursion-context/src/Context.php | 167 + .../recursion-context/src/Exception.php | 17 + .../src/InvalidArgumentException.php | 17 + .../recursion-context/tests/ContextTest.php | 142 + .../resource-operations/.github/stale.yml | 40 + .../sebastian/resource-operations/.gitignore | 5 + .../resource-operations/.php_cs.dist | 191 + .../resource-operations/ChangeLog.md | 26 + vendor/sebastian/resource-operations/LICENSE | 33 + .../sebastian/resource-operations/README.md | 14 + .../sebastian/resource-operations/build.xml | 38 + .../resource-operations/build/generate.php | 65 + .../resource-operations/composer.json | 33 + .../src/ResourceOperations.php | 2232 ++ .../tests/ResourceOperationsTest.php | 26 + vendor/sebastian/type/.gitattributes | 2 + vendor/sebastian/type/.github/FUNDING.yml | 1 + vendor/sebastian/type/.gitignore | 72 + .../inspectionProfiles/Project_Default.xml | 499 + vendor/sebastian/type/.idea/misc.xml | 6 + vendor/sebastian/type/.idea/modules.xml | 8 + .../.idea/php-inspections-ea-ultimate.xml | 20 + vendor/sebastian/type/.idea/php.xml | 42 + vendor/sebastian/type/.idea/type.iml | 40 + vendor/sebastian/type/.idea/vcs.xml | 6 + vendor/sebastian/type/.php_cs.dist | 200 + vendor/sebastian/type/.travis.yml | 53 + vendor/sebastian/type/ChangeLog.md | 38 + vendor/sebastian/type/LICENSE | 33 + vendor/sebastian/type/README.md | 17 + vendor/sebastian/type/build.xml | 31 + vendor/sebastian/type/composer.json | 49 + vendor/sebastian/type/phive.xml | 5 + vendor/sebastian/type/phpunit.xml | 23 + vendor/sebastian/type/psalm.xml | 53 + vendor/sebastian/type/src/CallableType.php | 182 + .../sebastian/type/src/GenericObjectType.php | 46 + vendor/sebastian/type/src/IterableType.php | 67 + vendor/sebastian/type/src/NullType.php | 28 + vendor/sebastian/type/src/ObjectType.php | 63 + vendor/sebastian/type/src/SimpleType.php | 86 + vendor/sebastian/type/src/Type.php | 75 + vendor/sebastian/type/src/TypeName.php | 77 + vendor/sebastian/type/src/UnknownType.php | 28 + vendor/sebastian/type/src/VoidType.php | 28 + .../type/src/exception/Exception.php | 14 + .../type/src/exception/RuntimeException.php | 14 + .../type/tests/_fixture/ChildClass.php | 14 + .../_fixture/ClassWithCallbackMethods.php | 21 + .../tests/_fixture/ClassWithInvokeMethod.php | 17 + .../type/tests/_fixture/Iterator.php | 33 + .../type/tests/_fixture/ParentClass.php | 17 + .../type/tests/_fixture/callback_function.php | 14 + .../type/tests/unit/CallableTypeTest.php | 150 + .../type/tests/unit/GenericObjectTypeTest.php | 86 + .../type/tests/unit/IterableTypeTest.php | 97 + .../type/tests/unit/NullTypeTest.php | 72 + .../type/tests/unit/ObjectTypeTest.php | 140 + .../type/tests/unit/SimpleTypeTest.php | 162 + .../type/tests/unit/TypeNameTest.php | 59 + vendor/sebastian/type/tests/unit/TypeTest.php | 85 + .../type/tests/unit/UnknownTypeTest.php | 58 + .../type/tests/unit/VoidTypeTest.php | 70 + vendor/sebastian/version/.gitattributes | 1 + vendor/sebastian/version/.gitignore | 1 + vendor/sebastian/version/.php_cs | 66 + vendor/sebastian/version/LICENSE | 33 + vendor/sebastian/version/README.md | 43 + vendor/sebastian/version/composer.json | 29 + vendor/sebastian/version/src/Version.php | 109 + .../laravel-permission/.github/FUNDING.yml | 1 + .../.github/workflows/deploy-docs.yml | 21 + .../.github/workflows/run-tests.yml | 48 + vendor/spatie/laravel-permission/CHANGELOG.md | 491 + .../spatie/laravel-permission/CONTRIBUTING.md | 32 + vendor/spatie/laravel-permission/LICENSE.md | 21 + vendor/spatie/laravel-permission/README.md | 96 + .../spatie/laravel-permission/composer.json | 64 + .../laravel-permission/config/permission.php | 143 + .../create_permission_tables.php.stub | 110 + .../spatie/laravel-permission/docs/_index.md | 6 + .../laravel-permission/docs/about-us.md | 16 + .../docs/advanced-usage/_index.md | 4 + .../docs/advanced-usage/cache.md | 47 + .../docs/advanced-usage/exceptions.md | 26 + .../docs/advanced-usage/extending.md | 35 + .../docs/advanced-usage/other.md | 8 + .../docs/advanced-usage/phpstorm.md | 92 + .../docs/advanced-usage/seeding.md | 40 + .../docs/advanced-usage/timestamps.md | 20 + .../docs/advanced-usage/ui-options.md | 18 + .../docs/advanced-usage/unit-testing.md | 18 + .../docs/advanced-usage/uuid.md | 119 + .../docs/basic-usage/_index.md | 4 + .../docs/basic-usage/artisan.md | 54 + .../docs/basic-usage/basic-usage.md | 97 + .../docs/basic-usage/blade-directives.md | 91 + .../docs/basic-usage/direct-permissions.md | 67 + .../docs/basic-usage/middleware.md | 83 + .../docs/basic-usage/multiple-guards.md | 60 + .../docs/basic-usage/new-app.md | 169 + .../docs/basic-usage/role-permissions.md | 140 + .../docs/basic-usage/super-admin.md | 49 + .../docs/basic-usage/wildcard-permissions.md | 68 + .../docs/best-practices/_index.md | 4 + .../docs/best-practices/performance.md | 23 + .../best-practices/roles-vs-permissions.md | 11 + .../docs/best-practices/using-policies.md | 12 + .../laravel-permission/docs/changelog.md | 6 + .../laravel-permission/docs/images/header.jpg | Bin 0 -> 391838 bytes .../docs/installation-laravel.md | 44 + .../docs/installation-lumen.md | 71 + .../laravel-permission/docs/introduction.md | 34 + .../laravel-permission/docs/prerequisites.md | 33 + .../docs/questions-issues.md | 8 + .../laravel-permission/docs/sponsor-logo.png | Bin 0 -> 2987 bytes .../laravel-permission/docs/support-us.md | 8 + .../laravel-permission/docs/upgrading.md | 15 + .../src/Commands/CacheReset.php | 22 + .../src/Commands/CreatePermission.php | 24 + .../src/Commands/CreateRole.php | 50 + .../laravel-permission/src/Commands/Show.php | 54 + .../src/Contracts/Permission.php | 49 + .../laravel-permission/src/Contracts/Role.php | 58 + .../src/Exceptions/GuardDoesNotMatch.php | 14 + .../Exceptions/PermissionAlreadyExists.php | 13 + .../src/Exceptions/PermissionDoesNotExist.php | 18 + .../src/Exceptions/RoleAlreadyExists.php | 13 + .../src/Exceptions/RoleDoesNotExist.php | 18 + .../src/Exceptions/UnauthorizedException.php | 72 + .../WildcardPermissionInvalidArgument.php | 13 + ...WildcardPermissionNotProperlyFormatted.php | 13 + .../spatie/laravel-permission/src/Guard.php | 55 + .../src/Middlewares/PermissionMiddleware.php | 28 + .../src/Middlewares/RoleMiddleware.php | 27 + .../RoleOrPermissionMiddleware.php | 27 + .../src/Models/Permission.php | 145 + .../laravel-permission/src/Models/Role.php | 158 + .../src/PermissionRegistrar.php | 179 + .../src/PermissionServiceProvider.php | 170 + .../src/Traits/HasPermissions.php | 496 + .../src/Traits/HasRoles.php | 306 + .../src/Traits/RefreshesPermissionCache.php | 19 + .../src/WildcardPermission.php | 124 + .../spatie/laravel-permission/src/helpers.php | 20 + vendor/swiftmailer/swiftmailer/.gitattributes | 9 + .../swiftmailer/.github/ISSUE_TEMPLATE.md | 19 + .../.github/PULL_REQUEST_TEMPLATE.md | 14 + vendor/swiftmailer/swiftmailer/.gitignore | 8 + vendor/swiftmailer/swiftmailer/.php_cs.dist | 16 + vendor/swiftmailer/swiftmailer/.travis.yml | 26 + vendor/swiftmailer/swiftmailer/CHANGES | 354 + vendor/swiftmailer/swiftmailer/LICENSE | 19 + vendor/swiftmailer/swiftmailer/README.md | 19 + vendor/swiftmailer/swiftmailer/composer.json | 43 + .../swiftmailer/swiftmailer/doc/headers.rst | 621 + vendor/swiftmailer/swiftmailer/doc/index.rst | 12 + .../swiftmailer/doc/introduction.rst | 61 + .../swiftmailer/swiftmailer/doc/japanese.rst | 19 + .../swiftmailer/swiftmailer/doc/messages.rst | 947 + .../swiftmailer/swiftmailer/doc/plugins.rst | 337 + .../swiftmailer/swiftmailer/doc/sending.rst | 453 + .../swiftmailer/lib/classes/Swift.php | 78 + .../lib/classes/Swift/AddressEncoder.php | 25 + .../AddressEncoder/IdnAddressEncoder.php | 50 + .../AddressEncoder/Utf8AddressEncoder.php | 36 + .../classes/Swift/AddressEncoderException.php | 32 + .../lib/classes/Swift/Attachment.php | 54 + .../AbstractFilterableInputStream.php | 176 + .../Swift/ByteStream/ArrayByteStream.php | 178 + .../Swift/ByteStream/FileByteStream.php | 216 + .../ByteStream/TemporaryFileByteStream.php | 42 + .../lib/classes/Swift/CharacterReader.php | 67 + .../GenericFixedWidthReader.php | 97 + .../Swift/CharacterReader/UsAsciiReader.php | 84 + .../Swift/CharacterReader/Utf8Reader.php | 176 + .../classes/Swift/CharacterReaderFactory.php | 26 + .../SimpleCharacterReaderFactory.php | 124 + .../lib/classes/Swift/CharacterStream.php | 89 + .../CharacterStream/ArrayCharacterStream.php | 291 + .../CharacterStream/NgCharacterStream.php | 262 + .../lib/classes/Swift/ConfigurableSpool.php | 63 + .../lib/classes/Swift/DependencyContainer.php | 391 + .../lib/classes/Swift/DependencyException.php | 27 + .../lib/classes/Swift/EmbeddedFile.php | 53 + .../swiftmailer/lib/classes/Swift/Encoder.php | 28 + .../classes/Swift/Encoder/Base64Encoder.php | 58 + .../lib/classes/Swift/Encoder/QpEncoder.php | 300 + .../classes/Swift/Encoder/Rfc2231Encoder.php | 90 + .../lib/classes/Swift/Events/CommandEvent.php | 64 + .../classes/Swift/Events/CommandListener.php | 24 + .../lib/classes/Swift/Events/Event.php | 38 + .../classes/Swift/Events/EventDispatcher.php | 83 + .../classes/Swift/Events/EventListener.php | 18 + .../lib/classes/Swift/Events/EventObject.php | 61 + .../classes/Swift/Events/ResponseEvent.php | 64 + .../classes/Swift/Events/ResponseListener.php | 24 + .../lib/classes/Swift/Events/SendEvent.php | 126 + .../lib/classes/Swift/Events/SendListener.php | 31 + .../Swift/Events/SimpleEventDispatcher.php | 143 + .../Swift/Events/TransportChangeEvent.php | 27 + .../Swift/Events/TransportChangeListener.php | 45 + .../Swift/Events/TransportExceptionEvent.php | 43 + .../Events/TransportExceptionListener.php | 24 + .../lib/classes/Swift/FailoverTransport.php | 33 + .../lib/classes/Swift/FileSpool.php | 208 + .../lib/classes/Swift/FileStream.php | 24 + .../lib/classes/Swift/Filterable.php | 32 + .../lib/classes/Swift/IdGenerator.php | 22 + .../swiftmailer/lib/classes/Swift/Image.php | 43 + .../lib/classes/Swift/InputByteStream.php | 75 + .../lib/classes/Swift/IoException.php | 28 + .../lib/classes/Swift/KeyCache.php | 105 + .../classes/Swift/KeyCache/ArrayKeyCache.php | 203 + .../classes/Swift/KeyCache/DiskKeyCache.php | 295 + .../Swift/KeyCache/KeyCacheInputStream.php | 51 + .../classes/Swift/KeyCache/NullKeyCache.php | 113 + .../KeyCache/SimpleKeyCacheInputStream.php | 123 + .../classes/Swift/LoadBalancedTransport.php | 33 + .../swiftmailer/lib/classes/Swift/Mailer.php | 98 + .../Swift/Mailer/ArrayRecipientIterator.php | 53 + .../Swift/Mailer/RecipientIterator.php | 32 + .../lib/classes/Swift/MemorySpool.php | 110 + .../swiftmailer/lib/classes/Swift/Message.php | 279 + .../lib/classes/Swift/Mime/Attachment.php | 144 + .../classes/Swift/Mime/CharsetObserver.php | 24 + .../lib/classes/Swift/Mime/ContentEncoder.php | 34 + .../ContentEncoder/Base64ContentEncoder.php | 101 + .../ContentEncoder/NativeQpContentEncoder.php | 123 + .../ContentEncoder/NullContentEncoder.php | 79 + .../ContentEncoder/PlainContentEncoder.php | 164 + .../Mime/ContentEncoder/QpContentEncoder.php | 134 + .../ContentEncoder/QpContentEncoderProxy.php | 96 + .../Mime/ContentEncoder/RawContentEncoder.php | 65 + .../lib/classes/Swift/Mime/EmbeddedFile.php | 41 + .../classes/Swift/Mime/EncodingObserver.php | 24 + .../lib/classes/Swift/Mime/Header.php | 93 + .../lib/classes/Swift/Mime/HeaderEncoder.php | 24 + .../HeaderEncoder/Base64HeaderEncoder.php | 55 + .../Mime/HeaderEncoder/QpHeaderEncoder.php | 65 + .../Swift/Mime/Headers/AbstractHeader.php | 476 + .../classes/Swift/Mime/Headers/DateHeader.php | 113 + .../Mime/Headers/IdentificationHeader.php | 186 + .../Swift/Mime/Headers/MailboxHeader.php | 360 + .../Swift/Mime/Headers/OpenDKIMHeader.php | 135 + .../Mime/Headers/ParameterizedHeader.php | 255 + .../classes/Swift/Mime/Headers/PathHeader.php | 155 + .../Swift/Mime/Headers/UnstructuredHeader.php | 109 + .../lib/classes/Swift/Mime/IdGenerator.php | 54 + .../lib/classes/Swift/Mime/MimePart.php | 199 + .../Swift/Mime/SimpleHeaderFactory.php | 195 + .../classes/Swift/Mime/SimpleHeaderSet.php | 399 + .../lib/classes/Swift/Mime/SimpleMessage.php | 642 + .../classes/Swift/Mime/SimpleMimeEntity.php | 820 + .../lib/classes/Swift/MimePart.php | 45 + .../lib/classes/Swift/NullTransport.php | 26 + .../lib/classes/Swift/OutputByteStream.php | 46 + .../classes/Swift/Plugins/AntiFloodPlugin.php | 137 + .../Swift/Plugins/BandwidthMonitorPlugin.php | 154 + .../Swift/Plugins/Decorator/Replacements.php | 31 + .../classes/Swift/Plugins/DecoratorPlugin.php | 200 + .../Swift/Plugins/ImpersonatePlugin.php | 65 + .../lib/classes/Swift/Plugins/Logger.php | 36 + .../classes/Swift/Plugins/LoggerPlugin.php | 126 + .../Swift/Plugins/Loggers/ArrayLogger.php | 72 + .../Swift/Plugins/Loggers/EchoLogger.php | 58 + .../classes/Swift/Plugins/MessageLogger.php | 70 + .../Swift/Plugins/Pop/Pop3Connection.php | 31 + .../Swift/Plugins/Pop/Pop3Exception.php | 27 + .../Swift/Plugins/PopBeforeSmtpPlugin.php | 254 + .../Swift/Plugins/RedirectingPlugin.php | 201 + .../lib/classes/Swift/Plugins/Reporter.php | 32 + .../classes/Swift/Plugins/ReporterPlugin.php | 57 + .../Swift/Plugins/Reporters/HitReporter.php | 58 + .../Swift/Plugins/Reporters/HtmlReporter.php | 38 + .../lib/classes/Swift/Plugins/Sleeper.php | 24 + .../classes/Swift/Plugins/ThrottlerPlugin.php | 196 + .../lib/classes/Swift/Plugins/Timer.php | 24 + .../lib/classes/Swift/Preferences.php | 100 + .../Swift/ReplacementFilterFactory.php | 27 + .../classes/Swift/RfcComplianceException.php | 27 + .../lib/classes/Swift/SendmailTransport.php | 33 + .../swiftmailer/lib/classes/Swift/Signer.php | 19 + .../lib/classes/Swift/Signers/BodySigner.php | 33 + .../lib/classes/Swift/Signers/DKIMSigner.php | 682 + .../classes/Swift/Signers/DomainKeySigner.php | 504 + .../classes/Swift/Signers/HeaderSigner.php | 65 + .../classes/Swift/Signers/OpenDKIMSigner.php | 183 + .../lib/classes/Swift/Signers/SMimeSigner.php | 542 + .../lib/classes/Swift/SmtpTransport.php | 42 + .../swiftmailer/lib/classes/Swift/Spool.php | 53 + .../lib/classes/Swift/SpoolTransport.php | 33 + .../lib/classes/Swift/StreamFilter.php | 35 + .../ByteArrayReplacementFilter.php | 166 + .../StreamFilters/StringReplacementFilter.php | 70 + .../StringReplacementFilterFactory.php | 45 + .../lib/classes/Swift/SwiftException.php | 28 + .../lib/classes/Swift/Transport.php | 79 + .../Swift/Transport/AbstractSmtpTransport.php | 543 + .../Esmtp/Auth/CramMd5Authenticator.php | 75 + .../Esmtp/Auth/LoginAuthenticator.php | 45 + .../Esmtp/Auth/NTLMAuthenticator.php | 681 + .../Esmtp/Auth/PlainAuthenticator.php | 44 + .../Esmtp/Auth/XOAuth2Authenticator.php | 64 + .../Swift/Transport/Esmtp/AuthHandler.php | 268 + .../Swift/Transport/Esmtp/Authenticator.php | 37 + .../Transport/Esmtp/EightBitMimeHandler.php | 113 + .../Swift/Transport/Esmtp/SmtpUtf8Handler.php | 107 + .../classes/Swift/Transport/EsmtpHandler.php | 86 + .../Swift/Transport/EsmtpTransport.php | 446 + .../Swift/Transport/FailoverTransport.php | 105 + .../lib/classes/Swift/Transport/IoBuffer.php | 67 + .../Swift/Transport/LoadBalancedTransport.php | 194 + .../classes/Swift/Transport/NullTransport.php | 98 + .../Swift/Transport/SendmailTransport.php | 158 + .../lib/classes/Swift/Transport/SmtpAgent.php | 36 + .../Swift/Transport/SpoolTransport.php | 120 + .../classes/Swift/Transport/StreamBuffer.php | 329 + .../lib/classes/Swift/TransportException.php | 28 + .../lib/dependency_maps/cache_deps.php | 23 + .../lib/dependency_maps/message_deps.php | 9 + .../lib/dependency_maps/mime_deps.php | 134 + .../lib/dependency_maps/transport_deps.php | 97 + .../swiftmailer/lib/mime_types.php | 1007 + .../swiftmailer/lib/preferences.php | 19 + .../swiftmailer/lib/swift_required.php | 22 + .../lib/swiftmailer_generate_mimes_config.php | 182 + .../swiftmailer/swiftmailer/phpunit.xml.dist | 38 + .../tests/IdenticalBinaryConstraint.php | 62 + .../swiftmailer/tests/StreamCollector.php | 11 + .../tests/SwiftMailerSmokeTestCase.php | 46 + .../swiftmailer/tests/SwiftMailerTestCase.php | 38 + .../_samples/charsets/iso-2022-jp/one.txt | 11 + .../_samples/charsets/iso-8859-1/one.txt | 19 + .../tests/_samples/charsets/utf-8/one.txt | 22 + .../tests/_samples/charsets/utf-8/three.txt | 45 + .../tests/_samples/charsets/utf-8/two.txt | 3 + .../tests/_samples/dkim/dkim.test.priv | 15 + .../tests/_samples/dkim/dkim.test.pub | 6 + .../swiftmailer/tests/_samples/files/data.txt | 1 + .../tests/_samples/files/swiftmailer.png | Bin 0 -> 3194 bytes .../tests/_samples/files/textfile.zip | Bin 0 -> 202 bytes .../swiftmailer/tests/_samples/smime/CA.srl | 1 + .../swiftmailer/tests/_samples/smime/ca.crt | 21 + .../swiftmailer/tests/_samples/smime/ca.key | 27 + .../tests/_samples/smime/create-cert.sh | 40 + .../tests/_samples/smime/encrypt.crt | 19 + .../tests/_samples/smime/encrypt.key | 27 + .../tests/_samples/smime/encrypt2.crt | 19 + .../tests/_samples/smime/encrypt2.key | 27 + .../tests/_samples/smime/intermediate.crt | 19 + .../tests/_samples/smime/intermediate.key | 27 + .../swiftmailer/tests/_samples/smime/sign.crt | 19 + .../swiftmailer/tests/_samples/smime/sign.key | 27 + .../tests/_samples/smime/sign2.crt | 19 + .../tests/_samples/smime/sign2.key | 27 + .../tests/acceptance.conf.php.default | 37 + .../Swift/AttachmentAcceptanceTest.php | 12 + .../FileByteStreamAcceptanceTest.php | 162 + ...leCharacterReaderFactoryAcceptanceTest.php | 179 + .../DependencyContainerAcceptanceTest.php | 22 + .../Swift/EmbeddedFileAcceptanceTest.php | 12 + .../Encoder/Base64EncoderAcceptanceTest.php | 45 + .../Swift/Encoder/QpEncoderAcceptanceTest.php | 54 + .../Encoder/Rfc2231EncoderAcceptanceTest.php | 50 + .../KeyCache/ArrayKeyCacheAcceptanceTest.php | 173 + .../KeyCache/DiskKeyCacheAcceptanceTest.php | 173 + .../Swift/MessageAcceptanceTest.php | 55 + .../Swift/Mime/AttachmentAcceptanceTest.php | 126 + .../Base64ContentEncoderAcceptanceTest.php | 56 + .../NativeQpContentEncoderAcceptanceTest.php | 88 + .../PlainContentEncoderAcceptanceTest.php | 88 + .../QpContentEncoderAcceptanceTest.php | 160 + .../Swift/Mime/EmbeddedFileAcceptanceTest.php | 139 + .../Base64HeaderEncoderAcceptanceTest.php | 32 + .../Swift/Mime/MimePartAcceptanceTest.php | 130 + .../Mime/SimpleMessageAcceptanceTest.php | 1250 + .../Swift/MimePartAcceptanceTest.php | 15 + .../AbstractStreamBufferAcceptanceTest.php | 131 + .../BasicSocketAcceptanceTest.php | 33 + .../StreamBuffer/ProcessAcceptanceTest.php | 26 + .../StreamBuffer/SocketTimeoutTest.php | 65 + .../StreamBuffer/SslSocketAcceptanceTest.php | 40 + .../StreamBuffer/TlsSocketAcceptanceTest.php | 39 + .../swiftmailer/tests/bootstrap.php | 21 + .../tests/bug/Swift/Bug111Test.php | 42 + .../tests/bug/Swift/Bug118Test.php | 20 + .../tests/bug/Swift/Bug206Test.php | 40 + .../tests/bug/Swift/Bug274Test.php | 25 + .../swiftmailer/tests/bug/Swift/Bug34Test.php | 75 + .../swiftmailer/tests/bug/Swift/Bug35Test.php | 73 + .../swiftmailer/tests/bug/Swift/Bug38Test.php | 192 + .../tests/bug/Swift/Bug518Test.php | 38 + .../swiftmailer/tests/bug/Swift/Bug51Test.php | 110 + .../tests/bug/Swift/Bug534Test.php | 38 + .../tests/bug/Swift/Bug650Test.php | 38 + .../swiftmailer/tests/bug/Swift/Bug71Test.php | 20 + .../swiftmailer/tests/bug/Swift/Bug76Test.php | 71 + ...FileByteStreamConsecutiveReadCallsTest.php | 18 + .../tests/fixtures/MimeEntityFixture.php | 67 + .../swiftmailer/tests/smoke.conf.php.default | 63 + .../smoke/Swift/Smoke/AttachmentSmokeTest.php | 33 + .../smoke/Swift/Smoke/BasicSmokeTest.php | 23 + .../Smoke/HtmlWithAttachmentSmokeTest.php | 33 + .../Swift/Smoke/InternationalSmokeTest.php | 40 + .../Swift/ByteStream/ArrayByteStreamTest.php | 202 + .../GenericFixedWidthReaderTest.php | 43 + .../CharacterReader/UsAsciiReaderTest.php | 52 + .../Swift/CharacterReader/Utf8ReaderTest.php | 65 + .../ArrayCharacterStreamTest.php | 358 + .../unit/Swift/DependencyContainerTest.php | 191 + .../unit/Swift/Encoder/Base64EncoderTest.php | 173 + .../unit/Swift/Encoder/QpEncoderTest.php | 400 + .../unit/Swift/Encoder/Rfc2231EncoderTest.php | 141 + .../unit/Swift/Events/CommandEventTest.php | 34 + .../unit/Swift/Events/EventObjectTest.php | 32 + .../unit/Swift/Events/ResponseEventTest.php | 38 + .../tests/unit/Swift/Events/SendEventTest.php | 96 + .../Events/SimpleEventDispatcherTest.php | 142 + .../Swift/Events/TransportChangeEventTest.php | 30 + .../Events/TransportExceptionEventTest.php | 41 + .../unit/Swift/KeyCache/ArrayKeyCacheTest.php | 240 + .../SimpleKeyCacheInputStreamTest.php | 73 + .../Mailer/ArrayRecipientIteratorTest.php | 42 + .../tests/unit/Swift/MailerTest.php | 145 + .../tests/unit/Swift/MessageTest.php | 133 + .../Swift/Mime/AbstractMimeEntityTest.php | 1092 + .../tests/unit/Swift/Mime/AttachmentTest.php | 321 + .../Base64ContentEncoderTest.php | 323 + .../PlainContentEncoderTest.php | 171 + .../ContentEncoder/QpContentEncoderTest.php | 516 + .../unit/Swift/Mime/EmbeddedFileTest.php | 59 + .../HeaderEncoder/Base64HeaderEncoderTest.php | 13 + .../HeaderEncoder/QpHeaderEncoderTest.php | 221 + .../Swift/Mime/Headers/DateHeaderTest.php | 90 + .../Mime/Headers/IdentificationHeaderTest.php | 192 + .../Swift/Mime/Headers/MailboxHeaderTest.php | 367 + .../Mime/Headers/ParameterizedHeaderTest.php | 396 + .../Swift/Mime/Headers/PathHeaderTest.php | 95 + .../Mime/Headers/UnstructuredHeaderTest.php | 353 + .../tests/unit/Swift/Mime/IdGeneratorTest.php | 32 + .../tests/unit/Swift/Mime/MimePartTest.php | 234 + .../Swift/Mime/SimpleHeaderFactoryTest.php | 169 + .../unit/Swift/Mime/SimpleHeaderSetTest.php | 734 + .../unit/Swift/Mime/SimpleMessageTest.php | 837 + .../unit/Swift/Mime/SimpleMimeEntityTest.php | 12 + .../Swift/Plugins/AntiFloodPluginTest.php | 93 + .../Plugins/BandwidthMonitorPluginTest.php | 128 + .../Swift/Plugins/DecoratorPluginTest.php | 284 + .../unit/Swift/Plugins/LoggerPluginTest.php | 188 + .../Swift/Plugins/Loggers/ArrayLoggerTest.php | 65 + .../Swift/Plugins/Loggers/EchoLoggerTest.php | 24 + .../Swift/Plugins/PopBeforeSmtpPluginTest.php | 101 + .../Swift/Plugins/RedirectingPluginTest.php | 183 + .../unit/Swift/Plugins/ReporterPluginTest.php | 86 + .../Plugins/Reporters/HitReporterTest.php | 64 + .../Plugins/Reporters/HtmlReporterTest.php | 54 + .../Swift/Plugins/ThrottlerPluginTest.php | 102 + .../unit/Swift/Signers/DKIMSignerTest.php | 220 + .../unit/Swift/Signers/OpenDKIMSignerTest.php | 45 + .../unit/Swift/Signers/SMimeSignerTest.php | 653 + .../ByteArrayReplacementFilterTest.php | 129 + .../StringReplacementFilterFactoryTest.php | 36 + .../StringReplacementFilterTest.php | 59 + .../AbstractSmtpEventSupportTest.php | 558 + .../unit/Swift/Transport/AbstractSmtpTest.php | 1400 + .../Esmtp/Auth/CramMd5AuthenticatorTest.php | 65 + .../Esmtp/Auth/LoginAuthenticatorTest.php | 65 + .../Esmtp/Auth/NTLMAuthenticatorTest.php | 204 + .../Esmtp/Auth/PlainAuthenticatorTest.php | 68 + .../Swift/Transport/Esmtp/AuthHandlerTest.php | 165 + .../EsmtpTransport/ExtensionSupportTest.php | 561 + .../Swift/Transport/EsmtpTransportTest.php | 651 + .../Swift/Transport/FailoverTransportTest.php | 600 + .../Transport/LoadBalancedTransportTest.php | 838 + .../Swift/Transport/SendmailTransportTest.php | 150 + .../unit/Swift/Transport/StreamBufferTest.php | 43 + vendor/symfony/console/Application.php | 1174 + vendor/symfony/console/CHANGELOG.md | 185 + vendor/symfony/console/Command/Command.php | 648 + .../symfony/console/Command/HelpCommand.php | 83 + .../symfony/console/Command/ListCommand.php | 89 + .../symfony/console/Command/LockableTrait.php | 69 + .../CommandLoader/CommandLoaderInterface.php | 42 + .../CommandLoader/ContainerCommandLoader.php | 63 + .../CommandLoader/FactoryCommandLoader.php | 62 + vendor/symfony/console/ConsoleEvents.php | 47 + vendor/symfony/console/Cursor.php | 168 + .../AddConsoleCommandPass.php | 102 + .../Descriptor/ApplicationDescription.php | 143 + .../symfony/console/Descriptor/Descriptor.php | 104 + .../Descriptor/DescriptorInterface.php | 29 + .../console/Descriptor/JsonDescriptor.php | 156 + .../console/Descriptor/MarkdownDescriptor.php | 188 + .../console/Descriptor/TextDescriptor.php | 342 + .../console/Descriptor/XmlDescriptor.php | 231 + .../console/Event/ConsoleCommandEvent.php | 51 + .../console/Event/ConsoleErrorEvent.php | 58 + vendor/symfony/console/Event/ConsoleEvent.php | 67 + .../console/Event/ConsoleTerminateEvent.php | 43 + .../console/EventListener/ErrorListener.php | 95 + .../Exception/CommandNotFoundException.php | 43 + .../console/Exception/ExceptionInterface.php | 21 + .../Exception/InvalidArgumentException.php | 19 + .../Exception/InvalidOptionException.php | 21 + .../console/Exception/LogicException.php | 19 + .../Exception/MissingInputException.php | 21 + .../Exception/NamespaceNotFoundException.php | 21 + .../console/Exception/RuntimeException.php | 19 + .../console/Formatter/NullOutputFormatter.php | 72 + .../Formatter/NullOutputFormatterStyle.php | 65 + .../console/Formatter/OutputFormatter.php | 275 + .../Formatter/OutputFormatterInterface.php | 58 + .../Formatter/OutputFormatterStyle.php | 196 + .../OutputFormatterStyleInterface.php | 52 + .../Formatter/OutputFormatterStyleStack.php | 110 + .../WrappableOutputFormatterInterface.php | 25 + .../console/Helper/DebugFormatterHelper.php | 107 + .../console/Helper/DescriptorHelper.php | 87 + vendor/symfony/console/Helper/Dumper.php | 64 + .../console/Helper/FormatterHelper.php | 92 + vendor/symfony/console/Helper/Helper.php | 132 + .../console/Helper/HelperInterface.php | 39 + vendor/symfony/console/Helper/HelperSet.php | 98 + .../console/Helper/InputAwareHelper.php | 33 + .../symfony/console/Helper/ProcessHelper.php | 148 + vendor/symfony/console/Helper/ProgressBar.php | 600 + .../console/Helper/ProgressIndicator.php | 254 + .../symfony/console/Helper/QuestionHelper.php | 527 + .../console/Helper/SymfonyQuestionHelper.php | 96 + vendor/symfony/console/Helper/Table.php | 836 + vendor/symfony/console/Helper/TableCell.php | 68 + vendor/symfony/console/Helper/TableRows.php | 32 + .../symfony/console/Helper/TableSeparator.php | 25 + vendor/symfony/console/Helper/TableStyle.php | 364 + vendor/symfony/console/Input/ArgvInput.php | 349 + vendor/symfony/console/Input/ArrayInput.php | 202 + vendor/symfony/console/Input/Input.php | 201 + .../symfony/console/Input/InputArgument.php | 129 + .../console/Input/InputAwareInterface.php | 26 + .../symfony/console/Input/InputDefinition.php | 390 + .../symfony/console/Input/InputInterface.php | 153 + vendor/symfony/console/Input/InputOption.php | 208 + .../Input/StreamableInputInterface.php | 37 + vendor/symfony/console/Input/StringInput.php | 68 + vendor/symfony/console/LICENSE | 19 + .../symfony/console/Logger/ConsoleLogger.php | 126 + .../symfony/console/Output/BufferedOutput.php | 45 + .../symfony/console/Output/ConsoleOutput.php | 159 + .../console/Output/ConsoleOutputInterface.php | 32 + .../console/Output/ConsoleSectionOutput.php | 143 + vendor/symfony/console/Output/NullOutput.php | 128 + vendor/symfony/console/Output/Output.php | 174 + .../console/Output/OutputInterface.php | 110 + .../symfony/console/Output/StreamOutput.php | 115 + .../console/Question/ChoiceQuestion.php | 182 + .../console/Question/ConfirmationQuestion.php | 57 + vendor/symfony/console/Question/Question.php | 282 + vendor/symfony/console/README.md | 20 + .../console/Resources/bin/hiddeninput.exe | Bin 0 -> 9216 bytes .../console/SingleCommandApplication.php | 55 + vendor/symfony/console/Style/OutputStyle.php | 153 + .../symfony/console/Style/StyleInterface.php | 132 + vendor/symfony/console/Style/SymfonyStyle.php | 499 + vendor/symfony/console/Terminal.php | 169 + .../console/Tester/ApplicationTester.php | 67 + .../symfony/console/Tester/CommandTester.php | 78 + vendor/symfony/console/Tester/TesterTrait.php | 178 + vendor/symfony/console/composer.json | 63 + vendor/symfony/css-selector/CHANGELOG.md | 18 + .../css-selector/CssSelectorConverter.php | 69 + .../Exception/ExceptionInterface.php | 24 + .../Exception/ExpressionErrorException.php | 24 + .../Exception/InternalErrorException.php | 24 + .../css-selector/Exception/ParseException.php | 24 + .../Exception/SyntaxErrorException.php | 65 + vendor/symfony/css-selector/LICENSE | 19 + .../css-selector/Node/AbstractNode.php | 39 + .../css-selector/Node/AttributeNode.php | 85 + .../symfony/css-selector/Node/ClassNode.php | 60 + .../Node/CombinedSelectorNode.php | 69 + .../symfony/css-selector/Node/ElementNode.php | 62 + .../css-selector/Node/FunctionNode.php | 79 + vendor/symfony/css-selector/Node/HashNode.php | 60 + .../css-selector/Node/NegationNode.php | 60 + .../css-selector/Node/NodeInterface.php | 31 + .../symfony/css-selector/Node/PseudoNode.php | 60 + .../css-selector/Node/SelectorNode.php | 60 + .../symfony/css-selector/Node/Specificity.php | 73 + .../Parser/Handler/CommentHandler.php | 48 + .../Parser/Handler/HandlerInterface.php | 30 + .../Parser/Handler/HashHandler.php | 58 + .../Parser/Handler/IdentifierHandler.php | 58 + .../Parser/Handler/NumberHandler.php | 54 + .../Parser/Handler/StringHandler.php | 77 + .../Parser/Handler/WhitespaceHandler.php | 46 + vendor/symfony/css-selector/Parser/Parser.php | 353 + .../css-selector/Parser/ParserInterface.php | 34 + vendor/symfony/css-selector/Parser/Reader.php | 86 + .../Parser/Shortcut/ClassParser.php | 51 + .../Parser/Shortcut/ElementParser.php | 47 + .../Parser/Shortcut/EmptyStringParser.php | 46 + .../Parser/Shortcut/HashParser.php | 51 + vendor/symfony/css-selector/Parser/Token.php | 111 + .../css-selector/Parser/TokenStream.php | 171 + .../Parser/Tokenizer/Tokenizer.php | 73 + .../Parser/Tokenizer/TokenizerEscaping.php | 65 + .../Parser/Tokenizer/TokenizerPatterns.php | 89 + vendor/symfony/css-selector/README.md | 20 + .../XPath/Extension/AbstractExtension.php | 65 + .../Extension/AttributeMatchingExtension.php | 119 + .../XPath/Extension/CombinationExtension.php | 71 + .../XPath/Extension/ExtensionInterface.php | 67 + .../XPath/Extension/FunctionExtension.php | 171 + .../XPath/Extension/HtmlExtension.php | 187 + .../XPath/Extension/NodeExtension.php | 197 + .../XPath/Extension/PseudoClassExtension.php | 122 + .../symfony/css-selector/XPath/Translator.php | 230 + .../XPath/TranslatorInterface.php | 37 + .../symfony/css-selector/XPath/XPathExpr.php | 102 + vendor/symfony/css-selector/composer.json | 37 + .../symfony/deprecation-contracts/.gitignore | 3 + .../deprecation-contracts/CHANGELOG.md | 5 + vendor/symfony/deprecation-contracts/LICENSE | 19 + .../symfony/deprecation-contracts/README.md | 26 + .../deprecation-contracts/composer.json | 35 + .../deprecation-contracts/function.php | 27 + .../symfony/error-handler/BufferingLogger.php | 58 + vendor/symfony/error-handler/CHANGELOG.md | 13 + vendor/symfony/error-handler/Debug.php | 41 + .../error-handler/DebugClassLoader.php | 1080 + .../Error/ClassNotFoundError.php | 33 + .../error-handler/Error/FatalError.php | 90 + .../error-handler/Error/OutOfMemoryError.php | 16 + .../Error/UndefinedFunctionError.php | 33 + .../Error/UndefinedMethodError.php | 33 + .../ClassNotFoundErrorEnhancer.php | 193 + .../ErrorEnhancer/ErrorEnhancerInterface.php | 20 + .../UndefinedFunctionErrorEnhancer.php | 87 + .../UndefinedMethodErrorEnhancer.php | 69 + vendor/symfony/error-handler/ErrorHandler.php | 784 + .../ErrorRenderer/CliErrorRenderer.php | 49 + .../ErrorRenderer/ErrorRendererInterface.php | 27 + .../ErrorRenderer/HtmlErrorRenderer.php | 354 + .../ErrorRenderer/SerializerErrorRenderer.php | 94 + .../Exception/FlattenException.php | 400 + .../Exception/SilencedErrorContext.php | 67 + vendor/symfony/error-handler/LICENSE | 19 + vendor/symfony/error-handler/README.md | 41 + .../Resources/assets/css/error.css | 4 + .../Resources/assets/css/exception.css | 250 + .../Resources/assets/css/exception_full.css | 128 + .../Resources/assets/images/chevron-right.svg | 1 + .../assets/images/favicon.png.base64 | 1 + .../Resources/assets/images/icon-book.svg | 1 + .../assets/images/icon-minus-square-o.svg | 1 + .../assets/images/icon-minus-square.svg | 1 + .../assets/images/icon-plus-square-o.svg | 1 + .../assets/images/icon-plus-square.svg | 1 + .../Resources/assets/images/icon-support.svg | 1 + .../assets/images/symfony-ghost.svg.php | 1 + .../Resources/assets/images/symfony-logo.svg | 1 + .../Resources/assets/js/exception.js | 279 + .../Resources/views/error.html.php | 20 + .../Resources/views/exception.html.php | 116 + .../Resources/views/exception_full.html.php | 49 + .../Resources/views/logs.html.php | 45 + .../Resources/views/trace.html.php | 40 + .../Resources/views/traces.html.php | 42 + .../Resources/views/traces_text.html.php | 43 + .../symfony/error-handler/ThrowableUtils.php | 35 + vendor/symfony/error-handler/composer.json | 41 + .../event-dispatcher-contracts/.gitignore | 3 + .../event-dispatcher-contracts/CHANGELOG.md | 5 + .../event-dispatcher-contracts/Event.php | 54 + .../EventDispatcherInterface.php | 31 + .../event-dispatcher-contracts/LICENSE | 19 + .../event-dispatcher-contracts/README.md | 9 + .../event-dispatcher-contracts/composer.json | 38 + vendor/symfony/event-dispatcher/CHANGELOG.md | 81 + .../Debug/TraceableEventDispatcher.php | 363 + .../Debug/WrappedListener.php | 127 + .../AddEventAliasesPass.php | 42 + .../RegisterListenersPass.php | 226 + .../event-dispatcher/EventDispatcher.php | 280 + .../EventDispatcherInterface.php | 75 + .../EventSubscriberInterface.php | 49 + .../symfony/event-dispatcher/GenericEvent.php | 170 + .../ImmutableEventDispatcher.php | 91 + vendor/symfony/event-dispatcher/LICENSE | 19 + .../LegacyEventDispatcherProxy.php | 31 + vendor/symfony/event-dispatcher/README.md | 15 + vendor/symfony/event-dispatcher/composer.json | 56 + vendor/symfony/finder/CHANGELOG.md | 79 + .../symfony/finder/Comparator/Comparator.php | 91 + .../finder/Comparator/DateComparator.php | 51 + .../finder/Comparator/NumberComparator.php | 79 + .../Exception/AccessDeniedException.php | 19 + .../Exception/DirectoryNotFoundException.php | 19 + vendor/symfony/finder/Finder.php | 797 + vendor/symfony/finder/Gitignore.php | 105 + vendor/symfony/finder/Glob.php | 111 + .../finder/Iterator/CustomFilterIterator.php | 61 + .../Iterator/DateRangeFilterIterator.php | 58 + .../Iterator/DepthRangeFilterIterator.php | 45 + .../ExcludeDirectoryFilterIterator.php | 87 + .../Iterator/FileTypeFilterIterator.php | 53 + .../Iterator/FilecontentFilterIterator.php | 58 + .../Iterator/FilenameFilterIterator.php | 47 + .../Iterator/MultiplePcreFilterIterator.php | 106 + .../finder/Iterator/PathFilterIterator.php | 56 + .../Iterator/RecursiveDirectoryIterator.php | 144 + .../Iterator/SizeRangeFilterIterator.php | 57 + .../finder/Iterator/SortableIterator.php | 101 + vendor/symfony/finder/LICENSE | 19 + vendor/symfony/finder/README.md | 14 + vendor/symfony/finder/SplFileInfo.php | 85 + vendor/symfony/finder/composer.json | 33 + .../symfony/http-foundation/AcceptHeader.php | 168 + .../http-foundation/AcceptHeaderItem.php | 177 + .../http-foundation/BinaryFileResponse.php | 354 + vendor/symfony/http-foundation/CHANGELOG.md | 265 + vendor/symfony/http-foundation/Cookie.php | 411 + .../Exception/BadRequestException.php | 19 + .../Exception/ConflictingHeadersException.php | 21 + .../Exception/RequestExceptionInterface.php | 21 + .../SuspiciousOperationException.php | 20 + .../ExpressionRequestMatcher.php | 47 + .../File/Exception/AccessDeniedException.php | 25 + .../Exception/CannotWriteFileException.php | 21 + .../File/Exception/ExtensionFileException.php | 21 + .../File/Exception/FileException.php | 21 + .../File/Exception/FileNotFoundException.php | 25 + .../File/Exception/FormSizeFileException.php | 21 + .../File/Exception/IniSizeFileException.php | 21 + .../File/Exception/NoFileException.php | 21 + .../File/Exception/NoTmpDirFileException.php | 21 + .../File/Exception/PartialFileException.php | 21 + .../Exception/UnexpectedTypeException.php | 20 + .../File/Exception/UploadException.php | 21 + vendor/symfony/http-foundation/File/File.php | 138 + .../symfony/http-foundation/File/Stream.php | 28 + .../http-foundation/File/UploadedFile.php | 285 + vendor/symfony/http-foundation/FileBag.php | 142 + vendor/symfony/http-foundation/HeaderBag.php | 288 + .../symfony/http-foundation/HeaderUtils.php | 224 + vendor/symfony/http-foundation/InputBag.php | 108 + vendor/symfony/http-foundation/IpUtils.php | 185 + .../symfony/http-foundation/JsonResponse.php | 219 + vendor/symfony/http-foundation/LICENSE | 19 + .../symfony/http-foundation/ParameterBag.php | 219 + vendor/symfony/http-foundation/README.md | 14 + .../http-foundation/RedirectResponse.php | 109 + vendor/symfony/http-foundation/Request.php | 2098 ++ .../http-foundation/RequestMatcher.php | 188 + .../RequestMatcherInterface.php | 27 + .../symfony/http-foundation/RequestStack.php | 103 + vendor/symfony/http-foundation/Response.php | 1273 + .../http-foundation/ResponseHeaderBag.php | 291 + vendor/symfony/http-foundation/ServerBag.php | 99 + .../Session/Attribute/AttributeBag.php | 148 + .../Attribute/AttributeBagInterface.php | 61 + .../Attribute/NamespacedAttributeBag.php | 157 + .../Session/Flash/AutoExpireFlashBag.php | 161 + .../Session/Flash/FlashBag.php | 152 + .../Session/Flash/FlashBagInterface.php | 88 + .../http-foundation/Session/Session.php | 281 + .../Session/SessionBagInterface.php | 46 + .../Session/SessionBagProxy.php | 95 + .../Session/SessionInterface.php | 166 + .../http-foundation/Session/SessionUtils.php | 59 + .../Handler/AbstractSessionHandler.php | 150 + .../Storage/Handler/IdentityMarshaller.php | 42 + .../Handler/MarshallingSessionHandler.php | 100 + .../Handler/MemcachedSessionHandler.php | 119 + .../Handler/MigratingSessionHandler.php | 124 + .../Storage/Handler/MongoDbSessionHandler.php | 187 + .../Handler/NativeFileSessionHandler.php | 55 + .../Storage/Handler/NullSessionHandler.php | 76 + .../Storage/Handler/PdoSessionHandler.php | 899 + .../Storage/Handler/RedisSessionHandler.php | 120 + .../Storage/Handler/SessionHandlerFactory.php | 85 + .../Storage/Handler/StrictSessionHandler.php | 103 + .../Session/Storage/MetadataBag.php | 166 + .../Storage/MockArraySessionStorage.php | 252 + .../Storage/MockFileSessionStorage.php | 148 + .../Session/Storage/NativeSessionStorage.php | 467 + .../Storage/PhpBridgeSessionStorage.php | 64 + .../Session/Storage/Proxy/AbstractProxy.php | 118 + .../Storage/Proxy/SessionHandlerProxy.php | 101 + .../Storage/SessionStorageInterface.php | 131 + .../http-foundation/StreamedResponse.php | 139 + .../Constraint/RequestAttributeValueSame.php | 55 + .../Constraint/ResponseCookieValueSame.php | 85 + .../Test/Constraint/ResponseHasCookie.php | 77 + .../Test/Constraint/ResponseHasHeader.php | 53 + .../Test/Constraint/ResponseHeaderSame.php | 55 + .../Test/Constraint/ResponseIsRedirected.php | 56 + .../Test/Constraint/ResponseIsSuccessful.php | 56 + .../Constraint/ResponseStatusCodeSame.php | 63 + vendor/symfony/http-foundation/UrlHelper.php | 102 + vendor/symfony/http-foundation/composer.json | 45 + vendor/symfony/http-kernel/Bundle/Bundle.php | 163 + .../http-kernel/Bundle/BundleInterface.php | 71 + vendor/symfony/http-kernel/CHANGELOG.md | 281 + .../CacheClearer/CacheClearerInterface.php | 25 + .../CacheClearer/ChainCacheClearer.php | 39 + .../CacheClearer/Psr6CacheClearer.php | 58 + .../http-kernel/CacheWarmer/CacheWarmer.php | 32 + .../CacheWarmer/CacheWarmerAggregate.php | 125 + .../CacheWarmer/CacheWarmerInterface.php | 32 + .../CacheWarmer/WarmableInterface.php | 27 + .../http-kernel/Config/FileLocator.php | 46 + .../Controller/ArgumentResolver.php | 96 + .../ArgumentResolver/DefaultValueResolver.php | 40 + .../NotTaggedControllerValueResolver.php | 81 + .../RequestAttributeValueResolver.php | 40 + .../ArgumentResolver/RequestValueResolver.php | 40 + .../ArgumentResolver/ServiceValueResolver.php | 93 + .../ArgumentResolver/SessionValueResolver.php | 50 + .../TraceableValueResolver.php | 62 + .../VariadicValueResolver.php | 46 + .../Controller/ArgumentResolverInterface.php | 32 + .../ArgumentValueResolverInterface.php | 37 + .../ContainerControllerResolver.php | 76 + .../Controller/ControllerReference.php | 44 + .../Controller/ControllerResolver.php | 220 + .../ControllerResolverInterface.php | 41 + .../Controller/ErrorController.php | 62 + .../Controller/TraceableArgumentResolver.php | 44 + .../TraceableControllerResolver.php | 44 + .../ControllerMetadata/ArgumentMetadata.php | 107 + .../ArgumentMetadataFactory.php | 65 + .../ArgumentMetadataFactoryInterface.php | 27 + .../DataCollector/AjaxDataCollector.php | 40 + .../DataCollector/ConfigDataCollector.php | 306 + .../DataCollector/DataCollector.php | 112 + .../DataCollector/DataCollectorInterface.php | 36 + .../DataCollector/DumpDataCollector.php | 284 + .../DataCollector/EventDataCollector.php | 150 + .../DataCollector/ExceptionDataCollector.php | 114 + .../LateDataCollectorInterface.php | 25 + .../DataCollector/LoggerDataCollector.php | 282 + .../DataCollector/MemoryDataCollector.php | 125 + .../DataCollector/RequestDataCollector.php | 458 + .../DataCollector/RouterDataCollector.php | 108 + .../DataCollector/TimeDataCollector.php | 159 + .../http-kernel/Debug/FileLinkFormatter.php | 106 + .../Debug/TraceableEventDispatcher.php | 90 + .../AddAnnotatedClassesToCachePass.php | 144 + .../ConfigurableExtension.php | 42 + .../ControllerArgumentValueResolverPass.php | 64 + .../DependencyInjection/Extension.php | 44 + .../FragmentRendererPass.php | 63 + .../LazyLoadingFragmentHandler.php | 47 + .../DependencyInjection/LoggerPass.php | 41 + .../MergeExtensionConfigurationPass.php | 41 + ...RegisterControllerArgumentLocatorsPass.php | 214 + .../RegisterLocaleAwareServicesPass.php | 58 + ...oveEmptyControllerArgumentLocatorsPass.php | 75 + .../ResettableServicePass.php | 71 + .../DependencyInjection/ServicesResetter.php | 43 + .../Event/ControllerArgumentsEvent.php | 61 + .../http-kernel/Event/ControllerEvent.php | 48 + .../http-kernel/Event/ExceptionEvent.php | 76 + .../http-kernel/Event/FinishRequestEvent.php | 21 + .../symfony/http-kernel/Event/KernelEvent.php | 80 + .../http-kernel/Event/RequestEvent.php | 58 + .../http-kernel/Event/ResponseEvent.php | 47 + .../http-kernel/Event/TerminateEvent.php | 41 + .../symfony/http-kernel/Event/ViewEvent.php | 61 + .../EventListener/AbstractSessionListener.php | 196 + .../AbstractTestSessionListener.php | 114 + .../AddRequestFormatsListener.php | 52 + .../EventListener/DebugHandlersListener.php | 177 + .../DisallowRobotsIndexingListener.php | 43 + .../EventListener/DumpListener.php | 63 + .../EventListener/ErrorListener.php | 153 + .../EventListener/FragmentListener.php | 99 + .../EventListener/LocaleAwareListener.php | 77 + .../EventListener/LocaleListener.php | 88 + .../EventListener/ProfilerListener.php | 127 + .../EventListener/ResponseListener.php | 58 + .../EventListener/RouterListener.php | 175 + .../EventListener/SessionListener.php | 52 + .../StreamedResponseListener.php | 51 + .../EventListener/SurrogateListener.php | 67 + .../EventListener/TestSessionListener.php | 42 + .../EventListener/ValidateRequestListener.php | 55 + .../Exception/AccessDeniedHttpException.php | 29 + .../Exception/BadRequestHttpException.php | 28 + .../Exception/ConflictHttpException.php | 28 + ...ntrollerDoesNotReturnResponseException.php | 84 + .../Exception/GoneHttpException.php | 28 + .../http-kernel/Exception/HttpException.php | 51 + .../Exception/HttpExceptionInterface.php | 34 + .../Exception/LengthRequiredHttpException.php | 28 + .../MethodNotAllowedHttpException.php | 31 + .../Exception/NotAcceptableHttpException.php | 28 + .../Exception/NotFoundHttpException.php | 28 + .../PreconditionFailedHttpException.php | 28 + .../PreconditionRequiredHttpException.php | 30 + .../ServiceUnavailableHttpException.php | 33 + .../TooManyRequestsHttpException.php | 35 + .../Exception/UnauthorizedHttpException.php | 31 + .../UnexpectedSessionUsageException.php | 19 + .../UnprocessableEntityHttpException.php | 28 + .../UnsupportedMediaTypeHttpException.php | 28 + .../AbstractSurrogateFragmentRenderer.php | 108 + .../Fragment/EsiFragmentRenderer.php | 28 + .../http-kernel/Fragment/FragmentHandler.php | 111 + .../Fragment/FragmentRendererInterface.php | 40 + .../Fragment/HIncludeFragmentRenderer.php | 109 + .../Fragment/InlineFragmentRenderer.php | 145 + .../Fragment/RoutableFragmentRenderer.php | 86 + .../Fragment/SsiFragmentRenderer.php | 28 + .../HttpCache/AbstractSurrogate.php | 136 + vendor/symfony/http-kernel/HttpCache/Esi.php | 117 + .../http-kernel/HttpCache/HttpCache.php | 735 + .../HttpCache/ResponseCacheStrategy.php | 213 + .../ResponseCacheStrategyInterface.php | 37 + vendor/symfony/http-kernel/HttpCache/Ssi.php | 100 + .../symfony/http-kernel/HttpCache/Store.php | 473 + .../http-kernel/HttpCache/StoreInterface.php | 81 + .../HttpCache/SubRequestHandler.php | 91 + .../HttpCache/SurrogateInterface.php | 87 + .../symfony/http-kernel/HttpClientKernel.php | 113 + vendor/symfony/http-kernel/HttpKernel.php | 294 + .../symfony/http-kernel/HttpKernelBrowser.php | 199 + .../http-kernel/HttpKernelInterface.php | 42 + vendor/symfony/http-kernel/Kernel.php | 825 + vendor/symfony/http-kernel/KernelEvents.php | 103 + .../symfony/http-kernel/KernelInterface.php | 141 + vendor/symfony/http-kernel/LICENSE | 19 + .../http-kernel/Log/DebugLoggerInterface.php | 45 + vendor/symfony/http-kernel/Log/Logger.php | 115 + .../Profiler/FileProfilerStorage.php | 303 + .../symfony/http-kernel/Profiler/Profile.php | 274 + .../symfony/http-kernel/Profiler/Profiler.php | 253 + .../Profiler/ProfilerStorageInterface.php | 60 + vendor/symfony/http-kernel/README.md | 16 + .../http-kernel/RebootableInterface.php | 30 + .../http-kernel/Resources/welcome.html.php | 119 + .../http-kernel/TerminableInterface.php | 32 + vendor/symfony/http-kernel/UriSigner.php | 113 + vendor/symfony/http-kernel/composer.json | 83 + vendor/symfony/mime/Address.php | 125 + vendor/symfony/mime/BodyRendererInterface.php | 20 + vendor/symfony/mime/CHANGELOG.md | 20 + vendor/symfony/mime/CharacterStream.php | 218 + vendor/symfony/mime/Crypto/SMime.php | 111 + vendor/symfony/mime/Crypto/SMimeEncrypter.php | 63 + vendor/symfony/mime/Crypto/SMimeSigner.php | 65 + .../AddMimeTypeGuesserPass.php | 46 + vendor/symfony/mime/Email.php | 581 + .../mime/Encoder/AddressEncoderInterface.php | 28 + .../mime/Encoder/Base64ContentEncoder.php | 45 + vendor/symfony/mime/Encoder/Base64Encoder.php | 41 + .../mime/Encoder/Base64MimeHeaderEncoder.php | 43 + .../mime/Encoder/ContentEncoderInterface.php | 30 + .../mime/Encoder/EightBitContentEncoder.php | 35 + .../symfony/mime/Encoder/EncoderInterface.php | 26 + .../mime/Encoder/IdnAddressEncoder.php | 52 + .../Encoder/MimeHeaderEncoderInterface.php | 23 + .../symfony/mime/Encoder/QpContentEncoder.php | 60 + vendor/symfony/mime/Encoder/QpEncoder.php | 195 + .../mime/Encoder/QpMimeHeaderEncoder.php | 40 + .../symfony/mime/Encoder/Rfc2231Encoder.php | 50 + .../Exception/AddressEncoderException.php | 19 + .../mime/Exception/ExceptionInterface.php | 19 + .../Exception/InvalidArgumentException.php | 19 + .../symfony/mime/Exception/LogicException.php | 19 + .../mime/Exception/RfcComplianceException.php | 19 + .../mime/Exception/RuntimeException.php | 19 + .../mime/FileBinaryMimeTypeGuesser.php | 93 + .../symfony/mime/FileinfoMimeTypeGuesser.php | 63 + vendor/symfony/mime/Header/AbstractHeader.php | 279 + vendor/symfony/mime/Header/DateHeader.php | 66 + .../symfony/mime/Header/HeaderInterface.php | 65 + vendor/symfony/mime/Header/Headers.php | 282 + .../mime/Header/IdentificationHeader.php | 110 + vendor/symfony/mime/Header/MailboxHeader.php | 85 + .../symfony/mime/Header/MailboxListHeader.php | 136 + .../mime/Header/ParameterizedHeader.php | 174 + vendor/symfony/mime/Header/PathHeader.php | 62 + .../mime/Header/UnstructuredHeader.php | 69 + vendor/symfony/mime/LICENSE | 19 + vendor/symfony/mime/Message.php | 158 + vendor/symfony/mime/MessageConverter.php | 125 + .../symfony/mime/MimeTypeGuesserInterface.php | 37 + vendor/symfony/mime/MimeTypes.php | 3155 ++ vendor/symfony/mime/MimeTypesInterface.php | 32 + .../mime/Part/AbstractMultipartPart.php | 99 + vendor/symfony/mime/Part/AbstractPart.php | 65 + vendor/symfony/mime/Part/DataPart.php | 161 + vendor/symfony/mime/Part/MessagePart.php | 62 + .../mime/Part/Multipart/AlternativePart.php | 25 + .../mime/Part/Multipart/DigestPart.php | 31 + .../mime/Part/Multipart/FormDataPart.php | 103 + .../symfony/mime/Part/Multipart/MixedPart.php | 25 + .../mime/Part/Multipart/RelatedPart.php | 55 + vendor/symfony/mime/Part/SMimePart.php | 116 + vendor/symfony/mime/Part/TextPart.php | 206 + vendor/symfony/mime/README.md | 13 + vendor/symfony/mime/RawMessage.php | 88 + .../mime/Resources/bin/update_mime_types.php | 166 + .../Test/Constraint/EmailAddressContains.php | 74 + .../Test/Constraint/EmailAttachmentCount.php | 60 + .../mime/Test/Constraint/EmailHasHeader.php | 57 + .../mime/Test/Constraint/EmailHeaderSame.php | 59 + .../Test/Constraint/EmailHtmlBodyContains.php | 58 + .../Test/Constraint/EmailTextBodyContains.php | 58 + vendor/symfony/mime/composer.json | 43 + vendor/symfony/polyfill-ctype/Ctype.php | 227 + vendor/symfony/polyfill-ctype/LICENSE | 19 + vendor/symfony/polyfill-ctype/README.md | 12 + vendor/symfony/polyfill-ctype/bootstrap.php | 46 + vendor/symfony/polyfill-ctype/composer.json | 38 + vendor/symfony/polyfill-iconv/Iconv.php | 741 + vendor/symfony/polyfill-iconv/LICENSE | 19 + vendor/symfony/polyfill-iconv/README.md | 14 + .../Resources/charset/from.big5.php | 13719 +++++++++ .../Resources/charset/from.cp037.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp1006.php | Bin 0 -> 3860 bytes .../Resources/charset/from.cp1026.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp424.php | Bin 0 -> 3210 bytes .../Resources/charset/from.cp437.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp500.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp737.php | Bin 0 -> 3834 bytes .../Resources/charset/from.cp775.php | Bin 0 -> 3815 bytes .../Resources/charset/from.cp850.php | Bin 0 -> 3809 bytes .../Resources/charset/from.cp852.php | Bin 0 -> 3808 bytes .../Resources/charset/from.cp855.php | Bin 0 -> 3809 bytes .../Resources/charset/from.cp856.php | Bin 0 -> 3194 bytes .../Resources/charset/from.cp857.php | Bin 0 -> 3763 bytes .../Resources/charset/from.cp860.php | Bin 0 -> 3840 bytes .../Resources/charset/from.cp861.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp862.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp863.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp864.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp865.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp866.php | Bin 0 -> 3831 bytes .../Resources/charset/from.cp869.php | Bin 0 -> 3676 bytes .../Resources/charset/from.cp874.php | Bin 0 -> 3410 bytes .../Resources/charset/from.cp875.php | Bin 0 -> 3776 bytes .../Resources/charset/from.cp932.php | Bin 0 -> 134095 bytes .../Resources/charset/from.cp936.php | Bin 0 -> 372283 bytes .../Resources/charset/from.cp949.php | Bin 0 -> 291504 bytes .../Resources/charset/from.cp950.php | Bin 0 -> 231436 bytes .../Resources/charset/from.iso-8859-1.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-10.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-11.php | Bin 0 -> 3746 bytes .../Resources/charset/from.iso-8859-13.php | Bin 0 -> 3783 bytes .../Resources/charset/from.iso-8859-14.php | Bin 0 -> 3801 bytes .../Resources/charset/from.iso-8859-15.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-16.php | Bin 0 -> 3782 bytes .../Resources/charset/from.iso-8859-2.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-3.php | Bin 0 -> 3674 bytes .../Resources/charset/from.iso-8859-4.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-5.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-6.php | Bin 0 -> 3104 bytes .../Resources/charset/from.iso-8859-7.php | Bin 0 -> 3692 bytes .../Resources/charset/from.iso-8859-8.php | Bin 0 -> 3242 bytes .../Resources/charset/from.iso-8859-9.php | Bin 0 -> 3779 bytes .../Resources/charset/from.koi8-r.php | Bin 0 -> 3835 bytes .../Resources/charset/from.koi8-u.php | Bin 0 -> 3827 bytes .../Resources/charset/from.us-ascii.php | Bin 0 -> 1859 bytes .../Resources/charset/from.windows-1250.php | Bin 0 -> 3721 bytes .../Resources/charset/from.windows-1251.php | Bin 0 -> 3782 bytes .../Resources/charset/from.windows-1252.php | Bin 0 -> 3721 bytes .../Resources/charset/from.windows-1253.php | Bin 0 -> 3542 bytes .../Resources/charset/from.windows-1254.php | Bin 0 -> 3691 bytes .../Resources/charset/from.windows-1255.php | Bin 0 -> 3454 bytes .../Resources/charset/from.windows-1256.php | Bin 0 -> 3800 bytes .../Resources/charset/from.windows-1257.php | Bin 0 -> 3616 bytes .../Resources/charset/from.windows-1258.php | Bin 0 -> 3662 bytes .../Resources/charset/translit.php | 4098 +++ vendor/symfony/polyfill-iconv/bootstrap.php | 84 + vendor/symfony/polyfill-iconv/composer.json | 34 + .../polyfill-intl-grapheme/Grapheme.php | 211 + vendor/symfony/polyfill-intl-grapheme/LICENSE | 19 + .../symfony/polyfill-intl-grapheme/README.md | 31 + .../polyfill-intl-grapheme/bootstrap.php | 54 + .../polyfill-intl-grapheme/composer.json | 34 + vendor/symfony/polyfill-intl-idn/Idn.php | 287 + vendor/symfony/polyfill-intl-idn/LICENSE | 19 + vendor/symfony/polyfill-intl-idn/README.md | 12 + .../symfony/polyfill-intl-idn/bootstrap.php | 141 + .../symfony/polyfill-intl-idn/composer.json | 36 + .../symfony/polyfill-intl-normalizer/LICENSE | 19 + .../polyfill-intl-normalizer/Normalizer.php | 305 + .../polyfill-intl-normalizer/README.md | 14 + .../Resources/stubs/Normalizer.php | 14 + .../unidata/canonicalComposition.php | 944 + .../unidata/canonicalDecomposition.php | 2064 ++ .../Resources/unidata/combiningClass.php | 866 + .../unidata/compatibilityDecomposition.php | 3684 +++ .../polyfill-intl-normalizer/bootstrap.php | 19 + .../polyfill-intl-normalizer/composer.json | 35 + vendor/symfony/polyfill-mbstring/LICENSE | 19 + vendor/symfony/polyfill-mbstring/Mbstring.php | 847 + vendor/symfony/polyfill-mbstring/README.md | 13 + .../Resources/unidata/lowerCase.php | 1397 + .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1414 + .../symfony/polyfill-mbstring/bootstrap.php | 141 + .../symfony/polyfill-mbstring/composer.json | 38 + vendor/symfony/polyfill-php72/LICENSE | 19 + vendor/symfony/polyfill-php72/Php72.php | 217 + vendor/symfony/polyfill-php72/README.md | 28 + vendor/symfony/polyfill-php72/bootstrap.php | 57 + vendor/symfony/polyfill-php72/composer.json | 31 + vendor/symfony/polyfill-php73/LICENSE | 19 + vendor/symfony/polyfill-php73/Php73.php | 43 + vendor/symfony/polyfill-php73/README.md | 18 + .../Resources/stubs/JsonException.php | 14 + vendor/symfony/polyfill-php73/bootstrap.php | 31 + vendor/symfony/polyfill-php73/composer.json | 36 + vendor/symfony/polyfill-php80/LICENSE | 19 + vendor/symfony/polyfill-php80/Php80.php | 105 + vendor/symfony/polyfill-php80/README.md | 24 + .../Resources/stubs/Stringable.php | 9 + .../Resources/stubs/UnhandledMatchError.php | 5 + .../Resources/stubs/ValueError.php | 5 + vendor/symfony/polyfill-php80/bootstrap.php | 42 + vendor/symfony/polyfill-php80/composer.json | 40 + vendor/symfony/process/CHANGELOG.md | 109 + .../process/Exception/ExceptionInterface.php | 21 + .../Exception/InvalidArgumentException.php | 21 + .../process/Exception/LogicException.php | 21 + .../Exception/ProcessFailedException.php | 54 + .../Exception/ProcessSignaledException.php | 41 + .../Exception/ProcessTimedOutException.php | 69 + .../process/Exception/RuntimeException.php | 21 + vendor/symfony/process/ExecutableFinder.php | 86 + vendor/symfony/process/InputStream.php | 93 + vendor/symfony/process/LICENSE | 19 + .../symfony/process/PhpExecutableFinder.php | 99 + vendor/symfony/process/PhpProcess.php | 72 + .../symfony/process/Pipes/AbstractPipes.php | 178 + .../symfony/process/Pipes/PipesInterface.php | 61 + vendor/symfony/process/Pipes/UnixPipes.php | 153 + vendor/symfony/process/Pipes/WindowsPipes.php | 191 + vendor/symfony/process/Process.php | 1636 + vendor/symfony/process/ProcessUtils.php | 69 + vendor/symfony/process/README.md | 13 + vendor/symfony/process/composer.json | 34 + vendor/symfony/routing/Annotation/Route.php | 195 + vendor/symfony/routing/CHANGELOG.md | 281 + vendor/symfony/routing/CompiledRoute.php | 173 + .../RoutingResolverPass.php | 49 + .../routing/Exception/ExceptionInterface.php | 21 + .../Exception/InvalidParameterException.php | 21 + .../Exception/MethodNotAllowedException.php | 41 + .../MissingMandatoryParametersException.php | 22 + .../Exception/NoConfigurationException.php | 21 + .../Exception/ResourceNotFoundException.php | 23 + .../Exception/RouteNotFoundException.php | 21 + .../Generator/CompiledUrlGenerator.php | 65 + .../ConfigurableRequirementsInterface.php | 53 + .../Dumper/CompiledUrlGeneratorDumper.php | 73 + .../Generator/Dumper/GeneratorDumper.php | 37 + .../Dumper/GeneratorDumperInterface.php | 37 + .../routing/Generator/UrlGenerator.php | 366 + .../Generator/UrlGeneratorInterface.php | 82 + vendor/symfony/routing/LICENSE | 19 + .../routing/Loader/AnnotationClassLoader.php | 334 + .../Loader/AnnotationDirectoryLoader.php | 93 + .../routing/Loader/AnnotationFileLoader.php | 143 + .../symfony/routing/Loader/ClosureLoader.php | 46 + .../Configurator/CollectionConfigurator.php | 112 + .../Configurator/ImportConfigurator.php | 77 + .../Loader/Configurator/RouteConfigurator.php | 49 + .../Configurator/RoutingConfigurator.php | 71 + .../Loader/Configurator/Traits/AddTrait.php | 54 + .../Loader/Configurator/Traits/HostTrait.php | 49 + .../Traits/LocalizedRouteTrait.php | 76 + .../Configurator/Traits/PrefixTrait.php | 62 + .../Loader/Configurator/Traits/RouteTrait.php | 175 + .../routing/Loader/ContainerLoader.php | 45 + .../routing/Loader/DirectoryLoader.php | 58 + .../symfony/routing/Loader/GlobFileLoader.php | 47 + .../symfony/routing/Loader/ObjectLoader.php | 84 + .../symfony/routing/Loader/PhpFileLoader.php | 85 + .../symfony/routing/Loader/XmlFileLoader.php | 427 + .../symfony/routing/Loader/YamlFileLoader.php | 262 + .../Loader/schema/routing/routing-1.0.xsd | 174 + .../routing/Matcher/CompiledUrlMatcher.php | 31 + .../Dumper/CompiledUrlMatcherDumper.php | 501 + .../Dumper/CompiledUrlMatcherTrait.php | 187 + .../routing/Matcher/Dumper/MatcherDumper.php | 37 + .../Matcher/Dumper/MatcherDumperInterface.php | 37 + .../Matcher/Dumper/StaticPrefixCollection.php | 202 + .../Matcher/ExpressionLanguageProvider.php | 54 + .../Matcher/RedirectableUrlMatcher.php | 64 + .../RedirectableUrlMatcherInterface.php | 31 + .../Matcher/RequestMatcherInterface.php | 39 + .../routing/Matcher/TraceableUrlMatcher.php | 164 + vendor/symfony/routing/Matcher/UrlMatcher.php | 279 + .../routing/Matcher/UrlMatcherInterface.php | 41 + vendor/symfony/routing/README.md | 51 + vendor/symfony/routing/RequestContext.php | 327 + .../routing/RequestContextAwareInterface.php | 27 + vendor/symfony/routing/Route.php | 568 + vendor/symfony/routing/RouteCollection.php | 306 + .../routing/RouteCollectionBuilder.php | 364 + vendor/symfony/routing/RouteCompiler.php | 348 + .../routing/RouteCompilerInterface.php | 30 + vendor/symfony/routing/Router.php | 390 + vendor/symfony/routing/RouterInterface.php | 35 + vendor/symfony/routing/composer.json | 56 + vendor/symfony/service-contracts/.gitignore | 3 + vendor/symfony/service-contracts/CHANGELOG.md | 5 + vendor/symfony/service-contracts/LICENSE | 19 + vendor/symfony/service-contracts/README.md | 9 + .../service-contracts/ResetInterface.php | 30 + .../service-contracts/ServiceLocatorTrait.php | 126 + .../ServiceProviderInterface.php | 36 + .../ServiceSubscriberInterface.php | 53 + .../ServiceSubscriberTrait.php | 63 + .../Test/ServiceLocatorTest.php | 92 + .../symfony/service-contracts/composer.json | 34 + vendor/symfony/string/.gitattributes | 5 + vendor/symfony/string/AbstractString.php | 731 + .../symfony/string/AbstractUnicodeString.php | 576 + vendor/symfony/string/ByteString.php | 506 + vendor/symfony/string/CHANGELOG.md | 20 + vendor/symfony/string/CodePointString.php | 270 + .../string/Exception/ExceptionInterface.php | 16 + .../Exception/InvalidArgumentException.php | 16 + .../string/Exception/RuntimeException.php | 16 + .../string/Inflector/EnglishInflector.php | 477 + .../string/Inflector/InflectorInterface.php | 33 + vendor/symfony/string/LICENSE | 19 + vendor/symfony/string/LazyString.php | 164 + vendor/symfony/string/README.md | 14 + .../Resources/data/wcswidth_table_wide.php | 1119 + .../Resources/data/wcswidth_table_zero.php | 1339 + vendor/symfony/string/Resources/functions.php | 30 + .../symfony/string/Slugger/AsciiSlugger.php | 141 + .../string/Slugger/SluggerInterface.php | 27 + vendor/symfony/string/UnicodeString.php | 361 + vendor/symfony/string/composer.json | 45 + .../symfony/translation-contracts/.gitignore | 3 + .../translation-contracts/CHANGELOG.md | 5 + vendor/symfony/translation-contracts/LICENSE | 19 + .../LocaleAwareInterface.php | 31 + .../symfony/translation-contracts/README.md | 9 + .../Test/TranslatorTest.php | 353 + .../TranslatorInterface.php | 65 + .../translation-contracts/TranslatorTrait.php | 257 + .../translation-contracts/composer.json | 33 + vendor/symfony/translation/CHANGELOG.md | 153 + .../Catalogue/AbstractOperation.php | 157 + .../translation/Catalogue/MergeOperation.php | 58 + .../Catalogue/OperationInterface.php | 71 + .../translation/Catalogue/TargetOperation.php | 72 + .../translation/Command/XliffLintCommand.php | 266 + .../TranslationDataCollector.php | 172 + .../translation/DataCollectorTranslator.php | 163 + .../TranslationDumperPass.php | 44 + .../TranslationExtractorPass.php | 49 + .../DependencyInjection/TranslatorPass.php | 89 + .../TranslatorPathsPass.php | 144 + .../translation/Dumper/CsvFileDumper.php | 60 + .../translation/Dumper/DumperInterface.php | 30 + .../symfony/translation/Dumper/FileDumper.php | 112 + .../translation/Dumper/IcuResFileDumper.php | 104 + .../translation/Dumper/IniFileDumper.php | 45 + .../translation/Dumper/JsonFileDumper.php | 40 + .../translation/Dumper/MoFileDumper.php | 82 + .../translation/Dumper/PhpFileDumper.php | 38 + .../translation/Dumper/PoFileDumper.php | 137 + .../translation/Dumper/QtFileDumper.php | 61 + .../translation/Dumper/XliffFileDumper.php | 203 + .../translation/Dumper/YamlFileDumper.php | 62 + .../Exception/ExceptionInterface.php | 21 + .../Exception/InvalidArgumentException.php | 21 + .../Exception/InvalidResourceException.php | 21 + .../translation/Exception/LogicException.php | 21 + .../Exception/NotFoundResourceException.php | 21 + .../Exception/RuntimeException.php | 21 + .../Extractor/AbstractFileExtractor.php | 76 + .../translation/Extractor/ChainExtractor.php | 59 + .../Extractor/ExtractorInterface.php | 37 + .../translation/Extractor/PhpExtractor.php | 247 + .../Extractor/PhpStringTokenParser.php | 142 + .../translation/Formatter/IntlFormatter.php | 60 + .../Formatter/IntlFormatterInterface.php | 27 + .../Formatter/MessageFormatter.php | 56 + .../Formatter/MessageFormatterInterface.php | 30 + .../translation/IdentityTranslator.php | 26 + vendor/symfony/translation/LICENSE | 19 + .../translation/Loader/ArrayLoader.php | 58 + .../translation/Loader/CsvFileLoader.php | 65 + .../symfony/translation/Loader/FileLoader.php | 65 + .../translation/Loader/IcuDatFileLoader.php | 61 + .../translation/Loader/IcuResFileLoader.php | 91 + .../translation/Loader/IniFileLoader.php | 28 + .../translation/Loader/JsonFileLoader.php | 60 + .../translation/Loader/LoaderInterface.php | 38 + .../translation/Loader/MoFileLoader.php | 140 + .../translation/Loader/PhpFileLoader.php | 42 + .../translation/Loader/PoFileLoader.php | 149 + .../translation/Loader/QtFileLoader.php | 82 + .../translation/Loader/XliffFileLoader.php | 214 + .../translation/Loader/YamlFileLoader.php | 54 + .../symfony/translation/LoggingTranslator.php | 127 + .../symfony/translation/MessageCatalogue.php | 318 + .../translation/MessageCatalogueInterface.php | 138 + .../translation/MetadataAwareInterface.php | 54 + vendor/symfony/translation/README.md | 31 + .../translation/Reader/TranslationReader.php | 62 + .../Reader/TranslationReaderInterface.php | 27 + .../Resources/bin/translation-status.php | 207 + .../translation/Resources/data/parents.json | 138 + .../schemas/xliff-core-1.2-strict.xsd | 2223 ++ .../Resources/schemas/xliff-core-2.0.xsd | 411 + .../translation/Resources/schemas/xml.xsd | 309 + vendor/symfony/translation/Translator.php | 479 + .../translation/TranslatorBagInterface.php | 33 + .../translation/Util/ArrayConverter.php | 99 + .../symfony/translation/Util/XliffUtils.php | 163 + .../translation/Writer/TranslationWriter.php | 72 + .../Writer/TranslationWriterInterface.php | 33 + vendor/symfony/translation/composer.json | 62 + vendor/symfony/var-dumper/CHANGELOG.md | 58 + .../symfony/var-dumper/Caster/AmqpCaster.php | 212 + vendor/symfony/var-dumper/Caster/ArgsStub.php | 80 + vendor/symfony/var-dumper/Caster/Caster.php | 174 + .../symfony/var-dumper/Caster/ClassStub.php | 106 + .../symfony/var-dumper/Caster/ConstStub.php | 36 + .../var-dumper/Caster/CutArrayStub.php | 30 + vendor/symfony/var-dumper/Caster/CutStub.php | 64 + .../symfony/var-dumper/Caster/DOMCaster.php | 304 + .../symfony/var-dumper/Caster/DateCaster.php | 126 + .../var-dumper/Caster/DoctrineCaster.php | 62 + vendor/symfony/var-dumper/Caster/DsCaster.php | 70 + .../symfony/var-dumper/Caster/DsPairStub.php | 28 + vendor/symfony/var-dumper/Caster/EnumStub.php | 30 + .../var-dumper/Caster/ExceptionCaster.php | 382 + .../symfony/var-dumper/Caster/FrameStub.php | 30 + .../symfony/var-dumper/Caster/GmpCaster.php | 32 + .../var-dumper/Caster/ImagineCaster.php | 37 + vendor/symfony/var-dumper/Caster/ImgStub.php | 26 + .../symfony/var-dumper/Caster/IntlCaster.php | 172 + vendor/symfony/var-dumper/Caster/LinkStub.php | 108 + .../var-dumper/Caster/MemcachedCaster.php | 81 + .../symfony/var-dumper/Caster/PdoCaster.php | 122 + .../symfony/var-dumper/Caster/PgSqlCaster.php | 156 + .../var-dumper/Caster/ProxyManagerCaster.php | 33 + .../var-dumper/Caster/RdKafkaCaster.php | 186 + .../symfony/var-dumper/Caster/RedisCaster.php | 152 + .../var-dumper/Caster/ReflectionCaster.php | 392 + .../var-dumper/Caster/ResourceCaster.php | 105 + .../symfony/var-dumper/Caster/SplCaster.php | 223 + .../symfony/var-dumper/Caster/StubCaster.php | 84 + .../var-dumper/Caster/SymfonyCaster.php | 69 + .../symfony/var-dumper/Caster/TraceStub.php | 36 + .../symfony/var-dumper/Caster/UuidCaster.php | 30 + .../var-dumper/Caster/XmlReaderCaster.php | 79 + .../var-dumper/Caster/XmlResourceCaster.php | 63 + .../var-dumper/Cloner/AbstractCloner.php | 374 + .../var-dumper/Cloner/ClonerInterface.php | 27 + vendor/symfony/var-dumper/Cloner/Cursor.php | 43 + vendor/symfony/var-dumper/Cloner/Data.php | 451 + .../var-dumper/Cloner/DumperInterface.php | 56 + vendor/symfony/var-dumper/Cloner/Stub.php | 67 + .../symfony/var-dumper/Cloner/VarCloner.php | 283 + .../Command/Descriptor/CliDescriptor.php | 88 + .../Descriptor/DumpDescriptorInterface.php | 23 + .../Command/Descriptor/HtmlDescriptor.php | 119 + .../var-dumper/Command/ServerDumpCommand.php | 99 + .../var-dumper/Dumper/AbstractDumper.php | 204 + .../symfony/var-dumper/Dumper/CliDumper.php | 640 + .../ContextProvider/CliContextProvider.php | 32 + .../ContextProviderInterface.php | 25 + .../RequestContextProvider.php | 51 + .../ContextProvider/SourceContextProvider.php | 126 + .../Dumper/ContextualizedDumper.php | 43 + .../var-dumper/Dumper/DataDumperInterface.php | 24 + .../symfony/var-dumper/Dumper/HtmlDumper.php | 1004 + .../var-dumper/Dumper/ServerDumper.php | 53 + .../Exception/ThrowingCasterException.php | 26 + vendor/symfony/var-dumper/LICENSE | 19 + vendor/symfony/var-dumper/README.md | 15 + .../var-dumper/Resources/bin/var-dump-server | 63 + .../Resources/css/htmlDescriptor.css | 130 + .../var-dumper/Resources/functions/dump.php | 43 + .../var-dumper/Resources/js/htmlDescriptor.js | 10 + .../symfony/var-dumper/Server/Connection.php | 95 + .../symfony/var-dumper/Server/DumpServer.php | 111 + .../var-dumper/Test/VarDumperTestTrait.php | 84 + vendor/symfony/var-dumper/VarDumper.php | 66 + vendor/symfony/var-dumper/composer.json | 54 + vendor/theseer/tokenizer/.gitignore | 8 + vendor/theseer/tokenizer/.php_cs | 67 + vendor/theseer/tokenizer/.travis.yml | 34 + vendor/theseer/tokenizer/CHANGELOG.md | 32 + vendor/theseer/tokenizer/LICENSE | 30 + vendor/theseer/tokenizer/README.md | 49 + vendor/theseer/tokenizer/build.xml | 41 + vendor/theseer/tokenizer/composer.json | 27 + vendor/theseer/tokenizer/phive.xml | 5 + vendor/theseer/tokenizer/phpunit.xml | 25 + vendor/theseer/tokenizer/src/Exception.php | 6 + vendor/theseer/tokenizer/src/NamespaceUri.php | 28 + .../tokenizer/src/NamespaceUriException.php | 6 + vendor/theseer/tokenizer/src/Token.php | 55 + .../theseer/tokenizer/src/TokenCollection.php | 128 + .../src/TokenCollectionException.php | 6 + vendor/theseer/tokenizer/src/Tokenizer.php | 87 + .../theseer/tokenizer/src/XMLSerializer.php | 97 + .../tokenizer/tests/NamespaceUriTest.php | 29 + .../tokenizer/tests/TokenCollectionTest.php | 72 + vendor/theseer/tokenizer/tests/TokenTest.php | 31 + .../theseer/tokenizer/tests/TokenizerTest.php | 21 + .../tokenizer/tests/XMLSerializerTest.php | 50 + .../tokenizer/tests/_files/customns.xml | 177 + .../theseer/tokenizer/tests/_files/empty.xml | 2 + .../theseer/tokenizer/tests/_files/test.php | 25 + .../tokenizer/tests/_files/test.php.tokens | Bin 0 -> 29474 bytes .../tokenizer/tests/_files/test.php.xml | 177 + .../css-to-inline-styles/LICENSE.md | 23 + .../css-to-inline-styles/composer.json | 33 + .../src/Css/Processor.php | 71 + .../src/Css/Property/Processor.php | 127 + .../src/Css/Property/Property.php | 90 + .../src/Css/Rule/Processor.php | 163 + .../src/Css/Rule/Rule.php | 85 + .../src/CssToInlineStyles.php | 240 + vendor/vlucas/phpdotenv/LICENSE | 30 + vendor/vlucas/phpdotenv/composer.json | 52 + vendor/vlucas/phpdotenv/phpstan.src.neon.dist | 14 + vendor/vlucas/phpdotenv/src/Dotenv.php | 157 + .../src/Exception/ExceptionInterface.php | 8 + .../src/Exception/InvalidFileException.php | 10 + .../src/Exception/InvalidPathException.php | 10 + .../src/Exception/ValidationException.php | 10 + vendor/vlucas/phpdotenv/src/Loader/Lines.php | 135 + vendor/vlucas/phpdotenv/src/Loader/Loader.php | 118 + .../phpdotenv/src/Loader/LoaderInterface.php | 20 + vendor/vlucas/phpdotenv/src/Loader/Parser.php | 218 + vendor/vlucas/phpdotenv/src/Loader/Value.php | 83 + vendor/vlucas/phpdotenv/src/Regex/Regex.php | 122 + .../src/Repository/AbstractRepository.php | 175 + .../src/Repository/Adapter/ApacheAdapter.php | 64 + .../src/Repository/Adapter/ArrayAdapter.php | 67 + .../Adapter/AvailabilityInterface.php | 13 + .../Repository/Adapter/EnvConstAdapter.php | 60 + .../src/Repository/Adapter/PutenvAdapter.php | 56 + .../Repository/Adapter/ReaderInterface.php | 15 + .../Repository/Adapter/ServerConstAdapter.php | 60 + .../Repository/Adapter/WriterInterface.php | 25 + .../src/Repository/AdapterRepository.php | 86 + .../src/Repository/RepositoryBuilder.php | 144 + .../src/Repository/RepositoryInterface.php | 54 + vendor/vlucas/phpdotenv/src/Result/Error.php | 93 + vendor/vlucas/phpdotenv/src/Result/Result.php | 70 + .../vlucas/phpdotenv/src/Result/Success.php | 93 + .../vlucas/phpdotenv/src/Store/File/Paths.php | 27 + .../phpdotenv/src/Store/File/Reader.php | 52 + .../vlucas/phpdotenv/src/Store/FileStore.php | 61 + .../phpdotenv/src/Store/StoreBuilder.php | 102 + .../phpdotenv/src/Store/StoreInterface.php | 15 + vendor/vlucas/phpdotenv/src/Validator.php | 193 + vendor/voku/portable-ascii/CHANGELOG.md | 158 + vendor/voku/portable-ascii/LICENSE.txt | 19 + vendor/voku/portable-ascii/README.md | 425 + .../voku/portable-ascii/build/composer.json | 5 + vendor/voku/portable-ascii/build/docs/base.md | 126 + .../portable-ascii/build/generate_docs.php | 26 + .../build/gernerate_max_key_length.php | 20 + vendor/voku/portable-ascii/composer.json | 37 + .../portable-ascii/src/voku/helper/ASCII.php | 1435 + .../voku/helper/data/ascii_by_languages.php | 2929 ++ .../helper/data/ascii_extras_by_languages.php | 759 + .../helper/data/ascii_language_max_key.php | 65 + .../src/voku/helper/data/ascii_ord.php | 1 + .../src/voku/helper/data/x000.php | 16 + .../src/voku/helper/data/x001.php | 1 + .../src/voku/helper/data/x002.php | 1 + .../src/voku/helper/data/x003.php | 1 + .../src/voku/helper/data/x004.php | 1 + .../src/voku/helper/data/x005.php | 1 + .../src/voku/helper/data/x006.php | 1 + .../src/voku/helper/data/x007.php | 1 + .../src/voku/helper/data/x009.php | 1 + .../src/voku/helper/data/x00a.php | 1 + .../src/voku/helper/data/x00b.php | 1 + .../src/voku/helper/data/x00c.php | 1 + .../src/voku/helper/data/x00d.php | 1 + .../src/voku/helper/data/x00e.php | 1 + .../src/voku/helper/data/x00f.php | 1 + .../src/voku/helper/data/x010.php | 1 + .../src/voku/helper/data/x011.php | 1 + .../src/voku/helper/data/x012.php | 1 + .../src/voku/helper/data/x013.php | 1 + .../src/voku/helper/data/x014.php | 1 + .../src/voku/helper/data/x015.php | 1 + .../src/voku/helper/data/x016.php | 1 + .../src/voku/helper/data/x017.php | 1 + .../src/voku/helper/data/x018.php | 1 + .../src/voku/helper/data/x01d.php | 1 + .../src/voku/helper/data/x01e.php | 1 + .../src/voku/helper/data/x01f.php | 1 + .../src/voku/helper/data/x020.php | 4 + .../src/voku/helper/data/x021.php | 1 + .../src/voku/helper/data/x022.php | 1 + .../src/voku/helper/data/x023.php | 1 + .../src/voku/helper/data/x024.php | 1 + .../src/voku/helper/data/x025.php | 1 + .../src/voku/helper/data/x026.php | 1 + .../src/voku/helper/data/x027.php | 1 + .../src/voku/helper/data/x028.php | 1 + .../src/voku/helper/data/x029.php | 1 + .../src/voku/helper/data/x02a.php | 1 + .../src/voku/helper/data/x02c.php | 1 + .../src/voku/helper/data/x02e.php | 1 + .../src/voku/helper/data/x02f.php | 1 + .../src/voku/helper/data/x030.php | 9 + .../src/voku/helper/data/x031.php | 1 + .../src/voku/helper/data/x032.php | 1 + .../src/voku/helper/data/x033.php | 1 + .../src/voku/helper/data/x04d.php | 1 + .../src/voku/helper/data/x04e.php | 1 + .../src/voku/helper/data/x04f.php | 1 + .../src/voku/helper/data/x050.php | 1 + .../src/voku/helper/data/x051.php | 1 + .../src/voku/helper/data/x052.php | 1 + .../src/voku/helper/data/x053.php | 1 + .../src/voku/helper/data/x054.php | 1 + .../src/voku/helper/data/x055.php | 1 + .../src/voku/helper/data/x056.php | 1 + .../src/voku/helper/data/x057.php | 1 + .../src/voku/helper/data/x058.php | 1 + .../src/voku/helper/data/x059.php | 1 + .../src/voku/helper/data/x05a.php | 1 + .../src/voku/helper/data/x05b.php | 1 + .../src/voku/helper/data/x05c.php | 1 + .../src/voku/helper/data/x05d.php | 1 + .../src/voku/helper/data/x05e.php | 1 + .../src/voku/helper/data/x05f.php | 1 + .../src/voku/helper/data/x060.php | 1 + .../src/voku/helper/data/x061.php | 1 + .../src/voku/helper/data/x062.php | 1 + .../src/voku/helper/data/x063.php | 1 + .../src/voku/helper/data/x064.php | 1 + .../src/voku/helper/data/x065.php | 1 + .../src/voku/helper/data/x066.php | 1 + .../src/voku/helper/data/x067.php | 1 + .../src/voku/helper/data/x068.php | 1 + .../src/voku/helper/data/x069.php | 1 + .../src/voku/helper/data/x06a.php | 1 + .../src/voku/helper/data/x06b.php | 1 + .../src/voku/helper/data/x06c.php | 1 + .../src/voku/helper/data/x06d.php | 1 + .../src/voku/helper/data/x06e.php | 1 + .../src/voku/helper/data/x06f.php | 1 + .../src/voku/helper/data/x070.php | 1 + .../src/voku/helper/data/x071.php | 1 + .../src/voku/helper/data/x072.php | 1 + .../src/voku/helper/data/x073.php | 1 + .../src/voku/helper/data/x074.php | 1 + .../src/voku/helper/data/x075.php | 1 + .../src/voku/helper/data/x076.php | 1 + .../src/voku/helper/data/x077.php | 1 + .../src/voku/helper/data/x078.php | 1 + .../src/voku/helper/data/x079.php | 1 + .../src/voku/helper/data/x07a.php | 1 + .../src/voku/helper/data/x07b.php | 1 + .../src/voku/helper/data/x07c.php | 1 + .../src/voku/helper/data/x07d.php | 1 + .../src/voku/helper/data/x07e.php | 1 + .../src/voku/helper/data/x07f.php | 1 + .../src/voku/helper/data/x080.php | 1 + .../src/voku/helper/data/x081.php | 1 + .../src/voku/helper/data/x082.php | 1 + .../src/voku/helper/data/x083.php | 1 + .../src/voku/helper/data/x084.php | 1 + .../src/voku/helper/data/x085.php | 1 + .../src/voku/helper/data/x086.php | 1 + .../src/voku/helper/data/x087.php | 1 + .../src/voku/helper/data/x088.php | 1 + .../src/voku/helper/data/x089.php | 1 + .../src/voku/helper/data/x08a.php | 1 + .../src/voku/helper/data/x08b.php | 1 + .../src/voku/helper/data/x08c.php | 1 + .../src/voku/helper/data/x08d.php | 1 + .../src/voku/helper/data/x08e.php | 1 + .../src/voku/helper/data/x08f.php | 1 + .../src/voku/helper/data/x090.php | 1 + .../src/voku/helper/data/x091.php | 1 + .../src/voku/helper/data/x092.php | 1 + .../src/voku/helper/data/x093.php | 1 + .../src/voku/helper/data/x094.php | 1 + .../src/voku/helper/data/x095.php | 1 + .../src/voku/helper/data/x096.php | 1 + .../src/voku/helper/data/x097.php | 1 + .../src/voku/helper/data/x098.php | 1 + .../src/voku/helper/data/x099.php | 1 + .../src/voku/helper/data/x09a.php | 1 + .../src/voku/helper/data/x09b.php | 1 + .../src/voku/helper/data/x09c.php | 1 + .../src/voku/helper/data/x09d.php | 1 + .../src/voku/helper/data/x09e.php | 1 + .../src/voku/helper/data/x09f.php | 1 + .../src/voku/helper/data/x0a0.php | 1 + .../src/voku/helper/data/x0a1.php | 1 + .../src/voku/helper/data/x0a2.php | 1 + .../src/voku/helper/data/x0a3.php | 1 + .../src/voku/helper/data/x0a4.php | 1 + .../src/voku/helper/data/x0ac.php | 1 + .../src/voku/helper/data/x0ad.php | 1 + .../src/voku/helper/data/x0ae.php | 1 + .../src/voku/helper/data/x0af.php | 1 + .../src/voku/helper/data/x0b0.php | 1 + .../src/voku/helper/data/x0b1.php | 1 + .../src/voku/helper/data/x0b2.php | 1 + .../src/voku/helper/data/x0b3.php | 1 + .../src/voku/helper/data/x0b4.php | 1 + .../src/voku/helper/data/x0b5.php | 1 + .../src/voku/helper/data/x0b6.php | 1 + .../src/voku/helper/data/x0b7.php | 1 + .../src/voku/helper/data/x0b8.php | 1 + .../src/voku/helper/data/x0b9.php | 1 + .../src/voku/helper/data/x0ba.php | 1 + .../src/voku/helper/data/x0bb.php | 1 + .../src/voku/helper/data/x0bc.php | 1 + .../src/voku/helper/data/x0bd.php | 1 + .../src/voku/helper/data/x0be.php | 1 + .../src/voku/helper/data/x0bf.php | 1 + .../src/voku/helper/data/x0c0.php | 1 + .../src/voku/helper/data/x0c1.php | 1 + .../src/voku/helper/data/x0c2.php | 1 + .../src/voku/helper/data/x0c3.php | 1 + .../src/voku/helper/data/x0c4.php | 1 + .../src/voku/helper/data/x0c5.php | 1 + .../src/voku/helper/data/x0c6.php | 1 + .../src/voku/helper/data/x0c7.php | 1 + .../src/voku/helper/data/x0c8.php | 1 + .../src/voku/helper/data/x0c9.php | 1 + .../src/voku/helper/data/x0ca.php | 1 + .../src/voku/helper/data/x0cb.php | 1 + .../src/voku/helper/data/x0cc.php | 1 + .../src/voku/helper/data/x0cd.php | 1 + .../src/voku/helper/data/x0ce.php | 1 + .../src/voku/helper/data/x0cf.php | 1 + .../src/voku/helper/data/x0d0.php | 1 + .../src/voku/helper/data/x0d1.php | 1 + .../src/voku/helper/data/x0d2.php | 1 + .../src/voku/helper/data/x0d3.php | 1 + .../src/voku/helper/data/x0d4.php | 1 + .../src/voku/helper/data/x0d5.php | 1 + .../src/voku/helper/data/x0d6.php | 1 + .../src/voku/helper/data/x0d7.php | 1 + .../src/voku/helper/data/x0f9.php | 1 + .../src/voku/helper/data/x0fa.php | 1 + .../src/voku/helper/data/x0fb.php | 1 + .../src/voku/helper/data/x0fc.php | 1 + .../src/voku/helper/data/x0fd.php | 1 + .../src/voku/helper/data/x0fe.php | 1 + .../src/voku/helper/data/x0ff.php | 1 + .../src/voku/helper/data/x1d4.php | 1 + .../src/voku/helper/data/x1d5.php | 4 + .../src/voku/helper/data/x1d6.php | 1 + .../src/voku/helper/data/x1d7.php | 1 + .../src/voku/helper/data/x1f1.php | 2 + vendor/webmozart/assert/.editorconfig | 12 + vendor/webmozart/assert/CHANGELOG.md | 169 + vendor/webmozart/assert/LICENSE | 20 + vendor/webmozart/assert/README.md | 283 + vendor/webmozart/assert/composer.json | 38 + vendor/webmozart/assert/psalm.xml | 14 + vendor/webmozart/assert/src/Assert.php | 2048 ++ vendor/webmozart/assert/src/Mixin.php | 1971 ++ 8576 files changed, 1013325 insertions(+), 3 deletions(-) create mode 100644 .env create mode 100644 .env.example create mode 100644 vendor/asm89/stack-cors/LICENSE create mode 100644 vendor/asm89/stack-cors/README.md create mode 100644 vendor/asm89/stack-cors/composer.json create mode 100644 vendor/asm89/stack-cors/src/Asm89/Stack/Cors.php create mode 100644 vendor/asm89/stack-cors/src/Asm89/Stack/CorsService.php create mode 100644 vendor/autoload.php create mode 120000 vendor/bin/carbon create mode 120000 vendor/bin/commonmark create mode 120000 vendor/bin/php-parse create mode 120000 vendor/bin/phpunit create mode 120000 vendor/bin/psysh create mode 120000 vendor/bin/var-dump-server create mode 100644 vendor/brick/math/.github/FUNDING.yml create mode 100644 vendor/brick/math/LICENSE create mode 100644 vendor/brick/math/SECURITY.md create mode 100644 vendor/brick/math/composer.json create mode 100644 vendor/brick/math/psalm-baseline.xml create mode 100644 vendor/brick/math/psalm.xml create mode 100644 vendor/brick/math/src/BigDecimal.php create mode 100644 vendor/brick/math/src/BigInteger.php create mode 100644 vendor/brick/math/src/BigNumber.php create mode 100644 vendor/brick/math/src/BigRational.php create mode 100644 vendor/brick/math/src/Exception/DivisionByZeroException.php create mode 100644 vendor/brick/math/src/Exception/IntegerOverflowException.php create mode 100644 vendor/brick/math/src/Exception/MathException.php create mode 100644 vendor/brick/math/src/Exception/NegativeNumberException.php create mode 100644 vendor/brick/math/src/Exception/NumberFormatException.php create mode 100644 vendor/brick/math/src/Exception/RoundingNecessaryException.php create mode 100644 vendor/brick/math/src/Internal/Calculator.php create mode 100644 vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php create mode 100644 vendor/brick/math/src/Internal/Calculator/GmpCalculator.php create mode 100644 vendor/brick/math/src/Internal/Calculator/NativeCalculator.php create mode 100644 vendor/brick/math/src/RoundingMode.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/dnoegel/php-xdg-base-dir/LICENSE create mode 100644 vendor/dnoegel/php-xdg-base-dir/README.md create mode 100644 vendor/dnoegel/php-xdg-base-dir/composer.json create mode 100644 vendor/dnoegel/php-xdg-base-dir/src/Xdg.php create mode 100644 vendor/doctrine/inflector/LICENSE create mode 100644 vendor/doctrine/inflector/README.md create mode 100644 vendor/doctrine/inflector/composer.json create mode 100644 vendor/doctrine/inflector/docs/en/index.rst create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php create mode 100644 vendor/doctrine/inflector/phpstan.neon.dist create mode 100644 vendor/doctrine/instantiator/.doctrine-project.json create mode 100644 vendor/doctrine/instantiator/.github/FUNDING.yml create mode 100644 vendor/doctrine/instantiator/CONTRIBUTING.md create mode 100644 vendor/doctrine/instantiator/LICENSE create mode 100644 vendor/doctrine/instantiator/README.md create mode 100644 vendor/doctrine/instantiator/composer.json create mode 100644 vendor/doctrine/instantiator/docs/en/index.rst create mode 100644 vendor/doctrine/instantiator/docs/en/sidebar.rst create mode 100644 vendor/doctrine/instantiator/phpbench.json create mode 100644 vendor/doctrine/instantiator/phpcs.xml.dist create mode 100644 vendor/doctrine/instantiator/phpstan.neon.dist create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php create mode 100644 vendor/doctrine/lexer/LICENSE create mode 100644 vendor/doctrine/lexer/README.md create mode 100644 vendor/doctrine/lexer/composer.json create mode 100644 vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php create mode 100644 vendor/dragonmantank/cron-expression/.editorconfig create mode 100644 vendor/dragonmantank/cron-expression/CHANGELOG.md create mode 100644 vendor/dragonmantank/cron-expression/LICENSE create mode 100644 vendor/dragonmantank/cron-expression/README.md create mode 100644 vendor/dragonmantank/cron-expression/composer.json create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/HoursField.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php create mode 100644 vendor/dragonmantank/cron-expression/src/Cron/MonthField.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php create mode 100644 vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php create mode 100644 vendor/egulias/email-validator/LICENSE create mode 100644 vendor/egulias/email-validator/composer.json create mode 100644 vendor/egulias/email-validator/src/EmailLexer.php create mode 100644 vendor/egulias/email-validator/src/EmailParser.php create mode 100644 vendor/egulias/email-validator/src/EmailValidator.php create mode 100644 vendor/egulias/email-validator/src/Exception/AtextAfterCFWS.php create mode 100644 vendor/egulias/email-validator/src/Exception/CRLFAtTheEnd.php create mode 100644 vendor/egulias/email-validator/src/Exception/CRLFX2.php create mode 100644 vendor/egulias/email-validator/src/Exception/CRNoLF.php create mode 100644 vendor/egulias/email-validator/src/Exception/CharNotAllowed.php create mode 100644 vendor/egulias/email-validator/src/Exception/CommaInDomain.php create mode 100644 vendor/egulias/email-validator/src/Exception/ConsecutiveAt.php create mode 100644 vendor/egulias/email-validator/src/Exception/ConsecutiveDot.php create mode 100644 vendor/egulias/email-validator/src/Exception/DomainHyphened.php create mode 100644 vendor/egulias/email-validator/src/Exception/DotAtEnd.php create mode 100644 vendor/egulias/email-validator/src/Exception/DotAtStart.php create mode 100644 vendor/egulias/email-validator/src/Exception/ExpectingAT.php create mode 100644 vendor/egulias/email-validator/src/Exception/ExpectingATEXT.php create mode 100644 vendor/egulias/email-validator/src/Exception/ExpectingCTEXT.php create mode 100644 vendor/egulias/email-validator/src/Exception/ExpectingDTEXT.php create mode 100644 vendor/egulias/email-validator/src/Exception/ExpectingDomainLiteralClose.php create mode 100644 vendor/egulias/email-validator/src/Exception/ExpectingQPair.php create mode 100644 vendor/egulias/email-validator/src/Exception/InvalidEmail.php create mode 100644 vendor/egulias/email-validator/src/Exception/NoDNSRecord.php create mode 100644 vendor/egulias/email-validator/src/Exception/NoDomainPart.php create mode 100644 vendor/egulias/email-validator/src/Exception/NoLocalPart.php create mode 100644 vendor/egulias/email-validator/src/Exception/UnclosedComment.php create mode 100644 vendor/egulias/email-validator/src/Exception/UnclosedQuotedString.php create mode 100644 vendor/egulias/email-validator/src/Exception/UnopenedComment.php create mode 100644 vendor/egulias/email-validator/src/Parser/DomainPart.php create mode 100644 vendor/egulias/email-validator/src/Parser/LocalPart.php create mode 100644 vendor/egulias/email-validator/src/Parser/Parser.php create mode 100644 vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/EmailValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/Error/RFCWarnings.php create mode 100644 vendor/egulias/email-validator/src/Validation/Error/SpoofEmail.php create mode 100644 vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php create mode 100644 vendor/egulias/email-validator/src/Validation/MultipleErrors.php create mode 100644 vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php create mode 100644 vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/RFCValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/SpoofCheckValidation.php create mode 100644 vendor/egulias/email-validator/src/Warning/AddressLiteral.php create mode 100644 vendor/egulias/email-validator/src/Warning/CFWSNearAt.php create mode 100644 vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php create mode 100644 vendor/egulias/email-validator/src/Warning/Comment.php create mode 100644 vendor/egulias/email-validator/src/Warning/DeprecatedComment.php create mode 100644 vendor/egulias/email-validator/src/Warning/DomainLiteral.php create mode 100644 vendor/egulias/email-validator/src/Warning/DomainTooLong.php create mode 100644 vendor/egulias/email-validator/src/Warning/EmailTooLong.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6BadChar.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php create mode 100644 vendor/egulias/email-validator/src/Warning/LabelTooLong.php create mode 100644 vendor/egulias/email-validator/src/Warning/LocalTooLong.php create mode 100644 vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php create mode 100644 vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php create mode 100644 vendor/egulias/email-validator/src/Warning/QuotedPart.php create mode 100644 vendor/egulias/email-validator/src/Warning/QuotedString.php create mode 100644 vendor/egulias/email-validator/src/Warning/TLD.php create mode 100644 vendor/egulias/email-validator/src/Warning/Warning.php create mode 100644 vendor/facade/flare-client-php/.github/FUNDING.yml create mode 100644 vendor/facade/flare-client-php/.github/workflows/run-tests.yml create mode 100644 vendor/facade/flare-client-php/CHANGELOG.md create mode 100644 vendor/facade/flare-client-php/LICENSE.md create mode 100644 vendor/facade/flare-client-php/README.md create mode 100644 vendor/facade/flare-client-php/composer.json create mode 100644 vendor/facade/flare-client-php/src/Api.php create mode 100644 vendor/facade/flare-client-php/src/Concerns/HasContext.php create mode 100644 vendor/facade/flare-client-php/src/Concerns/UsesTime.php create mode 100644 vendor/facade/flare-client-php/src/Context/ConsoleContext.php create mode 100644 vendor/facade/flare-client-php/src/Context/ContextContextDetector.php create mode 100644 vendor/facade/flare-client-php/src/Context/ContextDetectorInterface.php create mode 100644 vendor/facade/flare-client-php/src/Context/ContextInterface.php create mode 100644 vendor/facade/flare-client-php/src/Context/RequestContext.php create mode 100644 vendor/facade/flare-client-php/src/Contracts/ProvidesFlareContext.php create mode 100644 vendor/facade/flare-client-php/src/Enums/GroupingTypes.php create mode 100644 vendor/facade/flare-client-php/src/Enums/MessageLevels.php create mode 100755 vendor/facade/flare-client-php/src/Flare.php create mode 100644 vendor/facade/flare-client-php/src/Frame.php create mode 100644 vendor/facade/flare-client-php/src/Glows/Glow.php create mode 100644 vendor/facade/flare-client-php/src/Glows/Recorder.php create mode 100644 vendor/facade/flare-client-php/src/Http/Client.php create mode 100644 vendor/facade/flare-client-php/src/Http/Exceptions/BadResponse.php create mode 100644 vendor/facade/flare-client-php/src/Http/Exceptions/BadResponseCode.php create mode 100644 vendor/facade/flare-client-php/src/Http/Exceptions/InvalidData.php create mode 100644 vendor/facade/flare-client-php/src/Http/Exceptions/MissingParameter.php create mode 100644 vendor/facade/flare-client-php/src/Http/Exceptions/NotFound.php create mode 100644 vendor/facade/flare-client-php/src/Http/Response.php create mode 100644 vendor/facade/flare-client-php/src/Middleware/AddGlows.php create mode 100644 vendor/facade/flare-client-php/src/Middleware/AnonymizeIp.php create mode 100644 vendor/facade/flare-client-php/src/Report.php create mode 100644 vendor/facade/flare-client-php/src/Solutions/ReportSolution.php create mode 100644 vendor/facade/flare-client-php/src/Stacktrace/Codesnippet.php create mode 100644 vendor/facade/flare-client-php/src/Stacktrace/File.php create mode 100644 vendor/facade/flare-client-php/src/Stacktrace/Frame.php create mode 100644 vendor/facade/flare-client-php/src/Stacktrace/Stacktrace.php create mode 100644 vendor/facade/flare-client-php/src/Time/SystemTime.php create mode 100644 vendor/facade/flare-client-php/src/Time/Time.php create mode 100644 vendor/facade/flare-client-php/src/Truncation/AbstractTruncationStrategy.php create mode 100644 vendor/facade/flare-client-php/src/Truncation/ReportTrimmer.php create mode 100644 vendor/facade/flare-client-php/src/Truncation/TrimContextItemsStrategy.php create mode 100644 vendor/facade/flare-client-php/src/Truncation/TrimStringsStrategy.php create mode 100644 vendor/facade/flare-client-php/src/Truncation/TruncationStrategy.php create mode 100644 vendor/facade/flare-client-php/src/View.php create mode 100644 vendor/facade/flare-client-php/src/helpers.php create mode 100644 vendor/facade/ignition-contracts/.styleci.yml create mode 100644 vendor/facade/ignition-contracts/CHANGELOG.md create mode 100644 vendor/facade/ignition-contracts/CONTRIBUTING.md create mode 100644 vendor/facade/ignition-contracts/LICENSE.md create mode 100644 vendor/facade/ignition-contracts/README.md create mode 100644 vendor/facade/ignition-contracts/Tests/SolutionTest.php create mode 100644 vendor/facade/ignition-contracts/composer.json create mode 100644 vendor/facade/ignition-contracts/docs/screenshot.png create mode 100644 vendor/facade/ignition-contracts/src/BaseSolution.php create mode 100644 vendor/facade/ignition-contracts/src/HasSolutionsForThrowable.php create mode 100644 vendor/facade/ignition-contracts/src/ProvidesSolution.php create mode 100644 vendor/facade/ignition-contracts/src/RunnableSolution.php create mode 100644 vendor/facade/ignition-contracts/src/Solution.php create mode 100644 vendor/facade/ignition-contracts/src/SolutionProviderRepository.php create mode 100644 vendor/facade/ignition/CHANGELOG.md create mode 100644 vendor/facade/ignition/LICENSE.md create mode 100644 vendor/facade/ignition/README.md create mode 100644 vendor/facade/ignition/composer.json create mode 100644 vendor/facade/ignition/config/flare.php create mode 100644 vendor/facade/ignition/config/ignition.php create mode 100644 vendor/facade/ignition/package.json create mode 100644 vendor/facade/ignition/resources/.gitignore create mode 100644 vendor/facade/ignition/resources/compiled/ignition.js create mode 100644 vendor/facade/ignition/resources/compiled/index.html create mode 100644 vendor/facade/ignition/resources/views/errorPage.php create mode 100644 vendor/facade/ignition/src/Actions/ShareReportAction.php create mode 100644 vendor/facade/ignition/src/Commands/SolutionMakeCommand.php create mode 100644 vendor/facade/ignition/src/Commands/TestCommand.php create mode 100644 vendor/facade/ignition/src/Commands/stubs/runnable-solution.stub create mode 100644 vendor/facade/ignition/src/Commands/stubs/solution.stub create mode 100644 vendor/facade/ignition/src/Context/LaravelConsoleContext.php create mode 100644 vendor/facade/ignition/src/Context/LaravelContextDetector.php create mode 100644 vendor/facade/ignition/src/Context/LaravelRequestContext.php create mode 100644 vendor/facade/ignition/src/DumpRecorder/Dump.php create mode 100644 vendor/facade/ignition/src/DumpRecorder/DumpHandler.php create mode 100644 vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php create mode 100644 vendor/facade/ignition/src/DumpRecorder/HtmlDumper.php create mode 100644 vendor/facade/ignition/src/DumpRecorder/MultiDumpHandler.php create mode 100644 vendor/facade/ignition/src/ErrorPage/ErrorPageHandler.php create mode 100644 vendor/facade/ignition/src/ErrorPage/ErrorPageViewModel.php create mode 100644 vendor/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php create mode 100644 vendor/facade/ignition/src/ErrorPage/Renderer.php create mode 100644 vendor/facade/ignition/src/Exceptions/InvalidConfig.php create mode 100644 vendor/facade/ignition/src/Exceptions/UnableToShareErrorException.php create mode 100644 vendor/facade/ignition/src/Exceptions/ViewException.php create mode 100644 vendor/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php create mode 100644 vendor/facade/ignition/src/Facades/Flare.php create mode 100644 vendor/facade/ignition/src/Http/Controllers/ExecuteSolutionController.php create mode 100644 vendor/facade/ignition/src/Http/Controllers/HealthCheckController.php create mode 100644 vendor/facade/ignition/src/Http/Controllers/ScriptController.php create mode 100644 vendor/facade/ignition/src/Http/Controllers/ShareReportController.php create mode 100644 vendor/facade/ignition/src/Http/Controllers/StyleController.php create mode 100644 vendor/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php create mode 100644 vendor/facade/ignition/src/Http/Middleware/IgnitionEnabled.php create mode 100644 vendor/facade/ignition/src/Http/Requests/ExecuteSolutionRequest.php create mode 100644 vendor/facade/ignition/src/Http/Requests/ShareReportRequest.php create mode 100644 vendor/facade/ignition/src/Ignition.php create mode 100644 vendor/facade/ignition/src/IgnitionConfig.php create mode 100644 vendor/facade/ignition/src/IgnitionServiceProvider.php create mode 100644 vendor/facade/ignition/src/LogRecorder/LogMessage.php create mode 100644 vendor/facade/ignition/src/LogRecorder/LogRecorder.php create mode 100644 vendor/facade/ignition/src/Logger/FlareHandler.php create mode 100644 vendor/facade/ignition/src/Middleware/AddDumps.php create mode 100644 vendor/facade/ignition/src/Middleware/AddEnvironmentInformation.php create mode 100644 vendor/facade/ignition/src/Middleware/AddGitInformation.php create mode 100644 vendor/facade/ignition/src/Middleware/AddLogs.php create mode 100644 vendor/facade/ignition/src/Middleware/AddQueries.php create mode 100644 vendor/facade/ignition/src/Middleware/AddSolutions.php create mode 100644 vendor/facade/ignition/src/Middleware/CustomizeGrouping.php create mode 100644 vendor/facade/ignition/src/Middleware/SetNotifierName.php create mode 100644 vendor/facade/ignition/src/QueryRecorder/Query.php create mode 100644 vendor/facade/ignition/src/QueryRecorder/QueryRecorder.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/IncorrectValetDbCredentialsSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/InvalidRouteActionSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php create mode 100644 vendor/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php create mode 100644 vendor/facade/ignition/src/Solutions/GenerateAppKeySolution.php create mode 100644 vendor/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php create mode 100644 vendor/facade/ignition/src/Solutions/MissingPackageSolution.php create mode 100644 vendor/facade/ignition/src/Solutions/RunMigrationsSolution.php create mode 100644 vendor/facade/ignition/src/Solutions/SolutionTransformer.php create mode 100644 vendor/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php create mode 100644 vendor/facade/ignition/src/Solutions/SuggestImportSolution.php create mode 100644 vendor/facade/ignition/src/Solutions/SuggestUsingCorrectDbNameSolution.php create mode 100644 vendor/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php create mode 100644 vendor/facade/ignition/src/Support/ComposerClassMap.php create mode 100644 vendor/facade/ignition/src/Support/FakeComposer.php create mode 100644 vendor/facade/ignition/src/Support/Packagist/Package.php create mode 100644 vendor/facade/ignition/src/Support/Packagist/Packagist.php create mode 100644 vendor/facade/ignition/src/Support/StringComparator.php create mode 100644 vendor/facade/ignition/src/Tabs/Tab.php create mode 100644 vendor/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php create mode 100644 vendor/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php create mode 100644 vendor/facade/ignition/src/Views/Engines/CompilerEngine.php create mode 100644 vendor/facade/ignition/src/Views/Engines/PhpEngine.php create mode 100644 vendor/facade/ignition/src/helpers.php create mode 100644 vendor/fideloper/proxy/LICENSE.md create mode 100755 vendor/fideloper/proxy/composer.json create mode 100644 vendor/fideloper/proxy/config/trustedproxy.php create mode 100644 vendor/fideloper/proxy/src/TrustProxies.php create mode 100644 vendor/fideloper/proxy/src/TrustedProxyServiceProvider.php create mode 100644 vendor/filp/whoops/CHANGELOG.md create mode 100644 vendor/filp/whoops/LICENSE.md create mode 100644 vendor/filp/whoops/composer.json create mode 100644 vendor/filp/whoops/src/Whoops/Exception/ErrorException.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/Formatter.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/Frame.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/FrameCollection.php create mode 100644 vendor/filp/whoops/src/Whoops/Exception/Inspector.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/CallbackHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/Handler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/HandlerInterface.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/JsonResponseHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/PlainTextHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Handler/XmlResponseHandler.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css create mode 100644 vendor/filp/whoops/src/Whoops/Resources/js/clipboard.min.js create mode 100644 vendor/filp/whoops/src/Whoops/Resources/js/prettify.min.js create mode 100644 vendor/filp/whoops/src/Whoops/Resources/js/whoops.base.js create mode 100644 vendor/filp/whoops/src/Whoops/Resources/js/zepto.min.js create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/env_details.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/frame_list.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/frames_container.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/frames_description.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/header.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/header_outer.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/layout.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/panel_details.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/panel_details_outer.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/panel_left.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Resources/views/panel_left_outer.html.php create mode 100644 vendor/filp/whoops/src/Whoops/Run.php create mode 100644 vendor/filp/whoops/src/Whoops/RunInterface.php create mode 100644 vendor/filp/whoops/src/Whoops/Util/HtmlDumperOutput.php create mode 100644 vendor/filp/whoops/src/Whoops/Util/Misc.php create mode 100644 vendor/filp/whoops/src/Whoops/Util/SystemFacade.php create mode 100644 vendor/filp/whoops/src/Whoops/Util/TemplateHelper.php create mode 100644 vendor/fruitcake/laravel-cors/.github/FUNDING.yml create mode 100644 vendor/fruitcake/laravel-cors/LICENSE create mode 100644 vendor/fruitcake/laravel-cors/changelog.md create mode 100644 vendor/fruitcake/laravel-cors/composer.json create mode 100644 vendor/fruitcake/laravel-cors/config/cors.php create mode 100644 vendor/fruitcake/laravel-cors/readme.md create mode 100644 vendor/fruitcake/laravel-cors/src/CorsServiceProvider.php create mode 100644 vendor/fruitcake/laravel-cors/src/HandleCors.php create mode 100644 vendor/fzaninotto/faker/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 vendor/fzaninotto/faker/.travis/xdebug.sh create mode 100644 vendor/fzaninotto/faker/CHANGELOG.md create mode 100644 vendor/fzaninotto/faker/LICENSE create mode 100644 vendor/fzaninotto/faker/composer.json create mode 100644 vendor/fzaninotto/faker/readme.md create mode 100644 vendor/fzaninotto/faker/src/Faker/Calculator/Ean.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Calculator/Iban.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Calculator/Inn.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Calculator/Luhn.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Calculator/TCNo.php create mode 100644 vendor/fzaninotto/faker/src/Faker/DefaultGenerator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Documentor.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Factory.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Generator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Guesser/Name.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Barcode.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Base.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Biased.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/File.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/HtmlLorem.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Image.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/at_AT/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bg_BG/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bg_BG/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bg_BG/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bg_BG/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bn_BD/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bn_BD/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bn_BD/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bn_BD/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/bn_BD/Utils.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/DateTime.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/da_DK/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/da_DK/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/da_DK/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/da_DK/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/da_DK/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/da_DK/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/de_DE/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_CY/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_CY/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_CY/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_CY/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_CY/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_CY/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_GR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_GR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_GR/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_GR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_GR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/el_GR/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_AU/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_AU/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_AU/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_CA/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_CA/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_GB/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_GB/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_GB/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_GB/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_GB/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_HK/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_IN/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NG/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NG/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NG/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NG/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NZ/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NZ/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_NZ/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_PH/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_PH/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_SG/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_SG/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_UG/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_US/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_US/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_US/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_AR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_PE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_PE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_PE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_PE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_VE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_VE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_VE/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_VE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/es_VE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/he_IL/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hr_HR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hr_HR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hr_HR/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hr_HR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hr_HR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hy_AM/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hy_AM/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hy_AM/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hy_AM/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hy_AM/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/hy_AM/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/id_ID/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/is_IS/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/it_IT/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/me_ME/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Miscellaneous.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/check_digit.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_MD/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_MD/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_MD/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_MD/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_MD/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_RS/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_RS/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sr_RS/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sv_SE/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sv_SE/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sv_SE/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sv_SE/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/sv_SE/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/th_TH/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/DateTime.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/tr_TR/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/DateTime.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Address.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Color.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/DateTime.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Internet.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Payment.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/PhoneNumber.php create mode 100644 vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php create mode 100644 vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php create mode 100644 vendor/fzaninotto/faker/src/Faker/ValidGenerator.php create mode 100644 vendor/fzaninotto/faker/src/autoload.php create mode 100644 vendor/guzzlehttp/guzzle/.php_cs create mode 100644 vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100644 vendor/guzzlehttp/guzzle/Dockerfile create mode 100644 vendor/guzzlehttp/guzzle/LICENSE create mode 100644 vendor/guzzlehttp/guzzle/README.md create mode 100644 vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100644 vendor/guzzlehttp/guzzle/composer.json create mode 100644 vendor/guzzlehttp/guzzle/src/Client.php create mode 100644 vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/SeekException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100644 vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100644 vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/Pool.php create mode 100644 vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100644 vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100644 vendor/guzzlehttp/guzzle/src/UriTemplate.php create mode 100644 vendor/guzzlehttp/guzzle/src/Utils.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100644 vendor/guzzlehttp/promises/CHANGELOG.md create mode 100644 vendor/guzzlehttp/promises/LICENSE create mode 100644 vendor/guzzlehttp/promises/Makefile create mode 100644 vendor/guzzlehttp/promises/README.md create mode 100644 vendor/guzzlehttp/promises/composer.json create mode 100644 vendor/guzzlehttp/promises/src/AggregateException.php create mode 100644 vendor/guzzlehttp/promises/src/CancellationException.php create mode 100644 vendor/guzzlehttp/promises/src/Coroutine.php create mode 100644 vendor/guzzlehttp/promises/src/EachPromise.php create mode 100644 vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100644 vendor/guzzlehttp/promises/src/Promise.php create mode 100644 vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100644 vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100644 vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100644 vendor/guzzlehttp/promises/src/RejectionException.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100644 vendor/guzzlehttp/promises/src/functions.php create mode 100644 vendor/guzzlehttp/promises/src/functions_include.php create mode 100644 vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100644 vendor/guzzlehttp/psr7/LICENSE create mode 100644 vendor/guzzlehttp/psr7/README.md create mode 100644 vendor/guzzlehttp/psr7/composer.json create mode 100644 vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100644 vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100644 vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/FnStream.php create mode 100644 vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100644 vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Request.php create mode 100644 vendor/guzzlehttp/psr7/src/Response.php create mode 100644 vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 vendor/guzzlehttp/psr7/src/Stream.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 vendor/guzzlehttp/psr7/src/Uri.php create mode 100644 vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100644 vendor/guzzlehttp/psr7/src/functions.php create mode 100644 vendor/guzzlehttp/psr7/src/functions_include.php create mode 100644 vendor/hamcrest/hamcrest-php/.coveralls.yml create mode 100644 vendor/hamcrest/hamcrest-php/.gitignore create mode 100644 vendor/hamcrest/hamcrest-php/.gush.yml create mode 100644 vendor/hamcrest/hamcrest-php/.travis.yml create mode 100644 vendor/hamcrest/hamcrest-php/CHANGES.txt create mode 100644 vendor/hamcrest/hamcrest-php/LICENSE.txt create mode 100644 vendor/hamcrest/hamcrest-php/README.md create mode 100644 vendor/hamcrest/hamcrest-php/TODO.txt create mode 100644 vendor/hamcrest/hamcrest-php/composer.json create mode 100644 vendor/hamcrest/hamcrest-php/composer.lock create mode 100644 vendor/hamcrest/hamcrest-php/generator/FactoryCall.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/FactoryClass.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/FactoryFile.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/FactoryGenerator.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/FactoryMethod.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/FactoryParameter.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/GlobalFunctionFile.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/StaticMethodFile.php create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/file_header.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/functions_footer.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/functions_header.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/functions_imports.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/matchers_footer.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/matchers_header.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/parts/matchers_imports.txt create mode 100644 vendor/hamcrest/hamcrest-php/generator/run.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArray.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContaining.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInAnyOrder.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInOrder.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKey.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKeyValuePair.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayWithSize.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/MatchingOnce.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/SeriesMatchingOnce.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/AssertionError.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseDescription.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsEmptyTraversable.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsTraversableWithSize.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AllOf.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AnyOf.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/CombinableMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/DescribedAs.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Every.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/HasToString.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Is.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsAnything.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsCollectionContaining.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsEqual.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsIdentical.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsInstanceOf.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNot.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNull.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsSame.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsTypeOf.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Set.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/ShortcutCombination.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Description.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/DiagnosingMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/FeatureMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Internal/SelfDescribingValue.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Matcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/MatcherAssert.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Matchers.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/NullDescription.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Number/IsCloseTo.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Number/OrderingComparison.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/SelfDescribing.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/StringDescription.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEmptyString.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEqualIgnoringCase.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEqualIgnoringWhiteSpace.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/MatchesPattern.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContains.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContainsIgnoringCase.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContainsInOrder.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringEndsWith.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringStartsWith.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/SubstringMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsArray.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsBoolean.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsCallable.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsDouble.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsInteger.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsNumeric.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsObject.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsResource.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsScalar.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsString.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/TypeSafeDiagnosingMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/TypeSafeMatcher.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Util.php create mode 100644 vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest/Xml/HasXPath.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/AbstractMatcherTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayContainingInAnyOrderTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayContainingInOrderTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayContainingKeyTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayContainingKeyValuePairTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayContainingTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Array/IsArrayWithSizeTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/BaseMatcherTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Collection/IsEmptyTraversableTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Collection/IsTraversableWithSizeTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/AllOfTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/AnyOfTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/CombinableMatcherTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/DescribedAsTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/EveryTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/HasToStringTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsAnythingTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsCollectionContainingTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsEqualTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsIdenticalTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsInstanceOfTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsNotTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsNullTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsSameTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/IsTypeOfTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/SampleBaseClass.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/SampleSubClass.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Core/SetTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/FeatureMatcherTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/MatcherAssertTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Number/IsCloseToTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Number/OrderingComparisonTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/StringDescriptionTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/IsEmptyStringTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/IsEqualIgnoringCaseTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/IsEqualIgnoringWhiteSpaceTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/MatchesPatternTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/StringContainsIgnoringCaseTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/StringContainsInOrderTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/StringContainsTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/StringEndsWithTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Text/StringStartsWithTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsArrayTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsBooleanTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsCallableTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsDoubleTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsIntegerTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsNumericTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsObjectTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsResourceTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsScalarTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Type/IsStringTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/UtilTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/Hamcrest/Xml/HasXPathTest.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/bootstrap.php create mode 100644 vendor/hamcrest/hamcrest-php/tests/phpunit.xml.dist create mode 100644 vendor/laravel/framework/LICENSE.md create mode 100644 vendor/laravel/framework/README.md create mode 100644 vendor/laravel/framework/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Access/AuthorizationException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Access/HandlesAuthorization.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Access/Response.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Authenticatable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/AuthenticationException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Console/ClearResetsCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/CreatesUserProviders.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Attempting.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Authenticated.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/CurrentDeviceLogout.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Failed.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Lockout.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Login.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Logout.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/OtherDeviceLogout.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/PasswordReset.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Registered.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Validated.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Events/Verified.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Middleware/AuthenticateWithBasicAuth.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Middleware/EnsureEmailIsVerified.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Middleware/RequirePassword.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Passwords/CanResetPassword.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Auth/Passwords/TokenRepositoryInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/Recaller.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/RequestGuard.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php create mode 100644 vendor/laravel/framework/src/Illuminate/Auth/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastController.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/LogBroadcaster.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/NullBroadcaster.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/UsePusherChannelConventions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/Channel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/EncryptedPrivateChannel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/InteractsWithSockets.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/PendingBroadcast.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/PresenceChannel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/PrivateChannel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Broadcasting/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Bus/BusServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Bus/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Bus/Queueable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Bus/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/ApcStore.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/ApcWrapper.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/ArrayLock.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Console/CacheTableCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/Console/ForgetCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Console/stubs/cache.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/DatabaseLock.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/DatabaseStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/DynamoDbLock.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/DynamoDbStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Events/CacheEvent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Events/CacheHit.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Events/CacheMissed.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Events/KeyForgotten.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Events/KeyWritten.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/FileStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/Lock.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/LuaScripts.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/MemcachedLock.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/MemcachedStore.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/NullStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/RateLimiter.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/RedisLock.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/Repository.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/RetrievesMultipleKeys.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/TagSet.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/TaggableStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cache/TaggedCache.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cache/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Config/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Config/Repository.php create mode 100755 vendor/laravel/framework/src/Illuminate/Config/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Console/Application.php create mode 100755 vendor/laravel/framework/src/Illuminate/Console/Command.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Concerns/HasParameters.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Concerns/InteractsWithIO.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Events/ArtisanStarting.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Events/CommandFinished.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Events/CommandStarting.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskFinished.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskSkipped.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskStarting.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Console/OutputStyle.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Parser.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheAware.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheEventMutex.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/CommandBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/EventMutex.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/ManagesFrequencies.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleFinishCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Console/Scheduling/SchedulingMutex.php create mode 100755 vendor/laravel/framework/src/Illuminate/Console/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php create mode 100755 vendor/laravel/framework/src/Illuminate/Container/Container.php create mode 100644 vendor/laravel/framework/src/Illuminate/Container/ContextualBindingBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Container/EntryNotFoundException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Container/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Container/RewindableGenerator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Container/Util.php create mode 100755 vendor/laravel/framework/src/Illuminate/Container/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/Access/Authorizable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/Access/Gate.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/Authenticatable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/CanResetPassword.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/Guard.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/Middleware/AuthenticatesRequests.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/MustVerifyEmail.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/PasswordBroker.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/PasswordBrokerFactory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/StatefulGuard.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/SupportsBasicAuth.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Auth/UserProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/Broadcaster.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcastNow.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Bus/QueueingDispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cache/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cache/Lock.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cache/LockProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cache/LockTimeoutException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cache/Repository.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cache/Store.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Config/Repository.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Console/Application.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Container/BindingResolutionException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Container/Container.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Container/ContextualBindingBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Cookie/QueueingFactory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/Castable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/CastsAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/CastsInboundAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Database/Events/MigrationEvent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Debug/ExceptionHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Encryption/DecryptException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Encryption/EncryptException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Encryption/Encrypter.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Events/Dispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Filesystem/Cloud.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Filesystem/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Filesystem/FileExistsException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Filesystem/FileNotFoundException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Filesystem/Filesystem.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Foundation/CachesConfiguration.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Foundation/CachesRoutes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Http/Kernel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Mail/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Mail/MailQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Mail/Mailable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Mail/Mailer.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Notifications/Dispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Notifications/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Pagination/LengthAwarePaginator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Pagination/Paginator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Pipeline/Hub.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Pipeline/Pipeline.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/EntityNotFoundException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/EntityResolver.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/Job.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/Monitor.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/Queue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/QueueableCollection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/QueueableEntity.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Queue/ShouldQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Redis/Connection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Redis/Connector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Redis/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Redis/LimiterTimeoutException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Routing/BindingRegistrar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Routing/Registrar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Routing/ResponseFactory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Routing/UrlGenerator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Routing/UrlRoutable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Session/Session.php create mode 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/Arrayable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Support/DeferrableProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Support/DeferringDisplayableValue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Support/Htmlable.php create mode 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/Jsonable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Support/MessageBag.php create mode 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/MessageProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Contracts/Support/Renderable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Support/Responsable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Translation/HasLocalePreference.php create mode 100755 vendor/laravel/framework/src/Illuminate/Contracts/Translation/Loader.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Translation/Translator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Validation/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Validation/ImplicitRule.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Validation/Rule.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Validation/ValidatesWhenResolved.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/Validation/Validator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Contracts/View/Engine.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/View/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/View/View.php create mode 100644 vendor/laravel/framework/src/Illuminate/Contracts/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cookie/CookieServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cookie/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php create mode 100644 vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php create mode 100755 vendor/laravel/framework/src/Illuminate/Cookie/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Capsule/Manager.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/ConfigurationUrlParser.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connection.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/ConnectionInterface.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/ConnectionResolver.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/ConnectionResolverInterface.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectorInterface.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Factories/FactoryMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Factories/stubs/factory.stub create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/TableGuesser.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeederMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/stubs/seeder.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Console/WipeCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/DatabaseServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/DetectsConcurrencyErrors.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasGlobalScopes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HidesAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/HigherOrderBuilderProxy.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/JsonEncodingException.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/MassAssignmentException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/QueueEntityResolver.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/RelationNotFoundException.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/AsPivot.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasMany.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOne.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneThrough.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphMany.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOne.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOneOrMany.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Scope.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletingScope.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/ConnectionEvent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/MigrationEnded.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/MigrationEvent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/MigrationStarted.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/MigrationsEnded.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/MigrationsStarted.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/NoPendingMigrations.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/QueryExecuted.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/StatementPrepared.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/TransactionBeginning.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/TransactionCommitted.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Events/TransactionRolledBack.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Grammar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/LICENSE.md create mode 100755 vendor/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/Migration.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/migration.create.stub create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/migration.stub create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs/migration.update.stub create mode 100755 vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/PostgresConnection.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Expression.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/JoinClause.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/SQLiteProcessor.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Query/Processors/SqlServerProcessor.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/QueryException.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/README.md create mode 100755 vendor/laravel/framework/src/Illuminate/Database/SQLiteConnection.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/ColumnDefinition.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/ForeignIdColumnDefinition.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/ForeignKeyDefinition.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/ChangeColumn.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/RenameColumn.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/Schema/SqlServerBuilder.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/Seeder.php create mode 100755 vendor/laravel/framework/src/Illuminate/Database/SqlServerConnection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Database/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php create mode 100755 vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Encryption/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Encryption/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php create mode 100755 vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php create mode 100755 vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Events/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Events/NullDispatcher.php create mode 100755 vendor/laravel/framework/src/Illuminate/Events/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/Cache.php create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Filesystem/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Foundation/AliasLoader.php create mode 100755 vendor/laravel/framework/src/Illuminate/Foundation/Application.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Auth/Access/Authorizable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Auth/User.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterProviders.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/SetRequestForConsole.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bus/DispatchesJobs.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bus/PendingChain.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Bus/PendingDispatch.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/ComposerScripts.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/CastMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ChannelMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ClearCompiledCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ClosureCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ComponentMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ConfigClearCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ConsoleMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/EnvironmentCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/EventCacheCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/EventClearCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/EventGenerateCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/EventListCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/EventMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ExceptionMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/JobMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/KeyGenerateCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ListenerMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/MailMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/NotificationMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ObserverMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeClearCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/PackageDiscoverCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ProviderMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/QueuedCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/RequestMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ResourceMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteCacheCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteClearCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/RuleMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/StorageLinkCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/StubPublishCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/TestMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/UpCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/VendorPublishCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ViewCacheCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/ViewClearCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/cast.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/channel.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/console.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/event.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/exception-render-report.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/exception-render.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/exception-report.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/exception.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/job.queued.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/job.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/listener-duck.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/listener-queued-duck.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/listener-queued.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/listener.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/mail.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/markdown-mail.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/markdown-notification.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/markdown.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/model.pivot.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/model.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/notification.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/observer.plain.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/observer.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/policy.plain.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/policy.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/provider.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/request.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/resource-collection.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/resource.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/routes.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/rule.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/test.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/test.unit.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/view-component.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/EnvironmentDetector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Events/DiscoverEvents.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Events/Dispatchable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Events/LocaleUpdated.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/WhoopsHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/401.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/403.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/404.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/419.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/429.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/500.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/503.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/illustrated-layout.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/layout.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views/minimal.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Events/RequestHandled.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Exceptions/MaintenanceModeException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Inspiring.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Mix.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/PackageManifest.php create mode 100755 vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php create mode 100755 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ConsoleSupportServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Support/Providers/AuthServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Support/Providers/EventServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Support/Providers/RouteServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithAuthentication.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithConsole.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithDatabase.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithExceptionHandling.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithRedis.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithSession.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/DatabaseMigrations.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/DatabaseTransactions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabaseState.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/WithFaker.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/WithoutEvents.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Testing/WithoutMiddleware.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/helpers.php create mode 100644 vendor/laravel/framework/src/Illuminate/Foundation/stubs/facade.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Hashing/AbstractHasher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Hashing/Argon2IdHasher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Hashing/ArgonHasher.php create mode 100755 vendor/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Hashing/HashManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Hashing/HashServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Hashing/LICENSE.md create mode 100755 vendor/laravel/framework/src/Illuminate/Hashing/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/ConnectionException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/PendingRequest.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/Request.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/RequestException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/Response.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Client/ResponseSequence.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithContentTypes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithFlashData.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithInput.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Exceptions/HttpResponseException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Exceptions/PostTooLargeException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Exceptions/ThrottleRequestsException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/File.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/FileHelpers.php create mode 100755 vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Middleware/CheckResponseForModifications.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Middleware/FrameGuard.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustHosts.php create mode 100755 vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Request.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/CollectsResources.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/Json/AnonymousResourceCollection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/Json/PaginatedResourceResponse.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceCollection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceResponse.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/MergeValue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/MissingValue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Resources/PotentiallyMissing.php create mode 100755 vendor/laravel/framework/src/Illuminate/Http/Response.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/ResponseTrait.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Testing/File.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/Testing/MimeType.php create mode 100644 vendor/laravel/framework/src/Illuminate/Http/UploadedFile.php create mode 100755 vendor/laravel/framework/src/Illuminate/Http/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Log/Events/MessageLogged.php create mode 100644 vendor/laravel/framework/src/Illuminate/Log/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Log/LogManager.php create mode 100644 vendor/laravel/framework/src/Illuminate/Log/LogServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Log/Logger.php create mode 100644 vendor/laravel/framework/src/Illuminate/Log/ParsesLogConfiguration.php create mode 100755 vendor/laravel/framework/src/Illuminate/Log/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Events/MessageSending.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Events/MessageSent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/MailManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Mail/MailServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Mailable.php create mode 100755 vendor/laravel/framework/src/Illuminate/Mail/Mailer.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Markdown.php create mode 100755 vendor/laravel/framework/src/Illuminate/Mail/Message.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/PendingMail.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Transport/ArrayTransport.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Transport/LogTransport.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Transport/MailgunTransport.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Transport/SesTransport.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/Transport/Transport.php create mode 100755 vendor/laravel/framework/src/Illuminate/Mail/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/button.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/footer.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/header.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/layout.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/message.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/panel.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/subcopy.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/table.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/html/themes/default.css create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/button.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/footer.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/header.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/layout.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/message.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/panel.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/subcopy.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Mail/resources/views/text/table.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Action.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/AnonymousNotifiable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/ChannelManager.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Channels/BroadcastChannel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Console/NotificationTableCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Console/stubs/notifications.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/DatabaseNotification.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/DatabaseNotificationCollection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Events/BroadcastNotificationCreated.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Events/NotificationFailed.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Events/NotificationSending.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Events/NotificationSent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/HasDatabaseNotifications.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Messages/BroadcastMessage.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Messages/DatabaseMessage.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Messages/MailMessage.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Messages/SimpleMessage.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Notifiable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/Notification.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/NotificationServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/SendQueuedNotifications.php create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Notifications/resources/views/email.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/AbstractPaginator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/Paginator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/UrlWindow.php create mode 100755 vendor/laravel/framework/src/Illuminate/Pagination/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/bootstrap-4.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/default.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/semantic-ui.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/simple-bootstrap-4.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/simple-default.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/simple-tailwind.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pagination/resources/views/tailwind.blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pipeline/Hub.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pipeline/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pipeline/PipelineServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Pipeline/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/CallQueuedClosure.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Capsule/Manager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/BeanstalkdConnector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/ConnectorInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Connectors/DatabaseConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Connectors/NullConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Connectors/RedisConnector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Connectors/SyncConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/FailedTableCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/FlushFailedCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/ForgetFailedCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/ListFailedCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/RestartCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/RetryCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/TableCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/stubs/failed_jobs.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Console/stubs/jobs.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Events/JobExceptionOccurred.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Events/JobFailed.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Events/JobProcessed.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Events/JobProcessing.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Events/Looping.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Events/WorkerStopping.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Failed/DatabaseFailedJobProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Failed/DynamoDbFailedJobProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Failed/FailedJobProviderInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Failed/NullFailedJobProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/InteractsWithQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/InvalidPayloadException.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Jobs/DatabaseJob.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Jobs/DatabaseJobRecord.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Jobs/JobName.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Jobs/RedisJob.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/SqsJob.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Jobs/SyncJob.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/LICENSE.md create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Listener.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/ListenerOptions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/LuaScripts.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/ManuallyFailedException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/MaxAttemptsExceededException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/NullQueue.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/Queue.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/QueueManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/QueueServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/README.md create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/SerializableClosure.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/SerializesAndRestoresModelIdentifiers.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/SerializesModels.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/SqsQueue.php create mode 100755 vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/Worker.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/WorkerOptions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Queue/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisClusterConnection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisConnection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connections/PredisClusterConnection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connections/PredisConnection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Connectors/PredisConnector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Events/CommandExecuted.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Limiters/ConcurrencyLimiter.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Limiters/ConcurrencyLimiterBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Limiters/DurationLimiter.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/Limiters/DurationLimiterBuilder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Redis/RedisServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Redis/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/CompiledRouteCollection.php create mode 100755 vendor/laravel/framework/src/Illuminate/Routing/Console/ControllerMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/MiddlewareMakeCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.api.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.invokable.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.model.api.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.model.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.nested.api.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.nested.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.plain.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/controller.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Console/stubs/middleware.stub create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Contracts/ControllerDispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Controller.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/ControllerMiddlewareOptions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Events/RouteMatched.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Exceptions/InvalidSignatureException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Exceptions/UrlGenerationException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/ImplicitRouteBinding.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Matching/HostValidator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Matching/MethodValidator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Matching/SchemeValidator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Matching/UriValidator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Matching/ValidatorInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequestsWithRedis.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Middleware/ValidateSignature.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/MiddlewareNameResolver.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/PendingResourceRegistration.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RedirectController.php create mode 100755 vendor/laravel/framework/src/Illuminate/Routing/Redirector.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/ResourceRegistrar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/ResponseFactory.php create mode 100755 vendor/laravel/framework/src/Illuminate/Routing/Route.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteAction.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteBinding.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteCollectionInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteFileRegistrar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteGroup.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteParameterBinder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteRegistrar.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteUri.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/RouteUrlGenerator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/Router.php create mode 100755 vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/SortedMiddleware.php create mode 100755 vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/ViewController.php create mode 100644 vendor/laravel/framework/src/Illuminate/Routing/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Session/ArraySessionHandler.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/Console/SessionTableCommand.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/Console/stubs/database.stub create mode 100755 vendor/laravel/framework/src/Illuminate/Session/CookieSessionHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/DatabaseSessionHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/EncryptedStore.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/ExistenceAwareInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/FileSessionHandler.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php create mode 100644 vendor/laravel/framework/src/Illuminate/Session/NullSessionHandler.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/SessionManager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/Store.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/TokenMismatchException.php create mode 100755 vendor/laravel/framework/src/Illuminate/Session/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Support/AggregateServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Arr.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Carbon.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Collection.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Composer.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/ConfigurationUrlParser.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/DateFactory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Enumerable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Env.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/App.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Artisan.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Blade.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Broadcast.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Bus.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Cache.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Config.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Cookie.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Crypt.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/DB.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Date.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Event.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/File.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Gate.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Hash.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Http.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Lang.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Log.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Mail.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Notification.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Password.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Queue.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Redirect.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Redis.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Request.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Response.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Schema.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Session.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Facades/Storage.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/URL.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/Validator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Facades/View.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Fluent.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/HigherOrderTapProxy.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/HigherOrderWhenProxy.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/HtmlString.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/InteractsWithTime.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Support/LazyCollection.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Manager.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/MessageBag.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Optional.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/ProcessUtils.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Reflector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Str.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Stringable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/BusFake.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/EventFake.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/MailFake.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/NotificationFake.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/PendingMailFake.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/QueueFake.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/CapsuleManagerTrait.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/EnumeratesValues.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/Localizable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/ReflectsClosures.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/Traits/Tappable.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/ViewErrorBag.php create mode 100644 vendor/laravel/framework/src/Illuminate/Support/composer.json create mode 100755 vendor/laravel/framework/src/Illuminate/Support/helpers.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/Assert.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/Constraints/ArraySubset.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/Constraints/CountInDatabase.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/Constraints/HasInDatabase.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/Constraints/SeeInOrder.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/Constraints/SoftDeletedInDatabase.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/PendingCommand.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/TestResponse.php create mode 100644 vendor/laravel/framework/src/Illuminate/Testing/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Translation/ArrayLoader.php create mode 100755 vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php create mode 100644 vendor/laravel/framework/src/Illuminate/Translation/LICENSE.md create mode 100755 vendor/laravel/framework/src/Illuminate/Translation/MessageSelector.php create mode 100755 vendor/laravel/framework/src/Illuminate/Translation/TranslationServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Translation/Translator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Translation/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/ClosureValidationRule.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Concerns/FilterEmailValidation.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Concerns/FormatsMessages.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Concerns/ReplacesAttributes.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifierInterface.php create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/Factory.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/LICENSE.md create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/PresenceVerifierInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rule.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/DatabaseRule.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/Dimensions.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/Exists.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/In.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/NotIn.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/RequiredIf.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/Rules/Unique.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/UnauthorizedException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/ValidationData.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/ValidationException.php create mode 100644 vendor/laravel/framework/src/Illuminate/Validation/ValidationRuleParser.php create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/ValidationServiceProvider.php create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/Validator.php create mode 100755 vendor/laravel/framework/src/Illuminate/Validation/composer.json create mode 100644 vendor/laravel/framework/src/Illuminate/View/AnonymousComponent.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Compilers/Compiler.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Compilers/CompilerInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/ComponentTagCompiler.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesAuthorizations.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesComments.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesComponents.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesConditionals.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesEchos.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesErrors.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesHelpers.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesIncludes.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesInjections.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesJson.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLayouts.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLoops.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesRawPhp.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesStacks.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesTranslations.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Component.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/ComponentAttributeBag.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesComponents.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesEvents.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesLayouts.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesLoops.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesStacks.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesTranslations.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Engines/Engine.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Engines/EngineResolver.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/Engines/FileEngine.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/Factory.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/InvokableComponentVariable.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/LICENSE.md create mode 100644 vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/View.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/ViewFinderInterface.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/ViewName.php create mode 100755 vendor/laravel/framework/src/Illuminate/View/ViewServiceProvider.php create mode 100644 vendor/laravel/framework/src/Illuminate/View/composer.json create mode 100644 vendor/laravel/sanctum/LICENSE.md create mode 100644 vendor/laravel/sanctum/README.md create mode 100644 vendor/laravel/sanctum/composer.json create mode 100644 vendor/laravel/sanctum/config/sanctum.php create mode 100644 vendor/laravel/sanctum/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php create mode 100644 vendor/laravel/sanctum/src/Contracts/HasAbilities.php create mode 100644 vendor/laravel/sanctum/src/Guard.php create mode 100644 vendor/laravel/sanctum/src/HasApiTokens.php create mode 100644 vendor/laravel/sanctum/src/Http/Controllers/CsrfCookieController.php create mode 100644 vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php create mode 100644 vendor/laravel/sanctum/src/NewAccessToken.php create mode 100644 vendor/laravel/sanctum/src/PersonalAccessToken.php create mode 100644 vendor/laravel/sanctum/src/Sanctum.php create mode 100644 vendor/laravel/sanctum/src/SanctumServiceProvider.php create mode 100644 vendor/laravel/sanctum/src/TransientToken.php create mode 100644 vendor/laravel/tinker/CHANGELOG.md create mode 100644 vendor/laravel/tinker/LICENSE.md create mode 100644 vendor/laravel/tinker/README.md create mode 100644 vendor/laravel/tinker/composer.json create mode 100644 vendor/laravel/tinker/config/tinker.php create mode 100644 vendor/laravel/tinker/src/ClassAliasAutoloader.php create mode 100644 vendor/laravel/tinker/src/Console/TinkerCommand.php create mode 100644 vendor/laravel/tinker/src/TinkerCaster.php create mode 100644 vendor/laravel/tinker/src/TinkerServiceProvider.php create mode 100644 vendor/laravel/ui/CHANGELOG.md create mode 100644 vendor/laravel/ui/LICENSE.md create mode 100644 vendor/laravel/ui/README.md create mode 100644 vendor/laravel/ui/auth-backend/AuthenticatesUsers.php create mode 100644 vendor/laravel/ui/auth-backend/ConfirmsPasswords.php create mode 100644 vendor/laravel/ui/auth-backend/RedirectsUsers.php create mode 100644 vendor/laravel/ui/auth-backend/RegistersUsers.php create mode 100644 vendor/laravel/ui/auth-backend/ResetsPasswords.php create mode 100644 vendor/laravel/ui/auth-backend/SendsPasswordResetEmails.php create mode 100644 vendor/laravel/ui/auth-backend/ThrottlesLogins.php create mode 100644 vendor/laravel/ui/auth-backend/VerifiesEmails.php create mode 100644 vendor/laravel/ui/composer.json create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/auth/login.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/auth/passwords/confirm.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/auth/passwords/email.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/auth/passwords/reset.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/auth/register.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/auth/verify.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/home.stub create mode 100644 vendor/laravel/ui/src/Auth/bootstrap-stubs/layouts/app.stub create mode 100644 vendor/laravel/ui/src/Auth/stubs/controllers/HomeController.stub create mode 100644 vendor/laravel/ui/src/Auth/stubs/routes.stub create mode 100644 vendor/laravel/ui/src/AuthCommand.php create mode 100644 vendor/laravel/ui/src/AuthRouteMethods.php create mode 100644 vendor/laravel/ui/src/ControllersCommand.php create mode 100644 vendor/laravel/ui/src/Presets/Bootstrap.php create mode 100644 vendor/laravel/ui/src/Presets/Preset.php create mode 100644 vendor/laravel/ui/src/Presets/React.php create mode 100644 vendor/laravel/ui/src/Presets/Vue.php create mode 100644 vendor/laravel/ui/src/Presets/bootstrap-stubs/_variables.scss create mode 100644 vendor/laravel/ui/src/Presets/bootstrap-stubs/app.scss create mode 100644 vendor/laravel/ui/src/Presets/bootstrap-stubs/bootstrap.js create mode 100644 vendor/laravel/ui/src/Presets/react-stubs/Example.js create mode 100644 vendor/laravel/ui/src/Presets/react-stubs/app.js create mode 100644 vendor/laravel/ui/src/Presets/react-stubs/webpack.mix.js create mode 100644 vendor/laravel/ui/src/Presets/vue-stubs/ExampleComponent.vue create mode 100644 vendor/laravel/ui/src/Presets/vue-stubs/app.js create mode 100644 vendor/laravel/ui/src/Presets/vue-stubs/webpack.mix.js create mode 100644 vendor/laravel/ui/src/UiCommand.php create mode 100644 vendor/laravel/ui/src/UiServiceProvider.php create mode 100644 vendor/laravel/ui/stubs/Auth/ConfirmPasswordController.stub create mode 100644 vendor/laravel/ui/stubs/Auth/ForgotPasswordController.stub create mode 100644 vendor/laravel/ui/stubs/Auth/LoginController.stub create mode 100644 vendor/laravel/ui/stubs/Auth/RegisterController.stub create mode 100644 vendor/laravel/ui/stubs/Auth/ResetPasswordController.stub create mode 100644 vendor/laravel/ui/stubs/Auth/VerificationController.stub create mode 100644 vendor/laravel/ui/stubs/migrations/2014_10_12_100000_create_password_resets_table.php create mode 100644 vendor/league/commonmark/.phpstorm.meta.php create mode 100644 vendor/league/commonmark/CHANGELOG-0.x.md create mode 100644 vendor/league/commonmark/CHANGELOG.md create mode 100644 vendor/league/commonmark/CODE_OF_CONDUCT.md create mode 100644 vendor/league/commonmark/LICENSE create mode 100644 vendor/league/commonmark/README.md create mode 100755 vendor/league/commonmark/bin/commonmark create mode 100644 vendor/league/commonmark/composer.json create mode 100644 vendor/league/commonmark/src/Block/Element/AbstractBlock.php create mode 100644 vendor/league/commonmark/src/Block/Element/AbstractStringContainerBlock.php create mode 100644 vendor/league/commonmark/src/Block/Element/BlockQuote.php create mode 100644 vendor/league/commonmark/src/Block/Element/Document.php create mode 100644 vendor/league/commonmark/src/Block/Element/FencedCode.php create mode 100644 vendor/league/commonmark/src/Block/Element/Heading.php create mode 100644 vendor/league/commonmark/src/Block/Element/HtmlBlock.php create mode 100644 vendor/league/commonmark/src/Block/Element/IndentedCode.php create mode 100644 vendor/league/commonmark/src/Block/Element/InlineContainerInterface.php create mode 100644 vendor/league/commonmark/src/Block/Element/ListBlock.php create mode 100644 vendor/league/commonmark/src/Block/Element/ListData.php create mode 100644 vendor/league/commonmark/src/Block/Element/ListItem.php create mode 100644 vendor/league/commonmark/src/Block/Element/Paragraph.php create mode 100644 vendor/league/commonmark/src/Block/Element/StringContainerInterface.php create mode 100644 vendor/league/commonmark/src/Block/Element/ThematicBreak.php create mode 100644 vendor/league/commonmark/src/Block/Parser/ATXHeadingParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/BlockParserInterface.php create mode 100644 vendor/league/commonmark/src/Block/Parser/BlockQuoteParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/FencedCodeParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/HtmlBlockParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/IndentedCodeParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/LazyParagraphParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/ListParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/SetExtHeadingParser.php create mode 100644 vendor/league/commonmark/src/Block/Parser/ThematicBreakParser.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/BlockQuoteRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/BlockRendererInterface.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/DocumentRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/FencedCodeRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/HeadingRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/HtmlBlockRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/IndentedCodeRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/ListBlockRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/ListItemRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/ParagraphRenderer.php create mode 100644 vendor/league/commonmark/src/Block/Renderer/ThematicBreakRenderer.php create mode 100644 vendor/league/commonmark/src/CommonMarkConverter.php create mode 100644 vendor/league/commonmark/src/ConfigurableEnvironmentInterface.php create mode 100644 vendor/league/commonmark/src/Context.php create mode 100644 vendor/league/commonmark/src/ContextInterface.php create mode 100644 vendor/league/commonmark/src/Converter.php create mode 100644 vendor/league/commonmark/src/ConverterInterface.php create mode 100644 vendor/league/commonmark/src/Cursor.php create mode 100644 vendor/league/commonmark/src/Delimiter/Delimiter.php create mode 100644 vendor/league/commonmark/src/Delimiter/DelimiterInterface.php create mode 100644 vendor/league/commonmark/src/Delimiter/DelimiterStack.php create mode 100644 vendor/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollection.php create mode 100644 vendor/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollectionInterface.php create mode 100644 vendor/league/commonmark/src/Delimiter/Processor/DelimiterProcessorInterface.php create mode 100644 vendor/league/commonmark/src/Delimiter/Processor/EmphasisDelimiterProcessor.php create mode 100644 vendor/league/commonmark/src/Delimiter/Processor/StaggeredDelimiterProcessor.php create mode 100644 vendor/league/commonmark/src/DocParser.php create mode 100644 vendor/league/commonmark/src/DocParserInterface.php create mode 100644 vendor/league/commonmark/src/ElementRendererInterface.php create mode 100644 vendor/league/commonmark/src/Environment.php create mode 100644 vendor/league/commonmark/src/EnvironmentAwareInterface.php create mode 100644 vendor/league/commonmark/src/EnvironmentInterface.php create mode 100644 vendor/league/commonmark/src/Event/AbstractEvent.php create mode 100644 vendor/league/commonmark/src/Event/DocumentParsedEvent.php create mode 100644 vendor/league/commonmark/src/Event/DocumentPreParsedEvent.php create mode 100644 vendor/league/commonmark/src/Exception/InvalidOptionException.php create mode 100644 vendor/league/commonmark/src/Exception/UnexpectedEncodingException.php create mode 100644 vendor/league/commonmark/src/Extension/Autolink/AutolinkExtension.php create mode 100644 vendor/league/commonmark/src/Extension/Autolink/EmailAutolinkProcessor.php create mode 100644 vendor/league/commonmark/src/Extension/Autolink/InlineMentionParser.php create mode 100644 vendor/league/commonmark/src/Extension/Autolink/UrlAutolinkProcessor.php create mode 100644 vendor/league/commonmark/src/Extension/CommonMarkCoreExtension.php create mode 100644 vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlBlockRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlExtension.php create mode 100644 vendor/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlInlineRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/ExtensionInterface.php create mode 100644 vendor/league/commonmark/src/Extension/ExternalLink/ExternalLinkExtension.php create mode 100644 vendor/league/commonmark/src/Extension/ExternalLink/ExternalLinkProcessor.php create mode 100644 vendor/league/commonmark/src/Extension/GithubFlavoredMarkdownExtension.php create mode 100644 vendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalink.php create mode 100644 vendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkExtension.php create mode 100644 vendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkProcessor.php create mode 100644 vendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/HeadingPermalink/Slug/DefaultSlugGenerator.php create mode 100644 vendor/league/commonmark/src/Extension/HeadingPermalink/Slug/SlugGeneratorInterface.php create mode 100644 vendor/league/commonmark/src/Extension/InlinesOnly/ChildRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/InlinesOnly/InlinesOnlyExtension.php create mode 100644 vendor/league/commonmark/src/Extension/SmartPunct/PunctuationParser.php create mode 100644 vendor/league/commonmark/src/Extension/SmartPunct/Quote.php create mode 100644 vendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php create mode 100644 vendor/league/commonmark/src/Extension/SmartPunct/QuoteProcessor.php create mode 100644 vendor/league/commonmark/src/Extension/SmartPunct/QuoteRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/SmartPunct/SmartPunctExtension.php create mode 100644 vendor/league/commonmark/src/Extension/Strikethrough/Strikethrough.php create mode 100644 vendor/league/commonmark/src/Extension/Strikethrough/StrikethroughDelimiterProcessor.php create mode 100644 vendor/league/commonmark/src/Extension/Strikethrough/StrikethroughExtension.php create mode 100644 vendor/league/commonmark/src/Extension/Strikethrough/StrikethroughRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/Table/Table.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableCell.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableCellRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableExtension.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableParser.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableRow.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableRowRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableSection.php create mode 100644 vendor/league/commonmark/src/Extension/Table/TableSectionRenderer.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/Normalizer/AsIsNormalizerStrategy.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/Normalizer/FlatNormalizerStrategy.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/Normalizer/NormalizerStrategyInterface.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/Normalizer/RelativeNormalizerStrategy.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/TableOfContents.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsBuilder.php create mode 100644 vendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsExtension.php create mode 100644 vendor/league/commonmark/src/Extension/TaskList/TaskListExtension.php create mode 100644 vendor/league/commonmark/src/Extension/TaskList/TaskListItemMarker.php create mode 100644 vendor/league/commonmark/src/Extension/TaskList/TaskListItemMarkerParser.php create mode 100644 vendor/league/commonmark/src/Extension/TaskList/TaskListItemMarkerRenderer.php create mode 100644 vendor/league/commonmark/src/GithubFlavoredMarkdownConverter.php create mode 100644 vendor/league/commonmark/src/HtmlElement.php create mode 100644 vendor/league/commonmark/src/HtmlRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/AdjacentTextMerger.php create mode 100644 vendor/league/commonmark/src/Inline/Element/AbstractInline.php create mode 100644 vendor/league/commonmark/src/Inline/Element/AbstractStringContainer.php create mode 100644 vendor/league/commonmark/src/Inline/Element/AbstractWebResource.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Code.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Emphasis.php create mode 100644 vendor/league/commonmark/src/Inline/Element/HtmlInline.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Image.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Link.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Newline.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Strong.php create mode 100644 vendor/league/commonmark/src/Inline/Element/Text.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/AutolinkParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/BacktickParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/BangParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/CloseBracketParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/EntityParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/EscapableParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/HtmlInlineParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/InlineParserInterface.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/NewlineParser.php create mode 100644 vendor/league/commonmark/src/Inline/Parser/OpenBracketParser.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/CodeRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/EmphasisRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/HtmlInlineRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/ImageRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/InlineRendererInterface.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/LinkRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/NewlineRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/StrongRenderer.php create mode 100644 vendor/league/commonmark/src/Inline/Renderer/TextRenderer.php create mode 100644 vendor/league/commonmark/src/InlineParserContext.php create mode 100644 vendor/league/commonmark/src/InlineParserEngine.php create mode 100644 vendor/league/commonmark/src/Input/MarkdownInput.php create mode 100644 vendor/league/commonmark/src/Input/MarkdownInputInterface.php create mode 100644 vendor/league/commonmark/src/MarkdownConverterInterface.php create mode 100644 vendor/league/commonmark/src/Node/Node.php create mode 100644 vendor/league/commonmark/src/Node/NodeWalker.php create mode 100644 vendor/league/commonmark/src/Node/NodeWalkerEvent.php create mode 100644 vendor/league/commonmark/src/Reference/Reference.php create mode 100644 vendor/league/commonmark/src/Reference/ReferenceInterface.php create mode 100644 vendor/league/commonmark/src/Reference/ReferenceMap.php create mode 100644 vendor/league/commonmark/src/Reference/ReferenceMapInterface.php create mode 100644 vendor/league/commonmark/src/Reference/ReferenceParser.php create mode 100644 vendor/league/commonmark/src/UnmatchedBlockCloser.php create mode 100644 vendor/league/commonmark/src/Util/ArrayCollection.php create mode 100644 vendor/league/commonmark/src/Util/Configuration.php create mode 100644 vendor/league/commonmark/src/Util/ConfigurationAwareInterface.php create mode 100644 vendor/league/commonmark/src/Util/ConfigurationInterface.php create mode 100644 vendor/league/commonmark/src/Util/Html5Entities.php create mode 100644 vendor/league/commonmark/src/Util/Html5EntityDecoder.php create mode 100644 vendor/league/commonmark/src/Util/LinkParserHelper.php create mode 100644 vendor/league/commonmark/src/Util/PrioritizedList.php create mode 100644 vendor/league/commonmark/src/Util/RegexHelper.php create mode 100644 vendor/league/commonmark/src/Util/UrlEncoder.php create mode 100644 vendor/league/commonmark/src/Util/Xml.php create mode 100644 vendor/league/flysystem/LICENSE create mode 100644 vendor/league/flysystem/SECURITY.md create mode 100644 vendor/league/flysystem/composer.json create mode 100644 vendor/league/flysystem/deprecations.md create mode 100644 vendor/league/flysystem/src/Adapter/AbstractAdapter.php create mode 100644 vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php create mode 100644 vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php create mode 100644 vendor/league/flysystem/src/Adapter/Ftp.php create mode 100644 vendor/league/flysystem/src/Adapter/Ftpd.php create mode 100644 vendor/league/flysystem/src/Adapter/Local.php create mode 100644 vendor/league/flysystem/src/Adapter/NullAdapter.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/SynologyFtp.php create mode 100644 vendor/league/flysystem/src/AdapterInterface.php create mode 100644 vendor/league/flysystem/src/Config.php create mode 100644 vendor/league/flysystem/src/ConfigAwareTrait.php create mode 100644 vendor/league/flysystem/src/ConnectionErrorException.php create mode 100644 vendor/league/flysystem/src/ConnectionRuntimeException.php create mode 100644 vendor/league/flysystem/src/Directory.php create mode 100644 vendor/league/flysystem/src/Exception.php create mode 100644 vendor/league/flysystem/src/File.php create mode 100644 vendor/league/flysystem/src/FileExistsException.php create mode 100644 vendor/league/flysystem/src/FileNotFoundException.php create mode 100644 vendor/league/flysystem/src/Filesystem.php create mode 100644 vendor/league/flysystem/src/FilesystemException.php create mode 100644 vendor/league/flysystem/src/FilesystemInterface.php create mode 100644 vendor/league/flysystem/src/FilesystemNotFoundException.php create mode 100644 vendor/league/flysystem/src/Handler.php create mode 100644 vendor/league/flysystem/src/InvalidRootException.php create mode 100644 vendor/league/flysystem/src/MountManager.php create mode 100644 vendor/league/flysystem/src/NotSupportedException.php create mode 100644 vendor/league/flysystem/src/Plugin/AbstractPlugin.php create mode 100644 vendor/league/flysystem/src/Plugin/EmptyDir.php create mode 100644 vendor/league/flysystem/src/Plugin/ForcedCopy.php create mode 100644 vendor/league/flysystem/src/Plugin/ForcedRename.php create mode 100644 vendor/league/flysystem/src/Plugin/GetWithMetadata.php create mode 100644 vendor/league/flysystem/src/Plugin/ListFiles.php create mode 100644 vendor/league/flysystem/src/Plugin/ListPaths.php create mode 100644 vendor/league/flysystem/src/Plugin/ListWith.php create mode 100644 vendor/league/flysystem/src/Plugin/PluggableTrait.php create mode 100644 vendor/league/flysystem/src/Plugin/PluginNotFoundException.php create mode 100644 vendor/league/flysystem/src/PluginInterface.php create mode 100644 vendor/league/flysystem/src/ReadInterface.php create mode 100644 vendor/league/flysystem/src/RootViolationException.php create mode 100644 vendor/league/flysystem/src/SafeStorage.php create mode 100644 vendor/league/flysystem/src/UnreadableFileException.php create mode 100644 vendor/league/flysystem/src/Util.php create mode 100644 vendor/league/flysystem/src/Util/ContentListingFormatter.php create mode 100644 vendor/league/flysystem/src/Util/MimeType.php create mode 100644 vendor/league/flysystem/src/Util/StreamHasher.php create mode 100644 vendor/maatwebsite/excel/.styleci.yml create mode 100644 vendor/maatwebsite/excel/CODE_OF_CONDUCT.md create mode 100644 vendor/maatwebsite/excel/CONTRIBUTING.md create mode 100644 vendor/maatwebsite/excel/LICENSE create mode 100644 vendor/maatwebsite/excel/README.md create mode 100644 vendor/maatwebsite/excel/SECURITY.md create mode 100644 vendor/maatwebsite/excel/composer.json create mode 100644 vendor/maatwebsite/excel/config/excel.php create mode 100644 vendor/maatwebsite/excel/src/Cell.php create mode 100644 vendor/maatwebsite/excel/src/ChunkReader.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/Exportable.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/FromArray.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/FromCollection.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/FromGenerator.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/FromIterator.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/FromQuery.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/FromView.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/Importable.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/MapsCsvSettings.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/OnEachRow.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/RegistersEventListeners.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/ShouldAutoSize.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/SkipsErrors.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/SkipsFailures.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/SkipsOnError.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/SkipsOnFailure.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/SkipsUnknownSheets.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/ToArray.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/ToCollection.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/ToModel.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithBatchInserts.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCalculatedFormulas.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCharts.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithChunkReading.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithColumnFormatting.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithConditionalSheets.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCustomChunkSize.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCustomCsvSettings.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCustomQuerySize.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCustomStartCell.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithCustomValueBinder.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithDrawings.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithEvents.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithHeadingRow.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithHeadings.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithLimit.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithMappedCells.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithMapping.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithMultipleSheets.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithPreCalculateFormulas.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithProgressBar.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithStartRow.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithStrictNullComparison.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithTitle.php create mode 100644 vendor/maatwebsite/excel/src/Concerns/WithValidation.php create mode 100755 vendor/maatwebsite/excel/src/Console/ExportMakeCommand.php create mode 100755 vendor/maatwebsite/excel/src/Console/ImportMakeCommand.php create mode 100644 vendor/maatwebsite/excel/src/Console/WithModelStub.php create mode 100644 vendor/maatwebsite/excel/src/Console/stubs/export.model.stub create mode 100644 vendor/maatwebsite/excel/src/Console/stubs/export.plain.stub create mode 100644 vendor/maatwebsite/excel/src/Console/stubs/export.query-model.stub create mode 100644 vendor/maatwebsite/excel/src/Console/stubs/export.query.stub create mode 100644 vendor/maatwebsite/excel/src/Console/stubs/import.collection.stub create mode 100644 vendor/maatwebsite/excel/src/Console/stubs/import.model.stub create mode 100644 vendor/maatwebsite/excel/src/DefaultValueBinder.php create mode 100644 vendor/maatwebsite/excel/src/DelegatedMacroable.php create mode 100644 vendor/maatwebsite/excel/src/Events/AfterImport.php create mode 100644 vendor/maatwebsite/excel/src/Events/AfterSheet.php create mode 100644 vendor/maatwebsite/excel/src/Events/BeforeExport.php create mode 100644 vendor/maatwebsite/excel/src/Events/BeforeImport.php create mode 100644 vendor/maatwebsite/excel/src/Events/BeforeSheet.php create mode 100644 vendor/maatwebsite/excel/src/Events/BeforeWriting.php create mode 100644 vendor/maatwebsite/excel/src/Events/Event.php create mode 100644 vendor/maatwebsite/excel/src/Events/ImportFailed.php create mode 100644 vendor/maatwebsite/excel/src/Excel.php create mode 100644 vendor/maatwebsite/excel/src/ExcelServiceProvider.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/ConcernConflictException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/LaravelExcelException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/NoFilePathGivenException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/NoFilenameGivenException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/NoTypeDetectedException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/RowSkippedException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/SheetNotFoundException.php create mode 100644 vendor/maatwebsite/excel/src/Exceptions/UnreadableFileException.php create mode 100644 vendor/maatwebsite/excel/src/Exporter.php create mode 100644 vendor/maatwebsite/excel/src/Facades/Excel.php create mode 100644 vendor/maatwebsite/excel/src/Factories/ReaderFactory.php create mode 100644 vendor/maatwebsite/excel/src/Factories/WriterFactory.php create mode 100644 vendor/maatwebsite/excel/src/Fakes/ExcelFake.php create mode 100644 vendor/maatwebsite/excel/src/Fakes/fake_file create mode 100644 vendor/maatwebsite/excel/src/Files/Disk.php create mode 100644 vendor/maatwebsite/excel/src/Files/Filesystem.php create mode 100644 vendor/maatwebsite/excel/src/Files/LocalTemporaryFile.php create mode 100644 vendor/maatwebsite/excel/src/Files/RemoteTemporaryFile.php create mode 100644 vendor/maatwebsite/excel/src/Files/TemporaryFile.php create mode 100644 vendor/maatwebsite/excel/src/Files/TemporaryFileFactory.php create mode 100644 vendor/maatwebsite/excel/src/Filters/ChunkReadFilter.php create mode 100644 vendor/maatwebsite/excel/src/HasEventBus.php create mode 100644 vendor/maatwebsite/excel/src/HeadingRowImport.php create mode 100644 vendor/maatwebsite/excel/src/Helpers/ArrayHelper.php create mode 100644 vendor/maatwebsite/excel/src/Helpers/CellHelper.php create mode 100644 vendor/maatwebsite/excel/src/Helpers/FileTypeDetector.php create mode 100644 vendor/maatwebsite/excel/src/Importer.php create mode 100644 vendor/maatwebsite/excel/src/Imports/EndRowFinder.php create mode 100644 vendor/maatwebsite/excel/src/Imports/HeadingRowExtractor.php create mode 100644 vendor/maatwebsite/excel/src/Imports/HeadingRowFormatter.php create mode 100644 vendor/maatwebsite/excel/src/Imports/ModelImporter.php create mode 100644 vendor/maatwebsite/excel/src/Imports/ModelManager.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/AfterImportJob.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/AppendDataToSheet.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/AppendQueryToSheet.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/AppendViewToSheet.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/CloseSheet.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/ExtendedQueueable.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/ProxyFailures.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/QueueExport.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/QueueImport.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/ReadChunk.php create mode 100644 vendor/maatwebsite/excel/src/Jobs/StoreQueuedExport.php create mode 100644 vendor/maatwebsite/excel/src/MappedReader.php create mode 100644 vendor/maatwebsite/excel/src/Mixins/DownloadCollection.php create mode 100644 vendor/maatwebsite/excel/src/Mixins/StoreCollection.php create mode 100644 vendor/maatwebsite/excel/src/QueuedWriter.php create mode 100644 vendor/maatwebsite/excel/src/Reader.php create mode 100644 vendor/maatwebsite/excel/src/RegistersCustomConcerns.php create mode 100644 vendor/maatwebsite/excel/src/Row.php create mode 100644 vendor/maatwebsite/excel/src/Sheet.php create mode 100644 vendor/maatwebsite/excel/src/Transactions/DbTransactionHandler.php create mode 100644 vendor/maatwebsite/excel/src/Transactions/NullTransactionHandler.php create mode 100644 vendor/maatwebsite/excel/src/Transactions/TransactionHandler.php create mode 100644 vendor/maatwebsite/excel/src/Transactions/TransactionManager.php create mode 100644 vendor/maatwebsite/excel/src/Validators/Failure.php create mode 100644 vendor/maatwebsite/excel/src/Validators/RowValidator.php create mode 100644 vendor/maatwebsite/excel/src/Validators/ValidationException.php create mode 100644 vendor/maatwebsite/excel/src/Writer.php create mode 100644 vendor/maennchen/zipstream-php/.github/FUNDING.yml create mode 100644 vendor/maennchen/zipstream-php/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/maennchen/zipstream-php/.gitignore create mode 100644 vendor/maennchen/zipstream-php/.travis.yml create mode 100644 vendor/maennchen/zipstream-php/CHANGELOG.md create mode 100644 vendor/maennchen/zipstream-php/CONTRIBUTING.md create mode 100644 vendor/maennchen/zipstream-php/LICENSE create mode 100644 vendor/maennchen/zipstream-php/README.md create mode 100644 vendor/maennchen/zipstream-php/composer.json create mode 100644 vendor/maennchen/zipstream-php/phpunit.xml.dist create mode 100644 vendor/maennchen/zipstream-php/psalm.xml create mode 100644 vendor/maennchen/zipstream-php/src/Bigint.php create mode 100644 vendor/maennchen/zipstream-php/src/DeflateStream.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception/EncodingException.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception/FileNotFoundException.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception/FileNotReadableException.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception/OverflowException.php create mode 100644 vendor/maennchen/zipstream-php/src/Exception/StreamNotReadableException.php create mode 100644 vendor/maennchen/zipstream-php/src/File.php create mode 100644 vendor/maennchen/zipstream-php/src/Option/Archive.php create mode 100644 vendor/maennchen/zipstream-php/src/Option/File.php create mode 100644 vendor/maennchen/zipstream-php/src/Option/Method.php create mode 100644 vendor/maennchen/zipstream-php/src/Option/Version.php create mode 100644 vendor/maennchen/zipstream-php/src/Stream.php create mode 100644 vendor/maennchen/zipstream-php/src/ZipStream.php create mode 100644 vendor/maennchen/zipstream-php/test/BigintTest.php create mode 100644 vendor/maennchen/zipstream-php/test/ZipStreamTest.php create mode 100644 vendor/maennchen/zipstream-php/test/bootstrap.php create mode 100644 vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php create mode 100644 vendor/markbaker/complex/README.md create mode 100644 vendor/markbaker/complex/classes/Autoloader.php create mode 100644 vendor/markbaker/complex/classes/Bootstrap.php create mode 100644 vendor/markbaker/complex/classes/src/Complex.php create mode 100644 vendor/markbaker/complex/classes/src/Exception.php create mode 100644 vendor/markbaker/complex/classes/src/functions/abs.php create mode 100644 vendor/markbaker/complex/classes/src/functions/acos.php create mode 100644 vendor/markbaker/complex/classes/src/functions/acosh.php create mode 100644 vendor/markbaker/complex/classes/src/functions/acot.php create mode 100644 vendor/markbaker/complex/classes/src/functions/acoth.php create mode 100644 vendor/markbaker/complex/classes/src/functions/acsc.php create mode 100644 vendor/markbaker/complex/classes/src/functions/acsch.php create mode 100644 vendor/markbaker/complex/classes/src/functions/argument.php create mode 100644 vendor/markbaker/complex/classes/src/functions/asec.php create mode 100644 vendor/markbaker/complex/classes/src/functions/asech.php create mode 100644 vendor/markbaker/complex/classes/src/functions/asin.php create mode 100644 vendor/markbaker/complex/classes/src/functions/asinh.php create mode 100644 vendor/markbaker/complex/classes/src/functions/atan.php create mode 100644 vendor/markbaker/complex/classes/src/functions/atanh.php create mode 100644 vendor/markbaker/complex/classes/src/functions/conjugate.php create mode 100644 vendor/markbaker/complex/classes/src/functions/cos.php create mode 100644 vendor/markbaker/complex/classes/src/functions/cosh.php create mode 100644 vendor/markbaker/complex/classes/src/functions/cot.php create mode 100644 vendor/markbaker/complex/classes/src/functions/coth.php create mode 100644 vendor/markbaker/complex/classes/src/functions/csc.php create mode 100644 vendor/markbaker/complex/classes/src/functions/csch.php create mode 100644 vendor/markbaker/complex/classes/src/functions/exp.php create mode 100644 vendor/markbaker/complex/classes/src/functions/inverse.php create mode 100644 vendor/markbaker/complex/classes/src/functions/ln.php create mode 100644 vendor/markbaker/complex/classes/src/functions/log10.php create mode 100644 vendor/markbaker/complex/classes/src/functions/log2.php create mode 100644 vendor/markbaker/complex/classes/src/functions/negative.php create mode 100644 vendor/markbaker/complex/classes/src/functions/pow.php create mode 100644 vendor/markbaker/complex/classes/src/functions/rho.php create mode 100644 vendor/markbaker/complex/classes/src/functions/sec.php create mode 100644 vendor/markbaker/complex/classes/src/functions/sech.php create mode 100644 vendor/markbaker/complex/classes/src/functions/sin.php create mode 100644 vendor/markbaker/complex/classes/src/functions/sinh.php create mode 100644 vendor/markbaker/complex/classes/src/functions/sqrt.php create mode 100644 vendor/markbaker/complex/classes/src/functions/tan.php create mode 100644 vendor/markbaker/complex/classes/src/functions/tanh.php create mode 100644 vendor/markbaker/complex/classes/src/functions/theta.php create mode 100644 vendor/markbaker/complex/classes/src/operations/add.php create mode 100644 vendor/markbaker/complex/classes/src/operations/divideby.php create mode 100644 vendor/markbaker/complex/classes/src/operations/divideinto.php create mode 100644 vendor/markbaker/complex/classes/src/operations/multiply.php create mode 100644 vendor/markbaker/complex/classes/src/operations/subtract.php create mode 100644 vendor/markbaker/complex/composer.json create mode 100644 vendor/markbaker/complex/examples/complexTest.php create mode 100644 vendor/markbaker/complex/examples/testFunctions.php create mode 100644 vendor/markbaker/complex/examples/testOperations.php create mode 100644 vendor/markbaker/complex/license.md create mode 100644 vendor/markbaker/matrix/README.md create mode 100644 vendor/markbaker/matrix/buildPhar.php create mode 100644 vendor/markbaker/matrix/classes/Autoloader.php create mode 100644 vendor/markbaker/matrix/classes/Bootstrap.php create mode 100644 vendor/markbaker/matrix/classes/src/Builder.php create mode 100644 vendor/markbaker/matrix/classes/src/Exception.php create mode 100644 vendor/markbaker/matrix/classes/src/Functions.php create mode 100644 vendor/markbaker/matrix/classes/src/Matrix.php create mode 100644 vendor/markbaker/matrix/classes/src/Operators/Addition.php create mode 100644 vendor/markbaker/matrix/classes/src/Operators/DirectSum.php create mode 100644 vendor/markbaker/matrix/classes/src/Operators/Division.php create mode 100644 vendor/markbaker/matrix/classes/src/Operators/Multiplication.php create mode 100644 vendor/markbaker/matrix/classes/src/Operators/Operator.php create mode 100644 vendor/markbaker/matrix/classes/src/Operators/Subtraction.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/adjoint.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/antidiagonal.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/cofactors.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/determinant.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/diagonal.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/identity.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/inverse.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/minors.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/trace.php create mode 100644 vendor/markbaker/matrix/classes/src/functions/transpose.php create mode 100644 vendor/markbaker/matrix/classes/src/operations/add.php create mode 100644 vendor/markbaker/matrix/classes/src/operations/directsum.php create mode 100644 vendor/markbaker/matrix/classes/src/operations/divideby.php create mode 100644 vendor/markbaker/matrix/classes/src/operations/divideinto.php create mode 100644 vendor/markbaker/matrix/classes/src/operations/multiply.php create mode 100644 vendor/markbaker/matrix/classes/src/operations/subtract.php create mode 100644 vendor/markbaker/matrix/composer.7.2.json create mode 100644 vendor/markbaker/matrix/composer.json create mode 100644 vendor/markbaker/matrix/examples/test.php create mode 100644 vendor/markbaker/matrix/infection.json.dist create mode 100644 vendor/markbaker/matrix/license.md create mode 100644 vendor/markbaker/matrix/phpstan.neon create mode 100644 vendor/mockery/mockery/.phpstorm.meta.php create mode 100644 vendor/mockery/mockery/CHANGELOG.md create mode 100644 vendor/mockery/mockery/CONTRIBUTING.md create mode 100644 vendor/mockery/mockery/LICENSE create mode 100644 vendor/mockery/mockery/README.md create mode 100644 vendor/mockery/mockery/composer.json create mode 100644 vendor/mockery/mockery/docs/README.md create mode 100644 vendor/mockery/mockery/docs/conf.py create mode 100644 vendor/mockery/mockery/docs/cookbook/big_parent_class.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/class_constants.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/default_expectations.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/detecting_mock_objects.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/index.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/map.rst.inc create mode 100644 vendor/mockery/mockery/docs/cookbook/mockery_on.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/mocking_class_within_class.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/mocking_hard_dependencies.rst create mode 100644 vendor/mockery/mockery/docs/cookbook/not_calling_the_constructor.rst create mode 100644 vendor/mockery/mockery/docs/getting_started/index.rst create mode 100644 vendor/mockery/mockery/docs/getting_started/installation.rst create mode 100644 vendor/mockery/mockery/docs/getting_started/map.rst.inc create mode 100644 vendor/mockery/mockery/docs/getting_started/quick_reference.rst create mode 100644 vendor/mockery/mockery/docs/getting_started/simple_example.rst create mode 100644 vendor/mockery/mockery/docs/getting_started/upgrading.rst create mode 100644 vendor/mockery/mockery/docs/index.rst create mode 100644 vendor/mockery/mockery/docs/mockery/configuration.rst create mode 100644 vendor/mockery/mockery/docs/mockery/exceptions.rst create mode 100644 vendor/mockery/mockery/docs/mockery/gotchas.rst create mode 100644 vendor/mockery/mockery/docs/mockery/index.rst create mode 100644 vendor/mockery/mockery/docs/mockery/map.rst.inc create mode 100644 vendor/mockery/mockery/docs/mockery/reserved_method_names.rst create mode 100644 vendor/mockery/mockery/docs/reference/alternative_should_receive_syntax.rst create mode 100644 vendor/mockery/mockery/docs/reference/argument_validation.rst create mode 100644 vendor/mockery/mockery/docs/reference/creating_test_doubles.rst create mode 100644 vendor/mockery/mockery/docs/reference/demeter_chains.rst create mode 100644 vendor/mockery/mockery/docs/reference/expectations.rst create mode 100644 vendor/mockery/mockery/docs/reference/final_methods_classes.rst create mode 100644 vendor/mockery/mockery/docs/reference/index.rst create mode 100644 vendor/mockery/mockery/docs/reference/instance_mocking.rst create mode 100644 vendor/mockery/mockery/docs/reference/magic_methods.rst create mode 100644 vendor/mockery/mockery/docs/reference/map.rst.inc create mode 100644 vendor/mockery/mockery/docs/reference/partial_mocks.rst create mode 100644 vendor/mockery/mockery/docs/reference/pass_by_reference_behaviours.rst create mode 100644 vendor/mockery/mockery/docs/reference/phpunit_integration.rst create mode 100644 vendor/mockery/mockery/docs/reference/protected_methods.rst create mode 100644 vendor/mockery/mockery/docs/reference/public_properties.rst create mode 100644 vendor/mockery/mockery/docs/reference/public_static_properties.rst create mode 100644 vendor/mockery/mockery/docs/reference/spies.rst create mode 100644 vendor/mockery/mockery/library/Mockery.php create mode 100644 vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryPHPUnitIntegration.php create mode 100644 vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryPHPUnitIntegrationAssertPostConditions.php create mode 100644 vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryTestCase.php create mode 100644 vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryTestCaseSetUp.php create mode 100644 vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php create mode 100644 vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListenerTrait.php create mode 100644 vendor/mockery/mockery/library/Mockery/ClosureWrapper.php create mode 100644 vendor/mockery/mockery/library/Mockery/CompositeExpectation.php create mode 100644 vendor/mockery/mockery/library/Mockery/Configuration.php create mode 100644 vendor/mockery/mockery/library/Mockery/Container.php create mode 100644 vendor/mockery/mockery/library/Mockery/CountValidator/AtLeast.php create mode 100644 vendor/mockery/mockery/library/Mockery/CountValidator/AtMost.php create mode 100644 vendor/mockery/mockery/library/Mockery/CountValidator/CountValidatorAbstract.php create mode 100644 vendor/mockery/mockery/library/Mockery/CountValidator/Exact.php create mode 100644 vendor/mockery/mockery/library/Mockery/CountValidator/Exception.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception/BadMethodCallException.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception/InvalidArgumentException.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception/InvalidCountException.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception/InvalidOrderException.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception/NoMatchingExpectationException.php create mode 100644 vendor/mockery/mockery/library/Mockery/Exception/RuntimeException.php create mode 100644 vendor/mockery/mockery/library/Mockery/Expectation.php create mode 100644 vendor/mockery/mockery/library/Mockery/ExpectationDirector.php create mode 100644 vendor/mockery/mockery/library/Mockery/ExpectationInterface.php create mode 100644 vendor/mockery/mockery/library/Mockery/ExpectsHigherOrderMessage.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/CachingGenerator.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/DefinedTargetClass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/Generator.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/Method.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/MockConfiguration.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/MockConfigurationBuilder.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/MockDefinition.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/MockNameBuilder.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/Parameter.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/AvoidMethodClashPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/CallTypeHintPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ClassNamePass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ClassPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ConstantsPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/InstanceMockPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/InterfacePass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/MagicMethodTypeHintsPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/MethodDefinitionPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/Pass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveDestructorPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveUnserializeForInternalSerializableClassesPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/TraitPass.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/StringManipulationGenerator.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/TargetClassInterface.php create mode 100644 vendor/mockery/mockery/library/Mockery/Generator/UndefinedTargetClass.php create mode 100644 vendor/mockery/mockery/library/Mockery/HigherOrderMessage.php create mode 100644 vendor/mockery/mockery/library/Mockery/Instantiator.php create mode 100644 vendor/mockery/mockery/library/Mockery/LegacyMockInterface.php create mode 100644 vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php create mode 100644 vendor/mockery/mockery/library/Mockery/Loader/Loader.php create mode 100644 vendor/mockery/mockery/library/Mockery/Loader/RequireLoader.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/AndAnyOtherArgs.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Any.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/AnyArgs.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/AnyOf.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/ArgumentListMatcher.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Closure.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Contains.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Ducktype.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/HasKey.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/HasValue.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/MatcherAbstract.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/MultiArgumentClosure.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/MustBe.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/NoArgs.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Not.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/NotAnyOf.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/PHPUnitConstraint.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Pattern.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Subset.php create mode 100644 vendor/mockery/mockery/library/Mockery/Matcher/Type.php create mode 100644 vendor/mockery/mockery/library/Mockery/MethodCall.php create mode 100644 vendor/mockery/mockery/library/Mockery/Mock.php create mode 100644 vendor/mockery/mockery/library/Mockery/MockInterface.php create mode 100644 vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php create mode 100644 vendor/mockery/mockery/library/Mockery/Undefined.php create mode 100644 vendor/mockery/mockery/library/Mockery/VerificationDirector.php create mode 100644 vendor/mockery/mockery/library/Mockery/VerificationExpectation.php create mode 100644 vendor/mockery/mockery/library/helpers.php create mode 100644 vendor/monolog/monolog/CHANGELOG.md create mode 100644 vendor/monolog/monolog/LICENSE create mode 100644 vendor/monolog/monolog/README.md create mode 100644 vendor/monolog/monolog/UPGRADE.md create mode 100644 vendor/monolog/monolog/composer.json create mode 100644 vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php create mode 100644 vendor/monolog/monolog/src/Monolog/ErrorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Handler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Logger.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Registry.php create mode 100644 vendor/monolog/monolog/src/Monolog/ResettableInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/SignalHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Test/TestCase.php create mode 100644 vendor/monolog/monolog/src/Monolog/Utils.php create mode 100644 vendor/myclabs/deep-copy/.github/FUNDING.yml create mode 100644 vendor/myclabs/deep-copy/LICENSE create mode 100644 vendor/myclabs/deep-copy/README.md create mode 100644 vendor/myclabs/deep-copy/composer.json create mode 100644 vendor/myclabs/deep-copy/doc/clone.png create mode 100644 vendor/myclabs/deep-copy/doc/deep-clone.png create mode 100644 vendor/myclabs/deep-copy/doc/deep-copy.png create mode 100644 vendor/myclabs/deep-copy/doc/graph.png create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php create mode 100644 vendor/myclabs/php-enum/LICENSE create mode 100644 vendor/myclabs/php-enum/README.md create mode 100644 vendor/myclabs/php-enum/SECURITY.md create mode 100644 vendor/myclabs/php-enum/composer.json create mode 100644 vendor/myclabs/php-enum/psalm.xml create mode 100644 vendor/myclabs/php-enum/src/Enum.php create mode 100644 vendor/myclabs/php-enum/src/PHPUnit/Comparator.php create mode 100644 vendor/nesbot/carbon/.github/FUNDING.yml create mode 100644 vendor/nesbot/carbon/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/nesbot/carbon/.multi-tester.yml create mode 100644 vendor/nesbot/carbon/LICENSE create mode 100755 vendor/nesbot/carbon/bin/carbon create mode 100644 vendor/nesbot/carbon/bin/carbon.bat create mode 100644 vendor/nesbot/carbon/composer.json create mode 100644 vendor/nesbot/carbon/contributing.md create mode 100644 vendor/nesbot/carbon/phpmd.xml create mode 100644 vendor/nesbot/carbon/readme.md create mode 100644 vendor/nesbot/carbon/src/Carbon/Carbon.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterface.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterval.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Factory.php create mode 100644 vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/asa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bas.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bez.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cgg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dav.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dje.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dua.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dyo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ebu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_001.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_150.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_419.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ewo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/guz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/haw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/i18n.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ii.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/in.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jgo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jmc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kam.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kde.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kea.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/khq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ki.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kkj.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kln.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksf.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lag.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lkt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mer.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mua.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mzn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/naq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nmg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nnh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/no.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nus.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nyn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/prg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rof.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rwk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/saq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sbp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/seh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ses.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/smn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tet.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tlh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/twq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vun.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xog.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yav.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zgh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Language.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php create mode 100644 vendor/nesbot/carbon/src/Carbon/List/languages.php create mode 100644 vendor/nesbot/carbon/src/Carbon/List/regions.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Cast.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Converter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Creator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Date.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Difference.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Localization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Macro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Options.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Test.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Units.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Week.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Translator.php create mode 100644 vendor/nikic/php-parser/LICENSE create mode 100644 vendor/nikic/php-parser/README.md create mode 100755 vendor/nikic/php-parser/bin/php-parse create mode 100644 vendor/nikic/php-parser/composer.json create mode 100644 vendor/nikic/php-parser/grammar/README.md create mode 100644 vendor/nikic/php-parser/grammar/parser.template create mode 100644 vendor/nikic/php-parser/grammar/php5.y create mode 100644 vendor/nikic/php-parser/grammar/php7.y create mode 100644 vendor/nikic/php-parser/grammar/rebuildParsers.php create mode 100644 vendor/nikic/php-parser/grammar/tokens.template create mode 100644 vendor/nikic/php-parser/grammar/tokens.y create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Error.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulatorInterface.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NameContext.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Param.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php create mode 100644 vendor/nunomaduro/collision/.github/FUNDING.yml create mode 100644 vendor/nunomaduro/collision/.php_cs create mode 100755 vendor/nunomaduro/collision/LICENSE.md create mode 100644 vendor/nunomaduro/collision/README.md create mode 100644 vendor/nunomaduro/collision/composer.json create mode 100644 vendor/nunomaduro/collision/phpstan.neon.dist create mode 100644 vendor/nunomaduro/collision/phpunit.xml.dist create mode 100644 vendor/nunomaduro/collision/src/Adapters/Laravel/CollisionServiceProvider.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Laravel/Commands/TestCommand.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Laravel/ExceptionHandler.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Laravel/IgnitionSolutionsRepository.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Laravel/Inspector.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/ConfigureIO.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/Printer.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/PrinterContents.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/State.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/Style.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/TestResult.php create mode 100644 vendor/nunomaduro/collision/src/Adapters/Phpunit/Timer.php create mode 100644 vendor/nunomaduro/collision/src/ArgumentFormatter.php create mode 100644 vendor/nunomaduro/collision/src/ConsoleColor.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/Adapters/Phpunit/HasPrintableTestCaseName.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/Adapters/Phpunit/Listener.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/ArgumentFormatter.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/Handler.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/Highlighter.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/Provider.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/SolutionsRepository.php create mode 100644 vendor/nunomaduro/collision/src/Contracts/Writer.php create mode 100644 vendor/nunomaduro/collision/src/Exceptions/ShouldNotHappen.php create mode 100644 vendor/nunomaduro/collision/src/Handler.php create mode 100644 vendor/nunomaduro/collision/src/Highlighter.php create mode 100644 vendor/nunomaduro/collision/src/Provider.php create mode 100644 vendor/nunomaduro/collision/src/SolutionsRepositories/NullSolutionsRepository.php create mode 100644 vendor/nunomaduro/collision/src/Writer.php create mode 100644 vendor/opis/closure/.github/workflows/tests.yml create mode 100644 vendor/opis/closure/CHANGELOG.md create mode 100644 vendor/opis/closure/LICENSE create mode 100644 vendor/opis/closure/NOTICE create mode 100644 vendor/opis/closure/README.md create mode 100644 vendor/opis/closure/autoload.php create mode 100644 vendor/opis/closure/composer.json create mode 100644 vendor/opis/closure/functions.php create mode 100644 vendor/opis/closure/src/Analyzer.php create mode 100644 vendor/opis/closure/src/ClosureContext.php create mode 100644 vendor/opis/closure/src/ClosureScope.php create mode 100644 vendor/opis/closure/src/ClosureStream.php create mode 100644 vendor/opis/closure/src/ISecurityProvider.php create mode 100644 vendor/opis/closure/src/ReflectionClosure.php create mode 100644 vendor/opis/closure/src/SecurityException.php create mode 100644 vendor/opis/closure/src/SecurityProvider.php create mode 100644 vendor/opis/closure/src/SelfReference.php create mode 100644 vendor/opis/closure/src/SerializableClosure.php create mode 100644 vendor/phar-io/manifest/.gitignore create mode 100644 vendor/phar-io/manifest/.php_cs create mode 100644 vendor/phar-io/manifest/.travis.yml create mode 100644 vendor/phar-io/manifest/LICENSE create mode 100644 vendor/phar-io/manifest/README.md create mode 100644 vendor/phar-io/manifest/build.xml create mode 100644 vendor/phar-io/manifest/composer.json create mode 100644 vendor/phar-io/manifest/composer.lock create mode 100644 vendor/phar-io/manifest/examples/example-01.php create mode 100644 vendor/phar-io/manifest/phive.xml create mode 100644 vendor/phar-io/manifest/phpunit.xml create mode 100644 vendor/phar-io/manifest/src/ManifestDocumentMapper.php create mode 100644 vendor/phar-io/manifest/src/ManifestLoader.php create mode 100644 vendor/phar-io/manifest/src/ManifestSerializer.php create mode 100644 vendor/phar-io/manifest/src/exceptions/Exception.php create mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestElementException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php create mode 100644 vendor/phar-io/manifest/src/values/Application.php create mode 100644 vendor/phar-io/manifest/src/values/ApplicationName.php create mode 100644 vendor/phar-io/manifest/src/values/Author.php create mode 100644 vendor/phar-io/manifest/src/values/AuthorCollection.php create mode 100644 vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php create mode 100644 vendor/phar-io/manifest/src/values/BundledComponent.php create mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollection.php create mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php create mode 100644 vendor/phar-io/manifest/src/values/CopyrightInformation.php create mode 100644 vendor/phar-io/manifest/src/values/Email.php create mode 100644 vendor/phar-io/manifest/src/values/Extension.php create mode 100644 vendor/phar-io/manifest/src/values/Library.php create mode 100644 vendor/phar-io/manifest/src/values/License.php create mode 100644 vendor/phar-io/manifest/src/values/Manifest.php create mode 100644 vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php create mode 100644 vendor/phar-io/manifest/src/values/PhpVersionRequirement.php create mode 100644 vendor/phar-io/manifest/src/values/Requirement.php create mode 100644 vendor/phar-io/manifest/src/values/RequirementCollection.php create mode 100644 vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php create mode 100644 vendor/phar-io/manifest/src/values/Type.php create mode 100644 vendor/phar-io/manifest/src/values/Url.php create mode 100644 vendor/phar-io/manifest/src/xml/AuthorElement.php create mode 100644 vendor/phar-io/manifest/src/xml/AuthorElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/BundlesElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ComponentElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ComponentElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/ContainsElement.php create mode 100644 vendor/phar-io/manifest/src/xml/CopyrightElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/ExtElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ExtElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/ExtensionElement.php create mode 100644 vendor/phar-io/manifest/src/xml/LicenseElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ManifestDocument.php create mode 100644 vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php create mode 100644 vendor/phar-io/manifest/src/xml/ManifestElement.php create mode 100644 vendor/phar-io/manifest/src/xml/PhpElement.php create mode 100644 vendor/phar-io/manifest/src/xml/RequiresElement.php create mode 100644 vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php create mode 100644 vendor/phar-io/manifest/tests/ManifestLoaderTest.php create mode 100644 vendor/phar-io/manifest/tests/ManifestSerializerTest.php create mode 100644 vendor/phar-io/manifest/tests/_fixture/custom.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/extension.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/invalidversion.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/library.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/manifest.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml create mode 100644 vendor/phar-io/manifest/tests/_fixture/test.phar create mode 100644 vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php create mode 100644 vendor/phar-io/manifest/tests/values/ApplicationNameTest.php create mode 100644 vendor/phar-io/manifest/tests/values/ApplicationTest.php create mode 100644 vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php create mode 100644 vendor/phar-io/manifest/tests/values/AuthorTest.php create mode 100644 vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php create mode 100644 vendor/phar-io/manifest/tests/values/BundledComponentTest.php create mode 100644 vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php create mode 100644 vendor/phar-io/manifest/tests/values/EmailTest.php create mode 100644 vendor/phar-io/manifest/tests/values/ExtensionTest.php create mode 100644 vendor/phar-io/manifest/tests/values/LibraryTest.php create mode 100644 vendor/phar-io/manifest/tests/values/LicenseTest.php create mode 100644 vendor/phar-io/manifest/tests/values/ManifestTest.php create mode 100644 vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php create mode 100644 vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php create mode 100644 vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php create mode 100644 vendor/phar-io/manifest/tests/values/UrlTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/AuthorElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/BundlesElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ComponentElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ContainsElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ExtElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/LicenseElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/PhpElementTest.php create mode 100644 vendor/phar-io/manifest/tests/xml/RequiresElementTest.php create mode 100644 vendor/phar-io/version/.gitignore create mode 100644 vendor/phar-io/version/.php_cs create mode 100644 vendor/phar-io/version/.travis.yml create mode 100644 vendor/phar-io/version/CHANGELOG.md create mode 100644 vendor/phar-io/version/LICENSE create mode 100644 vendor/phar-io/version/README.md create mode 100644 vendor/phar-io/version/build.xml create mode 100644 vendor/phar-io/version/composer.json create mode 100644 vendor/phar-io/version/phive.xml create mode 100644 vendor/phar-io/version/phpunit.xml create mode 100644 vendor/phar-io/version/src/PreReleaseSuffix.php create mode 100644 vendor/phar-io/version/src/Version.php create mode 100644 vendor/phar-io/version/src/VersionConstraintParser.php create mode 100644 vendor/phar-io/version/src/VersionConstraintValue.php create mode 100644 vendor/phar-io/version/src/VersionNumber.php create mode 100644 vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php create mode 100644 vendor/phar-io/version/src/constraints/AnyVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/ExactVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php create mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/VersionConstraint.php create mode 100644 vendor/phar-io/version/src/exceptions/Exception.php create mode 100644 vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php create mode 100644 vendor/phar-io/version/src/exceptions/InvalidVersionException.php create mode 100644 vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php create mode 100644 vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php create mode 100644 vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php create mode 100644 vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php create mode 100644 vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php create mode 100644 vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php create mode 100644 vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php create mode 100644 vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php create mode 100644 vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php create mode 100644 vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php create mode 100644 vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php create mode 100644 vendor/phar-io/version/tests/Unit/VersionTest.php create mode 100644 vendor/phpdocumentor/reflection-common/.github/workflows/push.yml create mode 100644 vendor/phpdocumentor/reflection-common/.scrutinizer.yml create mode 100644 vendor/phpdocumentor/reflection-common/.travis.yml create mode 100644 vendor/phpdocumentor/reflection-common/LICENSE create mode 100644 vendor/phpdocumentor/reflection-common/Makefile create mode 100644 vendor/phpdocumentor/reflection-common/README.md create mode 100644 vendor/phpdocumentor/reflection-common/appveyor.yml create mode 100644 vendor/phpdocumentor/reflection-common/composer.json create mode 100644 vendor/phpdocumentor/reflection-common/easy-coding-standard.neon create mode 100644 vendor/phpdocumentor/reflection-common/phive.xml create mode 100644 vendor/phpdocumentor/reflection-common/phpcs.xml.dist create mode 100644 vendor/phpdocumentor/reflection-common/phpmd.xml.dist create mode 100644 vendor/phpdocumentor/reflection-common/phpstan.neon create mode 100644 vendor/phpdocumentor/reflection-common/psalm.xml create mode 100644 vendor/phpdocumentor/reflection-common/src/Element.php create mode 100644 vendor/phpdocumentor/reflection-common/src/File.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Fqsen.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Location.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Project.php create mode 100644 vendor/phpdocumentor/reflection-common/src/ProjectFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/.dependabot/config.yml create mode 100644 vendor/phpdocumentor/reflection-docblock/.github/workflows/push.yml create mode 100644 vendor/phpdocumentor/reflection-docblock/LICENSE create mode 100644 vendor/phpdocumentor/reflection-docblock/Makefile create mode 100644 vendor/phpdocumentor/reflection-docblock/README.md create mode 100644 vendor/phpdocumentor/reflection-docblock/composer-require-config.json create mode 100644 vendor/phpdocumentor/reflection-docblock/composer.json create mode 100644 vendor/phpdocumentor/reflection-docblock/phive.xml create mode 100644 vendor/phpdocumentor/reflection-docblock/phpcs.xml.dist create mode 100644 vendor/phpdocumentor/reflection-docblock/phpstan.neon create mode 100644 vendor/phpdocumentor/reflection-docblock/psalm.xml create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php create mode 100644 vendor/phpdocumentor/type-resolver/.github/workflows/push.yml create mode 100644 vendor/phpdocumentor/type-resolver/LICENSE create mode 100644 vendor/phpdocumentor/type-resolver/Makefile create mode 100644 vendor/phpdocumentor/type-resolver/README.md create mode 100644 vendor/phpdocumentor/type-resolver/composer-require-config.json create mode 100644 vendor/phpdocumentor/type-resolver/composer.json create mode 100644 vendor/phpdocumentor/type-resolver/composer.lock create mode 100644 vendor/phpdocumentor/type-resolver/phive.xml create mode 100644 vendor/phpdocumentor/type-resolver/phpcs.xml.dist create mode 100644 vendor/phpdocumentor/type-resolver/phpstan.neon create mode 100644 vendor/phpdocumentor/type-resolver/psalm.xml create mode 100644 vendor/phpdocumentor/type-resolver/src/FqsenResolver.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Type.php create mode 100644 vendor/phpdocumentor/type-resolver/src/TypeResolver.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Array_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Boolean.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Callable_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ClassString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Collection.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Compound.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Context.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Float_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Integer.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Null_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Nullable.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Object_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Parent_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Resource_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Scalar.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Self_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Static_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/String_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/This.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Void_.php create mode 100644 vendor/phpoffice/phpspreadsheet/CHANGELOG.md create mode 100644 vendor/phpoffice/phpspreadsheet/CONTRIBUTING.md create mode 100644 vendor/phpoffice/phpspreadsheet/LICENSE create mode 100644 vendor/phpoffice/phpspreadsheet/README.md create mode 100644 vendor/phpoffice/phpspreadsheet/composer.json create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/functionlist.txt create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/en/uk/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/config create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/functions create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AdvancedValueBinder.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/StringValueBinder.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/GridLines.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/PHP Charting Libraries.txt create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/Polyfill.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DocumentGenerator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/HashTable.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Exception.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReader.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/RichText.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CHANGELOG.TXT create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CholeskyDecomposition.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/QRDecomposition.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/utils/Maths.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/WriterPart.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php create mode 100644 vendor/phpoption/phpoption/LICENSE create mode 100644 vendor/phpoption/phpoption/composer.json create mode 100644 vendor/phpoption/phpoption/src/PhpOption/LazyOption.php create mode 100644 vendor/phpoption/phpoption/src/PhpOption/None.php create mode 100644 vendor/phpoption/phpoption/src/PhpOption/Option.php create mode 100644 vendor/phpoption/phpoption/src/PhpOption/Some.php create mode 100644 vendor/phpspec/prophecy/CHANGES.md create mode 100644 vendor/phpspec/prophecy/LICENSE create mode 100644 vendor/phpspec/prophecy/README.md create mode 100644 vendor/phpspec/prophecy/composer.json create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Call/Call.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophet.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php create mode 100644 vendor/phpunit/php-code-coverage/.gitattributes create mode 100644 vendor/phpunit/php-code-coverage/.github/CONTRIBUTING.md create mode 100644 vendor/phpunit/php-code-coverage/.github/FUNDING.yml create mode 100644 vendor/phpunit/php-code-coverage/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/phpunit/php-code-coverage/.gitignore create mode 100644 vendor/phpunit/php-code-coverage/.php_cs.dist create mode 100644 vendor/phpunit/php-code-coverage/.travis.yml create mode 100644 vendor/phpunit/php-code-coverage/ChangeLog.md create mode 100644 vendor/phpunit/php-code-coverage/LICENSE create mode 100644 vendor/phpunit/php-code-coverage/README.md create mode 100644 vendor/phpunit/php-code-coverage/build.xml create mode 100644 vendor/phpunit/php-code-coverage/composer.json create mode 100644 vendor/phpunit/php-code-coverage/phive.xml create mode 100644 vendor/phpunit/php-code-coverage/phpunit.xml create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Driver.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/PCOV.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/PHPDBG.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Xdebug.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/Exception.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/RuntimeException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Filter.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/Builder.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/Iterator.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Clover.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Crap4j.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/PHP.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Text.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php create mode 100644 vendor/phpunit/php-code-coverage/src/Util.php create mode 100644 vendor/phpunit/php-code-coverage/src/Version.php create mode 100644 vendor/phpunit/php-code-coverage/tests/TestCase.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesWhitespaceTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodOneLineAnnotationTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Crash.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassExtendedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_ignore.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_namespace.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_oneline_annotations.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_use_statements.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_without_namespace.php create mode 100644 vendor/phpunit/php-code-coverage/tests/bootstrap.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/BuilderTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/TextTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php create mode 100644 vendor/phpunit/php-file-iterator/.gitattributes create mode 100644 vendor/phpunit/php-file-iterator/.github/stale.yml create mode 100644 vendor/phpunit/php-file-iterator/.gitignore create mode 100644 vendor/phpunit/php-file-iterator/.php_cs.dist create mode 100644 vendor/phpunit/php-file-iterator/.travis.yml create mode 100644 vendor/phpunit/php-file-iterator/ChangeLog.md create mode 100644 vendor/phpunit/php-file-iterator/LICENSE create mode 100644 vendor/phpunit/php-file-iterator/README.md create mode 100644 vendor/phpunit/php-file-iterator/composer.json create mode 100644 vendor/phpunit/php-file-iterator/phpunit.xml create mode 100644 vendor/phpunit/php-file-iterator/src/Facade.php create mode 100644 vendor/phpunit/php-file-iterator/src/Factory.php create mode 100644 vendor/phpunit/php-file-iterator/src/Iterator.php create mode 100644 vendor/phpunit/php-file-iterator/tests/FactoryTest.php create mode 100644 vendor/phpunit/php-text-template/.gitattributes create mode 100644 vendor/phpunit/php-text-template/.gitignore create mode 100644 vendor/phpunit/php-text-template/LICENSE create mode 100644 vendor/phpunit/php-text-template/README.md create mode 100644 vendor/phpunit/php-text-template/composer.json create mode 100644 vendor/phpunit/php-text-template/src/Template.php create mode 100644 vendor/phpunit/php-timer/.gitattributes create mode 100644 vendor/phpunit/php-timer/.github/FUNDING.yml create mode 100644 vendor/phpunit/php-timer/.github/stale.yml create mode 100644 vendor/phpunit/php-timer/.gitignore create mode 100644 vendor/phpunit/php-timer/.php_cs.dist create mode 100644 vendor/phpunit/php-timer/.travis.yml create mode 100644 vendor/phpunit/php-timer/ChangeLog.md create mode 100644 vendor/phpunit/php-timer/LICENSE create mode 100644 vendor/phpunit/php-timer/README.md create mode 100644 vendor/phpunit/php-timer/build.xml create mode 100644 vendor/phpunit/php-timer/composer.json create mode 100644 vendor/phpunit/php-timer/phpunit.xml create mode 100644 vendor/phpunit/php-timer/src/Exception.php create mode 100644 vendor/phpunit/php-timer/src/RuntimeException.php create mode 100644 vendor/phpunit/php-timer/src/Timer.php create mode 100644 vendor/phpunit/php-timer/tests/TimerTest.php create mode 100644 vendor/phpunit/php-token-stream/.gitattributes create mode 100644 vendor/phpunit/php-token-stream/.github/FUNDING.yml create mode 100644 vendor/phpunit/php-token-stream/.gitignore create mode 100644 vendor/phpunit/php-token-stream/.travis.yml create mode 100644 vendor/phpunit/php-token-stream/ChangeLog.md create mode 100644 vendor/phpunit/php-token-stream/LICENSE create mode 100644 vendor/phpunit/php-token-stream/README.md create mode 100644 vendor/phpunit/php-token-stream/build.xml create mode 100644 vendor/phpunit/php-token-stream/composer.json create mode 100644 vendor/phpunit/php-token-stream/phpunit.xml create mode 100644 vendor/phpunit/php-token-stream/src/Token.php create mode 100644 vendor/phpunit/php-token-stream/src/Token/Stream.php create mode 100644 vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php create mode 100644 vendor/phpunit/php-token-stream/src/Token/Util.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/ClassTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classExtendsNamespacedClass.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classInNamespace.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classInScopedNamespace.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classUsesNamespacedFunction.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_that_declares_anonymous_class.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_that_declares_anonymous_class2.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/closure.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/issue19.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/issue30.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/multipleNamespacesWithOneClassUsingBraces.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/multipleNamespacesWithOneClassUsingNonBraceSyntax.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/php-code-coverage-issue-424.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source2.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source3.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source4.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source5.php create mode 100644 vendor/phpunit/php-token-stream/tests/bootstrap.php create mode 100644 vendor/phpunit/phpunit/.gitattributes create mode 100644 vendor/phpunit/phpunit/.gitignore create mode 100644 vendor/phpunit/phpunit/.phive/phars.xml create mode 100644 vendor/phpunit/phpunit/.phpstorm.meta.php create mode 100644 vendor/phpunit/phpunit/ChangeLog-8.5.md create mode 100644 vendor/phpunit/phpunit/LICENSE create mode 100644 vendor/phpunit/phpunit/README.md create mode 100644 vendor/phpunit/phpunit/composer.json create mode 100755 vendor/phpunit/phpunit/phpunit create mode 100644 vendor/phpunit/phpunit/phpunit.xsd create mode 100644 vendor/phpunit/phpunit/src/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Assert.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Assert/Functions.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Count.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php create mode 100644 vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Error.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Notice.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Warning.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Warning.php create mode 100644 vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php create mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SelfDescribing.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Test.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestFailure.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestListener.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestResult.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/WarningTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php create mode 100644 vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Factory.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/Hook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php create mode 100644 vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php create mode 100644 vendor/phpunit/phpunit/src/Runner/PhptTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php create mode 100644 vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResultCache.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Version.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Help.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/TestRunner.php create mode 100644 vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php create mode 100644 vendor/phpunit/phpunit/src/Util/Annotation/Registry.php create mode 100644 vendor/phpunit/phpunit/src/Util/Blacklist.php create mode 100644 vendor/phpunit/phpunit/src/Util/Color.php create mode 100644 vendor/phpunit/phpunit/src/Util/Configuration.php create mode 100644 vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php create mode 100644 vendor/phpunit/phpunit/src/Util/ErrorHandler.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Util/FileLoader.php create mode 100644 vendor/phpunit/phpunit/src/Util/Filesystem.php create mode 100644 vendor/phpunit/phpunit/src/Util/Filter.php create mode 100644 vendor/phpunit/phpunit/src/Util/Getopt.php create mode 100644 vendor/phpunit/phpunit/src/Util/GlobalState.php create mode 100644 vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php create mode 100644 vendor/phpunit/phpunit/src/Util/Json.php create mode 100644 vendor/phpunit/phpunit/src/Util/Log/JUnit.php create mode 100644 vendor/phpunit/phpunit/src/Util/Log/TeamCity.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php create mode 100644 vendor/phpunit/phpunit/src/Util/Printer.php create mode 100644 vendor/phpunit/phpunit/src/Util/RegularExpression.php create mode 100644 vendor/phpunit/phpunit/src/Util/Test.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php create mode 100644 vendor/phpunit/phpunit/src/Util/Type.php create mode 100644 vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php create mode 100644 vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php create mode 100644 vendor/phpunit/phpunit/src/Util/Xml.php create mode 100644 vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php create mode 100644 vendor/prettus/l5-repository/.editorconfig create mode 100644 vendor/prettus/l5-repository/.gitignore create mode 100644 vendor/prettus/l5-repository/CODE_OF_CONDUCT.md create mode 100644 vendor/prettus/l5-repository/CONTRIBUTING.md create mode 100644 vendor/prettus/l5-repository/LICENSE.md create mode 100644 vendor/prettus/l5-repository/README.md create mode 100644 vendor/prettus/l5-repository/_config.yml create mode 100644 vendor/prettus/l5-repository/composer.json create mode 100644 vendor/prettus/l5-repository/composer.lock create mode 100644 vendor/prettus/l5-repository/migration-to-2.0.md create mode 100644 vendor/prettus/l5-repository/migration-to-2.1.md create mode 100644 vendor/prettus/l5-repository/phpunit.xml create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/CacheableInterface.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/CriteriaInterface.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/Presentable.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/PresenterInterface.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/RepositoryCriteriaInterface.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/RepositoryInterface.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Contracts/Transformable.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Criteria/RequestCriteria.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Eloquent/BaseRepository.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityCreated.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityDeleted.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityUpdated.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEventBase.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Exceptions/RepositoryException.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/ApiControllerGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/ApiRepositoryEloquentGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/BindingsGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ApiControllerCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ApiRepositoryCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/BindingsCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ControllerCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/CriteriaCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/EntityCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/PresenterCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/RepositoryCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/TransformerCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ValidatorCommand.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/ControllerGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/CriteriaGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/FileAlreadyExistsException.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Generator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/MigrationGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/NameParser.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/RulesParser.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/SchemaParser.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/ModelGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/PresenterGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/RepositoryEloquentGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/RepositoryInterfaceGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stub.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/api/controller.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/api/eloquent.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/bindings/bindings.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/controller/controller.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/criteria/criteria.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/migration/change.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/migration/create.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/model.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/presenter/presenter.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/repository/eloquent.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/repository/interface.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/seed.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/transformer/transformer.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/Stubs/validator/validator.stub create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/TransformerGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Generators/ValidatorGenerator.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Helpers/CacheKeys.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Listeners/CleanCacheRepository.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Presenter/FractalPresenter.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Presenter/ModelFractalPresenter.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Providers/EventServiceProvider.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Providers/LumenRepositoryServiceProvider.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Providers/RepositoryServiceProvider.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Traits/CacheableRepository.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Traits/ComparesVersionsTrait.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Traits/PresentableTrait.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Traits/Respondable.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Traits/TransformableTrait.php create mode 100644 vendor/prettus/l5-repository/src/Prettus/Repository/Transformer/ModelTransformer.php create mode 100644 vendor/prettus/l5-repository/src/resources/config/repository.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/cn/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/cn/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/en/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/en/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/it/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/it/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/nl/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/nl/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/pt-br/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/pt-br/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/pt/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/pt/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/ro/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/ro/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/zh_CN/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/zh_CN/packages.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/zh_TW/criteria.php create mode 100644 vendor/prettus/l5-repository/src/resources/lang/zh_TW/packages.php create mode 100644 vendor/prettus/laravel-validation/.editorconfig create mode 100644 vendor/prettus/laravel-validation/.gitignore create mode 100644 vendor/prettus/laravel-validation/.travis.yml create mode 100644 vendor/prettus/laravel-validation/LICENSE create mode 100644 vendor/prettus/laravel-validation/README.md create mode 100644 vendor/prettus/laravel-validation/_config.yml create mode 100644 vendor/prettus/laravel-validation/composer.json create mode 100644 vendor/prettus/laravel-validation/composer.lock create mode 100644 vendor/prettus/laravel-validation/phpunit.xml create mode 100644 vendor/prettus/laravel-validation/src/Prettus/Validator/AbstractValidator.php create mode 100644 vendor/prettus/laravel-validation/src/Prettus/Validator/Contracts/ValidatorInterface.php create mode 100644 vendor/prettus/laravel-validation/src/Prettus/Validator/Exceptions/ValidatorException.php create mode 100644 vendor/prettus/laravel-validation/src/Prettus/Validator/LaravelValidator.php create mode 100644 vendor/prettus/laravel-validation/tests/.gitkeep create mode 100644 vendor/psr/container/.gitignore create mode 100644 vendor/psr/container/LICENSE create mode 100644 vendor/psr/container/README.md create mode 100644 vendor/psr/container/composer.json create mode 100644 vendor/psr/container/src/ContainerExceptionInterface.php create mode 100644 vendor/psr/container/src/ContainerInterface.php create mode 100644 vendor/psr/container/src/NotFoundExceptionInterface.php create mode 100644 vendor/psr/event-dispatcher/.editorconfig create mode 100644 vendor/psr/event-dispatcher/.gitignore create mode 100644 vendor/psr/event-dispatcher/LICENSE create mode 100644 vendor/psr/event-dispatcher/README.md create mode 100644 vendor/psr/event-dispatcher/composer.json create mode 100644 vendor/psr/event-dispatcher/src/EventDispatcherInterface.php create mode 100644 vendor/psr/event-dispatcher/src/ListenerProviderInterface.php create mode 100644 vendor/psr/event-dispatcher/src/StoppableEventInterface.php create mode 100644 vendor/psr/http-message/CHANGELOG.md create mode 100644 vendor/psr/http-message/LICENSE create mode 100644 vendor/psr/http-message/README.md create mode 100644 vendor/psr/http-message/composer.json create mode 100644 vendor/psr/http-message/src/MessageInterface.php create mode 100644 vendor/psr/http-message/src/RequestInterface.php create mode 100644 vendor/psr/http-message/src/ResponseInterface.php create mode 100644 vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 vendor/psr/http-message/src/StreamInterface.php create mode 100644 vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 vendor/psr/http-message/src/UriInterface.php create mode 100644 vendor/psr/log/LICENSE create mode 100644 vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100644 vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100644 vendor/psr/log/Psr/Log/LogLevel.php create mode 100644 vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100644 vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100644 vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100644 vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100644 vendor/psr/log/Psr/Log/NullLogger.php create mode 100644 vendor/psr/log/Psr/Log/Test/DummyTest.php create mode 100644 vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php create mode 100644 vendor/psr/log/Psr/Log/Test/TestLogger.php create mode 100644 vendor/psr/log/README.md create mode 100644 vendor/psr/log/composer.json create mode 100644 vendor/psr/simple-cache/.editorconfig create mode 100644 vendor/psr/simple-cache/LICENSE.md create mode 100644 vendor/psr/simple-cache/README.md create mode 100644 vendor/psr/simple-cache/composer.json create mode 100644 vendor/psr/simple-cache/src/CacheException.php create mode 100644 vendor/psr/simple-cache/src/CacheInterface.php create mode 100644 vendor/psr/simple-cache/src/InvalidArgumentException.php create mode 100644 vendor/psy/psysh/.phan/config.php create mode 100644 vendor/psy/psysh/LICENSE create mode 100644 vendor/psy/psysh/README.md create mode 100755 vendor/psy/psysh/bin/psysh create mode 100644 vendor/psy/psysh/composer.json create mode 100644 vendor/psy/psysh/src/CodeCleaner.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/AbstractClassPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/AssignThisVariablePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/CallTimePassByReferencePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/CalledClassPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/CodeCleanerPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ExitPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/FinalClassPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/FunctionContextPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/InstanceOfPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/LabelContextPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/LeavePsyshAlonePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ListPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/LoopContextPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/MagicConstantsPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/NamespaceAwarePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/NamespacePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/NoReturnValue.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/PassableByReferencePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/RequirePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ReturnTypePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/StrictTypesPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/UseStatementPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ValidConstantPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ValidConstructorPass.php create mode 100644 vendor/psy/psysh/src/CodeCleaner/ValidFunctionNamePass.php create mode 100644 vendor/psy/psysh/src/Command/BufferCommand.php create mode 100644 vendor/psy/psysh/src/Command/ClearCommand.php create mode 100644 vendor/psy/psysh/src/Command/Command.php create mode 100644 vendor/psy/psysh/src/Command/DocCommand.php create mode 100644 vendor/psy/psysh/src/Command/DumpCommand.php create mode 100644 vendor/psy/psysh/src/Command/EditCommand.php create mode 100644 vendor/psy/psysh/src/Command/ExitCommand.php create mode 100644 vendor/psy/psysh/src/Command/HelpCommand.php create mode 100644 vendor/psy/psysh/src/Command/HistoryCommand.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/ClassConstantEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/ClassEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/ConstantEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/Enumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/FunctionEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/GlobalVariableEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/MethodEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/PropertyEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ListCommand/VariableEnumerator.php create mode 100644 vendor/psy/psysh/src/Command/ParseCommand.php create mode 100644 vendor/psy/psysh/src/Command/PsyVersionCommand.php create mode 100644 vendor/psy/psysh/src/Command/ReflectingCommand.php create mode 100644 vendor/psy/psysh/src/Command/ShowCommand.php create mode 100644 vendor/psy/psysh/src/Command/SudoCommand.php create mode 100644 vendor/psy/psysh/src/Command/ThrowUpCommand.php create mode 100644 vendor/psy/psysh/src/Command/TimeitCommand.php create mode 100644 vendor/psy/psysh/src/Command/TimeitCommand/TimeitVisitor.php create mode 100644 vendor/psy/psysh/src/Command/TraceCommand.php create mode 100644 vendor/psy/psysh/src/Command/WhereamiCommand.php create mode 100644 vendor/psy/psysh/src/Command/WtfCommand.php create mode 100644 vendor/psy/psysh/src/ConfigPaths.php create mode 100644 vendor/psy/psysh/src/Configuration.php create mode 100644 vendor/psy/psysh/src/ConsoleColorFactory.php create mode 100644 vendor/psy/psysh/src/Context.php create mode 100644 vendor/psy/psysh/src/ContextAware.php create mode 100644 vendor/psy/psysh/src/Exception/BreakException.php create mode 100644 vendor/psy/psysh/src/Exception/DeprecatedException.php create mode 100644 vendor/psy/psysh/src/Exception/ErrorException.php create mode 100644 vendor/psy/psysh/src/Exception/Exception.php create mode 100644 vendor/psy/psysh/src/Exception/FatalErrorException.php create mode 100644 vendor/psy/psysh/src/Exception/ParseErrorException.php create mode 100644 vendor/psy/psysh/src/Exception/RuntimeException.php create mode 100644 vendor/psy/psysh/src/Exception/ThrowUpException.php create mode 100644 vendor/psy/psysh/src/Exception/TypeErrorException.php create mode 100644 vendor/psy/psysh/src/Exception/UnexpectedTargetException.php create mode 100644 vendor/psy/psysh/src/ExecutionClosure.php create mode 100644 vendor/psy/psysh/src/ExecutionLoop/AbstractListener.php create mode 100644 vendor/psy/psysh/src/ExecutionLoop/Listener.php create mode 100644 vendor/psy/psysh/src/ExecutionLoop/ProcessForker.php create mode 100644 vendor/psy/psysh/src/ExecutionLoop/RunkitReloader.php create mode 100644 vendor/psy/psysh/src/ExecutionLoopClosure.php create mode 100644 vendor/psy/psysh/src/Formatter/CodeFormatter.php create mode 100644 vendor/psy/psysh/src/Formatter/DocblockFormatter.php create mode 100644 vendor/psy/psysh/src/Formatter/Formatter.php create mode 100644 vendor/psy/psysh/src/Formatter/ReflectorFormatter.php create mode 100644 vendor/psy/psysh/src/Formatter/SignatureFormatter.php create mode 100644 vendor/psy/psysh/src/Formatter/TraceFormatter.php create mode 100644 vendor/psy/psysh/src/Input/CodeArgument.php create mode 100644 vendor/psy/psysh/src/Input/FilterOptions.php create mode 100644 vendor/psy/psysh/src/Input/ShellInput.php create mode 100644 vendor/psy/psysh/src/Input/SilentInput.php create mode 100644 vendor/psy/psysh/src/Output/OutputPager.php create mode 100644 vendor/psy/psysh/src/Output/PassthruPager.php create mode 100644 vendor/psy/psysh/src/Output/ProcOutputPager.php create mode 100644 vendor/psy/psysh/src/Output/ShellOutput.php create mode 100644 vendor/psy/psysh/src/ParserFactory.php create mode 100644 vendor/psy/psysh/src/Readline/GNUReadline.php create mode 100644 vendor/psy/psysh/src/Readline/HoaConsole.php create mode 100644 vendor/psy/psysh/src/Readline/Libedit.php create mode 100644 vendor/psy/psysh/src/Readline/Readline.php create mode 100644 vendor/psy/psysh/src/Readline/Transient.php create mode 100644 vendor/psy/psysh/src/Reflection/ReflectionClassConstant.php create mode 100644 vendor/psy/psysh/src/Reflection/ReflectionConstant.php create mode 100644 vendor/psy/psysh/src/Reflection/ReflectionConstant_.php create mode 100644 vendor/psy/psysh/src/Reflection/ReflectionLanguageConstruct.php create mode 100644 vendor/psy/psysh/src/Reflection/ReflectionLanguageConstructParameter.php create mode 100644 vendor/psy/psysh/src/Reflection/ReflectionNamespace.php create mode 100644 vendor/psy/psysh/src/Shell.php create mode 100644 vendor/psy/psysh/src/Sudo.php create mode 100644 vendor/psy/psysh/src/Sudo/SudoVisitor.php create mode 100644 vendor/psy/psysh/src/TabCompletion/AutoCompleter.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/AbstractMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ClassNamesMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/CommandsMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ConstantsMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/FunctionsMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/KeywordsMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/MongoClientMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.php create mode 100644 vendor/psy/psysh/src/TabCompletion/Matcher/VariablesMatcher.php create mode 100644 vendor/psy/psysh/src/Util/Docblock.php create mode 100644 vendor/psy/psysh/src/Util/Json.php create mode 100644 vendor/psy/psysh/src/Util/Mirror.php create mode 100644 vendor/psy/psysh/src/Util/Str.php create mode 100644 vendor/psy/psysh/src/VarDumper/Cloner.php create mode 100644 vendor/psy/psysh/src/VarDumper/Dumper.php create mode 100644 vendor/psy/psysh/src/VarDumper/Presenter.php create mode 100644 vendor/psy/psysh/src/VarDumper/PresenterAware.php create mode 100644 vendor/psy/psysh/src/VersionUpdater/Checker.php create mode 100644 vendor/psy/psysh/src/VersionUpdater/GitHubChecker.php create mode 100644 vendor/psy/psysh/src/VersionUpdater/IntervalChecker.php create mode 100644 vendor/psy/psysh/src/VersionUpdater/NoopChecker.php create mode 100644 vendor/psy/psysh/src/functions.php create mode 100644 vendor/ralouphie/getallheaders/LICENSE create mode 100644 vendor/ralouphie/getallheaders/README.md create mode 100644 vendor/ralouphie/getallheaders/composer.json create mode 100644 vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 vendor/ramsey/collection/CHANGELOG.md create mode 100644 vendor/ramsey/collection/LICENSE create mode 100644 vendor/ramsey/collection/README.md create mode 100644 vendor/ramsey/collection/composer.json create mode 100644 vendor/ramsey/collection/phpstan-tests.neon create mode 100644 vendor/ramsey/collection/src/AbstractArray.php create mode 100644 vendor/ramsey/collection/src/AbstractCollection.php create mode 100644 vendor/ramsey/collection/src/AbstractSet.php create mode 100644 vendor/ramsey/collection/src/ArrayInterface.php create mode 100644 vendor/ramsey/collection/src/Collection.php create mode 100644 vendor/ramsey/collection/src/CollectionInterface.php create mode 100644 vendor/ramsey/collection/src/DoubleEndedQueue.php create mode 100644 vendor/ramsey/collection/src/DoubleEndedQueueInterface.php create mode 100644 vendor/ramsey/collection/src/Exception/CollectionMismatchException.php create mode 100644 vendor/ramsey/collection/src/Exception/InvalidArgumentException.php create mode 100644 vendor/ramsey/collection/src/Exception/InvalidSortOrderException.php create mode 100644 vendor/ramsey/collection/src/Exception/NoSuchElementException.php create mode 100644 vendor/ramsey/collection/src/Exception/OutOfBoundsException.php create mode 100644 vendor/ramsey/collection/src/Exception/UnsupportedOperationException.php create mode 100644 vendor/ramsey/collection/src/Exception/ValueExtractionException.php create mode 100644 vendor/ramsey/collection/src/GenericArray.php create mode 100644 vendor/ramsey/collection/src/Map/AbstractMap.php create mode 100644 vendor/ramsey/collection/src/Map/AbstractTypedMap.php create mode 100644 vendor/ramsey/collection/src/Map/AssociativeArrayMap.php create mode 100644 vendor/ramsey/collection/src/Map/MapInterface.php create mode 100644 vendor/ramsey/collection/src/Map/NamedParameterMap.php create mode 100644 vendor/ramsey/collection/src/Map/TypedMap.php create mode 100644 vendor/ramsey/collection/src/Map/TypedMapInterface.php create mode 100644 vendor/ramsey/collection/src/Queue.php create mode 100644 vendor/ramsey/collection/src/QueueInterface.php create mode 100644 vendor/ramsey/collection/src/Set.php create mode 100644 vendor/ramsey/collection/src/Tool/TypeTrait.php create mode 100644 vendor/ramsey/collection/src/Tool/ValueExtractorTrait.php create mode 100644 vendor/ramsey/collection/src/Tool/ValueToStringTrait.php create mode 100644 vendor/ramsey/uuid/CHANGELOG.md create mode 100644 vendor/ramsey/uuid/LICENSE create mode 100644 vendor/ramsey/uuid/README.md create mode 100644 vendor/ramsey/uuid/composer.json create mode 100644 vendor/ramsey/uuid/src/BinaryUtils.php create mode 100644 vendor/ramsey/uuid/src/Builder/BuilderCollection.php create mode 100644 vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php create mode 100644 vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php create mode 100644 vendor/ramsey/uuid/src/Builder/FallbackBuilder.php create mode 100644 vendor/ramsey/uuid/src/Builder/UuidBuilderInterface.php create mode 100644 vendor/ramsey/uuid/src/Codec/CodecInterface.php create mode 100644 vendor/ramsey/uuid/src/Codec/GuidStringCodec.php create mode 100644 vendor/ramsey/uuid/src/Codec/OrderedTimeCodec.php create mode 100644 vendor/ramsey/uuid/src/Codec/StringCodec.php create mode 100644 vendor/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php create mode 100644 vendor/ramsey/uuid/src/Codec/TimestampLastCombCodec.php create mode 100644 vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/NumberConverterInterface.php create mode 100644 vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php create mode 100644 vendor/ramsey/uuid/src/Converter/TimeConverterInterface.php create mode 100644 vendor/ramsey/uuid/src/DegradedUuid.php create mode 100644 vendor/ramsey/uuid/src/DeprecatedUuidInterface.php create mode 100644 vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php create mode 100644 vendor/ramsey/uuid/src/Exception/BuilderNotFoundException.php create mode 100644 vendor/ramsey/uuid/src/Exception/DateTimeException.php create mode 100644 vendor/ramsey/uuid/src/Exception/DceSecurityException.php create mode 100644 vendor/ramsey/uuid/src/Exception/InvalidArgumentException.php create mode 100644 vendor/ramsey/uuid/src/Exception/InvalidBytesException.php create mode 100644 vendor/ramsey/uuid/src/Exception/InvalidUuidStringException.php create mode 100644 vendor/ramsey/uuid/src/Exception/NameException.php create mode 100644 vendor/ramsey/uuid/src/Exception/NodeException.php create mode 100644 vendor/ramsey/uuid/src/Exception/RandomSourceException.php create mode 100644 vendor/ramsey/uuid/src/Exception/TimeSourceException.php create mode 100644 vendor/ramsey/uuid/src/Exception/UnableToBuildUuidException.php create mode 100644 vendor/ramsey/uuid/src/Exception/UnsupportedOperationException.php create mode 100644 vendor/ramsey/uuid/src/FeatureSet.php create mode 100644 vendor/ramsey/uuid/src/Fields/FieldsInterface.php create mode 100644 vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php create mode 100644 vendor/ramsey/uuid/src/Generator/CombGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php create mode 100644 vendor/ramsey/uuid/src/Generator/DefaultNameGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/NameGeneratorFactory.php create mode 100644 vendor/ramsey/uuid/src/Generator/NameGeneratorInterface.php create mode 100644 vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/RandomBytesGenerator.php create mode 100644 vendor/ramsey/uuid/src/Generator/RandomGeneratorFactory.php create mode 100644 vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php create mode 100644 vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php create mode 100644 vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php create mode 100644 vendor/ramsey/uuid/src/Generator/TimeGeneratorInterface.php create mode 100644 vendor/ramsey/uuid/src/Guid/Fields.php create mode 100644 vendor/ramsey/uuid/src/Guid/Guid.php create mode 100644 vendor/ramsey/uuid/src/Guid/GuidBuilder.php create mode 100644 vendor/ramsey/uuid/src/Math/BrickMathCalculator.php create mode 100644 vendor/ramsey/uuid/src/Math/CalculatorInterface.php create mode 100644 vendor/ramsey/uuid/src/Math/RoundingMode.php create mode 100644 vendor/ramsey/uuid/src/Nonstandard/Fields.php create mode 100644 vendor/ramsey/uuid/src/Nonstandard/Uuid.php create mode 100644 vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php create mode 100644 vendor/ramsey/uuid/src/Nonstandard/UuidV6.php create mode 100644 vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php create mode 100644 vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php create mode 100644 vendor/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/NodeProviderInterface.php create mode 100644 vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php create mode 100644 vendor/ramsey/uuid/src/Provider/TimeProviderInterface.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/Fields.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/NilTrait.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/NilUuid.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidV1.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidV2.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidV3.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidV4.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/UuidV5.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/Validator.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php create mode 100644 vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php create mode 100644 vendor/ramsey/uuid/src/Type/Decimal.php create mode 100644 vendor/ramsey/uuid/src/Type/Hexadecimal.php create mode 100644 vendor/ramsey/uuid/src/Type/Integer.php create mode 100644 vendor/ramsey/uuid/src/Type/NumberInterface.php create mode 100644 vendor/ramsey/uuid/src/Type/Time.php create mode 100644 vendor/ramsey/uuid/src/Type/TypeInterface.php create mode 100644 vendor/ramsey/uuid/src/Uuid.php create mode 100644 vendor/ramsey/uuid/src/UuidFactory.php create mode 100644 vendor/ramsey/uuid/src/UuidFactoryInterface.php create mode 100644 vendor/ramsey/uuid/src/UuidInterface.php create mode 100644 vendor/ramsey/uuid/src/Validator/GenericValidator.php create mode 100644 vendor/ramsey/uuid/src/Validator/ValidatorInterface.php create mode 100644 vendor/ramsey/uuid/src/functions.php create mode 100644 vendor/scrivo/highlight.php/.editorconfig create mode 100644 vendor/scrivo/highlight.php/.gitattributes create mode 100644 vendor/scrivo/highlight.php/.github/FUNDING.yml create mode 100644 vendor/scrivo/highlight.php/.gitignore create mode 100644 vendor/scrivo/highlight.php/.php_cs.dist create mode 100644 vendor/scrivo/highlight.php/.travis.yml create mode 100644 vendor/scrivo/highlight.php/.travis/hasGitChanges.sh create mode 100644 vendor/scrivo/highlight.php/AUTHORS.txt create mode 100644 vendor/scrivo/highlight.php/CONTRIBUTING.md create mode 100644 vendor/scrivo/highlight.php/Highlight/Autoloader.php create mode 100644 vendor/scrivo/highlight.php/Highlight/HighlightResult.php create mode 100644 vendor/scrivo/highlight.php/Highlight/Highlighter.php create mode 100644 vendor/scrivo/highlight.php/Highlight/JsonRef.php create mode 100644 vendor/scrivo/highlight.php/Highlight/Language.php create mode 100644 vendor/scrivo/highlight.php/Highlight/Mode.php create mode 100644 vendor/scrivo/highlight.php/Highlight/ModeDeprecations.php create mode 100644 vendor/scrivo/highlight.php/Highlight/RegEx.php create mode 100644 vendor/scrivo/highlight.php/Highlight/RegExMatch.php create mode 100644 vendor/scrivo/highlight.php/Highlight/RegExUtils.php create mode 100644 vendor/scrivo/highlight.php/Highlight/Terminators.php create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/1c.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/abnf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/accesslog.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/actionscript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ada.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/angelscript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/apache.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/applescript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/arcade.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/arduino.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/armasm.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/asciidoc.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/aspectj.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/autohotkey.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/autoit.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/avrasm.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/awk.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/axapta.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/bash.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/basic.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/bnf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/brainfuck.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/cal.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/capnproto.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ceylon.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/clean.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/clojure-repl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/clojure.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/cmake.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/coffeescript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/coq.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/cos.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/cpp.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/crmsh.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/crystal.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/cs.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/csp.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/css.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/d.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dart.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/delphi.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/diff.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/django.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dns.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dockerfile.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dos.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dsconfig.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dts.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/dust.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ebnf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/elixir.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/elm.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/erb.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/erlang-repl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/erlang.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/excel.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/fix.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/flix.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/fortran.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/fsharp.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/gams.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/gauss.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/gcode.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/gherkin.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/glsl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/gml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/go.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/golo.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/gradle.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/groovy.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/haml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/handlebars.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/haskell.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/haxe.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/hsp.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/htmlbars.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/http.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/hy.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/inform7.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ini.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/irpf90.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/isbl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/java.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/javascript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/jboss-cli.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/json.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/julia-repl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/julia.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/kotlin.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/lasso.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ldif.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/leaf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/less.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/lisp.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/livecodeserver.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/livescript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/llvm.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/lsl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/lua.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/makefile.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/markdown.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/mathematica.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/matlab.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/maxima.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/mel.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/mercury.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/mipsasm.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/mizar.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/mojolicious.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/monkey.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/moonscript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/n1ql.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/nginx.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/nimrod.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/nix.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/nsis.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/objectivec.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ocaml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/openscad.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/oxygene.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/parser3.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/perl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/pf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/pgsql.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/php.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/plaintext.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/pony.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/powershell.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/processing.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/profile.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/prolog.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/properties.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/protobuf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/puppet.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/purebasic.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/python.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/q.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/qml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/r.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/reasonml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/rib.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/roboconf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/routeros.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/rsl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ruby.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/ruleslanguage.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/rust.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/sas.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/scala.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/scheme.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/scilab.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/scss.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/shell.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/smali.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/smalltalk.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/sml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/sqf.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/sql.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/stan.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/stata.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/step21.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/stylus.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/subunit.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/swift.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/taggerscript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/tap.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/tcl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/tex.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/thrift.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/tp.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/twig.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/typescript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/vala.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/vbnet.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/vbscript-html.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/vbscript.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/verilog.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/vhdl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/vim.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/x86asm.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/xl.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/xml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/xquery.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/yaml.json create mode 100644 vendor/scrivo/highlight.php/Highlight/languages/zephir.json create mode 100644 vendor/scrivo/highlight.php/HighlightUtilities/_internals.php create mode 100644 vendor/scrivo/highlight.php/HighlightUtilities/_themeColors.php create mode 100644 vendor/scrivo/highlight.php/HighlightUtilities/functions.php create mode 100644 vendor/scrivo/highlight.php/LICENSE.md create mode 100644 vendor/scrivo/highlight.php/README.md create mode 100644 vendor/scrivo/highlight.php/composer.json create mode 100644 vendor/scrivo/highlight.php/demo/.htaccess create mode 100644 vendor/scrivo/highlight.php/demo/compare.php create mode 100644 vendor/scrivo/highlight.php/demo/demo.php create mode 100644 vendor/scrivo/highlight.php/demo/example.php create mode 100644 vendor/scrivo/highlight.php/demo/highlight.pack.js create mode 100644 vendor/scrivo/highlight.php/demo/line-numbers.php create mode 100644 vendor/scrivo/highlight.php/phpunit.xml.dist create mode 100644 vendor/scrivo/highlight.php/styles/a11y-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/a11y-light.css create mode 100644 vendor/scrivo/highlight.php/styles/agate.css create mode 100644 vendor/scrivo/highlight.php/styles/an-old-hope.css create mode 100644 vendor/scrivo/highlight.php/styles/androidstudio.css create mode 100644 vendor/scrivo/highlight.php/styles/arduino-light.css create mode 100644 vendor/scrivo/highlight.php/styles/arta.css create mode 100644 vendor/scrivo/highlight.php/styles/ascetic.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-cave-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-cave-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-dune-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-dune-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-estuary-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-estuary-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-forest-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-forest-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-heath-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-heath-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-lakeside-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-lakeside-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-plateau-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-plateau-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-savanna-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-savanna-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-seaside-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-seaside-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-sulphurpool-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atelier-sulphurpool-light.css create mode 100644 vendor/scrivo/highlight.php/styles/atom-one-dark-reasonable.css create mode 100644 vendor/scrivo/highlight.php/styles/atom-one-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/atom-one-light.css create mode 100644 vendor/scrivo/highlight.php/styles/brown-paper.css create mode 100644 vendor/scrivo/highlight.php/styles/brown-papersq.png create mode 100644 vendor/scrivo/highlight.php/styles/codepen-embed.css create mode 100644 vendor/scrivo/highlight.php/styles/color-brewer.css create mode 100644 vendor/scrivo/highlight.php/styles/darcula.css create mode 100644 vendor/scrivo/highlight.php/styles/dark.css create mode 100644 vendor/scrivo/highlight.php/styles/darkula.css create mode 100644 vendor/scrivo/highlight.php/styles/default.css create mode 100644 vendor/scrivo/highlight.php/styles/docco.css create mode 100644 vendor/scrivo/highlight.php/styles/dracula.css create mode 100644 vendor/scrivo/highlight.php/styles/far.css create mode 100644 vendor/scrivo/highlight.php/styles/foundation.css create mode 100644 vendor/scrivo/highlight.php/styles/github-gist.css create mode 100644 vendor/scrivo/highlight.php/styles/github.css create mode 100644 vendor/scrivo/highlight.php/styles/gml.css create mode 100644 vendor/scrivo/highlight.php/styles/googlecode.css create mode 100644 vendor/scrivo/highlight.php/styles/gradient-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/grayscale.css create mode 100644 vendor/scrivo/highlight.php/styles/gruvbox-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/gruvbox-light.css create mode 100644 vendor/scrivo/highlight.php/styles/hopscotch.css create mode 100644 vendor/scrivo/highlight.php/styles/hybrid.css create mode 100644 vendor/scrivo/highlight.php/styles/idea.css create mode 100644 vendor/scrivo/highlight.php/styles/ir-black.css create mode 100644 vendor/scrivo/highlight.php/styles/isbl-editor-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/isbl-editor-light.css create mode 100644 vendor/scrivo/highlight.php/styles/kimbie.dark.css create mode 100644 vendor/scrivo/highlight.php/styles/kimbie.light.css create mode 100644 vendor/scrivo/highlight.php/styles/lightfair.css create mode 100644 vendor/scrivo/highlight.php/styles/magula.css create mode 100644 vendor/scrivo/highlight.php/styles/mono-blue.css create mode 100644 vendor/scrivo/highlight.php/styles/monokai-sublime.css create mode 100644 vendor/scrivo/highlight.php/styles/monokai.css create mode 100644 vendor/scrivo/highlight.php/styles/night-owl.css create mode 100644 vendor/scrivo/highlight.php/styles/nord.css create mode 100644 vendor/scrivo/highlight.php/styles/obsidian.css create mode 100644 vendor/scrivo/highlight.php/styles/ocean.css create mode 100644 vendor/scrivo/highlight.php/styles/paraiso-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/paraiso-light.css create mode 100644 vendor/scrivo/highlight.php/styles/pojoaque.css create mode 100644 vendor/scrivo/highlight.php/styles/pojoaque.jpg create mode 100644 vendor/scrivo/highlight.php/styles/purebasic.css create mode 100644 vendor/scrivo/highlight.php/styles/qtcreator_dark.css create mode 100644 vendor/scrivo/highlight.php/styles/qtcreator_light.css create mode 100644 vendor/scrivo/highlight.php/styles/railscasts.css create mode 100644 vendor/scrivo/highlight.php/styles/rainbow.css create mode 100644 vendor/scrivo/highlight.php/styles/routeros.css create mode 100644 vendor/scrivo/highlight.php/styles/school-book.css create mode 100644 vendor/scrivo/highlight.php/styles/school-book.png create mode 100644 vendor/scrivo/highlight.php/styles/shades-of-purple.css create mode 100644 vendor/scrivo/highlight.php/styles/solarized-dark.css create mode 100644 vendor/scrivo/highlight.php/styles/solarized-light.css create mode 100644 vendor/scrivo/highlight.php/styles/sunburst.css create mode 100644 vendor/scrivo/highlight.php/styles/tomorrow-night-blue.css create mode 100644 vendor/scrivo/highlight.php/styles/tomorrow-night-bright.css create mode 100644 vendor/scrivo/highlight.php/styles/tomorrow-night-eighties.css create mode 100644 vendor/scrivo/highlight.php/styles/tomorrow-night.css create mode 100644 vendor/scrivo/highlight.php/styles/tomorrow.css create mode 100644 vendor/scrivo/highlight.php/styles/vs.css create mode 100644 vendor/scrivo/highlight.php/styles/vs2015.css create mode 100644 vendor/scrivo/highlight.php/styles/xcode.css create mode 100644 vendor/scrivo/highlight.php/styles/xt256.css create mode 100644 vendor/scrivo/highlight.php/styles/zenburn.css create mode 100644 vendor/scrivo/highlight.php/test/DetectionTest.php create mode 100644 vendor/scrivo/highlight.php/test/HighlightUtilitiesTest.php create mode 100644 vendor/scrivo/highlight.php/test/HighlighterTest.php create mode 100644 vendor/scrivo/highlight.php/test/MarkupTest.php create mode 100644 vendor/scrivo/highlight.php/test/SpecialTest.php create mode 100644 vendor/scrivo/highlight.php/test/bootstrap.php create mode 100644 vendor/scrivo/highlight.php/test/detect/1c/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/abnf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/accesslog/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/actionscript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ada/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/angelscript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/apache/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/applescript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/arcade/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/arduino/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/armasm/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/asciidoc/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/aspectj/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/autohotkey/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/autoit/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/avrasm/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/awk/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/axapta/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/bash/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/basic/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/bnf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/brainfuck/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/cal/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/capnproto/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ceylon/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/clean/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/clojure-repl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/clojure/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/cmake/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/coffeescript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/coq/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/cos/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/cpp/comment.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/cpp/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/crmsh/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/crystal/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/cs/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/csp/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/css/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/d/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dart/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/delphi/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/diff/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/django/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dns/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dockerfile/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dos/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dsconfig/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dts/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/dust/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ebnf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/elixir/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/elm/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/erb/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/erlang-repl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/erlang/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/excel/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/fix/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/flix/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/fortran/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/fsharp/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/gams/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/gauss/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/gcode/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/gherkin/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/glsl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/gml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/go/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/go/swift-like.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/golo/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/gradle/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/groovy/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/haml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/handlebars/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/haskell/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/haxe/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/hsp/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/htmlbars/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/http/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/hy/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/inform7/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ini/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/irpf90/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/isbl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/java/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/javascript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/javascript/sample1.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/javascript/short-plain.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/jboss-cli/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/json/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/julia-repl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/julia/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/kotlin/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/lasso/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ldif/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/leaf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/less/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/lisp/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/livecodeserver/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/livescript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/llvm/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/lsl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/lua/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/makefile/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/markdown/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/mathematica/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/matlab/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/maxima/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/mel/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/mercury/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/mipsasm/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/mizar/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/mojolicious/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/monkey/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/moonscript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/n1ql/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/nginx/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/nimrod/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/nix/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/nsis/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/objectivec/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ocaml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/openscad/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/oxygene/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/parser3/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/perl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/pf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/pgsql/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/php/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/plaintext/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/pony/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/powershell/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/processing/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/profile/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/prolog/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/properties/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/protobuf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/puppet/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/purebasic/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/python/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/q/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/qml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/r/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/reasonml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/rib/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/roboconf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/routeros/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/rsl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ruby/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ruby/double-colon.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/ruleslanguage/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/rust/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/sas/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/scala/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/scheme/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/scilab/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/scss/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/shell/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/smali/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/smalltalk/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/sml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/sqf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/sql/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/stan/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/stata/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/step21/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/stylus/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/subunit/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/swift/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/taggerscript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/tap/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/tcl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/tex/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/thrift/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/tp/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/twig/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/typescript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/vala/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/vbnet/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/vbscript-html/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/vbscript/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/verilog/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/vhdl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/vim/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/x86asm/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/xl/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/xml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/xml/groovy-julia.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/xml/js.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/xquery/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/yaml/default.txt create mode 100644 vendor/scrivo/highlight.php/test/detect/zephir/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/abnf/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/abnf/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/accesslog/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/accesslog/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/actionscript/method-call.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/actionscript/method-call.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/arcade/profile.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/arcade/profile.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/arduino/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/arduino/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/aspectj/intertype-constructor.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/aspectj/intertype-constructor.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/aspectj/intertype-method.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/aspectj/intertype-method.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/bash/escaped-quote.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/bash/escaped-quote.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/bash/no-numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/bash/no-numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ceylon/nested-comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ceylon/nested-comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/clojure-repl/prompt.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/clojure-repl/prompt.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/clojure/hint_col.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/clojure/hint_col.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/clojure/symbols-numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/clojure/symbols-numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/division.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/division.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/freeze_bug.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/freeze_bug.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/function.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/function.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/regex.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/coffeescript/regex.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cos/basic.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cos/basic.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cos/embedded.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cos/embedded.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/expression-keywords.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/expression-keywords.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/function-declarations.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/function-declarations.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/function-params.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/function-params.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/function-title.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/function-title.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/number-literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/number-literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/pointers-returns.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/pointers-returns.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/preprocessor.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/preprocessor.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/primitive-types.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/primitive-types.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/string-literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cpp/string-literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/defs.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/defs.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/macro.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/macro.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/operators.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/operators.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/regexes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/regexes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/toplevel-keywords.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/crystal/toplevel-keywords.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/dotted-namespace.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/dotted-namespace.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/floats.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/floats.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/functions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/functions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/string-interpolation.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/string-interpolation.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/titles.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/cs/titles.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/css/pseudo-selector.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/css/pseudo-selector.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/css/sample.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/css/sample.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/css/url.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/css/url.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dart/comment-markdown.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dart/comment-markdown.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dart/string-interpolation.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dart/string-interpolation.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/delphi/compiler-directive.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/delphi/compiler-directive.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/diff/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/diff/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dockerfile/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dockerfile/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dos/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dos/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dsconfig/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/dsconfig/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ebnf/quote-symbols.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ebnf/quote-symbols.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ebnf/terminators.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ebnf/terminators.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ebnf/underscore-production.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ebnf/underscore-production.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/function-title.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/function-title.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/sigils.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/sigils.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/strings.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/strings.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/uppercase-string-sigil.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/elixir/uppercase-string-sigil.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/excel/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/excel/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/fortran/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/fortran/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/fsharp/bang-keywords.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/fsharp/bang-keywords.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/gauss/function_defs.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/gauss/function_defs.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/gauss/function_refs.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/gauss/function_refs.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/gauss/keywords.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/gauss/keywords.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/go/functions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/go/functions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/go/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/go/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/go/strings.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/go/strings.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/golo/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/golo/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-expression-variants-as-path-segment.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-expression-variants-as-path-segment.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-expression-variants-in-helper-name.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-expression-variants-in-helper-name.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-expression-variants-in-param.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-expression-variants-in-param.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-with-param.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block-with-param.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/block.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/built-ins.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/built-ins.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/escaped-mustaches.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/escaped-mustaches.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/expression-variants.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/expression-variants.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/partial-call.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/partial-call.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/raw-block.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/raw-block.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/simple-expression.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/simple-expression.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/sub-expressions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/sub-expressions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/triple-mustache.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/handlebars/triple-mustache.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/haskell/infix.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/haskell/infix.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/haskell/nested-comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/haskell/nested-comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/http/default.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/http/default.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/array.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/array.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/tables.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/tables.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/types.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/types.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/variable.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ini/variable.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/java/gh1031.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/java/gh1031.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/java/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/java/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/java/titles.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/java/titles.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/arrow-function.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/arrow-function.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/class.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/class.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/default-parameters.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/default-parameters.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/inline-languages.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/inline-languages.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/jsdoc.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/jsdoc.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/jsx-fragment.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/jsx-fragment.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/jsx.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/jsx.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/keywords.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/keywords.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/method-call.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/method-call.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/modules.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/modules.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/object-attr.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/object-attr.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/shebang.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/shebang.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/template-strings.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/javascript/template-strings.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/json/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/json/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/class.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/class.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/function.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/function.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/nested_comment.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/nested_comment.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/string.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/kotlin/string.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/lasso/delimiters.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/lasso/delimiters.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ldif/ldapmodify.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ldif/ldapmodify.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ldif/schema.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ldif/schema.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/less/selectors.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/less/selectors.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/lisp/mec.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/lisp/mec.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/markdown/code.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/markdown/code.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/markdown/list.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/markdown/list.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/matlab/block_comment.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/matlab/block_comment.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/matlab/transpose.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/matlab/transpose.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/maxima/example.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/maxima/example.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/maxima/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/maxima/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/maxima/symbols.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/maxima/symbols.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/objectivec/preprocessor.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/objectivec/preprocessor.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/objectivec/string-literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/objectivec/string-literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ocaml/literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ocaml/literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ocaml/types.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ocaml/types.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/clauses.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/clauses.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/clauses2.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/clauses2.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/constraints.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/constraints.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/options.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/options.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/plpgsql.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/plpgsql.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/sql-commands.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/sql-commands.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/window-functions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/window-functions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/xml.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pgsql/xml.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/php/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/php/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/php/heredoc.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/php/heredoc.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/control-flow.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/control-flow.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/creator.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/creator.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/iterface-trait.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/iterface-trait.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/lambda.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/lambda.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/match.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/match.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/method.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/method.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/number-literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/number-literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/objects.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/objects.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/prime.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/prime.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/triple-quote.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/pony/triple-quote.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/apos-herestring.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/apos-herestring.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/classes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/classes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/misc.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/misc.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/quote-herestring.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/powershell/quote-herestring.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/properties/syntax.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/properties/syntax.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/protobuf/message-message.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/protobuf/message-message.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/escaped-quotes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/escaped-quotes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/f-strings.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/f-strings.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/function-header-comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/function-header-comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/function-header.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/function-header.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/matrix-multiplication.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/python/matrix-multiplication.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/functions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/functions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/literals.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/literals.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/modules.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/modules.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/pattern-matching.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/reasonml/pattern-matching.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/gemfile.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/gemfile.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/heredoc.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/heredoc.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/prompt.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/prompt.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/regexes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/ruby/regexes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/strings.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/strings.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/traits.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/traits.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/types.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/types.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/variables.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/rust/variables.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/scala/case-classes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/scala/case-classes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/scheme/lambda.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/scheme/lambda.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/scheme/quoted.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/scheme/quoted.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/shell/plain-prompt.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/shell/plain-prompt.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/shell/prompt-with-slash.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/shell/prompt-with-slash.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/interval.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/interval.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/join.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/join.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/keywords.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/keywords.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/lateral-view.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/lateral-view.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/numeric-types.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/numeric-types.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/set-operator.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/set-operator.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/string-types.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/string-types.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/tablesample.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/tablesample.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/values-statement.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/values-statement.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/window-function.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/sql/window-function.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/stata/built_ins.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/stata/built_ins.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-errorline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-errorline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-failureline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-failureline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-progressline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-progressline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-skipline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-skipline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-successline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-successline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-tagline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-tagline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-testline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-testline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-timeline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-timeline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-uxsuccessline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-uxsuccessline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-xfailline.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/subunit/subunit-xfailline.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/swift/functions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/swift/functions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/swift/multiline-string.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/swift/multiline-string.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/tap/basic.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/tap/basic.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/tap/without-numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/tap/without-numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/tap/yaml-block.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/tap/yaml-block.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/twig/filter_with_underscore.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/twig/filter_with_underscore.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/twig/template_tags.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/twig/template_tags.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/class.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/class.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/declares.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/declares.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/decorator-factories.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/decorator-factories.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/functions.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/functions.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/inline-languages.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/inline-languages.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/jsx.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/jsx.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/module-id.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/module-id.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/nested-templates.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/typescript/nested-templates.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/verilog/misc.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/verilog/misc.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/verilog/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/verilog/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/vim/strings-comments.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/vim/strings-comments.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/x86asm/labels-directives.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/x86asm/labels-directives.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xml/document-type-variations.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xml/document-type-variations.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xml/space-attributes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xml/space-attributes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xml/unquoted-attributes.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xml/unquoted-attributes.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/computed_inbuilt.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/computed_inbuilt.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/direct_method.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/direct_method.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/function_body.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/function_body.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/prolog_declarations.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/xquery/prolog_declarations.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/block.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/block.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/keys.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/keys.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/numbers.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/numbers.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/string.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/string.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/tag.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/markup/yaml/tag.txt create mode 100644 vendor/scrivo/highlight.php/test/special/languagealias.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/special/languagealias.txt create mode 100644 vendor/scrivo/highlight.php/test/special/line-endings.crlf.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/special/line-endings.crlf.txt create mode 100644 vendor/scrivo/highlight.php/test/special/sublanguages.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/special/sublanguages.txt create mode 100644 vendor/scrivo/highlight.php/test/special/tabreplace.expect.txt create mode 100644 vendor/scrivo/highlight.php/test/special/tabreplace.txt create mode 100644 vendor/scrivo/highlight.php/tools/.htaccess create mode 100644 vendor/scrivo/highlight.php/tools/export.js create mode 100644 vendor/scrivo/highlight.php/tools/get_language_definitions.php create mode 100644 vendor/scrivo/highlight.php/tools/get_styles_colors.php create mode 100644 vendor/scrivo/highlight.php/tools/launcher.js create mode 100644 vendor/scrivo/highlight.php/tools/lodash.cloneDeep.js create mode 100644 vendor/scrivo/highlight.php/tools/process.sh create mode 100644 vendor/sebastian/code-unit-reverse-lookup/.gitignore create mode 100644 vendor/sebastian/code-unit-reverse-lookup/.php_cs create mode 100644 vendor/sebastian/code-unit-reverse-lookup/.travis.yml create mode 100644 vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md create mode 100644 vendor/sebastian/code-unit-reverse-lookup/LICENSE create mode 100644 vendor/sebastian/code-unit-reverse-lookup/README.md create mode 100644 vendor/sebastian/code-unit-reverse-lookup/build.xml create mode 100644 vendor/sebastian/code-unit-reverse-lookup/composer.json create mode 100644 vendor/sebastian/code-unit-reverse-lookup/phpunit.xml create mode 100644 vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php create mode 100644 vendor/sebastian/code-unit-reverse-lookup/tests/WizardTest.php create mode 100644 vendor/sebastian/comparator/.github/stale.yml create mode 100644 vendor/sebastian/comparator/.gitignore create mode 100644 vendor/sebastian/comparator/.php_cs.dist create mode 100644 vendor/sebastian/comparator/.travis.yml create mode 100644 vendor/sebastian/comparator/ChangeLog.md create mode 100644 vendor/sebastian/comparator/LICENSE create mode 100644 vendor/sebastian/comparator/README.md create mode 100644 vendor/sebastian/comparator/build.xml create mode 100644 vendor/sebastian/comparator/composer.json create mode 100644 vendor/sebastian/comparator/phpunit.xml create mode 100644 vendor/sebastian/comparator/src/ArrayComparator.php create mode 100644 vendor/sebastian/comparator/src/Comparator.php create mode 100644 vendor/sebastian/comparator/src/ComparisonFailure.php create mode 100644 vendor/sebastian/comparator/src/DOMNodeComparator.php create mode 100644 vendor/sebastian/comparator/src/DateTimeComparator.php create mode 100644 vendor/sebastian/comparator/src/DoubleComparator.php create mode 100644 vendor/sebastian/comparator/src/ExceptionComparator.php create mode 100644 vendor/sebastian/comparator/src/Factory.php create mode 100644 vendor/sebastian/comparator/src/MockObjectComparator.php create mode 100644 vendor/sebastian/comparator/src/NumericComparator.php create mode 100644 vendor/sebastian/comparator/src/ObjectComparator.php create mode 100644 vendor/sebastian/comparator/src/ResourceComparator.php create mode 100644 vendor/sebastian/comparator/src/ScalarComparator.php create mode 100644 vendor/sebastian/comparator/src/SplObjectStorageComparator.php create mode 100644 vendor/sebastian/comparator/src/TypeComparator.php create mode 100644 vendor/sebastian/comparator/tests/ArrayComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ComparisonFailureTest.php create mode 100644 vendor/sebastian/comparator/tests/DOMNodeComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/DateTimeComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/DoubleComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ExceptionComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/FactoryTest.php create mode 100644 vendor/sebastian/comparator/tests/MockObjectComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/NumericComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ObjectComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ResourceComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ScalarComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/SplObjectStorageComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/TypeComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/Author.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/Book.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/ClassWithToString.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/SampleClass.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/Struct.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/TestClass.php create mode 100644 vendor/sebastian/comparator/tests/_fixture/TestClassComparator.php create mode 100644 vendor/sebastian/diff/.github/stale.yml create mode 100644 vendor/sebastian/diff/.gitignore create mode 100644 vendor/sebastian/diff/.php_cs.dist create mode 100644 vendor/sebastian/diff/.travis.yml create mode 100644 vendor/sebastian/diff/ChangeLog.md create mode 100644 vendor/sebastian/diff/LICENSE create mode 100644 vendor/sebastian/diff/README.md create mode 100644 vendor/sebastian/diff/build.xml create mode 100644 vendor/sebastian/diff/composer.json create mode 100644 vendor/sebastian/diff/phpunit.xml create mode 100644 vendor/sebastian/diff/src/Chunk.php create mode 100644 vendor/sebastian/diff/src/Diff.php create mode 100644 vendor/sebastian/diff/src/Differ.php create mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php create mode 100644 vendor/sebastian/diff/src/Exception/Exception.php create mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php create mode 100644 vendor/sebastian/diff/src/Line.php create mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php create mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Parser.php create mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/tests/ChunkTest.php create mode 100644 vendor/sebastian/diff/tests/DiffTest.php create mode 100644 vendor/sebastian/diff/tests/DifferTest.php create mode 100644 vendor/sebastian/diff/tests/Exception/ConfigurationExceptionTest.php create mode 100644 vendor/sebastian/diff/tests/Exception/InvalidArgumentExceptionTest.php create mode 100644 vendor/sebastian/diff/tests/LineTest.php create mode 100644 vendor/sebastian/diff/tests/LongestCommonSubsequenceTest.php create mode 100644 vendor/sebastian/diff/tests/MemoryEfficientImplementationTest.php create mode 100644 vendor/sebastian/diff/tests/Output/AbstractChunkOutputBuilderTest.php create mode 100644 vendor/sebastian/diff/tests/Output/DiffOnlyOutputBuilderTest.php create mode 100644 vendor/sebastian/diff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php create mode 100644 vendor/sebastian/diff/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php create mode 100644 vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.php create mode 100644 vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.php create mode 100644 vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderDataProvider.php create mode 100644 vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderTest.php create mode 100644 vendor/sebastian/diff/tests/ParserTest.php create mode 100644 vendor/sebastian/diff/tests/TimeEfficientImplementationTest.php create mode 100644 vendor/sebastian/diff/tests/Utils/FileUtils.php create mode 100644 vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTrait.php create mode 100644 vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.php create mode 100644 vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitTest.php create mode 100644 vendor/sebastian/diff/tests/fixtures/.editorconfig create mode 100644 vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/out/.editorconfig create mode 100644 vendor/sebastian/diff/tests/fixtures/out/.gitignore create mode 100644 vendor/sebastian/diff/tests/fixtures/patch.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/patch2.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/serialized_diff.bin create mode 100644 vendor/sebastian/environment/.github/FUNDING.yml create mode 100644 vendor/sebastian/environment/.gitignore create mode 100644 vendor/sebastian/environment/.php_cs.dist create mode 100644 vendor/sebastian/environment/.travis.yml create mode 100644 vendor/sebastian/environment/ChangeLog.md create mode 100644 vendor/sebastian/environment/LICENSE create mode 100644 vendor/sebastian/environment/README.md create mode 100644 vendor/sebastian/environment/build.xml create mode 100644 vendor/sebastian/environment/composer.json create mode 100644 vendor/sebastian/environment/phpunit.xml create mode 100644 vendor/sebastian/environment/src/Console.php create mode 100644 vendor/sebastian/environment/src/OperatingSystem.php create mode 100644 vendor/sebastian/environment/src/Runtime.php create mode 100644 vendor/sebastian/environment/tests/ConsoleTest.php create mode 100644 vendor/sebastian/environment/tests/OperatingSystemTest.php create mode 100644 vendor/sebastian/environment/tests/RuntimeTest.php create mode 100644 vendor/sebastian/exporter/.github/FUNDING.yml create mode 100644 vendor/sebastian/exporter/.gitignore create mode 100644 vendor/sebastian/exporter/.php_cs.dist create mode 100644 vendor/sebastian/exporter/.travis.yml create mode 100644 vendor/sebastian/exporter/ChangeLog.md create mode 100644 vendor/sebastian/exporter/LICENSE create mode 100644 vendor/sebastian/exporter/README.md create mode 100644 vendor/sebastian/exporter/build.xml create mode 100644 vendor/sebastian/exporter/composer.json create mode 100644 vendor/sebastian/exporter/phpunit.xml create mode 100644 vendor/sebastian/exporter/src/Exporter.php create mode 100644 vendor/sebastian/exporter/tests/ExporterTest.php create mode 100644 vendor/sebastian/global-state/.github/stale.yml create mode 100644 vendor/sebastian/global-state/.gitignore create mode 100644 vendor/sebastian/global-state/.php_cs.dist create mode 100644 vendor/sebastian/global-state/.travis.yml create mode 100644 vendor/sebastian/global-state/ChangeLog.md create mode 100644 vendor/sebastian/global-state/LICENSE create mode 100644 vendor/sebastian/global-state/README.md create mode 100644 vendor/sebastian/global-state/build.xml create mode 100644 vendor/sebastian/global-state/composer.json create mode 100644 vendor/sebastian/global-state/phpunit.xml create mode 100644 vendor/sebastian/global-state/src/Blacklist.php create mode 100644 vendor/sebastian/global-state/src/CodeExporter.php create mode 100644 vendor/sebastian/global-state/src/Restorer.php create mode 100644 vendor/sebastian/global-state/src/Snapshot.php create mode 100644 vendor/sebastian/global-state/src/exceptions/Exception.php create mode 100644 vendor/sebastian/global-state/src/exceptions/RuntimeException.php create mode 100644 vendor/sebastian/global-state/tests/BlacklistTest.php create mode 100644 vendor/sebastian/global-state/tests/CodeExporterTest.php create mode 100644 vendor/sebastian/global-state/tests/RestorerTest.php create mode 100644 vendor/sebastian/global-state/tests/SnapshotTest.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php create mode 100644 vendor/sebastian/object-enumerator/.gitignore create mode 100644 vendor/sebastian/object-enumerator/.php_cs create mode 100644 vendor/sebastian/object-enumerator/.travis.yml create mode 100644 vendor/sebastian/object-enumerator/ChangeLog.md create mode 100644 vendor/sebastian/object-enumerator/LICENSE create mode 100644 vendor/sebastian/object-enumerator/README.md create mode 100644 vendor/sebastian/object-enumerator/build.xml create mode 100644 vendor/sebastian/object-enumerator/composer.json create mode 100644 vendor/sebastian/object-enumerator/phpunit.xml create mode 100644 vendor/sebastian/object-enumerator/src/Enumerator.php create mode 100644 vendor/sebastian/object-enumerator/src/Exception.php create mode 100644 vendor/sebastian/object-enumerator/src/InvalidArgumentException.php create mode 100644 vendor/sebastian/object-enumerator/tests/EnumeratorTest.php create mode 100644 vendor/sebastian/object-enumerator/tests/_fixture/ExceptionThrower.php create mode 100644 vendor/sebastian/object-reflector/.gitignore create mode 100644 vendor/sebastian/object-reflector/.php_cs create mode 100644 vendor/sebastian/object-reflector/.travis.yml create mode 100644 vendor/sebastian/object-reflector/ChangeLog.md create mode 100644 vendor/sebastian/object-reflector/LICENSE create mode 100644 vendor/sebastian/object-reflector/README.md create mode 100644 vendor/sebastian/object-reflector/build.xml create mode 100644 vendor/sebastian/object-reflector/composer.json create mode 100644 vendor/sebastian/object-reflector/phpunit.xml create mode 100644 vendor/sebastian/object-reflector/src/Exception.php create mode 100644 vendor/sebastian/object-reflector/src/InvalidArgumentException.php create mode 100644 vendor/sebastian/object-reflector/src/ObjectReflector.php create mode 100644 vendor/sebastian/object-reflector/tests/ObjectReflectorTest.php create mode 100644 vendor/sebastian/object-reflector/tests/_fixture/ChildClass.php create mode 100644 vendor/sebastian/object-reflector/tests/_fixture/ClassWithIntegerAttributeName.php create mode 100644 vendor/sebastian/object-reflector/tests/_fixture/ParentClass.php create mode 100644 vendor/sebastian/recursion-context/.gitignore create mode 100644 vendor/sebastian/recursion-context/.travis.yml create mode 100644 vendor/sebastian/recursion-context/LICENSE create mode 100644 vendor/sebastian/recursion-context/README.md create mode 100644 vendor/sebastian/recursion-context/build.xml create mode 100644 vendor/sebastian/recursion-context/composer.json create mode 100644 vendor/sebastian/recursion-context/phpunit.xml create mode 100644 vendor/sebastian/recursion-context/src/Context.php create mode 100644 vendor/sebastian/recursion-context/src/Exception.php create mode 100644 vendor/sebastian/recursion-context/src/InvalidArgumentException.php create mode 100644 vendor/sebastian/recursion-context/tests/ContextTest.php create mode 100644 vendor/sebastian/resource-operations/.github/stale.yml create mode 100644 vendor/sebastian/resource-operations/.gitignore create mode 100644 vendor/sebastian/resource-operations/.php_cs.dist create mode 100644 vendor/sebastian/resource-operations/ChangeLog.md create mode 100644 vendor/sebastian/resource-operations/LICENSE create mode 100644 vendor/sebastian/resource-operations/README.md create mode 100644 vendor/sebastian/resource-operations/build.xml create mode 100755 vendor/sebastian/resource-operations/build/generate.php create mode 100644 vendor/sebastian/resource-operations/composer.json create mode 100644 vendor/sebastian/resource-operations/src/ResourceOperations.php create mode 100644 vendor/sebastian/resource-operations/tests/ResourceOperationsTest.php create mode 100644 vendor/sebastian/type/.gitattributes create mode 100644 vendor/sebastian/type/.github/FUNDING.yml create mode 100644 vendor/sebastian/type/.gitignore create mode 100644 vendor/sebastian/type/.idea/inspectionProfiles/Project_Default.xml create mode 100644 vendor/sebastian/type/.idea/misc.xml create mode 100644 vendor/sebastian/type/.idea/modules.xml create mode 100644 vendor/sebastian/type/.idea/php-inspections-ea-ultimate.xml create mode 100644 vendor/sebastian/type/.idea/php.xml create mode 100644 vendor/sebastian/type/.idea/type.iml create mode 100644 vendor/sebastian/type/.idea/vcs.xml create mode 100644 vendor/sebastian/type/.php_cs.dist create mode 100644 vendor/sebastian/type/.travis.yml create mode 100644 vendor/sebastian/type/ChangeLog.md create mode 100644 vendor/sebastian/type/LICENSE create mode 100644 vendor/sebastian/type/README.md create mode 100644 vendor/sebastian/type/build.xml create mode 100644 vendor/sebastian/type/composer.json create mode 100644 vendor/sebastian/type/phive.xml create mode 100644 vendor/sebastian/type/phpunit.xml create mode 100644 vendor/sebastian/type/psalm.xml create mode 100644 vendor/sebastian/type/src/CallableType.php create mode 100644 vendor/sebastian/type/src/GenericObjectType.php create mode 100644 vendor/sebastian/type/src/IterableType.php create mode 100644 vendor/sebastian/type/src/NullType.php create mode 100644 vendor/sebastian/type/src/ObjectType.php create mode 100644 vendor/sebastian/type/src/SimpleType.php create mode 100644 vendor/sebastian/type/src/Type.php create mode 100644 vendor/sebastian/type/src/TypeName.php create mode 100644 vendor/sebastian/type/src/UnknownType.php create mode 100644 vendor/sebastian/type/src/VoidType.php create mode 100644 vendor/sebastian/type/src/exception/Exception.php create mode 100644 vendor/sebastian/type/src/exception/RuntimeException.php create mode 100644 vendor/sebastian/type/tests/_fixture/ChildClass.php create mode 100644 vendor/sebastian/type/tests/_fixture/ClassWithCallbackMethods.php create mode 100644 vendor/sebastian/type/tests/_fixture/ClassWithInvokeMethod.php create mode 100644 vendor/sebastian/type/tests/_fixture/Iterator.php create mode 100644 vendor/sebastian/type/tests/_fixture/ParentClass.php create mode 100644 vendor/sebastian/type/tests/_fixture/callback_function.php create mode 100644 vendor/sebastian/type/tests/unit/CallableTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/GenericObjectTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/IterableTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/NullTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/ObjectTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/SimpleTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/TypeNameTest.php create mode 100644 vendor/sebastian/type/tests/unit/TypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/UnknownTypeTest.php create mode 100644 vendor/sebastian/type/tests/unit/VoidTypeTest.php create mode 100644 vendor/sebastian/version/.gitattributes create mode 100644 vendor/sebastian/version/.gitignore create mode 100644 vendor/sebastian/version/.php_cs create mode 100644 vendor/sebastian/version/LICENSE create mode 100644 vendor/sebastian/version/README.md create mode 100644 vendor/sebastian/version/composer.json create mode 100644 vendor/sebastian/version/src/Version.php create mode 100644 vendor/spatie/laravel-permission/.github/FUNDING.yml create mode 100644 vendor/spatie/laravel-permission/.github/workflows/deploy-docs.yml create mode 100644 vendor/spatie/laravel-permission/.github/workflows/run-tests.yml create mode 100644 vendor/spatie/laravel-permission/CHANGELOG.md create mode 100644 vendor/spatie/laravel-permission/CONTRIBUTING.md create mode 100644 vendor/spatie/laravel-permission/LICENSE.md create mode 100644 vendor/spatie/laravel-permission/README.md create mode 100644 vendor/spatie/laravel-permission/composer.json create mode 100644 vendor/spatie/laravel-permission/config/permission.php create mode 100644 vendor/spatie/laravel-permission/database/migrations/create_permission_tables.php.stub create mode 100644 vendor/spatie/laravel-permission/docs/_index.md create mode 100644 vendor/spatie/laravel-permission/docs/about-us.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/_index.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/cache.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/exceptions.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/extending.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/other.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/phpstorm.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/seeding.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/timestamps.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/ui-options.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/unit-testing.md create mode 100644 vendor/spatie/laravel-permission/docs/advanced-usage/uuid.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/_index.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/artisan.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/basic-usage.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/blade-directives.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/direct-permissions.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/middleware.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/multiple-guards.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/new-app.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/role-permissions.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/super-admin.md create mode 100644 vendor/spatie/laravel-permission/docs/basic-usage/wildcard-permissions.md create mode 100644 vendor/spatie/laravel-permission/docs/best-practices/_index.md create mode 100644 vendor/spatie/laravel-permission/docs/best-practices/performance.md create mode 100644 vendor/spatie/laravel-permission/docs/best-practices/roles-vs-permissions.md create mode 100644 vendor/spatie/laravel-permission/docs/best-practices/using-policies.md create mode 100644 vendor/spatie/laravel-permission/docs/changelog.md create mode 100644 vendor/spatie/laravel-permission/docs/images/header.jpg create mode 100644 vendor/spatie/laravel-permission/docs/installation-laravel.md create mode 100644 vendor/spatie/laravel-permission/docs/installation-lumen.md create mode 100644 vendor/spatie/laravel-permission/docs/introduction.md create mode 100644 vendor/spatie/laravel-permission/docs/prerequisites.md create mode 100644 vendor/spatie/laravel-permission/docs/questions-issues.md create mode 100644 vendor/spatie/laravel-permission/docs/sponsor-logo.png create mode 100644 vendor/spatie/laravel-permission/docs/support-us.md create mode 100644 vendor/spatie/laravel-permission/docs/upgrading.md create mode 100644 vendor/spatie/laravel-permission/src/Commands/CacheReset.php create mode 100644 vendor/spatie/laravel-permission/src/Commands/CreatePermission.php create mode 100644 vendor/spatie/laravel-permission/src/Commands/CreateRole.php create mode 100644 vendor/spatie/laravel-permission/src/Commands/Show.php create mode 100644 vendor/spatie/laravel-permission/src/Contracts/Permission.php create mode 100644 vendor/spatie/laravel-permission/src/Contracts/Role.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/GuardDoesNotMatch.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/PermissionAlreadyExists.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/PermissionDoesNotExist.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/RoleAlreadyExists.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/RoleDoesNotExist.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/UnauthorizedException.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/WildcardPermissionInvalidArgument.php create mode 100644 vendor/spatie/laravel-permission/src/Exceptions/WildcardPermissionNotProperlyFormatted.php create mode 100644 vendor/spatie/laravel-permission/src/Guard.php create mode 100644 vendor/spatie/laravel-permission/src/Middlewares/PermissionMiddleware.php create mode 100644 vendor/spatie/laravel-permission/src/Middlewares/RoleMiddleware.php create mode 100644 vendor/spatie/laravel-permission/src/Middlewares/RoleOrPermissionMiddleware.php create mode 100644 vendor/spatie/laravel-permission/src/Models/Permission.php create mode 100644 vendor/spatie/laravel-permission/src/Models/Role.php create mode 100644 vendor/spatie/laravel-permission/src/PermissionRegistrar.php create mode 100644 vendor/spatie/laravel-permission/src/PermissionServiceProvider.php create mode 100644 vendor/spatie/laravel-permission/src/Traits/HasPermissions.php create mode 100644 vendor/spatie/laravel-permission/src/Traits/HasRoles.php create mode 100644 vendor/spatie/laravel-permission/src/Traits/RefreshesPermissionCache.php create mode 100644 vendor/spatie/laravel-permission/src/WildcardPermission.php create mode 100644 vendor/spatie/laravel-permission/src/helpers.php create mode 100644 vendor/swiftmailer/swiftmailer/.gitattributes create mode 100644 vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/swiftmailer/swiftmailer/.gitignore create mode 100644 vendor/swiftmailer/swiftmailer/.php_cs.dist create mode 100644 vendor/swiftmailer/swiftmailer/.travis.yml create mode 100644 vendor/swiftmailer/swiftmailer/CHANGES create mode 100644 vendor/swiftmailer/swiftmailer/LICENSE create mode 100644 vendor/swiftmailer/swiftmailer/README.md create mode 100644 vendor/swiftmailer/swiftmailer/composer.json create mode 100644 vendor/swiftmailer/swiftmailer/doc/headers.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/index.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/introduction.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/japanese.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/messages.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/plugins.rst create mode 100644 vendor/swiftmailer/swiftmailer/doc/sending.rst create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoder/IdnAddressEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoder/Utf8AddressEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoderException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Attachment.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/AbstractFilterableInputStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/ArrayByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/FileByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/TemporaryFileByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/GenericFixedWidthReader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/UsAsciiReader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/Utf8Reader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReaderFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReaderFactory/SimpleCharacterReaderFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream/ArrayCharacterStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream/NgCharacterStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ConfigurableSpool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/DependencyContainer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/DependencyException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/EmbeddedFile.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/Base64Encoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/QpEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/Rfc2231Encoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/CommandEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/CommandListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/Event.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventDispatcher.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventObject.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/ResponseEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/ResponseListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SendEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SendListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SimpleEventDispatcher.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportChangeEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportChangeListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportExceptionEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportExceptionListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/FailoverTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/FileSpool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/FileStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Filterable.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/IdGenerator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Image.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/InputByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/IoException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/ArrayKeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/DiskKeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/KeyCacheInputStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/NullKeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/SimpleKeyCacheInputStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/LoadBalancedTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer/ArrayRecipientIterator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer/RecipientIterator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/MemorySpool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Message.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Attachment.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/CharsetObserver.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/Base64ContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/NullContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/PlainContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/EmbeddedFile.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/EncodingObserver.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Header.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder/Base64HeaderEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/AbstractHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/DateHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/IdentificationHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/OpenDKIMHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/ParameterizedHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/PathHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/UnstructuredHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/IdGenerator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/MimePart.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleHeaderFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleHeaderSet.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMessage.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMimeEntity.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/MimePart.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/NullTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/OutputByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ImpersonatePlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Logger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/MessageLogger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/RedirectingPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Timer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Preferences.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ReplacementFilterFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/RfcComplianceException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SendmailTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/BodySigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Spool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SpoolTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/ByteArrayReplacementFilter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilterFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SwiftException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/AuthHandler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Authenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/EightBitMimeHandler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/SmtpUtf8Handler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpHandler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/FailoverTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/IoBuffer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/LoadBalancedTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/NullTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SmtpAgent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SpoolTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/cache_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/mime_types.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/preferences.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/swift_required.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/swiftmailer_generate_mimes_config.php create mode 100644 vendor/swiftmailer/swiftmailer/phpunit.xml.dist create mode 100644 vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/StreamCollector.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-2022-jp/one.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-8859-1/one.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/one.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/three.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/two.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.priv create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.pub create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/files/data.txt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/CA.srl create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/create-cert.sh create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.crt create mode 100644 vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.key create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/AttachmentAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/ByteStream/FileByteStreamAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Base64EncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bootstrap.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/AttachmentSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/IdGeneratorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/AntiFloodPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php create mode 100644 vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php create mode 100644 vendor/symfony/console/Application.php create mode 100644 vendor/symfony/console/CHANGELOG.md create mode 100644 vendor/symfony/console/Command/Command.php create mode 100644 vendor/symfony/console/Command/HelpCommand.php create mode 100644 vendor/symfony/console/Command/ListCommand.php create mode 100644 vendor/symfony/console/Command/LockableTrait.php create mode 100644 vendor/symfony/console/CommandLoader/CommandLoaderInterface.php create mode 100644 vendor/symfony/console/CommandLoader/ContainerCommandLoader.php create mode 100644 vendor/symfony/console/CommandLoader/FactoryCommandLoader.php create mode 100644 vendor/symfony/console/ConsoleEvents.php create mode 100644 vendor/symfony/console/Cursor.php create mode 100644 vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php create mode 100644 vendor/symfony/console/Descriptor/ApplicationDescription.php create mode 100644 vendor/symfony/console/Descriptor/Descriptor.php create mode 100644 vendor/symfony/console/Descriptor/DescriptorInterface.php create mode 100644 vendor/symfony/console/Descriptor/JsonDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/MarkdownDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/TextDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/XmlDescriptor.php create mode 100644 vendor/symfony/console/Event/ConsoleCommandEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleErrorEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleTerminateEvent.php create mode 100644 vendor/symfony/console/EventListener/ErrorListener.php create mode 100644 vendor/symfony/console/Exception/CommandNotFoundException.php create mode 100644 vendor/symfony/console/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/console/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/console/Exception/InvalidOptionException.php create mode 100644 vendor/symfony/console/Exception/LogicException.php create mode 100644 vendor/symfony/console/Exception/MissingInputException.php create mode 100644 vendor/symfony/console/Exception/NamespaceNotFoundException.php create mode 100644 vendor/symfony/console/Exception/RuntimeException.php create mode 100644 vendor/symfony/console/Formatter/NullOutputFormatter.php create mode 100644 vendor/symfony/console/Formatter/NullOutputFormatterStyle.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatter.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyle.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleStack.php create mode 100644 vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php create mode 100644 vendor/symfony/console/Helper/DebugFormatterHelper.php create mode 100644 vendor/symfony/console/Helper/DescriptorHelper.php create mode 100644 vendor/symfony/console/Helper/Dumper.php create mode 100644 vendor/symfony/console/Helper/FormatterHelper.php create mode 100644 vendor/symfony/console/Helper/Helper.php create mode 100644 vendor/symfony/console/Helper/HelperInterface.php create mode 100644 vendor/symfony/console/Helper/HelperSet.php create mode 100644 vendor/symfony/console/Helper/InputAwareHelper.php create mode 100644 vendor/symfony/console/Helper/ProcessHelper.php create mode 100644 vendor/symfony/console/Helper/ProgressBar.php create mode 100644 vendor/symfony/console/Helper/ProgressIndicator.php create mode 100644 vendor/symfony/console/Helper/QuestionHelper.php create mode 100644 vendor/symfony/console/Helper/SymfonyQuestionHelper.php create mode 100644 vendor/symfony/console/Helper/Table.php create mode 100644 vendor/symfony/console/Helper/TableCell.php create mode 100644 vendor/symfony/console/Helper/TableRows.php create mode 100644 vendor/symfony/console/Helper/TableSeparator.php create mode 100644 vendor/symfony/console/Helper/TableStyle.php create mode 100644 vendor/symfony/console/Input/ArgvInput.php create mode 100644 vendor/symfony/console/Input/ArrayInput.php create mode 100644 vendor/symfony/console/Input/Input.php create mode 100644 vendor/symfony/console/Input/InputArgument.php create mode 100644 vendor/symfony/console/Input/InputAwareInterface.php create mode 100644 vendor/symfony/console/Input/InputDefinition.php create mode 100644 vendor/symfony/console/Input/InputInterface.php create mode 100644 vendor/symfony/console/Input/InputOption.php create mode 100644 vendor/symfony/console/Input/StreamableInputInterface.php create mode 100644 vendor/symfony/console/Input/StringInput.php create mode 100644 vendor/symfony/console/LICENSE create mode 100644 vendor/symfony/console/Logger/ConsoleLogger.php create mode 100644 vendor/symfony/console/Output/BufferedOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutputInterface.php create mode 100644 vendor/symfony/console/Output/ConsoleSectionOutput.php create mode 100644 vendor/symfony/console/Output/NullOutput.php create mode 100644 vendor/symfony/console/Output/Output.php create mode 100644 vendor/symfony/console/Output/OutputInterface.php create mode 100644 vendor/symfony/console/Output/StreamOutput.php create mode 100644 vendor/symfony/console/Question/ChoiceQuestion.php create mode 100644 vendor/symfony/console/Question/ConfirmationQuestion.php create mode 100644 vendor/symfony/console/Question/Question.php create mode 100644 vendor/symfony/console/README.md create mode 100644 vendor/symfony/console/Resources/bin/hiddeninput.exe create mode 100644 vendor/symfony/console/SingleCommandApplication.php create mode 100644 vendor/symfony/console/Style/OutputStyle.php create mode 100644 vendor/symfony/console/Style/StyleInterface.php create mode 100644 vendor/symfony/console/Style/SymfonyStyle.php create mode 100644 vendor/symfony/console/Terminal.php create mode 100644 vendor/symfony/console/Tester/ApplicationTester.php create mode 100644 vendor/symfony/console/Tester/CommandTester.php create mode 100644 vendor/symfony/console/Tester/TesterTrait.php create mode 100644 vendor/symfony/console/composer.json create mode 100644 vendor/symfony/css-selector/CHANGELOG.md create mode 100644 vendor/symfony/css-selector/CssSelectorConverter.php create mode 100644 vendor/symfony/css-selector/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/css-selector/Exception/ExpressionErrorException.php create mode 100644 vendor/symfony/css-selector/Exception/InternalErrorException.php create mode 100644 vendor/symfony/css-selector/Exception/ParseException.php create mode 100644 vendor/symfony/css-selector/Exception/SyntaxErrorException.php create mode 100644 vendor/symfony/css-selector/LICENSE create mode 100644 vendor/symfony/css-selector/Node/AbstractNode.php create mode 100644 vendor/symfony/css-selector/Node/AttributeNode.php create mode 100644 vendor/symfony/css-selector/Node/ClassNode.php create mode 100644 vendor/symfony/css-selector/Node/CombinedSelectorNode.php create mode 100644 vendor/symfony/css-selector/Node/ElementNode.php create mode 100644 vendor/symfony/css-selector/Node/FunctionNode.php create mode 100644 vendor/symfony/css-selector/Node/HashNode.php create mode 100644 vendor/symfony/css-selector/Node/NegationNode.php create mode 100644 vendor/symfony/css-selector/Node/NodeInterface.php create mode 100644 vendor/symfony/css-selector/Node/PseudoNode.php create mode 100644 vendor/symfony/css-selector/Node/SelectorNode.php create mode 100644 vendor/symfony/css-selector/Node/Specificity.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/CommentHandler.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/HashHandler.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/NumberHandler.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/StringHandler.php create mode 100644 vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php create mode 100644 vendor/symfony/css-selector/Parser/Parser.php create mode 100644 vendor/symfony/css-selector/Parser/ParserInterface.php create mode 100644 vendor/symfony/css-selector/Parser/Reader.php create mode 100644 vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php create mode 100644 vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php create mode 100644 vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php create mode 100644 vendor/symfony/css-selector/Parser/Shortcut/HashParser.php create mode 100644 vendor/symfony/css-selector/Parser/Token.php create mode 100644 vendor/symfony/css-selector/Parser/TokenStream.php create mode 100644 vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php create mode 100644 vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php create mode 100644 vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php create mode 100644 vendor/symfony/css-selector/README.md create mode 100644 vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/NodeExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php create mode 100644 vendor/symfony/css-selector/XPath/Translator.php create mode 100644 vendor/symfony/css-selector/XPath/TranslatorInterface.php create mode 100644 vendor/symfony/css-selector/XPath/XPathExpr.php create mode 100644 vendor/symfony/css-selector/composer.json create mode 100644 vendor/symfony/deprecation-contracts/.gitignore create mode 100644 vendor/symfony/deprecation-contracts/CHANGELOG.md create mode 100644 vendor/symfony/deprecation-contracts/LICENSE create mode 100644 vendor/symfony/deprecation-contracts/README.md create mode 100644 vendor/symfony/deprecation-contracts/composer.json create mode 100644 vendor/symfony/deprecation-contracts/function.php create mode 100644 vendor/symfony/error-handler/BufferingLogger.php create mode 100644 vendor/symfony/error-handler/CHANGELOG.md create mode 100644 vendor/symfony/error-handler/Debug.php create mode 100644 vendor/symfony/error-handler/DebugClassLoader.php create mode 100644 vendor/symfony/error-handler/Error/ClassNotFoundError.php create mode 100644 vendor/symfony/error-handler/Error/FatalError.php create mode 100644 vendor/symfony/error-handler/Error/OutOfMemoryError.php create mode 100644 vendor/symfony/error-handler/Error/UndefinedFunctionError.php create mode 100644 vendor/symfony/error-handler/Error/UndefinedMethodError.php create mode 100644 vendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php create mode 100644 vendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php create mode 100644 vendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php create mode 100644 vendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php create mode 100644 vendor/symfony/error-handler/ErrorHandler.php create mode 100644 vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php create mode 100644 vendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php create mode 100644 vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php create mode 100644 vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php create mode 100644 vendor/symfony/error-handler/Exception/FlattenException.php create mode 100644 vendor/symfony/error-handler/Exception/SilencedErrorContext.php create mode 100644 vendor/symfony/error-handler/LICENSE create mode 100644 vendor/symfony/error-handler/README.md create mode 100644 vendor/symfony/error-handler/Resources/assets/css/error.css create mode 100644 vendor/symfony/error-handler/Resources/assets/css/exception.css create mode 100644 vendor/symfony/error-handler/Resources/assets/css/exception_full.css create mode 100644 vendor/symfony/error-handler/Resources/assets/images/chevron-right.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/favicon.png.base64 create mode 100644 vendor/symfony/error-handler/Resources/assets/images/icon-book.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/icon-support.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php create mode 100644 vendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg create mode 100644 vendor/symfony/error-handler/Resources/assets/js/exception.js create mode 100644 vendor/symfony/error-handler/Resources/views/error.html.php create mode 100644 vendor/symfony/error-handler/Resources/views/exception.html.php create mode 100644 vendor/symfony/error-handler/Resources/views/exception_full.html.php create mode 100644 vendor/symfony/error-handler/Resources/views/logs.html.php create mode 100644 vendor/symfony/error-handler/Resources/views/trace.html.php create mode 100644 vendor/symfony/error-handler/Resources/views/traces.html.php create mode 100644 vendor/symfony/error-handler/Resources/views/traces_text.html.php create mode 100644 vendor/symfony/error-handler/ThrowableUtils.php create mode 100644 vendor/symfony/error-handler/composer.json create mode 100644 vendor/symfony/event-dispatcher-contracts/.gitignore create mode 100644 vendor/symfony/event-dispatcher-contracts/CHANGELOG.md create mode 100644 vendor/symfony/event-dispatcher-contracts/Event.php create mode 100644 vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php create mode 100644 vendor/symfony/event-dispatcher-contracts/LICENSE create mode 100644 vendor/symfony/event-dispatcher-contracts/README.md create mode 100644 vendor/symfony/event-dispatcher-contracts/composer.json create mode 100644 vendor/symfony/event-dispatcher/CHANGELOG.md create mode 100644 vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Debug/WrappedListener.php create mode 100644 vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php create mode 100644 vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php create mode 100644 vendor/symfony/event-dispatcher/EventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/EventDispatcherInterface.php create mode 100644 vendor/symfony/event-dispatcher/EventSubscriberInterface.php create mode 100644 vendor/symfony/event-dispatcher/GenericEvent.php create mode 100644 vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/LICENSE create mode 100644 vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php create mode 100644 vendor/symfony/event-dispatcher/README.md create mode 100644 vendor/symfony/event-dispatcher/composer.json create mode 100644 vendor/symfony/finder/CHANGELOG.md create mode 100644 vendor/symfony/finder/Comparator/Comparator.php create mode 100644 vendor/symfony/finder/Comparator/DateComparator.php create mode 100644 vendor/symfony/finder/Comparator/NumberComparator.php create mode 100644 vendor/symfony/finder/Exception/AccessDeniedException.php create mode 100644 vendor/symfony/finder/Exception/DirectoryNotFoundException.php create mode 100644 vendor/symfony/finder/Finder.php create mode 100644 vendor/symfony/finder/Gitignore.php create mode 100644 vendor/symfony/finder/Glob.php create mode 100644 vendor/symfony/finder/Iterator/CustomFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/DateRangeFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/FileTypeFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/FilecontentFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/FilenameFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/PathFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php create mode 100644 vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php create mode 100644 vendor/symfony/finder/Iterator/SortableIterator.php create mode 100644 vendor/symfony/finder/LICENSE create mode 100644 vendor/symfony/finder/README.md create mode 100644 vendor/symfony/finder/SplFileInfo.php create mode 100644 vendor/symfony/finder/composer.json create mode 100644 vendor/symfony/http-foundation/AcceptHeader.php create mode 100644 vendor/symfony/http-foundation/AcceptHeaderItem.php create mode 100644 vendor/symfony/http-foundation/BinaryFileResponse.php create mode 100644 vendor/symfony/http-foundation/CHANGELOG.md create mode 100644 vendor/symfony/http-foundation/Cookie.php create mode 100644 vendor/symfony/http-foundation/Exception/BadRequestException.php create mode 100644 vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php create mode 100644 vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php create mode 100644 vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php create mode 100644 vendor/symfony/http-foundation/ExpressionRequestMatcher.php create mode 100644 vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/FileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/NoFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/PartialFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/UploadException.php create mode 100644 vendor/symfony/http-foundation/File/File.php create mode 100644 vendor/symfony/http-foundation/File/Stream.php create mode 100644 vendor/symfony/http-foundation/File/UploadedFile.php create mode 100644 vendor/symfony/http-foundation/FileBag.php create mode 100644 vendor/symfony/http-foundation/HeaderBag.php create mode 100644 vendor/symfony/http-foundation/HeaderUtils.php create mode 100644 vendor/symfony/http-foundation/InputBag.php create mode 100644 vendor/symfony/http-foundation/IpUtils.php create mode 100644 vendor/symfony/http-foundation/JsonResponse.php create mode 100644 vendor/symfony/http-foundation/LICENSE create mode 100644 vendor/symfony/http-foundation/ParameterBag.php create mode 100644 vendor/symfony/http-foundation/README.md create mode 100644 vendor/symfony/http-foundation/RedirectResponse.php create mode 100644 vendor/symfony/http-foundation/Request.php create mode 100644 vendor/symfony/http-foundation/RequestMatcher.php create mode 100644 vendor/symfony/http-foundation/RequestMatcherInterface.php create mode 100644 vendor/symfony/http-foundation/RequestStack.php create mode 100644 vendor/symfony/http-foundation/Response.php create mode 100644 vendor/symfony/http-foundation/ResponseHeaderBag.php create mode 100644 vendor/symfony/http-foundation/ServerBag.php create mode 100644 vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php create mode 100644 vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php create mode 100644 vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php create mode 100644 vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php create mode 100644 vendor/symfony/http-foundation/Session/Flash/FlashBag.php create mode 100644 vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php create mode 100644 vendor/symfony/http-foundation/Session/Session.php create mode 100644 vendor/symfony/http-foundation/Session/SessionBagInterface.php create mode 100644 vendor/symfony/http-foundation/Session/SessionBagProxy.php create mode 100644 vendor/symfony/http-foundation/Session/SessionInterface.php create mode 100644 vendor/symfony/http-foundation/Session/SessionUtils.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MetadataBag.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php create mode 100644 vendor/symfony/http-foundation/StreamedResponse.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php create mode 100644 vendor/symfony/http-foundation/UrlHelper.php create mode 100644 vendor/symfony/http-foundation/composer.json create mode 100644 vendor/symfony/http-kernel/Bundle/Bundle.php create mode 100644 vendor/symfony/http-kernel/Bundle/BundleInterface.php create mode 100644 vendor/symfony/http-kernel/CHANGELOG.md create mode 100644 vendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php create mode 100644 vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.php create mode 100644 vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php create mode 100644 vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php create mode 100644 vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php create mode 100644 vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php create mode 100644 vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php create mode 100644 vendor/symfony/http-kernel/Config/FileLocator.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentResolverInterface.php create mode 100644 vendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php create mode 100644 vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ControllerReference.php create mode 100644 vendor/symfony/http-kernel/Controller/ControllerResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/ControllerResolverInterface.php create mode 100644 vendor/symfony/http-kernel/Controller/ErrorController.php create mode 100644 vendor/symfony/http-kernel/Controller/TraceableArgumentResolver.php create mode 100644 vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php create mode 100644 vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php create mode 100644 vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php create mode 100644 vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php create mode 100644 vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/DataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php create mode 100644 vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/EventDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php create mode 100644 vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php create mode 100644 vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php create mode 100644 vendor/symfony/http-kernel/Debug/FileLinkFormatter.php create mode 100644 vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/Extension.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php create mode 100644 vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php create mode 100644 vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.php create mode 100644 vendor/symfony/http-kernel/Event/ControllerEvent.php create mode 100644 vendor/symfony/http-kernel/Event/ExceptionEvent.php create mode 100644 vendor/symfony/http-kernel/Event/FinishRequestEvent.php create mode 100644 vendor/symfony/http-kernel/Event/KernelEvent.php create mode 100644 vendor/symfony/http-kernel/Event/RequestEvent.php create mode 100644 vendor/symfony/http-kernel/Event/ResponseEvent.php create mode 100644 vendor/symfony/http-kernel/Event/TerminateEvent.php create mode 100644 vendor/symfony/http-kernel/Event/ViewEvent.php create mode 100644 vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/DumpListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/ErrorListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/FragmentListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/LocaleAwareListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/LocaleListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/ProfilerListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/ResponseListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/RouterListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/SessionListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/StreamedResponseListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/SurrogateListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/TestSessionListener.php create mode 100644 vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php create mode 100644 vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/BadRequestHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/ConflictHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php create mode 100644 vendor/symfony/http-kernel/Exception/GoneHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/HttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php create mode 100644 vendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/NotFoundHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/UnauthorizedHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php create mode 100644 vendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php create mode 100644 vendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php create mode 100644 vendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php create mode 100644 vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php create mode 100644 vendor/symfony/http-kernel/Fragment/FragmentHandler.php create mode 100644 vendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php create mode 100644 vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php create mode 100644 vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php create mode 100644 vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php create mode 100644 vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php create mode 100644 vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php create mode 100644 vendor/symfony/http-kernel/HttpCache/Esi.php create mode 100644 vendor/symfony/http-kernel/HttpCache/HttpCache.php create mode 100644 vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php create mode 100644 vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php create mode 100644 vendor/symfony/http-kernel/HttpCache/Ssi.php create mode 100644 vendor/symfony/http-kernel/HttpCache/Store.php create mode 100644 vendor/symfony/http-kernel/HttpCache/StoreInterface.php create mode 100644 vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php create mode 100644 vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php create mode 100644 vendor/symfony/http-kernel/HttpClientKernel.php create mode 100644 vendor/symfony/http-kernel/HttpKernel.php create mode 100644 vendor/symfony/http-kernel/HttpKernelBrowser.php create mode 100644 vendor/symfony/http-kernel/HttpKernelInterface.php create mode 100644 vendor/symfony/http-kernel/Kernel.php create mode 100644 vendor/symfony/http-kernel/KernelEvents.php create mode 100644 vendor/symfony/http-kernel/KernelInterface.php create mode 100644 vendor/symfony/http-kernel/LICENSE create mode 100644 vendor/symfony/http-kernel/Log/DebugLoggerInterface.php create mode 100644 vendor/symfony/http-kernel/Log/Logger.php create mode 100644 vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php create mode 100644 vendor/symfony/http-kernel/Profiler/Profile.php create mode 100644 vendor/symfony/http-kernel/Profiler/Profiler.php create mode 100644 vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php create mode 100644 vendor/symfony/http-kernel/README.md create mode 100644 vendor/symfony/http-kernel/RebootableInterface.php create mode 100644 vendor/symfony/http-kernel/Resources/welcome.html.php create mode 100644 vendor/symfony/http-kernel/TerminableInterface.php create mode 100644 vendor/symfony/http-kernel/UriSigner.php create mode 100644 vendor/symfony/http-kernel/composer.json create mode 100644 vendor/symfony/mime/Address.php create mode 100644 vendor/symfony/mime/BodyRendererInterface.php create mode 100644 vendor/symfony/mime/CHANGELOG.md create mode 100644 vendor/symfony/mime/CharacterStream.php create mode 100644 vendor/symfony/mime/Crypto/SMime.php create mode 100644 vendor/symfony/mime/Crypto/SMimeEncrypter.php create mode 100644 vendor/symfony/mime/Crypto/SMimeSigner.php create mode 100644 vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php create mode 100644 vendor/symfony/mime/Email.php create mode 100644 vendor/symfony/mime/Encoder/AddressEncoderInterface.php create mode 100644 vendor/symfony/mime/Encoder/Base64ContentEncoder.php create mode 100644 vendor/symfony/mime/Encoder/Base64Encoder.php create mode 100644 vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php create mode 100644 vendor/symfony/mime/Encoder/ContentEncoderInterface.php create mode 100644 vendor/symfony/mime/Encoder/EightBitContentEncoder.php create mode 100644 vendor/symfony/mime/Encoder/EncoderInterface.php create mode 100644 vendor/symfony/mime/Encoder/IdnAddressEncoder.php create mode 100644 vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php create mode 100644 vendor/symfony/mime/Encoder/QpContentEncoder.php create mode 100644 vendor/symfony/mime/Encoder/QpEncoder.php create mode 100644 vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php create mode 100644 vendor/symfony/mime/Encoder/Rfc2231Encoder.php create mode 100644 vendor/symfony/mime/Exception/AddressEncoderException.php create mode 100644 vendor/symfony/mime/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/mime/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/mime/Exception/LogicException.php create mode 100644 vendor/symfony/mime/Exception/RfcComplianceException.php create mode 100644 vendor/symfony/mime/Exception/RuntimeException.php create mode 100644 vendor/symfony/mime/FileBinaryMimeTypeGuesser.php create mode 100644 vendor/symfony/mime/FileinfoMimeTypeGuesser.php create mode 100644 vendor/symfony/mime/Header/AbstractHeader.php create mode 100644 vendor/symfony/mime/Header/DateHeader.php create mode 100644 vendor/symfony/mime/Header/HeaderInterface.php create mode 100644 vendor/symfony/mime/Header/Headers.php create mode 100644 vendor/symfony/mime/Header/IdentificationHeader.php create mode 100644 vendor/symfony/mime/Header/MailboxHeader.php create mode 100644 vendor/symfony/mime/Header/MailboxListHeader.php create mode 100644 vendor/symfony/mime/Header/ParameterizedHeader.php create mode 100644 vendor/symfony/mime/Header/PathHeader.php create mode 100644 vendor/symfony/mime/Header/UnstructuredHeader.php create mode 100644 vendor/symfony/mime/LICENSE create mode 100644 vendor/symfony/mime/Message.php create mode 100644 vendor/symfony/mime/MessageConverter.php create mode 100644 vendor/symfony/mime/MimeTypeGuesserInterface.php create mode 100644 vendor/symfony/mime/MimeTypes.php create mode 100644 vendor/symfony/mime/MimeTypesInterface.php create mode 100644 vendor/symfony/mime/Part/AbstractMultipartPart.php create mode 100644 vendor/symfony/mime/Part/AbstractPart.php create mode 100644 vendor/symfony/mime/Part/DataPart.php create mode 100644 vendor/symfony/mime/Part/MessagePart.php create mode 100644 vendor/symfony/mime/Part/Multipart/AlternativePart.php create mode 100644 vendor/symfony/mime/Part/Multipart/DigestPart.php create mode 100644 vendor/symfony/mime/Part/Multipart/FormDataPart.php create mode 100644 vendor/symfony/mime/Part/Multipart/MixedPart.php create mode 100644 vendor/symfony/mime/Part/Multipart/RelatedPart.php create mode 100644 vendor/symfony/mime/Part/SMimePart.php create mode 100644 vendor/symfony/mime/Part/TextPart.php create mode 100644 vendor/symfony/mime/README.md create mode 100644 vendor/symfony/mime/RawMessage.php create mode 100644 vendor/symfony/mime/Resources/bin/update_mime_types.php create mode 100644 vendor/symfony/mime/Test/Constraint/EmailAddressContains.php create mode 100644 vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php create mode 100644 vendor/symfony/mime/Test/Constraint/EmailHasHeader.php create mode 100644 vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php create mode 100644 vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php create mode 100644 vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php create mode 100644 vendor/symfony/mime/composer.json create mode 100644 vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 vendor/symfony/polyfill-ctype/LICENSE create mode 100644 vendor/symfony/polyfill-ctype/README.md create mode 100644 vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 vendor/symfony/polyfill-ctype/composer.json create mode 100644 vendor/symfony/polyfill-iconv/Iconv.php create mode 100644 vendor/symfony/polyfill-iconv/LICENSE create mode 100644 vendor/symfony/polyfill-iconv/README.md create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/translit.php create mode 100644 vendor/symfony/polyfill-iconv/bootstrap.php create mode 100644 vendor/symfony/polyfill-iconv/composer.json create mode 100644 vendor/symfony/polyfill-intl-grapheme/Grapheme.php create mode 100644 vendor/symfony/polyfill-intl-grapheme/LICENSE create mode 100644 vendor/symfony/polyfill-intl-grapheme/README.md create mode 100644 vendor/symfony/polyfill-intl-grapheme/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-grapheme/composer.json create mode 100644 vendor/symfony/polyfill-intl-idn/Idn.php create mode 100644 vendor/symfony/polyfill-intl-idn/LICENSE create mode 100644 vendor/symfony/polyfill-intl-idn/README.md create mode 100644 vendor/symfony/polyfill-intl-idn/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-idn/composer.json create mode 100644 vendor/symfony/polyfill-intl-normalizer/LICENSE create mode 100644 vendor/symfony/polyfill-intl-normalizer/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/README.md create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/composer.json create mode 100644 vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 vendor/symfony/polyfill-mbstring/README.md create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 vendor/symfony/polyfill-mbstring/composer.json create mode 100644 vendor/symfony/polyfill-php72/LICENSE create mode 100644 vendor/symfony/polyfill-php72/Php72.php create mode 100644 vendor/symfony/polyfill-php72/README.md create mode 100644 vendor/symfony/polyfill-php72/bootstrap.php create mode 100644 vendor/symfony/polyfill-php72/composer.json create mode 100644 vendor/symfony/polyfill-php73/LICENSE create mode 100644 vendor/symfony/polyfill-php73/Php73.php create mode 100644 vendor/symfony/polyfill-php73/README.md create mode 100644 vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php create mode 100644 vendor/symfony/polyfill-php73/bootstrap.php create mode 100644 vendor/symfony/polyfill-php73/composer.json create mode 100644 vendor/symfony/polyfill-php80/LICENSE create mode 100644 vendor/symfony/polyfill-php80/Php80.php create mode 100644 vendor/symfony/polyfill-php80/README.md create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php create mode 100644 vendor/symfony/polyfill-php80/bootstrap.php create mode 100644 vendor/symfony/polyfill-php80/composer.json create mode 100644 vendor/symfony/process/CHANGELOG.md create mode 100644 vendor/symfony/process/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/process/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/process/Exception/LogicException.php create mode 100644 vendor/symfony/process/Exception/ProcessFailedException.php create mode 100644 vendor/symfony/process/Exception/ProcessSignaledException.php create mode 100644 vendor/symfony/process/Exception/ProcessTimedOutException.php create mode 100644 vendor/symfony/process/Exception/RuntimeException.php create mode 100644 vendor/symfony/process/ExecutableFinder.php create mode 100644 vendor/symfony/process/InputStream.php create mode 100644 vendor/symfony/process/LICENSE create mode 100644 vendor/symfony/process/PhpExecutableFinder.php create mode 100644 vendor/symfony/process/PhpProcess.php create mode 100644 vendor/symfony/process/Pipes/AbstractPipes.php create mode 100644 vendor/symfony/process/Pipes/PipesInterface.php create mode 100644 vendor/symfony/process/Pipes/UnixPipes.php create mode 100644 vendor/symfony/process/Pipes/WindowsPipes.php create mode 100644 vendor/symfony/process/Process.php create mode 100644 vendor/symfony/process/ProcessUtils.php create mode 100644 vendor/symfony/process/README.md create mode 100644 vendor/symfony/process/composer.json create mode 100644 vendor/symfony/routing/Annotation/Route.php create mode 100644 vendor/symfony/routing/CHANGELOG.md create mode 100644 vendor/symfony/routing/CompiledRoute.php create mode 100644 vendor/symfony/routing/DependencyInjection/RoutingResolverPass.php create mode 100644 vendor/symfony/routing/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/routing/Exception/InvalidParameterException.php create mode 100644 vendor/symfony/routing/Exception/MethodNotAllowedException.php create mode 100644 vendor/symfony/routing/Exception/MissingMandatoryParametersException.php create mode 100644 vendor/symfony/routing/Exception/NoConfigurationException.php create mode 100644 vendor/symfony/routing/Exception/ResourceNotFoundException.php create mode 100644 vendor/symfony/routing/Exception/RouteNotFoundException.php create mode 100644 vendor/symfony/routing/Generator/CompiledUrlGenerator.php create mode 100644 vendor/symfony/routing/Generator/ConfigurableRequirementsInterface.php create mode 100644 vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php create mode 100644 vendor/symfony/routing/Generator/Dumper/GeneratorDumper.php create mode 100644 vendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php create mode 100644 vendor/symfony/routing/Generator/UrlGenerator.php create mode 100644 vendor/symfony/routing/Generator/UrlGeneratorInterface.php create mode 100644 vendor/symfony/routing/LICENSE create mode 100644 vendor/symfony/routing/Loader/AnnotationClassLoader.php create mode 100644 vendor/symfony/routing/Loader/AnnotationDirectoryLoader.php create mode 100644 vendor/symfony/routing/Loader/AnnotationFileLoader.php create mode 100644 vendor/symfony/routing/Loader/ClosureLoader.php create mode 100644 vendor/symfony/routing/Loader/Configurator/CollectionConfigurator.php create mode 100644 vendor/symfony/routing/Loader/Configurator/ImportConfigurator.php create mode 100644 vendor/symfony/routing/Loader/Configurator/RouteConfigurator.php create mode 100644 vendor/symfony/routing/Loader/Configurator/RoutingConfigurator.php create mode 100644 vendor/symfony/routing/Loader/Configurator/Traits/AddTrait.php create mode 100644 vendor/symfony/routing/Loader/Configurator/Traits/HostTrait.php create mode 100644 vendor/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php create mode 100644 vendor/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php create mode 100644 vendor/symfony/routing/Loader/Configurator/Traits/RouteTrait.php create mode 100644 vendor/symfony/routing/Loader/ContainerLoader.php create mode 100644 vendor/symfony/routing/Loader/DirectoryLoader.php create mode 100644 vendor/symfony/routing/Loader/GlobFileLoader.php create mode 100644 vendor/symfony/routing/Loader/ObjectLoader.php create mode 100644 vendor/symfony/routing/Loader/PhpFileLoader.php create mode 100644 vendor/symfony/routing/Loader/XmlFileLoader.php create mode 100644 vendor/symfony/routing/Loader/YamlFileLoader.php create mode 100644 vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd create mode 100644 vendor/symfony/routing/Matcher/CompiledUrlMatcher.php create mode 100644 vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php create mode 100644 vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php create mode 100644 vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php create mode 100644 vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php create mode 100644 vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php create mode 100644 vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php create mode 100644 vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php create mode 100644 vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php create mode 100644 vendor/symfony/routing/Matcher/RequestMatcherInterface.php create mode 100644 vendor/symfony/routing/Matcher/TraceableUrlMatcher.php create mode 100644 vendor/symfony/routing/Matcher/UrlMatcher.php create mode 100644 vendor/symfony/routing/Matcher/UrlMatcherInterface.php create mode 100644 vendor/symfony/routing/README.md create mode 100644 vendor/symfony/routing/RequestContext.php create mode 100644 vendor/symfony/routing/RequestContextAwareInterface.php create mode 100644 vendor/symfony/routing/Route.php create mode 100644 vendor/symfony/routing/RouteCollection.php create mode 100644 vendor/symfony/routing/RouteCollectionBuilder.php create mode 100644 vendor/symfony/routing/RouteCompiler.php create mode 100644 vendor/symfony/routing/RouteCompilerInterface.php create mode 100644 vendor/symfony/routing/Router.php create mode 100644 vendor/symfony/routing/RouterInterface.php create mode 100644 vendor/symfony/routing/composer.json create mode 100644 vendor/symfony/service-contracts/.gitignore create mode 100644 vendor/symfony/service-contracts/CHANGELOG.md create mode 100644 vendor/symfony/service-contracts/LICENSE create mode 100644 vendor/symfony/service-contracts/README.md create mode 100644 vendor/symfony/service-contracts/ResetInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceLocatorTrait.php create mode 100644 vendor/symfony/service-contracts/ServiceProviderInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceSubscriberInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceSubscriberTrait.php create mode 100644 vendor/symfony/service-contracts/Test/ServiceLocatorTest.php create mode 100644 vendor/symfony/service-contracts/composer.json create mode 100644 vendor/symfony/string/.gitattributes create mode 100644 vendor/symfony/string/AbstractString.php create mode 100644 vendor/symfony/string/AbstractUnicodeString.php create mode 100644 vendor/symfony/string/ByteString.php create mode 100644 vendor/symfony/string/CHANGELOG.md create mode 100644 vendor/symfony/string/CodePointString.php create mode 100644 vendor/symfony/string/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/string/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/string/Exception/RuntimeException.php create mode 100644 vendor/symfony/string/Inflector/EnglishInflector.php create mode 100644 vendor/symfony/string/Inflector/InflectorInterface.php create mode 100644 vendor/symfony/string/LICENSE create mode 100644 vendor/symfony/string/LazyString.php create mode 100644 vendor/symfony/string/README.md create mode 100644 vendor/symfony/string/Resources/data/wcswidth_table_wide.php create mode 100644 vendor/symfony/string/Resources/data/wcswidth_table_zero.php create mode 100644 vendor/symfony/string/Resources/functions.php create mode 100644 vendor/symfony/string/Slugger/AsciiSlugger.php create mode 100644 vendor/symfony/string/Slugger/SluggerInterface.php create mode 100644 vendor/symfony/string/UnicodeString.php create mode 100644 vendor/symfony/string/composer.json create mode 100644 vendor/symfony/translation-contracts/.gitignore create mode 100644 vendor/symfony/translation-contracts/CHANGELOG.md create mode 100644 vendor/symfony/translation-contracts/LICENSE create mode 100644 vendor/symfony/translation-contracts/LocaleAwareInterface.php create mode 100644 vendor/symfony/translation-contracts/README.md create mode 100644 vendor/symfony/translation-contracts/Test/TranslatorTest.php create mode 100644 vendor/symfony/translation-contracts/TranslatorInterface.php create mode 100644 vendor/symfony/translation-contracts/TranslatorTrait.php create mode 100644 vendor/symfony/translation-contracts/composer.json create mode 100644 vendor/symfony/translation/CHANGELOG.md create mode 100644 vendor/symfony/translation/Catalogue/AbstractOperation.php create mode 100644 vendor/symfony/translation/Catalogue/MergeOperation.php create mode 100644 vendor/symfony/translation/Catalogue/OperationInterface.php create mode 100644 vendor/symfony/translation/Catalogue/TargetOperation.php create mode 100644 vendor/symfony/translation/Command/XliffLintCommand.php create mode 100644 vendor/symfony/translation/DataCollector/TranslationDataCollector.php create mode 100644 vendor/symfony/translation/DataCollectorTranslator.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php create mode 100644 vendor/symfony/translation/Dumper/CsvFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/DumperInterface.php create mode 100644 vendor/symfony/translation/Dumper/FileDumper.php create mode 100644 vendor/symfony/translation/Dumper/IcuResFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/IniFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/JsonFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/MoFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/PhpFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/PoFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/QtFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/XliffFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/YamlFileDumper.php create mode 100644 vendor/symfony/translation/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/translation/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/translation/Exception/InvalidResourceException.php create mode 100644 vendor/symfony/translation/Exception/LogicException.php create mode 100644 vendor/symfony/translation/Exception/NotFoundResourceException.php create mode 100644 vendor/symfony/translation/Exception/RuntimeException.php create mode 100644 vendor/symfony/translation/Extractor/AbstractFileExtractor.php create mode 100644 vendor/symfony/translation/Extractor/ChainExtractor.php create mode 100644 vendor/symfony/translation/Extractor/ExtractorInterface.php create mode 100644 vendor/symfony/translation/Extractor/PhpExtractor.php create mode 100644 vendor/symfony/translation/Extractor/PhpStringTokenParser.php create mode 100644 vendor/symfony/translation/Formatter/IntlFormatter.php create mode 100644 vendor/symfony/translation/Formatter/IntlFormatterInterface.php create mode 100644 vendor/symfony/translation/Formatter/MessageFormatter.php create mode 100644 vendor/symfony/translation/Formatter/MessageFormatterInterface.php create mode 100644 vendor/symfony/translation/IdentityTranslator.php create mode 100644 vendor/symfony/translation/LICENSE create mode 100644 vendor/symfony/translation/Loader/ArrayLoader.php create mode 100644 vendor/symfony/translation/Loader/CsvFileLoader.php create mode 100644 vendor/symfony/translation/Loader/FileLoader.php create mode 100644 vendor/symfony/translation/Loader/IcuDatFileLoader.php create mode 100644 vendor/symfony/translation/Loader/IcuResFileLoader.php create mode 100644 vendor/symfony/translation/Loader/IniFileLoader.php create mode 100644 vendor/symfony/translation/Loader/JsonFileLoader.php create mode 100644 vendor/symfony/translation/Loader/LoaderInterface.php create mode 100644 vendor/symfony/translation/Loader/MoFileLoader.php create mode 100644 vendor/symfony/translation/Loader/PhpFileLoader.php create mode 100644 vendor/symfony/translation/Loader/PoFileLoader.php create mode 100644 vendor/symfony/translation/Loader/QtFileLoader.php create mode 100644 vendor/symfony/translation/Loader/XliffFileLoader.php create mode 100644 vendor/symfony/translation/Loader/YamlFileLoader.php create mode 100644 vendor/symfony/translation/LoggingTranslator.php create mode 100644 vendor/symfony/translation/MessageCatalogue.php create mode 100644 vendor/symfony/translation/MessageCatalogueInterface.php create mode 100644 vendor/symfony/translation/MetadataAwareInterface.php create mode 100644 vendor/symfony/translation/README.md create mode 100644 vendor/symfony/translation/Reader/TranslationReader.php create mode 100644 vendor/symfony/translation/Reader/TranslationReaderInterface.php create mode 100644 vendor/symfony/translation/Resources/bin/translation-status.php create mode 100644 vendor/symfony/translation/Resources/data/parents.json create mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd create mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd create mode 100644 vendor/symfony/translation/Resources/schemas/xml.xsd create mode 100644 vendor/symfony/translation/Translator.php create mode 100644 vendor/symfony/translation/TranslatorBagInterface.php create mode 100644 vendor/symfony/translation/Util/ArrayConverter.php create mode 100644 vendor/symfony/translation/Util/XliffUtils.php create mode 100644 vendor/symfony/translation/Writer/TranslationWriter.php create mode 100644 vendor/symfony/translation/Writer/TranslationWriterInterface.php create mode 100644 vendor/symfony/translation/composer.json create mode 100644 vendor/symfony/var-dumper/CHANGELOG.md create mode 100644 vendor/symfony/var-dumper/Caster/AmqpCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ArgsStub.php create mode 100644 vendor/symfony/var-dumper/Caster/Caster.php create mode 100644 vendor/symfony/var-dumper/Caster/ClassStub.php create mode 100644 vendor/symfony/var-dumper/Caster/ConstStub.php create mode 100644 vendor/symfony/var-dumper/Caster/CutArrayStub.php create mode 100644 vendor/symfony/var-dumper/Caster/CutStub.php create mode 100644 vendor/symfony/var-dumper/Caster/DOMCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DateCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DoctrineCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DsCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DsPairStub.php create mode 100644 vendor/symfony/var-dumper/Caster/EnumStub.php create mode 100644 vendor/symfony/var-dumper/Caster/ExceptionCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/FrameStub.php create mode 100644 vendor/symfony/var-dumper/Caster/GmpCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ImagineCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ImgStub.php create mode 100644 vendor/symfony/var-dumper/Caster/IntlCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/LinkStub.php create mode 100644 vendor/symfony/var-dumper/Caster/MemcachedCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/PdoCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/PgSqlCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/RdKafkaCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/RedisCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ReflectionCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ResourceCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/SplCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/StubCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/SymfonyCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/TraceStub.php create mode 100644 vendor/symfony/var-dumper/Caster/UuidCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/XmlReaderCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/XmlResourceCaster.php create mode 100644 vendor/symfony/var-dumper/Cloner/AbstractCloner.php create mode 100644 vendor/symfony/var-dumper/Cloner/ClonerInterface.php create mode 100644 vendor/symfony/var-dumper/Cloner/Cursor.php create mode 100644 vendor/symfony/var-dumper/Cloner/Data.php create mode 100644 vendor/symfony/var-dumper/Cloner/DumperInterface.php create mode 100644 vendor/symfony/var-dumper/Cloner/Stub.php create mode 100644 vendor/symfony/var-dumper/Cloner/VarCloner.php create mode 100644 vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php create mode 100644 vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php create mode 100644 vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php create mode 100644 vendor/symfony/var-dumper/Command/ServerDumpCommand.php create mode 100644 vendor/symfony/var-dumper/Dumper/AbstractDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/CliDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/DataDumperInterface.php create mode 100644 vendor/symfony/var-dumper/Dumper/HtmlDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/ServerDumper.php create mode 100644 vendor/symfony/var-dumper/Exception/ThrowingCasterException.php create mode 100644 vendor/symfony/var-dumper/LICENSE create mode 100644 vendor/symfony/var-dumper/README.md create mode 100755 vendor/symfony/var-dumper/Resources/bin/var-dump-server create mode 100644 vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css create mode 100644 vendor/symfony/var-dumper/Resources/functions/dump.php create mode 100644 vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js create mode 100644 vendor/symfony/var-dumper/Server/Connection.php create mode 100644 vendor/symfony/var-dumper/Server/DumpServer.php create mode 100644 vendor/symfony/var-dumper/Test/VarDumperTestTrait.php create mode 100644 vendor/symfony/var-dumper/VarDumper.php create mode 100644 vendor/symfony/var-dumper/composer.json create mode 100644 vendor/theseer/tokenizer/.gitignore create mode 100644 vendor/theseer/tokenizer/.php_cs create mode 100644 vendor/theseer/tokenizer/.travis.yml create mode 100644 vendor/theseer/tokenizer/CHANGELOG.md create mode 100644 vendor/theseer/tokenizer/LICENSE create mode 100644 vendor/theseer/tokenizer/README.md create mode 100644 vendor/theseer/tokenizer/build.xml create mode 100644 vendor/theseer/tokenizer/composer.json create mode 100644 vendor/theseer/tokenizer/phive.xml create mode 100644 vendor/theseer/tokenizer/phpunit.xml create mode 100644 vendor/theseer/tokenizer/src/Exception.php create mode 100644 vendor/theseer/tokenizer/src/NamespaceUri.php create mode 100644 vendor/theseer/tokenizer/src/NamespaceUriException.php create mode 100644 vendor/theseer/tokenizer/src/Token.php create mode 100644 vendor/theseer/tokenizer/src/TokenCollection.php create mode 100644 vendor/theseer/tokenizer/src/TokenCollectionException.php create mode 100644 vendor/theseer/tokenizer/src/Tokenizer.php create mode 100644 vendor/theseer/tokenizer/src/XMLSerializer.php create mode 100644 vendor/theseer/tokenizer/tests/NamespaceUriTest.php create mode 100644 vendor/theseer/tokenizer/tests/TokenCollectionTest.php create mode 100644 vendor/theseer/tokenizer/tests/TokenTest.php create mode 100644 vendor/theseer/tokenizer/tests/TokenizerTest.php create mode 100644 vendor/theseer/tokenizer/tests/XMLSerializerTest.php create mode 100644 vendor/theseer/tokenizer/tests/_files/customns.xml create mode 100644 vendor/theseer/tokenizer/tests/_files/empty.xml create mode 100644 vendor/theseer/tokenizer/tests/_files/test.php create mode 100644 vendor/theseer/tokenizer/tests/_files/test.php.tokens create mode 100644 vendor/theseer/tokenizer/tests/_files/test.php.xml create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/LICENSE.md create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/composer.json create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php create mode 100644 vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php create mode 100644 vendor/vlucas/phpdotenv/LICENSE create mode 100644 vendor/vlucas/phpdotenv/composer.json create mode 100644 vendor/vlucas/phpdotenv/phpstan.src.neon.dist create mode 100644 vendor/vlucas/phpdotenv/src/Dotenv.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/ValidationException.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/Lines.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/Loader.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/Parser.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/Value.php create mode 100644 vendor/vlucas/phpdotenv/src/Regex/Regex.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/AbstractRepository.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/AvailabilityInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Result/Error.php create mode 100644 vendor/vlucas/phpdotenv/src/Result/Result.php create mode 100644 vendor/vlucas/phpdotenv/src/Result/Success.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/File/Paths.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/File/Reader.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/FileStore.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/StoreInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Validator.php create mode 100644 vendor/voku/portable-ascii/CHANGELOG.md create mode 100644 vendor/voku/portable-ascii/LICENSE.txt create mode 100644 vendor/voku/portable-ascii/README.md create mode 100644 vendor/voku/portable-ascii/build/composer.json create mode 100644 vendor/voku/portable-ascii/build/docs/base.md create mode 100644 vendor/voku/portable-ascii/build/generate_docs.php create mode 100644 vendor/voku/portable-ascii/build/gernerate_max_key_length.php create mode 100644 vendor/voku/portable-ascii/composer.json create mode 100644 vendor/voku/portable-ascii/src/voku/helper/ASCII.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x000.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x001.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x002.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x003.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x004.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x005.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x006.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x007.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x009.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x010.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x011.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x012.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x013.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x014.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x015.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x016.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x017.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x018.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x020.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x021.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x022.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x023.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x024.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x025.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x026.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x027.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x028.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x029.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x030.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x031.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x032.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x033.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x050.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x051.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x052.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x053.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x054.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x055.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x056.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x057.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x058.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x059.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x060.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x061.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x062.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x063.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x064.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x065.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x066.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x067.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x068.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x069.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x070.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x071.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x072.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x073.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x074.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x075.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x076.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x077.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x078.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x079.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x080.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x081.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x082.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x083.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x084.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x085.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x086.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x087.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x088.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x089.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x090.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x091.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x092.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x093.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x094.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x095.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x096.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x097.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x098.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x099.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0af.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0be.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php create mode 100644 vendor/webmozart/assert/.editorconfig create mode 100644 vendor/webmozart/assert/CHANGELOG.md create mode 100644 vendor/webmozart/assert/LICENSE create mode 100644 vendor/webmozart/assert/README.md create mode 100644 vendor/webmozart/assert/composer.json create mode 100644 vendor/webmozart/assert/psalm.xml create mode 100644 vendor/webmozart/assert/src/Assert.php create mode 100644 vendor/webmozart/assert/src/Mixin.php diff --git a/.env b/.env new file mode 100644 index 0000000..153c83b --- /dev/null +++ b/.env @@ -0,0 +1,46 @@ +APP_NAME=VB&DH +APP_ENV=local +APP_KEY=base64:xTuBtcPwDbu6ddAonF67xeq0aCMdh5W0/IhbFsWzAvg= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack + +DB_CONNECTION=mysql +DB_HOST=mysql +DB_PORT=3306 +DB_DATABASE=qlvbdh +DB_USERNAME=default +DB_PASSWORD=secret + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=database +SESSION_DRIVER=cookie +SESSION_LIFETIME=120 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_DRIVER=smtp +MAIL_HOST=in-v3.mailjet.com +MAIL_PORT=587 +MAIL_USERNAME=2e99b04784720bfd52cacc0dde78e468 +MAIL_PASSWORD=24cc9628b13ab2040c7d2f1873973db7 +MAIL_ENCRYPTION=tls +MAIL_FROM_ADDRESS=pantakson@gmail.com +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..36ba510 --- /dev/null +++ b/.env.example @@ -0,0 +1,46 @@ +APP_NAME=VB&DH +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack + +DB_CONNECTION=mysql +DB_HOST=mysql +DB_PORT=3306 +DB_DATABASE=qlvbdh +DB_USERNAME=default +DB_PASSWORD=secret + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=database +SESSION_DRIVER=cookie +SESSION_LIFETIME=120 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_DRIVER=smtp +MAIL_HOST=in-v3.mailjet.com +MAIL_PORT=587 +MAIL_USERNAME=2e99b04784720bfd52cacc0dde78e468 +MAIL_PASSWORD=24cc9628b13ab2040c7d2f1873973db7 +MAIL_ENCRYPTION=tls +MAIL_FROM_ADDRESS=pantakson@gmail.com +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/database/seeds/BookSeeder.php b/database/seeds/BookSeeder.php index 7f40608..263f903 100644 --- a/database/seeds/BookSeeder.php +++ b/database/seeds/BookSeeder.php @@ -12,7 +12,7 @@ class BookSeeder extends Seeder public function run() { DB::table('books')->insert([ - ['name' => 'Văn bản đến'], + ['name' => 'Inbox'], ['name' => 'Văn bản đi'], ['name' => 'Văn bản nội bộ'], ]); diff --git a/public/8.js b/public/8.js index fa4c974..3c98a9c 100644 --- a/public/8.js +++ b/public/8.js @@ -1176,7 +1176,7 @@ var render = function() { "CCol", { attrs: { sm: "12" } }, [ - _c("label", [_vm._v("Văn bản đến")]), + _c("label", [_vm._v("Inbox")]), _vm._v(" "), _c("treeselect", { attrs: { multiple: false, options: _vm.documents }, diff --git a/resources/js/src/components/document/CLinkDocument.vue b/resources/js/src/components/document/CLinkDocument.vue index 392ad46..919cded 100644 --- a/resources/js/src/components/document/CLinkDocument.vue +++ b/resources/js/src/components/document/CLinkDocument.vue @@ -6,7 +6,7 @@ - + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/asm89/stack-cors/README.md b/vendor/asm89/stack-cors/README.md new file mode 100644 index 0000000..40b60e5 --- /dev/null +++ b/vendor/asm89/stack-cors/README.md @@ -0,0 +1,83 @@ +# Stack/Cors + +Library and middleware enabling cross-origin resource sharing for your +http-{foundation,kernel} using application. It attempts to implement the +[W3C Recommendation] for cross-origin resource sharing. + +[W3C Recommendation]: http://www.w3.org/TR/cors/ + +Master [![Build Status](https://secure.travis-ci.org/asm89/stack-cors.png?branch=master)](http://travis-ci.org/asm89/stack-cors) + +## Installation + +Require `asm89/stack-cors` using composer. + +## Usage + +This package can be used as a library or as [stack middleware]. + +[stack middleware]: http://stackphp.com/ + +### Options + +| Option | Description | Default value | +|------------------------|------------------------------------------------------------|---------------| +| allowedMethods | Matches the request method. | `array()` | +| allowedOrigins | Matches the request origin. | `array()` | +| allowedOriginsPatterns | Matches the request origin with `preg_match`. | `array()` | +| allowedHeaders | Sets the Access-Control-Allow-Headers response header. | `array()` | +| exposedHeaders | Sets the Access-Control-Expose-Headers response header. | `false` | +| maxAge | Sets the Access-Control-Max-Age response header. | `false` | +| supportsCredentials | Sets the Access-Control-Allow-Credentials header. | `false` | + +The _allowedMethods_ and _allowedHeaders_ options are case-insensitive. + +You don't need to provide both _allowedOrigins_ and _allowedOriginsPatterns_. If one of the strings passed matches, it is considered a valid origin. + +If `array('*')` is provided to _allowedMethods_, _allowedOrigins_ or _allowedHeaders_ all methods / origins / headers are allowed. + +### Example: using the library + +```php + array('x-allowed-header', 'x-other-allowed-header'), + 'allowedMethods' => array('DELETE', 'GET', 'POST', 'PUT'), + 'allowedOrigins' => array('localhost'), + 'allowedOriginsPatterns' => array('/localhost:\d/'), + 'exposedHeaders' => false, + 'maxAge' => false, + 'supportsCredentials' => false, +)); + +$cors->addActualRequestHeaders(Response $response, $origin); +$cors->handlePreflightRequest(Request $request); +$cors->isActualRequestAllowed(Request $request); +$cors->isCorsRequest(Request $request); +$cors->isPreflightRequest(Request $request); +``` + +## Example: using the stack middleware + +```php + array('x-allowed-header', 'x-other-allowed-header'), + // you can use array('*') to allow any methods + 'allowedMethods' => array('DELETE', 'GET', 'POST', 'PUT'), + // you can use array('*') to allow requests from any origin + 'allowedOrigins' => array('localhost'), + // you can enter regexes that are matched to the origin request header + 'allowedOriginsPatterns' => array('/localhost:\d/'), + 'exposedHeaders' => false, + 'maxAge' => false, + 'supportsCredentials' => false, +)); +``` diff --git a/vendor/asm89/stack-cors/composer.json b/vendor/asm89/stack-cors/composer.json new file mode 100644 index 0000000..b629bf1 --- /dev/null +++ b/vendor/asm89/stack-cors/composer.json @@ -0,0 +1,43 @@ +{ + "name": "asm89/stack-cors", + "description": "Cross-origin resource sharing library and stack middleware", + "keywords": ["stack", "cors"], + "homepage": "https://github.com/asm89/stack-cors", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Alexander", + "email": "iam.asm89@gmail.com" + } + ], + "require": { + "php": ">=5.5.9", + "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0", + "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8.10", + "squizlabs/php_codesniffer": "^2.3" + }, + "autoload": { + "psr-4": { + "Asm89\\Stack\\": "src/Asm89/Stack/" + } + }, + "autoload-dev": { + "psr-4": { + "Asm89\\Stack\\": "test/Asm89/Stack/" + } + }, + "scripts": { + "test": "phpunit", + "check-style": "phpcs -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src", + "fix-style": "phpcbf -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src" + }, + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + } +} diff --git a/vendor/asm89/stack-cors/src/Asm89/Stack/Cors.php b/vendor/asm89/stack-cors/src/Asm89/Stack/Cors.php new file mode 100644 index 0000000..e5735f9 --- /dev/null +++ b/vendor/asm89/stack-cors/src/Asm89/Stack/Cors.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Asm89\Stack; + +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +class Cors implements HttpKernelInterface +{ + /** + * @var \Symfony\Component\HttpKernel\HttpKernelInterface + */ + private $app; + + /** + * @var \Asm89\Stack\CorsService + */ + private $cors; + + private $defaultOptions = array( + 'allowedHeaders' => array(), + 'allowedMethods' => array(), + 'allowedOrigins' => array(), + 'allowedOriginsPatterns' => array(), + 'exposedHeaders' => false, + 'maxAge' => false, + 'supportsCredentials' => false, + ); + + public function __construct(HttpKernelInterface $app, array $options = array()) + { + $this->app = $app; + $this->cors = new CorsService(array_merge($this->defaultOptions, $options)); + } + + public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) + { + if (!$this->cors->isCorsRequest($request)) { + return $this->app->handle($request, $type, $catch); + } + + if ($this->cors->isPreflightRequest($request)) { + return $this->cors->handlePreflightRequest($request); + } + + if (!$this->cors->isActualRequestAllowed($request)) { + return new Response('Not allowed.', 403); + } + + $response = $this->app->handle($request, $type, $catch); + + return $this->cors->addActualRequestHeaders($response, $request); + } +} diff --git a/vendor/asm89/stack-cors/src/Asm89/Stack/CorsService.php b/vendor/asm89/stack-cors/src/Asm89/Stack/CorsService.php new file mode 100644 index 0000000..3ce324a --- /dev/null +++ b/vendor/asm89/stack-cors/src/Asm89/Stack/CorsService.php @@ -0,0 +1,205 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Asm89\Stack; + +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +class CorsService +{ + private $options; + + public function __construct(array $options = array()) + { + $this->options = $this->normalizeOptions($options); + } + + private function normalizeOptions(array $options = array()) + { + $options += array( + 'allowedOrigins' => array(), + 'allowedOriginsPatterns' => array(), + 'supportsCredentials' => false, + 'allowedHeaders' => array(), + 'exposedHeaders' => array(), + 'allowedMethods' => array(), + 'maxAge' => 0, + ); + + // normalize array('*') to true + if (in_array('*', $options['allowedOrigins'])) { + $options['allowedOrigins'] = true; + } + if (in_array('*', $options['allowedHeaders'])) { + $options['allowedHeaders'] = true; + } else { + $options['allowedHeaders'] = array_map('strtolower', $options['allowedHeaders']); + } + + if (in_array('*', $options['allowedMethods'])) { + $options['allowedMethods'] = true; + } else { + $options['allowedMethods'] = array_map('strtoupper', $options['allowedMethods']); + } + + return $options; + } + + public function isActualRequestAllowed(Request $request) + { + return $this->checkOrigin($request); + } + + public function isCorsRequest(Request $request) + { + return $request->headers->has('Origin') && !$this->isSameHost($request); + } + + public function isPreflightRequest(Request $request) + { + return $this->isCorsRequest($request) + && $request->getMethod() === 'OPTIONS' + && $request->headers->has('Access-Control-Request-Method'); + } + + public function addActualRequestHeaders(Response $response, Request $request) + { + if (!$this->checkOrigin($request)) { + return $response; + } + + $response->headers->set('Access-Control-Allow-Origin', $request->headers->get('Origin')); + + if (!$response->headers->has('Vary')) { + $response->headers->set('Vary', 'Origin'); + } else { + $response->headers->set('Vary', $response->headers->get('Vary') . ', Origin'); + } + + if ($this->options['supportsCredentials']) { + $response->headers->set('Access-Control-Allow-Credentials', 'true'); + } + + if ($this->options['exposedHeaders']) { + $response->headers->set('Access-Control-Expose-Headers', implode(', ', $this->options['exposedHeaders'])); + } + + return $response; + } + + public function handlePreflightRequest(Request $request) + { + if (true !== $check = $this->checkPreflightRequestConditions($request)) { + return $check; + } + + return $this->buildPreflightCheckResponse($request); + } + + private function buildPreflightCheckResponse(Request $request) + { + $response = new Response(); + + if ($this->options['supportsCredentials']) { + $response->headers->set('Access-Control-Allow-Credentials', 'true'); + } + + $response->headers->set('Access-Control-Allow-Origin', $request->headers->get('Origin')); + + if ($this->options['maxAge']) { + $response->headers->set('Access-Control-Max-Age', $this->options['maxAge']); + } + + $allowMethods = $this->options['allowedMethods'] === true + ? strtoupper($request->headers->get('Access-Control-Request-Method')) + : implode(', ', $this->options['allowedMethods']); + $response->headers->set('Access-Control-Allow-Methods', $allowMethods); + + $allowHeaders = $this->options['allowedHeaders'] === true + ? strtoupper($request->headers->get('Access-Control-Request-Headers')) + : implode(', ', $this->options['allowedHeaders']); + $response->headers->set('Access-Control-Allow-Headers', $allowHeaders); + + $response->setStatusCode(204); + + return $response; + } + + private function checkPreflightRequestConditions(Request $request) + { + if (!$this->checkOrigin($request)) { + return $this->createBadRequestResponse(403, 'Origin not allowed'); + } + + if (!$this->checkMethod($request)) { + return $this->createBadRequestResponse(405, 'Method not allowed'); + } + + $requestHeaders = array(); + // if allowedHeaders has been set to true ('*' allow all flag) just skip this check + if ($this->options['allowedHeaders'] !== true && $request->headers->has('Access-Control-Request-Headers')) { + $headers = strtolower($request->headers->get('Access-Control-Request-Headers')); + $requestHeaders = array_filter(explode(',', $headers)); + + foreach ($requestHeaders as $header) { + if (!in_array(trim($header), $this->options['allowedHeaders'])) { + return $this->createBadRequestResponse(403, 'Header not allowed'); + } + } + } + + return true; + } + + private function createBadRequestResponse($code, $reason = '') + { + return new Response($reason, $code); + } + + private function isSameHost(Request $request) + { + return $request->headers->get('Origin') === $request->getSchemeAndHttpHost(); + } + + private function checkOrigin(Request $request) + { + if ($this->options['allowedOrigins'] === true) { + // allow all '*' flag + return true; + } + $origin = $request->headers->get('Origin'); + + if (in_array($origin, $this->options['allowedOrigins'])) { + return true; + } + + foreach ($this->options['allowedOriginsPatterns'] as $pattern) { + if (preg_match($pattern, $origin)) { + return true; + } + } + + return false; + } + + private function checkMethod(Request $request) + { + if ($this->options['allowedMethods'] === true) { + // allow all '*' flag + return true; + } + + $requestMethod = strtoupper($request->headers->get('Access-Control-Request-Method')); + return in_array($requestMethod, $this->options['allowedMethods']); + } +} diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..06c14e5 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,7 @@ + + + + + string + string + string + + + [$q, $r] + + + array + + + \bcdiv($a, $b, 0) + \bcmod($a, $b) + \bcpowmod($base, $exp, $mod, 0) + + + + + $a + $a + $a + $b + $blockA + $blockA + + + $i + $i + $i + $j + + + $e / 2 + + + diff --git a/vendor/brick/math/psalm.xml b/vendor/brick/math/psalm.xml new file mode 100644 index 0000000..123263e --- /dev/null +++ b/vendor/brick/math/psalm.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/brick/math/src/BigDecimal.php b/vendor/brick/math/src/BigDecimal.php new file mode 100644 index 0000000..29bdd32 --- /dev/null +++ b/vendor/brick/math/src/BigDecimal.php @@ -0,0 +1,855 @@ +value = $value; + $this->scale = $scale; + } + + /** + * Creates a BigDecimal of the given value. + * + * @param BigNumber|int|float|string $value + * + * @return BigDecimal + * + * @throws MathException If the value cannot be converted to a BigDecimal. + * + * @psalm-pure + */ + public static function of($value) : BigNumber + { + return parent::of($value)->toBigDecimal(); + } + + /** + * Creates a BigDecimal from an unscaled value and a scale. + * + * Example: `(12345, 3)` will result in the BigDecimal `12.345`. + * + * @param BigNumber|int|float|string $value The unscaled value. Must be convertible to a BigInteger. + * @param int $scale The scale of the number, positive or zero. + * + * @return BigDecimal + * + * @throws \InvalidArgumentException If the scale is negative. + * + * @psalm-pure + */ + public static function ofUnscaledValue($value, int $scale = 0) : BigDecimal + { + if ($scale < 0) { + throw new \InvalidArgumentException('The scale cannot be negative.'); + } + + return new BigDecimal((string) BigInteger::of($value), $scale); + } + + /** + * Returns a BigDecimal representing zero, with a scale of zero. + * + * @return BigDecimal + * + * @psalm-pure + */ + public static function zero() : BigDecimal + { + /** @psalm-suppress ImpureStaticVariable */ + static $zero; + + if ($zero === null) { + $zero = new BigDecimal('0'); + } + + return $zero; + } + + /** + * Returns a BigDecimal representing one, with a scale of zero. + * + * @return BigDecimal + * + * @psalm-pure + */ + public static function one() : BigDecimal + { + /** @psalm-suppress ImpureStaticVariable */ + static $one; + + if ($one === null) { + $one = new BigDecimal('1'); + } + + return $one; + } + + /** + * Returns a BigDecimal representing ten, with a scale of zero. + * + * @return BigDecimal + * + * @psalm-pure + */ + public static function ten() : BigDecimal + { + /** @psalm-suppress ImpureStaticVariable */ + static $ten; + + if ($ten === null) { + $ten = new BigDecimal('10'); + } + + return $ten; + } + + /** + * Returns the sum of this number and the given one. + * + * The result has a scale of `max($this->scale, $that->scale)`. + * + * @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigDecimal. + * + * @return BigDecimal The result. + * + * @throws MathException If the number is not valid, or is not convertible to a BigDecimal. + */ + public function plus($that) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->value === '0' && $that->scale <= $this->scale) { + return $this; + } + + if ($this->value === '0' && $this->scale <= $that->scale) { + return $that; + } + + [$a, $b] = $this->scaleValues($this, $that); + + $value = Calculator::get()->add($a, $b); + $scale = $this->scale > $that->scale ? $this->scale : $that->scale; + + return new BigDecimal($value, $scale); + } + + /** + * Returns the difference of this number and the given one. + * + * The result has a scale of `max($this->scale, $that->scale)`. + * + * @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigDecimal. + * + * @return BigDecimal The result. + * + * @throws MathException If the number is not valid, or is not convertible to a BigDecimal. + */ + public function minus($that) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->value === '0' && $that->scale <= $this->scale) { + return $this; + } + + [$a, $b] = $this->scaleValues($this, $that); + + $value = Calculator::get()->sub($a, $b); + $scale = $this->scale > $that->scale ? $this->scale : $that->scale; + + return new BigDecimal($value, $scale); + } + + /** + * Returns the product of this number and the given one. + * + * The result has a scale of `$this->scale + $that->scale`. + * + * @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigDecimal. + * + * @return BigDecimal The result. + * + * @throws MathException If the multiplier is not a valid number, or is not convertible to a BigDecimal. + */ + public function multipliedBy($that) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->value === '1' && $that->scale === 0) { + return $this; + } + + if ($this->value === '1' && $this->scale === 0) { + return $that; + } + + $value = Calculator::get()->mul($this->value, $that->value); + $scale = $this->scale + $that->scale; + + return new BigDecimal($value, $scale); + } + + /** + * Returns the result of the division of this number by the given one, at the given scale. + * + * @param BigNumber|int|float|string $that The divisor. + * @param int|null $scale The desired scale, or null to use the scale of this number. + * @param int $roundingMode An optional rounding mode. + * + * @return BigDecimal + * + * @throws \InvalidArgumentException If the scale or rounding mode is invalid. + * @throws MathException If the number is invalid, is zero, or rounding was necessary. + */ + public function dividedBy($that, ?int $scale = null, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->isZero()) { + throw DivisionByZeroException::divisionByZero(); + } + + if ($scale === null) { + $scale = $this->scale; + } elseif ($scale < 0) { + throw new \InvalidArgumentException('Scale cannot be negative.'); + } + + if ($that->value === '1' && $that->scale === 0 && $scale === $this->scale) { + return $this; + } + + $p = $this->valueWithMinScale($that->scale + $scale); + $q = $that->valueWithMinScale($this->scale - $scale); + + $result = Calculator::get()->divRound($p, $q, $roundingMode); + + return new BigDecimal($result, $scale); + } + + /** + * Returns the exact result of the division of this number by the given one. + * + * The scale of the result is automatically calculated to fit all the fraction digits. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. + * + * @return BigDecimal The result. + * + * @throws MathException If the divisor is not a valid number, is not convertible to a BigDecimal, is zero, + * or the result yields an infinite number of digits. + */ + public function exactlyDividedBy($that) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->value === '0') { + throw DivisionByZeroException::divisionByZero(); + } + + [$a, $b] = $this->scaleValues($this, $that); + + $d = \rtrim($b, '0'); + $scale = \strlen($b) - \strlen($d); + + $calculator = Calculator::get(); + + foreach ([5, 2] as $prime) { + for (;;) { + $lastDigit = (int) $d[-1]; + + if ($lastDigit % $prime !== 0) { + break; + } + + $d = $calculator->divQ($d, (string) $prime); + $scale++; + } + } + + return $this->dividedBy($that, $scale)->stripTrailingZeros(); + } + + /** + * Returns this number exponentiated to the given value. + * + * The result has a scale of `$this->scale * $exponent`. + * + * @param int $exponent The exponent. + * + * @return BigDecimal The result. + * + * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000. + */ + public function power(int $exponent) : BigDecimal + { + if ($exponent === 0) { + return BigDecimal::one(); + } + + if ($exponent === 1) { + return $this; + } + + if ($exponent < 0 || $exponent > Calculator::MAX_POWER) { + throw new \InvalidArgumentException(\sprintf( + 'The exponent %d is not in the range 0 to %d.', + $exponent, + Calculator::MAX_POWER + )); + } + + return new BigDecimal(Calculator::get()->pow($this->value, $exponent), $this->scale * $exponent); + } + + /** + * Returns the quotient of the division of this number by this given one. + * + * The quotient has a scale of `0`. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. + * + * @return BigDecimal The quotient. + * + * @throws MathException If the divisor is not a valid decimal number, or is zero. + */ + public function quotient($that) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->isZero()) { + throw DivisionByZeroException::divisionByZero(); + } + + $p = $this->valueWithMinScale($that->scale); + $q = $that->valueWithMinScale($this->scale); + + $quotient = Calculator::get()->divQ($p, $q); + + return new BigDecimal($quotient, 0); + } + + /** + * Returns the remainder of the division of this number by this given one. + * + * The remainder has a scale of `max($this->scale, $that->scale)`. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. + * + * @return BigDecimal The remainder. + * + * @throws MathException If the divisor is not a valid decimal number, or is zero. + */ + public function remainder($that) : BigDecimal + { + $that = BigDecimal::of($that); + + if ($that->isZero()) { + throw DivisionByZeroException::divisionByZero(); + } + + $p = $this->valueWithMinScale($that->scale); + $q = $that->valueWithMinScale($this->scale); + + $remainder = Calculator::get()->divR($p, $q); + + $scale = $this->scale > $that->scale ? $this->scale : $that->scale; + + return new BigDecimal($remainder, $scale); + } + + /** + * Returns the quotient and remainder of the division of this number by the given one. + * + * The quotient has a scale of `0`, and the remainder has a scale of `max($this->scale, $that->scale)`. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. + * + * @return BigDecimal[] An array containing the quotient and the remainder. + * + * @throws MathException If the divisor is not a valid decimal number, or is zero. + */ + public function quotientAndRemainder($that) : array + { + $that = BigDecimal::of($that); + + if ($that->isZero()) { + throw DivisionByZeroException::divisionByZero(); + } + + $p = $this->valueWithMinScale($that->scale); + $q = $that->valueWithMinScale($this->scale); + + [$quotient, $remainder] = Calculator::get()->divQR($p, $q); + + $scale = $this->scale > $that->scale ? $this->scale : $that->scale; + + $quotient = new BigDecimal($quotient, 0); + $remainder = new BigDecimal($remainder, $scale); + + return [$quotient, $remainder]; + } + + /** + * Returns the square root of this number, rounded down to the given number of decimals. + * + * @param int $scale + * + * @return BigDecimal + * + * @throws \InvalidArgumentException If the scale is negative. + * @throws NegativeNumberException If this number is negative. + */ + public function sqrt(int $scale) : BigDecimal + { + if ($scale < 0) { + throw new \InvalidArgumentException('Scale cannot be negative.'); + } + + if ($this->value === '0') { + return new BigDecimal('0', $scale); + } + + if ($this->value[0] === '-') { + throw new NegativeNumberException('Cannot calculate the square root of a negative number.'); + } + + $value = $this->value; + $addDigits = 2 * $scale - $this->scale; + + if ($addDigits > 0) { + // add zeros + $value .= \str_repeat('0', $addDigits); + } elseif ($addDigits < 0) { + // trim digits + if (-$addDigits >= \strlen($this->value)) { + // requesting a scale too low, will always yield a zero result + return new BigDecimal('0', $scale); + } + + $value = \substr($value, 0, $addDigits); + } + + $value = Calculator::get()->sqrt($value); + + return new BigDecimal($value, $scale); + } + + /** + * Returns a copy of this BigDecimal with the decimal point moved $n places to the left. + * + * @param int $n + * + * @return BigDecimal + */ + public function withPointMovedLeft(int $n) : BigDecimal + { + if ($n === 0) { + return $this; + } + + if ($n < 0) { + return $this->withPointMovedRight(-$n); + } + + return new BigDecimal($this->value, $this->scale + $n); + } + + /** + * Returns a copy of this BigDecimal with the decimal point moved $n places to the right. + * + * @param int $n + * + * @return BigDecimal + */ + public function withPointMovedRight(int $n) : BigDecimal + { + if ($n === 0) { + return $this; + } + + if ($n < 0) { + return $this->withPointMovedLeft(-$n); + } + + $value = $this->value; + $scale = $this->scale - $n; + + if ($scale < 0) { + if ($value !== '0') { + $value .= \str_repeat('0', -$scale); + } + $scale = 0; + } + + return new BigDecimal($value, $scale); + } + + /** + * Returns a copy of this BigDecimal with any trailing zeros removed from the fractional part. + * + * @return BigDecimal + */ + public function stripTrailingZeros() : BigDecimal + { + if ($this->scale === 0) { + return $this; + } + + $trimmedValue = \rtrim($this->value, '0'); + + if ($trimmedValue === '') { + return BigDecimal::zero(); + } + + $trimmableZeros = \strlen($this->value) - \strlen($trimmedValue); + + if ($trimmableZeros === 0) { + return $this; + } + + if ($trimmableZeros > $this->scale) { + $trimmableZeros = $this->scale; + } + + $value = \substr($this->value, 0, -$trimmableZeros); + $scale = $this->scale - $trimmableZeros; + + return new BigDecimal($value, $scale); + } + + /** + * Returns the absolute value of this number. + * + * @return BigDecimal + */ + public function abs() : BigDecimal + { + return $this->isNegative() ? $this->negated() : $this; + } + + /** + * Returns the negated value of this number. + * + * @return BigDecimal + */ + public function negated() : BigDecimal + { + return new BigDecimal(Calculator::get()->neg($this->value), $this->scale); + } + + /** + * {@inheritdoc} + */ + public function compareTo($that) : int + { + $that = BigNumber::of($that); + + if ($that instanceof BigInteger) { + $that = $that->toBigDecimal(); + } + + if ($that instanceof BigDecimal) { + [$a, $b] = $this->scaleValues($this, $that); + + return Calculator::get()->cmp($a, $b); + } + + return - $that->compareTo($this); + } + + /** + * {@inheritdoc} + */ + public function getSign() : int + { + return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1); + } + + /** + * @return BigInteger + */ + public function getUnscaledValue() : BigInteger + { + return BigInteger::create($this->value); + } + + /** + * @return int + */ + public function getScale() : int + { + return $this->scale; + } + + /** + * Returns a string representing the integral part of this decimal number. + * + * Example: `-123.456` => `-123`. + * + * @return string + */ + public function getIntegralPart() : string + { + if ($this->scale === 0) { + return $this->value; + } + + $value = $this->getUnscaledValueWithLeadingZeros(); + + return \substr($value, 0, -$this->scale); + } + + /** + * Returns a string representing the fractional part of this decimal number. + * + * If the scale is zero, an empty string is returned. + * + * Examples: `-123.456` => '456', `123` => ''. + * + * @return string + */ + public function getFractionalPart() : string + { + if ($this->scale === 0) { + return ''; + } + + $value = $this->getUnscaledValueWithLeadingZeros(); + + return \substr($value, -$this->scale); + } + + /** + * Returns whether this decimal number has a non-zero fractional part. + * + * @return bool + */ + public function hasNonZeroFractionalPart() : bool + { + return $this->getFractionalPart() !== \str_repeat('0', $this->scale); + } + + /** + * {@inheritdoc} + */ + public function toBigInteger() : BigInteger + { + if ($this->scale === 0) { + $zeroScaleDecimal = $this; + } else { + $zeroScaleDecimal = $this->dividedBy(1, 0); + } + + return BigInteger::create($zeroScaleDecimal->value); + } + + /** + * {@inheritdoc} + */ + public function toBigDecimal() : BigDecimal + { + return $this; + } + + /** + * {@inheritdoc} + */ + public function toBigRational() : BigRational + { + $numerator = BigInteger::create($this->value); + $denominator = BigInteger::create('1' . \str_repeat('0', $this->scale)); + + return BigRational::create($numerator, $denominator, false); + } + + /** + * {@inheritdoc} + */ + public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal + { + if ($scale === $this->scale) { + return $this; + } + + return $this->dividedBy(BigDecimal::one(), $scale, $roundingMode); + } + + /** + * {@inheritdoc} + */ + public function toInt() : int + { + return $this->toBigInteger()->toInt(); + } + + /** + * {@inheritdoc} + */ + public function toFloat() : float + { + return (float) (string) $this; + } + + /** + * {@inheritdoc} + */ + public function __toString() : string + { + if ($this->scale === 0) { + return $this->value; + } + + $value = $this->getUnscaledValueWithLeadingZeros(); + + return \substr($value, 0, -$this->scale) . '.' . \substr($value, -$this->scale); + } + + /** + * This method is required by interface Serializable and SHOULD NOT be accessed directly. + * + * @internal + * + * @return string + */ + public function serialize() : string + { + return $this->value . ':' . $this->scale; + } + + /** + * This method is only here to implement interface Serializable and cannot be accessed directly. + * + * @internal + * + * @param string $value + * + * @return void + * + * @throws \LogicException + */ + public function unserialize($value) : void + { + if (isset($this->value)) { + throw new \LogicException('unserialize() is an internal function, it must not be called directly.'); + } + + [$value, $scale] = \explode(':', $value); + + $this->value = $value; + $this->scale = (int) $scale; + } + + /** + * Puts the internal values of the given decimal numbers on the same scale. + * + * @param BigDecimal $x The first decimal number. + * @param BigDecimal $y The second decimal number. + * + * @return array{0: string, 1: string} The scaled integer values of $x and $y. + */ + private function scaleValues(BigDecimal $x, BigDecimal $y) : array + { + $a = $x->value; + $b = $y->value; + + if ($b !== '0' && $x->scale > $y->scale) { + $b .= \str_repeat('0', $x->scale - $y->scale); + } elseif ($a !== '0' && $x->scale < $y->scale) { + $a .= \str_repeat('0', $y->scale - $x->scale); + } + + return [$a, $b]; + } + + /** + * @param int $scale + * + * @return string + */ + private function valueWithMinScale(int $scale) : string + { + $value = $this->value; + + if ($this->value !== '0' && $scale > $this->scale) { + $value .= \str_repeat('0', $scale - $this->scale); + } + + return $value; + } + + /** + * Adds leading zeros if necessary to the unscaled value to represent the full decimal number. + * + * @return string + */ + private function getUnscaledValueWithLeadingZeros() : string + { + $value = $this->value; + $targetLength = $this->scale + 1; + $negative = ($value[0] === '-'); + $length = \strlen($value); + + if ($negative) { + $length--; + } + + if ($length >= $targetLength) { + return $this->value; + } + + if ($negative) { + $value = \substr($value, 1); + } + + $value = \str_pad($value, $targetLength, '0', STR_PAD_LEFT); + + if ($negative) { + $value = '-' . $value; + } + + return $value; + } +} diff --git a/vendor/brick/math/src/BigInteger.php b/vendor/brick/math/src/BigInteger.php new file mode 100644 index 0000000..c811d17 --- /dev/null +++ b/vendor/brick/math/src/BigInteger.php @@ -0,0 +1,904 @@ +value = $value; + } + + /** + * Creates a BigInteger of the given value. + * + * @param BigNumber|int|float|string $value + * + * @return BigInteger + * + * @throws MathException If the value cannot be converted to a BigInteger. + * + * @psalm-pure + */ + public static function of($value) : BigNumber + { + return parent::of($value)->toBigInteger(); + } + + /** + * Creates a number from a string in a given base. + * + * The string can optionally be prefixed with the `+` or `-` sign. + * + * Bases greater than 36 are not supported by this method, as there is no clear consensus on which of the lowercase + * or uppercase characters should come first. Instead, this method accepts any base up to 36, and does not + * differentiate lowercase and uppercase characters, which are considered equal. + * + * For bases greater than 36, and/or custom alphabets, use the fromArbitraryBase() method. + * + * @param string $number The number to convert, in the given base. + * @param int $base The base of the number, between 2 and 36. + * + * @return BigInteger + * + * @throws NumberFormatException If the number is empty, or contains invalid chars for the given base. + * @throws \InvalidArgumentException If the base is out of range. + * + * @psalm-pure + */ + public static function fromBase(string $number, int $base) : BigInteger + { + if ($number === '') { + throw new NumberFormatException('The number cannot be empty.'); + } + + if ($base < 2 || $base > 36) { + throw new \InvalidArgumentException(\sprintf('Base %d is not in range 2 to 36.', $base)); + } + + if ($number[0] === '-') { + $sign = '-'; + $number = \substr($number, 1); + } elseif ($number[0] === '+') { + $sign = ''; + $number = \substr($number, 1); + } else { + $sign = ''; + } + + if ($number === '') { + throw new NumberFormatException('The number cannot be empty.'); + } + + $number = \ltrim($number, '0'); + + if ($number === '') { + // The result will be the same in any base, avoid further calculation. + return BigInteger::zero(); + } + + if ($number === '1') { + // The result will be the same in any base, avoid further calculation. + return new BigInteger($sign . '1'); + } + + $pattern = '/[^' . \substr(Calculator::ALPHABET, 0, $base) . ']/'; + + if (\preg_match($pattern, \strtolower($number), $matches) === 1) { + throw new NumberFormatException(\sprintf('"%s" is not a valid character in base %d.', $matches[0], $base)); + } + + if ($base === 10) { + // The number is usable as is, avoid further calculation. + return new BigInteger($sign . $number); + } + + $result = Calculator::get()->fromBase($number, $base); + + return new BigInteger($sign . $result); + } + + /** + * Parses a string containing an integer in an arbitrary base, using a custom alphabet. + * + * Because this method accepts an alphabet with any character, including dash, it does not handle negative numbers. + * + * @param string $number The number to parse. + * @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8. + * + * @return BigInteger + * + * @throws NumberFormatException If the given number is empty or contains invalid chars for the given alphabet. + * @throws \InvalidArgumentException If the alphabet does not contain at least 2 chars. + * + * @psalm-pure + */ + public static function fromArbitraryBase(string $number, string $alphabet) : BigInteger + { + if ($number === '') { + throw new NumberFormatException('The number cannot be empty.'); + } + + $base = \strlen($alphabet); + + if ($base < 2) { + throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.'); + } + + $pattern = '/[^' . \preg_quote($alphabet, '/') . ']/'; + + if (\preg_match($pattern, $number, $matches) === 1) { + throw NumberFormatException::charNotInAlphabet($matches[0]); + } + + $number = Calculator::get()->fromArbitraryBase($number, $alphabet, $base); + + return new BigInteger($number); + } + + /** + * Returns a BigInteger representing zero. + * + * @return BigInteger + * + * @psalm-pure + */ + public static function zero() : BigInteger + { + /** @psalm-suppress ImpureStaticVariable */ + static $zero; + + if ($zero === null) { + $zero = new BigInteger('0'); + } + + return $zero; + } + + /** + * Returns a BigInteger representing one. + * + * @return BigInteger + * + * @psalm-pure + */ + public static function one() : BigInteger + { + /** @psalm-suppress ImpureStaticVariable */ + static $one; + + if ($one === null) { + $one = new BigInteger('1'); + } + + return $one; + } + + /** + * Returns a BigInteger representing ten. + * + * @return BigInteger + * + * @psalm-pure + */ + public static function ten() : BigInteger + { + /** @psalm-suppress ImpureStaticVariable */ + static $ten; + + if ($ten === null) { + $ten = new BigInteger('10'); + } + + return $ten; + } + + /** + * Returns the sum of this number and the given one. + * + * @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigInteger. + * + * @return BigInteger The result. + * + * @throws MathException If the number is not valid, or is not convertible to a BigInteger. + */ + public function plus($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '0') { + return $this; + } + + if ($this->value === '0') { + return $that; + } + + $value = Calculator::get()->add($this->value, $that->value); + + return new BigInteger($value); + } + + /** + * Returns the difference of this number and the given one. + * + * @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigInteger. + * + * @return BigInteger The result. + * + * @throws MathException If the number is not valid, or is not convertible to a BigInteger. + */ + public function minus($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '0') { + return $this; + } + + $value = Calculator::get()->sub($this->value, $that->value); + + return new BigInteger($value); + } + + /** + * Returns the product of this number and the given one. + * + * @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigInteger. + * + * @return BigInteger The result. + * + * @throws MathException If the multiplier is not a valid number, or is not convertible to a BigInteger. + */ + public function multipliedBy($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '1') { + return $this; + } + + if ($this->value === '1') { + return $that; + } + + $value = Calculator::get()->mul($this->value, $that->value); + + return new BigInteger($value); + } + + /** + * Returns the result of the division of this number by the given one. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. + * @param int $roundingMode An optional rounding mode. + * + * @return BigInteger The result. + * + * @throws MathException If the divisor is not a valid number, is not convertible to a BigInteger, is zero, + * or RoundingMode::UNNECESSARY is used and the remainder is not zero. + */ + public function dividedBy($that, int $roundingMode = RoundingMode::UNNECESSARY) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '1') { + return $this; + } + + if ($that->value === '0') { + throw DivisionByZeroException::divisionByZero(); + } + + $result = Calculator::get()->divRound($this->value, $that->value, $roundingMode); + + return new BigInteger($result); + } + + /** + * Returns this number exponentiated to the given value. + * + * @param int $exponent The exponent. + * + * @return BigInteger The result. + * + * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000. + */ + public function power(int $exponent) : BigInteger + { + if ($exponent === 0) { + return BigInteger::one(); + } + + if ($exponent === 1) { + return $this; + } + + if ($exponent < 0 || $exponent > Calculator::MAX_POWER) { + throw new \InvalidArgumentException(\sprintf( + 'The exponent %d is not in the range 0 to %d.', + $exponent, + Calculator::MAX_POWER + )); + } + + return new BigInteger(Calculator::get()->pow($this->value, $exponent)); + } + + /** + * Returns the quotient of the division of this number by the given one. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. + * + * @return BigInteger + * + * @throws DivisionByZeroException If the divisor is zero. + */ + public function quotient($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '1') { + return $this; + } + + if ($that->value === '0') { + throw DivisionByZeroException::divisionByZero(); + } + + $quotient = Calculator::get()->divQ($this->value, $that->value); + + return new BigInteger($quotient); + } + + /** + * Returns the remainder of the division of this number by the given one. + * + * The remainder, when non-zero, has the same sign as the dividend. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. + * + * @return BigInteger + * + * @throws DivisionByZeroException If the divisor is zero. + */ + public function remainder($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '1') { + return BigInteger::zero(); + } + + if ($that->value === '0') { + throw DivisionByZeroException::divisionByZero(); + } + + $remainder = Calculator::get()->divR($this->value, $that->value); + + return new BigInteger($remainder); + } + + /** + * Returns the quotient and remainder of the division of this number by the given one. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. + * + * @return BigInteger[] An array containing the quotient and the remainder. + * + * @throws DivisionByZeroException If the divisor is zero. + */ + public function quotientAndRemainder($that) : array + { + $that = BigInteger::of($that); + + if ($that->value === '0') { + throw DivisionByZeroException::divisionByZero(); + } + + [$quotient, $remainder] = Calculator::get()->divQR($this->value, $that->value); + + return [ + new BigInteger($quotient), + new BigInteger($remainder) + ]; + } + + /** + * Returns the modulo of this number and the given one. + * + * The modulo operation yields the same result as the remainder operation when both operands are of the same sign, + * and may differ when signs are different. + * + * The result of the modulo operation, when non-zero, has the same sign as the divisor. + * + * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. + * + * @return BigInteger + * + * @throws DivisionByZeroException If the divisor is zero. + */ + public function mod($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '0') { + throw DivisionByZeroException::divisionByZero(); + } + + return $this->remainder($that)->plus($that)->remainder($that); + } + + /** + * Returns this number raised into power with modulo. + * + * This operation only works on positive numbers. + * + * @param BigNumber|int|float|string $exp The positive exponent. + * @param BigNumber|int|float|string $mod The modulo. Must not be zero. + * + * @return BigInteger + * + * @throws NegativeNumberException If any of the operands is negative. + * @throws DivisionByZeroException If the modulo is zero. + */ + public function powerMod($exp, $mod) : BigInteger + { + $exp = BigInteger::of($exp); + $mod = BigInteger::of($mod); + + if ($this->isNegative() || $exp->isNegative() || $mod->isNegative()) { + throw new NegativeNumberException('The operands cannot be negative.'); + } + + if ($mod->isZero()) { + throw DivisionByZeroException::divisionByZero(); + } + + $result = Calculator::get()->powmod($this->value, $exp->value, $mod->value); + + return new BigInteger($result); + } + + /** + * Returns the greatest common divisor of this number and the given one. + * + * The GCD is always positive, unless both operands are zero, in which case it is zero. + * + * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. + * + * @return BigInteger + */ + public function gcd($that) : BigInteger + { + $that = BigInteger::of($that); + + if ($that->value === '0' && $this->value[0] !== '-') { + return $this; + } + + if ($this->value === '0' && $that->value[0] !== '-') { + return $that; + } + + $value = Calculator::get()->gcd($this->value, $that->value); + + return new BigInteger($value); + } + + /** + * Returns the integer square root number of this number, rounded down. + * + * The result is the largest x such that x² ≤ n. + * + * @return BigInteger + * + * @throws NegativeNumberException If this number is negative. + */ + public function sqrt() : BigInteger + { + if ($this->value[0] === '-') { + throw new NegativeNumberException('Cannot calculate the square root of a negative number.'); + } + + $value = Calculator::get()->sqrt($this->value); + + return new BigInteger($value); + } + + /** + * Returns the absolute value of this number. + * + * @return BigInteger + */ + public function abs() : BigInteger + { + return $this->isNegative() ? $this->negated() : $this; + } + + /** + * Returns the inverse of this number. + * + * @return BigInteger + */ + public function negated() : BigInteger + { + return new BigInteger(Calculator::get()->neg($this->value)); + } + + /** + * Returns the integer bitwise-and combined with another integer. + * + * This method returns a negative BigInteger if and only if both operands are negative. + * + * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. + * + * @return BigInteger + */ + public function and($that) : BigInteger + { + $that = BigInteger::of($that); + + return new BigInteger(Calculator::get()->and($this->value, $that->value)); + } + + /** + * Returns the integer bitwise-or combined with another integer. + * + * This method returns a negative BigInteger if and only if either of the operands is negative. + * + * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. + * + * @return BigInteger + */ + public function or($that) : BigInteger + { + $that = BigInteger::of($that); + + return new BigInteger(Calculator::get()->or($this->value, $that->value)); + } + + /** + * Returns the integer bitwise-xor combined with another integer. + * + * This method returns a negative BigInteger if and only if exactly one of the operands is negative. + * + * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. + * + * @return BigInteger + */ + public function xor($that) : BigInteger + { + $that = BigInteger::of($that); + + return new BigInteger(Calculator::get()->xor($this->value, $that->value)); + } + + /** + * Returns the integer left shifted by a given number of bits. + * + * @param int $distance The distance to shift. + * + * @return BigInteger + */ + public function shiftedLeft(int $distance) : BigInteger + { + if ($distance === 0) { + return $this; + } + + if ($distance < 0) { + return $this->shiftedRight(- $distance); + } + + return $this->multipliedBy(BigInteger::of(2)->power($distance)); + } + + /** + * Returns the integer right shifted by a given number of bits. + * + * @param int $distance The distance to shift. + * + * @return BigInteger + */ + public function shiftedRight(int $distance) : BigInteger + { + if ($distance === 0) { + return $this; + } + + if ($distance < 0) { + return $this->shiftedLeft(- $distance); + } + + $operand = BigInteger::of(2)->power($distance); + + if ($this->isPositiveOrZero()) { + return $this->quotient($operand); + } + + return $this->dividedBy($operand, RoundingMode::UP); + } + + /** + * Returns the number of bits in the minimal two's-complement representation of this BigInteger, excluding a sign bit. + * + * For positive BigIntegers, this is equivalent to the number of bits in the ordinary binary representation. + * Computes (ceil(log2(this < 0 ? -this : this+1))). + * + * @return int + */ + public function getBitLength() : int + { + if ($this->value === '0') { + return 0; + } + + if ($this->isNegative()) { + return $this->abs()->minus(1)->getBitLength(); + } + + return strlen($this->toBase(2)); + } + + /** + * Returns the index of the rightmost (lowest-order) one bit in this BigInteger. + * + * Returns -1 if this BigInteger contains no one bits. + * + * @return int + */ + public function getLowestSetBit() : int + { + $n = $this; + $bitLength = $this->getBitLength(); + + for ($i = 0; $i <= $bitLength; $i++) { + if ($n->isOdd()) { + return $i; + } + + $n = $n->shiftedRight(1); + } + + return -1; + } + + /** + * Returns whether this number is even. + * + * @return bool + */ + public function isEven() : bool + { + return in_array($this->value[-1], ['0', '2', '4', '6', '8'], true); + } + + /** + * Returns whether this number is odd. + * + * @return bool + */ + public function isOdd() : bool + { + return in_array($this->value[-1], ['1', '3', '5', '7', '9'], true); + } + + /** + * Returns true if and only if the designated bit is set. + * + * Computes ((this & (1<shiftedRight($n)->isOdd(); + } + + /** + * {@inheritdoc} + */ + public function compareTo($that) : int + { + $that = BigNumber::of($that); + + if ($that instanceof BigInteger) { + return Calculator::get()->cmp($this->value, $that->value); + } + + return - $that->compareTo($this); + } + + /** + * {@inheritdoc} + */ + public function getSign() : int + { + return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1); + } + + /** + * {@inheritdoc} + */ + public function toBigInteger() : BigInteger + { + return $this; + } + + /** + * {@inheritdoc} + */ + public function toBigDecimal() : BigDecimal + { + return BigDecimal::create($this->value); + } + + /** + * {@inheritdoc} + */ + public function toBigRational() : BigRational + { + return BigRational::create($this, BigInteger::one(), false); + } + + /** + * {@inheritdoc} + */ + public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal + { + return $this->toBigDecimal()->toScale($scale, $roundingMode); + } + + /** + * {@inheritdoc} + */ + public function toInt() : int + { + $intValue = (int) $this->value; + + if ($this->value !== (string) $intValue) { + throw IntegerOverflowException::toIntOverflow($this); + } + + return $intValue; + } + + /** + * {@inheritdoc} + */ + public function toFloat() : float + { + return (float) $this->value; + } + + /** + * Returns a string representation of this number in the given base. + * + * The output will always be lowercase for bases greater than 10. + * + * @param int $base + * + * @return string + * + * @throws \InvalidArgumentException If the base is out of range. + */ + public function toBase(int $base) : string + { + if ($base === 10) { + return $this->value; + } + + if ($base < 2 || $base > 36) { + throw new \InvalidArgumentException(\sprintf('Base %d is out of range [2, 36]', $base)); + } + + return Calculator::get()->toBase($this->value, $base); + } + + /** + * Returns a string representation of this number in an arbitrary base with a custom alphabet. + * + * Because this method accepts an alphabet with any character, including dash, it does not handle negative numbers; + * a NegativeNumberException will be thrown when attempting to call this method on a negative number. + * + * @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8. + * + * @return string + * + * @throws NegativeNumberException If this number is negative. + * @throws \InvalidArgumentException If the given alphabet does not contain at least 2 chars. + */ + public function toArbitraryBase(string $alphabet) : string + { + $base = \strlen($alphabet); + + if ($base < 2) { + throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.'); + } + + if ($this->value[0] === '-') { + throw new NegativeNumberException(__FUNCTION__ . '() does not support negative numbers.'); + } + + return Calculator::get()->toArbitraryBase($this->value, $alphabet, $base); + } + + /** + * {@inheritdoc} + */ + public function __toString() : string + { + return $this->value; + } + + /** + * This method is required by interface Serializable and SHOULD NOT be accessed directly. + * + * @internal + * + * @return string + */ + public function serialize() : string + { + return $this->value; + } + + /** + * This method is only here to implement interface Serializable and cannot be accessed directly. + * + * @internal + * + * @param string $value + * + * @return void + * + * @throws \LogicException + */ + public function unserialize($value) : void + { + if (isset($this->value)) { + throw new \LogicException('unserialize() is an internal function, it must not be called directly.'); + } + + $this->value = $value; + } +} diff --git a/vendor/brick/math/src/BigNumber.php b/vendor/brick/math/src/BigNumber.php new file mode 100644 index 0000000..acd6b3d --- /dev/null +++ b/vendor/brick/math/src/BigNumber.php @@ -0,0 +1,528 @@ +[\-\+]?[0-9]+)' . + '(?:' . + '(?:' . + '(?:\.(?[0-9]+))?' . + '(?:[eE](?[\-\+]?[0-9]+))?' . + ')' . '|' . '(?:' . + '(?:\/(?[0-9]+))?' . + ')' . + ')?' . + '$/'; + + /** + * Creates a BigNumber of the given value. + * + * The concrete return type is dependent on the given value, with the following rules: + * + * - BigNumber instances are returned as is + * - integer numbers are returned as BigInteger + * - floating point numbers are converted to a string then parsed as such + * - strings containing a `/` character are returned as BigRational + * - strings containing a `.` character or using an exponential notation are returned as BigDecimal + * - strings containing only digits with an optional leading `+` or `-` sign are returned as BigInteger + * + * @param BigNumber|int|float|string $value + * + * @return BigNumber + * + * @throws NumberFormatException If the format of the number is not valid. + * @throws DivisionByZeroException If the value represents a rational number with a denominator of zero. + * + * @psalm-pure + */ + public static function of($value) : BigNumber + { + if ($value instanceof BigNumber) { + return $value; + } + + if (\is_int($value)) { + return new BigInteger((string) $value); + } + + if (is_float($value)) { + $value = self::floatToString($value); + } else { + $value = (string) $value; + } + + if (\preg_match(self::PARSE_REGEXP, $value, $matches) !== 1) { + throw new NumberFormatException(\sprintf('The given value "%s" does not represent a valid number.', $value)); + } + + if (isset($matches['denominator'])) { + $numerator = self::cleanUp($matches['integral']); + $denominator = \ltrim($matches['denominator'], '0'); + + if ($denominator === '') { + throw DivisionByZeroException::denominatorMustNotBeZero(); + } + + return new BigRational(new BigInteger($numerator), new BigInteger($denominator), false); + } + + if (isset($matches['fractional']) || isset($matches['exponent'])) { + $fractional = isset($matches['fractional']) ? $matches['fractional'] : ''; + $exponent = isset($matches['exponent']) ? (int) $matches['exponent'] : 0; + + $unscaledValue = self::cleanUp($matches['integral'] . $fractional); + + $scale = \strlen($fractional) - $exponent; + + if ($scale < 0) { + if ($unscaledValue !== '0') { + $unscaledValue .= \str_repeat('0', - $scale); + } + $scale = 0; + } + + return new BigDecimal($unscaledValue, $scale); + } + + $integral = self::cleanUp($matches['integral']); + + return new BigInteger($integral); + } + + /** + * Safely converts float to string, avoiding locale-dependent issues. + * + * @see https://github.com/brick/math/pull/20 + * + * @param float $float + * + * @return string + * + * @psalm-pure + * @psalm-suppress ImpureFunctionCall + */ + private static function floatToString(float $float) : string + { + $currentLocale = \setlocale(LC_NUMERIC, '0'); + \setlocale(LC_NUMERIC, 'C'); + + $result = (string) $float; + + \setlocale(LC_NUMERIC, $currentLocale); + + return $result; + } + + /** + * Proxy method to access protected constructors from sibling classes. + * + * @internal + * + * @param mixed ...$args The arguments to the constructor. + * + * @return static + * + * @psalm-pure + */ + protected static function create(... $args) : BigNumber + { + /** @psalm-suppress TooManyArguments */ + return new static(... $args); + } + + /** + * Returns the minimum of the given values. + * + * @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible + * to an instance of the class this method is called on. + * + * @return static The minimum value. + * + * @throws \InvalidArgumentException If no values are given. + * @throws MathException If an argument is not valid. + * + * @psalm-pure + */ + public static function min(...$values) : BigNumber + { + $min = null; + + foreach ($values as $value) { + $value = static::of($value); + + if ($min === null || $value->isLessThan($min)) { + $min = $value; + } + } + + if ($min === null) { + throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.'); + } + + return $min; + } + + /** + * Returns the maximum of the given values. + * + * @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible + * to an instance of the class this method is called on. + * + * @return static The maximum value. + * + * @throws \InvalidArgumentException If no values are given. + * @throws MathException If an argument is not valid. + * + * @psalm-pure + */ + public static function max(...$values) : BigNumber + { + $max = null; + + foreach ($values as $value) { + $value = static::of($value); + + if ($max === null || $value->isGreaterThan($max)) { + $max = $value; + } + } + + if ($max === null) { + throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.'); + } + + return $max; + } + + /** + * Returns the sum of the given values. + * + * @param BigNumber|int|float|string ...$values The numbers to add. All the numbers need to be convertible + * to an instance of the class this method is called on. + * + * @return static The sum. + * + * @throws \InvalidArgumentException If no values are given. + * @throws MathException If an argument is not valid. + * + * @psalm-pure + */ + public static function sum(...$values) : BigNumber + { + /** @var BigNumber|null $sum */ + $sum = null; + + foreach ($values as $value) { + $value = static::of($value); + + if ($sum === null) { + $sum = $value; + } else { + $sum = self::add($sum, $value); + } + } + + if ($sum === null) { + throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.'); + } + + return $sum; + } + + /** + * Adds two BigNumber instances in the correct order to avoid a RoundingNecessaryException. + * + * @todo This could be better resolved by creating an abstract protected method in BigNumber, and leaving to + * concrete classes the responsibility to perform the addition themselves or delegate it to the given number, + * depending on their ability to perform the operation. This will also require a version bump because we're + * potentially breaking custom BigNumber implementations (if any...) + * + * @param BigNumber $a + * @param BigNumber $b + * + * @return BigNumber + * + * @psalm-pure + */ + private static function add(BigNumber $a, BigNumber $b) : BigNumber + { + if ($a instanceof BigRational) { + return $a->plus($b); + } + + if ($b instanceof BigRational) { + return $b->plus($a); + } + + if ($a instanceof BigDecimal) { + return $a->plus($b); + } + + if ($b instanceof BigDecimal) { + return $b->plus($a); + } + + /** @var BigInteger $a */ + + return $a->plus($b); + } + + /** + * Removes optional leading zeros and + sign from the given number. + * + * @param string $number The number, validated as a non-empty string of digits with optional sign. + * + * @return string + * + * @psalm-pure + */ + private static function cleanUp(string $number) : string + { + $firstChar = $number[0]; + + if ($firstChar === '+' || $firstChar === '-') { + $number = \substr($number, 1); + } + + $number = \ltrim($number, '0'); + + if ($number === '') { + return '0'; + } + + if ($firstChar === '-') { + return '-' . $number; + } + + return $number; + } + + /** + * Checks if this number is equal to the given one. + * + * @param BigNumber|int|float|string $that + * + * @return bool + */ + public function isEqualTo($that) : bool + { + return $this->compareTo($that) === 0; + } + + /** + * Checks if this number is strictly lower than the given one. + * + * @param BigNumber|int|float|string $that + * + * @return bool + */ + public function isLessThan($that) : bool + { + return $this->compareTo($that) < 0; + } + + /** + * Checks if this number is lower than or equal to the given one. + * + * @param BigNumber|int|float|string $that + * + * @return bool + */ + public function isLessThanOrEqualTo($that) : bool + { + return $this->compareTo($that) <= 0; + } + + /** + * Checks if this number is strictly greater than the given one. + * + * @param BigNumber|int|float|string $that + * + * @return bool + */ + public function isGreaterThan($that) : bool + { + return $this->compareTo($that) > 0; + } + + /** + * Checks if this number is greater than or equal to the given one. + * + * @param BigNumber|int|float|string $that + * + * @return bool + */ + public function isGreaterThanOrEqualTo($that) : bool + { + return $this->compareTo($that) >= 0; + } + + /** + * Checks if this number equals zero. + * + * @return bool + */ + public function isZero() : bool + { + return $this->getSign() === 0; + } + + /** + * Checks if this number is strictly negative. + * + * @return bool + */ + public function isNegative() : bool + { + return $this->getSign() < 0; + } + + /** + * Checks if this number is negative or zero. + * + * @return bool + */ + public function isNegativeOrZero() : bool + { + return $this->getSign() <= 0; + } + + /** + * Checks if this number is strictly positive. + * + * @return bool + */ + public function isPositive() : bool + { + return $this->getSign() > 0; + } + + /** + * Checks if this number is positive or zero. + * + * @return bool + */ + public function isPositiveOrZero() : bool + { + return $this->getSign() >= 0; + } + + /** + * Returns the sign of this number. + * + * @return int -1 if the number is negative, 0 if zero, 1 if positive. + */ + abstract public function getSign() : int; + + /** + * Compares this number to the given one. + * + * @param BigNumber|int|float|string $that + * + * @return int [-1,0,1] If `$this` is lower than, equal to, or greater than `$that`. + * + * @throws MathException If the number is not valid. + */ + abstract public function compareTo($that) : int; + + /** + * Converts this number to a BigInteger. + * + * @return BigInteger The converted number. + * + * @throws RoundingNecessaryException If this number cannot be converted to a BigInteger without rounding. + */ + abstract public function toBigInteger() : BigInteger; + + /** + * Converts this number to a BigDecimal. + * + * @return BigDecimal The converted number. + * + * @throws RoundingNecessaryException If this number cannot be converted to a BigDecimal without rounding. + */ + abstract public function toBigDecimal() : BigDecimal; + + /** + * Converts this number to a BigRational. + * + * @return BigRational The converted number. + */ + abstract public function toBigRational() : BigRational; + + /** + * Converts this number to a BigDecimal with the given scale, using rounding if necessary. + * + * @param int $scale The scale of the resulting `BigDecimal`. + * @param int $roundingMode A `RoundingMode` constant. + * + * @return BigDecimal + * + * @throws RoundingNecessaryException If this number cannot be converted to the given scale without rounding. + * This only applies when RoundingMode::UNNECESSARY is used. + */ + abstract public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal; + + /** + * Returns the exact value of this number as a native integer. + * + * If this number cannot be converted to a native integer without losing precision, an exception is thrown. + * Note that the acceptable range for an integer depends on the platform and differs for 32-bit and 64-bit. + * + * @return int The converted value. + * + * @throws MathException If this number cannot be exactly converted to a native integer. + */ + abstract public function toInt() : int; + + /** + * Returns an approximation of this number as a floating-point value. + * + * Note that this method can discard information as the precision of a floating-point value + * is inherently limited. + * + * If the number is greater than the largest representable floating point number, positive infinity is returned. + * If the number is less than the smallest representable floating point number, negative infinity is returned. + * + * @return float The converted value. + */ + abstract public function toFloat() : float; + + /** + * Returns a string representation of this number. + * + * The output of this method can be parsed by the `of()` factory method; + * this will yield an object equal to this one, without any information loss. + * + * @return string + */ + abstract public function __toString() : string; + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : string + { + return $this->__toString(); + } +} diff --git a/vendor/brick/math/src/BigRational.php b/vendor/brick/math/src/BigRational.php new file mode 100644 index 0000000..ff035c5 --- /dev/null +++ b/vendor/brick/math/src/BigRational.php @@ -0,0 +1,479 @@ +isZero()) { + throw DivisionByZeroException::denominatorMustNotBeZero(); + } + + if ($denominator->isNegative()) { + $numerator = $numerator->negated(); + $denominator = $denominator->negated(); + } + } + + $this->numerator = $numerator; + $this->denominator = $denominator; + } + + /** + * Creates a BigRational of the given value. + * + * @param BigNumber|int|float|string $value + * + * @return BigRational + * + * @throws MathException If the value cannot be converted to a BigRational. + * + * @psalm-pure + */ + public static function of($value) : BigNumber + { + return parent::of($value)->toBigRational(); + } + + /** + * Creates a BigRational out of a numerator and a denominator. + * + * If the denominator is negative, the signs of both the numerator and the denominator + * will be inverted to ensure that the denominator is always positive. + * + * @param BigNumber|int|float|string $numerator The numerator. Must be convertible to a BigInteger. + * @param BigNumber|int|float|string $denominator The denominator. Must be convertible to a BigInteger. + * + * @return BigRational + * + * @throws NumberFormatException If an argument does not represent a valid number. + * @throws RoundingNecessaryException If an argument represents a non-integer number. + * @throws DivisionByZeroException If the denominator is zero. + * + * @psalm-pure + */ + public static function nd($numerator, $denominator) : BigRational + { + $numerator = BigInteger::of($numerator); + $denominator = BigInteger::of($denominator); + + return new BigRational($numerator, $denominator, true); + } + + /** + * Returns a BigRational representing zero. + * + * @return BigRational + * + * @psalm-pure + */ + public static function zero() : BigRational + { + /** @psalm-suppress ImpureStaticVariable */ + static $zero; + + if ($zero === null) { + $zero = new BigRational(BigInteger::zero(), BigInteger::one(), false); + } + + return $zero; + } + + /** + * Returns a BigRational representing one. + * + * @return BigRational + * + * @psalm-pure + */ + public static function one() : BigRational + { + /** @psalm-suppress ImpureStaticVariable */ + static $one; + + if ($one === null) { + $one = new BigRational(BigInteger::one(), BigInteger::one(), false); + } + + return $one; + } + + /** + * Returns a BigRational representing ten. + * + * @return BigRational + * + * @psalm-pure + */ + public static function ten() : BigRational + { + /** @psalm-suppress ImpureStaticVariable */ + static $ten; + + if ($ten === null) { + $ten = new BigRational(BigInteger::ten(), BigInteger::one(), false); + } + + return $ten; + } + + /** + * @return BigInteger + */ + public function getNumerator() : BigInteger + { + return $this->numerator; + } + + /** + * @return BigInteger + */ + public function getDenominator() : BigInteger + { + return $this->denominator; + } + + /** + * Returns the quotient of the division of the numerator by the denominator. + * + * @return BigInteger + */ + public function quotient() : BigInteger + { + return $this->numerator->quotient($this->denominator); + } + + /** + * Returns the remainder of the division of the numerator by the denominator. + * + * @return BigInteger + */ + public function remainder() : BigInteger + { + return $this->numerator->remainder($this->denominator); + } + + /** + * Returns the quotient and remainder of the division of the numerator by the denominator. + * + * @return BigInteger[] + */ + public function quotientAndRemainder() : array + { + return $this->numerator->quotientAndRemainder($this->denominator); + } + + /** + * Returns the sum of this number and the given one. + * + * @param BigNumber|int|float|string $that The number to add. + * + * @return BigRational The result. + * + * @throws MathException If the number is not valid. + */ + public function plus($that) : BigRational + { + $that = BigRational::of($that); + + $numerator = $this->numerator->multipliedBy($that->denominator); + $numerator = $numerator->plus($that->numerator->multipliedBy($this->denominator)); + $denominator = $this->denominator->multipliedBy($that->denominator); + + return new BigRational($numerator, $denominator, false); + } + + /** + * Returns the difference of this number and the given one. + * + * @param BigNumber|int|float|string $that The number to subtract. + * + * @return BigRational The result. + * + * @throws MathException If the number is not valid. + */ + public function minus($that) : BigRational + { + $that = BigRational::of($that); + + $numerator = $this->numerator->multipliedBy($that->denominator); + $numerator = $numerator->minus($that->numerator->multipliedBy($this->denominator)); + $denominator = $this->denominator->multipliedBy($that->denominator); + + return new BigRational($numerator, $denominator, false); + } + + /** + * Returns the product of this number and the given one. + * + * @param BigNumber|int|float|string $that The multiplier. + * + * @return BigRational The result. + * + * @throws MathException If the multiplier is not a valid number. + */ + public function multipliedBy($that) : BigRational + { + $that = BigRational::of($that); + + $numerator = $this->numerator->multipliedBy($that->numerator); + $denominator = $this->denominator->multipliedBy($that->denominator); + + return new BigRational($numerator, $denominator, false); + } + + /** + * Returns the result of the division of this number by the given one. + * + * @param BigNumber|int|float|string $that The divisor. + * + * @return BigRational The result. + * + * @throws MathException If the divisor is not a valid number, or is zero. + */ + public function dividedBy($that) : BigRational + { + $that = BigRational::of($that); + + $numerator = $this->numerator->multipliedBy($that->denominator); + $denominator = $this->denominator->multipliedBy($that->numerator); + + return new BigRational($numerator, $denominator, true); + } + + /** + * Returns this number exponentiated to the given value. + * + * @param int $exponent The exponent. + * + * @return BigRational The result. + * + * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000. + */ + public function power(int $exponent) : BigRational + { + if ($exponent === 0) { + $one = BigInteger::one(); + + return new BigRational($one, $one, false); + } + + if ($exponent === 1) { + return $this; + } + + return new BigRational( + $this->numerator->power($exponent), + $this->denominator->power($exponent), + false + ); + } + + /** + * Returns the reciprocal of this BigRational. + * + * The reciprocal has the numerator and denominator swapped. + * + * @return BigRational + * + * @throws DivisionByZeroException If the numerator is zero. + */ + public function reciprocal() : BigRational + { + return new BigRational($this->denominator, $this->numerator, true); + } + + /** + * Returns the absolute value of this BigRational. + * + * @return BigRational + */ + public function abs() : BigRational + { + return new BigRational($this->numerator->abs(), $this->denominator, false); + } + + /** + * Returns the negated value of this BigRational. + * + * @return BigRational + */ + public function negated() : BigRational + { + return new BigRational($this->numerator->negated(), $this->denominator, false); + } + + /** + * Returns the simplified value of this BigRational. + * + * @return BigRational + */ + public function simplified() : BigRational + { + $gcd = $this->numerator->gcd($this->denominator); + + $numerator = $this->numerator->quotient($gcd); + $denominator = $this->denominator->quotient($gcd); + + return new BigRational($numerator, $denominator, false); + } + + /** + * {@inheritdoc} + */ + public function compareTo($that) : int + { + return $this->minus($that)->getSign(); + } + + /** + * {@inheritdoc} + */ + public function getSign() : int + { + return $this->numerator->getSign(); + } + + /** + * {@inheritdoc} + */ + public function toBigInteger() : BigInteger + { + $simplified = $this->simplified(); + + if (! $simplified->denominator->isEqualTo(1)) { + throw new RoundingNecessaryException('This rational number cannot be represented as an integer value without rounding.'); + } + + return $simplified->numerator; + } + + /** + * {@inheritdoc} + */ + public function toBigDecimal() : BigDecimal + { + return $this->numerator->toBigDecimal()->exactlyDividedBy($this->denominator); + } + + /** + * {@inheritdoc} + */ + public function toBigRational() : BigRational + { + return $this; + } + + /** + * {@inheritdoc} + */ + public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal + { + return $this->numerator->toBigDecimal()->dividedBy($this->denominator, $scale, $roundingMode); + } + + /** + * {@inheritdoc} + */ + public function toInt() : int + { + return $this->toBigInteger()->toInt(); + } + + /** + * {@inheritdoc} + */ + public function toFloat() : float + { + return $this->numerator->toFloat() / $this->denominator->toFloat(); + } + + /** + * {@inheritdoc} + */ + public function __toString() : string + { + $numerator = (string) $this->numerator; + $denominator = (string) $this->denominator; + + if ($denominator === '1') { + return $numerator; + } + + return $this->numerator . '/' . $this->denominator; + } + + /** + * This method is required by interface Serializable and SHOULD NOT be accessed directly. + * + * @internal + * + * @return string + */ + public function serialize() : string + { + return $this->numerator . '/' . $this->denominator; + } + + /** + * This method is only here to implement interface Serializable and cannot be accessed directly. + * + * @internal + * + * @param string $value + * + * @return void + * + * @throws \LogicException + */ + public function unserialize($value) : void + { + if (isset($this->numerator)) { + throw new \LogicException('unserialize() is an internal function, it must not be called directly.'); + } + + [$numerator, $denominator] = \explode('/', $value); + + $this->numerator = BigInteger::of($numerator); + $this->denominator = BigInteger::of($denominator); + } +} diff --git a/vendor/brick/math/src/Exception/DivisionByZeroException.php b/vendor/brick/math/src/Exception/DivisionByZeroException.php new file mode 100644 index 0000000..49a9157 --- /dev/null +++ b/vendor/brick/math/src/Exception/DivisionByZeroException.php @@ -0,0 +1,31 @@ + 126) { + $char = \strtoupper(\dechex($ord)); + + if ($ord < 10) { + $char = '0' . $char; + } + } else { + $char = '"' . $char . '"'; + } + + return new self(sprintf('Char %s is not a valid character in the given alphabet.', $char)); + } +} diff --git a/vendor/brick/math/src/Exception/RoundingNecessaryException.php b/vendor/brick/math/src/Exception/RoundingNecessaryException.php new file mode 100644 index 0000000..1c61005 --- /dev/null +++ b/vendor/brick/math/src/Exception/RoundingNecessaryException.php @@ -0,0 +1,21 @@ +init($a, $b); + + if ($aNeg && ! $bNeg) { + return -1; + } + + if ($bNeg && ! $aNeg) { + return 1; + } + + $aLen = \strlen($aDig); + $bLen = \strlen($bDig); + + if ($aLen < $bLen) { + $result = -1; + } elseif ($aLen > $bLen) { + $result = 1; + } else { + $result = $aDig <=> $bDig; + } + + return $aNeg ? -$result : $result; + } + + /** + * Adds two numbers. + * + * @param string $a The augend. + * @param string $b The addend. + * + * @return string The sum. + */ + abstract public function add(string $a, string $b) : string; + + /** + * Subtracts two numbers. + * + * @param string $a The minuend. + * @param string $b The subtrahend. + * + * @return string The difference. + */ + abstract public function sub(string $a, string $b) : string; + + /** + * Multiplies two numbers. + * + * @param string $a The multiplicand. + * @param string $b The multiplier. + * + * @return string The product. + */ + abstract public function mul(string $a, string $b) : string; + + /** + * Returns the quotient of the division of two numbers. + * + * @param string $a The dividend. + * @param string $b The divisor, must not be zero. + * + * @return string The quotient. + */ + abstract public function divQ(string $a, string $b) : string; + + /** + * Returns the remainder of the division of two numbers. + * + * @param string $a The dividend. + * @param string $b The divisor, must not be zero. + * + * @return string The remainder. + */ + abstract public function divR(string $a, string $b) : string; + + /** + * Returns the quotient and remainder of the division of two numbers. + * + * @param string $a The dividend. + * @param string $b The divisor, must not be zero. + * + * @return string[] An array containing the quotient and remainder. + */ + abstract public function divQR(string $a, string $b) : array; + + /** + * Exponentiates a number. + * + * @param string $a The base number. + * @param int $e The exponent, validated as an integer between 0 and MAX_POWER. + * + * @return string The power. + */ + abstract public function pow(string $a, int $e) : string; + + /** + * Raises a number into power with modulo. + * + * @param string $base The base number; must be positive or zero. + * @param string $exp The exponent; must be positive or zero. + * @param string $mod The modulo; must be strictly positive. + * + * @return string The power. + */ + abstract function powmod(string $base, string $exp, string $mod) : string; + + /** + * Returns the greatest common divisor of the two numbers. + * + * This method can be overridden by the concrete implementation if the underlying library + * has built-in support for GCD calculations. + * + * @param string $a The first number. + * @param string $b The second number. + * + * @return string The GCD, always positive, or zero if both arguments are zero. + */ + public function gcd(string $a, string $b) : string + { + if ($a === '0') { + return $this->abs($b); + } + + if ($b === '0') { + return $this->abs($a); + } + + return $this->gcd($b, $this->divR($a, $b)); + } + + /** + * Returns the square root of the given number, rounded down. + * + * The result is the largest x such that x² ≤ n. + * The input MUST NOT be negative. + * + * @param string $n The number. + * + * @return string The square root. + */ + abstract public function sqrt(string $n) : string; + + /** + * Converts a number from an arbitrary base. + * + * This method can be overridden by the concrete implementation if the underlying library + * has built-in support for base conversion. + * + * @param string $number The number, positive or zero, non-empty, case-insensitively validated for the given base. + * @param int $base The base of the number, validated from 2 to 36. + * + * @return string The converted number, following the Calculator conventions. + */ + public function fromBase(string $number, int $base) : string + { + return $this->fromArbitraryBase(\strtolower($number), self::ALPHABET, $base); + } + + /** + * Converts a number to an arbitrary base. + * + * This method can be overridden by the concrete implementation if the underlying library + * has built-in support for base conversion. + * + * @param string $number The number to convert, following the Calculator conventions. + * @param int $base The base to convert to, validated from 2 to 36. + * + * @return string The converted number, lowercase. + */ + public function toBase(string $number, int $base) : string + { + $negative = ($number[0] === '-'); + + if ($negative) { + $number = \substr($number, 1); + } + + $number = $this->toArbitraryBase($number, self::ALPHABET, $base); + + if ($negative) { + return '-' . $number; + } + + return $number; + } + + /** + * Converts a non-negative number in an arbitrary base using a custom alphabet, to base 10. + * + * @param string $number The number to convert, validated as a non-empty string, + * containing only chars in the given alphabet/base. + * @param string $alphabet The alphabet that contains every digit, validated as 2 chars minimum. + * @param int $base The base of the number, validated from 2 to alphabet length. + * + * @return string The number in base 10, following the Calculator conventions. + */ + final public function fromArbitraryBase(string $number, string $alphabet, int $base) : string + { + // remove leading "zeros" + $number = \ltrim($number, $alphabet[0]); + + if ($number === '') { + return '0'; + } + + // optimize for "one" + if ($number === $alphabet[1]) { + return '1'; + } + + $result = '0'; + $power = '1'; + + $base = (string) $base; + + for ($i = \strlen($number) - 1; $i >= 0; $i--) { + $index = \strpos($alphabet, $number[$i]); + + if ($index !== 0) { + $result = $this->add($result, ($index === 1) + ? $power + : $this->mul($power, (string) $index) + ); + } + + if ($i !== 0) { + $power = $this->mul($power, $base); + } + } + + return $result; + } + + /** + * Converts a non-negative number to an arbitrary base using a custom alphabet. + * + * @param string $number The number to convert, positive or zero, following the Calculator conventions. + * @param string $alphabet The alphabet that contains every digit, validated as 2 chars minimum. + * @param int $base The base to convert to, validated from 2 to alphabet length. + * + * @return string The converted number in the given alphabet. + */ + final public function toArbitraryBase(string $number, string $alphabet, int $base) : string + { + if ($number === '0') { + return $alphabet[0]; + } + + $base = (string) $base; + $result = ''; + + while ($number !== '0') { + [$number, $remainder] = $this->divQR($number, $base); + $remainder = (int) $remainder; + + $result .= $alphabet[$remainder]; + } + + return \strrev($result); + } + + /** + * Performs a rounded division. + * + * Rounding is performed when the remainder of the division is not zero. + * + * @param string $a The dividend. + * @param string $b The divisor. + * @param int $roundingMode The rounding mode. + * + * @return string + * + * @throws \InvalidArgumentException If the rounding mode is invalid. + * @throws RoundingNecessaryException If RoundingMode::UNNECESSARY is provided but rounding is necessary. + */ + final public function divRound(string $a, string $b, int $roundingMode) : string + { + [$quotient, $remainder] = $this->divQR($a, $b); + + $hasDiscardedFraction = ($remainder !== '0'); + $isPositiveOrZero = ($a[0] === '-') === ($b[0] === '-'); + + $discardedFractionSign = function() use ($remainder, $b) : int { + $r = $this->abs($this->mul($remainder, '2')); + $b = $this->abs($b); + + return $this->cmp($r, $b); + }; + + $increment = false; + + switch ($roundingMode) { + case RoundingMode::UNNECESSARY: + if ($hasDiscardedFraction) { + throw RoundingNecessaryException::roundingNecessary(); + } + break; + + case RoundingMode::UP: + $increment = $hasDiscardedFraction; + break; + + case RoundingMode::DOWN: + break; + + case RoundingMode::CEILING: + $increment = $hasDiscardedFraction && $isPositiveOrZero; + break; + + case RoundingMode::FLOOR: + $increment = $hasDiscardedFraction && ! $isPositiveOrZero; + break; + + case RoundingMode::HALF_UP: + $increment = $discardedFractionSign() >= 0; + break; + + case RoundingMode::HALF_DOWN: + $increment = $discardedFractionSign() > 0; + break; + + case RoundingMode::HALF_CEILING: + $increment = $isPositiveOrZero ? $discardedFractionSign() >= 0 : $discardedFractionSign() > 0; + break; + + case RoundingMode::HALF_FLOOR: + $increment = $isPositiveOrZero ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0; + break; + + case RoundingMode::HALF_EVEN: + $lastDigit = (int) $quotient[-1]; + $lastDigitIsEven = ($lastDigit % 2 === 0); + $increment = $lastDigitIsEven ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0; + break; + + default: + throw new \InvalidArgumentException('Invalid rounding mode.'); + } + + if ($increment) { + return $this->add($quotient, $isPositiveOrZero ? '1' : '-1'); + } + + return $quotient; + } + + /** + * Calculates bitwise AND of two numbers. + * + * This method can be overridden by the concrete implementation if the underlying library + * has built-in support for bitwise operations. + * + * @param string $a + * @param string $b + * + * @return string + */ + public function and(string $a, string $b) : string + { + return $this->bitwise('and', $a, $b); + } + + /** + * Calculates bitwise OR of two numbers. + * + * This method can be overridden by the concrete implementation if the underlying library + * has built-in support for bitwise operations. + * + * @param string $a + * @param string $b + * + * @return string + */ + public function or(string $a, string $b) : string + { + return $this->bitwise('or', $a, $b); + } + + /** + * Calculates bitwise XOR of two numbers. + * + * This method can be overridden by the concrete implementation if the underlying library + * has built-in support for bitwise operations. + * + * @param string $a + * @param string $b + * + * @return string + */ + public function xor(string $a, string $b) : string + { + return $this->bitwise('xor', $a, $b); + } + + /** + * Performs a bitwise operation on a decimal number. + * + * @param string $operator The operator to use, must be "and", "or" or "xor". + * @param string $a The left operand. + * @param string $b The right operand. + * + * @return string + */ + private function bitwise(string $operator, string $a, string $b) : string + { + [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); + + $aBin = $this->toBinary($aDig); + $bBin = $this->toBinary($bDig); + + $aLen = \strlen($aBin); + $bLen = \strlen($bBin); + + if ($aLen > $bLen) { + $bBin = \str_repeat("\x00", $aLen - $bLen) . $bBin; + } elseif ($bLen > $aLen) { + $aBin = \str_repeat("\x00", $bLen - $aLen) . $aBin; + } + + if ($aNeg) { + $aBin = $this->twosComplement($aBin); + } + if ($bNeg) { + $bBin = $this->twosComplement($bBin); + } + + switch ($operator) { + case 'and': + $value = $aBin & $bBin; + $negative = ($aNeg and $bNeg); + break; + + case 'or': + $value = $aBin | $bBin; + $negative = ($aNeg or $bNeg); + break; + + case 'xor': + $value = $aBin ^ $bBin; + $negative = ($aNeg xor $bNeg); + break; + + // @codeCoverageIgnoreStart + default: + throw new \InvalidArgumentException('Invalid bitwise operator.'); + // @codeCoverageIgnoreEnd + } + + if ($negative) { + $value = $this->twosComplement($value); + } + + $result = $this->toDecimal($value); + + return $negative ? $this->neg($result) : $result; + } + + /** + * @param string $number A positive, binary number. + * + * @return string + */ + private function twosComplement(string $number) : string + { + $xor = \str_repeat("\xff", \strlen($number)); + + $number = $number ^ $xor; + + for ($i = \strlen($number) - 1; $i >= 0; $i--) { + $byte = \ord($number[$i]); + + if (++$byte !== 256) { + $number[$i] = \chr($byte); + break; + } + + $number[$i] = \chr(0); + } + + return $number; + } + + /** + * Converts a decimal number to a binary string. + * + * @param string $number The number to convert, positive or zero, only digits. + * + * @return string + */ + private function toBinary(string $number) : string + { + $result = ''; + + while ($number !== '0') { + [$number, $remainder] = $this->divQR($number, '256'); + $result .= \chr((int) $remainder); + } + + return \strrev($result); + } + + /** + * Returns the positive decimal representation of a binary number. + * + * @param string $bytes The bytes representing the number. + * + * @return string + */ + private function toDecimal(string $bytes) : string + { + $result = '0'; + $power = '1'; + + for ($i = \strlen($bytes) - 1; $i >= 0; $i--) { + $index = \ord($bytes[$i]); + + if ($index !== 0) { + $result = $this->add($result, ($index === 1) + ? $power + : $this->mul($power, (string) $index) + ); + } + + if ($i !== 0) { + $power = $this->mul($power, '256'); + } + } + + return $result; + } +} diff --git a/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php b/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php new file mode 100644 index 0000000..944ee9e --- /dev/null +++ b/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php @@ -0,0 +1,92 @@ +maxDigits = 9; + break; + + case 8: + $this->maxDigits = 18; + break; + + default: + throw new \RuntimeException('The platform is not 32-bit or 64-bit as expected.'); + } + } + + /** + * {@inheritdoc} + */ + public function add(string $a, string $b) : string + { + $result = $a + $b; + + if (is_int($result)) { + return (string) $result; + } + + if ($a === '0') { + return $b; + } + + if ($b === '0') { + return $a; + } + + [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); + + if ($aNeg === $bNeg) { + $result = $this->doAdd($aDig, $bDig); + } else { + $result = $this->doSub($aDig, $bDig); + } + + if ($aNeg) { + $result = $this->neg($result); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function sub(string $a, string $b) : string + { + return $this->add($a, $this->neg($b)); + } + + /** + * {@inheritdoc} + */ + public function mul(string $a, string $b) : string + { + $result = $a * $b; + + if (is_int($result)) { + return (string) $result; + } + + if ($a === '0' || $b === '0') { + return '0'; + } + + if ($a === '1') { + return $b; + } + + if ($b === '1') { + return $a; + } + + if ($a === '-1') { + return $this->neg($b); + } + + if ($b === '-1') { + return $this->neg($a); + } + + [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); + + $result = $this->doMul($aDig, $bDig); + + if ($aNeg !== $bNeg) { + $result = $this->neg($result); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function divQ(string $a, string $b) : string + { + return $this->divQR($a, $b)[0]; + } + + /** + * {@inheritdoc} + */ + public function divR(string $a, string $b): string + { + return $this->divQR($a, $b)[1]; + } + + /** + * {@inheritdoc} + */ + public function divQR(string $a, string $b) : array + { + if ($a === '0') { + return ['0', '0']; + } + + if ($a === $b) { + return ['1', '0']; + } + + if ($b === '1') { + return [$a, '0']; + } + + if ($b === '-1') { + return [$this->neg($a), '0']; + } + + $na = $a * 1; // cast to number + + if (is_int($na)) { + $nb = $b * 1; + + if (is_int($nb)) { + // the only division that may overflow is PHP_INT_MIN / -1, + // which cannot happen here as we've already handled a divisor of -1 above. + $r = $na % $nb; + $q = ($na - $r) / $nb; + + assert(is_int($q)); + + return [ + (string) $q, + (string) $r + ]; + } + } + + [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); + + [$q, $r] = $this->doDiv($aDig, $bDig); + + if ($aNeg !== $bNeg) { + $q = $this->neg($q); + } + + if ($aNeg) { + $r = $this->neg($r); + } + + return [$q, $r]; + } + + /** + * {@inheritdoc} + */ + public function pow(string $a, int $e) : string + { + if ($e === 0) { + return '1'; + } + + if ($e === 1) { + return $a; + } + + $odd = $e % 2; + $e -= $odd; + + $aa = $this->mul($a, $a); + $result = $this->pow($aa, $e / 2); + + if ($odd === 1) { + $result = $this->mul($result, $a); + } + + return $result; + } + + /** + * Algorithm from: https://www.geeksforgeeks.org/modular-exponentiation-power-in-modular-arithmetic/ + * + * {@inheritdoc} + */ + public function powmod(string $base, string $exp, string $mod) : string + { + // special case: the algorithm below fails with 0 power 0 mod 1 (returns 1 instead of 0) + if ($base === '0' && $exp === '0' && $mod === '1') { + return '0'; + } + + // special case: the algorithm below fails with power 0 mod 1 (returns 1 instead of 0) + if ($exp === '0' && $mod === '1') { + return '0'; + } + + $x = $base; + + $res = '1'; + + // numbers are positive, so we can use remainder instead of modulo + $x = $this->divR($x, $mod); + + while ($exp !== '0') { + if (in_array($exp[-1], ['1', '3', '5', '7', '9'])) { // odd + $res = $this->divR($this->mul($res, $x), $mod); + } + + $exp = $this->divQ($exp, '2'); + $x = $this->divR($this->mul($x, $x), $mod); + } + + return $res; + } + + /** + * Adapted from https://cp-algorithms.com/num_methods/roots_newton.html + * + * {@inheritDoc} + */ + public function sqrt(string $n) : string + { + if ($n === '0') { + return '0'; + } + + // initial approximation + $x = \str_repeat('9', \intdiv(\strlen($n), 2) ?: 1); + + $decreased = false; + + for (;;) { + $nx = $this->divQ($this->add($x, $this->divQ($n, $x)), '2'); + + if ($x === $nx || $this->cmp($nx, $x) > 0 && $decreased) { + break; + } + + $decreased = $this->cmp($nx, $x) < 0; + $x = $nx; + } + + return $x; + } + + /** + * Performs the addition of two non-signed large integers. + * + * @param string $a The first operand. + * @param string $b The second operand. + * + * @return string + */ + private function doAdd(string $a, string $b) : string + { + [$a, $b, $length] = $this->pad($a, $b); + + $carry = 0; + $result = ''; + + for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) { + $blockLength = $this->maxDigits; + + if ($i < 0) { + $blockLength += $i; + $i = 0; + } + + $blockA = \substr($a, $i, $blockLength); + $blockB = \substr($b, $i, $blockLength); + + $sum = (string) ($blockA + $blockB + $carry); + $sumLength = \strlen($sum); + + if ($sumLength > $blockLength) { + $sum = \substr($sum, 1); + $carry = 1; + } else { + if ($sumLength < $blockLength) { + $sum = \str_repeat('0', $blockLength - $sumLength) . $sum; + } + $carry = 0; + } + + $result = $sum . $result; + + if ($i === 0) { + break; + } + } + + if ($carry === 1) { + $result = '1' . $result; + } + + return $result; + } + + /** + * Performs the subtraction of two non-signed large integers. + * + * @param string $a The first operand. + * @param string $b The second operand. + * + * @return string + */ + private function doSub(string $a, string $b) : string + { + if ($a === $b) { + return '0'; + } + + // Ensure that we always subtract to a positive result: biggest minus smallest. + $cmp = $this->doCmp($a, $b); + + $invert = ($cmp === -1); + + if ($invert) { + $c = $a; + $a = $b; + $b = $c; + } + + [$a, $b, $length] = $this->pad($a, $b); + + $carry = 0; + $result = ''; + + $complement = 10 ** $this->maxDigits; + + for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) { + $blockLength = $this->maxDigits; + + if ($i < 0) { + $blockLength += $i; + $i = 0; + } + + $blockA = \substr($a, $i, $blockLength); + $blockB = \substr($b, $i, $blockLength); + + $sum = $blockA - $blockB - $carry; + + if ($sum < 0) { + $sum += $complement; + $carry = 1; + } else { + $carry = 0; + } + + $sum = (string) $sum; + $sumLength = \strlen($sum); + + if ($sumLength < $blockLength) { + $sum = \str_repeat('0', $blockLength - $sumLength) . $sum; + } + + $result = $sum . $result; + + if ($i === 0) { + break; + } + } + + // Carry cannot be 1 when the loop ends, as a > b + assert($carry === 0); + + $result = \ltrim($result, '0'); + + if ($invert) { + $result = $this->neg($result); + } + + return $result; + } + + /** + * Performs the multiplication of two non-signed large integers. + * + * @param string $a The first operand. + * @param string $b The second operand. + * + * @return string + */ + private function doMul(string $a, string $b) : string + { + $x = \strlen($a); + $y = \strlen($b); + + $maxDigits = \intdiv($this->maxDigits, 2); + $complement = 10 ** $maxDigits; + + $result = '0'; + + for ($i = $x - $maxDigits;; $i -= $maxDigits) { + $blockALength = $maxDigits; + + if ($i < 0) { + $blockALength += $i; + $i = 0; + } + + $blockA = (int) \substr($a, $i, $blockALength); + + $line = ''; + $carry = 0; + + for ($j = $y - $maxDigits;; $j -= $maxDigits) { + $blockBLength = $maxDigits; + + if ($j < 0) { + $blockBLength += $j; + $j = 0; + } + + $blockB = (int) \substr($b, $j, $blockBLength); + + $mul = $blockA * $blockB + $carry; + $value = $mul % $complement; + $carry = ($mul - $value) / $complement; + + $value = (string) $value; + $value = \str_pad($value, $maxDigits, '0', STR_PAD_LEFT); + + $line = $value . $line; + + if ($j === 0) { + break; + } + } + + if ($carry !== 0) { + $line = $carry . $line; + } + + $line = \ltrim($line, '0'); + + if ($line !== '') { + $line .= \str_repeat('0', $x - $blockALength - $i); + $result = $this->add($result, $line); + } + + if ($i === 0) { + break; + } + } + + return $result; + } + + /** + * Performs the division of two non-signed large integers. + * + * @param string $a The first operand. + * @param string $b The second operand. + * + * @return string[] The quotient and remainder. + */ + private function doDiv(string $a, string $b) : array + { + $cmp = $this->doCmp($a, $b); + + if ($cmp === -1) { + return ['0', $a]; + } + + $x = \strlen($a); + $y = \strlen($b); + + // we now know that a >= b && x >= y + + $q = '0'; // quotient + $r = $a; // remainder + $z = $y; // focus length, always $y or $y+1 + + for (;;) { + $focus = \substr($a, 0, $z); + + $cmp = $this->doCmp($focus, $b); + + if ($cmp === -1) { + if ($z === $x) { // remainder < dividend + break; + } + + $z++; + } + + $zeros = \str_repeat('0', $x - $z); + + $q = $this->add($q, '1' . $zeros); + $a = $this->sub($a, $b . $zeros); + + $r = $a; + + if ($r === '0') { // remainder == 0 + break; + } + + $x = \strlen($a); + + if ($x < $y) { // remainder < dividend + break; + } + + $z = $y; + } + + return [$q, $r]; + } + + /** + * Compares two non-signed large numbers. + * + * @param string $a The first operand. + * @param string $b The second operand. + * + * @return int [-1, 0, 1] + */ + private function doCmp(string $a, string $b) : int + { + $x = \strlen($a); + $y = \strlen($b); + + $cmp = $x <=> $y; + + if ($cmp !== 0) { + return $cmp; + } + + return \strcmp($a, $b) <=> 0; // enforce [-1, 0, 1] + } + + /** + * Pads the left of one of the given numbers with zeros if necessary to make both numbers the same length. + * + * The numbers must only consist of digits, without leading minus sign. + * + * @param string $a The first operand. + * @param string $b The second operand. + * + * @return array{0: string, 1: string, 2: int} + */ + private function pad(string $a, string $b) : array + { + $x = \strlen($a); + $y = \strlen($b); + + if ($x > $y) { + $b = \str_repeat('0', $x - $y) . $b; + + return [$a, $b, $x]; + } + + if ($x < $y) { + $a = \str_repeat('0', $y - $x) . $a; + + return [$a, $b, $y]; + } + + return [$a, $b, $x]; + } +} diff --git a/vendor/brick/math/src/RoundingMode.php b/vendor/brick/math/src/RoundingMode.php new file mode 100644 index 0000000..06936d8 --- /dev/null +++ b/vendor/brick/math/src/RoundingMode.php @@ -0,0 +1,107 @@ += 0.5; otherwise, behaves as for DOWN. + * Note that this is the rounding mode commonly taught at school. + */ + public const HALF_UP = 5; + + /** + * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. + * + * Behaves as for UP if the discarded fraction is > 0.5; otherwise, behaves as for DOWN. + */ + public const HALF_DOWN = 6; + + /** + * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards positive infinity. + * + * If the result is positive, behaves as for HALF_UP; if negative, behaves as for HALF_DOWN. + */ + public const HALF_CEILING = 7; + + /** + * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards negative infinity. + * + * If the result is positive, behaves as for HALF_DOWN; if negative, behaves as for HALF_UP. + */ + public const HALF_FLOOR = 8; + + /** + * Rounds towards the "nearest neighbor" unless both neighbors are equidistant, in which case rounds towards the even neighbor. + * + * Behaves as for HALF_UP if the digit to the left of the discarded fraction is odd; + * behaves as for HALF_DOWN if it's even. + * + * Note that this is the rounding mode that statistically minimizes + * cumulative error when applied repeatedly over a sequence of calculations. + * It is sometimes known as "Banker's rounding", and is chiefly used in the USA. + */ + public const HALF_EVEN = 9; +} diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php new file mode 100644 index 0000000..247294d --- /dev/null +++ b/vendor/composer/ClassLoader.php @@ -0,0 +1,479 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + private $vendorDir; + + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + private static $registeredLoaders = array(); + + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..29e39ce --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,1533 @@ + + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'fda7245f7ca95deedb11dff95b8e6ff9702c2ac1', + 'name' => 'laravel/laravel', + ), + 'versions' => + array ( + 'asm89/stack-cors' => + array ( + 'pretty_version' => '1.3.0', + 'version' => '1.3.0.0', + 'aliases' => + array ( + ), + 'reference' => 'b9c31def6a83f84b4d4a40d35996d375755f0e08', + ), + 'brick/math' => + array ( + 'pretty_version' => '0.8.15', + 'version' => '0.8.15.0', + 'aliases' => + array ( + ), + 'reference' => '9b08d412b9da9455b210459ff71414de7e6241cd', + ), + 'cordoval/hamcrest-php' => + array ( + 'replaced' => + array ( + 0 => '*', + ), + ), + 'davedevelopment/hamcrest-php' => + array ( + 'replaced' => + array ( + 0 => '*', + ), + ), + 'dnoegel/php-xdg-base-dir' => + array ( + 'pretty_version' => 'v0.1.1', + 'version' => '0.1.1.0', + 'aliases' => + array ( + ), + 'reference' => '8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd', + ), + 'doctrine/inflector' => + array ( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '9cf661f4eb38f7c881cac67c75ea9b00bf97b210', + ), + 'doctrine/instantiator' => + array ( + 'pretty_version' => '1.3.1', + 'version' => '1.3.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f350df0268e904597e3bd9c4685c53e0e333feea', + ), + 'doctrine/lexer' => + array ( + 'pretty_version' => '1.2.1', + 'version' => '1.2.1.0', + 'aliases' => + array ( + ), + 'reference' => 'e864bbf5904cb8f5bb334f99209b48018522f042', + ), + 'dragonmantank/cron-expression' => + array ( + 'pretty_version' => 'v2.3.0', + 'version' => '2.3.0.0', + 'aliases' => + array ( + ), + 'reference' => '72b6fbf76adb3cf5bc0db68559b33d41219aba27', + ), + 'egulias/email-validator' => + array ( + 'pretty_version' => '2.1.18', + 'version' => '2.1.18.0', + 'aliases' => + array ( + ), + 'reference' => 'cfa3d44471c7f5bfb684ac2b0da7114283d78441', + ), + 'facade/flare-client-php' => + array ( + 'pretty_version' => '1.3.2', + 'version' => '1.3.2.0', + 'aliases' => + array ( + ), + 'reference' => 'db1e03426e7f9472c9ecd1092aff00f56aa6c004', + ), + 'facade/ignition' => + array ( + 'pretty_version' => '2.0.7', + 'version' => '2.0.7.0', + 'aliases' => + array ( + ), + 'reference' => 'e6bedc1e74507d584fbcb041ebe0f7f215109cf2', + ), + 'facade/ignition-contracts' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'f445db0fb86f48e205787b2592840dd9c80ded28', + ), + 'fideloper/proxy' => + array ( + 'pretty_version' => '4.3.0', + 'version' => '4.3.0.0', + 'aliases' => + array ( + ), + 'reference' => 'ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a', + ), + 'filp/whoops' => + array ( + 'pretty_version' => '2.7.3', + 'version' => '2.7.3.0', + 'aliases' => + array ( + ), + 'reference' => '5d5fe9bb3d656b514d455645b3addc5f7ba7714d', + ), + 'fruitcake/laravel-cors' => + array ( + 'pretty_version' => 'v1.0.6', + 'version' => '1.0.6.0', + 'aliases' => + array ( + ), + 'reference' => '1d127dbec313e2e227d65e0c483765d8d7559bf6', + ), + 'fzaninotto/faker' => + array ( + 'pretty_version' => 'v1.9.1', + 'version' => '1.9.1.0', + 'aliases' => + array ( + ), + 'reference' => 'fc10d778e4b84d5bd315dad194661e091d307c6f', + ), + 'guzzlehttp/guzzle' => + array ( + 'pretty_version' => '6.5.5', + 'version' => '6.5.5.0', + 'aliases' => + array ( + ), + 'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e', + ), + 'guzzlehttp/promises' => + array ( + 'pretty_version' => 'v1.3.1', + 'version' => '1.3.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a59da6cf61d80060647ff4d3eb2c03a2bc694646', + ), + 'guzzlehttp/psr7' => + array ( + 'pretty_version' => '1.6.1', + 'version' => '1.6.1.0', + 'aliases' => + array ( + ), + 'reference' => '239400de7a173fe9901b9ac7c06497751f00727a', + ), + 'hamcrest/hamcrest-php' => + array ( + 'pretty_version' => 'v2.0.0', + 'version' => '2.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '776503d3a8e85d4f9a1148614f95b7a608b046ad', + ), + 'illuminate/auth' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/broadcasting' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/bus' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/cache' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/config' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/console' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/container' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/contracts' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/cookie' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/database' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/encryption' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/events' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/filesystem' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/hashing' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/http' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/log' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/mail' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/notifications' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/pagination' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/pipeline' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/queue' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/redis' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/routing' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/session' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/support' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/testing' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/translation' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/validation' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/view' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'kodova/hamcrest-php' => + array ( + 'replaced' => + array ( + 0 => '*', + ), + ), + 'laravel/framework' => + array ( + 'pretty_version' => 'v7.16.1', + 'version' => '7.16.1.0', + 'aliases' => + array ( + ), + 'reference' => 'dc9cd8338d222dec2d9962553639e08c4585fa5b', + ), + 'laravel/laravel' => + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'fda7245f7ca95deedb11dff95b8e6ff9702c2ac1', + ), + 'laravel/sanctum' => + array ( + 'pretty_version' => 'v2.4.2', + 'version' => '2.4.2.0', + 'aliases' => + array ( + ), + 'reference' => 'cf07490b92e07ee6206f712d4502e8a2a41f5049', + ), + 'laravel/tinker' => + array ( + 'pretty_version' => 'v2.4.0', + 'version' => '2.4.0.0', + 'aliases' => + array ( + ), + 'reference' => 'cde90a7335a2130a4488beb68f4b2141869241db', + ), + 'laravel/ui' => + array ( + 'pretty_version' => 'v2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '15368c5328efb7ce94f35ca750acde9b496ab1b1', + ), + 'league/commonmark' => + array ( + 'pretty_version' => '1.4.3', + 'version' => '1.4.3.0', + 'aliases' => + array ( + ), + 'reference' => '412639f7cfbc0b31ad2455b2fe965095f66ae505', + ), + 'league/flysystem' => + array ( + 'pretty_version' => '1.0.69', + 'version' => '1.0.69.0', + 'aliases' => + array ( + ), + 'reference' => '7106f78428a344bc4f643c233a94e48795f10967', + ), + 'maatwebsite/excel' => + array ( + 'pretty_version' => '3.1.19', + 'version' => '3.1.19.0', + 'aliases' => + array ( + ), + 'reference' => '96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c', + ), + 'maennchen/zipstream-php' => + array ( + 'pretty_version' => '2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => 'c4c5803cc1f93df3d2448478ef79394a5981cc58', + ), + 'markbaker/complex' => + array ( + 'pretty_version' => '1.4.8', + 'version' => '1.4.8.0', + 'aliases' => + array ( + ), + 'reference' => '8eaa40cceec7bf0518187530b2e63871be661b72', + ), + 'markbaker/matrix' => + array ( + 'pretty_version' => '1.2.0', + 'version' => '1.2.0.0', + 'aliases' => + array ( + ), + 'reference' => '5348c5a67e3b75cd209d70103f916a93b1f1ed21', + ), + 'mockery/mockery' => + array ( + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '6c6a7c533469873deacf998237e7649fc6b36223', + ), + 'monolog/monolog' => + array ( + 'pretty_version' => '2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '38914429aac460e8e4616c8cb486ecb40ec90bb1', + ), + 'myclabs/deep-copy' => + array ( + 'pretty_version' => '1.9.5', + 'version' => '1.9.5.0', + 'aliases' => + array ( + ), + 'reference' => 'b2c28789e80a97badd14145fda39b545d83ca3ef', + 'replaced' => + array ( + 0 => '1.9.5', + ), + ), + 'myclabs/php-enum' => + array ( + 'pretty_version' => '1.7.6', + 'version' => '1.7.6.0', + 'aliases' => + array ( + ), + 'reference' => '5f36467c7a87e20fbdc51e524fd8f9d1de80187c', + ), + 'nesbot/carbon' => + array ( + 'pretty_version' => '2.35.0', + 'version' => '2.35.0.0', + 'aliases' => + array ( + ), + 'reference' => '4b9bd835261ef23d36397a46a76b496a458305e5', + ), + 'nikic/php-parser' => + array ( + 'pretty_version' => 'v4.5.0', + 'version' => '4.5.0.0', + 'aliases' => + array ( + ), + 'reference' => '53c2753d756f5adb586dca79c2ec0e2654dd9463', + ), + 'nunomaduro/collision' => + array ( + 'pretty_version' => 'v4.2.0', + 'version' => '4.2.0.0', + 'aliases' => + array ( + ), + 'reference' => 'd50490417eded97be300a92cd7df7badc37a9018', + ), + 'opis/closure' => + array ( + 'pretty_version' => '3.5.5', + 'version' => '3.5.5.0', + 'aliases' => + array ( + ), + 'reference' => 'dec9fc5ecfca93f45cd6121f8e6f14457dff372c', + ), + 'phar-io/manifest' => + array ( + 'pretty_version' => '1.0.3', + 'version' => '1.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '7761fcacf03b4d4f16e7ccb606d4879ca431fcf4', + ), + 'phar-io/version' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '45a2ec53a73c70ce41d55cedef9063630abaf1b6', + ), + 'phpdocumentor/reflection-common' => + array ( + 'pretty_version' => '2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '6568f4687e5b41b054365f9ae03fcb1ed5f2069b', + ), + 'phpdocumentor/reflection-docblock' => + array ( + 'pretty_version' => '5.1.0', + 'version' => '5.1.0.0', + 'aliases' => + array ( + ), + 'reference' => 'cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e', + ), + 'phpdocumentor/type-resolver' => + array ( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '7462d5f123dfc080dfdf26897032a6513644fc95', + ), + 'phpoffice/phpspreadsheet' => + array ( + 'pretty_version' => '1.13.0', + 'version' => '1.13.0.0', + 'aliases' => + array ( + ), + 'reference' => '21bfb5b3243b8ceb9eda499a4d699fc42c11a9d1', + ), + 'phpoption/phpoption' => + array ( + 'pretty_version' => '1.7.4', + 'version' => '1.7.4.0', + 'aliases' => + array ( + ), + 'reference' => 'b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3', + ), + 'phpspec/prophecy' => + array ( + 'pretty_version' => 'v1.10.3', + 'version' => '1.10.3.0', + 'aliases' => + array ( + ), + 'reference' => '451c3cd1418cf640de218914901e51b064abb093', + ), + 'phpunit/php-code-coverage' => + array ( + 'pretty_version' => '7.0.10', + 'version' => '7.0.10.0', + 'aliases' => + array ( + ), + 'reference' => 'f1884187926fbb755a9aaf0b3836ad3165b478bf', + ), + 'phpunit/php-file-iterator' => + array ( + 'pretty_version' => '2.0.2', + 'version' => '2.0.2.0', + 'aliases' => + array ( + ), + 'reference' => '050bedf145a257b1ff02746c31894800e5122946', + ), + 'phpunit/php-text-template' => + array ( + 'pretty_version' => '1.2.1', + 'version' => '1.2.1.0', + 'aliases' => + array ( + ), + 'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', + ), + 'phpunit/php-timer' => + array ( + 'pretty_version' => '2.1.2', + 'version' => '2.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '1038454804406b0b5f5f520358e78c1c2f71501e', + ), + 'phpunit/php-token-stream' => + array ( + 'pretty_version' => '3.1.1', + 'version' => '3.1.1.0', + 'aliases' => + array ( + ), + 'reference' => '995192df77f63a59e47f025390d2d1fdf8f425ff', + ), + 'phpunit/phpunit' => + array ( + 'pretty_version' => '8.5.6', + 'version' => '8.5.6.0', + 'aliases' => + array ( + ), + 'reference' => '3f9c4079d1407cd84c51c02c6ad1df6ec2ed1348', + ), + 'prettus/l5-repository' => + array ( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'aliases' => + array ( + ), + 'reference' => '7f798a8fbe502ea52d7f14deb985daf94298cc22', + ), + 'prettus/laravel-validation' => + array ( + 'pretty_version' => '1.2.2', + 'version' => '1.2.2.0', + 'aliases' => + array ( + ), + 'reference' => '3d43037c2f497df3f8fbf3d8c16954a83c72e530', + ), + 'psr/container' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', + ), + 'psr/container-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/event-dispatcher' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', + ), + 'psr/event-dispatcher-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/http-message' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + ), + 'psr/http-message-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', + ), + 'psr/log-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + 1 => '1.0.0', + ), + ), + 'psr/simple-cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + ), + 'psy/psysh' => + array ( + 'pretty_version' => 'v0.10.4', + 'version' => '0.10.4.0', + 'aliases' => + array ( + ), + 'reference' => 'a8aec1b2981ab66882a01cce36a49b6317dc3560', + ), + 'ralouphie/getallheaders' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', + ), + 'ramsey/collection' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca', + ), + 'ramsey/uuid' => + array ( + 'pretty_version' => '4.0.1', + 'version' => '4.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d', + ), + 'rhumsaa/uuid' => + array ( + 'replaced' => + array ( + 0 => '4.0.1', + ), + ), + 'scrivo/highlight.php' => + array ( + 'pretty_version' => 'v9.18.1.1', + 'version' => '9.18.1.1', + 'aliases' => + array ( + ), + 'reference' => '52fc21c99fd888e33aed4879e55a3646f8d40558', + ), + 'sebastian/code-unit-reverse-lookup' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '4419fcdb5eabb9caa61a27c7a1db532a6b55dd18', + ), + 'sebastian/comparator' => + array ( + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', + 'aliases' => + array ( + ), + 'reference' => '5de4fc177adf9bce8df98d8d141a7559d7ccf6da', + ), + 'sebastian/diff' => + array ( + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', + 'aliases' => + array ( + ), + 'reference' => '720fcc7e9b5cf384ea68d9d930d480907a0c1a29', + ), + 'sebastian/environment' => + array ( + 'pretty_version' => '4.2.3', + 'version' => '4.2.3.0', + 'aliases' => + array ( + ), + 'reference' => '464c90d7bdf5ad4e8a6aea15c091fec0603d4368', + ), + 'sebastian/exporter' => + array ( + 'pretty_version' => '3.1.2', + 'version' => '3.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '68609e1261d215ea5b21b7987539cbfbe156ec3e', + ), + 'sebastian/global-state' => + array ( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4', + ), + 'sebastian/object-enumerator' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '7cfd9e65d11ffb5af41198476395774d4c8a84c5', + ), + 'sebastian/object-reflector' => + array ( + 'pretty_version' => '1.1.1', + 'version' => '1.1.1.0', + 'aliases' => + array ( + ), + 'reference' => '773f97c67f28de00d397be301821b06708fca0be', + ), + 'sebastian/recursion-context' => + array ( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8', + ), + 'sebastian/resource-operations' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '4d7a795d35b889bf80a0cc04e08d77cedfa917a9', + ), + 'sebastian/type' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '3aaaa15fa71d27650d62a948be022fe3b48541a3', + ), + 'sebastian/version' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', + ), + 'spatie/laravel-permission' => + array ( + 'pretty_version' => '3.13.0', + 'version' => '3.13.0.0', + 'aliases' => + array ( + ), + 'reference' => '49b8063fbb9ec52ebef98cc6ec527a80d8853141', + ), + 'swiftmailer/swiftmailer' => + array ( + 'pretty_version' => 'v6.2.3', + 'version' => '6.2.3.0', + 'aliases' => + array ( + ), + 'reference' => '149cfdf118b169f7840bbe3ef0d4bc795d1780c9', + ), + 'symfony/console' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '34ac555a3627e324b660e318daa07572e1140123', + ), + 'symfony/css-selector' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'e544e24472d4c97b2d11ade7caacd446727c6bf9', + ), + 'symfony/deprecation-contracts' => + array ( + 'pretty_version' => 'v2.1.3', + 'version' => '2.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '5e20b83385a77593259c9f8beb2c43cd03b2ac14', + ), + 'symfony/error-handler' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '525636d4b84e06c6ca72d96b6856b5b169416e6a', + ), + 'symfony/event-dispatcher' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '94871fc0a69c3c5da57764187724cdce0755899c', + ), + 'symfony/event-dispatcher-contracts' => + array ( + 'pretty_version' => 'v2.1.3', + 'version' => '2.1.3.0', + 'aliases' => + array ( + ), + 'reference' => 'f6f613d74cfc5a623fc36294d3451eb7fa5a042b', + ), + 'symfony/event-dispatcher-implementation' => + array ( + 'provided' => + array ( + 0 => '2.0', + ), + ), + 'symfony/finder' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '4298870062bfc667cb78d2b379be4bf5dec5f187', + ), + 'symfony/http-foundation' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '41a4647f12870e9d41d9a7d72ff0614a27208558', + ), + 'symfony/http-kernel' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '3e32676e6cb5d2081c91a56783471ff8a7f7110b', + ), + 'symfony/mime' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'c0c418f05e727606e85b482a8591519c4712cf45', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => '1c302646f6efc070cd46856e600e5e0684d6b454', + ), + 'symfony/polyfill-iconv' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => 'c4de7601eefbf25f9d47190abe07f79fe0a27424', + ), + 'symfony/polyfill-intl-grapheme' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => 'e094b0770f7833fdf257e6ba4775be4e258230b2', + ), + 'symfony/polyfill-intl-idn' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => '3bff59ea7047e925be6b7f2059d60af31bb46d6a', + ), + 'symfony/polyfill-intl-normalizer' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => '1357b1d168eb7f68ad6a134838e46b0b159444a9', + ), + 'symfony/polyfill-mbstring' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a6977d63bf9a0ad4c65cd352709e230876f9904a', + ), + 'symfony/polyfill-php72' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => 'f048e612a3905f34931127360bdd2def19a5e582', + ), + 'symfony/polyfill-php73' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => 'fffa1a52a023e782cdcc221d781fe1ec8f87fcca', + ), + 'symfony/polyfill-php80' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => 'd87d5766cbf48d72388a9f6b85f280c8ad51f981', + ), + 'symfony/process' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1', + ), + 'symfony/routing' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'bbd0ba121d623f66d165a55a108008968911f3eb', + ), + 'symfony/service-contracts' => + array ( + 'pretty_version' => 'v2.1.2', + 'version' => '2.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '66a8f0957a3ca54e4f724e49028ab19d75a8918b', + ), + 'symfony/string' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'ac70459db781108db7c6d8981dd31ce0e29e3298', + ), + 'symfony/translation' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'd387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2', + ), + 'symfony/translation-contracts' => + array ( + 'pretty_version' => 'v2.1.2', + 'version' => '2.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'e5ca07c8f817f865f618aa072c2fe8e0e637340e', + ), + 'symfony/translation-implementation' => + array ( + 'provided' => + array ( + 0 => '2.0', + ), + ), + 'symfony/var-dumper' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => 'b43a3905262bcf97b2510f0621f859ca4f5287be', + ), + 'theseer/tokenizer' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '11336f6f84e16a720dae9d8e6ed5019efa85a0f9', + ), + 'tijsverkoyen/css-to-inline-styles' => + array ( + 'pretty_version' => '2.2.2', + 'version' => '2.2.2.0', + 'aliases' => + array ( + ), + 'reference' => 'dda2ee426acd6d801d5b7fd1001cde9b5f790e15', + ), + 'vlucas/phpdotenv' => + array ( + 'pretty_version' => 'v4.1.7', + 'version' => '4.1.7.0', + 'aliases' => + array ( + ), + 'reference' => 'db63b2ea280fdcf13c4ca392121b0b2450b51193', + ), + 'voku/portable-ascii' => + array ( + 'pretty_version' => '1.5.2', + 'version' => '1.5.2.0', + 'aliases' => + array ( + ), + 'reference' => '618631dc601d8eb6ea0a9fbf654ec82f066c4e97', + ), + 'webmozart/assert' => + array ( + 'pretty_version' => '1.9.0', + 'version' => '1.9.0.0', + 'aliases' => + array ( + ), + 'reference' => '9dc4f203e36f2b486149058bade43c851dd97451', + ), + ), +); +private static $canGetVendors; +private static $installedByVendor = array(); + + + + + + + +public static function getInstalledPackages() +{ +$packages = array(); +foreach (self::getInstalled() as $installed) { +$packages[] = array_keys($installed['versions']); +} + + +if (1 === \count($packages)) { +return $packages[0]; +} + +return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); +} + + + + + + + + + +public static function isInstalled($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (isset($installed['versions'][$packageName])) { +return true; +} +} + +return false; +} + + + + + + + + + + + + + + +public static function satisfies(VersionParser $parser, $packageName, $constraint) +{ +$constraint = $parser->parseConstraints($constraint); +$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + +return $provided->matches($constraint); +} + + + + + + + + + + +public static function getVersionRanges($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +$ranges = array(); +if (isset($installed['versions'][$packageName]['pretty_version'])) { +$ranges[] = $installed['versions'][$packageName]['pretty_version']; +} +if (array_key_exists('aliases', $installed['versions'][$packageName])) { +$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); +} +if (array_key_exists('replaced', $installed['versions'][$packageName])) { +$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); +} +if (array_key_exists('provided', $installed['versions'][$packageName])) { +$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); +} + +return implode(' || ', $ranges); +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getVersion($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +if (!isset($installed['versions'][$packageName]['version'])) { +return null; +} + +return $installed['versions'][$packageName]['version']; +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getPrettyVersion($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +if (!isset($installed['versions'][$packageName]['pretty_version'])) { +return null; +} + +return $installed['versions'][$packageName]['pretty_version']; +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getReference($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +if (!isset($installed['versions'][$packageName]['reference'])) { +return null; +} + +return $installed['versions'][$packageName]['reference']; +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getRootPackage() +{ +$installed = self::getInstalled(); + +return $installed[0]['root']; +} + + + + + + + +public static function getRawData() +{ +return self::$installed; +} + + + + + + + + + + + + + + + + + + + +public static function reload($data) +{ +self::$installed = $data; +self::$installedByVendor = array(); +} + + + + +private static function getInstalled() +{ +if (null === self::$canGetVendors) { +self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); +} + +$installed = array(); + +if (self::$canGetVendors) { +foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { +if (isset(self::$installedByVendor[$vendorDir])) { +$installed[] = self::$installedByVendor[$vendorDir]; +} elseif (is_file($vendorDir.'/composer/installed.php')) { +$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; +} +} +} + +$installed[] = self::$installed; + +return $installed; +} +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..e354f61 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,4979 @@ + $baseDir . '/app/Casts/Json.php', + 'App\\Console\\Kernel' => $baseDir . '/app/Console/Kernel.php', + 'App\\Contracts\\Repositories\\AttachmentRepository' => $baseDir . '/app/Contracts/Repositories/AttachmentRepository.php', + 'App\\Contracts\\Repositories\\BookRepository' => $baseDir . '/app/Contracts/Repositories/BookRepository.php', + 'App\\Contracts\\Repositories\\DepartmentRepository' => $baseDir . '/app/Contracts/Repositories/DepartmentRepository.php', + 'App\\Contracts\\Repositories\\DocumentRepository' => $baseDir . '/app/Contracts/Repositories/DocumentRepository.php', + 'App\\Contracts\\Repositories\\DocumentTypeRepository' => $baseDir . '/app/Contracts/Repositories/DocumentTypeRepository.php', + 'App\\Contracts\\Repositories\\OrganizeRepository' => $baseDir . '/app/Contracts/Repositories/OrganizeRepository.php', + 'App\\Contracts\\Repositories\\PermissionRepository' => $baseDir . '/app/Contracts/Repositories/PermissionRepository.php', + 'App\\Contracts\\Repositories\\RoleRepository' => $baseDir . '/app/Contracts/Repositories/RoleRepository.php', + 'App\\Contracts\\Repositories\\SignerRepository' => $baseDir . '/app/Contracts/Repositories/SignerRepository.php', + 'App\\Contracts\\Repositories\\TitleRepository' => $baseDir . '/app/Contracts/Repositories/TitleRepository.php', + 'App\\Contracts\\Repositories\\UserRepository' => $baseDir . '/app/Contracts/Repositories/UserRepository.php', + 'App\\Criteria\\DocumentCriteria' => $baseDir . '/app/Criteria/DocumentCriteria.php', + 'App\\Entities\\Attachment' => $baseDir . '/app/Entities/Attachment.php', + 'App\\Entities\\Book' => $baseDir . '/app/Entities/Book.php', + 'App\\Entities\\Department' => $baseDir . '/app/Entities/Department.php', + 'App\\Entities\\Document' => $baseDir . '/app/Entities/Document.php', + 'App\\Entities\\DocumentType' => $baseDir . '/app/Entities/DocumentType.php', + 'App\\Entities\\Organize' => $baseDir . '/app/Entities/Organize.php', + 'App\\Entities\\Signer' => $baseDir . '/app/Entities/Signer.php', + 'App\\Entities\\Title' => $baseDir . '/app/Entities/Title.php', + 'App\\Entities\\User' => $baseDir . '/app/Entities/User.php', + 'App\\Events\\ActionCalled' => $baseDir . '/app/Events/ActionCalled.php', + 'App\\Events\\UserViewedDocument' => $baseDir . '/app/Events/UserViewedDocument.php', + 'App\\Events\\UsersReceivedDocument' => $baseDir . '/app/Events/UsersReceivedDocument.php', + 'App\\Exceptions\\AccountNotActive' => $baseDir . '/app/Exceptions/AccountNotActive.php', + 'App\\Exceptions\\ActionNotFound' => $baseDir . '/app/Exceptions/ActionNotFound.php', + 'App\\Exceptions\\Handler' => $baseDir . '/app/Exceptions/Handler.php', + 'App\\Exceptions\\RelationIdsNotAllow' => $baseDir . '/app/Exceptions/RelationIdsNotAllow.php', + 'App\\Exceptions\\RelationNotAllow' => $baseDir . '/app/Exceptions/RelationNotAllow.php', + 'App\\Exceptions\\UserIdIncorrectFormat' => $baseDir . '/app/Exceptions/UserIdIncorrectFormat.php', + 'App\\Exports\\BaseDocumentsExport' => $baseDir . '/app/Exports/BaseDocumentsExport.php', + 'App\\Exports\\BooksExport' => $baseDir . '/app/Exports/BooksExport.php', + 'App\\Exports\\ComeInDocumentsExport' => $baseDir . '/app/Exports/ComeInDocumentsExport.php', + 'App\\Exports\\ComeOutDocumentsExport' => $baseDir . '/app/Exports/ComeOutDocumentsExport.php', + 'App\\Exports\\PrivateDocumentsExport' => $baseDir . '/app/Exports/PrivateDocumentsExport.php', + 'App\\Exports\\UsersExport' => $baseDir . '/app/Exports/UsersExport.php', + 'App\\Fakers\\AbstractDocumentFacker' => $baseDir . '/app/Fakers/AbstractDocumentFacker.php', + 'App\\Http\\Controllers\\Api\\AttachmentsController' => $baseDir . '/app/Http/Controllers/Api/AttachmentsController.php', + 'App\\Http\\Controllers\\Api\\BooksController' => $baseDir . '/app/Http/Controllers/Api/BooksController.php', + 'App\\Http\\Controllers\\Api\\DepartmentsController' => $baseDir . '/app/Http/Controllers/Api/DepartmentsController.php', + 'App\\Http\\Controllers\\Api\\DocumentTypesController' => $baseDir . '/app/Http/Controllers/Api/DocumentTypesController.php', + 'App\\Http\\Controllers\\Api\\DocumentsController' => $baseDir . '/app/Http/Controllers/Api/DocumentsController.php', + 'App\\Http\\Controllers\\Api\\MeController' => $baseDir . '/app/Http/Controllers/Api/MeController.php', + 'App\\Http\\Controllers\\Api\\NotificationsController' => $baseDir . '/app/Http/Controllers/Api/NotificationsController.php', + 'App\\Http\\Controllers\\Api\\OrganizesController' => $baseDir . '/app/Http/Controllers/Api/OrganizesController.php', + 'App\\Http\\Controllers\\Api\\PermissionsController' => $baseDir . '/app/Http/Controllers/Api/PermissionsController.php', + 'App\\Http\\Controllers\\Api\\ReportsController' => $baseDir . '/app/Http/Controllers/Api/ReportsController.php', + 'App\\Http\\Controllers\\Api\\RolesController' => $baseDir . '/app/Http/Controllers/Api/RolesController.php', + 'App\\Http\\Controllers\\Api\\SignersController' => $baseDir . '/app/Http/Controllers/Api/SignersController.php', + 'App\\Http\\Controllers\\Api\\TitlesController' => $baseDir . '/app/Http/Controllers/Api/TitlesController.php', + 'App\\Http\\Controllers\\Api\\UsersController' => $baseDir . '/app/Http/Controllers/Api/UsersController.php', + 'App\\Http\\Controllers\\Auth\\ConfirmPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ConfirmPasswordController.php', + 'App\\Http\\Controllers\\Auth\\ForgotPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ForgotPasswordController.php', + 'App\\Http\\Controllers\\Auth\\LoginController' => $baseDir . '/app/Http/Controllers/Auth/LoginController.php', + 'App\\Http\\Controllers\\Auth\\RegisterController' => $baseDir . '/app/Http/Controllers/Auth/RegisterController.php', + 'App\\Http\\Controllers\\Auth\\ResetPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ResetPasswordController.php', + 'App\\Http\\Controllers\\Auth\\VerificationController' => $baseDir . '/app/Http/Controllers/Auth/VerificationController.php', + 'App\\Http\\Controllers\\Controller' => $baseDir . '/app/Http/Controllers/Controller.php', + 'App\\Http\\Controllers\\HomeController' => $baseDir . '/app/Http/Controllers/HomeController.php', + 'App\\Http\\Kernel' => $baseDir . '/app/Http/Kernel.php', + 'App\\Http\\Middleware\\Authenticate' => $baseDir . '/app/Http/Middleware/Authenticate.php', + 'App\\Http\\Middleware\\CheckForMaintenanceMode' => $baseDir . '/app/Http/Middleware/CheckForMaintenanceMode.php', + 'App\\Http\\Middleware\\EncryptCookies' => $baseDir . '/app/Http/Middleware/EncryptCookies.php', + 'App\\Http\\Middleware\\EnsureUserIsActive' => $baseDir . '/app/Http/Middleware/EnsureUserIsActive.php', + 'App\\Http\\Middleware\\RedirectIfAuthenticated' => $baseDir . '/app/Http/Middleware/RedirectIfAuthenticated.php', + 'App\\Http\\Middleware\\TrimStrings' => $baseDir . '/app/Http/Middleware/TrimStrings.php', + 'App\\Http\\Middleware\\TrustProxies' => $baseDir . '/app/Http/Middleware/TrustProxies.php', + 'App\\Http\\Middleware\\VerifyCsrfToken' => $baseDir . '/app/Http/Middleware/VerifyCsrfToken.php', + 'App\\Http\\Requests\\Attachment\\CreateRequest' => $baseDir . '/app/Http/Requests/Attachment/CreateRequest.php', + 'App\\Http\\Requests\\Attachment\\DestroyRequest' => $baseDir . '/app/Http/Requests/Attachment/DestroyRequest.php', + 'App\\Http\\Requests\\Attachment\\IndexRequest' => $baseDir . '/app/Http/Requests/Attachment/IndexRequest.php', + 'App\\Http\\Requests\\Attachment\\ShowRequest' => $baseDir . '/app/Http/Requests/Attachment/ShowRequest.php', + 'App\\Http\\Requests\\Attachment\\UpdateRequest' => $baseDir . '/app/Http/Requests/Attachment/UpdateRequest.php', + 'App\\Http\\Requests\\Book\\CreateRequest' => $baseDir . '/app/Http/Requests/Book/CreateRequest.php', + 'App\\Http\\Requests\\Book\\DestroyRequest' => $baseDir . '/app/Http/Requests/Book/DestroyRequest.php', + 'App\\Http\\Requests\\Book\\IndexRequest' => $baseDir . '/app/Http/Requests/Book/IndexRequest.php', + 'App\\Http\\Requests\\Book\\ShowRequest' => $baseDir . '/app/Http/Requests/Book/ShowRequest.php', + 'App\\Http\\Requests\\Book\\UpdateRequest' => $baseDir . '/app/Http/Requests/Book/UpdateRequest.php', + 'App\\Http\\Requests\\Department\\CreateRequest' => $baseDir . '/app/Http/Requests/Department/CreateRequest.php', + 'App\\Http\\Requests\\Department\\DestroyRequest' => $baseDir . '/app/Http/Requests/Department/DestroyRequest.php', + 'App\\Http\\Requests\\Department\\IndexRequest' => $baseDir . '/app/Http/Requests/Department/IndexRequest.php', + 'App\\Http\\Requests\\Department\\ShowRequest' => $baseDir . '/app/Http/Requests/Department/ShowRequest.php', + 'App\\Http\\Requests\\Department\\UpdateRequest' => $baseDir . '/app/Http/Requests/Department/UpdateRequest.php', + 'App\\Http\\Requests\\DocumentType\\CreateRequest' => $baseDir . '/app/Http/Requests/DocumentType/CreateRequest.php', + 'App\\Http\\Requests\\DocumentType\\DestroyRequest' => $baseDir . '/app/Http/Requests/DocumentType/DestroyRequest.php', + 'App\\Http\\Requests\\DocumentType\\IndexRequest' => $baseDir . '/app/Http/Requests/DocumentType/IndexRequest.php', + 'App\\Http\\Requests\\DocumentType\\ShowRequest' => $baseDir . '/app/Http/Requests/DocumentType/ShowRequest.php', + 'App\\Http\\Requests\\DocumentType\\UpdateRequest' => $baseDir . '/app/Http/Requests/DocumentType/UpdateRequest.php', + 'App\\Http\\Requests\\Document\\CreateRequest' => $baseDir . '/app/Http/Requests/Document/CreateRequest.php', + 'App\\Http\\Requests\\Document\\DestroyRequest' => $baseDir . '/app/Http/Requests/Document/DestroyRequest.php', + 'App\\Http\\Requests\\Document\\ExportRequest' => $baseDir . '/app/Http/Requests/Document/ExportRequest.php', + 'App\\Http\\Requests\\Document\\IndexRequest' => $baseDir . '/app/Http/Requests/Document/IndexRequest.php', + 'App\\Http\\Requests\\Document\\ShowRequest' => $baseDir . '/app/Http/Requests/Document/ShowRequest.php', + 'App\\Http\\Requests\\Document\\UpdateRequest' => $baseDir . '/app/Http/Requests/Document/UpdateRequest.php', + 'App\\Http\\Requests\\Me\\ShowRequest' => $baseDir . '/app/Http/Requests/Me/ShowRequest.php', + 'App\\Http\\Requests\\Me\\UpdateRequest' => $baseDir . '/app/Http/Requests/Me/UpdateRequest.php', + 'App\\Http\\Requests\\Organize\\CreateRequest' => $baseDir . '/app/Http/Requests/Organize/CreateRequest.php', + 'App\\Http\\Requests\\Organize\\DestroyRequest' => $baseDir . '/app/Http/Requests/Organize/DestroyRequest.php', + 'App\\Http\\Requests\\Organize\\IndexRequest' => $baseDir . '/app/Http/Requests/Organize/IndexRequest.php', + 'App\\Http\\Requests\\Organize\\ShowRequest' => $baseDir . '/app/Http/Requests/Organize/ShowRequest.php', + 'App\\Http\\Requests\\Organize\\UpdateRequest' => $baseDir . '/app/Http/Requests/Organize/UpdateRequest.php', + 'App\\Http\\Requests\\Permission\\CreateRequest' => $baseDir . '/app/Http/Requests/Permission/CreateRequest.php', + 'App\\Http\\Requests\\Permission\\DestroyRequest' => $baseDir . '/app/Http/Requests/Permission/DestroyRequest.php', + 'App\\Http\\Requests\\Permission\\IndexRequest' => $baseDir . '/app/Http/Requests/Permission/IndexRequest.php', + 'App\\Http\\Requests\\Permission\\ShowRequest' => $baseDir . '/app/Http/Requests/Permission/ShowRequest.php', + 'App\\Http\\Requests\\Permission\\UpdateRequest' => $baseDir . '/app/Http/Requests/Permission/UpdateRequest.php', + 'App\\Http\\Requests\\Role\\CreateRequest' => $baseDir . '/app/Http/Requests/Role/CreateRequest.php', + 'App\\Http\\Requests\\Role\\DestroyRequest' => $baseDir . '/app/Http/Requests/Role/DestroyRequest.php', + 'App\\Http\\Requests\\Role\\GivePermissionRequest' => $baseDir . '/app/Http/Requests/Role/GivePermissionRequest.php', + 'App\\Http\\Requests\\Role\\IndexRequest' => $baseDir . '/app/Http/Requests/Role/IndexRequest.php', + 'App\\Http\\Requests\\Role\\RevokePermissionRequest' => $baseDir . '/app/Http/Requests/Role/RevokePermissionRequest.php', + 'App\\Http\\Requests\\Role\\ShowRequest' => $baseDir . '/app/Http/Requests/Role/ShowRequest.php', + 'App\\Http\\Requests\\Role\\UpdateRequest' => $baseDir . '/app/Http/Requests/Role/UpdateRequest.php', + 'App\\Http\\Requests\\Signer\\CreateRequest' => $baseDir . '/app/Http/Requests/Signer/CreateRequest.php', + 'App\\Http\\Requests\\Signer\\DestroyRequest' => $baseDir . '/app/Http/Requests/Signer/DestroyRequest.php', + 'App\\Http\\Requests\\Signer\\IndexRequest' => $baseDir . '/app/Http/Requests/Signer/IndexRequest.php', + 'App\\Http\\Requests\\Signer\\ShowRequest' => $baseDir . '/app/Http/Requests/Signer/ShowRequest.php', + 'App\\Http\\Requests\\Signer\\UpdateRequest' => $baseDir . '/app/Http/Requests/Signer/UpdateRequest.php', + 'App\\Http\\Requests\\Title\\CreateRequest' => $baseDir . '/app/Http/Requests/Title/CreateRequest.php', + 'App\\Http\\Requests\\Title\\DestroyRequest' => $baseDir . '/app/Http/Requests/Title/DestroyRequest.php', + 'App\\Http\\Requests\\Title\\IndexRequest' => $baseDir . '/app/Http/Requests/Title/IndexRequest.php', + 'App\\Http\\Requests\\Title\\ShowRequest' => $baseDir . '/app/Http/Requests/Title/ShowRequest.php', + 'App\\Http\\Requests\\Title\\UpdateRequest' => $baseDir . '/app/Http/Requests/Title/UpdateRequest.php', + 'App\\Http\\Requests\\User\\CreateRequest' => $baseDir . '/app/Http/Requests/User/CreateRequest.php', + 'App\\Http\\Requests\\User\\DestroyRequest' => $baseDir . '/app/Http/Requests/User/DestroyRequest.php', + 'App\\Http\\Requests\\User\\ExportRequest' => $baseDir . '/app/Http/Requests/User/ExportRequest.php', + 'App\\Http\\Requests\\User\\GivePermissionRequest' => $baseDir . '/app/Http/Requests/User/GivePermissionRequest.php', + 'App\\Http\\Requests\\User\\GiveRoleRequest' => $baseDir . '/app/Http/Requests/User/GiveRoleRequest.php', + 'App\\Http\\Requests\\User\\ImportRequest' => $baseDir . '/app/Http/Requests/User/ImportRequest.php', + 'App\\Http\\Requests\\User\\IndexRequest' => $baseDir . '/app/Http/Requests/User/IndexRequest.php', + 'App\\Http\\Requests\\User\\ShowRequest' => $baseDir . '/app/Http/Requests/User/ShowRequest.php', + 'App\\Http\\Requests\\User\\UpdateRequest' => $baseDir . '/app/Http/Requests/User/UpdateRequest.php', + 'App\\Imports\\UsersImport' => $baseDir . '/app/Imports/UsersImport.php', + 'App\\Listeners\\NotifyDocumentReceivedToUsers' => $baseDir . '/app/Listeners/NotifyDocumentReceivedToUsers.php', + 'App\\Listeners\\UpdateReceiverToSeen' => $baseDir . '/app/Listeners/UpdateReceiverToSeen.php', + 'App\\Notifications\\DocumentReceived' => $baseDir . '/app/Notifications/DocumentReceived.php', + 'App\\Observers\\UserObserver' => $baseDir . '/app/Observers/UserObserver.php', + 'App\\Providers\\AppServiceProvider' => $baseDir . '/app/Providers/AppServiceProvider.php', + 'App\\Providers\\AuthServiceProvider' => $baseDir . '/app/Providers/AuthServiceProvider.php', + 'App\\Providers\\BroadcastServiceProvider' => $baseDir . '/app/Providers/BroadcastServiceProvider.php', + 'App\\Providers\\EventServiceProvider' => $baseDir . '/app/Providers/EventServiceProvider.php', + 'App\\Providers\\RepositoryServiceProvider' => $baseDir . '/app/Providers/RepositoryServiceProvider.php', + 'App\\Providers\\RouteServiceProvider' => $baseDir . '/app/Providers/RouteServiceProvider.php', + 'App\\Repositories\\Eloquents\\AttachmentRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/AttachmentRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\BookRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/BookRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\DepartmentRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/DepartmentRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\DocumentRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/DocumentRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\DocumentTypeRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/DocumentTypeRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\OrganizeRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/OrganizeRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\PermissionRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/PermissionRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\RoleRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/RoleRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\SignerRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/SignerRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\TitleRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/TitleRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\UserRepositoryEloquent' => $baseDir . '/app/Repositories/Eloquents/UserRepositoryEloquent.php', + 'App\\Traits\\ActionCallable' => $baseDir . '/app/Traits/ActionCallable.php', + 'App\\Traits\\Attachmentable' => $baseDir . '/app/Traits/Attachmentable.php', + 'Asm89\\Stack\\Cors' => $vendorDir . '/asm89/stack-cors/src/Asm89/Stack/Cors.php', + 'Asm89\\Stack\\CorsService' => $vendorDir . '/asm89/stack-cors/src/Asm89/Stack/CorsService.php', + 'BookSeeder' => $baseDir . '/database/seeds/BookSeeder.php', + 'Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php', + 'Brick\\Math\\BigInteger' => $vendorDir . '/brick/math/src/BigInteger.php', + 'Brick\\Math\\BigNumber' => $vendorDir . '/brick/math/src/BigNumber.php', + 'Brick\\Math\\BigRational' => $vendorDir . '/brick/math/src/BigRational.php', + 'Brick\\Math\\Exception\\DivisionByZeroException' => $vendorDir . '/brick/math/src/Exception/DivisionByZeroException.php', + 'Brick\\Math\\Exception\\IntegerOverflowException' => $vendorDir . '/brick/math/src/Exception/IntegerOverflowException.php', + 'Brick\\Math\\Exception\\MathException' => $vendorDir . '/brick/math/src/Exception/MathException.php', + 'Brick\\Math\\Exception\\NegativeNumberException' => $vendorDir . '/brick/math/src/Exception/NegativeNumberException.php', + 'Brick\\Math\\Exception\\NumberFormatException' => $vendorDir . '/brick/math/src/Exception/NumberFormatException.php', + 'Brick\\Math\\Exception\\RoundingNecessaryException' => $vendorDir . '/brick/math/src/Exception/RoundingNecessaryException.php', + 'Brick\\Math\\Internal\\Calculator' => $vendorDir . '/brick/math/src/Internal/Calculator.php', + 'Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/BcMathCalculator.php', + 'Brick\\Math\\Internal\\Calculator\\GmpCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/GmpCalculator.php', + 'Brick\\Math\\Internal\\Calculator\\NativeCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/NativeCalculator.php', + 'Brick\\Math\\RoundingMode' => $vendorDir . '/brick/math/src/RoundingMode.php', + 'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php', + 'Carbon\\CarbonImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', + 'Carbon\\CarbonInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterface.php', + 'Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php', + 'Carbon\\CarbonPeriod' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', + 'Carbon\\CarbonTimeZone' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', + 'Carbon\\Cli\\Invoker' => $vendorDir . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', + 'Carbon\\Doctrine\\CarbonDoctrineType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php', + 'Carbon\\Doctrine\\CarbonImmutableType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php', + 'Carbon\\Doctrine\\CarbonType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php', + 'Carbon\\Doctrine\\CarbonTypeConverter' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php', + 'Carbon\\Doctrine\\DateTimeDefaultPrecision' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', + 'Carbon\\Doctrine\\DateTimeImmutableType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php', + 'Carbon\\Doctrine\\DateTimeType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php', + 'Carbon\\Exceptions\\BadComparisonUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', + 'Carbon\\Exceptions\\BadFluentConstructorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', + 'Carbon\\Exceptions\\BadFluentSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', + 'Carbon\\Exceptions\\BadMethodCallException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', + 'Carbon\\Exceptions\\Exception' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', + 'Carbon\\Exceptions\\ImmutableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', + 'Carbon\\Exceptions\\InvalidArgumentException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', + 'Carbon\\Exceptions\\InvalidCastException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', + 'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', + 'Carbon\\Exceptions\\InvalidFormatException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', + 'Carbon\\Exceptions\\InvalidIntervalException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', + 'Carbon\\Exceptions\\InvalidPeriodDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', + 'Carbon\\Exceptions\\InvalidPeriodParameterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', + 'Carbon\\Exceptions\\InvalidTimeZoneException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', + 'Carbon\\Exceptions\\InvalidTypeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', + 'Carbon\\Exceptions\\NotACarbonClassException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', + 'Carbon\\Exceptions\\NotAPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', + 'Carbon\\Exceptions\\NotLocaleAwareException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', + 'Carbon\\Exceptions\\OutOfRangeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', + 'Carbon\\Exceptions\\ParseErrorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', + 'Carbon\\Exceptions\\RuntimeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', + 'Carbon\\Exceptions\\UnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', + 'Carbon\\Exceptions\\UnitNotConfiguredException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', + 'Carbon\\Exceptions\\UnknownGetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', + 'Carbon\\Exceptions\\UnknownMethodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', + 'Carbon\\Exceptions\\UnknownSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', + 'Carbon\\Exceptions\\UnknownUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', + 'Carbon\\Exceptions\\UnreachableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', + 'Carbon\\Factory' => $vendorDir . '/nesbot/carbon/src/Carbon/Factory.php', + 'Carbon\\FactoryImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', + 'Carbon\\Language' => $vendorDir . '/nesbot/carbon/src/Carbon/Language.php', + 'Carbon\\Laravel\\ServiceProvider' => $vendorDir . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', + 'Carbon\\Traits\\Boundaries' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', + 'Carbon\\Traits\\Cast' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Cast.php', + 'Carbon\\Traits\\Comparison' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', + 'Carbon\\Traits\\Converter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Converter.php', + 'Carbon\\Traits\\Creator' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Creator.php', + 'Carbon\\Traits\\Date' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Date.php', + 'Carbon\\Traits\\Difference' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Difference.php', + 'Carbon\\Traits\\IntervalRounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', + 'Carbon\\Traits\\Localization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Localization.php', + 'Carbon\\Traits\\Macro' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Macro.php', + 'Carbon\\Traits\\Mixin' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', + 'Carbon\\Traits\\Modifiers' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', + 'Carbon\\Traits\\Mutability' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', + 'Carbon\\Traits\\ObjectInitialisation' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', + 'Carbon\\Traits\\Options' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Options.php', + 'Carbon\\Traits\\Rounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', + 'Carbon\\Traits\\Serialization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', + 'Carbon\\Traits\\Test' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Test.php', + 'Carbon\\Traits\\Timestamp' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', + 'Carbon\\Traits\\Units' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Units.php', + 'Carbon\\Traits\\Week' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Week.php', + 'Carbon\\Translator' => $vendorDir . '/nesbot/carbon/src/Carbon/Translator.php', + 'Complex\\Complex' => $vendorDir . '/markbaker/complex/classes/src/Complex.php', + 'Complex\\Exception' => $vendorDir . '/markbaker/complex/classes/src/Exception.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Cron\\AbstractField' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/AbstractField.php', + 'Cron\\CronExpression' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/CronExpression.php', + 'Cron\\DayOfMonthField' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php', + 'Cron\\DayOfWeekField' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php', + 'Cron\\FieldFactory' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/FieldFactory.php', + 'Cron\\FieldInterface' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/FieldInterface.php', + 'Cron\\HoursField' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/HoursField.php', + 'Cron\\MinutesField' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/MinutesField.php', + 'Cron\\MonthField' => $vendorDir . '/dragonmantank/cron-expression/src/Cron/MonthField.php', + 'DatabaseSeeder' => $baseDir . '/database/seeds/DatabaseSeeder.php', + 'DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', + 'DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', + 'DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', + 'DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', + 'DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', + 'DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', + 'DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', + 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', + 'DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', + 'DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', + 'DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', + 'DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', + 'DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', + 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', + 'DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', + 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', + 'DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', + 'DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', + 'DepartmentSeeder' => $baseDir . '/database/seeds/DepartmentSeeder.php', + 'Doctrine\\Common\\Lexer\\AbstractLexer' => $vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php', + 'Doctrine\\Inflector\\CachedWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', + 'Doctrine\\Inflector\\GenericLanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', + 'Doctrine\\Inflector\\Inflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', + 'Doctrine\\Inflector\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', + 'Doctrine\\Inflector\\Language' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', + 'Doctrine\\Inflector\\LanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', + 'Doctrine\\Inflector\\NoopWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', + 'Doctrine\\Inflector\\Rules\\English\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\English\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', + 'Doctrine\\Inflector\\Rules\\English\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\French\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\French\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', + 'Doctrine\\Inflector\\Rules\\French\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Pattern' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', + 'Doctrine\\Inflector\\Rules\\Patterns' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Ruleset' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Substitution' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', + 'Doctrine\\Inflector\\Rules\\Substitutions' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', + 'Doctrine\\Inflector\\Rules\\Transformation' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', + 'Doctrine\\Inflector\\Rules\\Transformations' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Word' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', + 'Doctrine\\Inflector\\RulesetInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', + 'Doctrine\\Inflector\\WordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', + 'Doctrine\\Instantiator\\Exception\\ExceptionInterface' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php', + 'Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php', + 'Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php', + 'Doctrine\\Instantiator\\Instantiator' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php', + 'Doctrine\\Instantiator\\InstantiatorInterface' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php', + 'DocumentSeeder' => $baseDir . '/database/seeds/DocumentSeeder.php', + 'DocumentTypeSeeder' => $baseDir . '/database/seeds/DocumentTypeSeeder.php', + 'Dotenv\\Dotenv' => $vendorDir . '/vlucas/phpdotenv/src/Dotenv.php', + 'Dotenv\\Exception\\ExceptionInterface' => $vendorDir . '/vlucas/phpdotenv/src/Exception/ExceptionInterface.php', + 'Dotenv\\Exception\\InvalidFileException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/InvalidFileException.php', + 'Dotenv\\Exception\\InvalidPathException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/InvalidPathException.php', + 'Dotenv\\Exception\\ValidationException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/ValidationException.php', + 'Dotenv\\Loader\\Lines' => $vendorDir . '/vlucas/phpdotenv/src/Loader/Lines.php', + 'Dotenv\\Loader\\Loader' => $vendorDir . '/vlucas/phpdotenv/src/Loader/Loader.php', + 'Dotenv\\Loader\\LoaderInterface' => $vendorDir . '/vlucas/phpdotenv/src/Loader/LoaderInterface.php', + 'Dotenv\\Loader\\Parser' => $vendorDir . '/vlucas/phpdotenv/src/Loader/Parser.php', + 'Dotenv\\Loader\\Value' => $vendorDir . '/vlucas/phpdotenv/src/Loader/Value.php', + 'Dotenv\\Regex\\Regex' => $vendorDir . '/vlucas/phpdotenv/src/Regex/Regex.php', + 'Dotenv\\Repository\\AbstractRepository' => $vendorDir . '/vlucas/phpdotenv/src/Repository/AbstractRepository.php', + 'Dotenv\\Repository\\AdapterRepository' => $vendorDir . '/vlucas/phpdotenv/src/Repository/AdapterRepository.php', + 'Dotenv\\Repository\\Adapter\\ApacheAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php', + 'Dotenv\\Repository\\Adapter\\ArrayAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php', + 'Dotenv\\Repository\\Adapter\\AvailabilityInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/AvailabilityInterface.php', + 'Dotenv\\Repository\\Adapter\\EnvConstAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php', + 'Dotenv\\Repository\\Adapter\\PutenvAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php', + 'Dotenv\\Repository\\Adapter\\ReaderInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php', + 'Dotenv\\Repository\\Adapter\\ServerConstAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php', + 'Dotenv\\Repository\\Adapter\\WriterInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php', + 'Dotenv\\Repository\\RepositoryBuilder' => $vendorDir . '/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php', + 'Dotenv\\Repository\\RepositoryInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/RepositoryInterface.php', + 'Dotenv\\Result\\Error' => $vendorDir . '/vlucas/phpdotenv/src/Result/Error.php', + 'Dotenv\\Result\\Result' => $vendorDir . '/vlucas/phpdotenv/src/Result/Result.php', + 'Dotenv\\Result\\Success' => $vendorDir . '/vlucas/phpdotenv/src/Result/Success.php', + 'Dotenv\\Store\\FileStore' => $vendorDir . '/vlucas/phpdotenv/src/Store/FileStore.php', + 'Dotenv\\Store\\File\\Paths' => $vendorDir . '/vlucas/phpdotenv/src/Store/File/Paths.php', + 'Dotenv\\Store\\File\\Reader' => $vendorDir . '/vlucas/phpdotenv/src/Store/File/Reader.php', + 'Dotenv\\Store\\StoreBuilder' => $vendorDir . '/vlucas/phpdotenv/src/Store/StoreBuilder.php', + 'Dotenv\\Store\\StoreInterface' => $vendorDir . '/vlucas/phpdotenv/src/Store/StoreInterface.php', + 'Dotenv\\Validator' => $vendorDir . '/vlucas/phpdotenv/src/Validator.php', + 'Egulias\\EmailValidator\\EmailLexer' => $vendorDir . '/egulias/email-validator/src/EmailLexer.php', + 'Egulias\\EmailValidator\\EmailParser' => $vendorDir . '/egulias/email-validator/src/EmailParser.php', + 'Egulias\\EmailValidator\\EmailValidator' => $vendorDir . '/egulias/email-validator/src/EmailValidator.php', + 'Egulias\\EmailValidator\\Exception\\AtextAfterCFWS' => $vendorDir . '/egulias/email-validator/src/Exception/AtextAfterCFWS.php', + 'Egulias\\EmailValidator\\Exception\\CRLFAtTheEnd' => $vendorDir . '/egulias/email-validator/src/Exception/CRLFAtTheEnd.php', + 'Egulias\\EmailValidator\\Exception\\CRLFX2' => $vendorDir . '/egulias/email-validator/src/Exception/CRLFX2.php', + 'Egulias\\EmailValidator\\Exception\\CRNoLF' => $vendorDir . '/egulias/email-validator/src/Exception/CRNoLF.php', + 'Egulias\\EmailValidator\\Exception\\CharNotAllowed' => $vendorDir . '/egulias/email-validator/src/Exception/CharNotAllowed.php', + 'Egulias\\EmailValidator\\Exception\\CommaInDomain' => $vendorDir . '/egulias/email-validator/src/Exception/CommaInDomain.php', + 'Egulias\\EmailValidator\\Exception\\ConsecutiveAt' => $vendorDir . '/egulias/email-validator/src/Exception/ConsecutiveAt.php', + 'Egulias\\EmailValidator\\Exception\\ConsecutiveDot' => $vendorDir . '/egulias/email-validator/src/Exception/ConsecutiveDot.php', + 'Egulias\\EmailValidator\\Exception\\DomainHyphened' => $vendorDir . '/egulias/email-validator/src/Exception/DomainHyphened.php', + 'Egulias\\EmailValidator\\Exception\\DotAtEnd' => $vendorDir . '/egulias/email-validator/src/Exception/DotAtEnd.php', + 'Egulias\\EmailValidator\\Exception\\DotAtStart' => $vendorDir . '/egulias/email-validator/src/Exception/DotAtStart.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingAT' => $vendorDir . '/egulias/email-validator/src/Exception/ExpectingAT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingATEXT' => $vendorDir . '/egulias/email-validator/src/Exception/ExpectingATEXT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingCTEXT' => $vendorDir . '/egulias/email-validator/src/Exception/ExpectingCTEXT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingDTEXT' => $vendorDir . '/egulias/email-validator/src/Exception/ExpectingDTEXT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingDomainLiteralClose' => $vendorDir . '/egulias/email-validator/src/Exception/ExpectingDomainLiteralClose.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingQPair' => $vendorDir . '/egulias/email-validator/src/Exception/ExpectingQPair.php', + 'Egulias\\EmailValidator\\Exception\\InvalidEmail' => $vendorDir . '/egulias/email-validator/src/Exception/InvalidEmail.php', + 'Egulias\\EmailValidator\\Exception\\NoDNSRecord' => $vendorDir . '/egulias/email-validator/src/Exception/NoDNSRecord.php', + 'Egulias\\EmailValidator\\Exception\\NoDomainPart' => $vendorDir . '/egulias/email-validator/src/Exception/NoDomainPart.php', + 'Egulias\\EmailValidator\\Exception\\NoLocalPart' => $vendorDir . '/egulias/email-validator/src/Exception/NoLocalPart.php', + 'Egulias\\EmailValidator\\Exception\\UnclosedComment' => $vendorDir . '/egulias/email-validator/src/Exception/UnclosedComment.php', + 'Egulias\\EmailValidator\\Exception\\UnclosedQuotedString' => $vendorDir . '/egulias/email-validator/src/Exception/UnclosedQuotedString.php', + 'Egulias\\EmailValidator\\Exception\\UnopenedComment' => $vendorDir . '/egulias/email-validator/src/Exception/UnopenedComment.php', + 'Egulias\\EmailValidator\\Parser\\DomainPart' => $vendorDir . '/egulias/email-validator/src/Parser/DomainPart.php', + 'Egulias\\EmailValidator\\Parser\\LocalPart' => $vendorDir . '/egulias/email-validator/src/Parser/LocalPart.php', + 'Egulias\\EmailValidator\\Parser\\Parser' => $vendorDir . '/egulias/email-validator/src/Parser/Parser.php', + 'Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => $vendorDir . '/egulias/email-validator/src/Validation/DNSCheckValidation.php', + 'Egulias\\EmailValidator\\Validation\\EmailValidation' => $vendorDir . '/egulias/email-validator/src/Validation/EmailValidation.php', + 'Egulias\\EmailValidator\\Validation\\Error\\RFCWarnings' => $vendorDir . '/egulias/email-validator/src/Validation/Error/RFCWarnings.php', + 'Egulias\\EmailValidator\\Validation\\Error\\SpoofEmail' => $vendorDir . '/egulias/email-validator/src/Validation/Error/SpoofEmail.php', + 'Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => $vendorDir . '/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', + 'Egulias\\EmailValidator\\Validation\\MultipleErrors' => $vendorDir . '/egulias/email-validator/src/Validation/MultipleErrors.php', + 'Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => $vendorDir . '/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', + 'Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => $vendorDir . '/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', + 'Egulias\\EmailValidator\\Validation\\RFCValidation' => $vendorDir . '/egulias/email-validator/src/Validation/RFCValidation.php', + 'Egulias\\EmailValidator\\Validation\\SpoofCheckValidation' => $vendorDir . '/egulias/email-validator/src/Validation/SpoofCheckValidation.php', + 'Egulias\\EmailValidator\\Warning\\AddressLiteral' => $vendorDir . '/egulias/email-validator/src/Warning/AddressLiteral.php', + 'Egulias\\EmailValidator\\Warning\\CFWSNearAt' => $vendorDir . '/egulias/email-validator/src/Warning/CFWSNearAt.php', + 'Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => $vendorDir . '/egulias/email-validator/src/Warning/CFWSWithFWS.php', + 'Egulias\\EmailValidator\\Warning\\Comment' => $vendorDir . '/egulias/email-validator/src/Warning/Comment.php', + 'Egulias\\EmailValidator\\Warning\\DeprecatedComment' => $vendorDir . '/egulias/email-validator/src/Warning/DeprecatedComment.php', + 'Egulias\\EmailValidator\\Warning\\DomainLiteral' => $vendorDir . '/egulias/email-validator/src/Warning/DomainLiteral.php', + 'Egulias\\EmailValidator\\Warning\\DomainTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/DomainTooLong.php', + 'Egulias\\EmailValidator\\Warning\\EmailTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/EmailTooLong.php', + 'Egulias\\EmailValidator\\Warning\\IPV6BadChar' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6BadChar.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6ColonEnd.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6ColonStart.php', + 'Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6Deprecated.php', + 'Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6DoubleColon.php', + 'Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6GroupCount.php', + 'Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6MaxGroups.php', + 'Egulias\\EmailValidator\\Warning\\LabelTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/LabelTooLong.php', + 'Egulias\\EmailValidator\\Warning\\LocalTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/LocalTooLong.php', + 'Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => $vendorDir . '/egulias/email-validator/src/Warning/NoDNSMXRecord.php', + 'Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => $vendorDir . '/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', + 'Egulias\\EmailValidator\\Warning\\QuotedPart' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedPart.php', + 'Egulias\\EmailValidator\\Warning\\QuotedString' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedString.php', + 'Egulias\\EmailValidator\\Warning\\TLD' => $vendorDir . '/egulias/email-validator/src/Warning/TLD.php', + 'Egulias\\EmailValidator\\Warning\\Warning' => $vendorDir . '/egulias/email-validator/src/Warning/Warning.php', + 'Facade\\FlareClient\\Api' => $vendorDir . '/facade/flare-client-php/src/Api.php', + 'Facade\\FlareClient\\Concerns\\HasContext' => $vendorDir . '/facade/flare-client-php/src/Concerns/HasContext.php', + 'Facade\\FlareClient\\Concerns\\UsesTime' => $vendorDir . '/facade/flare-client-php/src/Concerns/UsesTime.php', + 'Facade\\FlareClient\\Context\\ConsoleContext' => $vendorDir . '/facade/flare-client-php/src/Context/ConsoleContext.php', + 'Facade\\FlareClient\\Context\\ContextContextDetector' => $vendorDir . '/facade/flare-client-php/src/Context/ContextContextDetector.php', + 'Facade\\FlareClient\\Context\\ContextDetectorInterface' => $vendorDir . '/facade/flare-client-php/src/Context/ContextDetectorInterface.php', + 'Facade\\FlareClient\\Context\\ContextInterface' => $vendorDir . '/facade/flare-client-php/src/Context/ContextInterface.php', + 'Facade\\FlareClient\\Context\\RequestContext' => $vendorDir . '/facade/flare-client-php/src/Context/RequestContext.php', + 'Facade\\FlareClient\\Contracts\\ProvidesFlareContext' => $vendorDir . '/facade/flare-client-php/src/Contracts/ProvidesFlareContext.php', + 'Facade\\FlareClient\\Enums\\GroupingTypes' => $vendorDir . '/facade/flare-client-php/src/Enums/GroupingTypes.php', + 'Facade\\FlareClient\\Enums\\MessageLevels' => $vendorDir . '/facade/flare-client-php/src/Enums/MessageLevels.php', + 'Facade\\FlareClient\\Flare' => $vendorDir . '/facade/flare-client-php/src/Flare.php', + 'Facade\\FlareClient\\Frame' => $vendorDir . '/facade/flare-client-php/src/Frame.php', + 'Facade\\FlareClient\\Glows\\Glow' => $vendorDir . '/facade/flare-client-php/src/Glows/Glow.php', + 'Facade\\FlareClient\\Glows\\Recorder' => $vendorDir . '/facade/flare-client-php/src/Glows/Recorder.php', + 'Facade\\FlareClient\\Http\\Client' => $vendorDir . '/facade/flare-client-php/src/Http/Client.php', + 'Facade\\FlareClient\\Http\\Exceptions\\BadResponse' => $vendorDir . '/facade/flare-client-php/src/Http/Exceptions/BadResponse.php', + 'Facade\\FlareClient\\Http\\Exceptions\\BadResponseCode' => $vendorDir . '/facade/flare-client-php/src/Http/Exceptions/BadResponseCode.php', + 'Facade\\FlareClient\\Http\\Exceptions\\InvalidData' => $vendorDir . '/facade/flare-client-php/src/Http/Exceptions/InvalidData.php', + 'Facade\\FlareClient\\Http\\Exceptions\\MissingParameter' => $vendorDir . '/facade/flare-client-php/src/Http/Exceptions/MissingParameter.php', + 'Facade\\FlareClient\\Http\\Exceptions\\NotFound' => $vendorDir . '/facade/flare-client-php/src/Http/Exceptions/NotFound.php', + 'Facade\\FlareClient\\Http\\Response' => $vendorDir . '/facade/flare-client-php/src/Http/Response.php', + 'Facade\\FlareClient\\Middleware\\AddGlows' => $vendorDir . '/facade/flare-client-php/src/Middleware/AddGlows.php', + 'Facade\\FlareClient\\Middleware\\AnonymizeIp' => $vendorDir . '/facade/flare-client-php/src/Middleware/AnonymizeIp.php', + 'Facade\\FlareClient\\Report' => $vendorDir . '/facade/flare-client-php/src/Report.php', + 'Facade\\FlareClient\\Solutions\\ReportSolution' => $vendorDir . '/facade/flare-client-php/src/Solutions/ReportSolution.php', + 'Facade\\FlareClient\\Stacktrace\\Codesnippet' => $vendorDir . '/facade/flare-client-php/src/Stacktrace/Codesnippet.php', + 'Facade\\FlareClient\\Stacktrace\\File' => $vendorDir . '/facade/flare-client-php/src/Stacktrace/File.php', + 'Facade\\FlareClient\\Stacktrace\\Frame' => $vendorDir . '/facade/flare-client-php/src/Stacktrace/Frame.php', + 'Facade\\FlareClient\\Stacktrace\\Stacktrace' => $vendorDir . '/facade/flare-client-php/src/Stacktrace/Stacktrace.php', + 'Facade\\FlareClient\\Time\\SystemTime' => $vendorDir . '/facade/flare-client-php/src/Time/SystemTime.php', + 'Facade\\FlareClient\\Time\\Time' => $vendorDir . '/facade/flare-client-php/src/Time/Time.php', + 'Facade\\FlareClient\\Truncation\\AbstractTruncationStrategy' => $vendorDir . '/facade/flare-client-php/src/Truncation/AbstractTruncationStrategy.php', + 'Facade\\FlareClient\\Truncation\\ReportTrimmer' => $vendorDir . '/facade/flare-client-php/src/Truncation/ReportTrimmer.php', + 'Facade\\FlareClient\\Truncation\\TrimContextItemsStrategy' => $vendorDir . '/facade/flare-client-php/src/Truncation/TrimContextItemsStrategy.php', + 'Facade\\FlareClient\\Truncation\\TrimStringsStrategy' => $vendorDir . '/facade/flare-client-php/src/Truncation/TrimStringsStrategy.php', + 'Facade\\FlareClient\\Truncation\\TruncationStrategy' => $vendorDir . '/facade/flare-client-php/src/Truncation/TruncationStrategy.php', + 'Facade\\FlareClient\\View' => $vendorDir . '/facade/flare-client-php/src/View.php', + 'Facade\\IgnitionContracts\\BaseSolution' => $vendorDir . '/facade/ignition-contracts/src/BaseSolution.php', + 'Facade\\IgnitionContracts\\HasSolutionsForThrowable' => $vendorDir . '/facade/ignition-contracts/src/HasSolutionsForThrowable.php', + 'Facade\\IgnitionContracts\\ProvidesSolution' => $vendorDir . '/facade/ignition-contracts/src/ProvidesSolution.php', + 'Facade\\IgnitionContracts\\RunnableSolution' => $vendorDir . '/facade/ignition-contracts/src/RunnableSolution.php', + 'Facade\\IgnitionContracts\\Solution' => $vendorDir . '/facade/ignition-contracts/src/Solution.php', + 'Facade\\IgnitionContracts\\SolutionProviderRepository' => $vendorDir . '/facade/ignition-contracts/src/SolutionProviderRepository.php', + 'Facade\\Ignition\\Actions\\ShareReportAction' => $vendorDir . '/facade/ignition/src/Actions/ShareReportAction.php', + 'Facade\\Ignition\\Commands\\SolutionMakeCommand' => $vendorDir . '/facade/ignition/src/Commands/SolutionMakeCommand.php', + 'Facade\\Ignition\\Commands\\TestCommand' => $vendorDir . '/facade/ignition/src/Commands/TestCommand.php', + 'Facade\\Ignition\\Context\\LaravelConsoleContext' => $vendorDir . '/facade/ignition/src/Context/LaravelConsoleContext.php', + 'Facade\\Ignition\\Context\\LaravelContextDetector' => $vendorDir . '/facade/ignition/src/Context/LaravelContextDetector.php', + 'Facade\\Ignition\\Context\\LaravelRequestContext' => $vendorDir . '/facade/ignition/src/Context/LaravelRequestContext.php', + 'Facade\\Ignition\\DumpRecorder\\Dump' => $vendorDir . '/facade/ignition/src/DumpRecorder/Dump.php', + 'Facade\\Ignition\\DumpRecorder\\DumpHandler' => $vendorDir . '/facade/ignition/src/DumpRecorder/DumpHandler.php', + 'Facade\\Ignition\\DumpRecorder\\DumpRecorder' => $vendorDir . '/facade/ignition/src/DumpRecorder/DumpRecorder.php', + 'Facade\\Ignition\\DumpRecorder\\HtmlDumper' => $vendorDir . '/facade/ignition/src/DumpRecorder/HtmlDumper.php', + 'Facade\\Ignition\\DumpRecorder\\MultiDumpHandler' => $vendorDir . '/facade/ignition/src/DumpRecorder/MultiDumpHandler.php', + 'Facade\\Ignition\\ErrorPage\\ErrorPageHandler' => $vendorDir . '/facade/ignition/src/ErrorPage/ErrorPageHandler.php', + 'Facade\\Ignition\\ErrorPage\\ErrorPageViewModel' => $vendorDir . '/facade/ignition/src/ErrorPage/ErrorPageViewModel.php', + 'Facade\\Ignition\\ErrorPage\\IgnitionWhoopsHandler' => $vendorDir . '/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php', + 'Facade\\Ignition\\ErrorPage\\Renderer' => $vendorDir . '/facade/ignition/src/ErrorPage/Renderer.php', + 'Facade\\Ignition\\Exceptions\\InvalidConfig' => $vendorDir . '/facade/ignition/src/Exceptions/InvalidConfig.php', + 'Facade\\Ignition\\Exceptions\\UnableToShareErrorException' => $vendorDir . '/facade/ignition/src/Exceptions/UnableToShareErrorException.php', + 'Facade\\Ignition\\Exceptions\\ViewException' => $vendorDir . '/facade/ignition/src/Exceptions/ViewException.php', + 'Facade\\Ignition\\Exceptions\\ViewExceptionWithSolution' => $vendorDir . '/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php', + 'Facade\\Ignition\\Facades\\Flare' => $vendorDir . '/facade/ignition/src/Facades/Flare.php', + 'Facade\\Ignition\\Http\\Controllers\\ExecuteSolutionController' => $vendorDir . '/facade/ignition/src/Http/Controllers/ExecuteSolutionController.php', + 'Facade\\Ignition\\Http\\Controllers\\HealthCheckController' => $vendorDir . '/facade/ignition/src/Http/Controllers/HealthCheckController.php', + 'Facade\\Ignition\\Http\\Controllers\\ScriptController' => $vendorDir . '/facade/ignition/src/Http/Controllers/ScriptController.php', + 'Facade\\Ignition\\Http\\Controllers\\ShareReportController' => $vendorDir . '/facade/ignition/src/Http/Controllers/ShareReportController.php', + 'Facade\\Ignition\\Http\\Controllers\\StyleController' => $vendorDir . '/facade/ignition/src/Http/Controllers/StyleController.php', + 'Facade\\Ignition\\Http\\Middleware\\IgnitionConfigValueEnabled' => $vendorDir . '/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php', + 'Facade\\Ignition\\Http\\Middleware\\IgnitionEnabled' => $vendorDir . '/facade/ignition/src/Http/Middleware/IgnitionEnabled.php', + 'Facade\\Ignition\\Http\\Requests\\ExecuteSolutionRequest' => $vendorDir . '/facade/ignition/src/Http/Requests/ExecuteSolutionRequest.php', + 'Facade\\Ignition\\Http\\Requests\\ShareReportRequest' => $vendorDir . '/facade/ignition/src/Http/Requests/ShareReportRequest.php', + 'Facade\\Ignition\\Ignition' => $vendorDir . '/facade/ignition/src/Ignition.php', + 'Facade\\Ignition\\IgnitionConfig' => $vendorDir . '/facade/ignition/src/IgnitionConfig.php', + 'Facade\\Ignition\\IgnitionServiceProvider' => $vendorDir . '/facade/ignition/src/IgnitionServiceProvider.php', + 'Facade\\Ignition\\LogRecorder\\LogMessage' => $vendorDir . '/facade/ignition/src/LogRecorder/LogMessage.php', + 'Facade\\Ignition\\LogRecorder\\LogRecorder' => $vendorDir . '/facade/ignition/src/LogRecorder/LogRecorder.php', + 'Facade\\Ignition\\Logger\\FlareHandler' => $vendorDir . '/facade/ignition/src/Logger/FlareHandler.php', + 'Facade\\Ignition\\Middleware\\AddDumps' => $vendorDir . '/facade/ignition/src/Middleware/AddDumps.php', + 'Facade\\Ignition\\Middleware\\AddEnvironmentInformation' => $vendorDir . '/facade/ignition/src/Middleware/AddEnvironmentInformation.php', + 'Facade\\Ignition\\Middleware\\AddGitInformation' => $vendorDir . '/facade/ignition/src/Middleware/AddGitInformation.php', + 'Facade\\Ignition\\Middleware\\AddLogs' => $vendorDir . '/facade/ignition/src/Middleware/AddLogs.php', + 'Facade\\Ignition\\Middleware\\AddQueries' => $vendorDir . '/facade/ignition/src/Middleware/AddQueries.php', + 'Facade\\Ignition\\Middleware\\AddSolutions' => $vendorDir . '/facade/ignition/src/Middleware/AddSolutions.php', + 'Facade\\Ignition\\Middleware\\CustomizeGrouping' => $vendorDir . '/facade/ignition/src/Middleware/CustomizeGrouping.php', + 'Facade\\Ignition\\Middleware\\SetNotifierName' => $vendorDir . '/facade/ignition/src/Middleware/SetNotifierName.php', + 'Facade\\Ignition\\QueryRecorder\\Query' => $vendorDir . '/facade/ignition/src/QueryRecorder/Query.php', + 'Facade\\Ignition\\QueryRecorder\\QueryRecorder' => $vendorDir . '/facade/ignition/src/QueryRecorder/QueryRecorder.php', + 'Facade\\Ignition\\SolutionProviders\\BadMethodCallSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\DefaultDbNameSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\IncorrectValetDbCredentialsSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/IncorrectValetDbCredentialsSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\InvalidRouteActionSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/InvalidRouteActionSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MergeConflictSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingAppKeySolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingColumnSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingImportSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingPackageSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\RouteNotDefinedSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\RunningLaravelDuskInProductionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\SolutionProviderRepository' => $vendorDir . '/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php', + 'Facade\\Ignition\\SolutionProviders\\TableNotFoundSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\UndefinedVariableSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\UnknownValidationSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\ViewNotFoundSolutionProvider' => $vendorDir . '/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php', + 'Facade\\Ignition\\Solutions\\GenerateAppKeySolution' => $vendorDir . '/facade/ignition/src/Solutions/GenerateAppKeySolution.php', + 'Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution' => $vendorDir . '/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php', + 'Facade\\Ignition\\Solutions\\MissingPackageSolution' => $vendorDir . '/facade/ignition/src/Solutions/MissingPackageSolution.php', + 'Facade\\Ignition\\Solutions\\RunMigrationsSolution' => $vendorDir . '/facade/ignition/src/Solutions/RunMigrationsSolution.php', + 'Facade\\Ignition\\Solutions\\SolutionTransformer' => $vendorDir . '/facade/ignition/src/Solutions/SolutionTransformer.php', + 'Facade\\Ignition\\Solutions\\SuggestCorrectVariableNameSolution' => $vendorDir . '/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php', + 'Facade\\Ignition\\Solutions\\SuggestImportSolution' => $vendorDir . '/facade/ignition/src/Solutions/SuggestImportSolution.php', + 'Facade\\Ignition\\Solutions\\SuggestUsingCorrectDbNameSolution' => $vendorDir . '/facade/ignition/src/Solutions/SuggestUsingCorrectDbNameSolution.php', + 'Facade\\Ignition\\Solutions\\UseDefaultValetDbCredentialsSolution' => $vendorDir . '/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php', + 'Facade\\Ignition\\Support\\ComposerClassMap' => $vendorDir . '/facade/ignition/src/Support/ComposerClassMap.php', + 'Facade\\Ignition\\Support\\FakeComposer' => $vendorDir . '/facade/ignition/src/Support/FakeComposer.php', + 'Facade\\Ignition\\Support\\Packagist\\Package' => $vendorDir . '/facade/ignition/src/Support/Packagist/Package.php', + 'Facade\\Ignition\\Support\\Packagist\\Packagist' => $vendorDir . '/facade/ignition/src/Support/Packagist/Packagist.php', + 'Facade\\Ignition\\Support\\StringComparator' => $vendorDir . '/facade/ignition/src/Support/StringComparator.php', + 'Facade\\Ignition\\Tabs\\Tab' => $vendorDir . '/facade/ignition/src/Tabs/Tab.php', + 'Facade\\Ignition\\Views\\Compilers\\BladeSourceMapCompiler' => $vendorDir . '/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php', + 'Facade\\Ignition\\Views\\Concerns\\CollectsViewExceptions' => $vendorDir . '/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php', + 'Facade\\Ignition\\Views\\Engines\\CompilerEngine' => $vendorDir . '/facade/ignition/src/Views/Engines/CompilerEngine.php', + 'Facade\\Ignition\\Views\\Engines\\PhpEngine' => $vendorDir . '/facade/ignition/src/Views/Engines/PhpEngine.php', + 'Faker\\Calculator\\Ean' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Ean.php', + 'Faker\\Calculator\\Iban' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Iban.php', + 'Faker\\Calculator\\Inn' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Inn.php', + 'Faker\\Calculator\\Luhn' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/Luhn.php', + 'Faker\\Calculator\\TCNo' => $vendorDir . '/fzaninotto/faker/src/Faker/Calculator/TCNo.php', + 'Faker\\DefaultGenerator' => $vendorDir . '/fzaninotto/faker/src/Faker/DefaultGenerator.php', + 'Faker\\Documentor' => $vendorDir . '/fzaninotto/faker/src/Faker/Documentor.php', + 'Faker\\Factory' => $vendorDir . '/fzaninotto/faker/src/Faker/Factory.php', + 'Faker\\Generator' => $vendorDir . '/fzaninotto/faker/src/Faker/Generator.php', + 'Faker\\Guesser\\Name' => $vendorDir . '/fzaninotto/faker/src/Faker/Guesser/Name.php', + 'Faker\\ORM\\CakePHP\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php', + 'Faker\\ORM\\CakePHP\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php', + 'Faker\\ORM\\CakePHP\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php', + 'Faker\\ORM\\Doctrine\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php', + 'Faker\\ORM\\Doctrine\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php', + 'Faker\\ORM\\Doctrine\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php', + 'Faker\\ORM\\Mandango\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php', + 'Faker\\ORM\\Mandango\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php', + 'Faker\\ORM\\Mandango\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php', + 'Faker\\ORM\\Propel2\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php', + 'Faker\\ORM\\Propel2\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php', + 'Faker\\ORM\\Propel2\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php', + 'Faker\\ORM\\Propel\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php', + 'Faker\\ORM\\Propel\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php', + 'Faker\\ORM\\Propel\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php', + 'Faker\\ORM\\Spot\\ColumnTypeGuesser' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php', + 'Faker\\ORM\\Spot\\EntityPopulator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php', + 'Faker\\ORM\\Spot\\Populator' => $vendorDir . '/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php', + 'Faker\\Provider\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Address.php', + 'Faker\\Provider\\Barcode' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Barcode.php', + 'Faker\\Provider\\Base' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Base.php', + 'Faker\\Provider\\Biased' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Biased.php', + 'Faker\\Provider\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Color.php', + 'Faker\\Provider\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Company.php', + 'Faker\\Provider\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/DateTime.php', + 'Faker\\Provider\\File' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/File.php', + 'Faker\\Provider\\HtmlLorem' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/HtmlLorem.php', + 'Faker\\Provider\\Image' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Image.php', + 'Faker\\Provider\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Internet.php', + 'Faker\\Provider\\Lorem' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Lorem.php', + 'Faker\\Provider\\Miscellaneous' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php', + 'Faker\\Provider\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Payment.php', + 'Faker\\Provider\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Person.php', + 'Faker\\Provider\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php', + 'Faker\\Provider\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Text.php', + 'Faker\\Provider\\UserAgent' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/UserAgent.php', + 'Faker\\Provider\\Uuid' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/Uuid.php', + 'Faker\\Provider\\ar_JO\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Address.php', + 'Faker\\Provider\\ar_JO\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php', + 'Faker\\Provider\\ar_JO\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Internet.php', + 'Faker\\Provider\\ar_JO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Person.php', + 'Faker\\Provider\\ar_JO\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php', + 'Faker\\Provider\\ar_SA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php', + 'Faker\\Provider\\ar_SA\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Color.php', + 'Faker\\Provider\\ar_SA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Company.php', + 'Faker\\Provider\\ar_SA\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Internet.php', + 'Faker\\Provider\\ar_SA\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php', + 'Faker\\Provider\\ar_SA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Person.php', + 'Faker\\Provider\\ar_SA\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Text.php', + 'Faker\\Provider\\at_AT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/at_AT/Payment.php', + 'Faker\\Provider\\bg_BG\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Internet.php', + 'Faker\\Provider\\bg_BG\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Payment.php', + 'Faker\\Provider\\bg_BG\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Person.php', + 'Faker\\Provider\\bg_BG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bg_BG/PhoneNumber.php', + 'Faker\\Provider\\bn_BD\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Address.php', + 'Faker\\Provider\\bn_BD\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Company.php', + 'Faker\\Provider\\bn_BD\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Person.php', + 'Faker\\Provider\\bn_BD\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bn_BD/PhoneNumber.php', + 'Faker\\Provider\\bn_BD\\Utils' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Utils.php', + 'Faker\\Provider\\cs_CZ\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Address.php', + 'Faker\\Provider\\cs_CZ\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Company.php', + 'Faker\\Provider\\cs_CZ\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/DateTime.php', + 'Faker\\Provider\\cs_CZ\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Internet.php', + 'Faker\\Provider\\cs_CZ\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Payment.php', + 'Faker\\Provider\\cs_CZ\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Person.php', + 'Faker\\Provider\\cs_CZ\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php', + 'Faker\\Provider\\cs_CZ\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Text.php', + 'Faker\\Provider\\da_DK\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/da_DK/Address.php', + 'Faker\\Provider\\da_DK\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/da_DK/Company.php', + 'Faker\\Provider\\da_DK\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/da_DK/Internet.php', + 'Faker\\Provider\\da_DK\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/da_DK/Payment.php', + 'Faker\\Provider\\da_DK\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/da_DK/Person.php', + 'Faker\\Provider\\da_DK\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/da_DK/PhoneNumber.php', + 'Faker\\Provider\\de_AT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php', + 'Faker\\Provider\\de_AT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Company.php', + 'Faker\\Provider\\de_AT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Internet.php', + 'Faker\\Provider\\de_AT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Payment.php', + 'Faker\\Provider\\de_AT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php', + 'Faker\\Provider\\de_AT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/PhoneNumber.php', + 'Faker\\Provider\\de_AT\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php', + 'Faker\\Provider\\de_CH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Address.php', + 'Faker\\Provider\\de_CH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php', + 'Faker\\Provider\\de_CH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Internet.php', + 'Faker\\Provider\\de_CH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Payment.php', + 'Faker\\Provider\\de_CH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Person.php', + 'Faker\\Provider\\de_CH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/PhoneNumber.php', + 'Faker\\Provider\\de_CH\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_CH/Text.php', + 'Faker\\Provider\\de_DE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Address.php', + 'Faker\\Provider\\de_DE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Company.php', + 'Faker\\Provider\\de_DE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Internet.php', + 'Faker\\Provider\\de_DE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Payment.php', + 'Faker\\Provider\\de_DE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Person.php', + 'Faker\\Provider\\de_DE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/PhoneNumber.php', + 'Faker\\Provider\\de_DE\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/de_DE/Text.php', + 'Faker\\Provider\\el_CY\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Address.php', + 'Faker\\Provider\\el_CY\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Company.php', + 'Faker\\Provider\\el_CY\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Internet.php', + 'Faker\\Provider\\el_CY\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Payment.php', + 'Faker\\Provider\\el_CY\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/Person.php', + 'Faker\\Provider\\el_CY\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_CY/PhoneNumber.php', + 'Faker\\Provider\\el_GR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Address.php', + 'Faker\\Provider\\el_GR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Company.php', + 'Faker\\Provider\\el_GR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Payment.php', + 'Faker\\Provider\\el_GR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Person.php', + 'Faker\\Provider\\el_GR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/PhoneNumber.php', + 'Faker\\Provider\\el_GR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/el_GR/Text.php', + 'Faker\\Provider\\en_AU\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_AU/Address.php', + 'Faker\\Provider\\en_AU\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_AU/Internet.php', + 'Faker\\Provider\\en_AU\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_AU/PhoneNumber.php', + 'Faker\\Provider\\en_CA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_CA/Address.php', + 'Faker\\Provider\\en_CA\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_CA/PhoneNumber.php', + 'Faker\\Provider\\en_GB\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/Address.php', + 'Faker\\Provider\\en_GB\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/Internet.php', + 'Faker\\Provider\\en_GB\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/Payment.php', + 'Faker\\Provider\\en_GB\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/Person.php', + 'Faker\\Provider\\en_GB\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_GB/PhoneNumber.php', + 'Faker\\Provider\\en_HK\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_HK/Address.php', + 'Faker\\Provider\\en_HK\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php', + 'Faker\\Provider\\en_HK\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_HK/PhoneNumber.php', + 'Faker\\Provider\\en_IN\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/Address.php', + 'Faker\\Provider\\en_IN\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php', + 'Faker\\Provider\\en_IN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/Person.php', + 'Faker\\Provider\\en_IN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_IN/PhoneNumber.php', + 'Faker\\Provider\\en_NG\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/Address.php', + 'Faker\\Provider\\en_NG\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/Internet.php', + 'Faker\\Provider\\en_NG\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/Person.php', + 'Faker\\Provider\\en_NG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NG/PhoneNumber.php', + 'Faker\\Provider\\en_NZ\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Address.php', + 'Faker\\Provider\\en_NZ\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Internet.php', + 'Faker\\Provider\\en_NZ\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_NZ/PhoneNumber.php', + 'Faker\\Provider\\en_PH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_PH/Address.php', + 'Faker\\Provider\\en_PH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_PH/PhoneNumber.php', + 'Faker\\Provider\\en_SG\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_SG/Address.php', + 'Faker\\Provider\\en_SG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_SG/PhoneNumber.php', + 'Faker\\Provider\\en_UG\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php', + 'Faker\\Provider\\en_UG\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/Internet.php', + 'Faker\\Provider\\en_UG\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/Person.php', + 'Faker\\Provider\\en_UG\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_UG/PhoneNumber.php', + 'Faker\\Provider\\en_US\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Address.php', + 'Faker\\Provider\\en_US\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Company.php', + 'Faker\\Provider\\en_US\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php', + 'Faker\\Provider\\en_US\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Person.php', + 'Faker\\Provider\\en_US\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/PhoneNumber.php', + 'Faker\\Provider\\en_US\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_US/Text.php', + 'Faker\\Provider\\en_ZA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php', + 'Faker\\Provider\\en_ZA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php', + 'Faker\\Provider\\en_ZA\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php', + 'Faker\\Provider\\en_ZA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php', + 'Faker\\Provider\\en_ZA\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php', + 'Faker\\Provider\\es_AR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php', + 'Faker\\Provider\\es_AR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php', + 'Faker\\Provider\\es_AR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php', + 'Faker\\Provider\\es_AR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_AR/PhoneNumber.php', + 'Faker\\Provider\\es_ES\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php', + 'Faker\\Provider\\es_ES\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php', + 'Faker\\Provider\\es_ES\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Company.php', + 'Faker\\Provider\\es_ES\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Internet.php', + 'Faker\\Provider\\es_ES\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Payment.php', + 'Faker\\Provider\\es_ES\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Person.php', + 'Faker\\Provider\\es_ES\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/PhoneNumber.php', + 'Faker\\Provider\\es_ES\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_ES/Text.php', + 'Faker\\Provider\\es_PE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/Address.php', + 'Faker\\Provider\\es_PE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/Company.php', + 'Faker\\Provider\\es_PE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/Person.php', + 'Faker\\Provider\\es_PE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_PE/PhoneNumber.php', + 'Faker\\Provider\\es_VE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/Address.php', + 'Faker\\Provider\\es_VE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/Company.php', + 'Faker\\Provider\\es_VE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/Internet.php', + 'Faker\\Provider\\es_VE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/Person.php', + 'Faker\\Provider\\es_VE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/es_VE/PhoneNumber.php', + 'Faker\\Provider\\et_EE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php', + 'Faker\\Provider\\fa_IR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php', + 'Faker\\Provider\\fa_IR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php', + 'Faker\\Provider\\fa_IR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Internet.php', + 'Faker\\Provider\\fa_IR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Person.php', + 'Faker\\Provider\\fa_IR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php', + 'Faker\\Provider\\fa_IR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Text.php', + 'Faker\\Provider\\fi_FI\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Address.php', + 'Faker\\Provider\\fi_FI\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Company.php', + 'Faker\\Provider\\fi_FI\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Internet.php', + 'Faker\\Provider\\fi_FI\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Payment.php', + 'Faker\\Provider\\fi_FI\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Person.php', + 'Faker\\Provider\\fi_FI\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php', + 'Faker\\Provider\\fr_BE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php', + 'Faker\\Provider\\fr_BE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php', + 'Faker\\Provider\\fr_BE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Internet.php', + 'Faker\\Provider\\fr_BE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php', + 'Faker\\Provider\\fr_BE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Person.php', + 'Faker\\Provider\\fr_BE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_BE/PhoneNumber.php', + 'Faker\\Provider\\fr_CA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php', + 'Faker\\Provider\\fr_CA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php', + 'Faker\\Provider\\fr_CA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Person.php', + 'Faker\\Provider\\fr_CA\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Text.php', + 'Faker\\Provider\\fr_CH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Address.php', + 'Faker\\Provider\\fr_CH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php', + 'Faker\\Provider\\fr_CH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Internet.php', + 'Faker\\Provider\\fr_CH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Payment.php', + 'Faker\\Provider\\fr_CH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Person.php', + 'Faker\\Provider\\fr_CH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/PhoneNumber.php', + 'Faker\\Provider\\fr_CH\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Text.php', + 'Faker\\Provider\\fr_FR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Address.php', + 'Faker\\Provider\\fr_FR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php', + 'Faker\\Provider\\fr_FR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Internet.php', + 'Faker\\Provider\\fr_FR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php', + 'Faker\\Provider\\fr_FR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php', + 'Faker\\Provider\\fr_FR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php', + 'Faker\\Provider\\fr_FR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Text.php', + 'Faker\\Provider\\he_IL\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php', + 'Faker\\Provider\\he_IL\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Company.php', + 'Faker\\Provider\\he_IL\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Payment.php', + 'Faker\\Provider\\he_IL\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/Person.php', + 'Faker\\Provider\\he_IL\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/he_IL/PhoneNumber.php', + 'Faker\\Provider\\hr_HR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Address.php', + 'Faker\\Provider\\hr_HR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Company.php', + 'Faker\\Provider\\hr_HR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Payment.php', + 'Faker\\Provider\\hr_HR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Person.php', + 'Faker\\Provider\\hr_HR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hr_HR/PhoneNumber.php', + 'Faker\\Provider\\hu_HU\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Address.php', + 'Faker\\Provider\\hu_HU\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Company.php', + 'Faker\\Provider\\hu_HU\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php', + 'Faker\\Provider\\hu_HU\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Person.php', + 'Faker\\Provider\\hu_HU\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/PhoneNumber.php', + 'Faker\\Provider\\hu_HU\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php', + 'Faker\\Provider\\hy_AM\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Address.php', + 'Faker\\Provider\\hy_AM\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Color.php', + 'Faker\\Provider\\hy_AM\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Company.php', + 'Faker\\Provider\\hy_AM\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Internet.php', + 'Faker\\Provider\\hy_AM\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Person.php', + 'Faker\\Provider\\hy_AM\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/hy_AM/PhoneNumber.php', + 'Faker\\Provider\\id_ID\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Address.php', + 'Faker\\Provider\\id_ID\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php', + 'Faker\\Provider\\id_ID\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Company.php', + 'Faker\\Provider\\id_ID\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Internet.php', + 'Faker\\Provider\\id_ID\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/Person.php', + 'Faker\\Provider\\id_ID\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/id_ID/PhoneNumber.php', + 'Faker\\Provider\\is_IS\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Address.php', + 'Faker\\Provider\\is_IS\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Company.php', + 'Faker\\Provider\\is_IS\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Internet.php', + 'Faker\\Provider\\is_IS\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Payment.php', + 'Faker\\Provider\\is_IS\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php', + 'Faker\\Provider\\is_IS\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/is_IS/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php', + 'Faker\\Provider\\it_CH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php', + 'Faker\\Provider\\it_CH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Internet.php', + 'Faker\\Provider\\it_CH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Payment.php', + 'Faker\\Provider\\it_CH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Person.php', + 'Faker\\Provider\\it_CH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_CH/Text.php', + 'Faker\\Provider\\it_IT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Address.php', + 'Faker\\Provider\\it_IT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Company.php', + 'Faker\\Provider\\it_IT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Internet.php', + 'Faker\\Provider\\it_IT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Payment.php', + 'Faker\\Provider\\it_IT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Person.php', + 'Faker\\Provider\\it_IT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/PhoneNumber.php', + 'Faker\\Provider\\it_IT\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/it_IT/Text.php', + 'Faker\\Provider\\ja_JP\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Address.php', + 'Faker\\Provider\\ja_JP\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Company.php', + 'Faker\\Provider\\ja_JP\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Internet.php', + 'Faker\\Provider\\ja_JP\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Person.php', + 'Faker\\Provider\\ja_JP\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php', + 'Faker\\Provider\\ja_JP\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php', + 'Faker\\Provider\\ka_GE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Address.php', + 'Faker\\Provider\\ka_GE\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Color.php', + 'Faker\\Provider\\ka_GE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Company.php', + 'Faker\\Provider\\ka_GE\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php', + 'Faker\\Provider\\ka_GE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php', + 'Faker\\Provider\\ka_GE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Payment.php', + 'Faker\\Provider\\ka_GE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Person.php', + 'Faker\\Provider\\ka_GE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/PhoneNumber.php', + 'Faker\\Provider\\ka_GE\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Text.php', + 'Faker\\Provider\\kk_KZ\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Address.php', + 'Faker\\Provider\\kk_KZ\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Color.php', + 'Faker\\Provider\\kk_KZ\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php', + 'Faker\\Provider\\kk_KZ\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Internet.php', + 'Faker\\Provider\\kk_KZ\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php', + 'Faker\\Provider\\kk_KZ\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php', + 'Faker\\Provider\\kk_KZ\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/PhoneNumber.php', + 'Faker\\Provider\\kk_KZ\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Text.php', + 'Faker\\Provider\\ko_KR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php', + 'Faker\\Provider\\ko_KR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Company.php', + 'Faker\\Provider\\ko_KR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php', + 'Faker\\Provider\\ko_KR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php', + 'Faker\\Provider\\ko_KR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php', + 'Faker\\Provider\\ko_KR\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php', + 'Faker\\Provider\\lt_LT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php', + 'Faker\\Provider\\lt_LT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php', + 'Faker\\Provider\\lt_LT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Internet.php', + 'Faker\\Provider\\lt_LT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Payment.php', + 'Faker\\Provider\\lt_LT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Person.php', + 'Faker\\Provider\\lt_LT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php', + 'Faker\\Provider\\lv_LV\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Address.php', + 'Faker\\Provider\\lv_LV\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Color.php', + 'Faker\\Provider\\lv_LV\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Internet.php', + 'Faker\\Provider\\lv_LV\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Payment.php', + 'Faker\\Provider\\lv_LV\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Person.php', + 'Faker\\Provider\\lv_LV\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php', + 'Faker\\Provider\\me_ME\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php', + 'Faker\\Provider\\me_ME\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/Company.php', + 'Faker\\Provider\\me_ME\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/Payment.php', + 'Faker\\Provider\\me_ME\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/Person.php', + 'Faker\\Provider\\me_ME\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/me_ME/PhoneNumber.php', + 'Faker\\Provider\\mn_MN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php', + 'Faker\\Provider\\mn_MN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php', + 'Faker\\Provider\\ms_MY\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Address.php', + 'Faker\\Provider\\ms_MY\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php', + 'Faker\\Provider\\ms_MY\\Miscellaneous' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Miscellaneous.php', + 'Faker\\Provider\\ms_MY\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php', + 'Faker\\Provider\\ms_MY\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php', + 'Faker\\Provider\\ms_MY\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php', + 'Faker\\Provider\\nb_NO\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php', + 'Faker\\Provider\\nb_NO\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Company.php', + 'Faker\\Provider\\nb_NO\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Payment.php', + 'Faker\\Provider\\nb_NO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Person.php', + 'Faker\\Provider\\nb_NO\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php', + 'Faker\\Provider\\ne_NP\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php', + 'Faker\\Provider\\ne_NP\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Internet.php', + 'Faker\\Provider\\ne_NP\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php', + 'Faker\\Provider\\ne_NP\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ne_NP/PhoneNumber.php', + 'Faker\\Provider\\nl_BE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php', + 'Faker\\Provider\\nl_BE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Company.php', + 'Faker\\Provider\\nl_BE\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Internet.php', + 'Faker\\Provider\\nl_BE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php', + 'Faker\\Provider\\nl_BE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php', + 'Faker\\Provider\\nl_BE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_BE/PhoneNumber.php', + 'Faker\\Provider\\nl_NL\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Address.php', + 'Faker\\Provider\\nl_NL\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Color.php', + 'Faker\\Provider\\nl_NL\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Company.php', + 'Faker\\Provider\\nl_NL\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Internet.php', + 'Faker\\Provider\\nl_NL\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Payment.php', + 'Faker\\Provider\\nl_NL\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php', + 'Faker\\Provider\\nl_NL\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/PhoneNumber.php', + 'Faker\\Provider\\nl_NL\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php', + 'Faker\\Provider\\pl_PL\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Address.php', + 'Faker\\Provider\\pl_PL\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Company.php', + 'Faker\\Provider\\pl_PL\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Internet.php', + 'Faker\\Provider\\pl_PL\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Payment.php', + 'Faker\\Provider\\pl_PL\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php', + 'Faker\\Provider\\pl_PL\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/PhoneNumber.php', + 'Faker\\Provider\\pl_PL\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php', + 'Faker\\Provider\\pt_BR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php', + 'Faker\\Provider\\pt_BR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php', + 'Faker\\Provider\\pt_BR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Internet.php', + 'Faker\\Provider\\pt_BR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php', + 'Faker\\Provider\\pt_BR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Person.php', + 'Faker\\Provider\\pt_BR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php', + 'Faker\\Provider\\pt_PT\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php', + 'Faker\\Provider\\pt_PT\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php', + 'Faker\\Provider\\pt_PT\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Internet.php', + 'Faker\\Provider\\pt_PT\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Payment.php', + 'Faker\\Provider\\pt_PT\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Person.php', + 'Faker\\Provider\\pt_PT\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/pt_PT/PhoneNumber.php', + 'Faker\\Provider\\ro_MD\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Address.php', + 'Faker\\Provider\\ro_MD\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Payment.php', + 'Faker\\Provider\\ro_MD\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Person.php', + 'Faker\\Provider\\ro_MD\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/PhoneNumber.php', + 'Faker\\Provider\\ro_MD\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Text.php', + 'Faker\\Provider\\ro_RO\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Address.php', + 'Faker\\Provider\\ro_RO\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Payment.php', + 'Faker\\Provider\\ro_RO\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Person.php', + 'Faker\\Provider\\ro_RO\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php', + 'Faker\\Provider\\ro_RO\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php', + 'Faker\\Provider\\ru_RU\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Address.php', + 'Faker\\Provider\\ru_RU\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Color.php', + 'Faker\\Provider\\ru_RU\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Company.php', + 'Faker\\Provider\\ru_RU\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Internet.php', + 'Faker\\Provider\\ru_RU\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Payment.php', + 'Faker\\Provider\\ru_RU\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Person.php', + 'Faker\\Provider\\ru_RU\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/PhoneNumber.php', + 'Faker\\Provider\\ru_RU\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php', + 'Faker\\Provider\\sk_SK\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Address.php', + 'Faker\\Provider\\sk_SK\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php', + 'Faker\\Provider\\sk_SK\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Internet.php', + 'Faker\\Provider\\sk_SK\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Payment.php', + 'Faker\\Provider\\sk_SK\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php', + 'Faker\\Provider\\sk_SK\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sk_SK/PhoneNumber.php', + 'Faker\\Provider\\sl_SI\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php', + 'Faker\\Provider\\sl_SI\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php', + 'Faker\\Provider\\sl_SI\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Internet.php', + 'Faker\\Provider\\sl_SI\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Payment.php', + 'Faker\\Provider\\sl_SI\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Person.php', + 'Faker\\Provider\\sl_SI\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sl_SI/PhoneNumber.php', + 'Faker\\Provider\\sr_Cyrl_RS\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Address.php', + 'Faker\\Provider\\sr_Cyrl_RS\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Payment.php', + 'Faker\\Provider\\sr_Cyrl_RS\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Person.php', + 'Faker\\Provider\\sr_Latn_RS\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Address.php', + 'Faker\\Provider\\sr_Latn_RS\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Payment.php', + 'Faker\\Provider\\sr_Latn_RS\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Person.php', + 'Faker\\Provider\\sr_RS\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Address.php', + 'Faker\\Provider\\sr_RS\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Payment.php', + 'Faker\\Provider\\sr_RS\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Person.php', + 'Faker\\Provider\\sv_SE\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Address.php', + 'Faker\\Provider\\sv_SE\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Company.php', + 'Faker\\Provider\\sv_SE\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Payment.php', + 'Faker\\Provider\\sv_SE\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Person.php', + 'Faker\\Provider\\sv_SE\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/sv_SE/PhoneNumber.php', + 'Faker\\Provider\\th_TH\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Address.php', + 'Faker\\Provider\\th_TH\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Color.php', + 'Faker\\Provider\\th_TH\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Company.php', + 'Faker\\Provider\\th_TH\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Internet.php', + 'Faker\\Provider\\th_TH\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Payment.php', + 'Faker\\Provider\\th_TH\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/Person.php', + 'Faker\\Provider\\th_TH\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/th_TH/PhoneNumber.php', + 'Faker\\Provider\\tr_TR\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Address.php', + 'Faker\\Provider\\tr_TR\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Color.php', + 'Faker\\Provider\\tr_TR\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Company.php', + 'Faker\\Provider\\tr_TR\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/DateTime.php', + 'Faker\\Provider\\tr_TR\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Internet.php', + 'Faker\\Provider\\tr_TR\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Payment.php', + 'Faker\\Provider\\tr_TR\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Person.php', + 'Faker\\Provider\\tr_TR\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/tr_TR/PhoneNumber.php', + 'Faker\\Provider\\uk_UA\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Address.php', + 'Faker\\Provider\\uk_UA\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Color.php', + 'Faker\\Provider\\uk_UA\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Company.php', + 'Faker\\Provider\\uk_UA\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Internet.php', + 'Faker\\Provider\\uk_UA\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Payment.php', + 'Faker\\Provider\\uk_UA\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Person.php', + 'Faker\\Provider\\uk_UA\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php', + 'Faker\\Provider\\uk_UA\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php', + 'Faker\\Provider\\vi_VN\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php', + 'Faker\\Provider\\vi_VN\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Color.php', + 'Faker\\Provider\\vi_VN\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Internet.php', + 'Faker\\Provider\\vi_VN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Person.php', + 'Faker\\Provider\\vi_VN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php', + 'Faker\\Provider\\zh_CN\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php', + 'Faker\\Provider\\zh_CN\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php', + 'Faker\\Provider\\zh_CN\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Company.php', + 'Faker\\Provider\\zh_CN\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/DateTime.php', + 'Faker\\Provider\\zh_CN\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php', + 'Faker\\Provider\\zh_CN\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php', + 'Faker\\Provider\\zh_CN\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Person.php', + 'Faker\\Provider\\zh_CN\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_CN/PhoneNumber.php', + 'Faker\\Provider\\zh_TW\\Address' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Address.php', + 'Faker\\Provider\\zh_TW\\Color' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Color.php', + 'Faker\\Provider\\zh_TW\\Company' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php', + 'Faker\\Provider\\zh_TW\\DateTime' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/DateTime.php', + 'Faker\\Provider\\zh_TW\\Internet' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Internet.php', + 'Faker\\Provider\\zh_TW\\Payment' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Payment.php', + 'Faker\\Provider\\zh_TW\\Person' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php', + 'Faker\\Provider\\zh_TW\\PhoneNumber' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/PhoneNumber.php', + 'Faker\\Provider\\zh_TW\\Text' => $vendorDir . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php', + 'Faker\\UniqueGenerator' => $vendorDir . '/fzaninotto/faker/src/Faker/UniqueGenerator.php', + 'Faker\\ValidGenerator' => $vendorDir . '/fzaninotto/faker/src/Faker/ValidGenerator.php', + 'Fideloper\\Proxy\\TrustProxies' => $vendorDir . '/fideloper/proxy/src/TrustProxies.php', + 'Fideloper\\Proxy\\TrustedProxyServiceProvider' => $vendorDir . '/fideloper/proxy/src/TrustedProxyServiceProvider.php', + 'Fruitcake\\Cors\\CorsServiceProvider' => $vendorDir . '/fruitcake/laravel-cors/src/CorsServiceProvider.php', + 'Fruitcake\\Cors\\HandleCors' => $vendorDir . '/fruitcake/laravel-cors/src/HandleCors.php', + 'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php', + 'GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php', + 'GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', + 'GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', + 'GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', + 'GuzzleHttp\\Cookie\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php', + 'GuzzleHttp\\Cookie\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php', + 'GuzzleHttp\\Exception\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php', + 'GuzzleHttp\\Exception\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php', + 'GuzzleHttp\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php', + 'GuzzleHttp\\Exception\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', + 'GuzzleHttp\\Exception\\InvalidArgumentException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', + 'GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php', + 'GuzzleHttp\\Exception\\SeekException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/SeekException.php', + 'GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php', + 'GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', + 'GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php', + 'GuzzleHttp\\HandlerStack' => $vendorDir . '/guzzlehttp/guzzle/src/HandlerStack.php', + 'GuzzleHttp\\Handler\\CurlFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php', + 'GuzzleHttp\\Handler\\CurlFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php', + 'GuzzleHttp\\Handler\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', + 'GuzzleHttp\\Handler\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', + 'GuzzleHttp\\Handler\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', + 'GuzzleHttp\\Handler\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', + 'GuzzleHttp\\Handler\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php', + 'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', + 'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php', + 'GuzzleHttp\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php', + 'GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php', + 'GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', + 'GuzzleHttp\\Promise\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php', + 'GuzzleHttp\\Promise\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php', + 'GuzzleHttp\\Promise\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php', + 'GuzzleHttp\\Promise\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php', + 'GuzzleHttp\\Promise\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php', + 'GuzzleHttp\\Promise\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php', + 'GuzzleHttp\\Promise\\PromiseInterface' => $vendorDir . '/guzzlehttp/promises/src/PromiseInterface.php', + 'GuzzleHttp\\Promise\\PromisorInterface' => $vendorDir . '/guzzlehttp/promises/src/PromisorInterface.php', + 'GuzzleHttp\\Promise\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php', + 'GuzzleHttp\\Promise\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php', + 'GuzzleHttp\\Promise\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php', + 'GuzzleHttp\\Promise\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php', + 'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php', + 'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php', + 'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php', + 'GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php', + 'GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php', + 'GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php', + 'GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php', + 'GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php', + 'GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php', + 'GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php', + 'GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php', + 'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php', + 'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php', + 'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php', + 'GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php', + 'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php', + 'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php', + 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', + 'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php', + 'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php', + 'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php', + 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php', + 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php', + 'GuzzleHttp\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php', + 'GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php', + 'GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php', + 'GuzzleHttp\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php', + 'GuzzleHttp\\UriTemplate' => $vendorDir . '/guzzlehttp/guzzle/src/UriTemplate.php', + 'GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php', + 'Hamcrest\\Arrays\\IsArray' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArray.php', + 'Hamcrest\\Arrays\\IsArrayContaining' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContaining.php', + 'Hamcrest\\Arrays\\IsArrayContainingInAnyOrder' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInAnyOrder.php', + 'Hamcrest\\Arrays\\IsArrayContainingInOrder' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInOrder.php', + 'Hamcrest\\Arrays\\IsArrayContainingKey' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKey.php', + 'Hamcrest\\Arrays\\IsArrayContainingKeyValuePair' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKeyValuePair.php', + 'Hamcrest\\Arrays\\IsArrayWithSize' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayWithSize.php', + 'Hamcrest\\Arrays\\MatchingOnce' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/MatchingOnce.php', + 'Hamcrest\\Arrays\\SeriesMatchingOnce' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/SeriesMatchingOnce.php', + 'Hamcrest\\AssertionError' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/AssertionError.php', + 'Hamcrest\\BaseDescription' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseDescription.php', + 'Hamcrest\\BaseMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseMatcher.php', + 'Hamcrest\\Collection\\IsEmptyTraversable' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsEmptyTraversable.php', + 'Hamcrest\\Collection\\IsTraversableWithSize' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsTraversableWithSize.php', + 'Hamcrest\\Core\\AllOf' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AllOf.php', + 'Hamcrest\\Core\\AnyOf' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AnyOf.php', + 'Hamcrest\\Core\\CombinableMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/CombinableMatcher.php', + 'Hamcrest\\Core\\DescribedAs' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/DescribedAs.php', + 'Hamcrest\\Core\\Every' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Every.php', + 'Hamcrest\\Core\\HasToString' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/HasToString.php', + 'Hamcrest\\Core\\Is' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Is.php', + 'Hamcrest\\Core\\IsAnything' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsAnything.php', + 'Hamcrest\\Core\\IsCollectionContaining' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsCollectionContaining.php', + 'Hamcrest\\Core\\IsEqual' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsEqual.php', + 'Hamcrest\\Core\\IsIdentical' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsIdentical.php', + 'Hamcrest\\Core\\IsInstanceOf' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsInstanceOf.php', + 'Hamcrest\\Core\\IsNot' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNot.php', + 'Hamcrest\\Core\\IsNull' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNull.php', + 'Hamcrest\\Core\\IsSame' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsSame.php', + 'Hamcrest\\Core\\IsTypeOf' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsTypeOf.php', + 'Hamcrest\\Core\\Set' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Set.php', + 'Hamcrest\\Core\\ShortcutCombination' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/ShortcutCombination.php', + 'Hamcrest\\Description' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Description.php', + 'Hamcrest\\DiagnosingMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/DiagnosingMatcher.php', + 'Hamcrest\\FeatureMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/FeatureMatcher.php', + 'Hamcrest\\Internal\\SelfDescribingValue' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Internal/SelfDescribingValue.php', + 'Hamcrest\\Matcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Matcher.php', + 'Hamcrest\\MatcherAssert' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/MatcherAssert.php', + 'Hamcrest\\Matchers' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Matchers.php', + 'Hamcrest\\NullDescription' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/NullDescription.php', + 'Hamcrest\\Number\\IsCloseTo' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Number/IsCloseTo.php', + 'Hamcrest\\Number\\OrderingComparison' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Number/OrderingComparison.php', + 'Hamcrest\\SelfDescribing' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/SelfDescribing.php', + 'Hamcrest\\StringDescription' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/StringDescription.php', + 'Hamcrest\\Text\\IsEmptyString' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEmptyString.php', + 'Hamcrest\\Text\\IsEqualIgnoringCase' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEqualIgnoringCase.php', + 'Hamcrest\\Text\\IsEqualIgnoringWhiteSpace' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEqualIgnoringWhiteSpace.php', + 'Hamcrest\\Text\\MatchesPattern' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/MatchesPattern.php', + 'Hamcrest\\Text\\StringContains' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContains.php', + 'Hamcrest\\Text\\StringContainsIgnoringCase' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContainsIgnoringCase.php', + 'Hamcrest\\Text\\StringContainsInOrder' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContainsInOrder.php', + 'Hamcrest\\Text\\StringEndsWith' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringEndsWith.php', + 'Hamcrest\\Text\\StringStartsWith' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringStartsWith.php', + 'Hamcrest\\Text\\SubstringMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/SubstringMatcher.php', + 'Hamcrest\\TypeSafeDiagnosingMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/TypeSafeDiagnosingMatcher.php', + 'Hamcrest\\TypeSafeMatcher' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/TypeSafeMatcher.php', + 'Hamcrest\\Type\\IsArray' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsArray.php', + 'Hamcrest\\Type\\IsBoolean' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsBoolean.php', + 'Hamcrest\\Type\\IsCallable' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsCallable.php', + 'Hamcrest\\Type\\IsDouble' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsDouble.php', + 'Hamcrest\\Type\\IsInteger' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsInteger.php', + 'Hamcrest\\Type\\IsNumeric' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsNumeric.php', + 'Hamcrest\\Type\\IsObject' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsObject.php', + 'Hamcrest\\Type\\IsResource' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsResource.php', + 'Hamcrest\\Type\\IsScalar' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsScalar.php', + 'Hamcrest\\Type\\IsString' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsString.php', + 'Hamcrest\\Util' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Util.php', + 'Hamcrest\\Xml\\HasXPath' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Xml/HasXPath.php', + 'Highlight\\Autoloader' => $vendorDir . '/scrivo/highlight.php/Highlight/Autoloader.php', + 'Highlight\\HighlightResult' => $vendorDir . '/scrivo/highlight.php/Highlight/HighlightResult.php', + 'Highlight\\Highlighter' => $vendorDir . '/scrivo/highlight.php/Highlight/Highlighter.php', + 'Highlight\\JsonRef' => $vendorDir . '/scrivo/highlight.php/Highlight/JsonRef.php', + 'Highlight\\Language' => $vendorDir . '/scrivo/highlight.php/Highlight/Language.php', + 'Highlight\\Mode' => $vendorDir . '/scrivo/highlight.php/Highlight/Mode.php', + 'Highlight\\ModeDeprecations' => $vendorDir . '/scrivo/highlight.php/Highlight/ModeDeprecations.php', + 'Highlight\\RegEx' => $vendorDir . '/scrivo/highlight.php/Highlight/RegEx.php', + 'Highlight\\RegExMatch' => $vendorDir . '/scrivo/highlight.php/Highlight/RegExMatch.php', + 'Highlight\\RegExUtils' => $vendorDir . '/scrivo/highlight.php/Highlight/RegExUtils.php', + 'Highlight\\Terminators' => $vendorDir . '/scrivo/highlight.php/Highlight/Terminators.php', + 'Illuminate\\Auth\\Access\\AuthorizationException' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/AuthorizationException.php', + 'Illuminate\\Auth\\Access\\Gate' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/Gate.php', + 'Illuminate\\Auth\\Access\\HandlesAuthorization' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/HandlesAuthorization.php', + 'Illuminate\\Auth\\Access\\Response' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/Response.php', + 'Illuminate\\Auth\\AuthManager' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/AuthManager.php', + 'Illuminate\\Auth\\AuthServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php', + 'Illuminate\\Auth\\Authenticatable' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Authenticatable.php', + 'Illuminate\\Auth\\AuthenticationException' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/AuthenticationException.php', + 'Illuminate\\Auth\\Console\\ClearResetsCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Console/ClearResetsCommand.php', + 'Illuminate\\Auth\\CreatesUserProviders' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/CreatesUserProviders.php', + 'Illuminate\\Auth\\DatabaseUserProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php', + 'Illuminate\\Auth\\EloquentUserProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php', + 'Illuminate\\Auth\\Events\\Attempting' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Attempting.php', + 'Illuminate\\Auth\\Events\\Authenticated' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Authenticated.php', + 'Illuminate\\Auth\\Events\\CurrentDeviceLogout' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/CurrentDeviceLogout.php', + 'Illuminate\\Auth\\Events\\Failed' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Failed.php', + 'Illuminate\\Auth\\Events\\Lockout' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Lockout.php', + 'Illuminate\\Auth\\Events\\Login' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Login.php', + 'Illuminate\\Auth\\Events\\Logout' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Logout.php', + 'Illuminate\\Auth\\Events\\OtherDeviceLogout' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/OtherDeviceLogout.php', + 'Illuminate\\Auth\\Events\\PasswordReset' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/PasswordReset.php', + 'Illuminate\\Auth\\Events\\Registered' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Registered.php', + 'Illuminate\\Auth\\Events\\Validated' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Validated.php', + 'Illuminate\\Auth\\Events\\Verified' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Events/Verified.php', + 'Illuminate\\Auth\\GenericUser' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/GenericUser.php', + 'Illuminate\\Auth\\GuardHelpers' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/GuardHelpers.php', + 'Illuminate\\Auth\\Listeners\\SendEmailVerificationNotification' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php', + 'Illuminate\\Auth\\Middleware\\Authenticate' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php', + 'Illuminate\\Auth\\Middleware\\AuthenticateWithBasicAuth' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Middleware/AuthenticateWithBasicAuth.php', + 'Illuminate\\Auth\\Middleware\\Authorize' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php', + 'Illuminate\\Auth\\Middleware\\EnsureEmailIsVerified' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Middleware/EnsureEmailIsVerified.php', + 'Illuminate\\Auth\\Middleware\\RequirePassword' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Middleware/RequirePassword.php', + 'Illuminate\\Auth\\MustVerifyEmail' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php', + 'Illuminate\\Auth\\Notifications\\ResetPassword' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php', + 'Illuminate\\Auth\\Notifications\\VerifyEmail' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php', + 'Illuminate\\Auth\\Passwords\\CanResetPassword' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Passwords/CanResetPassword.php', + 'Illuminate\\Auth\\Passwords\\DatabaseTokenRepository' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php', + 'Illuminate\\Auth\\Passwords\\PasswordBroker' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php', + 'Illuminate\\Auth\\Passwords\\PasswordBrokerManager' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php', + 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php', + 'Illuminate\\Auth\\Passwords\\TokenRepositoryInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Passwords/TokenRepositoryInterface.php', + 'Illuminate\\Auth\\Recaller' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Recaller.php', + 'Illuminate\\Auth\\RequestGuard' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/RequestGuard.php', + 'Illuminate\\Auth\\SessionGuard' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/SessionGuard.php', + 'Illuminate\\Auth\\TokenGuard' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/TokenGuard.php', + 'Illuminate\\Broadcasting\\BroadcastController' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastController.php', + 'Illuminate\\Broadcasting\\BroadcastEvent' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php', + 'Illuminate\\Broadcasting\\BroadcastException' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastException.php', + 'Illuminate\\Broadcasting\\BroadcastManager' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php', + 'Illuminate\\Broadcasting\\BroadcastServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastServiceProvider.php', + 'Illuminate\\Broadcasting\\Broadcasters\\Broadcaster' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\LogBroadcaster' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/LogBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\NullBroadcaster' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/NullBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\PusherBroadcaster' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\RedisBroadcaster' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\UsePusherChannelConventions' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/UsePusherChannelConventions.php', + 'Illuminate\\Broadcasting\\Channel' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/Channel.php', + 'Illuminate\\Broadcasting\\EncryptedPrivateChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/EncryptedPrivateChannel.php', + 'Illuminate\\Broadcasting\\InteractsWithSockets' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/InteractsWithSockets.php', + 'Illuminate\\Broadcasting\\PendingBroadcast' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/PendingBroadcast.php', + 'Illuminate\\Broadcasting\\PresenceChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/PresenceChannel.php', + 'Illuminate\\Broadcasting\\PrivateChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Broadcasting/PrivateChannel.php', + 'Illuminate\\Bus\\BusServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Bus/BusServiceProvider.php', + 'Illuminate\\Bus\\Dispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Bus/Dispatcher.php', + 'Illuminate\\Bus\\Queueable' => $vendorDir . '/laravel/framework/src/Illuminate/Bus/Queueable.php', + 'Illuminate\\Cache\\ApcStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/ApcStore.php', + 'Illuminate\\Cache\\ApcWrapper' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/ApcWrapper.php', + 'Illuminate\\Cache\\ArrayLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/ArrayLock.php', + 'Illuminate\\Cache\\ArrayStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/ArrayStore.php', + 'Illuminate\\Cache\\CacheManager' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/CacheManager.php', + 'Illuminate\\Cache\\CacheServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php', + 'Illuminate\\Cache\\Console\\CacheTableCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Console/CacheTableCommand.php', + 'Illuminate\\Cache\\Console\\ClearCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php', + 'Illuminate\\Cache\\Console\\ForgetCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Console/ForgetCommand.php', + 'Illuminate\\Cache\\DatabaseLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/DatabaseLock.php', + 'Illuminate\\Cache\\DatabaseStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/DatabaseStore.php', + 'Illuminate\\Cache\\DynamoDbLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/DynamoDbLock.php', + 'Illuminate\\Cache\\DynamoDbStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/DynamoDbStore.php', + 'Illuminate\\Cache\\Events\\CacheEvent' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/CacheEvent.php', + 'Illuminate\\Cache\\Events\\CacheHit' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/CacheHit.php', + 'Illuminate\\Cache\\Events\\CacheMissed' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/CacheMissed.php', + 'Illuminate\\Cache\\Events\\KeyForgotten' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/KeyForgotten.php', + 'Illuminate\\Cache\\Events\\KeyWritten' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/KeyWritten.php', + 'Illuminate\\Cache\\FileStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/FileStore.php', + 'Illuminate\\Cache\\Lock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Lock.php', + 'Illuminate\\Cache\\LuaScripts' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/LuaScripts.php', + 'Illuminate\\Cache\\MemcachedConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php', + 'Illuminate\\Cache\\MemcachedLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/MemcachedLock.php', + 'Illuminate\\Cache\\MemcachedStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/MemcachedStore.php', + 'Illuminate\\Cache\\NullStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/NullStore.php', + 'Illuminate\\Cache\\RateLimiter' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/RateLimiter.php', + 'Illuminate\\Cache\\RedisLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/RedisLock.php', + 'Illuminate\\Cache\\RedisStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/RedisStore.php', + 'Illuminate\\Cache\\RedisTaggedCache' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php', + 'Illuminate\\Cache\\Repository' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Repository.php', + 'Illuminate\\Cache\\RetrievesMultipleKeys' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/RetrievesMultipleKeys.php', + 'Illuminate\\Cache\\TagSet' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/TagSet.php', + 'Illuminate\\Cache\\TaggableStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/TaggableStore.php', + 'Illuminate\\Cache\\TaggedCache' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/TaggedCache.php', + 'Illuminate\\Config\\Repository' => $vendorDir . '/laravel/framework/src/Illuminate/Config/Repository.php', + 'Illuminate\\Console\\Application' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Application.php', + 'Illuminate\\Console\\Command' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Command.php', + 'Illuminate\\Console\\Concerns\\CallsCommands' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php', + 'Illuminate\\Console\\Concerns\\HasParameters' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Concerns/HasParameters.php', + 'Illuminate\\Console\\Concerns\\InteractsWithIO' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Concerns/InteractsWithIO.php', + 'Illuminate\\Console\\ConfirmableTrait' => $vendorDir . '/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php', + 'Illuminate\\Console\\Events\\ArtisanStarting' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Events/ArtisanStarting.php', + 'Illuminate\\Console\\Events\\CommandFinished' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Events/CommandFinished.php', + 'Illuminate\\Console\\Events\\CommandStarting' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Events/CommandStarting.php', + 'Illuminate\\Console\\Events\\ScheduledTaskFinished' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskFinished.php', + 'Illuminate\\Console\\Events\\ScheduledTaskSkipped' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskSkipped.php', + 'Illuminate\\Console\\Events\\ScheduledTaskStarting' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskStarting.php', + 'Illuminate\\Console\\GeneratorCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Console/GeneratorCommand.php', + 'Illuminate\\Console\\OutputStyle' => $vendorDir . '/laravel/framework/src/Illuminate/Console/OutputStyle.php', + 'Illuminate\\Console\\Parser' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Parser.php', + 'Illuminate\\Console\\Scheduling\\CacheAware' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/CacheAware.php', + 'Illuminate\\Console\\Scheduling\\CacheEventMutex' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/CacheEventMutex.php', + 'Illuminate\\Console\\Scheduling\\CacheSchedulingMutex' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php', + 'Illuminate\\Console\\Scheduling\\CallbackEvent' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php', + 'Illuminate\\Console\\Scheduling\\CommandBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/CommandBuilder.php', + 'Illuminate\\Console\\Scheduling\\Event' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/Event.php', + 'Illuminate\\Console\\Scheduling\\EventMutex' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/EventMutex.php', + 'Illuminate\\Console\\Scheduling\\ManagesFrequencies' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/ManagesFrequencies.php', + 'Illuminate\\Console\\Scheduling\\Schedule' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php', + 'Illuminate\\Console\\Scheduling\\ScheduleFinishCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleFinishCommand.php', + 'Illuminate\\Console\\Scheduling\\ScheduleRunCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php', + 'Illuminate\\Console\\Scheduling\\SchedulingMutex' => $vendorDir . '/laravel/framework/src/Illuminate/Console/Scheduling/SchedulingMutex.php', + 'Illuminate\\Container\\BoundMethod' => $vendorDir . '/laravel/framework/src/Illuminate/Container/BoundMethod.php', + 'Illuminate\\Container\\Container' => $vendorDir . '/laravel/framework/src/Illuminate/Container/Container.php', + 'Illuminate\\Container\\ContextualBindingBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Container/ContextualBindingBuilder.php', + 'Illuminate\\Container\\EntryNotFoundException' => $vendorDir . '/laravel/framework/src/Illuminate/Container/EntryNotFoundException.php', + 'Illuminate\\Container\\RewindableGenerator' => $vendorDir . '/laravel/framework/src/Illuminate/Container/RewindableGenerator.php', + 'Illuminate\\Container\\Util' => $vendorDir . '/laravel/framework/src/Illuminate/Container/Util.php', + 'Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/Access/Authorizable.php', + 'Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/Access/Gate.php', + 'Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/Authenticatable.php', + 'Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/CanResetPassword.php', + 'Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/Factory.php', + 'Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/Guard.php', + 'Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/Middleware/AuthenticatesRequests.php', + 'Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/MustVerifyEmail.php', + 'Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/PasswordBroker.php', + 'Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/PasswordBrokerFactory.php', + 'Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/StatefulGuard.php', + 'Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/SupportsBasicAuth.php', + 'Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Auth/UserProvider.php', + 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/Broadcaster.php', + 'Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcastNow.php', + 'Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php', + 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Bus/QueueingDispatcher.php', + 'Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cache/Factory.php', + 'Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cache/Lock.php', + 'Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cache/LockProvider.php', + 'Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cache/LockTimeoutException.php', + 'Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cache/Repository.php', + 'Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cache/Store.php', + 'Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Config/Repository.php', + 'Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Console/Application.php', + 'Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php', + 'Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Container/BindingResolutionException.php', + 'Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Container/Container.php', + 'Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Container/ContextualBindingBuilder.php', + 'Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php', + 'Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Cookie/QueueingFactory.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/Castable.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/CastsAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/CastsInboundAttributes.php', + 'Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Database/Events/MigrationEvent.php', + 'Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php', + 'Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Debug/ExceptionHandler.php', + 'Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Encryption/DecryptException.php', + 'Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Encryption/EncryptException.php', + 'Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Encryption/Encrypter.php', + 'Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Events/Dispatcher.php', + 'Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Filesystem/Cloud.php', + 'Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Filesystem/Factory.php', + 'Illuminate\\Contracts\\Filesystem\\FileExistsException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Filesystem/FileExistsException.php', + 'Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Filesystem/FileNotFoundException.php', + 'Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Filesystem/Filesystem.php', + 'Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php', + 'Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Foundation/CachesConfiguration.php', + 'Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Foundation/CachesRoutes.php', + 'Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php', + 'Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Http/Kernel.php', + 'Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Mail/Factory.php', + 'Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Mail/MailQueue.php', + 'Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Mail/Mailable.php', + 'Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Mail/Mailer.php', + 'Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Notifications/Dispatcher.php', + 'Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Notifications/Factory.php', + 'Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Pagination/LengthAwarePaginator.php', + 'Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Pagination/Paginator.php', + 'Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Pipeline/Hub.php', + 'Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Pipeline/Pipeline.php', + 'Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/EntityNotFoundException.php', + 'Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/EntityResolver.php', + 'Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/Factory.php', + 'Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/Job.php', + 'Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/Monitor.php', + 'Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/Queue.php', + 'Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/QueueableCollection.php', + 'Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/QueueableEntity.php', + 'Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Queue/ShouldQueue.php', + 'Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Redis/Connection.php', + 'Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Redis/Connector.php', + 'Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Redis/Factory.php', + 'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Redis/LimiterTimeoutException.php', + 'Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Routing/BindingRegistrar.php', + 'Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Routing/Registrar.php', + 'Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Routing/ResponseFactory.php', + 'Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Routing/UrlGenerator.php', + 'Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Routing/UrlRoutable.php', + 'Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Session/Session.php', + 'Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/Arrayable.php', + 'Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/DeferrableProvider.php', + 'Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/DeferringDisplayableValue.php', + 'Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/Htmlable.php', + 'Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/Jsonable.php', + 'Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/MessageBag.php', + 'Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/MessageProvider.php', + 'Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/Renderable.php', + 'Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Support/Responsable.php', + 'Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Translation/HasLocalePreference.php', + 'Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Translation/Loader.php', + 'Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Translation/Translator.php', + 'Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Validation/Factory.php', + 'Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Validation/ImplicitRule.php', + 'Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Validation/Rule.php', + 'Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Validation/ValidatesWhenResolved.php', + 'Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/Validation/Validator.php', + 'Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/View/Engine.php', + 'Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/View/Factory.php', + 'Illuminate\\Contracts\\View\\View' => $vendorDir . '/laravel/framework/src/Illuminate/Contracts/View/View.php', + 'Illuminate\\Cookie\\CookieJar' => $vendorDir . '/laravel/framework/src/Illuminate/Cookie/CookieJar.php', + 'Illuminate\\Cookie\\CookieServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Cookie/CookieServiceProvider.php', + 'Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse' => $vendorDir . '/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php', + 'Illuminate\\Cookie\\Middleware\\EncryptCookies' => $vendorDir . '/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php', + 'Illuminate\\Database\\Capsule\\Manager' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Capsule/Manager.php', + 'Illuminate\\Database\\Concerns\\BuildsQueries' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php', + 'Illuminate\\Database\\Concerns\\ManagesTransactions' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php', + 'Illuminate\\Database\\ConfigurationUrlParser' => $vendorDir . '/laravel/framework/src/Illuminate/Database/ConfigurationUrlParser.php', + 'Illuminate\\Database\\Connection' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connection.php', + 'Illuminate\\Database\\ConnectionInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Database/ConnectionInterface.php', + 'Illuminate\\Database\\ConnectionResolver' => $vendorDir . '/laravel/framework/src/Illuminate/Database/ConnectionResolver.php', + 'Illuminate\\Database\\ConnectionResolverInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Database/ConnectionResolverInterface.php', + 'Illuminate\\Database\\Connectors\\ConnectionFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php', + 'Illuminate\\Database\\Connectors\\Connector' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/Connector.php', + 'Illuminate\\Database\\Connectors\\ConnectorInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/ConnectorInterface.php', + 'Illuminate\\Database\\Connectors\\MySqlConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php', + 'Illuminate\\Database\\Connectors\\PostgresConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php', + 'Illuminate\\Database\\Connectors\\SQLiteConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php', + 'Illuminate\\Database\\Connectors\\SqlServerConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php', + 'Illuminate\\Database\\Console\\Factories\\FactoryMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Factories/FactoryMakeCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\BaseCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\FreshCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\InstallCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\MigrateCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\MigrateMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\RefreshCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\ResetCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\RollbackCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\StatusCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\TableGuesser' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Migrations/TableGuesser.php', + 'Illuminate\\Database\\Console\\Seeds\\SeedCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php', + 'Illuminate\\Database\\Console\\Seeds\\SeederMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/Seeds/SeederMakeCommand.php', + 'Illuminate\\Database\\Console\\WipeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Console/WipeCommand.php', + 'Illuminate\\Database\\DatabaseManager' => $vendorDir . '/laravel/framework/src/Illuminate/Database/DatabaseManager.php', + 'Illuminate\\Database\\DatabaseServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Database/DatabaseServiceProvider.php', + 'Illuminate\\Database\\DetectsConcurrencyErrors' => $vendorDir . '/laravel/framework/src/Illuminate/Database/DetectsConcurrencyErrors.php', + 'Illuminate\\Database\\DetectsLostConnections' => $vendorDir . '/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php', + 'Illuminate\\Database\\Eloquent\\Builder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php', + 'Illuminate\\Database\\Eloquent\\Collection' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\GuardsAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasEvents' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasGlobalScopes' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasGlobalScopes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasRelationships' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasTimestamps' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HidesAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HidesAttributes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\QueriesRelationships' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php', + 'Illuminate\\Database\\Eloquent\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php', + 'Illuminate\\Database\\Eloquent\\FactoryBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php', + 'Illuminate\\Database\\Eloquent\\HigherOrderBuilderProxy' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/HigherOrderBuilderProxy.php', + 'Illuminate\\Database\\Eloquent\\JsonEncodingException' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/JsonEncodingException.php', + 'Illuminate\\Database\\Eloquent\\MassAssignmentException' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/MassAssignmentException.php', + 'Illuminate\\Database\\Eloquent\\Model' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Model.php', + 'Illuminate\\Database\\Eloquent\\ModelNotFoundException' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php', + 'Illuminate\\Database\\Eloquent\\QueueEntityResolver' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/QueueEntityResolver.php', + 'Illuminate\\Database\\Eloquent\\RelationNotFoundException' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/RelationNotFoundException.php', + 'Illuminate\\Database\\Eloquent\\Relations\\BelongsTo' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php', + 'Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Concerns\\AsPivot' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/AsPivot.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Concerns\\InteractsWithPivotTable' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Concerns\\SupportsDefaultModels' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasMany' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasManyThrough' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasOne' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOne.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasOneOrMany' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasOneThrough' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneThrough.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphMany' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphOne' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOne.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphOneOrMany' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOneOrMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphPivot' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphTo' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphToMany' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Pivot' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Relation' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php', + 'Illuminate\\Database\\Eloquent\\Scope' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/Scope.php', + 'Illuminate\\Database\\Eloquent\\SoftDeletes' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php', + 'Illuminate\\Database\\Eloquent\\SoftDeletingScope' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletingScope.php', + 'Illuminate\\Database\\Events\\ConnectionEvent' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/ConnectionEvent.php', + 'Illuminate\\Database\\Events\\MigrationEnded' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/MigrationEnded.php', + 'Illuminate\\Database\\Events\\MigrationEvent' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/MigrationEvent.php', + 'Illuminate\\Database\\Events\\MigrationStarted' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/MigrationStarted.php', + 'Illuminate\\Database\\Events\\MigrationsEnded' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/MigrationsEnded.php', + 'Illuminate\\Database\\Events\\MigrationsStarted' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/MigrationsStarted.php', + 'Illuminate\\Database\\Events\\NoPendingMigrations' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/NoPendingMigrations.php', + 'Illuminate\\Database\\Events\\QueryExecuted' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/QueryExecuted.php', + 'Illuminate\\Database\\Events\\StatementPrepared' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/StatementPrepared.php', + 'Illuminate\\Database\\Events\\TransactionBeginning' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/TransactionBeginning.php', + 'Illuminate\\Database\\Events\\TransactionCommitted' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/TransactionCommitted.php', + 'Illuminate\\Database\\Events\\TransactionRolledBack' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Events/TransactionRolledBack.php', + 'Illuminate\\Database\\Grammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Grammar.php', + 'Illuminate\\Database\\MigrationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php', + 'Illuminate\\Database\\Migrations\\DatabaseMigrationRepository' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php', + 'Illuminate\\Database\\Migrations\\Migration' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Migrations/Migration.php', + 'Illuminate\\Database\\Migrations\\MigrationCreator' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php', + 'Illuminate\\Database\\Migrations\\MigrationRepositoryInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php', + 'Illuminate\\Database\\Migrations\\Migrator' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php', + 'Illuminate\\Database\\MySqlConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Database/MySqlConnection.php', + 'Illuminate\\Database\\PostgresConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Database/PostgresConnection.php', + 'Illuminate\\Database\\QueryException' => $vendorDir . '/laravel/framework/src/Illuminate/Database/QueryException.php', + 'Illuminate\\Database\\Query\\Builder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Builder.php', + 'Illuminate\\Database\\Query\\Expression' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Expression.php', + 'Illuminate\\Database\\Query\\Grammars\\Grammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php', + 'Illuminate\\Database\\Query\\Grammars\\MySqlGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php', + 'Illuminate\\Database\\Query\\Grammars\\PostgresGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php', + 'Illuminate\\Database\\Query\\Grammars\\SQLiteGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php', + 'Illuminate\\Database\\Query\\Grammars\\SqlServerGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php', + 'Illuminate\\Database\\Query\\JoinClause' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/JoinClause.php', + 'Illuminate\\Database\\Query\\Processors\\MySqlProcessor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php', + 'Illuminate\\Database\\Query\\Processors\\PostgresProcessor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php', + 'Illuminate\\Database\\Query\\Processors\\Processor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php', + 'Illuminate\\Database\\Query\\Processors\\SQLiteProcessor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/SQLiteProcessor.php', + 'Illuminate\\Database\\Query\\Processors\\SqlServerProcessor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/SqlServerProcessor.php', + 'Illuminate\\Database\\SQLiteConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Database/SQLiteConnection.php', + 'Illuminate\\Database\\Schema\\Blueprint' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php', + 'Illuminate\\Database\\Schema\\Builder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Builder.php', + 'Illuminate\\Database\\Schema\\ColumnDefinition' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/ColumnDefinition.php', + 'Illuminate\\Database\\Schema\\ForeignIdColumnDefinition' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/ForeignIdColumnDefinition.php', + 'Illuminate\\Database\\Schema\\ForeignKeyDefinition' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/ForeignKeyDefinition.php', + 'Illuminate\\Database\\Schema\\Grammars\\ChangeColumn' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/ChangeColumn.php', + 'Illuminate\\Database\\Schema\\Grammars\\Grammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\MySqlGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\PostgresGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\RenameColumn' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/RenameColumn.php', + 'Illuminate\\Database\\Schema\\Grammars\\SQLiteGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\SqlServerGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php', + 'Illuminate\\Database\\Schema\\MySqlBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php', + 'Illuminate\\Database\\Schema\\PostgresBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php', + 'Illuminate\\Database\\Schema\\SQLiteBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php', + 'Illuminate\\Database\\Schema\\SqlServerBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Schema/SqlServerBuilder.php', + 'Illuminate\\Database\\Seeder' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Seeder.php', + 'Illuminate\\Database\\SqlServerConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Database/SqlServerConnection.php', + 'Illuminate\\Encryption\\Encrypter' => $vendorDir . '/laravel/framework/src/Illuminate/Encryption/Encrypter.php', + 'Illuminate\\Encryption\\EncryptionServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php', + 'Illuminate\\Events\\CallQueuedListener' => $vendorDir . '/laravel/framework/src/Illuminate/Events/CallQueuedListener.php', + 'Illuminate\\Events\\Dispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Events/Dispatcher.php', + 'Illuminate\\Events\\EventServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Events/EventServiceProvider.php', + 'Illuminate\\Events\\NullDispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Events/NullDispatcher.php', + 'Illuminate\\Filesystem\\Cache' => $vendorDir . '/laravel/framework/src/Illuminate/Filesystem/Cache.php', + 'Illuminate\\Filesystem\\Filesystem' => $vendorDir . '/laravel/framework/src/Illuminate/Filesystem/Filesystem.php', + 'Illuminate\\Filesystem\\FilesystemAdapter' => $vendorDir . '/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php', + 'Illuminate\\Filesystem\\FilesystemManager' => $vendorDir . '/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php', + 'Illuminate\\Filesystem\\FilesystemServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php', + 'Illuminate\\Foundation\\AliasLoader' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/AliasLoader.php', + 'Illuminate\\Foundation\\Application' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Application.php', + 'Illuminate\\Foundation\\Auth\\Access\\Authorizable' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Auth/Access/Authorizable.php', + 'Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php', + 'Illuminate\\Foundation\\Auth\\AuthenticatesUsers' => $vendorDir . '/laravel/ui/auth-backend/AuthenticatesUsers.php', + 'Illuminate\\Foundation\\Auth\\ConfirmsPasswords' => $vendorDir . '/laravel/ui/auth-backend/ConfirmsPasswords.php', + 'Illuminate\\Foundation\\Auth\\RedirectsUsers' => $vendorDir . '/laravel/ui/auth-backend/RedirectsUsers.php', + 'Illuminate\\Foundation\\Auth\\RegistersUsers' => $vendorDir . '/laravel/ui/auth-backend/RegistersUsers.php', + 'Illuminate\\Foundation\\Auth\\ResetsPasswords' => $vendorDir . '/laravel/ui/auth-backend/ResetsPasswords.php', + 'Illuminate\\Foundation\\Auth\\SendsPasswordResetEmails' => $vendorDir . '/laravel/ui/auth-backend/SendsPasswordResetEmails.php', + 'Illuminate\\Foundation\\Auth\\ThrottlesLogins' => $vendorDir . '/laravel/ui/auth-backend/ThrottlesLogins.php', + 'Illuminate\\Foundation\\Auth\\User' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Auth/User.php', + 'Illuminate\\Foundation\\Auth\\VerifiesEmails' => $vendorDir . '/laravel/ui/auth-backend/VerifiesEmails.php', + 'Illuminate\\Foundation\\Bootstrap\\BootProviders' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php', + 'Illuminate\\Foundation\\Bootstrap\\HandleExceptions' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php', + 'Illuminate\\Foundation\\Bootstrap\\LoadConfiguration' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php', + 'Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php', + 'Illuminate\\Foundation\\Bootstrap\\RegisterFacades' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php', + 'Illuminate\\Foundation\\Bootstrap\\RegisterProviders' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterProviders.php', + 'Illuminate\\Foundation\\Bootstrap\\SetRequestForConsole' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/SetRequestForConsole.php', + 'Illuminate\\Foundation\\Bus\\Dispatchable' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php', + 'Illuminate\\Foundation\\Bus\\DispatchesJobs' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bus/DispatchesJobs.php', + 'Illuminate\\Foundation\\Bus\\PendingChain' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bus/PendingChain.php', + 'Illuminate\\Foundation\\Bus\\PendingDispatch' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Bus/PendingDispatch.php', + 'Illuminate\\Foundation\\ComposerScripts' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/ComposerScripts.php', + 'Illuminate\\Foundation\\Console\\CastMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/CastMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ChannelMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ChannelMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ClearCompiledCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ClearCompiledCommand.php', + 'Illuminate\\Foundation\\Console\\ClosureCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ClosureCommand.php', + 'Illuminate\\Foundation\\Console\\ComponentMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ComponentMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ConfigCacheCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php', + 'Illuminate\\Foundation\\Console\\ConfigClearCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ConfigClearCommand.php', + 'Illuminate\\Foundation\\Console\\ConsoleMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ConsoleMakeCommand.php', + 'Illuminate\\Foundation\\Console\\DownCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php', + 'Illuminate\\Foundation\\Console\\EnvironmentCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/EnvironmentCommand.php', + 'Illuminate\\Foundation\\Console\\EventCacheCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/EventCacheCommand.php', + 'Illuminate\\Foundation\\Console\\EventClearCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/EventClearCommand.php', + 'Illuminate\\Foundation\\Console\\EventGenerateCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/EventGenerateCommand.php', + 'Illuminate\\Foundation\\Console\\EventListCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/EventListCommand.php', + 'Illuminate\\Foundation\\Console\\EventMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/EventMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ExceptionMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ExceptionMakeCommand.php', + 'Illuminate\\Foundation\\Console\\JobMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/JobMakeCommand.php', + 'Illuminate\\Foundation\\Console\\Kernel' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php', + 'Illuminate\\Foundation\\Console\\KeyGenerateCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/KeyGenerateCommand.php', + 'Illuminate\\Foundation\\Console\\ListenerMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ListenerMakeCommand.php', + 'Illuminate\\Foundation\\Console\\MailMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/MailMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ModelMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php', + 'Illuminate\\Foundation\\Console\\NotificationMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/NotificationMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ObserverMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ObserverMakeCommand.php', + 'Illuminate\\Foundation\\Console\\OptimizeClearCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/OptimizeClearCommand.php', + 'Illuminate\\Foundation\\Console\\OptimizeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php', + 'Illuminate\\Foundation\\Console\\PackageDiscoverCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/PackageDiscoverCommand.php', + 'Illuminate\\Foundation\\Console\\PolicyMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ProviderMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ProviderMakeCommand.php', + 'Illuminate\\Foundation\\Console\\QueuedCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/QueuedCommand.php', + 'Illuminate\\Foundation\\Console\\RequestMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/RequestMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ResourceMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ResourceMakeCommand.php', + 'Illuminate\\Foundation\\Console\\RouteCacheCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/RouteCacheCommand.php', + 'Illuminate\\Foundation\\Console\\RouteClearCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/RouteClearCommand.php', + 'Illuminate\\Foundation\\Console\\RouteListCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php', + 'Illuminate\\Foundation\\Console\\RuleMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/RuleMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ServeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php', + 'Illuminate\\Foundation\\Console\\StorageLinkCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/StorageLinkCommand.php', + 'Illuminate\\Foundation\\Console\\StubPublishCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/StubPublishCommand.php', + 'Illuminate\\Foundation\\Console\\TestMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/TestMakeCommand.php', + 'Illuminate\\Foundation\\Console\\UpCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/UpCommand.php', + 'Illuminate\\Foundation\\Console\\VendorPublishCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/VendorPublishCommand.php', + 'Illuminate\\Foundation\\Console\\ViewCacheCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ViewCacheCommand.php', + 'Illuminate\\Foundation\\Console\\ViewClearCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Console/ViewClearCommand.php', + 'Illuminate\\Foundation\\EnvironmentDetector' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/EnvironmentDetector.php', + 'Illuminate\\Foundation\\Events\\DiscoverEvents' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Events/DiscoverEvents.php', + 'Illuminate\\Foundation\\Events\\Dispatchable' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Events/Dispatchable.php', + 'Illuminate\\Foundation\\Events\\LocaleUpdated' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Events/LocaleUpdated.php', + 'Illuminate\\Foundation\\Exceptions\\Handler' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php', + 'Illuminate\\Foundation\\Exceptions\\WhoopsHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Exceptions/WhoopsHandler.php', + 'Illuminate\\Foundation\\Http\\Events\\RequestHandled' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Events/RequestHandled.php', + 'Illuminate\\Foundation\\Http\\Exceptions\\MaintenanceModeException' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Exceptions/MaintenanceModeException.php', + 'Illuminate\\Foundation\\Http\\FormRequest' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php', + 'Illuminate\\Foundation\\Http\\Kernel' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php', + 'Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php', + 'Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php', + 'Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php', + 'Illuminate\\Foundation\\Http\\Middleware\\TrimStrings' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php', + 'Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php', + 'Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php', + 'Illuminate\\Foundation\\Inspiring' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Inspiring.php', + 'Illuminate\\Foundation\\Mix' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Mix.php', + 'Illuminate\\Foundation\\PackageManifest' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/PackageManifest.php', + 'Illuminate\\Foundation\\ProviderRepository' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php', + 'Illuminate\\Foundation\\Providers\\ArtisanServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\ComposerServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Providers/ConsoleSupportServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\FormRequestServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php', + 'Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Support/Providers/AuthServiceProvider.php', + 'Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Support/Providers/EventServiceProvider.php', + 'Illuminate\\Foundation\\Support\\Providers\\RouteServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Support/Providers/RouteServiceProvider.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithAuthentication' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithAuthentication.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithConsole' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithConsole.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithContainer' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithDatabase' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithDatabase.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithExceptionHandling' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithExceptionHandling.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithRedis' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithRedis.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithSession' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithSession.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\MakesHttpRequests' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\MocksApplicationServices' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php', + 'Illuminate\\Foundation\\Testing\\DatabaseMigrations' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/DatabaseMigrations.php', + 'Illuminate\\Foundation\\Testing\\DatabaseTransactions' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/DatabaseTransactions.php', + 'Illuminate\\Foundation\\Testing\\RefreshDatabase' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php', + 'Illuminate\\Foundation\\Testing\\RefreshDatabaseState' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabaseState.php', + 'Illuminate\\Foundation\\Testing\\TestCase' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php', + 'Illuminate\\Foundation\\Testing\\WithFaker' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/WithFaker.php', + 'Illuminate\\Foundation\\Testing\\WithoutEvents' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/WithoutEvents.php', + 'Illuminate\\Foundation\\Testing\\WithoutMiddleware' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Testing/WithoutMiddleware.php', + 'Illuminate\\Foundation\\Validation\\ValidatesRequests' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php', + 'Illuminate\\Hashing\\AbstractHasher' => $vendorDir . '/laravel/framework/src/Illuminate/Hashing/AbstractHasher.php', + 'Illuminate\\Hashing\\Argon2IdHasher' => $vendorDir . '/laravel/framework/src/Illuminate/Hashing/Argon2IdHasher.php', + 'Illuminate\\Hashing\\ArgonHasher' => $vendorDir . '/laravel/framework/src/Illuminate/Hashing/ArgonHasher.php', + 'Illuminate\\Hashing\\BcryptHasher' => $vendorDir . '/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php', + 'Illuminate\\Hashing\\HashManager' => $vendorDir . '/laravel/framework/src/Illuminate/Hashing/HashManager.php', + 'Illuminate\\Hashing\\HashServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Hashing/HashServiceProvider.php', + 'Illuminate\\Http\\Client\\ConnectionException' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/ConnectionException.php', + 'Illuminate\\Http\\Client\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/Factory.php', + 'Illuminate\\Http\\Client\\PendingRequest' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/PendingRequest.php', + 'Illuminate\\Http\\Client\\Request' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/Request.php', + 'Illuminate\\Http\\Client\\RequestException' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/RequestException.php', + 'Illuminate\\Http\\Client\\Response' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/Response.php', + 'Illuminate\\Http\\Client\\ResponseSequence' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Client/ResponseSequence.php', + 'Illuminate\\Http\\Concerns\\InteractsWithContentTypes' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithContentTypes.php', + 'Illuminate\\Http\\Concerns\\InteractsWithFlashData' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithFlashData.php', + 'Illuminate\\Http\\Concerns\\InteractsWithInput' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithInput.php', + 'Illuminate\\Http\\Exceptions\\HttpResponseException' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Exceptions/HttpResponseException.php', + 'Illuminate\\Http\\Exceptions\\PostTooLargeException' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Exceptions/PostTooLargeException.php', + 'Illuminate\\Http\\Exceptions\\ThrottleRequestsException' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Exceptions/ThrottleRequestsException.php', + 'Illuminate\\Http\\File' => $vendorDir . '/laravel/framework/src/Illuminate/Http/File.php', + 'Illuminate\\Http\\FileHelpers' => $vendorDir . '/laravel/framework/src/Illuminate/Http/FileHelpers.php', + 'Illuminate\\Http\\JsonResponse' => $vendorDir . '/laravel/framework/src/Illuminate/Http/JsonResponse.php', + 'Illuminate\\Http\\Middleware\\CheckResponseForModifications' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Middleware/CheckResponseForModifications.php', + 'Illuminate\\Http\\Middleware\\FrameGuard' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Middleware/FrameGuard.php', + 'Illuminate\\Http\\Middleware\\SetCacheHeaders' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php', + 'Illuminate\\Http\\Middleware\\TrustHosts' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Middleware/TrustHosts.php', + 'Illuminate\\Http\\RedirectResponse' => $vendorDir . '/laravel/framework/src/Illuminate/Http/RedirectResponse.php', + 'Illuminate\\Http\\Request' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Request.php', + 'Illuminate\\Http\\Resources\\CollectsResources' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/CollectsResources.php', + 'Illuminate\\Http\\Resources\\ConditionallyLoadsAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php', + 'Illuminate\\Http\\Resources\\DelegatesToResource' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php', + 'Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/Json/AnonymousResourceCollection.php', + 'Illuminate\\Http\\Resources\\Json\\JsonResource' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php', + 'Illuminate\\Http\\Resources\\Json\\PaginatedResourceResponse' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/Json/PaginatedResourceResponse.php', + 'Illuminate\\Http\\Resources\\Json\\ResourceCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceCollection.php', + 'Illuminate\\Http\\Resources\\Json\\ResourceResponse' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceResponse.php', + 'Illuminate\\Http\\Resources\\MergeValue' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/MergeValue.php', + 'Illuminate\\Http\\Resources\\MissingValue' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/MissingValue.php', + 'Illuminate\\Http\\Resources\\PotentiallyMissing' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Resources/PotentiallyMissing.php', + 'Illuminate\\Http\\Response' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Response.php', + 'Illuminate\\Http\\ResponseTrait' => $vendorDir . '/laravel/framework/src/Illuminate/Http/ResponseTrait.php', + 'Illuminate\\Http\\Testing\\File' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Testing/File.php', + 'Illuminate\\Http\\Testing\\FileFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php', + 'Illuminate\\Http\\Testing\\MimeType' => $vendorDir . '/laravel/framework/src/Illuminate/Http/Testing/MimeType.php', + 'Illuminate\\Http\\UploadedFile' => $vendorDir . '/laravel/framework/src/Illuminate/Http/UploadedFile.php', + 'Illuminate\\Log\\Events\\MessageLogged' => $vendorDir . '/laravel/framework/src/Illuminate/Log/Events/MessageLogged.php', + 'Illuminate\\Log\\LogManager' => $vendorDir . '/laravel/framework/src/Illuminate/Log/LogManager.php', + 'Illuminate\\Log\\LogServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Log/LogServiceProvider.php', + 'Illuminate\\Log\\Logger' => $vendorDir . '/laravel/framework/src/Illuminate/Log/Logger.php', + 'Illuminate\\Log\\ParsesLogConfiguration' => $vendorDir . '/laravel/framework/src/Illuminate/Log/ParsesLogConfiguration.php', + 'Illuminate\\Mail\\Events\\MessageSending' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Events/MessageSending.php', + 'Illuminate\\Mail\\Events\\MessageSent' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Events/MessageSent.php', + 'Illuminate\\Mail\\MailManager' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/MailManager.php', + 'Illuminate\\Mail\\MailServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/MailServiceProvider.php', + 'Illuminate\\Mail\\Mailable' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Mailable.php', + 'Illuminate\\Mail\\Mailer' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Mailer.php', + 'Illuminate\\Mail\\Markdown' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Markdown.php', + 'Illuminate\\Mail\\Message' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Message.php', + 'Illuminate\\Mail\\PendingMail' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/PendingMail.php', + 'Illuminate\\Mail\\SendQueuedMailable' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php', + 'Illuminate\\Mail\\Transport\\ArrayTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/ArrayTransport.php', + 'Illuminate\\Mail\\Transport\\LogTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/LogTransport.php', + 'Illuminate\\Mail\\Transport\\MailgunTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/MailgunTransport.php', + 'Illuminate\\Mail\\Transport\\SesTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/SesTransport.php', + 'Illuminate\\Mail\\Transport\\Transport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/Transport.php', + 'Illuminate\\Notifications\\Action' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Action.php', + 'Illuminate\\Notifications\\AnonymousNotifiable' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/AnonymousNotifiable.php', + 'Illuminate\\Notifications\\ChannelManager' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/ChannelManager.php', + 'Illuminate\\Notifications\\Channels\\BroadcastChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/BroadcastChannel.php', + 'Illuminate\\Notifications\\Channels\\DatabaseChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php', + 'Illuminate\\Notifications\\Channels\\MailChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php', + 'Illuminate\\Notifications\\Console\\NotificationTableCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Console/NotificationTableCommand.php', + 'Illuminate\\Notifications\\DatabaseNotification' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotification.php', + 'Illuminate\\Notifications\\DatabaseNotificationCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotificationCollection.php', + 'Illuminate\\Notifications\\Events\\BroadcastNotificationCreated' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Events/BroadcastNotificationCreated.php', + 'Illuminate\\Notifications\\Events\\NotificationFailed' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Events/NotificationFailed.php', + 'Illuminate\\Notifications\\Events\\NotificationSending' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Events/NotificationSending.php', + 'Illuminate\\Notifications\\Events\\NotificationSent' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Events/NotificationSent.php', + 'Illuminate\\Notifications\\HasDatabaseNotifications' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/HasDatabaseNotifications.php', + 'Illuminate\\Notifications\\Messages\\BroadcastMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/BroadcastMessage.php', + 'Illuminate\\Notifications\\Messages\\DatabaseMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/DatabaseMessage.php', + 'Illuminate\\Notifications\\Messages\\MailMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/MailMessage.php', + 'Illuminate\\Notifications\\Messages\\SimpleMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/SimpleMessage.php', + 'Illuminate\\Notifications\\Notifiable' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Notifiable.php', + 'Illuminate\\Notifications\\Notification' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Notification.php', + 'Illuminate\\Notifications\\NotificationSender' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/NotificationSender.php', + 'Illuminate\\Notifications\\NotificationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/NotificationServiceProvider.php', + 'Illuminate\\Notifications\\RoutesNotifications' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php', + 'Illuminate\\Notifications\\SendQueuedNotifications' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/SendQueuedNotifications.php', + 'Illuminate\\Pagination\\AbstractPaginator' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/AbstractPaginator.php', + 'Illuminate\\Pagination\\LengthAwarePaginator' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php', + 'Illuminate\\Pagination\\PaginationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php', + 'Illuminate\\Pagination\\Paginator' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/Paginator.php', + 'Illuminate\\Pagination\\UrlWindow' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/UrlWindow.php', + 'Illuminate\\Pipeline\\Hub' => $vendorDir . '/laravel/framework/src/Illuminate/Pipeline/Hub.php', + 'Illuminate\\Pipeline\\Pipeline' => $vendorDir . '/laravel/framework/src/Illuminate/Pipeline/Pipeline.php', + 'Illuminate\\Pipeline\\PipelineServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Pipeline/PipelineServiceProvider.php', + 'Illuminate\\Queue\\BeanstalkdQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php', + 'Illuminate\\Queue\\CallQueuedClosure' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/CallQueuedClosure.php', + 'Illuminate\\Queue\\CallQueuedHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php', + 'Illuminate\\Queue\\Capsule\\Manager' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Capsule/Manager.php', + 'Illuminate\\Queue\\Connectors\\BeanstalkdConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/BeanstalkdConnector.php', + 'Illuminate\\Queue\\Connectors\\ConnectorInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/ConnectorInterface.php', + 'Illuminate\\Queue\\Connectors\\DatabaseConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/DatabaseConnector.php', + 'Illuminate\\Queue\\Connectors\\NullConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/NullConnector.php', + 'Illuminate\\Queue\\Connectors\\RedisConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/RedisConnector.php', + 'Illuminate\\Queue\\Connectors\\SqsConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php', + 'Illuminate\\Queue\\Connectors\\SyncConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Connectors/SyncConnector.php', + 'Illuminate\\Queue\\Console\\FailedTableCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/FailedTableCommand.php', + 'Illuminate\\Queue\\Console\\FlushFailedCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/FlushFailedCommand.php', + 'Illuminate\\Queue\\Console\\ForgetFailedCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/ForgetFailedCommand.php', + 'Illuminate\\Queue\\Console\\ListFailedCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/ListFailedCommand.php', + 'Illuminate\\Queue\\Console\\ListenCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php', + 'Illuminate\\Queue\\Console\\RestartCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/RestartCommand.php', + 'Illuminate\\Queue\\Console\\RetryCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/RetryCommand.php', + 'Illuminate\\Queue\\Console\\TableCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/TableCommand.php', + 'Illuminate\\Queue\\Console\\WorkCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php', + 'Illuminate\\Queue\\DatabaseQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php', + 'Illuminate\\Queue\\Events\\JobExceptionOccurred' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Events/JobExceptionOccurred.php', + 'Illuminate\\Queue\\Events\\JobFailed' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Events/JobFailed.php', + 'Illuminate\\Queue\\Events\\JobProcessed' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Events/JobProcessed.php', + 'Illuminate\\Queue\\Events\\JobProcessing' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Events/JobProcessing.php', + 'Illuminate\\Queue\\Events\\Looping' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Events/Looping.php', + 'Illuminate\\Queue\\Events\\WorkerStopping' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Events/WorkerStopping.php', + 'Illuminate\\Queue\\Failed\\DatabaseFailedJobProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Failed/DatabaseFailedJobProvider.php', + 'Illuminate\\Queue\\Failed\\DynamoDbFailedJobProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Failed/DynamoDbFailedJobProvider.php', + 'Illuminate\\Queue\\Failed\\FailedJobProviderInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Failed/FailedJobProviderInterface.php', + 'Illuminate\\Queue\\Failed\\NullFailedJobProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Failed/NullFailedJobProvider.php', + 'Illuminate\\Queue\\InteractsWithQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/InteractsWithQueue.php', + 'Illuminate\\Queue\\InvalidPayloadException' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/InvalidPayloadException.php', + 'Illuminate\\Queue\\Jobs\\BeanstalkdJob' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php', + 'Illuminate\\Queue\\Jobs\\DatabaseJob' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/DatabaseJob.php', + 'Illuminate\\Queue\\Jobs\\DatabaseJobRecord' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/DatabaseJobRecord.php', + 'Illuminate\\Queue\\Jobs\\Job' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/Job.php', + 'Illuminate\\Queue\\Jobs\\JobName' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/JobName.php', + 'Illuminate\\Queue\\Jobs\\RedisJob' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/RedisJob.php', + 'Illuminate\\Queue\\Jobs\\SqsJob' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/SqsJob.php', + 'Illuminate\\Queue\\Jobs\\SyncJob' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Jobs/SyncJob.php', + 'Illuminate\\Queue\\Listener' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Listener.php', + 'Illuminate\\Queue\\ListenerOptions' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/ListenerOptions.php', + 'Illuminate\\Queue\\LuaScripts' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/LuaScripts.php', + 'Illuminate\\Queue\\ManuallyFailedException' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/ManuallyFailedException.php', + 'Illuminate\\Queue\\MaxAttemptsExceededException' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/MaxAttemptsExceededException.php', + 'Illuminate\\Queue\\NullQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/NullQueue.php', + 'Illuminate\\Queue\\Queue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Queue.php', + 'Illuminate\\Queue\\QueueManager' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/QueueManager.php', + 'Illuminate\\Queue\\QueueServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/QueueServiceProvider.php', + 'Illuminate\\Queue\\RedisQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/RedisQueue.php', + 'Illuminate\\Queue\\SerializableClosure' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/SerializableClosure.php', + 'Illuminate\\Queue\\SerializesAndRestoresModelIdentifiers' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/SerializesAndRestoresModelIdentifiers.php', + 'Illuminate\\Queue\\SerializesModels' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/SerializesModels.php', + 'Illuminate\\Queue\\SqsQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/SqsQueue.php', + 'Illuminate\\Queue\\SyncQueue' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/SyncQueue.php', + 'Illuminate\\Queue\\Worker' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/Worker.php', + 'Illuminate\\Queue\\WorkerOptions' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/WorkerOptions.php', + 'Illuminate\\Redis\\Connections\\Connection' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connections/Connection.php', + 'Illuminate\\Redis\\Connections\\PhpRedisClusterConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisClusterConnection.php', + 'Illuminate\\Redis\\Connections\\PhpRedisConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisConnection.php', + 'Illuminate\\Redis\\Connections\\PredisClusterConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connections/PredisClusterConnection.php', + 'Illuminate\\Redis\\Connections\\PredisConnection' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connections/PredisConnection.php', + 'Illuminate\\Redis\\Connectors\\PhpRedisConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php', + 'Illuminate\\Redis\\Connectors\\PredisConnector' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Connectors/PredisConnector.php', + 'Illuminate\\Redis\\Events\\CommandExecuted' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Events/CommandExecuted.php', + 'Illuminate\\Redis\\Limiters\\ConcurrencyLimiter' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Limiters/ConcurrencyLimiter.php', + 'Illuminate\\Redis\\Limiters\\ConcurrencyLimiterBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Limiters/ConcurrencyLimiterBuilder.php', + 'Illuminate\\Redis\\Limiters\\DurationLimiter' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Limiters/DurationLimiter.php', + 'Illuminate\\Redis\\Limiters\\DurationLimiterBuilder' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/Limiters/DurationLimiterBuilder.php', + 'Illuminate\\Redis\\RedisManager' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/RedisManager.php', + 'Illuminate\\Redis\\RedisServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Redis/RedisServiceProvider.php', + 'Illuminate\\Routing\\AbstractRouteCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php', + 'Illuminate\\Routing\\CompiledRouteCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/CompiledRouteCollection.php', + 'Illuminate\\Routing\\Console\\ControllerMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Console/ControllerMakeCommand.php', + 'Illuminate\\Routing\\Console\\MiddlewareMakeCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Console/MiddlewareMakeCommand.php', + 'Illuminate\\Routing\\Contracts\\ControllerDispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Contracts/ControllerDispatcher.php', + 'Illuminate\\Routing\\Controller' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Controller.php', + 'Illuminate\\Routing\\ControllerDispatcher' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php', + 'Illuminate\\Routing\\ControllerMiddlewareOptions' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/ControllerMiddlewareOptions.php', + 'Illuminate\\Routing\\Events\\RouteMatched' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Events/RouteMatched.php', + 'Illuminate\\Routing\\Exceptions\\InvalidSignatureException' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Exceptions/InvalidSignatureException.php', + 'Illuminate\\Routing\\Exceptions\\UrlGenerationException' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Exceptions/UrlGenerationException.php', + 'Illuminate\\Routing\\ImplicitRouteBinding' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/ImplicitRouteBinding.php', + 'Illuminate\\Routing\\Matching\\HostValidator' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Matching/HostValidator.php', + 'Illuminate\\Routing\\Matching\\MethodValidator' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Matching/MethodValidator.php', + 'Illuminate\\Routing\\Matching\\SchemeValidator' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Matching/SchemeValidator.php', + 'Illuminate\\Routing\\Matching\\UriValidator' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Matching/UriValidator.php', + 'Illuminate\\Routing\\Matching\\ValidatorInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Matching/ValidatorInterface.php', + 'Illuminate\\Routing\\MiddlewareNameResolver' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/MiddlewareNameResolver.php', + 'Illuminate\\Routing\\Middleware\\SubstituteBindings' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php', + 'Illuminate\\Routing\\Middleware\\ThrottleRequests' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php', + 'Illuminate\\Routing\\Middleware\\ThrottleRequestsWithRedis' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequestsWithRedis.php', + 'Illuminate\\Routing\\Middleware\\ValidateSignature' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Middleware/ValidateSignature.php', + 'Illuminate\\Routing\\PendingResourceRegistration' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/PendingResourceRegistration.php', + 'Illuminate\\Routing\\Pipeline' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Pipeline.php', + 'Illuminate\\Routing\\RedirectController' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RedirectController.php', + 'Illuminate\\Routing\\Redirector' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Redirector.php', + 'Illuminate\\Routing\\ResourceRegistrar' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/ResourceRegistrar.php', + 'Illuminate\\Routing\\ResponseFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/ResponseFactory.php', + 'Illuminate\\Routing\\Route' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Route.php', + 'Illuminate\\Routing\\RouteAction' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteAction.php', + 'Illuminate\\Routing\\RouteBinding' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteBinding.php', + 'Illuminate\\Routing\\RouteCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteCollection.php', + 'Illuminate\\Routing\\RouteCollectionInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteCollectionInterface.php', + 'Illuminate\\Routing\\RouteDependencyResolverTrait' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php', + 'Illuminate\\Routing\\RouteFileRegistrar' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteFileRegistrar.php', + 'Illuminate\\Routing\\RouteGroup' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteGroup.php', + 'Illuminate\\Routing\\RouteParameterBinder' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteParameterBinder.php', + 'Illuminate\\Routing\\RouteRegistrar' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteRegistrar.php', + 'Illuminate\\Routing\\RouteSignatureParameters' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php', + 'Illuminate\\Routing\\RouteUri' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteUri.php', + 'Illuminate\\Routing\\RouteUrlGenerator' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RouteUrlGenerator.php', + 'Illuminate\\Routing\\Router' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/Router.php', + 'Illuminate\\Routing\\RoutingServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php', + 'Illuminate\\Routing\\SortedMiddleware' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/SortedMiddleware.php', + 'Illuminate\\Routing\\UrlGenerator' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/UrlGenerator.php', + 'Illuminate\\Routing\\ViewController' => $vendorDir . '/laravel/framework/src/Illuminate/Routing/ViewController.php', + 'Illuminate\\Session\\ArraySessionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Session/ArraySessionHandler.php', + 'Illuminate\\Session\\CacheBasedSessionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php', + 'Illuminate\\Session\\Console\\SessionTableCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Session/Console/SessionTableCommand.php', + 'Illuminate\\Session\\CookieSessionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Session/CookieSessionHandler.php', + 'Illuminate\\Session\\DatabaseSessionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Session/DatabaseSessionHandler.php', + 'Illuminate\\Session\\EncryptedStore' => $vendorDir . '/laravel/framework/src/Illuminate/Session/EncryptedStore.php', + 'Illuminate\\Session\\ExistenceAwareInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Session/ExistenceAwareInterface.php', + 'Illuminate\\Session\\FileSessionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Session/FileSessionHandler.php', + 'Illuminate\\Session\\Middleware\\AuthenticateSession' => $vendorDir . '/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php', + 'Illuminate\\Session\\Middleware\\StartSession' => $vendorDir . '/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php', + 'Illuminate\\Session\\NullSessionHandler' => $vendorDir . '/laravel/framework/src/Illuminate/Session/NullSessionHandler.php', + 'Illuminate\\Session\\SessionManager' => $vendorDir . '/laravel/framework/src/Illuminate/Session/SessionManager.php', + 'Illuminate\\Session\\SessionServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php', + 'Illuminate\\Session\\Store' => $vendorDir . '/laravel/framework/src/Illuminate/Session/Store.php', + 'Illuminate\\Session\\TokenMismatchException' => $vendorDir . '/laravel/framework/src/Illuminate/Session/TokenMismatchException.php', + 'Illuminate\\Support\\AggregateServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Support/AggregateServiceProvider.php', + 'Illuminate\\Support\\Arr' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Arr.php', + 'Illuminate\\Support\\Carbon' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Carbon.php', + 'Illuminate\\Support\\Collection' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Collection.php', + 'Illuminate\\Support\\Composer' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Composer.php', + 'Illuminate\\Support\\ConfigurationUrlParser' => $vendorDir . '/laravel/framework/src/Illuminate/Support/ConfigurationUrlParser.php', + 'Illuminate\\Support\\DateFactory' => $vendorDir . '/laravel/framework/src/Illuminate/Support/DateFactory.php', + 'Illuminate\\Support\\Enumerable' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Enumerable.php', + 'Illuminate\\Support\\Env' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Env.php', + 'Illuminate\\Support\\Facades\\App' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/App.php', + 'Illuminate\\Support\\Facades\\Artisan' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Artisan.php', + 'Illuminate\\Support\\Facades\\Auth' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Auth.php', + 'Illuminate\\Support\\Facades\\Blade' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Blade.php', + 'Illuminate\\Support\\Facades\\Broadcast' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Broadcast.php', + 'Illuminate\\Support\\Facades\\Bus' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Bus.php', + 'Illuminate\\Support\\Facades\\Cache' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Cache.php', + 'Illuminate\\Support\\Facades\\Config' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Config.php', + 'Illuminate\\Support\\Facades\\Cookie' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Cookie.php', + 'Illuminate\\Support\\Facades\\Crypt' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Crypt.php', + 'Illuminate\\Support\\Facades\\DB' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/DB.php', + 'Illuminate\\Support\\Facades\\Date' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Date.php', + 'Illuminate\\Support\\Facades\\Event' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Event.php', + 'Illuminate\\Support\\Facades\\Facade' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Facade.php', + 'Illuminate\\Support\\Facades\\File' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/File.php', + 'Illuminate\\Support\\Facades\\Gate' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Gate.php', + 'Illuminate\\Support\\Facades\\Hash' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Hash.php', + 'Illuminate\\Support\\Facades\\Http' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Http.php', + 'Illuminate\\Support\\Facades\\Lang' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Lang.php', + 'Illuminate\\Support\\Facades\\Log' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Log.php', + 'Illuminate\\Support\\Facades\\Mail' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Mail.php', + 'Illuminate\\Support\\Facades\\Notification' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Notification.php', + 'Illuminate\\Support\\Facades\\Password' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Password.php', + 'Illuminate\\Support\\Facades\\Queue' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Queue.php', + 'Illuminate\\Support\\Facades\\Redirect' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Redirect.php', + 'Illuminate\\Support\\Facades\\Redis' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Redis.php', + 'Illuminate\\Support\\Facades\\Request' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Request.php', + 'Illuminate\\Support\\Facades\\Response' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Response.php', + 'Illuminate\\Support\\Facades\\Route' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Route.php', + 'Illuminate\\Support\\Facades\\Schema' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Schema.php', + 'Illuminate\\Support\\Facades\\Session' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Session.php', + 'Illuminate\\Support\\Facades\\Storage' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Storage.php', + 'Illuminate\\Support\\Facades\\URL' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/URL.php', + 'Illuminate\\Support\\Facades\\Validator' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Validator.php', + 'Illuminate\\Support\\Facades\\View' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/View.php', + 'Illuminate\\Support\\Fluent' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Fluent.php', + 'Illuminate\\Support\\HigherOrderCollectionProxy' => $vendorDir . '/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php', + 'Illuminate\\Support\\HigherOrderTapProxy' => $vendorDir . '/laravel/framework/src/Illuminate/Support/HigherOrderTapProxy.php', + 'Illuminate\\Support\\HigherOrderWhenProxy' => $vendorDir . '/laravel/framework/src/Illuminate/Support/HigherOrderWhenProxy.php', + 'Illuminate\\Support\\HtmlString' => $vendorDir . '/laravel/framework/src/Illuminate/Support/HtmlString.php', + 'Illuminate\\Support\\InteractsWithTime' => $vendorDir . '/laravel/framework/src/Illuminate/Support/InteractsWithTime.php', + 'Illuminate\\Support\\LazyCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Support/LazyCollection.php', + 'Illuminate\\Support\\Manager' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Manager.php', + 'Illuminate\\Support\\MessageBag' => $vendorDir . '/laravel/framework/src/Illuminate/Support/MessageBag.php', + 'Illuminate\\Support\\NamespacedItemResolver' => $vendorDir . '/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php', + 'Illuminate\\Support\\Optional' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Optional.php', + 'Illuminate\\Support\\Pluralizer' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Pluralizer.php', + 'Illuminate\\Support\\ProcessUtils' => $vendorDir . '/laravel/framework/src/Illuminate/Support/ProcessUtils.php', + 'Illuminate\\Support\\Reflector' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Reflector.php', + 'Illuminate\\Support\\ServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Support/ServiceProvider.php', + 'Illuminate\\Support\\Str' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Str.php', + 'Illuminate\\Support\\Stringable' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Stringable.php', + 'Illuminate\\Support\\Testing\\Fakes\\BusFake' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/BusFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\EventFake' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/EventFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\MailFake' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/MailFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\NotificationFake' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/NotificationFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\PendingMailFake' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/PendingMailFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\QueueFake' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/QueueFake.php', + 'Illuminate\\Support\\Traits\\CapsuleManagerTrait' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/CapsuleManagerTrait.php', + 'Illuminate\\Support\\Traits\\EnumeratesValues' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/EnumeratesValues.php', + 'Illuminate\\Support\\Traits\\ForwardsCalls' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php', + 'Illuminate\\Support\\Traits\\Localizable' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/Localizable.php', + 'Illuminate\\Support\\Traits\\Macroable' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/Macroable.php', + 'Illuminate\\Support\\Traits\\ReflectsClosures' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/ReflectsClosures.php', + 'Illuminate\\Support\\Traits\\Tappable' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Traits/Tappable.php', + 'Illuminate\\Support\\ViewErrorBag' => $vendorDir . '/laravel/framework/src/Illuminate/Support/ViewErrorBag.php', + 'Illuminate\\Testing\\Assert' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/Assert.php', + 'Illuminate\\Testing\\Constraints\\ArraySubset' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/Constraints/ArraySubset.php', + 'Illuminate\\Testing\\Constraints\\CountInDatabase' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/Constraints/CountInDatabase.php', + 'Illuminate\\Testing\\Constraints\\HasInDatabase' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/Constraints/HasInDatabase.php', + 'Illuminate\\Testing\\Constraints\\SeeInOrder' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/Constraints/SeeInOrder.php', + 'Illuminate\\Testing\\Constraints\\SoftDeletedInDatabase' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/Constraints/SoftDeletedInDatabase.php', + 'Illuminate\\Testing\\PendingCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/PendingCommand.php', + 'Illuminate\\Testing\\TestResponse' => $vendorDir . '/laravel/framework/src/Illuminate/Testing/TestResponse.php', + 'Illuminate\\Translation\\ArrayLoader' => $vendorDir . '/laravel/framework/src/Illuminate/Translation/ArrayLoader.php', + 'Illuminate\\Translation\\FileLoader' => $vendorDir . '/laravel/framework/src/Illuminate/Translation/FileLoader.php', + 'Illuminate\\Translation\\MessageSelector' => $vendorDir . '/laravel/framework/src/Illuminate/Translation/MessageSelector.php', + 'Illuminate\\Translation\\TranslationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Translation/TranslationServiceProvider.php', + 'Illuminate\\Translation\\Translator' => $vendorDir . '/laravel/framework/src/Illuminate/Translation/Translator.php', + 'Illuminate\\Validation\\ClosureValidationRule' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/ClosureValidationRule.php', + 'Illuminate\\Validation\\Concerns\\FilterEmailValidation' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Concerns/FilterEmailValidation.php', + 'Illuminate\\Validation\\Concerns\\FormatsMessages' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Concerns/FormatsMessages.php', + 'Illuminate\\Validation\\Concerns\\ReplacesAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Concerns/ReplacesAttributes.php', + 'Illuminate\\Validation\\Concerns\\ValidatesAttributes' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php', + 'Illuminate\\Validation\\DatabasePresenceVerifier' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php', + 'Illuminate\\Validation\\DatabasePresenceVerifierInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifierInterface.php', + 'Illuminate\\Validation\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Factory.php', + 'Illuminate\\Validation\\PresenceVerifierInterface' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/PresenceVerifierInterface.php', + 'Illuminate\\Validation\\Rule' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rule.php', + 'Illuminate\\Validation\\Rules\\DatabaseRule' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/DatabaseRule.php', + 'Illuminate\\Validation\\Rules\\Dimensions' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/Dimensions.php', + 'Illuminate\\Validation\\Rules\\Exists' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/Exists.php', + 'Illuminate\\Validation\\Rules\\In' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/In.php', + 'Illuminate\\Validation\\Rules\\NotIn' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/NotIn.php', + 'Illuminate\\Validation\\Rules\\RequiredIf' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/RequiredIf.php', + 'Illuminate\\Validation\\Rules\\Unique' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Rules/Unique.php', + 'Illuminate\\Validation\\UnauthorizedException' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/UnauthorizedException.php', + 'Illuminate\\Validation\\ValidatesWhenResolvedTrait' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php', + 'Illuminate\\Validation\\ValidationData' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/ValidationData.php', + 'Illuminate\\Validation\\ValidationException' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/ValidationException.php', + 'Illuminate\\Validation\\ValidationRuleParser' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/ValidationRuleParser.php', + 'Illuminate\\Validation\\ValidationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/ValidationServiceProvider.php', + 'Illuminate\\Validation\\Validator' => $vendorDir . '/laravel/framework/src/Illuminate/Validation/Validator.php', + 'Illuminate\\View\\AnonymousComponent' => $vendorDir . '/laravel/framework/src/Illuminate/View/AnonymousComponent.php', + 'Illuminate\\View\\Compilers\\BladeCompiler' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php', + 'Illuminate\\View\\Compilers\\Compiler' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Compiler.php', + 'Illuminate\\View\\Compilers\\CompilerInterface' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/CompilerInterface.php', + 'Illuminate\\View\\Compilers\\ComponentTagCompiler' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/ComponentTagCompiler.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesAuthorizations' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesAuthorizations.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesComments' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesComments.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesComponents' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesComponents.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesConditionals' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesConditionals.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesEchos' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesEchos.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesErrors' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesErrors.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesHelpers' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesHelpers.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesIncludes' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesIncludes.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesInjections' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesInjections.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesJson' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesJson.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesLayouts' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLayouts.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesLoops' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLoops.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesRawPhp' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesRawPhp.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesStacks' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesStacks.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesTranslations' => $vendorDir . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesTranslations.php', + 'Illuminate\\View\\Component' => $vendorDir . '/laravel/framework/src/Illuminate/View/Component.php', + 'Illuminate\\View\\ComponentAttributeBag' => $vendorDir . '/laravel/framework/src/Illuminate/View/ComponentAttributeBag.php', + 'Illuminate\\View\\Concerns\\ManagesComponents' => $vendorDir . '/laravel/framework/src/Illuminate/View/Concerns/ManagesComponents.php', + 'Illuminate\\View\\Concerns\\ManagesEvents' => $vendorDir . '/laravel/framework/src/Illuminate/View/Concerns/ManagesEvents.php', + 'Illuminate\\View\\Concerns\\ManagesLayouts' => $vendorDir . '/laravel/framework/src/Illuminate/View/Concerns/ManagesLayouts.php', + 'Illuminate\\View\\Concerns\\ManagesLoops' => $vendorDir . '/laravel/framework/src/Illuminate/View/Concerns/ManagesLoops.php', + 'Illuminate\\View\\Concerns\\ManagesStacks' => $vendorDir . '/laravel/framework/src/Illuminate/View/Concerns/ManagesStacks.php', + 'Illuminate\\View\\Concerns\\ManagesTranslations' => $vendorDir . '/laravel/framework/src/Illuminate/View/Concerns/ManagesTranslations.php', + 'Illuminate\\View\\Engines\\CompilerEngine' => $vendorDir . '/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php', + 'Illuminate\\View\\Engines\\Engine' => $vendorDir . '/laravel/framework/src/Illuminate/View/Engines/Engine.php', + 'Illuminate\\View\\Engines\\EngineResolver' => $vendorDir . '/laravel/framework/src/Illuminate/View/Engines/EngineResolver.php', + 'Illuminate\\View\\Engines\\FileEngine' => $vendorDir . '/laravel/framework/src/Illuminate/View/Engines/FileEngine.php', + 'Illuminate\\View\\Engines\\PhpEngine' => $vendorDir . '/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php', + 'Illuminate\\View\\Factory' => $vendorDir . '/laravel/framework/src/Illuminate/View/Factory.php', + 'Illuminate\\View\\FileViewFinder' => $vendorDir . '/laravel/framework/src/Illuminate/View/FileViewFinder.php', + 'Illuminate\\View\\InvokableComponentVariable' => $vendorDir . '/laravel/framework/src/Illuminate/View/InvokableComponentVariable.php', + 'Illuminate\\View\\Middleware\\ShareErrorsFromSession' => $vendorDir . '/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php', + 'Illuminate\\View\\View' => $vendorDir . '/laravel/framework/src/Illuminate/View/View.php', + 'Illuminate\\View\\ViewFinderInterface' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewFinderInterface.php', + 'Illuminate\\View\\ViewName' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewName.php', + 'Illuminate\\View\\ViewServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php', + 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', + 'Laravel\\Sanctum\\Contracts\\HasAbilities' => $vendorDir . '/laravel/sanctum/src/Contracts/HasAbilities.php', + 'Laravel\\Sanctum\\Guard' => $vendorDir . '/laravel/sanctum/src/Guard.php', + 'Laravel\\Sanctum\\HasApiTokens' => $vendorDir . '/laravel/sanctum/src/HasApiTokens.php', + 'Laravel\\Sanctum\\Http\\Controllers\\CsrfCookieController' => $vendorDir . '/laravel/sanctum/src/Http/Controllers/CsrfCookieController.php', + 'Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful' => $vendorDir . '/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php', + 'Laravel\\Sanctum\\NewAccessToken' => $vendorDir . '/laravel/sanctum/src/NewAccessToken.php', + 'Laravel\\Sanctum\\PersonalAccessToken' => $vendorDir . '/laravel/sanctum/src/PersonalAccessToken.php', + 'Laravel\\Sanctum\\Sanctum' => $vendorDir . '/laravel/sanctum/src/Sanctum.php', + 'Laravel\\Sanctum\\SanctumServiceProvider' => $vendorDir . '/laravel/sanctum/src/SanctumServiceProvider.php', + 'Laravel\\Sanctum\\TransientToken' => $vendorDir . '/laravel/sanctum/src/TransientToken.php', + 'Laravel\\Tinker\\ClassAliasAutoloader' => $vendorDir . '/laravel/tinker/src/ClassAliasAutoloader.php', + 'Laravel\\Tinker\\Console\\TinkerCommand' => $vendorDir . '/laravel/tinker/src/Console/TinkerCommand.php', + 'Laravel\\Tinker\\TinkerCaster' => $vendorDir . '/laravel/tinker/src/TinkerCaster.php', + 'Laravel\\Tinker\\TinkerServiceProvider' => $vendorDir . '/laravel/tinker/src/TinkerServiceProvider.php', + 'Laravel\\Ui\\AuthCommand' => $vendorDir . '/laravel/ui/src/AuthCommand.php', + 'Laravel\\Ui\\AuthRouteMethods' => $vendorDir . '/laravel/ui/src/AuthRouteMethods.php', + 'Laravel\\Ui\\ControllersCommand' => $vendorDir . '/laravel/ui/src/ControllersCommand.php', + 'Laravel\\Ui\\Presets\\Bootstrap' => $vendorDir . '/laravel/ui/src/Presets/Bootstrap.php', + 'Laravel\\Ui\\Presets\\Preset' => $vendorDir . '/laravel/ui/src/Presets/Preset.php', + 'Laravel\\Ui\\Presets\\React' => $vendorDir . '/laravel/ui/src/Presets/React.php', + 'Laravel\\Ui\\Presets\\Vue' => $vendorDir . '/laravel/ui/src/Presets/Vue.php', + 'Laravel\\Ui\\UiCommand' => $vendorDir . '/laravel/ui/src/UiCommand.php', + 'Laravel\\Ui\\UiServiceProvider' => $vendorDir . '/laravel/ui/src/UiServiceProvider.php', + 'League\\CommonMark\\Block\\Element\\AbstractBlock' => $vendorDir . '/league/commonmark/src/Block/Element/AbstractBlock.php', + 'League\\CommonMark\\Block\\Element\\AbstractStringContainerBlock' => $vendorDir . '/league/commonmark/src/Block/Element/AbstractStringContainerBlock.php', + 'League\\CommonMark\\Block\\Element\\BlockQuote' => $vendorDir . '/league/commonmark/src/Block/Element/BlockQuote.php', + 'League\\CommonMark\\Block\\Element\\Document' => $vendorDir . '/league/commonmark/src/Block/Element/Document.php', + 'League\\CommonMark\\Block\\Element\\FencedCode' => $vendorDir . '/league/commonmark/src/Block/Element/FencedCode.php', + 'League\\CommonMark\\Block\\Element\\Heading' => $vendorDir . '/league/commonmark/src/Block/Element/Heading.php', + 'League\\CommonMark\\Block\\Element\\HtmlBlock' => $vendorDir . '/league/commonmark/src/Block/Element/HtmlBlock.php', + 'League\\CommonMark\\Block\\Element\\IndentedCode' => $vendorDir . '/league/commonmark/src/Block/Element/IndentedCode.php', + 'League\\CommonMark\\Block\\Element\\InlineContainerInterface' => $vendorDir . '/league/commonmark/src/Block/Element/InlineContainerInterface.php', + 'League\\CommonMark\\Block\\Element\\ListBlock' => $vendorDir . '/league/commonmark/src/Block/Element/ListBlock.php', + 'League\\CommonMark\\Block\\Element\\ListData' => $vendorDir . '/league/commonmark/src/Block/Element/ListData.php', + 'League\\CommonMark\\Block\\Element\\ListItem' => $vendorDir . '/league/commonmark/src/Block/Element/ListItem.php', + 'League\\CommonMark\\Block\\Element\\Paragraph' => $vendorDir . '/league/commonmark/src/Block/Element/Paragraph.php', + 'League\\CommonMark\\Block\\Element\\StringContainerInterface' => $vendorDir . '/league/commonmark/src/Block/Element/StringContainerInterface.php', + 'League\\CommonMark\\Block\\Element\\ThematicBreak' => $vendorDir . '/league/commonmark/src/Block/Element/ThematicBreak.php', + 'League\\CommonMark\\Block\\Parser\\ATXHeadingParser' => $vendorDir . '/league/commonmark/src/Block/Parser/ATXHeadingParser.php', + 'League\\CommonMark\\Block\\Parser\\BlockParserInterface' => $vendorDir . '/league/commonmark/src/Block/Parser/BlockParserInterface.php', + 'League\\CommonMark\\Block\\Parser\\BlockQuoteParser' => $vendorDir . '/league/commonmark/src/Block/Parser/BlockQuoteParser.php', + 'League\\CommonMark\\Block\\Parser\\FencedCodeParser' => $vendorDir . '/league/commonmark/src/Block/Parser/FencedCodeParser.php', + 'League\\CommonMark\\Block\\Parser\\HtmlBlockParser' => $vendorDir . '/league/commonmark/src/Block/Parser/HtmlBlockParser.php', + 'League\\CommonMark\\Block\\Parser\\IndentedCodeParser' => $vendorDir . '/league/commonmark/src/Block/Parser/IndentedCodeParser.php', + 'League\\CommonMark\\Block\\Parser\\LazyParagraphParser' => $vendorDir . '/league/commonmark/src/Block/Parser/LazyParagraphParser.php', + 'League\\CommonMark\\Block\\Parser\\ListParser' => $vendorDir . '/league/commonmark/src/Block/Parser/ListParser.php', + 'League\\CommonMark\\Block\\Parser\\SetExtHeadingParser' => $vendorDir . '/league/commonmark/src/Block/Parser/SetExtHeadingParser.php', + 'League\\CommonMark\\Block\\Parser\\ThematicBreakParser' => $vendorDir . '/league/commonmark/src/Block/Parser/ThematicBreakParser.php', + 'League\\CommonMark\\Block\\Renderer\\BlockQuoteRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/BlockQuoteRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\BlockRendererInterface' => $vendorDir . '/league/commonmark/src/Block/Renderer/BlockRendererInterface.php', + 'League\\CommonMark\\Block\\Renderer\\DocumentRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/DocumentRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\FencedCodeRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/FencedCodeRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\HeadingRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/HeadingRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\HtmlBlockRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/HtmlBlockRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\IndentedCodeRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/IndentedCodeRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ListBlockRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/ListBlockRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ListItemRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/ListItemRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ParagraphRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/ParagraphRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ThematicBreakRenderer' => $vendorDir . '/league/commonmark/src/Block/Renderer/ThematicBreakRenderer.php', + 'League\\CommonMark\\CommonMarkConverter' => $vendorDir . '/league/commonmark/src/CommonMarkConverter.php', + 'League\\CommonMark\\ConfigurableEnvironmentInterface' => $vendorDir . '/league/commonmark/src/ConfigurableEnvironmentInterface.php', + 'League\\CommonMark\\Context' => $vendorDir . '/league/commonmark/src/Context.php', + 'League\\CommonMark\\ContextInterface' => $vendorDir . '/league/commonmark/src/ContextInterface.php', + 'League\\CommonMark\\Converter' => $vendorDir . '/league/commonmark/src/Converter.php', + 'League\\CommonMark\\ConverterInterface' => $vendorDir . '/league/commonmark/src/ConverterInterface.php', + 'League\\CommonMark\\Cursor' => $vendorDir . '/league/commonmark/src/Cursor.php', + 'League\\CommonMark\\Delimiter\\Delimiter' => $vendorDir . '/league/commonmark/src/Delimiter/Delimiter.php', + 'League\\CommonMark\\Delimiter\\DelimiterInterface' => $vendorDir . '/league/commonmark/src/Delimiter/DelimiterInterface.php', + 'League\\CommonMark\\Delimiter\\DelimiterStack' => $vendorDir . '/league/commonmark/src/Delimiter/DelimiterStack.php', + 'League\\CommonMark\\Delimiter\\Processor\\DelimiterProcessorCollection' => $vendorDir . '/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollection.php', + 'League\\CommonMark\\Delimiter\\Processor\\DelimiterProcessorCollectionInterface' => $vendorDir . '/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollectionInterface.php', + 'League\\CommonMark\\Delimiter\\Processor\\DelimiterProcessorInterface' => $vendorDir . '/league/commonmark/src/Delimiter/Processor/DelimiterProcessorInterface.php', + 'League\\CommonMark\\Delimiter\\Processor\\EmphasisDelimiterProcessor' => $vendorDir . '/league/commonmark/src/Delimiter/Processor/EmphasisDelimiterProcessor.php', + 'League\\CommonMark\\Delimiter\\Processor\\StaggeredDelimiterProcessor' => $vendorDir . '/league/commonmark/src/Delimiter/Processor/StaggeredDelimiterProcessor.php', + 'League\\CommonMark\\DocParser' => $vendorDir . '/league/commonmark/src/DocParser.php', + 'League\\CommonMark\\DocParserInterface' => $vendorDir . '/league/commonmark/src/DocParserInterface.php', + 'League\\CommonMark\\ElementRendererInterface' => $vendorDir . '/league/commonmark/src/ElementRendererInterface.php', + 'League\\CommonMark\\Environment' => $vendorDir . '/league/commonmark/src/Environment.php', + 'League\\CommonMark\\EnvironmentAwareInterface' => $vendorDir . '/league/commonmark/src/EnvironmentAwareInterface.php', + 'League\\CommonMark\\EnvironmentInterface' => $vendorDir . '/league/commonmark/src/EnvironmentInterface.php', + 'League\\CommonMark\\Event\\AbstractEvent' => $vendorDir . '/league/commonmark/src/Event/AbstractEvent.php', + 'League\\CommonMark\\Event\\DocumentParsedEvent' => $vendorDir . '/league/commonmark/src/Event/DocumentParsedEvent.php', + 'League\\CommonMark\\Event\\DocumentPreParsedEvent' => $vendorDir . '/league/commonmark/src/Event/DocumentPreParsedEvent.php', + 'League\\CommonMark\\Exception\\InvalidOptionException' => $vendorDir . '/league/commonmark/src/Exception/InvalidOptionException.php', + 'League\\CommonMark\\Exception\\UnexpectedEncodingException' => $vendorDir . '/league/commonmark/src/Exception/UnexpectedEncodingException.php', + 'League\\CommonMark\\Extension\\Autolink\\AutolinkExtension' => $vendorDir . '/league/commonmark/src/Extension/Autolink/AutolinkExtension.php', + 'League\\CommonMark\\Extension\\Autolink\\EmailAutolinkProcessor' => $vendorDir . '/league/commonmark/src/Extension/Autolink/EmailAutolinkProcessor.php', + 'League\\CommonMark\\Extension\\Autolink\\InlineMentionParser' => $vendorDir . '/league/commonmark/src/Extension/Autolink/InlineMentionParser.php', + 'League\\CommonMark\\Extension\\Autolink\\UrlAutolinkProcessor' => $vendorDir . '/league/commonmark/src/Extension/Autolink/UrlAutolinkProcessor.php', + 'League\\CommonMark\\Extension\\CommonMarkCoreExtension' => $vendorDir . '/league/commonmark/src/Extension/CommonMarkCoreExtension.php', + 'League\\CommonMark\\Extension\\DisallowedRawHtml\\DisallowedRawHtmlBlockRenderer' => $vendorDir . '/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlBlockRenderer.php', + 'League\\CommonMark\\Extension\\DisallowedRawHtml\\DisallowedRawHtmlExtension' => $vendorDir . '/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlExtension.php', + 'League\\CommonMark\\Extension\\DisallowedRawHtml\\DisallowedRawHtmlInlineRenderer' => $vendorDir . '/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlInlineRenderer.php', + 'League\\CommonMark\\Extension\\ExtensionInterface' => $vendorDir . '/league/commonmark/src/Extension/ExtensionInterface.php', + 'League\\CommonMark\\Extension\\ExternalLink\\ExternalLinkExtension' => $vendorDir . '/league/commonmark/src/Extension/ExternalLink/ExternalLinkExtension.php', + 'League\\CommonMark\\Extension\\ExternalLink\\ExternalLinkProcessor' => $vendorDir . '/league/commonmark/src/Extension/ExternalLink/ExternalLinkProcessor.php', + 'League\\CommonMark\\Extension\\GithubFlavoredMarkdownExtension' => $vendorDir . '/league/commonmark/src/Extension/GithubFlavoredMarkdownExtension.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalink' => $vendorDir . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalink.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalinkExtension' => $vendorDir . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkExtension.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalinkProcessor' => $vendorDir . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkProcessor.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalinkRenderer' => $vendorDir . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkRenderer.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\Slug\\DefaultSlugGenerator' => $vendorDir . '/league/commonmark/src/Extension/HeadingPermalink/Slug/DefaultSlugGenerator.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\Slug\\SlugGeneratorInterface' => $vendorDir . '/league/commonmark/src/Extension/HeadingPermalink/Slug/SlugGeneratorInterface.php', + 'League\\CommonMark\\Extension\\InlinesOnly\\ChildRenderer' => $vendorDir . '/league/commonmark/src/Extension/InlinesOnly/ChildRenderer.php', + 'League\\CommonMark\\Extension\\InlinesOnly\\InlinesOnlyExtension' => $vendorDir . '/league/commonmark/src/Extension/InlinesOnly/InlinesOnlyExtension.php', + 'League\\CommonMark\\Extension\\SmartPunct\\PunctuationParser' => $vendorDir . '/league/commonmark/src/Extension/SmartPunct/PunctuationParser.php', + 'League\\CommonMark\\Extension\\SmartPunct\\Quote' => $vendorDir . '/league/commonmark/src/Extension/SmartPunct/Quote.php', + 'League\\CommonMark\\Extension\\SmartPunct\\QuoteParser' => $vendorDir . '/league/commonmark/src/Extension/SmartPunct/QuoteParser.php', + 'League\\CommonMark\\Extension\\SmartPunct\\QuoteProcessor' => $vendorDir . '/league/commonmark/src/Extension/SmartPunct/QuoteProcessor.php', + 'League\\CommonMark\\Extension\\SmartPunct\\QuoteRenderer' => $vendorDir . '/league/commonmark/src/Extension/SmartPunct/QuoteRenderer.php', + 'League\\CommonMark\\Extension\\SmartPunct\\SmartPunctExtension' => $vendorDir . '/league/commonmark/src/Extension/SmartPunct/SmartPunctExtension.php', + 'League\\CommonMark\\Extension\\Strikethrough\\Strikethrough' => $vendorDir . '/league/commonmark/src/Extension/Strikethrough/Strikethrough.php', + 'League\\CommonMark\\Extension\\Strikethrough\\StrikethroughDelimiterProcessor' => $vendorDir . '/league/commonmark/src/Extension/Strikethrough/StrikethroughDelimiterProcessor.php', + 'League\\CommonMark\\Extension\\Strikethrough\\StrikethroughExtension' => $vendorDir . '/league/commonmark/src/Extension/Strikethrough/StrikethroughExtension.php', + 'League\\CommonMark\\Extension\\Strikethrough\\StrikethroughRenderer' => $vendorDir . '/league/commonmark/src/Extension/Strikethrough/StrikethroughRenderer.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\AsIsNormalizerStrategy' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/Normalizer/AsIsNormalizerStrategy.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\FlatNormalizerStrategy' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/Normalizer/FlatNormalizerStrategy.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\NormalizerStrategyInterface' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/Normalizer/NormalizerStrategyInterface.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\RelativeNormalizerStrategy' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/Normalizer/RelativeNormalizerStrategy.php', + 'League\\CommonMark\\Extension\\TableOfContents\\TableOfContents' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/TableOfContents.php', + 'League\\CommonMark\\Extension\\TableOfContents\\TableOfContentsBuilder' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/TableOfContentsBuilder.php', + 'League\\CommonMark\\Extension\\TableOfContents\\TableOfContentsExtension' => $vendorDir . '/league/commonmark/src/Extension/TableOfContents/TableOfContentsExtension.php', + 'League\\CommonMark\\Extension\\Table\\Table' => $vendorDir . '/league/commonmark/src/Extension/Table/Table.php', + 'League\\CommonMark\\Extension\\Table\\TableCell' => $vendorDir . '/league/commonmark/src/Extension/Table/TableCell.php', + 'League\\CommonMark\\Extension\\Table\\TableCellRenderer' => $vendorDir . '/league/commonmark/src/Extension/Table/TableCellRenderer.php', + 'League\\CommonMark\\Extension\\Table\\TableExtension' => $vendorDir . '/league/commonmark/src/Extension/Table/TableExtension.php', + 'League\\CommonMark\\Extension\\Table\\TableParser' => $vendorDir . '/league/commonmark/src/Extension/Table/TableParser.php', + 'League\\CommonMark\\Extension\\Table\\TableRenderer' => $vendorDir . '/league/commonmark/src/Extension/Table/TableRenderer.php', + 'League\\CommonMark\\Extension\\Table\\TableRow' => $vendorDir . '/league/commonmark/src/Extension/Table/TableRow.php', + 'League\\CommonMark\\Extension\\Table\\TableRowRenderer' => $vendorDir . '/league/commonmark/src/Extension/Table/TableRowRenderer.php', + 'League\\CommonMark\\Extension\\Table\\TableSection' => $vendorDir . '/league/commonmark/src/Extension/Table/TableSection.php', + 'League\\CommonMark\\Extension\\Table\\TableSectionRenderer' => $vendorDir . '/league/commonmark/src/Extension/Table/TableSectionRenderer.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListExtension' => $vendorDir . '/league/commonmark/src/Extension/TaskList/TaskListExtension.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListItemMarker' => $vendorDir . '/league/commonmark/src/Extension/TaskList/TaskListItemMarker.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListItemMarkerParser' => $vendorDir . '/league/commonmark/src/Extension/TaskList/TaskListItemMarkerParser.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListItemMarkerRenderer' => $vendorDir . '/league/commonmark/src/Extension/TaskList/TaskListItemMarkerRenderer.php', + 'League\\CommonMark\\GithubFlavoredMarkdownConverter' => $vendorDir . '/league/commonmark/src/GithubFlavoredMarkdownConverter.php', + 'League\\CommonMark\\HtmlElement' => $vendorDir . '/league/commonmark/src/HtmlElement.php', + 'League\\CommonMark\\HtmlRenderer' => $vendorDir . '/league/commonmark/src/HtmlRenderer.php', + 'League\\CommonMark\\InlineParserContext' => $vendorDir . '/league/commonmark/src/InlineParserContext.php', + 'League\\CommonMark\\InlineParserEngine' => $vendorDir . '/league/commonmark/src/InlineParserEngine.php', + 'League\\CommonMark\\Inline\\AdjacentTextMerger' => $vendorDir . '/league/commonmark/src/Inline/AdjacentTextMerger.php', + 'League\\CommonMark\\Inline\\Element\\AbstractInline' => $vendorDir . '/league/commonmark/src/Inline/Element/AbstractInline.php', + 'League\\CommonMark\\Inline\\Element\\AbstractStringContainer' => $vendorDir . '/league/commonmark/src/Inline/Element/AbstractStringContainer.php', + 'League\\CommonMark\\Inline\\Element\\AbstractWebResource' => $vendorDir . '/league/commonmark/src/Inline/Element/AbstractWebResource.php', + 'League\\CommonMark\\Inline\\Element\\Code' => $vendorDir . '/league/commonmark/src/Inline/Element/Code.php', + 'League\\CommonMark\\Inline\\Element\\Emphasis' => $vendorDir . '/league/commonmark/src/Inline/Element/Emphasis.php', + 'League\\CommonMark\\Inline\\Element\\HtmlInline' => $vendorDir . '/league/commonmark/src/Inline/Element/HtmlInline.php', + 'League\\CommonMark\\Inline\\Element\\Image' => $vendorDir . '/league/commonmark/src/Inline/Element/Image.php', + 'League\\CommonMark\\Inline\\Element\\Link' => $vendorDir . '/league/commonmark/src/Inline/Element/Link.php', + 'League\\CommonMark\\Inline\\Element\\Newline' => $vendorDir . '/league/commonmark/src/Inline/Element/Newline.php', + 'League\\CommonMark\\Inline\\Element\\Strong' => $vendorDir . '/league/commonmark/src/Inline/Element/Strong.php', + 'League\\CommonMark\\Inline\\Element\\Text' => $vendorDir . '/league/commonmark/src/Inline/Element/Text.php', + 'League\\CommonMark\\Inline\\Parser\\AutolinkParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/AutolinkParser.php', + 'League\\CommonMark\\Inline\\Parser\\BacktickParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/BacktickParser.php', + 'League\\CommonMark\\Inline\\Parser\\BangParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/BangParser.php', + 'League\\CommonMark\\Inline\\Parser\\CloseBracketParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/CloseBracketParser.php', + 'League\\CommonMark\\Inline\\Parser\\EntityParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/EntityParser.php', + 'League\\CommonMark\\Inline\\Parser\\EscapableParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/EscapableParser.php', + 'League\\CommonMark\\Inline\\Parser\\HtmlInlineParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/HtmlInlineParser.php', + 'League\\CommonMark\\Inline\\Parser\\InlineParserInterface' => $vendorDir . '/league/commonmark/src/Inline/Parser/InlineParserInterface.php', + 'League\\CommonMark\\Inline\\Parser\\NewlineParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/NewlineParser.php', + 'League\\CommonMark\\Inline\\Parser\\OpenBracketParser' => $vendorDir . '/league/commonmark/src/Inline/Parser/OpenBracketParser.php', + 'League\\CommonMark\\Inline\\Renderer\\CodeRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/CodeRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\EmphasisRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/EmphasisRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\HtmlInlineRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/HtmlInlineRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\ImageRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/ImageRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\InlineRendererInterface' => $vendorDir . '/league/commonmark/src/Inline/Renderer/InlineRendererInterface.php', + 'League\\CommonMark\\Inline\\Renderer\\LinkRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/LinkRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\NewlineRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/NewlineRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\StrongRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/StrongRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\TextRenderer' => $vendorDir . '/league/commonmark/src/Inline/Renderer/TextRenderer.php', + 'League\\CommonMark\\Input\\MarkdownInput' => $vendorDir . '/league/commonmark/src/Input/MarkdownInput.php', + 'League\\CommonMark\\Input\\MarkdownInputInterface' => $vendorDir . '/league/commonmark/src/Input/MarkdownInputInterface.php', + 'League\\CommonMark\\MarkdownConverterInterface' => $vendorDir . '/league/commonmark/src/MarkdownConverterInterface.php', + 'League\\CommonMark\\Node\\Node' => $vendorDir . '/league/commonmark/src/Node/Node.php', + 'League\\CommonMark\\Node\\NodeWalker' => $vendorDir . '/league/commonmark/src/Node/NodeWalker.php', + 'League\\CommonMark\\Node\\NodeWalkerEvent' => $vendorDir . '/league/commonmark/src/Node/NodeWalkerEvent.php', + 'League\\CommonMark\\Reference\\Reference' => $vendorDir . '/league/commonmark/src/Reference/Reference.php', + 'League\\CommonMark\\Reference\\ReferenceInterface' => $vendorDir . '/league/commonmark/src/Reference/ReferenceInterface.php', + 'League\\CommonMark\\Reference\\ReferenceMap' => $vendorDir . '/league/commonmark/src/Reference/ReferenceMap.php', + 'League\\CommonMark\\Reference\\ReferenceMapInterface' => $vendorDir . '/league/commonmark/src/Reference/ReferenceMapInterface.php', + 'League\\CommonMark\\Reference\\ReferenceParser' => $vendorDir . '/league/commonmark/src/Reference/ReferenceParser.php', + 'League\\CommonMark\\UnmatchedBlockCloser' => $vendorDir . '/league/commonmark/src/UnmatchedBlockCloser.php', + 'League\\CommonMark\\Util\\ArrayCollection' => $vendorDir . '/league/commonmark/src/Util/ArrayCollection.php', + 'League\\CommonMark\\Util\\Configuration' => $vendorDir . '/league/commonmark/src/Util/Configuration.php', + 'League\\CommonMark\\Util\\ConfigurationAwareInterface' => $vendorDir . '/league/commonmark/src/Util/ConfigurationAwareInterface.php', + 'League\\CommonMark\\Util\\ConfigurationInterface' => $vendorDir . '/league/commonmark/src/Util/ConfigurationInterface.php', + 'League\\CommonMark\\Util\\Html5Entities' => $vendorDir . '/league/commonmark/src/Util/Html5Entities.php', + 'League\\CommonMark\\Util\\Html5EntityDecoder' => $vendorDir . '/league/commonmark/src/Util/Html5EntityDecoder.php', + 'League\\CommonMark\\Util\\LinkParserHelper' => $vendorDir . '/league/commonmark/src/Util/LinkParserHelper.php', + 'League\\CommonMark\\Util\\PrioritizedList' => $vendorDir . '/league/commonmark/src/Util/PrioritizedList.php', + 'League\\CommonMark\\Util\\RegexHelper' => $vendorDir . '/league/commonmark/src/Util/RegexHelper.php', + 'League\\CommonMark\\Util\\UrlEncoder' => $vendorDir . '/league/commonmark/src/Util/UrlEncoder.php', + 'League\\CommonMark\\Util\\Xml' => $vendorDir . '/league/commonmark/src/Util/Xml.php', + 'League\\Flysystem\\AdapterInterface' => $vendorDir . '/league/flysystem/src/AdapterInterface.php', + 'League\\Flysystem\\Adapter\\AbstractAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractAdapter.php', + 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php', + 'League\\Flysystem\\Adapter\\CanOverwriteFiles' => $vendorDir . '/league/flysystem/src/Adapter/CanOverwriteFiles.php', + 'League\\Flysystem\\Adapter\\Ftp' => $vendorDir . '/league/flysystem/src/Adapter/Ftp.php', + 'League\\Flysystem\\Adapter\\Ftpd' => $vendorDir . '/league/flysystem/src/Adapter/Ftpd.php', + 'League\\Flysystem\\Adapter\\Local' => $vendorDir . '/league/flysystem/src/Adapter/Local.php', + 'League\\Flysystem\\Adapter\\NullAdapter' => $vendorDir . '/league/flysystem/src/Adapter/NullAdapter.php', + 'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php', + 'League\\Flysystem\\Adapter\\SynologyFtp' => $vendorDir . '/league/flysystem/src/Adapter/SynologyFtp.php', + 'League\\Flysystem\\Config' => $vendorDir . '/league/flysystem/src/Config.php', + 'League\\Flysystem\\ConfigAwareTrait' => $vendorDir . '/league/flysystem/src/ConfigAwareTrait.php', + 'League\\Flysystem\\ConnectionErrorException' => $vendorDir . '/league/flysystem/src/ConnectionErrorException.php', + 'League\\Flysystem\\ConnectionRuntimeException' => $vendorDir . '/league/flysystem/src/ConnectionRuntimeException.php', + 'League\\Flysystem\\Directory' => $vendorDir . '/league/flysystem/src/Directory.php', + 'League\\Flysystem\\Exception' => $vendorDir . '/league/flysystem/src/Exception.php', + 'League\\Flysystem\\File' => $vendorDir . '/league/flysystem/src/File.php', + 'League\\Flysystem\\FileExistsException' => $vendorDir . '/league/flysystem/src/FileExistsException.php', + 'League\\Flysystem\\FileNotFoundException' => $vendorDir . '/league/flysystem/src/FileNotFoundException.php', + 'League\\Flysystem\\Filesystem' => $vendorDir . '/league/flysystem/src/Filesystem.php', + 'League\\Flysystem\\FilesystemException' => $vendorDir . '/league/flysystem/src/FilesystemException.php', + 'League\\Flysystem\\FilesystemInterface' => $vendorDir . '/league/flysystem/src/FilesystemInterface.php', + 'League\\Flysystem\\FilesystemNotFoundException' => $vendorDir . '/league/flysystem/src/FilesystemNotFoundException.php', + 'League\\Flysystem\\Handler' => $vendorDir . '/league/flysystem/src/Handler.php', + 'League\\Flysystem\\InvalidRootException' => $vendorDir . '/league/flysystem/src/InvalidRootException.php', + 'League\\Flysystem\\MountManager' => $vendorDir . '/league/flysystem/src/MountManager.php', + 'League\\Flysystem\\NotSupportedException' => $vendorDir . '/league/flysystem/src/NotSupportedException.php', + 'League\\Flysystem\\PluginInterface' => $vendorDir . '/league/flysystem/src/PluginInterface.php', + 'League\\Flysystem\\Plugin\\AbstractPlugin' => $vendorDir . '/league/flysystem/src/Plugin/AbstractPlugin.php', + 'League\\Flysystem\\Plugin\\EmptyDir' => $vendorDir . '/league/flysystem/src/Plugin/EmptyDir.php', + 'League\\Flysystem\\Plugin\\ForcedCopy' => $vendorDir . '/league/flysystem/src/Plugin/ForcedCopy.php', + 'League\\Flysystem\\Plugin\\ForcedRename' => $vendorDir . '/league/flysystem/src/Plugin/ForcedRename.php', + 'League\\Flysystem\\Plugin\\GetWithMetadata' => $vendorDir . '/league/flysystem/src/Plugin/GetWithMetadata.php', + 'League\\Flysystem\\Plugin\\ListFiles' => $vendorDir . '/league/flysystem/src/Plugin/ListFiles.php', + 'League\\Flysystem\\Plugin\\ListPaths' => $vendorDir . '/league/flysystem/src/Plugin/ListPaths.php', + 'League\\Flysystem\\Plugin\\ListWith' => $vendorDir . '/league/flysystem/src/Plugin/ListWith.php', + 'League\\Flysystem\\Plugin\\PluggableTrait' => $vendorDir . '/league/flysystem/src/Plugin/PluggableTrait.php', + 'League\\Flysystem\\Plugin\\PluginNotFoundException' => $vendorDir . '/league/flysystem/src/Plugin/PluginNotFoundException.php', + 'League\\Flysystem\\ReadInterface' => $vendorDir . '/league/flysystem/src/ReadInterface.php', + 'League\\Flysystem\\RootViolationException' => $vendorDir . '/league/flysystem/src/RootViolationException.php', + 'League\\Flysystem\\SafeStorage' => $vendorDir . '/league/flysystem/src/SafeStorage.php', + 'League\\Flysystem\\UnreadableFileException' => $vendorDir . '/league/flysystem/src/UnreadableFileException.php', + 'League\\Flysystem\\Util' => $vendorDir . '/league/flysystem/src/Util.php', + 'League\\Flysystem\\Util\\ContentListingFormatter' => $vendorDir . '/league/flysystem/src/Util/ContentListingFormatter.php', + 'League\\Flysystem\\Util\\MimeType' => $vendorDir . '/league/flysystem/src/Util/MimeType.php', + 'League\\Flysystem\\Util\\StreamHasher' => $vendorDir . '/league/flysystem/src/Util/StreamHasher.php', + 'Maatwebsite\\Excel\\Cell' => $vendorDir . '/maatwebsite/excel/src/Cell.php', + 'Maatwebsite\\Excel\\ChunkReader' => $vendorDir . '/maatwebsite/excel/src/ChunkReader.php', + 'Maatwebsite\\Excel\\Concerns\\Exportable' => $vendorDir . '/maatwebsite/excel/src/Concerns/Exportable.php', + 'Maatwebsite\\Excel\\Concerns\\FromArray' => $vendorDir . '/maatwebsite/excel/src/Concerns/FromArray.php', + 'Maatwebsite\\Excel\\Concerns\\FromCollection' => $vendorDir . '/maatwebsite/excel/src/Concerns/FromCollection.php', + 'Maatwebsite\\Excel\\Concerns\\FromGenerator' => $vendorDir . '/maatwebsite/excel/src/Concerns/FromGenerator.php', + 'Maatwebsite\\Excel\\Concerns\\FromIterator' => $vendorDir . '/maatwebsite/excel/src/Concerns/FromIterator.php', + 'Maatwebsite\\Excel\\Concerns\\FromQuery' => $vendorDir . '/maatwebsite/excel/src/Concerns/FromQuery.php', + 'Maatwebsite\\Excel\\Concerns\\FromView' => $vendorDir . '/maatwebsite/excel/src/Concerns/FromView.php', + 'Maatwebsite\\Excel\\Concerns\\Importable' => $vendorDir . '/maatwebsite/excel/src/Concerns/Importable.php', + 'Maatwebsite\\Excel\\Concerns\\MapsCsvSettings' => $vendorDir . '/maatwebsite/excel/src/Concerns/MapsCsvSettings.php', + 'Maatwebsite\\Excel\\Concerns\\OnEachRow' => $vendorDir . '/maatwebsite/excel/src/Concerns/OnEachRow.php', + 'Maatwebsite\\Excel\\Concerns\\RegistersEventListeners' => $vendorDir . '/maatwebsite/excel/src/Concerns/RegistersEventListeners.php', + 'Maatwebsite\\Excel\\Concerns\\ShouldAutoSize' => $vendorDir . '/maatwebsite/excel/src/Concerns/ShouldAutoSize.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsErrors' => $vendorDir . '/maatwebsite/excel/src/Concerns/SkipsErrors.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsFailures' => $vendorDir . '/maatwebsite/excel/src/Concerns/SkipsFailures.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsOnError' => $vendorDir . '/maatwebsite/excel/src/Concerns/SkipsOnError.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsOnFailure' => $vendorDir . '/maatwebsite/excel/src/Concerns/SkipsOnFailure.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsUnknownSheets' => $vendorDir . '/maatwebsite/excel/src/Concerns/SkipsUnknownSheets.php', + 'Maatwebsite\\Excel\\Concerns\\ToArray' => $vendorDir . '/maatwebsite/excel/src/Concerns/ToArray.php', + 'Maatwebsite\\Excel\\Concerns\\ToCollection' => $vendorDir . '/maatwebsite/excel/src/Concerns/ToCollection.php', + 'Maatwebsite\\Excel\\Concerns\\ToModel' => $vendorDir . '/maatwebsite/excel/src/Concerns/ToModel.php', + 'Maatwebsite\\Excel\\Concerns\\WithBatchInserts' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithBatchInserts.php', + 'Maatwebsite\\Excel\\Concerns\\WithCalculatedFormulas' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCalculatedFormulas.php', + 'Maatwebsite\\Excel\\Concerns\\WithCharts' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCharts.php', + 'Maatwebsite\\Excel\\Concerns\\WithChunkReading' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithChunkReading.php', + 'Maatwebsite\\Excel\\Concerns\\WithColumnFormatting' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithColumnFormatting.php', + 'Maatwebsite\\Excel\\Concerns\\WithConditionalSheets' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithConditionalSheets.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomChunkSize' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCustomChunkSize.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomCsvSettings' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCustomCsvSettings.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomQuerySize' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCustomQuerySize.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomStartCell' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCustomStartCell.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomValueBinder' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithCustomValueBinder.php', + 'Maatwebsite\\Excel\\Concerns\\WithDrawings' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithDrawings.php', + 'Maatwebsite\\Excel\\Concerns\\WithEvents' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithEvents.php', + 'Maatwebsite\\Excel\\Concerns\\WithHeadingRow' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithHeadingRow.php', + 'Maatwebsite\\Excel\\Concerns\\WithHeadings' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithHeadings.php', + 'Maatwebsite\\Excel\\Concerns\\WithLimit' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithLimit.php', + 'Maatwebsite\\Excel\\Concerns\\WithMappedCells' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithMappedCells.php', + 'Maatwebsite\\Excel\\Concerns\\WithMapping' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithMapping.php', + 'Maatwebsite\\Excel\\Concerns\\WithMultipleSheets' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithMultipleSheets.php', + 'Maatwebsite\\Excel\\Concerns\\WithPreCalculateFormulas' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithPreCalculateFormulas.php', + 'Maatwebsite\\Excel\\Concerns\\WithProgressBar' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithProgressBar.php', + 'Maatwebsite\\Excel\\Concerns\\WithStartRow' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithStartRow.php', + 'Maatwebsite\\Excel\\Concerns\\WithStrictNullComparison' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithStrictNullComparison.php', + 'Maatwebsite\\Excel\\Concerns\\WithTitle' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithTitle.php', + 'Maatwebsite\\Excel\\Concerns\\WithValidation' => $vendorDir . '/maatwebsite/excel/src/Concerns/WithValidation.php', + 'Maatwebsite\\Excel\\Console\\ExportMakeCommand' => $vendorDir . '/maatwebsite/excel/src/Console/ExportMakeCommand.php', + 'Maatwebsite\\Excel\\Console\\ImportMakeCommand' => $vendorDir . '/maatwebsite/excel/src/Console/ImportMakeCommand.php', + 'Maatwebsite\\Excel\\Console\\WithModelStub' => $vendorDir . '/maatwebsite/excel/src/Console/WithModelStub.php', + 'Maatwebsite\\Excel\\DefaultValueBinder' => $vendorDir . '/maatwebsite/excel/src/DefaultValueBinder.php', + 'Maatwebsite\\Excel\\DelegatedMacroable' => $vendorDir . '/maatwebsite/excel/src/DelegatedMacroable.php', + 'Maatwebsite\\Excel\\Events\\AfterImport' => $vendorDir . '/maatwebsite/excel/src/Events/AfterImport.php', + 'Maatwebsite\\Excel\\Events\\AfterSheet' => $vendorDir . '/maatwebsite/excel/src/Events/AfterSheet.php', + 'Maatwebsite\\Excel\\Events\\BeforeExport' => $vendorDir . '/maatwebsite/excel/src/Events/BeforeExport.php', + 'Maatwebsite\\Excel\\Events\\BeforeImport' => $vendorDir . '/maatwebsite/excel/src/Events/BeforeImport.php', + 'Maatwebsite\\Excel\\Events\\BeforeSheet' => $vendorDir . '/maatwebsite/excel/src/Events/BeforeSheet.php', + 'Maatwebsite\\Excel\\Events\\BeforeWriting' => $vendorDir . '/maatwebsite/excel/src/Events/BeforeWriting.php', + 'Maatwebsite\\Excel\\Events\\Event' => $vendorDir . '/maatwebsite/excel/src/Events/Event.php', + 'Maatwebsite\\Excel\\Events\\ImportFailed' => $vendorDir . '/maatwebsite/excel/src/Events/ImportFailed.php', + 'Maatwebsite\\Excel\\Excel' => $vendorDir . '/maatwebsite/excel/src/Excel.php', + 'Maatwebsite\\Excel\\ExcelServiceProvider' => $vendorDir . '/maatwebsite/excel/src/ExcelServiceProvider.php', + 'Maatwebsite\\Excel\\Exceptions\\ConcernConflictException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/ConcernConflictException.php', + 'Maatwebsite\\Excel\\Exceptions\\LaravelExcelException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/LaravelExcelException.php', + 'Maatwebsite\\Excel\\Exceptions\\NoFilePathGivenException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/NoFilePathGivenException.php', + 'Maatwebsite\\Excel\\Exceptions\\NoFilenameGivenException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/NoFilenameGivenException.php', + 'Maatwebsite\\Excel\\Exceptions\\NoTypeDetectedException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/NoTypeDetectedException.php', + 'Maatwebsite\\Excel\\Exceptions\\RowSkippedException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/RowSkippedException.php', + 'Maatwebsite\\Excel\\Exceptions\\SheetNotFoundException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/SheetNotFoundException.php', + 'Maatwebsite\\Excel\\Exceptions\\UnreadableFileException' => $vendorDir . '/maatwebsite/excel/src/Exceptions/UnreadableFileException.php', + 'Maatwebsite\\Excel\\Exporter' => $vendorDir . '/maatwebsite/excel/src/Exporter.php', + 'Maatwebsite\\Excel\\Facades\\Excel' => $vendorDir . '/maatwebsite/excel/src/Facades/Excel.php', + 'Maatwebsite\\Excel\\Factories\\ReaderFactory' => $vendorDir . '/maatwebsite/excel/src/Factories/ReaderFactory.php', + 'Maatwebsite\\Excel\\Factories\\WriterFactory' => $vendorDir . '/maatwebsite/excel/src/Factories/WriterFactory.php', + 'Maatwebsite\\Excel\\Fakes\\ExcelFake' => $vendorDir . '/maatwebsite/excel/src/Fakes/ExcelFake.php', + 'Maatwebsite\\Excel\\Files\\Disk' => $vendorDir . '/maatwebsite/excel/src/Files/Disk.php', + 'Maatwebsite\\Excel\\Files\\Filesystem' => $vendorDir . '/maatwebsite/excel/src/Files/Filesystem.php', + 'Maatwebsite\\Excel\\Files\\LocalTemporaryFile' => $vendorDir . '/maatwebsite/excel/src/Files/LocalTemporaryFile.php', + 'Maatwebsite\\Excel\\Files\\RemoteTemporaryFile' => $vendorDir . '/maatwebsite/excel/src/Files/RemoteTemporaryFile.php', + 'Maatwebsite\\Excel\\Files\\TemporaryFile' => $vendorDir . '/maatwebsite/excel/src/Files/TemporaryFile.php', + 'Maatwebsite\\Excel\\Files\\TemporaryFileFactory' => $vendorDir . '/maatwebsite/excel/src/Files/TemporaryFileFactory.php', + 'Maatwebsite\\Excel\\Filters\\ChunkReadFilter' => $vendorDir . '/maatwebsite/excel/src/Filters/ChunkReadFilter.php', + 'Maatwebsite\\Excel\\HasEventBus' => $vendorDir . '/maatwebsite/excel/src/HasEventBus.php', + 'Maatwebsite\\Excel\\HeadingRowImport' => $vendorDir . '/maatwebsite/excel/src/HeadingRowImport.php', + 'Maatwebsite\\Excel\\Helpers\\ArrayHelper' => $vendorDir . '/maatwebsite/excel/src/Helpers/ArrayHelper.php', + 'Maatwebsite\\Excel\\Helpers\\CellHelper' => $vendorDir . '/maatwebsite/excel/src/Helpers/CellHelper.php', + 'Maatwebsite\\Excel\\Helpers\\FileTypeDetector' => $vendorDir . '/maatwebsite/excel/src/Helpers/FileTypeDetector.php', + 'Maatwebsite\\Excel\\Importer' => $vendorDir . '/maatwebsite/excel/src/Importer.php', + 'Maatwebsite\\Excel\\Imports\\EndRowFinder' => $vendorDir . '/maatwebsite/excel/src/Imports/EndRowFinder.php', + 'Maatwebsite\\Excel\\Imports\\HeadingRowExtractor' => $vendorDir . '/maatwebsite/excel/src/Imports/HeadingRowExtractor.php', + 'Maatwebsite\\Excel\\Imports\\HeadingRowFormatter' => $vendorDir . '/maatwebsite/excel/src/Imports/HeadingRowFormatter.php', + 'Maatwebsite\\Excel\\Imports\\ModelImporter' => $vendorDir . '/maatwebsite/excel/src/Imports/ModelImporter.php', + 'Maatwebsite\\Excel\\Imports\\ModelManager' => $vendorDir . '/maatwebsite/excel/src/Imports/ModelManager.php', + 'Maatwebsite\\Excel\\Jobs\\AfterImportJob' => $vendorDir . '/maatwebsite/excel/src/Jobs/AfterImportJob.php', + 'Maatwebsite\\Excel\\Jobs\\AppendDataToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendDataToSheet.php', + 'Maatwebsite\\Excel\\Jobs\\AppendQueryToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendQueryToSheet.php', + 'Maatwebsite\\Excel\\Jobs\\AppendViewToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendViewToSheet.php', + 'Maatwebsite\\Excel\\Jobs\\CloseSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/CloseSheet.php', + 'Maatwebsite\\Excel\\Jobs\\ExtendedQueueable' => $vendorDir . '/maatwebsite/excel/src/Jobs/ExtendedQueueable.php', + 'Maatwebsite\\Excel\\Jobs\\ProxyFailures' => $vendorDir . '/maatwebsite/excel/src/Jobs/ProxyFailures.php', + 'Maatwebsite\\Excel\\Jobs\\QueueExport' => $vendorDir . '/maatwebsite/excel/src/Jobs/QueueExport.php', + 'Maatwebsite\\Excel\\Jobs\\QueueImport' => $vendorDir . '/maatwebsite/excel/src/Jobs/QueueImport.php', + 'Maatwebsite\\Excel\\Jobs\\ReadChunk' => $vendorDir . '/maatwebsite/excel/src/Jobs/ReadChunk.php', + 'Maatwebsite\\Excel\\Jobs\\StoreQueuedExport' => $vendorDir . '/maatwebsite/excel/src/Jobs/StoreQueuedExport.php', + 'Maatwebsite\\Excel\\MappedReader' => $vendorDir . '/maatwebsite/excel/src/MappedReader.php', + 'Maatwebsite\\Excel\\Mixins\\DownloadCollection' => $vendorDir . '/maatwebsite/excel/src/Mixins/DownloadCollection.php', + 'Maatwebsite\\Excel\\Mixins\\StoreCollection' => $vendorDir . '/maatwebsite/excel/src/Mixins/StoreCollection.php', + 'Maatwebsite\\Excel\\QueuedWriter' => $vendorDir . '/maatwebsite/excel/src/QueuedWriter.php', + 'Maatwebsite\\Excel\\Reader' => $vendorDir . '/maatwebsite/excel/src/Reader.php', + 'Maatwebsite\\Excel\\RegistersCustomConcerns' => $vendorDir . '/maatwebsite/excel/src/RegistersCustomConcerns.php', + 'Maatwebsite\\Excel\\Row' => $vendorDir . '/maatwebsite/excel/src/Row.php', + 'Maatwebsite\\Excel\\Sheet' => $vendorDir . '/maatwebsite/excel/src/Sheet.php', + 'Maatwebsite\\Excel\\Transactions\\DbTransactionHandler' => $vendorDir . '/maatwebsite/excel/src/Transactions/DbTransactionHandler.php', + 'Maatwebsite\\Excel\\Transactions\\NullTransactionHandler' => $vendorDir . '/maatwebsite/excel/src/Transactions/NullTransactionHandler.php', + 'Maatwebsite\\Excel\\Transactions\\TransactionHandler' => $vendorDir . '/maatwebsite/excel/src/Transactions/TransactionHandler.php', + 'Maatwebsite\\Excel\\Transactions\\TransactionManager' => $vendorDir . '/maatwebsite/excel/src/Transactions/TransactionManager.php', + 'Maatwebsite\\Excel\\Validators\\Failure' => $vendorDir . '/maatwebsite/excel/src/Validators/Failure.php', + 'Maatwebsite\\Excel\\Validators\\RowValidator' => $vendorDir . '/maatwebsite/excel/src/Validators/RowValidator.php', + 'Maatwebsite\\Excel\\Validators\\ValidationException' => $vendorDir . '/maatwebsite/excel/src/Validators/ValidationException.php', + 'Maatwebsite\\Excel\\Writer' => $vendorDir . '/maatwebsite/excel/src/Writer.php', + 'Matrix\\Builder' => $vendorDir . '/markbaker/matrix/classes/src/Builder.php', + 'Matrix\\Exception' => $vendorDir . '/markbaker/matrix/classes/src/Exception.php', + 'Matrix\\Functions' => $vendorDir . '/markbaker/matrix/classes/src/Functions.php', + 'Matrix\\Matrix' => $vendorDir . '/markbaker/matrix/classes/src/Matrix.php', + 'Matrix\\Operators\\Addition' => $vendorDir . '/markbaker/matrix/classes/src/Operators/Addition.php', + 'Matrix\\Operators\\DirectSum' => $vendorDir . '/markbaker/matrix/classes/src/Operators/DirectSum.php', + 'Matrix\\Operators\\Division' => $vendorDir . '/markbaker/matrix/classes/src/Operators/Division.php', + 'Matrix\\Operators\\Multiplication' => $vendorDir . '/markbaker/matrix/classes/src/Operators/Multiplication.php', + 'Matrix\\Operators\\Operator' => $vendorDir . '/markbaker/matrix/classes/src/Operators/Operator.php', + 'Matrix\\Operators\\Subtraction' => $vendorDir . '/markbaker/matrix/classes/src/Operators/Subtraction.php', + 'Mockery' => $vendorDir . '/mockery/mockery/library/Mockery.php', + 'Mockery\\Adapter\\Phpunit\\MockeryPHPUnitIntegration' => $vendorDir . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryPHPUnitIntegration.php', + 'Mockery\\Adapter\\Phpunit\\MockeryPHPUnitIntegrationAssertPostConditions' => $vendorDir . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryPHPUnitIntegrationAssertPostConditions.php', + 'Mockery\\Adapter\\Phpunit\\MockeryTestCase' => $vendorDir . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryTestCase.php', + 'Mockery\\Adapter\\Phpunit\\MockeryTestCaseSetUp' => $vendorDir . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryTestCaseSetUp.php', + 'Mockery\\Adapter\\Phpunit\\TestListener' => $vendorDir . '/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php', + 'Mockery\\Adapter\\Phpunit\\TestListenerTrait' => $vendorDir . '/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListenerTrait.php', + 'Mockery\\ClosureWrapper' => $vendorDir . '/mockery/mockery/library/Mockery/ClosureWrapper.php', + 'Mockery\\CompositeExpectation' => $vendorDir . '/mockery/mockery/library/Mockery/CompositeExpectation.php', + 'Mockery\\Configuration' => $vendorDir . '/mockery/mockery/library/Mockery/Configuration.php', + 'Mockery\\Container' => $vendorDir . '/mockery/mockery/library/Mockery/Container.php', + 'Mockery\\CountValidator\\AtLeast' => $vendorDir . '/mockery/mockery/library/Mockery/CountValidator/AtLeast.php', + 'Mockery\\CountValidator\\AtMost' => $vendorDir . '/mockery/mockery/library/Mockery/CountValidator/AtMost.php', + 'Mockery\\CountValidator\\CountValidatorAbstract' => $vendorDir . '/mockery/mockery/library/Mockery/CountValidator/CountValidatorAbstract.php', + 'Mockery\\CountValidator\\Exact' => $vendorDir . '/mockery/mockery/library/Mockery/CountValidator/Exact.php', + 'Mockery\\CountValidator\\Exception' => $vendorDir . '/mockery/mockery/library/Mockery/CountValidator/Exception.php', + 'Mockery\\Exception' => $vendorDir . '/mockery/mockery/library/Mockery/Exception.php', + 'Mockery\\Exception\\BadMethodCallException' => $vendorDir . '/mockery/mockery/library/Mockery/Exception/BadMethodCallException.php', + 'Mockery\\Exception\\InvalidArgumentException' => $vendorDir . '/mockery/mockery/library/Mockery/Exception/InvalidArgumentException.php', + 'Mockery\\Exception\\InvalidCountException' => $vendorDir . '/mockery/mockery/library/Mockery/Exception/InvalidCountException.php', + 'Mockery\\Exception\\InvalidOrderException' => $vendorDir . '/mockery/mockery/library/Mockery/Exception/InvalidOrderException.php', + 'Mockery\\Exception\\NoMatchingExpectationException' => $vendorDir . '/mockery/mockery/library/Mockery/Exception/NoMatchingExpectationException.php', + 'Mockery\\Exception\\RuntimeException' => $vendorDir . '/mockery/mockery/library/Mockery/Exception/RuntimeException.php', + 'Mockery\\Expectation' => $vendorDir . '/mockery/mockery/library/Mockery/Expectation.php', + 'Mockery\\ExpectationDirector' => $vendorDir . '/mockery/mockery/library/Mockery/ExpectationDirector.php', + 'Mockery\\ExpectationInterface' => $vendorDir . '/mockery/mockery/library/Mockery/ExpectationInterface.php', + 'Mockery\\ExpectsHigherOrderMessage' => $vendorDir . '/mockery/mockery/library/Mockery/ExpectsHigherOrderMessage.php', + 'Mockery\\Generator\\CachingGenerator' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/CachingGenerator.php', + 'Mockery\\Generator\\DefinedTargetClass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/DefinedTargetClass.php', + 'Mockery\\Generator\\Generator' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/Generator.php', + 'Mockery\\Generator\\Method' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/Method.php', + 'Mockery\\Generator\\MockConfiguration' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/MockConfiguration.php', + 'Mockery\\Generator\\MockConfigurationBuilder' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/MockConfigurationBuilder.php', + 'Mockery\\Generator\\MockDefinition' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/MockDefinition.php', + 'Mockery\\Generator\\MockNameBuilder' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/MockNameBuilder.php', + 'Mockery\\Generator\\Parameter' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/Parameter.php', + 'Mockery\\Generator\\StringManipulationGenerator' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulationGenerator.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\AvoidMethodClashPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/AvoidMethodClashPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\CallTypeHintPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/CallTypeHintPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\ClassNamePass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ClassNamePass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\ClassPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ClassPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\ConstantsPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ConstantsPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\InstanceMockPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/InstanceMockPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\InterfacePass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/InterfacePass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\MagicMethodTypeHintsPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/MagicMethodTypeHintsPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\MethodDefinitionPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/MethodDefinitionPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\Pass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/Pass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\RemoveBuiltinMethodsThatAreFinalPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\RemoveDestructorPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveDestructorPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\RemoveUnserializeForInternalSerializableClassesPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveUnserializeForInternalSerializableClassesPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\TraitPass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/TraitPass.php', + 'Mockery\\Generator\\TargetClassInterface' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/TargetClassInterface.php', + 'Mockery\\Generator\\UndefinedTargetClass' => $vendorDir . '/mockery/mockery/library/Mockery/Generator/UndefinedTargetClass.php', + 'Mockery\\HigherOrderMessage' => $vendorDir . '/mockery/mockery/library/Mockery/HigherOrderMessage.php', + 'Mockery\\Instantiator' => $vendorDir . '/mockery/mockery/library/Mockery/Instantiator.php', + 'Mockery\\LegacyMockInterface' => $vendorDir . '/mockery/mockery/library/Mockery/LegacyMockInterface.php', + 'Mockery\\Loader\\EvalLoader' => $vendorDir . '/mockery/mockery/library/Mockery/Loader/EvalLoader.php', + 'Mockery\\Loader\\Loader' => $vendorDir . '/mockery/mockery/library/Mockery/Loader/Loader.php', + 'Mockery\\Loader\\RequireLoader' => $vendorDir . '/mockery/mockery/library/Mockery/Loader/RequireLoader.php', + 'Mockery\\Matcher\\AndAnyOtherArgs' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/AndAnyOtherArgs.php', + 'Mockery\\Matcher\\Any' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Any.php', + 'Mockery\\Matcher\\AnyArgs' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/AnyArgs.php', + 'Mockery\\Matcher\\AnyOf' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/AnyOf.php', + 'Mockery\\Matcher\\ArgumentListMatcher' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/ArgumentListMatcher.php', + 'Mockery\\Matcher\\Closure' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Closure.php', + 'Mockery\\Matcher\\Contains' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Contains.php', + 'Mockery\\Matcher\\Ducktype' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Ducktype.php', + 'Mockery\\Matcher\\HasKey' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/HasKey.php', + 'Mockery\\Matcher\\HasValue' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/HasValue.php', + 'Mockery\\Matcher\\MatcherAbstract' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/MatcherAbstract.php', + 'Mockery\\Matcher\\MultiArgumentClosure' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/MultiArgumentClosure.php', + 'Mockery\\Matcher\\MustBe' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/MustBe.php', + 'Mockery\\Matcher\\NoArgs' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/NoArgs.php', + 'Mockery\\Matcher\\Not' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Not.php', + 'Mockery\\Matcher\\NotAnyOf' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/NotAnyOf.php', + 'Mockery\\Matcher\\PHPUnitConstraint' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/PHPUnitConstraint.php', + 'Mockery\\Matcher\\Pattern' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Pattern.php', + 'Mockery\\Matcher\\Subset' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Subset.php', + 'Mockery\\Matcher\\Type' => $vendorDir . '/mockery/mockery/library/Mockery/Matcher/Type.php', + 'Mockery\\MethodCall' => $vendorDir . '/mockery/mockery/library/Mockery/MethodCall.php', + 'Mockery\\Mock' => $vendorDir . '/mockery/mockery/library/Mockery/Mock.php', + 'Mockery\\MockInterface' => $vendorDir . '/mockery/mockery/library/Mockery/MockInterface.php', + 'Mockery\\ReceivedMethodCalls' => $vendorDir . '/mockery/mockery/library/Mockery/ReceivedMethodCalls.php', + 'Mockery\\Undefined' => $vendorDir . '/mockery/mockery/library/Mockery/Undefined.php', + 'Mockery\\VerificationDirector' => $vendorDir . '/mockery/mockery/library/Mockery/VerificationDirector.php', + 'Mockery\\VerificationExpectation' => $vendorDir . '/mockery/mockery/library/Mockery/VerificationExpectation.php', + 'Monolog\\DateTimeImmutable' => $vendorDir . '/monolog/monolog/src/Monolog/DateTimeImmutable.php', + 'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php', + 'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', + 'Monolog\\Formatter\\ElasticaFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php', + 'Monolog\\Formatter\\ElasticsearchFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php', + 'Monolog\\Formatter\\FlowdockFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php', + 'Monolog\\Formatter\\FluentdFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php', + 'Monolog\\Formatter\\FormatterInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', + 'Monolog\\Formatter\\GelfMessageFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php', + 'Monolog\\Formatter\\HtmlFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php', + 'Monolog\\Formatter\\JsonFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php', + 'Monolog\\Formatter\\LineFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', + 'Monolog\\Formatter\\LogglyFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php', + 'Monolog\\Formatter\\LogmaticFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php', + 'Monolog\\Formatter\\LogstashFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php', + 'Monolog\\Formatter\\MongoDBFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php', + 'Monolog\\Formatter\\NormalizerFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', + 'Monolog\\Formatter\\ScalarFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php', + 'Monolog\\Formatter\\WildfireFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php', + 'Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', + 'Monolog\\Handler\\AbstractProcessingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', + 'Monolog\\Handler\\AbstractSyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php', + 'Monolog\\Handler\\AmqpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php', + 'Monolog\\Handler\\BrowserConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php', + 'Monolog\\Handler\\BufferHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php', + 'Monolog\\Handler\\ChromePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php', + 'Monolog\\Handler\\CouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php', + 'Monolog\\Handler\\CubeHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php', + 'Monolog\\Handler\\Curl\\Util' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php', + 'Monolog\\Handler\\DeduplicationHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php', + 'Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', + 'Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', + 'Monolog\\Handler\\ElasticaHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', + 'Monolog\\Handler\\ElasticsearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', + 'Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', + 'Monolog\\Handler\\FallbackGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', + 'Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', + 'Monolog\\Handler\\FingersCrossedHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php', + 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php', + 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php', + 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php', + 'Monolog\\Handler\\FirePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php', + 'Monolog\\Handler\\FleepHookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php', + 'Monolog\\Handler\\FlowdockHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php', + 'Monolog\\Handler\\FormattableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php', + 'Monolog\\Handler\\FormattableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php', + 'Monolog\\Handler\\GelfHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php', + 'Monolog\\Handler\\GroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php', + 'Monolog\\Handler\\Handler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Handler.php', + 'Monolog\\Handler\\HandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', + 'Monolog\\Handler\\HandlerWrapper' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php', + 'Monolog\\Handler\\IFTTTHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php', + 'Monolog\\Handler\\InsightOpsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php', + 'Monolog\\Handler\\LogEntriesHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php', + 'Monolog\\Handler\\LogglyHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php', + 'Monolog\\Handler\\LogmaticHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php', + 'Monolog\\Handler\\MailHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MailHandler.php', + 'Monolog\\Handler\\MandrillHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php', + 'Monolog\\Handler\\MissingExtensionException' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php', + 'Monolog\\Handler\\MongoDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php', + 'Monolog\\Handler\\NativeMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php', + 'Monolog\\Handler\\NewRelicHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php', + 'Monolog\\Handler\\NoopHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NoopHandler.php', + 'Monolog\\Handler\\NullHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NullHandler.php', + 'Monolog\\Handler\\OverflowHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/OverflowHandler.php', + 'Monolog\\Handler\\PHPConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php', + 'Monolog\\Handler\\ProcessHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessHandler.php', + 'Monolog\\Handler\\ProcessableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php', + 'Monolog\\Handler\\ProcessableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php', + 'Monolog\\Handler\\PsrHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php', + 'Monolog\\Handler\\PushoverHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php', + 'Monolog\\Handler\\RedisHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php', + 'Monolog\\Handler\\RollbarHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php', + 'Monolog\\Handler\\RotatingFileHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php', + 'Monolog\\Handler\\SamplingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php', + 'Monolog\\Handler\\SendGridHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SendGridHandler.php', + 'Monolog\\Handler\\SlackHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php', + 'Monolog\\Handler\\SlackWebhookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php', + 'Monolog\\Handler\\Slack\\SlackRecord' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php', + 'Monolog\\Handler\\SocketHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php', + 'Monolog\\Handler\\SqsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php', + 'Monolog\\Handler\\StreamHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', + 'Monolog\\Handler\\SwiftMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php', + 'Monolog\\Handler\\SyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', + 'Monolog\\Handler\\SyslogUdpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', + 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', + 'Monolog\\Handler\\TelegramBotHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php', + 'Monolog\\Handler\\TestHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TestHandler.php', + 'Monolog\\Handler\\WebRequestRecognizerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php', + 'Monolog\\Handler\\WhatFailureGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', + 'Monolog\\Handler\\ZendMonitorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', + 'Monolog\\Logger' => $vendorDir . '/monolog/monolog/src/Monolog/Logger.php', + 'Monolog\\Processor\\GitProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', + 'Monolog\\Processor\\HostnameProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php', + 'Monolog\\Processor\\IntrospectionProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', + 'Monolog\\Processor\\MemoryPeakUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php', + 'Monolog\\Processor\\MemoryProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', + 'Monolog\\Processor\\MemoryUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', + 'Monolog\\Processor\\MercurialProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php', + 'Monolog\\Processor\\ProcessIdProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php', + 'Monolog\\Processor\\ProcessorInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', + 'Monolog\\Processor\\PsrLogMessageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php', + 'Monolog\\Processor\\TagProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php', + 'Monolog\\Processor\\UidProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php', + 'Monolog\\Processor\\WebProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php', + 'Monolog\\Registry' => $vendorDir . '/monolog/monolog/src/Monolog/Registry.php', + 'Monolog\\ResettableInterface' => $vendorDir . '/monolog/monolog/src/Monolog/ResettableInterface.php', + 'Monolog\\SignalHandler' => $vendorDir . '/monolog/monolog/src/Monolog/SignalHandler.php', + 'Monolog\\Test\\TestCase' => $vendorDir . '/monolog/monolog/src/Monolog/Test/TestCase.php', + 'Monolog\\Utils' => $vendorDir . '/monolog/monolog/src/Monolog/Utils.php', + 'MyCLabs\\Enum\\Enum' => $vendorDir . '/myclabs/php-enum/src/Enum.php', + 'MyCLabs\\Enum\\PHPUnit\\Comparator' => $vendorDir . '/myclabs/php-enum/src/PHPUnit/Comparator.php', + 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/CollisionServiceProvider.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\Commands\\TestCommand' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/Commands/TestCommand.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\ExceptionHandler' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/ExceptionHandler.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\IgnitionSolutionsRepository' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/IgnitionSolutionsRepository.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\Inspector' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/Inspector.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\ConfigureIO' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/ConfigureIO.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\Printer' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/Printer.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\PrinterContents' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/PrinterContents.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\State' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/State.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\Style' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/Style.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\TestResult' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/TestResult.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\Timer' => $vendorDir . '/nunomaduro/collision/src/Adapters/Phpunit/Timer.php', + 'NunoMaduro\\Collision\\ArgumentFormatter' => $vendorDir . '/nunomaduro/collision/src/ArgumentFormatter.php', + 'NunoMaduro\\Collision\\ConsoleColor' => $vendorDir . '/nunomaduro/collision/src/ConsoleColor.php', + 'NunoMaduro\\Collision\\Contracts\\Adapters\\Phpunit\\HasPrintableTestCaseName' => $vendorDir . '/nunomaduro/collision/src/Contracts/Adapters/Phpunit/HasPrintableTestCaseName.php', + 'NunoMaduro\\Collision\\Contracts\\Adapters\\Phpunit\\Listener' => $vendorDir . '/nunomaduro/collision/src/Contracts/Adapters/Phpunit/Listener.php', + 'NunoMaduro\\Collision\\Contracts\\ArgumentFormatter' => $vendorDir . '/nunomaduro/collision/src/Contracts/ArgumentFormatter.php', + 'NunoMaduro\\Collision\\Contracts\\Handler' => $vendorDir . '/nunomaduro/collision/src/Contracts/Handler.php', + 'NunoMaduro\\Collision\\Contracts\\Highlighter' => $vendorDir . '/nunomaduro/collision/src/Contracts/Highlighter.php', + 'NunoMaduro\\Collision\\Contracts\\Provider' => $vendorDir . '/nunomaduro/collision/src/Contracts/Provider.php', + 'NunoMaduro\\Collision\\Contracts\\SolutionsRepository' => $vendorDir . '/nunomaduro/collision/src/Contracts/SolutionsRepository.php', + 'NunoMaduro\\Collision\\Contracts\\Writer' => $vendorDir . '/nunomaduro/collision/src/Contracts/Writer.php', + 'NunoMaduro\\Collision\\Exceptions\\ShouldNotHappen' => $vendorDir . '/nunomaduro/collision/src/Exceptions/ShouldNotHappen.php', + 'NunoMaduro\\Collision\\Handler' => $vendorDir . '/nunomaduro/collision/src/Handler.php', + 'NunoMaduro\\Collision\\Highlighter' => $vendorDir . '/nunomaduro/collision/src/Highlighter.php', + 'NunoMaduro\\Collision\\Provider' => $vendorDir . '/nunomaduro/collision/src/Provider.php', + 'NunoMaduro\\Collision\\SolutionsRepositories\\NullSolutionsRepository' => $vendorDir . '/nunomaduro/collision/src/SolutionsRepositories/NullSolutionsRepository.php', + 'NunoMaduro\\Collision\\Writer' => $vendorDir . '/nunomaduro/collision/src/Writer.php', + 'Opis\\Closure\\Analyzer' => $vendorDir . '/opis/closure/src/Analyzer.php', + 'Opis\\Closure\\ClosureContext' => $vendorDir . '/opis/closure/src/ClosureContext.php', + 'Opis\\Closure\\ClosureScope' => $vendorDir . '/opis/closure/src/ClosureScope.php', + 'Opis\\Closure\\ClosureStream' => $vendorDir . '/opis/closure/src/ClosureStream.php', + 'Opis\\Closure\\ISecurityProvider' => $vendorDir . '/opis/closure/src/ISecurityProvider.php', + 'Opis\\Closure\\ReflectionClosure' => $vendorDir . '/opis/closure/src/ReflectionClosure.php', + 'Opis\\Closure\\SecurityException' => $vendorDir . '/opis/closure/src/SecurityException.php', + 'Opis\\Closure\\SecurityProvider' => $vendorDir . '/opis/closure/src/SecurityProvider.php', + 'Opis\\Closure\\SelfReference' => $vendorDir . '/opis/closure/src/SelfReference.php', + 'Opis\\Closure\\SerializableClosure' => $vendorDir . '/opis/closure/src/SerializableClosure.php', + 'OrganizeSeeder' => $baseDir . '/database/seeds/OrganizeSeeder.php', + 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', + 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', + 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit\\Framework\\Constraint\\Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit\\Framework\\Constraint\\Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', + 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', + 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', + 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', + 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', + 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', + 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', + 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', + 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', + 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', + 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', + 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', + 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', + 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', + 'PHPUnit\\Framework\\Error\\Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit\\Framework\\Error\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Error.php', + 'PHPUnit\\Framework\\Error\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit\\Framework\\Error\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', + 'PHPUnit\\Framework\\ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', + 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit\\Framework\\IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', + 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', + 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', + 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', + 'PHPUnit\\Framework\\InvalidParameterGroupException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', + 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', + 'PHPUnit\\Framework\\MockObject\\Api' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', + 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', + 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', + 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', + 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', + 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', + 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', + 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', + 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit\\Framework\\MockObject\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', + 'PHPUnit\\Framework\\MockObject\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', + 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', + 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', + 'PHPUnit\\Framework\\MockObject\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', + 'PHPUnit\\Framework\\MockObject\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', + 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', + 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', + 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', + 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', + 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', + 'PHPUnit\\Framework\\PHPTAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', + 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', + 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit\\Framework\\SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit\\Framework\\SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', + 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', + 'PHPUnit\\Framework\\SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', + 'PHPUnit\\Framework\\SyntheticSkippedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', + 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', + 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit\\Framework\\TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', + 'PHPUnit\\Framework\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', + 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', + 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Warning.php', + 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', + 'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', + 'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', + 'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', + 'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', + 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', + 'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', + 'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', + 'PHPUnit\\Runner\\AfterTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', + 'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', + 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', + 'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', + 'PHPUnit\\Runner\\DefaultTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', + 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', + 'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php', + 'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', + 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', + 'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', + 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', + 'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', + 'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResultCache.php', + 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', + 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception.php', + 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', + 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', + 'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php', + 'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', + 'PHPUnit\\Util\\Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit\\Util\\ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', + 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', + 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php', + 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit\\Util\\InvalidDataSetException' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', + 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', + 'PHPUnit\\Util\\Log\\JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit\\Util\\Log\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php', + 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', + 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', + 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', + 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', + 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', + 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', + 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', + 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', + 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', + 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', + 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Util' => $vendorDir . '/phpunit/php-token-stream/src/Token/Util.php', + 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PermissionSeeder' => $baseDir . '/database/seeds/PermissionSeeder.php', + 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', + 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', + 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', + 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', + 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', + 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', + 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', + 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', + 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', + 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', + 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', + 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', + 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', + 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', + 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', + 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', + 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', + 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', + 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', + 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', + 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', + 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', + 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', + 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', + 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', + 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', + 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', + 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', + 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', + 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', + 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', + 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', + 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', + 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', + 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', + 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', + 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', + 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', + 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', + 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', + 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', + 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', + 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', + 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', + 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', + 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', + 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', + 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', + 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', + 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', + 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', + 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', + 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', + 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', + 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', + 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', + 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', + 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', + 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', + 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', + 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', + 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', + 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', + 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', + 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', + 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', + 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Calculation' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Category' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Database' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\DateTime' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Engine\\CyclicReferenceStack' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Engine\\Logger' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Engineering' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Exception' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\ExceptionHandler' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Financial' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\FormulaParser' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\FormulaToken' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Functions' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Logical' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\LookupRef' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\MathTrig' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Statistical' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\TextData' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Token\\Stack' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\AdvancedValueBinder' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AdvancedValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\Cell' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DataType' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DataValidation' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DataValidator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DefaultValueBinder' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\Hyperlink' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\IValueBinder' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\StringValueBinder' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/StringValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Axis' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Chart' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\DataSeries' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\DataSeriesValues' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Exception' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\GridLines' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/GridLines.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Layout' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Legend' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\PlotArea' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Properties' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Renderer\\IRenderer' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Renderer\\JpGraph' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Title' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php', + 'PhpOffice\\PhpSpreadsheet\\Collection\\Cells' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php', + 'PhpOffice\\PhpSpreadsheet\\Collection\\CellsFactory' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php', + 'PhpOffice\\PhpSpreadsheet\\Collection\\Memory' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php', + 'PhpOffice\\PhpSpreadsheet\\Comment' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php', + 'PhpOffice\\PhpSpreadsheet\\DocumentGenerator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DocumentGenerator.php', + 'PhpOffice\\PhpSpreadsheet\\Document\\Properties' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Document\\Security' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php', + 'PhpOffice\\PhpSpreadsheet\\Exception' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\HashTable' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/HashTable.php', + 'PhpOffice\\PhpSpreadsheet\\Helper\\Html' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php', + 'PhpOffice\\PhpSpreadsheet\\Helper\\Sample' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php', + 'PhpOffice\\PhpSpreadsheet\\IComparable' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php', + 'PhpOffice\\PhpSpreadsheet\\IOFactory' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php', + 'PhpOffice\\PhpSpreadsheet\\NamedRange' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\BaseReader' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Csv' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\DefaultReadFilter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Exception' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Gnumeric' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Html' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\IReadFilter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\IReader' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReader.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Ods' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Ods\\Properties' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Security\\XmlScanner' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Slk' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color\\BIFF5' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color\\BIFF8' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color\\BuiltIn' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\ErrorCode' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Escher' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\MD5' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\RC4' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Style\\Border' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Style\\FillPattern' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\AutoFilter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\BaseParserClass' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Chart' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\ColumnAndRowAttributes' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\ConditionalStyles' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\DataValidations' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Hyperlinks' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\PageSetup' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Properties' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\SheetViewOptions' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\SheetViews' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Styles' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Theme' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xml' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php', + 'PhpOffice\\PhpSpreadsheet\\ReferenceHelper' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\ITextElement' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\RichText' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/RichText.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\Run' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\TextElement' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php', + 'PhpOffice\\PhpSpreadsheet\\Settings' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\CodePage' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Date' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Drawing' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DgContainer' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DgContainer\\SpgrContainer' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DgContainer\\SpgrContainer\\SpContainer' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\\BstoreContainer' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\\BstoreContainer\\BSE' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\\BstoreContainer\\BSE\\Blip' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\File' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Font' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\CholeskyDecomposition' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CholeskyDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\EigenvalueDecomposition' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\LUDecomposition' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\Matrix' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\QRDecomposition' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/QRDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\SingularValueDecomposition' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLERead' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\ChainedBlockStream' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS\\File' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS\\Root' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\PasswordHasher' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\StringHelper' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\TimeZone' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\BestFit' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\ExponentialBestFit' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\LinearBestFit' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\LogarithmicBestFit' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\PolynomialBestFit' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\PowerBestFit' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\Trend' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\XMLWriter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Xls' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php', + 'PhpOffice\\PhpSpreadsheet\\Spreadsheet' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Alignment' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Border' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Borders' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Color' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Conditional' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Fill' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Font' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\NumberFormat' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Protection' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Style' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Supervisor' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter\\Column' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter\\Column\\Rule' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\BaseDrawing' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\CellIterator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Column' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\ColumnCellIterator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\ColumnDimension' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\ColumnIterator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Dimension' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Drawing' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Drawing\\Shadow' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\HeaderFooter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\HeaderFooterDrawing' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Iterator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\MemoryDrawing' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\PageMargins' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\PageSetup' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Protection' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Row' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\RowCellIterator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\RowDimension' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\RowIterator' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\SheetView' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Worksheet' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\BaseWriter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Csv' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Exception' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Html' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\IWriter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Cell\\Comment' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Content' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Meta' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\MetaInf' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Mimetype' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Settings' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Styles' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Thumbnails' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\WriterPart' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/WriterPart.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\Dompdf' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\Mpdf' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\Tcpdf' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\BIFFwriter' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Escher' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Font' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Parser' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Workbook' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Worksheet' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Xf' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Chart' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Comments' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\ContentTypes' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\DocProps' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Drawing' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Rels' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\RelsRibbon' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\RelsVBA' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\StringTable' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Style' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Theme' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Workbook' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Worksheet' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\WriterPart' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Xlfn' => $vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php', + 'PhpOption\\LazyOption' => $vendorDir . '/phpoption/phpoption/src/PhpOption/LazyOption.php', + 'PhpOption\\None' => $vendorDir . '/phpoption/phpoption/src/PhpOption/None.php', + 'PhpOption\\Option' => $vendorDir . '/phpoption/phpoption/src/PhpOption/Option.php', + 'PhpOption\\Some' => $vendorDir . '/phpoption/phpoption/src/PhpOption/Some.php', + 'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', + 'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', + 'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', + 'PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', + 'PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', + 'PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', + 'PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', + 'PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', + 'PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', + 'PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', + 'PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', + 'PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', + 'PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', + 'PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', + 'PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', + 'PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', + 'PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php', + 'PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', + 'PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', + 'PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', + 'PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php', + 'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', + 'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', + 'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', + 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', + 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', + 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', + 'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', + 'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', + 'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', + 'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', + 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulatorInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulatorInterface.php', + 'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', + 'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', + 'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', + 'PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', + 'PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', + 'PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', + 'PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', + 'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', + 'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', + 'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', + 'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', + 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', + 'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', + 'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', + 'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', + 'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', + 'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', + 'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', + 'PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', + 'PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', + 'PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', + 'PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', + 'PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', + 'PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', + 'PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', + 'PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', + 'PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', + 'PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', + 'PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', + 'PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', + 'PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', + 'PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', + 'PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', + 'PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', + 'PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', + 'PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', + 'PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', + 'PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', + 'PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', + 'PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', + 'PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', + 'PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', + 'PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', + 'PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', + 'PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', + 'PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', + 'PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', + 'PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', + 'PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', + 'PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', + 'PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', + 'PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', + 'PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', + 'PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', + 'PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', + 'PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', + 'PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', + 'PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', + 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', + 'PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', + 'PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', + 'PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', + 'PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', + 'PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', + 'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', + 'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', + 'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', + 'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', + 'PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', + 'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', + 'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', + 'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', + 'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', + 'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', + 'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', + 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', + 'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', + 'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', + 'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', + 'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', + 'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', + 'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', + 'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', + 'PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', + 'PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', + 'PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', + 'PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', + 'PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', + 'PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', + 'PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', + 'PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', + 'PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', + 'PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', + 'PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', + 'PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', + 'PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', + 'PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', + 'PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', + 'PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', + 'PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', + 'PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', + 'PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', + 'PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', + 'PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', + 'PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', + 'PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', + 'PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', + 'PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', + 'PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', + 'PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', + 'PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', + 'PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', + 'PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', + 'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', + 'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', + 'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', + 'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', + 'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', + 'PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', + 'PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', + 'PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', + 'PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', + 'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', + 'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', + 'PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', + 'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', + 'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', + 'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', + 'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', + 'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', + 'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', + 'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', + 'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', + 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', + 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', + 'Prettus\\Repository\\Contracts\\CacheableInterface' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/CacheableInterface.php', + 'Prettus\\Repository\\Contracts\\CriteriaInterface' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/CriteriaInterface.php', + 'Prettus\\Repository\\Contracts\\Presentable' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/Presentable.php', + 'Prettus\\Repository\\Contracts\\PresenterInterface' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/PresenterInterface.php', + 'Prettus\\Repository\\Contracts\\RepositoryCriteriaInterface' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/RepositoryCriteriaInterface.php', + 'Prettus\\Repository\\Contracts\\RepositoryInterface' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/RepositoryInterface.php', + 'Prettus\\Repository\\Contracts\\Transformable' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Contracts/Transformable.php', + 'Prettus\\Repository\\Criteria\\RequestCriteria' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Criteria/RequestCriteria.php', + 'Prettus\\Repository\\Eloquent\\BaseRepository' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Eloquent/BaseRepository.php', + 'Prettus\\Repository\\Events\\RepositoryEntityCreated' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityCreated.php', + 'Prettus\\Repository\\Events\\RepositoryEntityDeleted' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityDeleted.php', + 'Prettus\\Repository\\Events\\RepositoryEntityUpdated' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityUpdated.php', + 'Prettus\\Repository\\Events\\RepositoryEventBase' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEventBase.php', + 'Prettus\\Repository\\Exceptions\\RepositoryException' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Exceptions/RepositoryException.php', + 'Prettus\\Repository\\Generators\\ApiControllerGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/ApiControllerGenerator.php', + 'Prettus\\Repository\\Generators\\ApiRepositoryEloquentGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/ApiRepositoryEloquentGenerator.php', + 'Prettus\\Repository\\Generators\\BindingsGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/BindingsGenerator.php', + 'Prettus\\Repository\\Generators\\Commands\\ApiControllerCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ApiControllerCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\ApiRepositoryCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ApiRepositoryCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\BindingsCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/BindingsCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\ControllerCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ControllerCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\CriteriaCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/CriteriaCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\EntityCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/EntityCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\PresenterCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/PresenterCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\RepositoryCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/RepositoryCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\TransformerCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/TransformerCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\ValidatorCommand' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ValidatorCommand.php', + 'Prettus\\Repository\\Generators\\ControllerGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/ControllerGenerator.php', + 'Prettus\\Repository\\Generators\\CriteriaGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/CriteriaGenerator.php', + 'Prettus\\Repository\\Generators\\FileAlreadyExistsException' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/FileAlreadyExistsException.php', + 'Prettus\\Repository\\Generators\\Generator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Generator.php', + 'Prettus\\Repository\\Generators\\MigrationGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/MigrationGenerator.php', + 'Prettus\\Repository\\Generators\\Migrations\\NameParser' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/NameParser.php', + 'Prettus\\Repository\\Generators\\Migrations\\RulesParser' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/RulesParser.php', + 'Prettus\\Repository\\Generators\\Migrations\\SchemaParser' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/SchemaParser.php', + 'Prettus\\Repository\\Generators\\ModelGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/ModelGenerator.php', + 'Prettus\\Repository\\Generators\\PresenterGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/PresenterGenerator.php', + 'Prettus\\Repository\\Generators\\RepositoryEloquentGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/RepositoryEloquentGenerator.php', + 'Prettus\\Repository\\Generators\\RepositoryInterfaceGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/RepositoryInterfaceGenerator.php', + 'Prettus\\Repository\\Generators\\Stub' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/Stub.php', + 'Prettus\\Repository\\Generators\\TransformerGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/TransformerGenerator.php', + 'Prettus\\Repository\\Generators\\ValidatorGenerator' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Generators/ValidatorGenerator.php', + 'Prettus\\Repository\\Helpers\\CacheKeys' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Helpers/CacheKeys.php', + 'Prettus\\Repository\\Listeners\\CleanCacheRepository' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Listeners/CleanCacheRepository.php', + 'Prettus\\Repository\\Presenter\\FractalPresenter' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Presenter/FractalPresenter.php', + 'Prettus\\Repository\\Presenter\\ModelFractalPresenter' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Presenter/ModelFractalPresenter.php', + 'Prettus\\Repository\\Providers\\EventServiceProvider' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Providers/EventServiceProvider.php', + 'Prettus\\Repository\\Providers\\LumenRepositoryServiceProvider' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Providers/LumenRepositoryServiceProvider.php', + 'Prettus\\Repository\\Providers\\RepositoryServiceProvider' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Providers/RepositoryServiceProvider.php', + 'Prettus\\Repository\\Traits\\CacheableRepository' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Traits/CacheableRepository.php', + 'Prettus\\Repository\\Traits\\ComparesVersionsTrait' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Traits/ComparesVersionsTrait.php', + 'Prettus\\Repository\\Traits\\PresentableTrait' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Traits/PresentableTrait.php', + 'Prettus\\Repository\\Traits\\Respondable' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Traits/Respondable.php', + 'Prettus\\Repository\\Traits\\TransformableTrait' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Traits/TransformableTrait.php', + 'Prettus\\Repository\\Transformer\\ModelTransformer' => $vendorDir . '/prettus/l5-repository/src/Prettus/Repository/Transformer/ModelTransformer.php', + 'Prettus\\Validator\\AbstractValidator' => $vendorDir . '/prettus/laravel-validation/src/Prettus/Validator/AbstractValidator.php', + 'Prettus\\Validator\\Contracts\\ValidatorInterface' => $vendorDir . '/prettus/laravel-validation/src/Prettus/Validator/Contracts/ValidatorInterface.php', + 'Prettus\\Validator\\Exceptions\\ValidatorException' => $vendorDir . '/prettus/laravel-validation/src/Prettus/Validator/Exceptions/ValidatorException.php', + 'Prettus\\Validator\\LaravelValidator' => $vendorDir . '/prettus/laravel-validation/src/Prettus/Validator/LaravelValidator.php', + 'Prophecy\\Argument' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument.php', + 'Prophecy\\Argument\\ArgumentsWildcard' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php', + 'Prophecy\\Argument\\Token\\AnyValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php', + 'Prophecy\\Argument\\Token\\AnyValuesToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php', + 'Prophecy\\Argument\\Token\\ApproximateValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php', + 'Prophecy\\Argument\\Token\\ArrayCountToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php', + 'Prophecy\\Argument\\Token\\ArrayEntryToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php', + 'Prophecy\\Argument\\Token\\ArrayEveryEntryToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php', + 'Prophecy\\Argument\\Token\\CallbackToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php', + 'Prophecy\\Argument\\Token\\ExactValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php', + 'Prophecy\\Argument\\Token\\IdenticalValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php', + 'Prophecy\\Argument\\Token\\LogicalAndToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php', + 'Prophecy\\Argument\\Token\\LogicalNotToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php', + 'Prophecy\\Argument\\Token\\ObjectStateToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php', + 'Prophecy\\Argument\\Token\\StringContainsToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php', + 'Prophecy\\Argument\\Token\\TokenInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php', + 'Prophecy\\Argument\\Token\\TypeToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php', + 'Prophecy\\Call\\Call' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Call/Call.php', + 'Prophecy\\Call\\CallCenter' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Call/CallCenter.php', + 'Prophecy\\Comparator\\ClosureComparator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php', + 'Prophecy\\Comparator\\Factory' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/Factory.php', + 'Prophecy\\Comparator\\ProphecyComparator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php', + 'Prophecy\\Doubler\\CachedDoubler' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php', + 'Prophecy\\Doubler\\ClassPatch\\ClassPatchInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php', + 'Prophecy\\Doubler\\ClassPatch\\DisableConstructorPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\HhvmExceptionPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\KeywordPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\MagicCallPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ProphecySubjectPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ReflectionClassNewInstancePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\SplFileInfoPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ThrowablePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\TraversablePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php', + 'Prophecy\\Doubler\\DoubleInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php', + 'Prophecy\\Doubler\\Doubler' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php', + 'Prophecy\\Doubler\\Generator\\ClassCodeGenerator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php', + 'Prophecy\\Doubler\\Generator\\ClassCreator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php', + 'Prophecy\\Doubler\\Generator\\ClassMirror' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php', + 'Prophecy\\Doubler\\Generator\\Node\\ArgumentNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\ClassNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\MethodNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php', + 'Prophecy\\Doubler\\Generator\\ReflectionInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php', + 'Prophecy\\Doubler\\Generator\\TypeHintReference' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php', + 'Prophecy\\Doubler\\LazyDouble' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php', + 'Prophecy\\Doubler\\NameGenerator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php', + 'Prophecy\\Exception\\Call\\UnexpectedCallException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php', + 'Prophecy\\Exception\\Doubler\\ClassCreatorException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php', + 'Prophecy\\Exception\\Doubler\\ClassMirrorException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php', + 'Prophecy\\Exception\\Doubler\\ClassNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\DoubleException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php', + 'Prophecy\\Exception\\Doubler\\DoublerException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php', + 'Prophecy\\Exception\\Doubler\\InterfaceNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotExtendableException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\ReturnByReferenceException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php', + 'Prophecy\\Exception\\Exception' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Exception.php', + 'Prophecy\\Exception\\InvalidArgumentException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php', + 'Prophecy\\Exception\\Prediction\\AggregateException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php', + 'Prophecy\\Exception\\Prediction\\FailedPredictionException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php', + 'Prophecy\\Exception\\Prediction\\NoCallsException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php', + 'Prophecy\\Exception\\Prediction\\PredictionException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsCountException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php', + 'Prophecy\\Exception\\Prophecy\\MethodProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ObjectProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php', + 'Prophecy\\PhpDocumentor\\ClassAndInterfaceTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php', + 'Prophecy\\PhpDocumentor\\ClassTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\LegacyClassTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\MethodTagRetrieverInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php', + 'Prophecy\\Prediction\\CallPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php', + 'Prophecy\\Prediction\\CallTimesPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php', + 'Prophecy\\Prediction\\CallbackPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php', + 'Prophecy\\Prediction\\NoCallsPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php', + 'Prophecy\\Prediction\\PredictionInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php', + 'Prophecy\\Promise\\CallbackPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php', + 'Prophecy\\Promise\\PromiseInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php', + 'Prophecy\\Promise\\ReturnArgumentPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php', + 'Prophecy\\Promise\\ReturnPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php', + 'Prophecy\\Promise\\ThrowPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php', + 'Prophecy\\Prophecy\\MethodProphecy' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php', + 'Prophecy\\Prophecy\\ObjectProphecy' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php', + 'Prophecy\\Prophecy\\ProphecyInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php', + 'Prophecy\\Prophecy\\ProphecySubjectInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php', + 'Prophecy\\Prophecy\\Revealer' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php', + 'Prophecy\\Prophecy\\RevealerInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php', + 'Prophecy\\Prophet' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophet.php', + 'Prophecy\\Util\\ExportUtil' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php', + 'Prophecy\\Util\\StringUtil' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Util/StringUtil.php', + 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', + 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', + 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', + 'Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php', + 'Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php', + 'Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php', + 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', + 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', + 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', + 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', + 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', + 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', + 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', + 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', + 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', + 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', + 'Psy\\CodeCleaner' => $vendorDir . '/psy/psysh/src/CodeCleaner.php', + 'Psy\\CodeCleaner\\AbstractClassPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/AbstractClassPass.php', + 'Psy\\CodeCleaner\\AssignThisVariablePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/AssignThisVariablePass.php', + 'Psy\\CodeCleaner\\CallTimePassByReferencePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/CallTimePassByReferencePass.php', + 'Psy\\CodeCleaner\\CalledClassPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/CalledClassPass.php', + 'Psy\\CodeCleaner\\CodeCleanerPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/CodeCleanerPass.php', + 'Psy\\CodeCleaner\\EmptyArrayDimFetchPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php', + 'Psy\\CodeCleaner\\ExitPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ExitPass.php', + 'Psy\\CodeCleaner\\FinalClassPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/FinalClassPass.php', + 'Psy\\CodeCleaner\\FunctionContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/FunctionContextPass.php', + 'Psy\\CodeCleaner\\FunctionReturnInWriteContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.php', + 'Psy\\CodeCleaner\\ImplicitReturnPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php', + 'Psy\\CodeCleaner\\InstanceOfPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/InstanceOfPass.php', + 'Psy\\CodeCleaner\\LabelContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/LabelContextPass.php', + 'Psy\\CodeCleaner\\LeavePsyshAlonePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/LeavePsyshAlonePass.php', + 'Psy\\CodeCleaner\\ListPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ListPass.php', + 'Psy\\CodeCleaner\\LoopContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/LoopContextPass.php', + 'Psy\\CodeCleaner\\MagicConstantsPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/MagicConstantsPass.php', + 'Psy\\CodeCleaner\\NamespaceAwarePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/NamespaceAwarePass.php', + 'Psy\\CodeCleaner\\NamespacePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/NamespacePass.php', + 'Psy\\CodeCleaner\\NoReturnValue' => $vendorDir . '/psy/psysh/src/CodeCleaner/NoReturnValue.php', + 'Psy\\CodeCleaner\\PassableByReferencePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/PassableByReferencePass.php', + 'Psy\\CodeCleaner\\RequirePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/RequirePass.php', + 'Psy\\CodeCleaner\\ReturnTypePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ReturnTypePass.php', + 'Psy\\CodeCleaner\\StrictTypesPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/StrictTypesPass.php', + 'Psy\\CodeCleaner\\UseStatementPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/UseStatementPass.php', + 'Psy\\CodeCleaner\\ValidClassNamePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidClassNamePass.php', + 'Psy\\CodeCleaner\\ValidConstantPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidConstantPass.php', + 'Psy\\CodeCleaner\\ValidConstructorPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidConstructorPass.php', + 'Psy\\CodeCleaner\\ValidFunctionNamePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidFunctionNamePass.php', + 'Psy\\Command\\BufferCommand' => $vendorDir . '/psy/psysh/src/Command/BufferCommand.php', + 'Psy\\Command\\ClearCommand' => $vendorDir . '/psy/psysh/src/Command/ClearCommand.php', + 'Psy\\Command\\Command' => $vendorDir . '/psy/psysh/src/Command/Command.php', + 'Psy\\Command\\DocCommand' => $vendorDir . '/psy/psysh/src/Command/DocCommand.php', + 'Psy\\Command\\DumpCommand' => $vendorDir . '/psy/psysh/src/Command/DumpCommand.php', + 'Psy\\Command\\EditCommand' => $vendorDir . '/psy/psysh/src/Command/EditCommand.php', + 'Psy\\Command\\ExitCommand' => $vendorDir . '/psy/psysh/src/Command/ExitCommand.php', + 'Psy\\Command\\HelpCommand' => $vendorDir . '/psy/psysh/src/Command/HelpCommand.php', + 'Psy\\Command\\HistoryCommand' => $vendorDir . '/psy/psysh/src/Command/HistoryCommand.php', + 'Psy\\Command\\ListCommand' => $vendorDir . '/psy/psysh/src/Command/ListCommand.php', + 'Psy\\Command\\ListCommand\\ClassConstantEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/ClassConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\ClassEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/ClassEnumerator.php', + 'Psy\\Command\\ListCommand\\ConstantEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/ConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\Enumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/Enumerator.php', + 'Psy\\Command\\ListCommand\\FunctionEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/FunctionEnumerator.php', + 'Psy\\Command\\ListCommand\\GlobalVariableEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/GlobalVariableEnumerator.php', + 'Psy\\Command\\ListCommand\\MethodEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/MethodEnumerator.php', + 'Psy\\Command\\ListCommand\\PropertyEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/PropertyEnumerator.php', + 'Psy\\Command\\ListCommand\\VariableEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/VariableEnumerator.php', + 'Psy\\Command\\ParseCommand' => $vendorDir . '/psy/psysh/src/Command/ParseCommand.php', + 'Psy\\Command\\PsyVersionCommand' => $vendorDir . '/psy/psysh/src/Command/PsyVersionCommand.php', + 'Psy\\Command\\ReflectingCommand' => $vendorDir . '/psy/psysh/src/Command/ReflectingCommand.php', + 'Psy\\Command\\ShowCommand' => $vendorDir . '/psy/psysh/src/Command/ShowCommand.php', + 'Psy\\Command\\SudoCommand' => $vendorDir . '/psy/psysh/src/Command/SudoCommand.php', + 'Psy\\Command\\ThrowUpCommand' => $vendorDir . '/psy/psysh/src/Command/ThrowUpCommand.php', + 'Psy\\Command\\TimeitCommand' => $vendorDir . '/psy/psysh/src/Command/TimeitCommand.php', + 'Psy\\Command\\TimeitCommand\\TimeitVisitor' => $vendorDir . '/psy/psysh/src/Command/TimeitCommand/TimeitVisitor.php', + 'Psy\\Command\\TraceCommand' => $vendorDir . '/psy/psysh/src/Command/TraceCommand.php', + 'Psy\\Command\\WhereamiCommand' => $vendorDir . '/psy/psysh/src/Command/WhereamiCommand.php', + 'Psy\\Command\\WtfCommand' => $vendorDir . '/psy/psysh/src/Command/WtfCommand.php', + 'Psy\\ConfigPaths' => $vendorDir . '/psy/psysh/src/ConfigPaths.php', + 'Psy\\Configuration' => $vendorDir . '/psy/psysh/src/Configuration.php', + 'Psy\\ConsoleColorFactory' => $vendorDir . '/psy/psysh/src/ConsoleColorFactory.php', + 'Psy\\Context' => $vendorDir . '/psy/psysh/src/Context.php', + 'Psy\\ContextAware' => $vendorDir . '/psy/psysh/src/ContextAware.php', + 'Psy\\Exception\\BreakException' => $vendorDir . '/psy/psysh/src/Exception/BreakException.php', + 'Psy\\Exception\\DeprecatedException' => $vendorDir . '/psy/psysh/src/Exception/DeprecatedException.php', + 'Psy\\Exception\\ErrorException' => $vendorDir . '/psy/psysh/src/Exception/ErrorException.php', + 'Psy\\Exception\\Exception' => $vendorDir . '/psy/psysh/src/Exception/Exception.php', + 'Psy\\Exception\\FatalErrorException' => $vendorDir . '/psy/psysh/src/Exception/FatalErrorException.php', + 'Psy\\Exception\\ParseErrorException' => $vendorDir . '/psy/psysh/src/Exception/ParseErrorException.php', + 'Psy\\Exception\\RuntimeException' => $vendorDir . '/psy/psysh/src/Exception/RuntimeException.php', + 'Psy\\Exception\\ThrowUpException' => $vendorDir . '/psy/psysh/src/Exception/ThrowUpException.php', + 'Psy\\Exception\\TypeErrorException' => $vendorDir . '/psy/psysh/src/Exception/TypeErrorException.php', + 'Psy\\Exception\\UnexpectedTargetException' => $vendorDir . '/psy/psysh/src/Exception/UnexpectedTargetException.php', + 'Psy\\ExecutionClosure' => $vendorDir . '/psy/psysh/src/ExecutionClosure.php', + 'Psy\\ExecutionLoopClosure' => $vendorDir . '/psy/psysh/src/ExecutionLoopClosure.php', + 'Psy\\ExecutionLoop\\AbstractListener' => $vendorDir . '/psy/psysh/src/ExecutionLoop/AbstractListener.php', + 'Psy\\ExecutionLoop\\Listener' => $vendorDir . '/psy/psysh/src/ExecutionLoop/Listener.php', + 'Psy\\ExecutionLoop\\ProcessForker' => $vendorDir . '/psy/psysh/src/ExecutionLoop/ProcessForker.php', + 'Psy\\ExecutionLoop\\RunkitReloader' => $vendorDir . '/psy/psysh/src/ExecutionLoop/RunkitReloader.php', + 'Psy\\Formatter\\CodeFormatter' => $vendorDir . '/psy/psysh/src/Formatter/CodeFormatter.php', + 'Psy\\Formatter\\DocblockFormatter' => $vendorDir . '/psy/psysh/src/Formatter/DocblockFormatter.php', + 'Psy\\Formatter\\Formatter' => $vendorDir . '/psy/psysh/src/Formatter/Formatter.php', + 'Psy\\Formatter\\ReflectorFormatter' => $vendorDir . '/psy/psysh/src/Formatter/ReflectorFormatter.php', + 'Psy\\Formatter\\SignatureFormatter' => $vendorDir . '/psy/psysh/src/Formatter/SignatureFormatter.php', + 'Psy\\Formatter\\TraceFormatter' => $vendorDir . '/psy/psysh/src/Formatter/TraceFormatter.php', + 'Psy\\Input\\CodeArgument' => $vendorDir . '/psy/psysh/src/Input/CodeArgument.php', + 'Psy\\Input\\FilterOptions' => $vendorDir . '/psy/psysh/src/Input/FilterOptions.php', + 'Psy\\Input\\ShellInput' => $vendorDir . '/psy/psysh/src/Input/ShellInput.php', + 'Psy\\Input\\SilentInput' => $vendorDir . '/psy/psysh/src/Input/SilentInput.php', + 'Psy\\Output\\OutputPager' => $vendorDir . '/psy/psysh/src/Output/OutputPager.php', + 'Psy\\Output\\PassthruPager' => $vendorDir . '/psy/psysh/src/Output/PassthruPager.php', + 'Psy\\Output\\ProcOutputPager' => $vendorDir . '/psy/psysh/src/Output/ProcOutputPager.php', + 'Psy\\Output\\ShellOutput' => $vendorDir . '/psy/psysh/src/Output/ShellOutput.php', + 'Psy\\ParserFactory' => $vendorDir . '/psy/psysh/src/ParserFactory.php', + 'Psy\\Readline\\GNUReadline' => $vendorDir . '/psy/psysh/src/Readline/GNUReadline.php', + 'Psy\\Readline\\HoaConsole' => $vendorDir . '/psy/psysh/src/Readline/HoaConsole.php', + 'Psy\\Readline\\Libedit' => $vendorDir . '/psy/psysh/src/Readline/Libedit.php', + 'Psy\\Readline\\Readline' => $vendorDir . '/psy/psysh/src/Readline/Readline.php', + 'Psy\\Readline\\Transient' => $vendorDir . '/psy/psysh/src/Readline/Transient.php', + 'Psy\\Reflection\\ReflectionClassConstant' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionClassConstant.php', + 'Psy\\Reflection\\ReflectionConstant' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionConstant.php', + 'Psy\\Reflection\\ReflectionConstant_' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionConstant_.php', + 'Psy\\Reflection\\ReflectionLanguageConstruct' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionLanguageConstruct.php', + 'Psy\\Reflection\\ReflectionLanguageConstructParameter' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionLanguageConstructParameter.php', + 'Psy\\Reflection\\ReflectionNamespace' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionNamespace.php', + 'Psy\\Shell' => $vendorDir . '/psy/psysh/src/Shell.php', + 'Psy\\Sudo' => $vendorDir . '/psy/psysh/src/Sudo.php', + 'Psy\\Sudo\\SudoVisitor' => $vendorDir . '/psy/psysh/src/Sudo/SudoVisitor.php', + 'Psy\\TabCompletion\\AutoCompleter' => $vendorDir . '/psy/psysh/src/TabCompletion/AutoCompleter.php', + 'Psy\\TabCompletion\\Matcher\\AbstractContextAwareMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/AbstractMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassAttributesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassNamesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassNamesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\CommandsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/CommandsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ConstantsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ConstantsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/FunctionsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\KeywordsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/KeywordsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoClientMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/MongoClientMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoDatabaseMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectAttributesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\VariablesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/VariablesMatcher.php', + 'Psy\\Util\\Docblock' => $vendorDir . '/psy/psysh/src/Util/Docblock.php', + 'Psy\\Util\\Json' => $vendorDir . '/psy/psysh/src/Util/Json.php', + 'Psy\\Util\\Mirror' => $vendorDir . '/psy/psysh/src/Util/Mirror.php', + 'Psy\\Util\\Str' => $vendorDir . '/psy/psysh/src/Util/Str.php', + 'Psy\\VarDumper\\Cloner' => $vendorDir . '/psy/psysh/src/VarDumper/Cloner.php', + 'Psy\\VarDumper\\Dumper' => $vendorDir . '/psy/psysh/src/VarDumper/Dumper.php', + 'Psy\\VarDumper\\Presenter' => $vendorDir . '/psy/psysh/src/VarDumper/Presenter.php', + 'Psy\\VarDumper\\PresenterAware' => $vendorDir . '/psy/psysh/src/VarDumper/PresenterAware.php', + 'Psy\\VersionUpdater\\Checker' => $vendorDir . '/psy/psysh/src/VersionUpdater/Checker.php', + 'Psy\\VersionUpdater\\GitHubChecker' => $vendorDir . '/psy/psysh/src/VersionUpdater/GitHubChecker.php', + 'Psy\\VersionUpdater\\IntervalChecker' => $vendorDir . '/psy/psysh/src/VersionUpdater/IntervalChecker.php', + 'Psy\\VersionUpdater\\NoopChecker' => $vendorDir . '/psy/psysh/src/VersionUpdater/NoopChecker.php', + 'Ramsey\\Collection\\AbstractArray' => $vendorDir . '/ramsey/collection/src/AbstractArray.php', + 'Ramsey\\Collection\\AbstractCollection' => $vendorDir . '/ramsey/collection/src/AbstractCollection.php', + 'Ramsey\\Collection\\AbstractSet' => $vendorDir . '/ramsey/collection/src/AbstractSet.php', + 'Ramsey\\Collection\\ArrayInterface' => $vendorDir . '/ramsey/collection/src/ArrayInterface.php', + 'Ramsey\\Collection\\Collection' => $vendorDir . '/ramsey/collection/src/Collection.php', + 'Ramsey\\Collection\\CollectionInterface' => $vendorDir . '/ramsey/collection/src/CollectionInterface.php', + 'Ramsey\\Collection\\DoubleEndedQueue' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueue.php', + 'Ramsey\\Collection\\DoubleEndedQueueInterface' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueueInterface.php', + 'Ramsey\\Collection\\Exception\\CollectionMismatchException' => $vendorDir . '/ramsey/collection/src/Exception/CollectionMismatchException.php', + 'Ramsey\\Collection\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/collection/src/Exception/InvalidArgumentException.php', + 'Ramsey\\Collection\\Exception\\InvalidSortOrderException' => $vendorDir . '/ramsey/collection/src/Exception/InvalidSortOrderException.php', + 'Ramsey\\Collection\\Exception\\NoSuchElementException' => $vendorDir . '/ramsey/collection/src/Exception/NoSuchElementException.php', + 'Ramsey\\Collection\\Exception\\OutOfBoundsException' => $vendorDir . '/ramsey/collection/src/Exception/OutOfBoundsException.php', + 'Ramsey\\Collection\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/collection/src/Exception/UnsupportedOperationException.php', + 'Ramsey\\Collection\\Exception\\ValueExtractionException' => $vendorDir . '/ramsey/collection/src/Exception/ValueExtractionException.php', + 'Ramsey\\Collection\\GenericArray' => $vendorDir . '/ramsey/collection/src/GenericArray.php', + 'Ramsey\\Collection\\Map\\AbstractMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractMap.php', + 'Ramsey\\Collection\\Map\\AbstractTypedMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractTypedMap.php', + 'Ramsey\\Collection\\Map\\AssociativeArrayMap' => $vendorDir . '/ramsey/collection/src/Map/AssociativeArrayMap.php', + 'Ramsey\\Collection\\Map\\MapInterface' => $vendorDir . '/ramsey/collection/src/Map/MapInterface.php', + 'Ramsey\\Collection\\Map\\NamedParameterMap' => $vendorDir . '/ramsey/collection/src/Map/NamedParameterMap.php', + 'Ramsey\\Collection\\Map\\TypedMap' => $vendorDir . '/ramsey/collection/src/Map/TypedMap.php', + 'Ramsey\\Collection\\Map\\TypedMapInterface' => $vendorDir . '/ramsey/collection/src/Map/TypedMapInterface.php', + 'Ramsey\\Collection\\Queue' => $vendorDir . '/ramsey/collection/src/Queue.php', + 'Ramsey\\Collection\\QueueInterface' => $vendorDir . '/ramsey/collection/src/QueueInterface.php', + 'Ramsey\\Collection\\Set' => $vendorDir . '/ramsey/collection/src/Set.php', + 'Ramsey\\Collection\\Tool\\TypeTrait' => $vendorDir . '/ramsey/collection/src/Tool/TypeTrait.php', + 'Ramsey\\Collection\\Tool\\ValueExtractorTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueExtractorTrait.php', + 'Ramsey\\Collection\\Tool\\ValueToStringTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueToStringTrait.php', + 'Ramsey\\Uuid\\BinaryUtils' => $vendorDir . '/ramsey/uuid/src/BinaryUtils.php', + 'Ramsey\\Uuid\\Builder\\BuilderCollection' => $vendorDir . '/ramsey/uuid/src/Builder/BuilderCollection.php', + 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php', + 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php', + 'Ramsey\\Uuid\\Builder\\FallbackBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/FallbackBuilder.php', + 'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => $vendorDir . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php', + 'Ramsey\\Uuid\\Codec\\CodecInterface' => $vendorDir . '/ramsey/uuid/src/Codec/CodecInterface.php', + 'Ramsey\\Uuid\\Codec\\GuidStringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/GuidStringCodec.php', + 'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => $vendorDir . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php', + 'Ramsey\\Uuid\\Codec\\StringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/StringCodec.php', + 'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php', + 'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php', + 'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/NumberConverterInterface.php', + 'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php', + 'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php', + 'Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php', + 'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/TimeConverterInterface.php', + 'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php', + 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php', + 'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php', + 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php', + 'Ramsey\\Uuid\\DegradedUuid' => $vendorDir . '/ramsey/uuid/src/DegradedUuid.php', + 'Ramsey\\Uuid\\DeprecatedUuidInterface' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidInterface.php', + 'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php', + 'Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => $vendorDir . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php', + 'Ramsey\\Uuid\\Exception\\DateTimeException' => $vendorDir . '/ramsey/uuid/src/Exception/DateTimeException.php', + 'Ramsey\\Uuid\\Exception\\DceSecurityException' => $vendorDir . '/ramsey/uuid/src/Exception/DceSecurityException.php', + 'Ramsey\\Uuid\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidArgumentException.php', + 'Ramsey\\Uuid\\Exception\\InvalidBytesException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidBytesException.php', + 'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php', + 'Ramsey\\Uuid\\Exception\\NameException' => $vendorDir . '/ramsey/uuid/src/Exception/NameException.php', + 'Ramsey\\Uuid\\Exception\\NodeException' => $vendorDir . '/ramsey/uuid/src/Exception/NodeException.php', + 'Ramsey\\Uuid\\Exception\\RandomSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/RandomSourceException.php', + 'Ramsey\\Uuid\\Exception\\TimeSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/TimeSourceException.php', + 'Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => $vendorDir . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php', + 'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php', + 'Ramsey\\Uuid\\FeatureSet' => $vendorDir . '/ramsey/uuid/src/FeatureSet.php', + 'Ramsey\\Uuid\\Fields\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Fields/FieldsInterface.php', + 'Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => $vendorDir . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php', + 'Ramsey\\Uuid\\Generator\\CombGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/CombGenerator.php', + 'Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php', + 'Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php', + 'Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php', + 'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php', + 'Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php', + 'Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php', + 'Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php', + 'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php', + 'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php', + 'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php', + 'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php', + 'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php', + 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => $vendorDir . '/ramsey/uuid/src/Generator/RandomLibAdapter.php', + 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php', + 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php', + 'Ramsey\\Uuid\\Guid\\Fields' => $vendorDir . '/ramsey/uuid/src/Guid/Fields.php', + 'Ramsey\\Uuid\\Guid\\Guid' => $vendorDir . '/ramsey/uuid/src/Guid/Guid.php', + 'Ramsey\\Uuid\\Guid\\GuidBuilder' => $vendorDir . '/ramsey/uuid/src/Guid/GuidBuilder.php', + 'Ramsey\\Uuid\\Math\\BrickMathCalculator' => $vendorDir . '/ramsey/uuid/src/Math/BrickMathCalculator.php', + 'Ramsey\\Uuid\\Math\\CalculatorInterface' => $vendorDir . '/ramsey/uuid/src/Math/CalculatorInterface.php', + 'Ramsey\\Uuid\\Math\\RoundingMode' => $vendorDir . '/ramsey/uuid/src/Math/RoundingMode.php', + 'Ramsey\\Uuid\\Nonstandard\\Fields' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Fields.php', + 'Ramsey\\Uuid\\Nonstandard\\Uuid' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Uuid.php', + 'Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php', + 'Ramsey\\Uuid\\Nonstandard\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidV6.php', + 'Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php', + 'Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php', + 'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/NodeProviderInterface.php', + 'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => $vendorDir . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php', + 'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/TimeProviderInterface.php', + 'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php', + 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php', + 'Ramsey\\Uuid\\Rfc4122\\Fields' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Fields.php', + 'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php', + 'Ramsey\\Uuid\\Rfc4122\\NilTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilTrait.php', + 'Ramsey\\Uuid\\Rfc4122\\NilUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilUuid.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidInterface.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV1' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV1.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV2' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV2.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV3' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV3.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV4' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV4.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV5' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV5.php', + 'Ramsey\\Uuid\\Rfc4122\\Validator' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Validator.php', + 'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VariantTrait.php', + 'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VersionTrait.php', + 'Ramsey\\Uuid\\Type\\Decimal' => $vendorDir . '/ramsey/uuid/src/Type/Decimal.php', + 'Ramsey\\Uuid\\Type\\Hexadecimal' => $vendorDir . '/ramsey/uuid/src/Type/Hexadecimal.php', + 'Ramsey\\Uuid\\Type\\Integer' => $vendorDir . '/ramsey/uuid/src/Type/Integer.php', + 'Ramsey\\Uuid\\Type\\NumberInterface' => $vendorDir . '/ramsey/uuid/src/Type/NumberInterface.php', + 'Ramsey\\Uuid\\Type\\Time' => $vendorDir . '/ramsey/uuid/src/Type/Time.php', + 'Ramsey\\Uuid\\Type\\TypeInterface' => $vendorDir . '/ramsey/uuid/src/Type/TypeInterface.php', + 'Ramsey\\Uuid\\Uuid' => $vendorDir . '/ramsey/uuid/src/Uuid.php', + 'Ramsey\\Uuid\\UuidFactory' => $vendorDir . '/ramsey/uuid/src/UuidFactory.php', + 'Ramsey\\Uuid\\UuidFactoryInterface' => $vendorDir . '/ramsey/uuid/src/UuidFactoryInterface.php', + 'Ramsey\\Uuid\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/UuidInterface.php', + 'Ramsey\\Uuid\\Validator\\GenericValidator' => $vendorDir . '/ramsey/uuid/src/Validator/GenericValidator.php', + 'Ramsey\\Uuid\\Validator\\ValidatorInterface' => $vendorDir . '/ramsey/uuid/src/Validator/ValidatorInterface.php', + 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PCOV.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', + 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', + 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', + 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', + 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', + 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', + 'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', + 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', + 'SebastianBergmann\\CodeCoverage\\Util' => $vendorDir . '/phpunit/php-code-coverage/src/Util.php', + 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', + 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', + 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', + 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', + 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', + 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', + 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', + 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php', + 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\Exception' => $vendorDir . '/sebastian/object-reflector/src/Exception.php', + 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => $vendorDir . '/sebastian/object-reflector/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', + 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', + 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', + 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', + 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', + 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php', + 'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php', + 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', + 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/CallableType.php', + 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', + 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/GenericObjectType.php', + 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/IterableType.php', + 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/NullType.php', + 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/ObjectType.php', + 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', + 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/SimpleType.php', + 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/Type.php', + 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', + 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/UnknownType.php', + 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/VoidType.php', + 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', + 'SignerSeeder' => $baseDir . '/database/seeds/SignerSeeder.php', + 'Spatie\\Permission\\Commands\\CacheReset' => $vendorDir . '/spatie/laravel-permission/src/Commands/CacheReset.php', + 'Spatie\\Permission\\Commands\\CreatePermission' => $vendorDir . '/spatie/laravel-permission/src/Commands/CreatePermission.php', + 'Spatie\\Permission\\Commands\\CreateRole' => $vendorDir . '/spatie/laravel-permission/src/Commands/CreateRole.php', + 'Spatie\\Permission\\Commands\\Show' => $vendorDir . '/spatie/laravel-permission/src/Commands/Show.php', + 'Spatie\\Permission\\Contracts\\Permission' => $vendorDir . '/spatie/laravel-permission/src/Contracts/Permission.php', + 'Spatie\\Permission\\Contracts\\Role' => $vendorDir . '/spatie/laravel-permission/src/Contracts/Role.php', + 'Spatie\\Permission\\Exceptions\\GuardDoesNotMatch' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/GuardDoesNotMatch.php', + 'Spatie\\Permission\\Exceptions\\PermissionAlreadyExists' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/PermissionAlreadyExists.php', + 'Spatie\\Permission\\Exceptions\\PermissionDoesNotExist' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/PermissionDoesNotExist.php', + 'Spatie\\Permission\\Exceptions\\RoleAlreadyExists' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/RoleAlreadyExists.php', + 'Spatie\\Permission\\Exceptions\\RoleDoesNotExist' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/RoleDoesNotExist.php', + 'Spatie\\Permission\\Exceptions\\UnauthorizedException' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/UnauthorizedException.php', + 'Spatie\\Permission\\Exceptions\\WildcardPermissionInvalidArgument' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/WildcardPermissionInvalidArgument.php', + 'Spatie\\Permission\\Exceptions\\WildcardPermissionNotProperlyFormatted' => $vendorDir . '/spatie/laravel-permission/src/Exceptions/WildcardPermissionNotProperlyFormatted.php', + 'Spatie\\Permission\\Guard' => $vendorDir . '/spatie/laravel-permission/src/Guard.php', + 'Spatie\\Permission\\Middlewares\\PermissionMiddleware' => $vendorDir . '/spatie/laravel-permission/src/Middlewares/PermissionMiddleware.php', + 'Spatie\\Permission\\Middlewares\\RoleMiddleware' => $vendorDir . '/spatie/laravel-permission/src/Middlewares/RoleMiddleware.php', + 'Spatie\\Permission\\Middlewares\\RoleOrPermissionMiddleware' => $vendorDir . '/spatie/laravel-permission/src/Middlewares/RoleOrPermissionMiddleware.php', + 'Spatie\\Permission\\Models\\Permission' => $vendorDir . '/spatie/laravel-permission/src/Models/Permission.php', + 'Spatie\\Permission\\Models\\Role' => $vendorDir . '/spatie/laravel-permission/src/Models/Role.php', + 'Spatie\\Permission\\PermissionRegistrar' => $vendorDir . '/spatie/laravel-permission/src/PermissionRegistrar.php', + 'Spatie\\Permission\\PermissionServiceProvider' => $vendorDir . '/spatie/laravel-permission/src/PermissionServiceProvider.php', + 'Spatie\\Permission\\Traits\\HasPermissions' => $vendorDir . '/spatie/laravel-permission/src/Traits/HasPermissions.php', + 'Spatie\\Permission\\Traits\\HasRoles' => $vendorDir . '/spatie/laravel-permission/src/Traits/HasRoles.php', + 'Spatie\\Permission\\Traits\\RefreshesPermissionCache' => $vendorDir . '/spatie/laravel-permission/src/Traits/RefreshesPermissionCache.php', + 'Spatie\\Permission\\WildcardPermission' => $vendorDir . '/spatie/laravel-permission/src/WildcardPermission.php', + 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', + 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', + 'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', + 'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', + 'Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', + 'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', + 'Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', + 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', + 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', + 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', + 'Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php', + 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php', + 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', + 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', + 'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', + 'Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', + 'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', + 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', + 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', + 'Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', + 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', + 'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', + 'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', + 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', + 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', + 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', + 'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', + 'Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', + 'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', + 'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', + 'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', + 'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', + 'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', + 'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', + 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', + 'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', + 'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', + 'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', + 'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', + 'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', + 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', + 'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', + 'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', + 'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', + 'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', + 'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', + 'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', + 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', + 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', + 'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', + 'Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', + 'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', + 'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', + 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', + 'Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', + 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php', + 'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php', + 'Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php', + 'Symfony\\Component\\CssSelector\\CssSelectorConverter' => $vendorDir . '/symfony/css-selector/CssSelectorConverter.php', + 'Symfony\\Component\\CssSelector\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/css-selector/Exception/ExceptionInterface.php', + 'Symfony\\Component\\CssSelector\\Exception\\ExpressionErrorException' => $vendorDir . '/symfony/css-selector/Exception/ExpressionErrorException.php', + 'Symfony\\Component\\CssSelector\\Exception\\InternalErrorException' => $vendorDir . '/symfony/css-selector/Exception/InternalErrorException.php', + 'Symfony\\Component\\CssSelector\\Exception\\ParseException' => $vendorDir . '/symfony/css-selector/Exception/ParseException.php', + 'Symfony\\Component\\CssSelector\\Exception\\SyntaxErrorException' => $vendorDir . '/symfony/css-selector/Exception/SyntaxErrorException.php', + 'Symfony\\Component\\CssSelector\\Node\\AbstractNode' => $vendorDir . '/symfony/css-selector/Node/AbstractNode.php', + 'Symfony\\Component\\CssSelector\\Node\\AttributeNode' => $vendorDir . '/symfony/css-selector/Node/AttributeNode.php', + 'Symfony\\Component\\CssSelector\\Node\\ClassNode' => $vendorDir . '/symfony/css-selector/Node/ClassNode.php', + 'Symfony\\Component\\CssSelector\\Node\\CombinedSelectorNode' => $vendorDir . '/symfony/css-selector/Node/CombinedSelectorNode.php', + 'Symfony\\Component\\CssSelector\\Node\\ElementNode' => $vendorDir . '/symfony/css-selector/Node/ElementNode.php', + 'Symfony\\Component\\CssSelector\\Node\\FunctionNode' => $vendorDir . '/symfony/css-selector/Node/FunctionNode.php', + 'Symfony\\Component\\CssSelector\\Node\\HashNode' => $vendorDir . '/symfony/css-selector/Node/HashNode.php', + 'Symfony\\Component\\CssSelector\\Node\\NegationNode' => $vendorDir . '/symfony/css-selector/Node/NegationNode.php', + 'Symfony\\Component\\CssSelector\\Node\\NodeInterface' => $vendorDir . '/symfony/css-selector/Node/NodeInterface.php', + 'Symfony\\Component\\CssSelector\\Node\\PseudoNode' => $vendorDir . '/symfony/css-selector/Node/PseudoNode.php', + 'Symfony\\Component\\CssSelector\\Node\\SelectorNode' => $vendorDir . '/symfony/css-selector/Node/SelectorNode.php', + 'Symfony\\Component\\CssSelector\\Node\\Specificity' => $vendorDir . '/symfony/css-selector/Node/Specificity.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\CommentHandler' => $vendorDir . '/symfony/css-selector/Parser/Handler/CommentHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\HandlerInterface' => $vendorDir . '/symfony/css-selector/Parser/Handler/HandlerInterface.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\HashHandler' => $vendorDir . '/symfony/css-selector/Parser/Handler/HashHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\IdentifierHandler' => $vendorDir . '/symfony/css-selector/Parser/Handler/IdentifierHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\NumberHandler' => $vendorDir . '/symfony/css-selector/Parser/Handler/NumberHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\StringHandler' => $vendorDir . '/symfony/css-selector/Parser/Handler/StringHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\WhitespaceHandler' => $vendorDir . '/symfony/css-selector/Parser/Handler/WhitespaceHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Parser' => $vendorDir . '/symfony/css-selector/Parser/Parser.php', + 'Symfony\\Component\\CssSelector\\Parser\\ParserInterface' => $vendorDir . '/symfony/css-selector/Parser/ParserInterface.php', + 'Symfony\\Component\\CssSelector\\Parser\\Reader' => $vendorDir . '/symfony/css-selector/Parser/Reader.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\ClassParser' => $vendorDir . '/symfony/css-selector/Parser/Shortcut/ClassParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\ElementParser' => $vendorDir . '/symfony/css-selector/Parser/Shortcut/ElementParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\EmptyStringParser' => $vendorDir . '/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\HashParser' => $vendorDir . '/symfony/css-selector/Parser/Shortcut/HashParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Token' => $vendorDir . '/symfony/css-selector/Parser/Token.php', + 'Symfony\\Component\\CssSelector\\Parser\\TokenStream' => $vendorDir . '/symfony/css-selector/Parser/TokenStream.php', + 'Symfony\\Component\\CssSelector\\Parser\\Tokenizer\\Tokenizer' => $vendorDir . '/symfony/css-selector/Parser/Tokenizer/Tokenizer.php', + 'Symfony\\Component\\CssSelector\\Parser\\Tokenizer\\TokenizerEscaping' => $vendorDir . '/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php', + 'Symfony\\Component\\CssSelector\\Parser\\Tokenizer\\TokenizerPatterns' => $vendorDir . '/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\AbstractExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/AbstractExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\AttributeMatchingExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\CombinationExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/CombinationExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\ExtensionInterface' => $vendorDir . '/symfony/css-selector/XPath/Extension/ExtensionInterface.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\FunctionExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/FunctionExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\HtmlExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/HtmlExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\NodeExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/NodeExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\PseudoClassExtension' => $vendorDir . '/symfony/css-selector/XPath/Extension/PseudoClassExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Translator' => $vendorDir . '/symfony/css-selector/XPath/Translator.php', + 'Symfony\\Component\\CssSelector\\XPath\\TranslatorInterface' => $vendorDir . '/symfony/css-selector/XPath/TranslatorInterface.php', + 'Symfony\\Component\\CssSelector\\XPath\\XPathExpr' => $vendorDir . '/symfony/css-selector/XPath/XPathExpr.php', + 'Symfony\\Component\\ErrorHandler\\BufferingLogger' => $vendorDir . '/symfony/error-handler/BufferingLogger.php', + 'Symfony\\Component\\ErrorHandler\\Debug' => $vendorDir . '/symfony/error-handler/Debug.php', + 'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => $vendorDir . '/symfony/error-handler/DebugClassLoader.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorHandler' => $vendorDir . '/symfony/error-handler/ErrorHandler.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => $vendorDir . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php', + 'Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => $vendorDir . '/symfony/error-handler/Error/ClassNotFoundError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\FatalError' => $vendorDir . '/symfony/error-handler/Error/FatalError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => $vendorDir . '/symfony/error-handler/Error/OutOfMemoryError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => $vendorDir . '/symfony/error-handler/Error/UndefinedFunctionError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => $vendorDir . '/symfony/error-handler/Error/UndefinedMethodError.php', + 'Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => $vendorDir . '/symfony/error-handler/Exception/FlattenException.php', + 'Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/error-handler/Exception/SilencedErrorContext.php', + 'Symfony\\Component\\ErrorHandler\\ThrowableUtils' => $vendorDir . '/symfony/error-handler/ThrowableUtils.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php', + 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php', + 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php', + 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php', + 'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php', + 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => $vendorDir . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php', + 'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', + 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', + 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', + 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', + 'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', + 'Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', + 'Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', + 'Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', + 'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', + 'Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', + 'Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/AcceptHeader.php', + 'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/AcceptHeaderItem.php', + 'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/BinaryFileResponse.php', + 'Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Cookie.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => $vendorDir . '/symfony/http-foundation/Exception/BadRequestException.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => $vendorDir . '/symfony/http-foundation/Exception/ConflictingHeadersException.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => $vendorDir . '/symfony/http-foundation/Exception/RequestExceptionInterface.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => $vendorDir . '/symfony/http-foundation/Exception/SuspiciousOperationException.php', + 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/ExpressionRequestMatcher.php', + 'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/File/Exception/AccessDeniedException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/ExtensionFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileNotFoundException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FormSizeFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/IniSizeFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/PartialFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/File/Exception/UploadException.php', + 'Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/File/File.php', + 'Symfony\\Component\\HttpFoundation\\File\\Stream' => $vendorDir . '/symfony/http-foundation/File/Stream.php', + 'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/File/UploadedFile.php', + 'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php', + 'Symfony\\Component\\HttpFoundation\\HeaderUtils' => $vendorDir . '/symfony/http-foundation/HeaderUtils.php', + 'Symfony\\Component\\HttpFoundation\\InputBag' => $vendorDir . '/symfony/http-foundation/InputBag.php', + 'Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/IpUtils.php', + 'Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/JsonResponse.php', + 'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php', + 'Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/RedirectResponse.php', + 'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php', + 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher.php', + 'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => $vendorDir . '/symfony/http-foundation/RequestMatcherInterface.php', + 'Symfony\\Component\\HttpFoundation\\RequestStack' => $vendorDir . '/symfony/http-foundation/RequestStack.php', + 'Symfony\\Component\\HttpFoundation\\Response' => $vendorDir . '/symfony/http-foundation/Response.php', + 'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => $vendorDir . '/symfony/http-foundation/ResponseHeaderBag.php', + 'Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/ServerBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\NamespacedAttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Session/Session.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => $vendorDir . '/symfony/http-foundation/Session/SessionBagProxy.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => $vendorDir . '/symfony/http-foundation/Session/SessionUtils.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Session/Storage/MetadataBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php', + 'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php', + 'Symfony\\Component\\HttpFoundation\\UrlHelper' => $vendorDir . '/symfony/http-foundation/UrlHelper.php', + 'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => $vendorDir . '/symfony/http-kernel/Bundle/Bundle.php', + 'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => $vendorDir . '/symfony/http-kernel/Bundle/BundleInterface.php', + 'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => $vendorDir . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php', + 'Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php', + 'Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php', + 'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Config/FileLocator.php', + 'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php', + 'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php', + 'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactoryInterface' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ContainerControllerResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Controller/ControllerReference.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolverInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => $vendorDir . '/symfony/http-kernel/Controller/ErrorController.php', + 'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableControllerResolver.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DumpDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/EventDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RequestDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RouterDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/TimeDataCollector.php', + 'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => $vendorDir . '/symfony/http-kernel/Debug/FileLinkFormatter.php', + 'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/Extension.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LoggerPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/AbstractSessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractTestSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/AbstractTestSessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => $vendorDir . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => $vendorDir . '/symfony/http-kernel/EventListener/DebugHandlersListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => $vendorDir . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => $vendorDir . '/symfony/http-kernel/EventListener/DumpListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => $vendorDir . '/symfony/http-kernel/EventListener/ErrorListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => $vendorDir . '/symfony/http-kernel/EventListener/FragmentListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleAwareListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/EventListener/ProfilerListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/ResponseListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/EventListener/RouterListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/StreamedResponseListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => $vendorDir . '/symfony/http-kernel/EventListener/SurrogateListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/TestSessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => $vendorDir . '/symfony/http-kernel/EventListener/ValidateRequestListener.php', + 'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => $vendorDir . '/symfony/http-kernel/Event/ExceptionEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => $vendorDir . '/symfony/http-kernel/Event/FinishRequestEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => $vendorDir . '/symfony/http-kernel/Event/KernelEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => $vendorDir . '/symfony/http-kernel/Event/RequestEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/ResponseEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => $vendorDir . '/symfony/http-kernel/Event/TerminateEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => $vendorDir . '/symfony/http-kernel/Event/ViewEvent.php', + 'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Exception/BadRequestHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ConflictHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => $vendorDir . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Exception/GoneHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Exception/HttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Exception/HttpExceptionInterface.php', + 'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotFoundHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => $vendorDir . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => $vendorDir . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentHandler.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\AbstractSurrogate' => $vendorDir . '/symfony/http-kernel/HttpCache/AbstractSurrogate.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => $vendorDir . '/symfony/http-kernel/HttpCache/Esi.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => $vendorDir . '/symfony/http-kernel/HttpCache/HttpCache.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => $vendorDir . '/symfony/http-kernel/HttpCache/Ssi.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\Store' => $vendorDir . '/symfony/http-kernel/HttpCache/Store.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/StoreInterface.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => $vendorDir . '/symfony/http-kernel/HttpCache/SubRequestHandler.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/SurrogateInterface.php', + 'Symfony\\Component\\HttpKernel\\HttpClientKernel' => $vendorDir . '/symfony/http-kernel/HttpClientKernel.php', + 'Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/HttpKernel.php', + 'Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => $vendorDir . '/symfony/http-kernel/HttpKernelBrowser.php', + 'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/HttpKernelInterface.php', + 'Symfony\\Component\\HttpKernel\\Kernel' => $vendorDir . '/symfony/http-kernel/Kernel.php', + 'Symfony\\Component\\HttpKernel\\KernelEvents' => $vendorDir . '/symfony/http-kernel/KernelEvents.php', + 'Symfony\\Component\\HttpKernel\\KernelInterface' => $vendorDir . '/symfony/http-kernel/KernelInterface.php', + 'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => $vendorDir . '/symfony/http-kernel/Log/DebugLoggerInterface.php', + 'Symfony\\Component\\HttpKernel\\Log\\Logger' => $vendorDir . '/symfony/http-kernel/Log/Logger.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/FileProfilerStorage.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\Profile' => $vendorDir . '/symfony/http-kernel/Profiler/Profile.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => $vendorDir . '/symfony/http-kernel/Profiler/Profiler.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => $vendorDir . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php', + 'Symfony\\Component\\HttpKernel\\RebootableInterface' => $vendorDir . '/symfony/http-kernel/RebootableInterface.php', + 'Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/TerminableInterface.php', + 'Symfony\\Component\\HttpKernel\\UriSigner' => $vendorDir . '/symfony/http-kernel/UriSigner.php', + 'Symfony\\Component\\Mime\\Address' => $vendorDir . '/symfony/mime/Address.php', + 'Symfony\\Component\\Mime\\BodyRendererInterface' => $vendorDir . '/symfony/mime/BodyRendererInterface.php', + 'Symfony\\Component\\Mime\\CharacterStream' => $vendorDir . '/symfony/mime/CharacterStream.php', + 'Symfony\\Component\\Mime\\Crypto\\SMime' => $vendorDir . '/symfony/mime/Crypto/SMime.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeEncrypter' => $vendorDir . '/symfony/mime/Crypto/SMimeEncrypter.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeSigner' => $vendorDir . '/symfony/mime/Crypto/SMimeSigner.php', + 'Symfony\\Component\\Mime\\DependencyInjection\\AddMimeTypeGuesserPass' => $vendorDir . '/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php', + 'Symfony\\Component\\Mime\\Email' => $vendorDir . '/symfony/mime/Email.php', + 'Symfony\\Component\\Mime\\Encoder\\AddressEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/AddressEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64ContentEncoder' => $vendorDir . '/symfony/mime/Encoder/Base64ContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64Encoder' => $vendorDir . '/symfony/mime/Encoder/Base64Encoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64MimeHeaderEncoder' => $vendorDir . '/symfony/mime/Encoder/Base64MimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\ContentEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/ContentEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\EightBitContentEncoder' => $vendorDir . '/symfony/mime/Encoder/EightBitContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\EncoderInterface' => $vendorDir . '/symfony/mime/Encoder/EncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\IdnAddressEncoder' => $vendorDir . '/symfony/mime/Encoder/IdnAddressEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\MimeHeaderEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/MimeHeaderEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\QpContentEncoder' => $vendorDir . '/symfony/mime/Encoder/QpContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpEncoder' => $vendorDir . '/symfony/mime/Encoder/QpEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpMimeHeaderEncoder' => $vendorDir . '/symfony/mime/Encoder/QpMimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Rfc2231Encoder' => $vendorDir . '/symfony/mime/Encoder/Rfc2231Encoder.php', + 'Symfony\\Component\\Mime\\Exception\\AddressEncoderException' => $vendorDir . '/symfony/mime/Exception/AddressEncoderException.php', + 'Symfony\\Component\\Mime\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/mime/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Mime\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/mime/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Mime\\Exception\\LogicException' => $vendorDir . '/symfony/mime/Exception/LogicException.php', + 'Symfony\\Component\\Mime\\Exception\\RfcComplianceException' => $vendorDir . '/symfony/mime/Exception/RfcComplianceException.php', + 'Symfony\\Component\\Mime\\Exception\\RuntimeException' => $vendorDir . '/symfony/mime/Exception/RuntimeException.php', + 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser' => $vendorDir . '/symfony/mime/FileBinaryMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser' => $vendorDir . '/symfony/mime/FileinfoMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\Header\\AbstractHeader' => $vendorDir . '/symfony/mime/Header/AbstractHeader.php', + 'Symfony\\Component\\Mime\\Header\\DateHeader' => $vendorDir . '/symfony/mime/Header/DateHeader.php', + 'Symfony\\Component\\Mime\\Header\\HeaderInterface' => $vendorDir . '/symfony/mime/Header/HeaderInterface.php', + 'Symfony\\Component\\Mime\\Header\\Headers' => $vendorDir . '/symfony/mime/Header/Headers.php', + 'Symfony\\Component\\Mime\\Header\\IdentificationHeader' => $vendorDir . '/symfony/mime/Header/IdentificationHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxHeader' => $vendorDir . '/symfony/mime/Header/MailboxHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxListHeader' => $vendorDir . '/symfony/mime/Header/MailboxListHeader.php', + 'Symfony\\Component\\Mime\\Header\\ParameterizedHeader' => $vendorDir . '/symfony/mime/Header/ParameterizedHeader.php', + 'Symfony\\Component\\Mime\\Header\\PathHeader' => $vendorDir . '/symfony/mime/Header/PathHeader.php', + 'Symfony\\Component\\Mime\\Header\\UnstructuredHeader' => $vendorDir . '/symfony/mime/Header/UnstructuredHeader.php', + 'Symfony\\Component\\Mime\\Message' => $vendorDir . '/symfony/mime/Message.php', + 'Symfony\\Component\\Mime\\MessageConverter' => $vendorDir . '/symfony/mime/MessageConverter.php', + 'Symfony\\Component\\Mime\\MimeTypeGuesserInterface' => $vendorDir . '/symfony/mime/MimeTypeGuesserInterface.php', + 'Symfony\\Component\\Mime\\MimeTypes' => $vendorDir . '/symfony/mime/MimeTypes.php', + 'Symfony\\Component\\Mime\\MimeTypesInterface' => $vendorDir . '/symfony/mime/MimeTypesInterface.php', + 'Symfony\\Component\\Mime\\Part\\AbstractMultipartPart' => $vendorDir . '/symfony/mime/Part/AbstractMultipartPart.php', + 'Symfony\\Component\\Mime\\Part\\AbstractPart' => $vendorDir . '/symfony/mime/Part/AbstractPart.php', + 'Symfony\\Component\\Mime\\Part\\DataPart' => $vendorDir . '/symfony/mime/Part/DataPart.php', + 'Symfony\\Component\\Mime\\Part\\MessagePart' => $vendorDir . '/symfony/mime/Part/MessagePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\AlternativePart' => $vendorDir . '/symfony/mime/Part/Multipart/AlternativePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\DigestPart' => $vendorDir . '/symfony/mime/Part/Multipart/DigestPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\FormDataPart' => $vendorDir . '/symfony/mime/Part/Multipart/FormDataPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\MixedPart' => $vendorDir . '/symfony/mime/Part/Multipart/MixedPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\RelatedPart' => $vendorDir . '/symfony/mime/Part/Multipart/RelatedPart.php', + 'Symfony\\Component\\Mime\\Part\\SMimePart' => $vendorDir . '/symfony/mime/Part/SMimePart.php', + 'Symfony\\Component\\Mime\\Part\\TextPart' => $vendorDir . '/symfony/mime/Part/TextPart.php', + 'Symfony\\Component\\Mime\\RawMessage' => $vendorDir . '/symfony/mime/RawMessage.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAddressContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailAddressContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAttachmentCount' => $vendorDir . '/symfony/mime/Test/Constraint/EmailAttachmentCount.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHasHeader' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHasHeader.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHeaderSame' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHeaderSame.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHtmlBodyContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailTextBodyContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailTextBodyContains.php', + 'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', + 'Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', + 'Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', + 'Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', + 'Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', + 'Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', + 'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', + 'Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', + 'Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', + 'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', + 'Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', + 'Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', + 'Symfony\\Component\\Routing\\Annotation\\Route' => $vendorDir . '/symfony/routing/Annotation/Route.php', + 'Symfony\\Component\\Routing\\CompiledRoute' => $vendorDir . '/symfony/routing/CompiledRoute.php', + 'Symfony\\Component\\Routing\\DependencyInjection\\RoutingResolverPass' => $vendorDir . '/symfony/routing/DependencyInjection/RoutingResolverPass.php', + 'Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/routing/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => $vendorDir . '/symfony/routing/Exception/InvalidParameterException.php', + 'Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => $vendorDir . '/symfony/routing/Exception/MethodNotAllowedException.php', + 'Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => $vendorDir . '/symfony/routing/Exception/MissingMandatoryParametersException.php', + 'Symfony\\Component\\Routing\\Exception\\NoConfigurationException' => $vendorDir . '/symfony/routing/Exception/NoConfigurationException.php', + 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => $vendorDir . '/symfony/routing/Exception/ResourceNotFoundException.php', + 'Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => $vendorDir . '/symfony/routing/Exception/RouteNotFoundException.php', + 'Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator' => $vendorDir . '/symfony/routing/Generator/CompiledUrlGenerator.php', + 'Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => $vendorDir . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php', + 'Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php', + 'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumper.php', + 'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php', + 'Symfony\\Component\\Routing\\Generator\\UrlGenerator' => $vendorDir . '/symfony/routing/Generator/UrlGenerator.php', + 'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => $vendorDir . '/symfony/routing/Generator/UrlGeneratorInterface.php', + 'Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationClassLoader.php', + 'Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationDirectoryLoader.php', + 'Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\ClosureLoader' => $vendorDir . '/symfony/routing/Loader/ClosureLoader.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\CollectionConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/CollectionConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\ImportConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/ImportConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\RouteConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/RouteConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/RoutingConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\AddTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/AddTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\HostTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/HostTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\LocalizedRouteTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\PrefixTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\RouteTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/RouteTrait.php', + 'Symfony\\Component\\Routing\\Loader\\ContainerLoader' => $vendorDir . '/symfony/routing/Loader/ContainerLoader.php', + 'Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/routing/Loader/DirectoryLoader.php', + 'Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/routing/Loader/GlobFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\ObjectLoader' => $vendorDir . '/symfony/routing/Loader/ObjectLoader.php', + 'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/routing/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/routing/Loader/XmlFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/routing/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Routing\\Matcher\\CompiledUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/CompiledUrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait' => $vendorDir . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumper.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php', + 'Symfony\\Component\\Routing\\Matcher\\ExpressionLanguageProvider' => $vendorDir . '/symfony/routing/Matcher/ExpressionLanguageProvider.php', + 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php', + 'Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RequestMatcherInterface.php', + 'Symfony\\Component\\Routing\\Matcher\\TraceableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/TraceableUrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher' => $vendorDir . '/symfony/routing/Matcher/UrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/UrlMatcherInterface.php', + 'Symfony\\Component\\Routing\\RequestContext' => $vendorDir . '/symfony/routing/RequestContext.php', + 'Symfony\\Component\\Routing\\RequestContextAwareInterface' => $vendorDir . '/symfony/routing/RequestContextAwareInterface.php', + 'Symfony\\Component\\Routing\\Route' => $vendorDir . '/symfony/routing/Route.php', + 'Symfony\\Component\\Routing\\RouteCollection' => $vendorDir . '/symfony/routing/RouteCollection.php', + 'Symfony\\Component\\Routing\\RouteCollectionBuilder' => $vendorDir . '/symfony/routing/RouteCollectionBuilder.php', + 'Symfony\\Component\\Routing\\RouteCompiler' => $vendorDir . '/symfony/routing/RouteCompiler.php', + 'Symfony\\Component\\Routing\\RouteCompilerInterface' => $vendorDir . '/symfony/routing/RouteCompilerInterface.php', + 'Symfony\\Component\\Routing\\Router' => $vendorDir . '/symfony/routing/Router.php', + 'Symfony\\Component\\Routing\\RouterInterface' => $vendorDir . '/symfony/routing/RouterInterface.php', + 'Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php', + 'Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php', + 'Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php', + 'Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php', + 'Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php', + 'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php', + 'Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php', + 'Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php', + 'Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php', + 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php', + 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php', + 'Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php', + 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php', + 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => $vendorDir . '/symfony/translation/Command/XliffLintCommand.php', + 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php', + 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', + 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php', + 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php', + 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/translation/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\LogicException' => $vendorDir . '/symfony/translation/Exception/LogicException.php', + 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => $vendorDir . '/symfony/translation/Exception/RuntimeException.php', + 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php', + 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => $vendorDir . '/symfony/translation/Extractor/PhpStringTokenParser.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => $vendorDir . '/symfony/translation/Formatter/IntlFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/IntlFormatterInterface.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php', + 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php', + 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php', + 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php', + 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php', + 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php', + 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php', + 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => $vendorDir . '/symfony/translation/Reader/TranslationReader.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => $vendorDir . '/symfony/translation/Reader/TranslationReaderInterface.php', + 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php', + 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php', + 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php', + 'Symfony\\Component\\Translation\\Util\\XliffUtils' => $vendorDir . '/symfony/translation/Util/XliffUtils.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php', + 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => $vendorDir . '/symfony/var-dumper/Caster/ArgsStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\Caster' => $vendorDir . '/symfony/var-dumper/Caster/Caster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => $vendorDir . '/symfony/var-dumper/Caster/ClassStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => $vendorDir . '/symfony/var-dumper/Caster/ConstStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => $vendorDir . '/symfony/var-dumper/Caster/CutArrayStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutStub' => $vendorDir . '/symfony/var-dumper/Caster/CutStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => $vendorDir . '/symfony/var-dumper/Caster/DOMCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => $vendorDir . '/symfony/var-dumper/Caster/DateCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => $vendorDir . '/symfony/var-dumper/Caster/DoctrineCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => $vendorDir . '/symfony/var-dumper/Caster/DsCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => $vendorDir . '/symfony/var-dumper/Caster/DsPairStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => $vendorDir . '/symfony/var-dumper/Caster/EnumStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ExceptionCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => $vendorDir . '/symfony/var-dumper/Caster/FrameStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => $vendorDir . '/symfony/var-dumper/Caster/GmpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => $vendorDir . '/symfony/var-dumper/Caster/ImagineCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => $vendorDir . '/symfony/var-dumper/Caster/ImgStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => $vendorDir . '/symfony/var-dumper/Caster/IntlCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => $vendorDir . '/symfony/var-dumper/Caster/MemcachedCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => $vendorDir . '/symfony/var-dumper/Caster/PdoCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => $vendorDir . '/symfony/var-dumper/Caster/PgSqlCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => $vendorDir . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => $vendorDir . '/symfony/var-dumper/Caster/RdKafkaCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => $vendorDir . '/symfony/var-dumper/Caster/RedisCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ReflectionCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/ResourceCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => $vendorDir . '/symfony/var-dumper/Caster/SplCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => $vendorDir . '/symfony/var-dumper/Caster/StubCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => $vendorDir . '/symfony/var-dumper/Caster/SymfonyCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => $vendorDir . '/symfony/var-dumper/Caster/TraceStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => $vendorDir . '/symfony/var-dumper/Caster/UuidCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlReaderCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlResourceCaster.php', + 'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => $vendorDir . '/symfony/var-dumper/Cloner/AbstractCloner.php', + 'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => $vendorDir . '/symfony/var-dumper/Cloner/ClonerInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => $vendorDir . '/symfony/var-dumper/Cloner/Cursor.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Data' => $vendorDir . '/symfony/var-dumper/Cloner/Data.php', + 'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => $vendorDir . '/symfony/var-dumper/Cloner/DumperInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Stub' => $vendorDir . '/symfony/var-dumper/Cloner/Stub.php', + 'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => $vendorDir . '/symfony/var-dumper/Cloner/VarCloner.php', + 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php', + 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php', + 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php', + 'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => $vendorDir . '/symfony/var-dumper/Command/ServerDumpCommand.php', + 'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => $vendorDir . '/symfony/var-dumper/Dumper/AbstractDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => $vendorDir . '/symfony/var-dumper/Dumper/CliDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ContextualizedDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => $vendorDir . '/symfony/var-dumper/Dumper/DataDumperInterface.php', + 'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => $vendorDir . '/symfony/var-dumper/Dumper/HtmlDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ServerDumper.php', + 'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => $vendorDir . '/symfony/var-dumper/Exception/ThrowingCasterException.php', + 'Symfony\\Component\\VarDumper\\Server\\Connection' => $vendorDir . '/symfony/var-dumper/Server/Connection.php', + 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php', + 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php', + 'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php', + 'Symfony\\Contracts\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher-contracts/Event.php', + 'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php', + 'Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', + 'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => $vendorDir . '/symfony/service-contracts/Test/ServiceLocatorTest.php', + 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => $vendorDir . '/symfony/translation-contracts/Test/TranslatorTest.php', + 'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php', + 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', + 'Symfony\\Polyfill\\Iconv\\Iconv' => $vendorDir . '/symfony/polyfill-iconv/Iconv.php', + 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php', + 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', + 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', + 'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php', + 'Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php', + 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', + 'Tests\\CreatesApplication' => $baseDir . '/tests/CreatesApplication.php', + 'Tests\\Feature\\ExampleTest' => $baseDir . '/tests/Feature/ExampleTest.php', + 'Tests\\TestCase' => $baseDir . '/tests/TestCase.php', + 'Tests\\Unit\\ExampleTest' => $baseDir . '/tests/Unit/ExampleTest.php', + 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', + 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', + 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', + 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', + 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', + 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', + 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', + 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', + 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', + 'TijsVerkoyen\\CssToInlineStyles\\CssToInlineStyles' => $vendorDir . '/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Processor' => $vendorDir . '/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Property\\Processor' => $vendorDir . '/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Property\\Property' => $vendorDir . '/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Rule\\Processor' => $vendorDir . '/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Rule\\Rule' => $vendorDir . '/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php', + 'TitleSeeder' => $baseDir . '/database/seeds/TitleSeeder.php', + 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'UserSeeder' => $baseDir . '/database/seeds/UserSeeder.php', + 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + 'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', + 'Whoops\\Exception\\ErrorException' => $vendorDir . '/filp/whoops/src/Whoops/Exception/ErrorException.php', + 'Whoops\\Exception\\Formatter' => $vendorDir . '/filp/whoops/src/Whoops/Exception/Formatter.php', + 'Whoops\\Exception\\Frame' => $vendorDir . '/filp/whoops/src/Whoops/Exception/Frame.php', + 'Whoops\\Exception\\FrameCollection' => $vendorDir . '/filp/whoops/src/Whoops/Exception/FrameCollection.php', + 'Whoops\\Exception\\Inspector' => $vendorDir . '/filp/whoops/src/Whoops/Exception/Inspector.php', + 'Whoops\\Handler\\CallbackHandler' => $vendorDir . '/filp/whoops/src/Whoops/Handler/CallbackHandler.php', + 'Whoops\\Handler\\Handler' => $vendorDir . '/filp/whoops/src/Whoops/Handler/Handler.php', + 'Whoops\\Handler\\HandlerInterface' => $vendorDir . '/filp/whoops/src/Whoops/Handler/HandlerInterface.php', + 'Whoops\\Handler\\JsonResponseHandler' => $vendorDir . '/filp/whoops/src/Whoops/Handler/JsonResponseHandler.php', + 'Whoops\\Handler\\PlainTextHandler' => $vendorDir . '/filp/whoops/src/Whoops/Handler/PlainTextHandler.php', + 'Whoops\\Handler\\PrettyPageHandler' => $vendorDir . '/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php', + 'Whoops\\Handler\\XmlResponseHandler' => $vendorDir . '/filp/whoops/src/Whoops/Handler/XmlResponseHandler.php', + 'Whoops\\Run' => $vendorDir . '/filp/whoops/src/Whoops/Run.php', + 'Whoops\\RunInterface' => $vendorDir . '/filp/whoops/src/Whoops/RunInterface.php', + 'Whoops\\Util\\HtmlDumperOutput' => $vendorDir . '/filp/whoops/src/Whoops/Util/HtmlDumperOutput.php', + 'Whoops\\Util\\Misc' => $vendorDir . '/filp/whoops/src/Whoops/Util/Misc.php', + 'Whoops\\Util\\SystemFacade' => $vendorDir . '/filp/whoops/src/Whoops/Util/SystemFacade.php', + 'Whoops\\Util\\TemplateHelper' => $vendorDir . '/filp/whoops/src/Whoops/Util/TemplateHelper.php', + 'XdgBaseDir\\Xdg' => $vendorDir . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'ZipStream\\Bigint' => $vendorDir . '/maennchen/zipstream-php/src/Bigint.php', + 'ZipStream\\DeflateStream' => $vendorDir . '/maennchen/zipstream-php/src/DeflateStream.php', + 'ZipStream\\Exception' => $vendorDir . '/maennchen/zipstream-php/src/Exception.php', + 'ZipStream\\Exception\\EncodingException' => $vendorDir . '/maennchen/zipstream-php/src/Exception/EncodingException.php', + 'ZipStream\\Exception\\FileNotFoundException' => $vendorDir . '/maennchen/zipstream-php/src/Exception/FileNotFoundException.php', + 'ZipStream\\Exception\\FileNotReadableException' => $vendorDir . '/maennchen/zipstream-php/src/Exception/FileNotReadableException.php', + 'ZipStream\\Exception\\IncompatibleOptionsException' => $vendorDir . '/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php', + 'ZipStream\\Exception\\OverflowException' => $vendorDir . '/maennchen/zipstream-php/src/Exception/OverflowException.php', + 'ZipStream\\Exception\\StreamNotReadableException' => $vendorDir . '/maennchen/zipstream-php/src/Exception/StreamNotReadableException.php', + 'ZipStream\\File' => $vendorDir . '/maennchen/zipstream-php/src/File.php', + 'ZipStream\\Option\\Archive' => $vendorDir . '/maennchen/zipstream-php/src/Option/Archive.php', + 'ZipStream\\Option\\File' => $vendorDir . '/maennchen/zipstream-php/src/Option/File.php', + 'ZipStream\\Option\\Method' => $vendorDir . '/maennchen/zipstream-php/src/Option/Method.php', + 'ZipStream\\Option\\Version' => $vendorDir . '/maennchen/zipstream-php/src/Option/Version.php', + 'ZipStream\\Stream' => $vendorDir . '/maennchen/zipstream-php/src/Stream.php', + 'ZipStream\\ZipStream' => $vendorDir . '/maennchen/zipstream-php/src/ZipStream.php', + 'phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', + 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', + 'phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', + 'phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', + 'phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', + 'phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', + 'phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', + 'phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', + 'phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', + 'phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', + 'phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', + 'phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', + 'phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', + 'phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', + 'phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', + 'phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', + 'phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', + 'phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', + 'phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', + 'phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', + 'phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', + 'phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', + 'phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', + 'phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', + 'phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', + 'phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', + 'phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', + 'phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', + 'phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', + 'phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', + 'phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', + 'phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', + 'phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', + 'phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', + 'phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', + 'voku\\helper\\ASCII' => $vendorDir . '/voku/portable-ascii/src/voku/helper/ASCII.php', +); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 0000000..129cc28 --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,94 @@ + $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', + 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', + 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', + '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', + 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', + '2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php', + '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', + 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', + '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php', + 'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php', + '538ca81a9a966a6716601ecf48f4eaef' => $vendorDir . '/opis/closure/functions.php', + 'f0906e6318348a765ffb6eb24e0d0938' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/helpers.php', + '58571171fd5812e6e447dce228f52f4d' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php', + 'b6ec61354e97f32c0ae683041c78392a' => $vendorDir . '/scrivo/highlight.php/HighlightUtilities/functions.php', + '9cdd7b9056abc3081735233ba9dd9c7f' => $vendorDir . '/facade/flare-client-php/src/helpers.php', + '9d8e013a5160a09477beb8e44f8ae97b' => $vendorDir . '/markbaker/matrix/classes/src/functions/adjoint.php', + '6e78d1bdea6248d6aa117229efae50f2' => $vendorDir . '/markbaker/matrix/classes/src/functions/antidiagonal.php', + '4623d87924d94f5412fe5afbf1cef31d' => $vendorDir . '/markbaker/matrix/classes/src/functions/cofactors.php', + '901fd1f6950a637ca85f66b701a45e13' => $vendorDir . '/markbaker/matrix/classes/src/functions/determinant.php', + '83057abc0e4acc99ba80154ee5d02a49' => $vendorDir . '/markbaker/matrix/classes/src/functions/diagonal.php', + '07b7fd7a434451149b4fd477fca0ce06' => $vendorDir . '/markbaker/matrix/classes/src/functions/identity.php', + 'c8d43b340583e07ae89f2a3baef2cf89' => $vendorDir . '/markbaker/matrix/classes/src/functions/inverse.php', + '499bb10ed7a3aee2ba4c09a31a85e8d1' => $vendorDir . '/markbaker/matrix/classes/src/functions/minors.php', + '1cad2e6414d652e8b1c64e8967f6f37d' => $vendorDir . '/markbaker/matrix/classes/src/functions/trace.php', + '95a7f134ac17161d07def442b3b737e8' => $vendorDir . '/markbaker/matrix/classes/src/functions/transpose.php', + 'b3a6bc628377118d4b4b8ba08d1eb949' => $vendorDir . '/markbaker/matrix/classes/src/operations/add.php', + '5fef6d0e407f3f8887266dfa4a6c534c' => $vendorDir . '/markbaker/matrix/classes/src/operations/directsum.php', + '684ba247e1385946e3babdaa054119de' => $vendorDir . '/markbaker/matrix/classes/src/operations/subtract.php', + 'aa53dcba601214d17ad405b7c291b7e8' => $vendorDir . '/markbaker/matrix/classes/src/operations/multiply.php', + '75c79eb1b25749b05a47976f32b0d8a2' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideby.php', + '6ab8ad87a734f276a6bcd5a0fe1289be' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideinto.php', + 'abede361264e2ae69ec1eee813a101af' => $vendorDir . '/markbaker/complex/classes/src/functions/abs.php', + '21a5860fbef5be28db5ddfbc3cca67c4' => $vendorDir . '/markbaker/complex/classes/src/functions/acos.php', + '1546e3f9d127f2a9bb2d1b6c31c26ef1' => $vendorDir . '/markbaker/complex/classes/src/functions/acosh.php', + 'd2516f7f4fba5ea5905f494b4a8262e0' => $vendorDir . '/markbaker/complex/classes/src/functions/acot.php', + '4511163d560956219b96882c0980b65e' => $vendorDir . '/markbaker/complex/classes/src/functions/acoth.php', + 'c361f5616dc2a8da4fa3e137077cd4ea' => $vendorDir . '/markbaker/complex/classes/src/functions/acsc.php', + '02d68920fc98da71991ce569c91df0f6' => $vendorDir . '/markbaker/complex/classes/src/functions/acsch.php', + '88e19525eae308b4a6aa3419364875d3' => $vendorDir . '/markbaker/complex/classes/src/functions/argument.php', + '60e8e2d0827b58bfc904f13957e51849' => $vendorDir . '/markbaker/complex/classes/src/functions/asec.php', + '13d2f040713999eab66c359b4d79871d' => $vendorDir . '/markbaker/complex/classes/src/functions/asech.php', + '838ab38beb32c68a79d3cd2c007d5a04' => $vendorDir . '/markbaker/complex/classes/src/functions/asin.php', + 'bb28eccd0f8f008333a1b3c163d604ac' => $vendorDir . '/markbaker/complex/classes/src/functions/asinh.php', + '9e483de83558c98f7d3feaa402c78cb3' => $vendorDir . '/markbaker/complex/classes/src/functions/atan.php', + '36b74b5b765ded91ee58c8ee3c0e85e3' => $vendorDir . '/markbaker/complex/classes/src/functions/atanh.php', + '05c15ee9510da7fd6bf6136f436500c0' => $vendorDir . '/markbaker/complex/classes/src/functions/conjugate.php', + 'd3208dfbce2505e370788f9f22f6785f' => $vendorDir . '/markbaker/complex/classes/src/functions/cos.php', + '141cf1fb3a3046f8b64534b0ebab33ca' => $vendorDir . '/markbaker/complex/classes/src/functions/cosh.php', + 'be660df75fd0dbe7fa7c03b7434b3294' => $vendorDir . '/markbaker/complex/classes/src/functions/cot.php', + '01e31ea298a51bc9e91517e3ce6b9e76' => $vendorDir . '/markbaker/complex/classes/src/functions/coth.php', + '803ddd97f7b1da68982a7b087c3476f6' => $vendorDir . '/markbaker/complex/classes/src/functions/csc.php', + '3001cdfd101ec3c32da34ee43c2e149b' => $vendorDir . '/markbaker/complex/classes/src/functions/csch.php', + '77b2d7629ef2a93fabb8c56754a91051' => $vendorDir . '/markbaker/complex/classes/src/functions/exp.php', + '4a4471296dec796c21d4f4b6552396a9' => $vendorDir . '/markbaker/complex/classes/src/functions/inverse.php', + 'c3e9897e1744b88deb56fcdc39d34d85' => $vendorDir . '/markbaker/complex/classes/src/functions/ln.php', + 'a83cacf2de942cff288de15a83afd26d' => $vendorDir . '/markbaker/complex/classes/src/functions/log2.php', + '6a861dacc9ee2f3061241d4c7772fa21' => $vendorDir . '/markbaker/complex/classes/src/functions/log10.php', + '4d2522d968c8ba78d6c13548a1b4200e' => $vendorDir . '/markbaker/complex/classes/src/functions/negative.php', + 'fd587ca933fc0447fa5ab4843bdd97f7' => $vendorDir . '/markbaker/complex/classes/src/functions/pow.php', + '383ef01c62028fc78cd4388082fce3c2' => $vendorDir . '/markbaker/complex/classes/src/functions/rho.php', + '150fbd1b95029dc47292da97ecab9375' => $vendorDir . '/markbaker/complex/classes/src/functions/sec.php', + '549abd9bae174286d660bdaa07407c68' => $vendorDir . '/markbaker/complex/classes/src/functions/sech.php', + '6bfbf5eaea6b17a0ed85cb21ba80370c' => $vendorDir . '/markbaker/complex/classes/src/functions/sin.php', + '22efe13f1a497b8e199540ae2d9dc59c' => $vendorDir . '/markbaker/complex/classes/src/functions/sinh.php', + 'e90135ab8e787795a509ed7147de207d' => $vendorDir . '/markbaker/complex/classes/src/functions/sqrt.php', + 'bb0a7923ffc6a90919cd64ec54ff06bc' => $vendorDir . '/markbaker/complex/classes/src/functions/tan.php', + '2d302f32ce0fd4e433dd91c5bb404a28' => $vendorDir . '/markbaker/complex/classes/src/functions/tanh.php', + '24dd4658a952171a4ee79218c4f9fd06' => $vendorDir . '/markbaker/complex/classes/src/functions/theta.php', + 'e49b7876281d6f5bc39536dde96d1f4a' => $vendorDir . '/markbaker/complex/classes/src/operations/add.php', + '47596e02b43cd6da7700134fd08f88cf' => $vendorDir . '/markbaker/complex/classes/src/operations/subtract.php', + '883af48563631547925fa4c3b48ead07' => $vendorDir . '/markbaker/complex/classes/src/operations/multiply.php', + 'f190e3308e6ca23234a2875edc985c03' => $vendorDir . '/markbaker/complex/classes/src/operations/divideby.php', + 'ac9e33ce6841aa5bf5d16d465a2f03a7' => $vendorDir . '/markbaker/complex/classes/src/operations/divideinto.php', + 'ed962a97bd972bc82007176b647d4e36' => $vendorDir . '/facade/ignition/src/helpers.php', + '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', + '377b22b161c09ed6e5152de788ca020a' => $vendorDir . '/spatie/laravel-permission/src/helpers.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..314666f --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,12 @@ + array($vendorDir . '/mockery/mockery/library'), + 'Highlight\\' => array($vendorDir . '/scrivo/highlight.php'), + 'HighlightUtilities\\' => array($vendorDir . '/scrivo/highlight.php'), +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..d478602 --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,91 @@ + array($vendorDir . '/voku/portable-ascii/src/voku'), + 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'), + 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'), + 'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), + 'Whoops\\' => array($vendorDir . '/filp/whoops/src/Whoops'), + 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), + 'TijsVerkoyen\\CssToInlineStyles\\' => array($vendorDir . '/tijsverkoyen/css-to-inline-styles/src'), + 'Tests\\' => array($baseDir . '/tests'), + 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), + 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), + 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), + 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), + 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), + 'Symfony\\Polyfill\\Iconv\\' => array($vendorDir . '/symfony/polyfill-iconv'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), + 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), + 'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'), + 'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), + 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), + 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), + 'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'), + 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), + 'Symfony\\Component\\Mime\\' => array($vendorDir . '/symfony/mime'), + 'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'), + 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'), + 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), + 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), + 'Symfony\\Component\\ErrorHandler\\' => array($vendorDir . '/symfony/error-handler'), + 'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'), + 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'Spatie\\Permission\\' => array($vendorDir . '/spatie/laravel-permission/src'), + 'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'), + 'Ramsey\\Collection\\' => array($vendorDir . '/ramsey/collection/src'), + 'Psy\\' => array($vendorDir . '/psy/psysh/src'), + 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'), + 'Prettus\\Validator\\' => array($vendorDir . '/prettus/laravel-validation/src/Prettus/Validator'), + 'Prettus\\Repository\\' => array($vendorDir . '/prettus/l5-repository/src/Prettus/Repository'), + 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), + 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), + 'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'), + 'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'), + 'NunoMaduro\\Collision\\' => array($vendorDir . '/nunomaduro/collision/src'), + 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'), + 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), + 'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'), + 'Maatwebsite\\Excel\\' => array($vendorDir . '/maatwebsite/excel/src'), + 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'), + 'League\\CommonMark\\' => array($vendorDir . '/league/commonmark/src'), + 'Laravel\\Ui\\' => array($vendorDir . '/laravel/ui/src'), + 'Laravel\\Tinker\\' => array($vendorDir . '/laravel/tinker/src'), + 'Laravel\\Sanctum\\' => array($vendorDir . '/laravel/sanctum/src'), + 'Illuminate\\Foundation\\Auth\\' => array($vendorDir . '/laravel/ui/auth-backend'), + 'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'), + 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), + 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), + 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), + 'Fruitcake\\Cors\\' => array($vendorDir . '/fruitcake/laravel-cors/src'), + 'Fideloper\\Proxy\\' => array($vendorDir . '/fideloper/proxy/src'), + 'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'), + 'Facade\\Ignition\\' => array($vendorDir . '/facade/ignition/src'), + 'Facade\\IgnitionContracts\\' => array($vendorDir . '/facade/ignition-contracts/src'), + 'Facade\\FlareClient\\' => array($vendorDir . '/facade/flare-client-php/src'), + 'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'), + 'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'), + 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), + 'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), + 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), + 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), + 'Cron\\' => array($vendorDir . '/dragonmantank/cron-expression/src/Cron'), + 'Complex\\' => array($vendorDir . '/markbaker/complex/classes/src'), + 'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), + 'Brick\\Math\\' => array($vendorDir . '/brick/math/src'), + 'Asm89\\Stack\\' => array($vendorDir . '/asm89/stack-cors/src/Asm89/Stack'), + 'App\\' => array($baseDir . '/app'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..a0ea939 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,75 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit0e3f0c049033dd84006cc29dbf60fbc9::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit0e3f0c049033dd84006cc29dbf60fbc9::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire0e3f0c049033dd84006cc29dbf60fbc9($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequire0e3f0c049033dd84006cc29dbf60fbc9($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 0000000..1ccc90d --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,5582 @@ + __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', + 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', + 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', + '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', + 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', + '2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php', + '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php', + 'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php', + '538ca81a9a966a6716601ecf48f4eaef' => __DIR__ . '/..' . '/opis/closure/functions.php', + 'f0906e6318348a765ffb6eb24e0d0938' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/helpers.php', + '58571171fd5812e6e447dce228f52f4d' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/helpers.php', + 'b6ec61354e97f32c0ae683041c78392a' => __DIR__ . '/..' . '/scrivo/highlight.php/HighlightUtilities/functions.php', + '9cdd7b9056abc3081735233ba9dd9c7f' => __DIR__ . '/..' . '/facade/flare-client-php/src/helpers.php', + '9d8e013a5160a09477beb8e44f8ae97b' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/adjoint.php', + '6e78d1bdea6248d6aa117229efae50f2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/antidiagonal.php', + '4623d87924d94f5412fe5afbf1cef31d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/cofactors.php', + '901fd1f6950a637ca85f66b701a45e13' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/determinant.php', + '83057abc0e4acc99ba80154ee5d02a49' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/diagonal.php', + '07b7fd7a434451149b4fd477fca0ce06' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/identity.php', + 'c8d43b340583e07ae89f2a3baef2cf89' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/inverse.php', + '499bb10ed7a3aee2ba4c09a31a85e8d1' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/minors.php', + '1cad2e6414d652e8b1c64e8967f6f37d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/trace.php', + '95a7f134ac17161d07def442b3b737e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/transpose.php', + 'b3a6bc628377118d4b4b8ba08d1eb949' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/add.php', + '5fef6d0e407f3f8887266dfa4a6c534c' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/directsum.php', + '684ba247e1385946e3babdaa054119de' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/subtract.php', + 'aa53dcba601214d17ad405b7c291b7e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/multiply.php', + '75c79eb1b25749b05a47976f32b0d8a2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideby.php', + '6ab8ad87a734f276a6bcd5a0fe1289be' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideinto.php', + 'abede361264e2ae69ec1eee813a101af' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/abs.php', + '21a5860fbef5be28db5ddfbc3cca67c4' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acos.php', + '1546e3f9d127f2a9bb2d1b6c31c26ef1' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acosh.php', + 'd2516f7f4fba5ea5905f494b4a8262e0' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acot.php', + '4511163d560956219b96882c0980b65e' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acoth.php', + 'c361f5616dc2a8da4fa3e137077cd4ea' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acsc.php', + '02d68920fc98da71991ce569c91df0f6' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acsch.php', + '88e19525eae308b4a6aa3419364875d3' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/argument.php', + '60e8e2d0827b58bfc904f13957e51849' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asec.php', + '13d2f040713999eab66c359b4d79871d' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asech.php', + '838ab38beb32c68a79d3cd2c007d5a04' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asin.php', + 'bb28eccd0f8f008333a1b3c163d604ac' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asinh.php', + '9e483de83558c98f7d3feaa402c78cb3' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/atan.php', + '36b74b5b765ded91ee58c8ee3c0e85e3' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/atanh.php', + '05c15ee9510da7fd6bf6136f436500c0' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/conjugate.php', + 'd3208dfbce2505e370788f9f22f6785f' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/cos.php', + '141cf1fb3a3046f8b64534b0ebab33ca' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/cosh.php', + 'be660df75fd0dbe7fa7c03b7434b3294' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/cot.php', + '01e31ea298a51bc9e91517e3ce6b9e76' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/coth.php', + '803ddd97f7b1da68982a7b087c3476f6' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/csc.php', + '3001cdfd101ec3c32da34ee43c2e149b' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/csch.php', + '77b2d7629ef2a93fabb8c56754a91051' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/exp.php', + '4a4471296dec796c21d4f4b6552396a9' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/inverse.php', + 'c3e9897e1744b88deb56fcdc39d34d85' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/ln.php', + 'a83cacf2de942cff288de15a83afd26d' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/log2.php', + '6a861dacc9ee2f3061241d4c7772fa21' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/log10.php', + '4d2522d968c8ba78d6c13548a1b4200e' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/negative.php', + 'fd587ca933fc0447fa5ab4843bdd97f7' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/pow.php', + '383ef01c62028fc78cd4388082fce3c2' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/rho.php', + '150fbd1b95029dc47292da97ecab9375' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sec.php', + '549abd9bae174286d660bdaa07407c68' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sech.php', + '6bfbf5eaea6b17a0ed85cb21ba80370c' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sin.php', + '22efe13f1a497b8e199540ae2d9dc59c' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sinh.php', + 'e90135ab8e787795a509ed7147de207d' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sqrt.php', + 'bb0a7923ffc6a90919cd64ec54ff06bc' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/tan.php', + '2d302f32ce0fd4e433dd91c5bb404a28' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/tanh.php', + '24dd4658a952171a4ee79218c4f9fd06' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/theta.php', + 'e49b7876281d6f5bc39536dde96d1f4a' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/add.php', + '47596e02b43cd6da7700134fd08f88cf' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/subtract.php', + '883af48563631547925fa4c3b48ead07' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/multiply.php', + 'f190e3308e6ca23234a2875edc985c03' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/divideby.php', + 'ac9e33ce6841aa5bf5d16d465a2f03a7' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/divideinto.php', + 'ed962a97bd972bc82007176b647d4e36' => __DIR__ . '/..' . '/facade/ignition/src/helpers.php', + '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', + '377b22b161c09ed6e5152de788ca020a' => __DIR__ . '/..' . '/spatie/laravel-permission/src/helpers.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'v' => + array ( + 'voku\\' => 5, + ), + 'p' => + array ( + 'phpDocumentor\\Reflection\\' => 25, + ), + 'Z' => + array ( + 'ZipStream\\' => 10, + ), + 'X' => + array ( + 'XdgBaseDir\\' => 11, + ), + 'W' => + array ( + 'Whoops\\' => 7, + 'Webmozart\\Assert\\' => 17, + ), + 'T' => + array ( + 'TijsVerkoyen\\CssToInlineStyles\\' => 31, + 'Tests\\' => 6, + ), + 'S' => + array ( + 'Symfony\\Polyfill\\Php80\\' => 23, + 'Symfony\\Polyfill\\Php73\\' => 23, + 'Symfony\\Polyfill\\Php72\\' => 23, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, + 'Symfony\\Polyfill\\Intl\\Idn\\' => 26, + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, + 'Symfony\\Polyfill\\Iconv\\' => 23, + 'Symfony\\Polyfill\\Ctype\\' => 23, + 'Symfony\\Contracts\\Translation\\' => 30, + 'Symfony\\Contracts\\Service\\' => 26, + 'Symfony\\Contracts\\EventDispatcher\\' => 34, + 'Symfony\\Component\\VarDumper\\' => 28, + 'Symfony\\Component\\Translation\\' => 30, + 'Symfony\\Component\\String\\' => 25, + 'Symfony\\Component\\Routing\\' => 26, + 'Symfony\\Component\\Process\\' => 26, + 'Symfony\\Component\\Mime\\' => 23, + 'Symfony\\Component\\HttpKernel\\' => 29, + 'Symfony\\Component\\HttpFoundation\\' => 33, + 'Symfony\\Component\\Finder\\' => 25, + 'Symfony\\Component\\EventDispatcher\\' => 34, + 'Symfony\\Component\\ErrorHandler\\' => 31, + 'Symfony\\Component\\CssSelector\\' => 30, + 'Symfony\\Component\\Console\\' => 26, + 'Spatie\\Permission\\' => 18, + ), + 'R' => + array ( + 'Ramsey\\Uuid\\' => 12, + 'Ramsey\\Collection\\' => 18, + ), + 'P' => + array ( + 'Psy\\' => 4, + 'Psr\\SimpleCache\\' => 16, + 'Psr\\Log\\' => 8, + 'Psr\\Http\\Message\\' => 17, + 'Psr\\EventDispatcher\\' => 20, + 'Psr\\Container\\' => 14, + 'Prophecy\\' => 9, + 'Prettus\\Validator\\' => 18, + 'Prettus\\Repository\\' => 19, + 'PhpParser\\' => 10, + 'PhpOption\\' => 10, + 'PhpOffice\\PhpSpreadsheet\\' => 25, + ), + 'O' => + array ( + 'Opis\\Closure\\' => 13, + ), + 'N' => + array ( + 'NunoMaduro\\Collision\\' => 21, + ), + 'M' => + array ( + 'MyCLabs\\Enum\\' => 13, + 'Monolog\\' => 8, + 'Matrix\\' => 7, + 'Maatwebsite\\Excel\\' => 18, + ), + 'L' => + array ( + 'League\\Flysystem\\' => 17, + 'League\\CommonMark\\' => 18, + 'Laravel\\Ui\\' => 11, + 'Laravel\\Tinker\\' => 15, + 'Laravel\\Sanctum\\' => 16, + ), + 'I' => + array ( + 'Illuminate\\Foundation\\Auth\\' => 27, + 'Illuminate\\' => 11, + ), + 'G' => + array ( + 'GuzzleHttp\\Psr7\\' => 16, + 'GuzzleHttp\\Promise\\' => 19, + 'GuzzleHttp\\' => 11, + ), + 'F' => + array ( + 'Fruitcake\\Cors\\' => 15, + 'Fideloper\\Proxy\\' => 16, + 'Faker\\' => 6, + 'Facade\\Ignition\\' => 16, + 'Facade\\IgnitionContracts\\' => 25, + 'Facade\\FlareClient\\' => 19, + ), + 'E' => + array ( + 'Egulias\\EmailValidator\\' => 23, + ), + 'D' => + array ( + 'Dotenv\\' => 7, + 'Doctrine\\Instantiator\\' => 22, + 'Doctrine\\Inflector\\' => 19, + 'Doctrine\\Common\\Lexer\\' => 22, + 'DeepCopy\\' => 9, + ), + 'C' => + array ( + 'Cron\\' => 5, + 'Complex\\' => 8, + 'Carbon\\' => 7, + ), + 'B' => + array ( + 'Brick\\Math\\' => 11, + ), + 'A' => + array ( + 'Asm89\\Stack\\' => 12, + 'App\\' => 4, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'voku\\' => + array ( + 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', + ), + 'phpDocumentor\\Reflection\\' => + array ( + 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', + 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', + 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', + ), + 'ZipStream\\' => + array ( + 0 => __DIR__ . '/..' . '/maennchen/zipstream-php/src', + ), + 'XdgBaseDir\\' => + array ( + 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', + ), + 'Whoops\\' => + array ( + 0 => __DIR__ . '/..' . '/filp/whoops/src/Whoops', + ), + 'Webmozart\\Assert\\' => + array ( + 0 => __DIR__ . '/..' . '/webmozart/assert/src', + ), + 'TijsVerkoyen\\CssToInlineStyles\\' => + array ( + 0 => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src', + ), + 'Tests\\' => + array ( + 0 => __DIR__ . '/../..' . '/tests', + ), + 'Symfony\\Polyfill\\Php80\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', + ), + 'Symfony\\Polyfill\\Php73\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', + ), + 'Symfony\\Polyfill\\Php72\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', + ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', + ), + 'Symfony\\Polyfill\\Intl\\Idn\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', + ), + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', + ), + 'Symfony\\Polyfill\\Iconv\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-iconv', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'Symfony\\Contracts\\Translation\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/translation-contracts', + ), + 'Symfony\\Contracts\\Service\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/service-contracts', + ), + 'Symfony\\Contracts\\EventDispatcher\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', + ), + 'Symfony\\Component\\VarDumper\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/var-dumper', + ), + 'Symfony\\Component\\Translation\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/translation', + ), + 'Symfony\\Component\\String\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/string', + ), + 'Symfony\\Component\\Routing\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/routing', + ), + 'Symfony\\Component\\Process\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/process', + ), + 'Symfony\\Component\\Mime\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/mime', + ), + 'Symfony\\Component\\HttpKernel\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/http-kernel', + ), + 'Symfony\\Component\\HttpFoundation\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/http-foundation', + ), + 'Symfony\\Component\\Finder\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/finder', + ), + 'Symfony\\Component\\EventDispatcher\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', + ), + 'Symfony\\Component\\ErrorHandler\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/error-handler', + ), + 'Symfony\\Component\\CssSelector\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/css-selector', + ), + 'Symfony\\Component\\Console\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/console', + ), + 'Spatie\\Permission\\' => + array ( + 0 => __DIR__ . '/..' . '/spatie/laravel-permission/src', + ), + 'Ramsey\\Uuid\\' => + array ( + 0 => __DIR__ . '/..' . '/ramsey/uuid/src', + ), + 'Ramsey\\Collection\\' => + array ( + 0 => __DIR__ . '/..' . '/ramsey/collection/src', + ), + 'Psy\\' => + array ( + 0 => __DIR__ . '/..' . '/psy/psysh/src', + ), + 'Psr\\SimpleCache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/simple-cache/src', + ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + ), + 'Psr\\EventDispatcher\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', + ), + 'Psr\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/container/src', + ), + 'Prophecy\\' => + array ( + 0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy', + ), + 'Prettus\\Validator\\' => + array ( + 0 => __DIR__ . '/..' . '/prettus/laravel-validation/src/Prettus/Validator', + ), + 'Prettus\\Repository\\' => + array ( + 0 => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository', + ), + 'PhpParser\\' => + array ( + 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', + ), + 'PhpOption\\' => + array ( + 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', + ), + 'PhpOffice\\PhpSpreadsheet\\' => + array ( + 0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet', + ), + 'Opis\\Closure\\' => + array ( + 0 => __DIR__ . '/..' . '/opis/closure/src', + ), + 'NunoMaduro\\Collision\\' => + array ( + 0 => __DIR__ . '/..' . '/nunomaduro/collision/src', + ), + 'MyCLabs\\Enum\\' => + array ( + 0 => __DIR__ . '/..' . '/myclabs/php-enum/src', + ), + 'Monolog\\' => + array ( + 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', + ), + 'Matrix\\' => + array ( + 0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src', + ), + 'Maatwebsite\\Excel\\' => + array ( + 0 => __DIR__ . '/..' . '/maatwebsite/excel/src', + ), + 'League\\Flysystem\\' => + array ( + 0 => __DIR__ . '/..' . '/league/flysystem/src', + ), + 'League\\CommonMark\\' => + array ( + 0 => __DIR__ . '/..' . '/league/commonmark/src', + ), + 'Laravel\\Ui\\' => + array ( + 0 => __DIR__ . '/..' . '/laravel/ui/src', + ), + 'Laravel\\Tinker\\' => + array ( + 0 => __DIR__ . '/..' . '/laravel/tinker/src', + ), + 'Laravel\\Sanctum\\' => + array ( + 0 => __DIR__ . '/..' . '/laravel/sanctum/src', + ), + 'Illuminate\\Foundation\\Auth\\' => + array ( + 0 => __DIR__ . '/..' . '/laravel/ui/auth-backend', + ), + 'Illuminate\\' => + array ( + 0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate', + ), + 'GuzzleHttp\\Psr7\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', + ), + 'GuzzleHttp\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', + ), + 'GuzzleHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', + ), + 'Fruitcake\\Cors\\' => + array ( + 0 => __DIR__ . '/..' . '/fruitcake/laravel-cors/src', + ), + 'Fideloper\\Proxy\\' => + array ( + 0 => __DIR__ . '/..' . '/fideloper/proxy/src', + ), + 'Faker\\' => + array ( + 0 => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker', + ), + 'Facade\\Ignition\\' => + array ( + 0 => __DIR__ . '/..' . '/facade/ignition/src', + ), + 'Facade\\IgnitionContracts\\' => + array ( + 0 => __DIR__ . '/..' . '/facade/ignition-contracts/src', + ), + 'Facade\\FlareClient\\' => + array ( + 0 => __DIR__ . '/..' . '/facade/flare-client-php/src', + ), + 'Egulias\\EmailValidator\\' => + array ( + 0 => __DIR__ . '/..' . '/egulias/email-validator/src', + ), + 'Dotenv\\' => + array ( + 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src', + ), + 'Doctrine\\Instantiator\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', + ), + 'Doctrine\\Inflector\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector', + ), + 'Doctrine\\Common\\Lexer\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', + ), + 'DeepCopy\\' => + array ( + 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', + ), + 'Cron\\' => + array ( + 0 => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron', + ), + 'Complex\\' => + array ( + 0 => __DIR__ . '/..' . '/markbaker/complex/classes/src', + ), + 'Carbon\\' => + array ( + 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', + ), + 'Brick\\Math\\' => + array ( + 0 => __DIR__ . '/..' . '/brick/math/src', + ), + 'Asm89\\Stack\\' => + array ( + 0 => __DIR__ . '/..' . '/asm89/stack-cors/src/Asm89/Stack', + ), + 'App\\' => + array ( + 0 => __DIR__ . '/../..' . '/app', + ), + ); + + public static $prefixesPsr0 = array ( + 'M' => + array ( + 'Mockery' => + array ( + 0 => __DIR__ . '/..' . '/mockery/mockery/library', + ), + ), + 'H' => + array ( + 'Highlight\\' => + array ( + 0 => __DIR__ . '/..' . '/scrivo/highlight.php', + ), + 'HighlightUtilities\\' => + array ( + 0 => __DIR__ . '/..' . '/scrivo/highlight.php', + ), + ), + ); + + public static $classMap = array ( + 'App\\Casts\\Json' => __DIR__ . '/../..' . '/app/Casts/Json.php', + 'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php', + 'App\\Contracts\\Repositories\\AttachmentRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/AttachmentRepository.php', + 'App\\Contracts\\Repositories\\BookRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/BookRepository.php', + 'App\\Contracts\\Repositories\\DepartmentRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/DepartmentRepository.php', + 'App\\Contracts\\Repositories\\DocumentRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/DocumentRepository.php', + 'App\\Contracts\\Repositories\\DocumentTypeRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/DocumentTypeRepository.php', + 'App\\Contracts\\Repositories\\OrganizeRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/OrganizeRepository.php', + 'App\\Contracts\\Repositories\\PermissionRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/PermissionRepository.php', + 'App\\Contracts\\Repositories\\RoleRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/RoleRepository.php', + 'App\\Contracts\\Repositories\\SignerRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/SignerRepository.php', + 'App\\Contracts\\Repositories\\TitleRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/TitleRepository.php', + 'App\\Contracts\\Repositories\\UserRepository' => __DIR__ . '/../..' . '/app/Contracts/Repositories/UserRepository.php', + 'App\\Criteria\\DocumentCriteria' => __DIR__ . '/../..' . '/app/Criteria/DocumentCriteria.php', + 'App\\Entities\\Attachment' => __DIR__ . '/../..' . '/app/Entities/Attachment.php', + 'App\\Entities\\Book' => __DIR__ . '/../..' . '/app/Entities/Book.php', + 'App\\Entities\\Department' => __DIR__ . '/../..' . '/app/Entities/Department.php', + 'App\\Entities\\Document' => __DIR__ . '/../..' . '/app/Entities/Document.php', + 'App\\Entities\\DocumentType' => __DIR__ . '/../..' . '/app/Entities/DocumentType.php', + 'App\\Entities\\Organize' => __DIR__ . '/../..' . '/app/Entities/Organize.php', + 'App\\Entities\\Signer' => __DIR__ . '/../..' . '/app/Entities/Signer.php', + 'App\\Entities\\Title' => __DIR__ . '/../..' . '/app/Entities/Title.php', + 'App\\Entities\\User' => __DIR__ . '/../..' . '/app/Entities/User.php', + 'App\\Events\\ActionCalled' => __DIR__ . '/../..' . '/app/Events/ActionCalled.php', + 'App\\Events\\UserViewedDocument' => __DIR__ . '/../..' . '/app/Events/UserViewedDocument.php', + 'App\\Events\\UsersReceivedDocument' => __DIR__ . '/../..' . '/app/Events/UsersReceivedDocument.php', + 'App\\Exceptions\\AccountNotActive' => __DIR__ . '/../..' . '/app/Exceptions/AccountNotActive.php', + 'App\\Exceptions\\ActionNotFound' => __DIR__ . '/../..' . '/app/Exceptions/ActionNotFound.php', + 'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php', + 'App\\Exceptions\\RelationIdsNotAllow' => __DIR__ . '/../..' . '/app/Exceptions/RelationIdsNotAllow.php', + 'App\\Exceptions\\RelationNotAllow' => __DIR__ . '/../..' . '/app/Exceptions/RelationNotAllow.php', + 'App\\Exceptions\\UserIdIncorrectFormat' => __DIR__ . '/../..' . '/app/Exceptions/UserIdIncorrectFormat.php', + 'App\\Exports\\BaseDocumentsExport' => __DIR__ . '/../..' . '/app/Exports/BaseDocumentsExport.php', + 'App\\Exports\\BooksExport' => __DIR__ . '/../..' . '/app/Exports/BooksExport.php', + 'App\\Exports\\ComeInDocumentsExport' => __DIR__ . '/../..' . '/app/Exports/ComeInDocumentsExport.php', + 'App\\Exports\\ComeOutDocumentsExport' => __DIR__ . '/../..' . '/app/Exports/ComeOutDocumentsExport.php', + 'App\\Exports\\PrivateDocumentsExport' => __DIR__ . '/../..' . '/app/Exports/PrivateDocumentsExport.php', + 'App\\Exports\\UsersExport' => __DIR__ . '/../..' . '/app/Exports/UsersExport.php', + 'App\\Fakers\\AbstractDocumentFacker' => __DIR__ . '/../..' . '/app/Fakers/AbstractDocumentFacker.php', + 'App\\Http\\Controllers\\Api\\AttachmentsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/AttachmentsController.php', + 'App\\Http\\Controllers\\Api\\BooksController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/BooksController.php', + 'App\\Http\\Controllers\\Api\\DepartmentsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/DepartmentsController.php', + 'App\\Http\\Controllers\\Api\\DocumentTypesController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/DocumentTypesController.php', + 'App\\Http\\Controllers\\Api\\DocumentsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/DocumentsController.php', + 'App\\Http\\Controllers\\Api\\MeController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/MeController.php', + 'App\\Http\\Controllers\\Api\\NotificationsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/NotificationsController.php', + 'App\\Http\\Controllers\\Api\\OrganizesController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/OrganizesController.php', + 'App\\Http\\Controllers\\Api\\PermissionsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/PermissionsController.php', + 'App\\Http\\Controllers\\Api\\ReportsController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/ReportsController.php', + 'App\\Http\\Controllers\\Api\\RolesController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/RolesController.php', + 'App\\Http\\Controllers\\Api\\SignersController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/SignersController.php', + 'App\\Http\\Controllers\\Api\\TitlesController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/TitlesController.php', + 'App\\Http\\Controllers\\Api\\UsersController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/UsersController.php', + 'App\\Http\\Controllers\\Auth\\ConfirmPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ConfirmPasswordController.php', + 'App\\Http\\Controllers\\Auth\\ForgotPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ForgotPasswordController.php', + 'App\\Http\\Controllers\\Auth\\LoginController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/LoginController.php', + 'App\\Http\\Controllers\\Auth\\RegisterController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/RegisterController.php', + 'App\\Http\\Controllers\\Auth\\ResetPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ResetPasswordController.php', + 'App\\Http\\Controllers\\Auth\\VerificationController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/VerificationController.php', + 'App\\Http\\Controllers\\Controller' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php', + 'App\\Http\\Controllers\\HomeController' => __DIR__ . '/../..' . '/app/Http/Controllers/HomeController.php', + 'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php', + 'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php', + 'App\\Http\\Middleware\\CheckForMaintenanceMode' => __DIR__ . '/../..' . '/app/Http/Middleware/CheckForMaintenanceMode.php', + 'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php', + 'App\\Http\\Middleware\\EnsureUserIsActive' => __DIR__ . '/../..' . '/app/Http/Middleware/EnsureUserIsActive.php', + 'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php', + 'App\\Http\\Middleware\\TrimStrings' => __DIR__ . '/../..' . '/app/Http/Middleware/TrimStrings.php', + 'App\\Http\\Middleware\\TrustProxies' => __DIR__ . '/../..' . '/app/Http/Middleware/TrustProxies.php', + 'App\\Http\\Middleware\\VerifyCsrfToken' => __DIR__ . '/../..' . '/app/Http/Middleware/VerifyCsrfToken.php', + 'App\\Http\\Requests\\Attachment\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Attachment/CreateRequest.php', + 'App\\Http\\Requests\\Attachment\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Attachment/DestroyRequest.php', + 'App\\Http\\Requests\\Attachment\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Attachment/IndexRequest.php', + 'App\\Http\\Requests\\Attachment\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Attachment/ShowRequest.php', + 'App\\Http\\Requests\\Attachment\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Attachment/UpdateRequest.php', + 'App\\Http\\Requests\\Book\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Book/CreateRequest.php', + 'App\\Http\\Requests\\Book\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Book/DestroyRequest.php', + 'App\\Http\\Requests\\Book\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Book/IndexRequest.php', + 'App\\Http\\Requests\\Book\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Book/ShowRequest.php', + 'App\\Http\\Requests\\Book\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Book/UpdateRequest.php', + 'App\\Http\\Requests\\Department\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Department/CreateRequest.php', + 'App\\Http\\Requests\\Department\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Department/DestroyRequest.php', + 'App\\Http\\Requests\\Department\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Department/IndexRequest.php', + 'App\\Http\\Requests\\Department\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Department/ShowRequest.php', + 'App\\Http\\Requests\\Department\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Department/UpdateRequest.php', + 'App\\Http\\Requests\\DocumentType\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/DocumentType/CreateRequest.php', + 'App\\Http\\Requests\\DocumentType\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/DocumentType/DestroyRequest.php', + 'App\\Http\\Requests\\DocumentType\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/DocumentType/IndexRequest.php', + 'App\\Http\\Requests\\DocumentType\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/DocumentType/ShowRequest.php', + 'App\\Http\\Requests\\DocumentType\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/DocumentType/UpdateRequest.php', + 'App\\Http\\Requests\\Document\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Document/CreateRequest.php', + 'App\\Http\\Requests\\Document\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Document/DestroyRequest.php', + 'App\\Http\\Requests\\Document\\ExportRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Document/ExportRequest.php', + 'App\\Http\\Requests\\Document\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Document/IndexRequest.php', + 'App\\Http\\Requests\\Document\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Document/ShowRequest.php', + 'App\\Http\\Requests\\Document\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Document/UpdateRequest.php', + 'App\\Http\\Requests\\Me\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Me/ShowRequest.php', + 'App\\Http\\Requests\\Me\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Me/UpdateRequest.php', + 'App\\Http\\Requests\\Organize\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Organize/CreateRequest.php', + 'App\\Http\\Requests\\Organize\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Organize/DestroyRequest.php', + 'App\\Http\\Requests\\Organize\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Organize/IndexRequest.php', + 'App\\Http\\Requests\\Organize\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Organize/ShowRequest.php', + 'App\\Http\\Requests\\Organize\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Organize/UpdateRequest.php', + 'App\\Http\\Requests\\Permission\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Permission/CreateRequest.php', + 'App\\Http\\Requests\\Permission\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Permission/DestroyRequest.php', + 'App\\Http\\Requests\\Permission\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Permission/IndexRequest.php', + 'App\\Http\\Requests\\Permission\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Permission/ShowRequest.php', + 'App\\Http\\Requests\\Permission\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Permission/UpdateRequest.php', + 'App\\Http\\Requests\\Role\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/CreateRequest.php', + 'App\\Http\\Requests\\Role\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/DestroyRequest.php', + 'App\\Http\\Requests\\Role\\GivePermissionRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/GivePermissionRequest.php', + 'App\\Http\\Requests\\Role\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/IndexRequest.php', + 'App\\Http\\Requests\\Role\\RevokePermissionRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/RevokePermissionRequest.php', + 'App\\Http\\Requests\\Role\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/ShowRequest.php', + 'App\\Http\\Requests\\Role\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Role/UpdateRequest.php', + 'App\\Http\\Requests\\Signer\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Signer/CreateRequest.php', + 'App\\Http\\Requests\\Signer\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Signer/DestroyRequest.php', + 'App\\Http\\Requests\\Signer\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Signer/IndexRequest.php', + 'App\\Http\\Requests\\Signer\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Signer/ShowRequest.php', + 'App\\Http\\Requests\\Signer\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Signer/UpdateRequest.php', + 'App\\Http\\Requests\\Title\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Title/CreateRequest.php', + 'App\\Http\\Requests\\Title\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Title/DestroyRequest.php', + 'App\\Http\\Requests\\Title\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Title/IndexRequest.php', + 'App\\Http\\Requests\\Title\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Title/ShowRequest.php', + 'App\\Http\\Requests\\Title\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/Title/UpdateRequest.php', + 'App\\Http\\Requests\\User\\CreateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/CreateRequest.php', + 'App\\Http\\Requests\\User\\DestroyRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/DestroyRequest.php', + 'App\\Http\\Requests\\User\\ExportRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/ExportRequest.php', + 'App\\Http\\Requests\\User\\GivePermissionRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/GivePermissionRequest.php', + 'App\\Http\\Requests\\User\\GiveRoleRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/GiveRoleRequest.php', + 'App\\Http\\Requests\\User\\ImportRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/ImportRequest.php', + 'App\\Http\\Requests\\User\\IndexRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/IndexRequest.php', + 'App\\Http\\Requests\\User\\ShowRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/ShowRequest.php', + 'App\\Http\\Requests\\User\\UpdateRequest' => __DIR__ . '/../..' . '/app/Http/Requests/User/UpdateRequest.php', + 'App\\Imports\\UsersImport' => __DIR__ . '/../..' . '/app/Imports/UsersImport.php', + 'App\\Listeners\\NotifyDocumentReceivedToUsers' => __DIR__ . '/../..' . '/app/Listeners/NotifyDocumentReceivedToUsers.php', + 'App\\Listeners\\UpdateReceiverToSeen' => __DIR__ . '/../..' . '/app/Listeners/UpdateReceiverToSeen.php', + 'App\\Notifications\\DocumentReceived' => __DIR__ . '/../..' . '/app/Notifications/DocumentReceived.php', + 'App\\Observers\\UserObserver' => __DIR__ . '/../..' . '/app/Observers/UserObserver.php', + 'App\\Providers\\AppServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AppServiceProvider.php', + 'App\\Providers\\AuthServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AuthServiceProvider.php', + 'App\\Providers\\BroadcastServiceProvider' => __DIR__ . '/../..' . '/app/Providers/BroadcastServiceProvider.php', + 'App\\Providers\\EventServiceProvider' => __DIR__ . '/../..' . '/app/Providers/EventServiceProvider.php', + 'App\\Providers\\RepositoryServiceProvider' => __DIR__ . '/../..' . '/app/Providers/RepositoryServiceProvider.php', + 'App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/app/Providers/RouteServiceProvider.php', + 'App\\Repositories\\Eloquents\\AttachmentRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/AttachmentRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\BookRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/BookRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\DepartmentRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/DepartmentRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\DocumentRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/DocumentRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\DocumentTypeRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/DocumentTypeRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\OrganizeRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/OrganizeRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\PermissionRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/PermissionRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\RoleRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/RoleRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\SignerRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/SignerRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\TitleRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/TitleRepositoryEloquent.php', + 'App\\Repositories\\Eloquents\\UserRepositoryEloquent' => __DIR__ . '/../..' . '/app/Repositories/Eloquents/UserRepositoryEloquent.php', + 'App\\Traits\\ActionCallable' => __DIR__ . '/../..' . '/app/Traits/ActionCallable.php', + 'App\\Traits\\Attachmentable' => __DIR__ . '/../..' . '/app/Traits/Attachmentable.php', + 'Asm89\\Stack\\Cors' => __DIR__ . '/..' . '/asm89/stack-cors/src/Asm89/Stack/Cors.php', + 'Asm89\\Stack\\CorsService' => __DIR__ . '/..' . '/asm89/stack-cors/src/Asm89/Stack/CorsService.php', + 'BookSeeder' => __DIR__ . '/../..' . '/database/seeds/BookSeeder.php', + 'Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php', + 'Brick\\Math\\BigInteger' => __DIR__ . '/..' . '/brick/math/src/BigInteger.php', + 'Brick\\Math\\BigNumber' => __DIR__ . '/..' . '/brick/math/src/BigNumber.php', + 'Brick\\Math\\BigRational' => __DIR__ . '/..' . '/brick/math/src/BigRational.php', + 'Brick\\Math\\Exception\\DivisionByZeroException' => __DIR__ . '/..' . '/brick/math/src/Exception/DivisionByZeroException.php', + 'Brick\\Math\\Exception\\IntegerOverflowException' => __DIR__ . '/..' . '/brick/math/src/Exception/IntegerOverflowException.php', + 'Brick\\Math\\Exception\\MathException' => __DIR__ . '/..' . '/brick/math/src/Exception/MathException.php', + 'Brick\\Math\\Exception\\NegativeNumberException' => __DIR__ . '/..' . '/brick/math/src/Exception/NegativeNumberException.php', + 'Brick\\Math\\Exception\\NumberFormatException' => __DIR__ . '/..' . '/brick/math/src/Exception/NumberFormatException.php', + 'Brick\\Math\\Exception\\RoundingNecessaryException' => __DIR__ . '/..' . '/brick/math/src/Exception/RoundingNecessaryException.php', + 'Brick\\Math\\Internal\\Calculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator.php', + 'Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/BcMathCalculator.php', + 'Brick\\Math\\Internal\\Calculator\\GmpCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/GmpCalculator.php', + 'Brick\\Math\\Internal\\Calculator\\NativeCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/NativeCalculator.php', + 'Brick\\Math\\RoundingMode' => __DIR__ . '/..' . '/brick/math/src/RoundingMode.php', + 'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php', + 'Carbon\\CarbonImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', + 'Carbon\\CarbonInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterface.php', + 'Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php', + 'Carbon\\CarbonPeriod' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', + 'Carbon\\CarbonTimeZone' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', + 'Carbon\\Cli\\Invoker' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', + 'Carbon\\Doctrine\\CarbonDoctrineType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php', + 'Carbon\\Doctrine\\CarbonImmutableType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php', + 'Carbon\\Doctrine\\CarbonType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php', + 'Carbon\\Doctrine\\CarbonTypeConverter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php', + 'Carbon\\Doctrine\\DateTimeDefaultPrecision' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', + 'Carbon\\Doctrine\\DateTimeImmutableType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php', + 'Carbon\\Doctrine\\DateTimeType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php', + 'Carbon\\Exceptions\\BadComparisonUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', + 'Carbon\\Exceptions\\BadFluentConstructorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', + 'Carbon\\Exceptions\\BadFluentSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', + 'Carbon\\Exceptions\\BadMethodCallException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', + 'Carbon\\Exceptions\\Exception' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', + 'Carbon\\Exceptions\\ImmutableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', + 'Carbon\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', + 'Carbon\\Exceptions\\InvalidCastException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', + 'Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', + 'Carbon\\Exceptions\\InvalidFormatException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', + 'Carbon\\Exceptions\\InvalidIntervalException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', + 'Carbon\\Exceptions\\InvalidPeriodDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', + 'Carbon\\Exceptions\\InvalidPeriodParameterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', + 'Carbon\\Exceptions\\InvalidTimeZoneException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', + 'Carbon\\Exceptions\\InvalidTypeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', + 'Carbon\\Exceptions\\NotACarbonClassException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', + 'Carbon\\Exceptions\\NotAPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', + 'Carbon\\Exceptions\\NotLocaleAwareException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', + 'Carbon\\Exceptions\\OutOfRangeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', + 'Carbon\\Exceptions\\ParseErrorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', + 'Carbon\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', + 'Carbon\\Exceptions\\UnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', + 'Carbon\\Exceptions\\UnitNotConfiguredException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', + 'Carbon\\Exceptions\\UnknownGetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', + 'Carbon\\Exceptions\\UnknownMethodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', + 'Carbon\\Exceptions\\UnknownSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', + 'Carbon\\Exceptions\\UnknownUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', + 'Carbon\\Exceptions\\UnreachableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', + 'Carbon\\Factory' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Factory.php', + 'Carbon\\FactoryImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', + 'Carbon\\Language' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Language.php', + 'Carbon\\Laravel\\ServiceProvider' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', + 'Carbon\\Traits\\Boundaries' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', + 'Carbon\\Traits\\Cast' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Cast.php', + 'Carbon\\Traits\\Comparison' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', + 'Carbon\\Traits\\Converter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Converter.php', + 'Carbon\\Traits\\Creator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Creator.php', + 'Carbon\\Traits\\Date' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Date.php', + 'Carbon\\Traits\\Difference' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Difference.php', + 'Carbon\\Traits\\IntervalRounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', + 'Carbon\\Traits\\Localization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Localization.php', + 'Carbon\\Traits\\Macro' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Macro.php', + 'Carbon\\Traits\\Mixin' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', + 'Carbon\\Traits\\Modifiers' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', + 'Carbon\\Traits\\Mutability' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', + 'Carbon\\Traits\\ObjectInitialisation' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', + 'Carbon\\Traits\\Options' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Options.php', + 'Carbon\\Traits\\Rounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', + 'Carbon\\Traits\\Serialization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', + 'Carbon\\Traits\\Test' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Test.php', + 'Carbon\\Traits\\Timestamp' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', + 'Carbon\\Traits\\Units' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Units.php', + 'Carbon\\Traits\\Week' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Week.php', + 'Carbon\\Translator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Translator.php', + 'Complex\\Complex' => __DIR__ . '/..' . '/markbaker/complex/classes/src/Complex.php', + 'Complex\\Exception' => __DIR__ . '/..' . '/markbaker/complex/classes/src/Exception.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Cron\\AbstractField' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/AbstractField.php', + 'Cron\\CronExpression' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/CronExpression.php', + 'Cron\\DayOfMonthField' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php', + 'Cron\\DayOfWeekField' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php', + 'Cron\\FieldFactory' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/FieldFactory.php', + 'Cron\\FieldInterface' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/FieldInterface.php', + 'Cron\\HoursField' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/HoursField.php', + 'Cron\\MinutesField' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/MinutesField.php', + 'Cron\\MonthField' => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron/MonthField.php', + 'DatabaseSeeder' => __DIR__ . '/../..' . '/database/seeds/DatabaseSeeder.php', + 'DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', + 'DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', + 'DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', + 'DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', + 'DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', + 'DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', + 'DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', + 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', + 'DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', + 'DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', + 'DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', + 'DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', + 'DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', + 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', + 'DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', + 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', + 'DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', + 'DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', + 'DepartmentSeeder' => __DIR__ . '/../..' . '/database/seeds/DepartmentSeeder.php', + 'Doctrine\\Common\\Lexer\\AbstractLexer' => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php', + 'Doctrine\\Inflector\\CachedWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', + 'Doctrine\\Inflector\\GenericLanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', + 'Doctrine\\Inflector\\Inflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', + 'Doctrine\\Inflector\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', + 'Doctrine\\Inflector\\Language' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', + 'Doctrine\\Inflector\\LanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', + 'Doctrine\\Inflector\\NoopWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', + 'Doctrine\\Inflector\\Rules\\English\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\English\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', + 'Doctrine\\Inflector\\Rules\\English\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\French\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\French\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', + 'Doctrine\\Inflector\\Rules\\French\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', + 'Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Pattern' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', + 'Doctrine\\Inflector\\Rules\\Patterns' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', + 'Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Ruleset' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', + 'Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Substitution' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', + 'Doctrine\\Inflector\\Rules\\Substitutions' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', + 'Doctrine\\Inflector\\Rules\\Transformation' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', + 'Doctrine\\Inflector\\Rules\\Transformations' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', + 'Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', + 'Doctrine\\Inflector\\Rules\\Word' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', + 'Doctrine\\Inflector\\RulesetInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', + 'Doctrine\\Inflector\\WordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', + 'Doctrine\\Instantiator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php', + 'Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php', + 'Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php', + 'Doctrine\\Instantiator\\Instantiator' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php', + 'Doctrine\\Instantiator\\InstantiatorInterface' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php', + 'DocumentSeeder' => __DIR__ . '/../..' . '/database/seeds/DocumentSeeder.php', + 'DocumentTypeSeeder' => __DIR__ . '/../..' . '/database/seeds/DocumentTypeSeeder.php', + 'Dotenv\\Dotenv' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Dotenv.php', + 'Dotenv\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/ExceptionInterface.php', + 'Dotenv\\Exception\\InvalidFileException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/InvalidFileException.php', + 'Dotenv\\Exception\\InvalidPathException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/InvalidPathException.php', + 'Dotenv\\Exception\\ValidationException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/ValidationException.php', + 'Dotenv\\Loader\\Lines' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/Lines.php', + 'Dotenv\\Loader\\Loader' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/Loader.php', + 'Dotenv\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/LoaderInterface.php', + 'Dotenv\\Loader\\Parser' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/Parser.php', + 'Dotenv\\Loader\\Value' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/Value.php', + 'Dotenv\\Regex\\Regex' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Regex/Regex.php', + 'Dotenv\\Repository\\AbstractRepository' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/AbstractRepository.php', + 'Dotenv\\Repository\\AdapterRepository' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/AdapterRepository.php', + 'Dotenv\\Repository\\Adapter\\ApacheAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php', + 'Dotenv\\Repository\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php', + 'Dotenv\\Repository\\Adapter\\AvailabilityInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/AvailabilityInterface.php', + 'Dotenv\\Repository\\Adapter\\EnvConstAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php', + 'Dotenv\\Repository\\Adapter\\PutenvAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php', + 'Dotenv\\Repository\\Adapter\\ReaderInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php', + 'Dotenv\\Repository\\Adapter\\ServerConstAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php', + 'Dotenv\\Repository\\Adapter\\WriterInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php', + 'Dotenv\\Repository\\RepositoryBuilder' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php', + 'Dotenv\\Repository\\RepositoryInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/RepositoryInterface.php', + 'Dotenv\\Result\\Error' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Result/Error.php', + 'Dotenv\\Result\\Result' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Result/Result.php', + 'Dotenv\\Result\\Success' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Result/Success.php', + 'Dotenv\\Store\\FileStore' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/FileStore.php', + 'Dotenv\\Store\\File\\Paths' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/File/Paths.php', + 'Dotenv\\Store\\File\\Reader' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/File/Reader.php', + 'Dotenv\\Store\\StoreBuilder' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/StoreBuilder.php', + 'Dotenv\\Store\\StoreInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/StoreInterface.php', + 'Dotenv\\Validator' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Validator.php', + 'Egulias\\EmailValidator\\EmailLexer' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailLexer.php', + 'Egulias\\EmailValidator\\EmailParser' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailParser.php', + 'Egulias\\EmailValidator\\EmailValidator' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailValidator.php', + 'Egulias\\EmailValidator\\Exception\\AtextAfterCFWS' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/AtextAfterCFWS.php', + 'Egulias\\EmailValidator\\Exception\\CRLFAtTheEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/CRLFAtTheEnd.php', + 'Egulias\\EmailValidator\\Exception\\CRLFX2' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/CRLFX2.php', + 'Egulias\\EmailValidator\\Exception\\CRNoLF' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/CRNoLF.php', + 'Egulias\\EmailValidator\\Exception\\CharNotAllowed' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/CharNotAllowed.php', + 'Egulias\\EmailValidator\\Exception\\CommaInDomain' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/CommaInDomain.php', + 'Egulias\\EmailValidator\\Exception\\ConsecutiveAt' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ConsecutiveAt.php', + 'Egulias\\EmailValidator\\Exception\\ConsecutiveDot' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ConsecutiveDot.php', + 'Egulias\\EmailValidator\\Exception\\DomainHyphened' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/DomainHyphened.php', + 'Egulias\\EmailValidator\\Exception\\DotAtEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/DotAtEnd.php', + 'Egulias\\EmailValidator\\Exception\\DotAtStart' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/DotAtStart.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingAT' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ExpectingAT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingATEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ExpectingATEXT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingCTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ExpectingCTEXT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingDTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ExpectingDTEXT.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingDomainLiteralClose' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ExpectingDomainLiteralClose.php', + 'Egulias\\EmailValidator\\Exception\\ExpectingQPair' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/ExpectingQPair.php', + 'Egulias\\EmailValidator\\Exception\\InvalidEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/InvalidEmail.php', + 'Egulias\\EmailValidator\\Exception\\NoDNSRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/NoDNSRecord.php', + 'Egulias\\EmailValidator\\Exception\\NoDomainPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/NoDomainPart.php', + 'Egulias\\EmailValidator\\Exception\\NoLocalPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/NoLocalPart.php', + 'Egulias\\EmailValidator\\Exception\\UnclosedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/UnclosedComment.php', + 'Egulias\\EmailValidator\\Exception\\UnclosedQuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/UnclosedQuotedString.php', + 'Egulias\\EmailValidator\\Exception\\UnopenedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Exception/UnopenedComment.php', + 'Egulias\\EmailValidator\\Parser\\DomainPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DomainPart.php', + 'Egulias\\EmailValidator\\Parser\\LocalPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/LocalPart.php', + 'Egulias\\EmailValidator\\Parser\\Parser' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/Parser.php', + 'Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSCheckValidation.php', + 'Egulias\\EmailValidator\\Validation\\EmailValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/EmailValidation.php', + 'Egulias\\EmailValidator\\Validation\\Error\\RFCWarnings' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Error/RFCWarnings.php', + 'Egulias\\EmailValidator\\Validation\\Error\\SpoofEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Error/SpoofEmail.php', + 'Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', + 'Egulias\\EmailValidator\\Validation\\MultipleErrors' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/MultipleErrors.php', + 'Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', + 'Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', + 'Egulias\\EmailValidator\\Validation\\RFCValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/RFCValidation.php', + 'Egulias\\EmailValidator\\Validation\\SpoofCheckValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/SpoofCheckValidation.php', + 'Egulias\\EmailValidator\\Warning\\AddressLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/AddressLiteral.php', + 'Egulias\\EmailValidator\\Warning\\CFWSNearAt' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/CFWSNearAt.php', + 'Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/CFWSWithFWS.php', + 'Egulias\\EmailValidator\\Warning\\Comment' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Comment.php', + 'Egulias\\EmailValidator\\Warning\\DeprecatedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DeprecatedComment.php', + 'Egulias\\EmailValidator\\Warning\\DomainLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DomainLiteral.php', + 'Egulias\\EmailValidator\\Warning\\DomainTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DomainTooLong.php', + 'Egulias\\EmailValidator\\Warning\\EmailTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/EmailTooLong.php', + 'Egulias\\EmailValidator\\Warning\\IPV6BadChar' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6BadChar.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6ColonEnd.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6ColonStart.php', + 'Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6Deprecated.php', + 'Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6DoubleColon.php', + 'Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6GroupCount.php', + 'Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6MaxGroups.php', + 'Egulias\\EmailValidator\\Warning\\LabelTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/LabelTooLong.php', + 'Egulias\\EmailValidator\\Warning\\LocalTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/LocalTooLong.php', + 'Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/NoDNSMXRecord.php', + 'Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', + 'Egulias\\EmailValidator\\Warning\\QuotedPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedPart.php', + 'Egulias\\EmailValidator\\Warning\\QuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedString.php', + 'Egulias\\EmailValidator\\Warning\\TLD' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/TLD.php', + 'Egulias\\EmailValidator\\Warning\\Warning' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Warning.php', + 'Facade\\FlareClient\\Api' => __DIR__ . '/..' . '/facade/flare-client-php/src/Api.php', + 'Facade\\FlareClient\\Concerns\\HasContext' => __DIR__ . '/..' . '/facade/flare-client-php/src/Concerns/HasContext.php', + 'Facade\\FlareClient\\Concerns\\UsesTime' => __DIR__ . '/..' . '/facade/flare-client-php/src/Concerns/UsesTime.php', + 'Facade\\FlareClient\\Context\\ConsoleContext' => __DIR__ . '/..' . '/facade/flare-client-php/src/Context/ConsoleContext.php', + 'Facade\\FlareClient\\Context\\ContextContextDetector' => __DIR__ . '/..' . '/facade/flare-client-php/src/Context/ContextContextDetector.php', + 'Facade\\FlareClient\\Context\\ContextDetectorInterface' => __DIR__ . '/..' . '/facade/flare-client-php/src/Context/ContextDetectorInterface.php', + 'Facade\\FlareClient\\Context\\ContextInterface' => __DIR__ . '/..' . '/facade/flare-client-php/src/Context/ContextInterface.php', + 'Facade\\FlareClient\\Context\\RequestContext' => __DIR__ . '/..' . '/facade/flare-client-php/src/Context/RequestContext.php', + 'Facade\\FlareClient\\Contracts\\ProvidesFlareContext' => __DIR__ . '/..' . '/facade/flare-client-php/src/Contracts/ProvidesFlareContext.php', + 'Facade\\FlareClient\\Enums\\GroupingTypes' => __DIR__ . '/..' . '/facade/flare-client-php/src/Enums/GroupingTypes.php', + 'Facade\\FlareClient\\Enums\\MessageLevels' => __DIR__ . '/..' . '/facade/flare-client-php/src/Enums/MessageLevels.php', + 'Facade\\FlareClient\\Flare' => __DIR__ . '/..' . '/facade/flare-client-php/src/Flare.php', + 'Facade\\FlareClient\\Frame' => __DIR__ . '/..' . '/facade/flare-client-php/src/Frame.php', + 'Facade\\FlareClient\\Glows\\Glow' => __DIR__ . '/..' . '/facade/flare-client-php/src/Glows/Glow.php', + 'Facade\\FlareClient\\Glows\\Recorder' => __DIR__ . '/..' . '/facade/flare-client-php/src/Glows/Recorder.php', + 'Facade\\FlareClient\\Http\\Client' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Client.php', + 'Facade\\FlareClient\\Http\\Exceptions\\BadResponse' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Exceptions/BadResponse.php', + 'Facade\\FlareClient\\Http\\Exceptions\\BadResponseCode' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Exceptions/BadResponseCode.php', + 'Facade\\FlareClient\\Http\\Exceptions\\InvalidData' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Exceptions/InvalidData.php', + 'Facade\\FlareClient\\Http\\Exceptions\\MissingParameter' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Exceptions/MissingParameter.php', + 'Facade\\FlareClient\\Http\\Exceptions\\NotFound' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Exceptions/NotFound.php', + 'Facade\\FlareClient\\Http\\Response' => __DIR__ . '/..' . '/facade/flare-client-php/src/Http/Response.php', + 'Facade\\FlareClient\\Middleware\\AddGlows' => __DIR__ . '/..' . '/facade/flare-client-php/src/Middleware/AddGlows.php', + 'Facade\\FlareClient\\Middleware\\AnonymizeIp' => __DIR__ . '/..' . '/facade/flare-client-php/src/Middleware/AnonymizeIp.php', + 'Facade\\FlareClient\\Report' => __DIR__ . '/..' . '/facade/flare-client-php/src/Report.php', + 'Facade\\FlareClient\\Solutions\\ReportSolution' => __DIR__ . '/..' . '/facade/flare-client-php/src/Solutions/ReportSolution.php', + 'Facade\\FlareClient\\Stacktrace\\Codesnippet' => __DIR__ . '/..' . '/facade/flare-client-php/src/Stacktrace/Codesnippet.php', + 'Facade\\FlareClient\\Stacktrace\\File' => __DIR__ . '/..' . '/facade/flare-client-php/src/Stacktrace/File.php', + 'Facade\\FlareClient\\Stacktrace\\Frame' => __DIR__ . '/..' . '/facade/flare-client-php/src/Stacktrace/Frame.php', + 'Facade\\FlareClient\\Stacktrace\\Stacktrace' => __DIR__ . '/..' . '/facade/flare-client-php/src/Stacktrace/Stacktrace.php', + 'Facade\\FlareClient\\Time\\SystemTime' => __DIR__ . '/..' . '/facade/flare-client-php/src/Time/SystemTime.php', + 'Facade\\FlareClient\\Time\\Time' => __DIR__ . '/..' . '/facade/flare-client-php/src/Time/Time.php', + 'Facade\\FlareClient\\Truncation\\AbstractTruncationStrategy' => __DIR__ . '/..' . '/facade/flare-client-php/src/Truncation/AbstractTruncationStrategy.php', + 'Facade\\FlareClient\\Truncation\\ReportTrimmer' => __DIR__ . '/..' . '/facade/flare-client-php/src/Truncation/ReportTrimmer.php', + 'Facade\\FlareClient\\Truncation\\TrimContextItemsStrategy' => __DIR__ . '/..' . '/facade/flare-client-php/src/Truncation/TrimContextItemsStrategy.php', + 'Facade\\FlareClient\\Truncation\\TrimStringsStrategy' => __DIR__ . '/..' . '/facade/flare-client-php/src/Truncation/TrimStringsStrategy.php', + 'Facade\\FlareClient\\Truncation\\TruncationStrategy' => __DIR__ . '/..' . '/facade/flare-client-php/src/Truncation/TruncationStrategy.php', + 'Facade\\FlareClient\\View' => __DIR__ . '/..' . '/facade/flare-client-php/src/View.php', + 'Facade\\IgnitionContracts\\BaseSolution' => __DIR__ . '/..' . '/facade/ignition-contracts/src/BaseSolution.php', + 'Facade\\IgnitionContracts\\HasSolutionsForThrowable' => __DIR__ . '/..' . '/facade/ignition-contracts/src/HasSolutionsForThrowable.php', + 'Facade\\IgnitionContracts\\ProvidesSolution' => __DIR__ . '/..' . '/facade/ignition-contracts/src/ProvidesSolution.php', + 'Facade\\IgnitionContracts\\RunnableSolution' => __DIR__ . '/..' . '/facade/ignition-contracts/src/RunnableSolution.php', + 'Facade\\IgnitionContracts\\Solution' => __DIR__ . '/..' . '/facade/ignition-contracts/src/Solution.php', + 'Facade\\IgnitionContracts\\SolutionProviderRepository' => __DIR__ . '/..' . '/facade/ignition-contracts/src/SolutionProviderRepository.php', + 'Facade\\Ignition\\Actions\\ShareReportAction' => __DIR__ . '/..' . '/facade/ignition/src/Actions/ShareReportAction.php', + 'Facade\\Ignition\\Commands\\SolutionMakeCommand' => __DIR__ . '/..' . '/facade/ignition/src/Commands/SolutionMakeCommand.php', + 'Facade\\Ignition\\Commands\\TestCommand' => __DIR__ . '/..' . '/facade/ignition/src/Commands/TestCommand.php', + 'Facade\\Ignition\\Context\\LaravelConsoleContext' => __DIR__ . '/..' . '/facade/ignition/src/Context/LaravelConsoleContext.php', + 'Facade\\Ignition\\Context\\LaravelContextDetector' => __DIR__ . '/..' . '/facade/ignition/src/Context/LaravelContextDetector.php', + 'Facade\\Ignition\\Context\\LaravelRequestContext' => __DIR__ . '/..' . '/facade/ignition/src/Context/LaravelRequestContext.php', + 'Facade\\Ignition\\DumpRecorder\\Dump' => __DIR__ . '/..' . '/facade/ignition/src/DumpRecorder/Dump.php', + 'Facade\\Ignition\\DumpRecorder\\DumpHandler' => __DIR__ . '/..' . '/facade/ignition/src/DumpRecorder/DumpHandler.php', + 'Facade\\Ignition\\DumpRecorder\\DumpRecorder' => __DIR__ . '/..' . '/facade/ignition/src/DumpRecorder/DumpRecorder.php', + 'Facade\\Ignition\\DumpRecorder\\HtmlDumper' => __DIR__ . '/..' . '/facade/ignition/src/DumpRecorder/HtmlDumper.php', + 'Facade\\Ignition\\DumpRecorder\\MultiDumpHandler' => __DIR__ . '/..' . '/facade/ignition/src/DumpRecorder/MultiDumpHandler.php', + 'Facade\\Ignition\\ErrorPage\\ErrorPageHandler' => __DIR__ . '/..' . '/facade/ignition/src/ErrorPage/ErrorPageHandler.php', + 'Facade\\Ignition\\ErrorPage\\ErrorPageViewModel' => __DIR__ . '/..' . '/facade/ignition/src/ErrorPage/ErrorPageViewModel.php', + 'Facade\\Ignition\\ErrorPage\\IgnitionWhoopsHandler' => __DIR__ . '/..' . '/facade/ignition/src/ErrorPage/IgnitionWhoopsHandler.php', + 'Facade\\Ignition\\ErrorPage\\Renderer' => __DIR__ . '/..' . '/facade/ignition/src/ErrorPage/Renderer.php', + 'Facade\\Ignition\\Exceptions\\InvalidConfig' => __DIR__ . '/..' . '/facade/ignition/src/Exceptions/InvalidConfig.php', + 'Facade\\Ignition\\Exceptions\\UnableToShareErrorException' => __DIR__ . '/..' . '/facade/ignition/src/Exceptions/UnableToShareErrorException.php', + 'Facade\\Ignition\\Exceptions\\ViewException' => __DIR__ . '/..' . '/facade/ignition/src/Exceptions/ViewException.php', + 'Facade\\Ignition\\Exceptions\\ViewExceptionWithSolution' => __DIR__ . '/..' . '/facade/ignition/src/Exceptions/ViewExceptionWithSolution.php', + 'Facade\\Ignition\\Facades\\Flare' => __DIR__ . '/..' . '/facade/ignition/src/Facades/Flare.php', + 'Facade\\Ignition\\Http\\Controllers\\ExecuteSolutionController' => __DIR__ . '/..' . '/facade/ignition/src/Http/Controllers/ExecuteSolutionController.php', + 'Facade\\Ignition\\Http\\Controllers\\HealthCheckController' => __DIR__ . '/..' . '/facade/ignition/src/Http/Controllers/HealthCheckController.php', + 'Facade\\Ignition\\Http\\Controllers\\ScriptController' => __DIR__ . '/..' . '/facade/ignition/src/Http/Controllers/ScriptController.php', + 'Facade\\Ignition\\Http\\Controllers\\ShareReportController' => __DIR__ . '/..' . '/facade/ignition/src/Http/Controllers/ShareReportController.php', + 'Facade\\Ignition\\Http\\Controllers\\StyleController' => __DIR__ . '/..' . '/facade/ignition/src/Http/Controllers/StyleController.php', + 'Facade\\Ignition\\Http\\Middleware\\IgnitionConfigValueEnabled' => __DIR__ . '/..' . '/facade/ignition/src/Http/Middleware/IgnitionConfigValueEnabled.php', + 'Facade\\Ignition\\Http\\Middleware\\IgnitionEnabled' => __DIR__ . '/..' . '/facade/ignition/src/Http/Middleware/IgnitionEnabled.php', + 'Facade\\Ignition\\Http\\Requests\\ExecuteSolutionRequest' => __DIR__ . '/..' . '/facade/ignition/src/Http/Requests/ExecuteSolutionRequest.php', + 'Facade\\Ignition\\Http\\Requests\\ShareReportRequest' => __DIR__ . '/..' . '/facade/ignition/src/Http/Requests/ShareReportRequest.php', + 'Facade\\Ignition\\Ignition' => __DIR__ . '/..' . '/facade/ignition/src/Ignition.php', + 'Facade\\Ignition\\IgnitionConfig' => __DIR__ . '/..' . '/facade/ignition/src/IgnitionConfig.php', + 'Facade\\Ignition\\IgnitionServiceProvider' => __DIR__ . '/..' . '/facade/ignition/src/IgnitionServiceProvider.php', + 'Facade\\Ignition\\LogRecorder\\LogMessage' => __DIR__ . '/..' . '/facade/ignition/src/LogRecorder/LogMessage.php', + 'Facade\\Ignition\\LogRecorder\\LogRecorder' => __DIR__ . '/..' . '/facade/ignition/src/LogRecorder/LogRecorder.php', + 'Facade\\Ignition\\Logger\\FlareHandler' => __DIR__ . '/..' . '/facade/ignition/src/Logger/FlareHandler.php', + 'Facade\\Ignition\\Middleware\\AddDumps' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/AddDumps.php', + 'Facade\\Ignition\\Middleware\\AddEnvironmentInformation' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/AddEnvironmentInformation.php', + 'Facade\\Ignition\\Middleware\\AddGitInformation' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/AddGitInformation.php', + 'Facade\\Ignition\\Middleware\\AddLogs' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/AddLogs.php', + 'Facade\\Ignition\\Middleware\\AddQueries' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/AddQueries.php', + 'Facade\\Ignition\\Middleware\\AddSolutions' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/AddSolutions.php', + 'Facade\\Ignition\\Middleware\\CustomizeGrouping' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/CustomizeGrouping.php', + 'Facade\\Ignition\\Middleware\\SetNotifierName' => __DIR__ . '/..' . '/facade/ignition/src/Middleware/SetNotifierName.php', + 'Facade\\Ignition\\QueryRecorder\\Query' => __DIR__ . '/..' . '/facade/ignition/src/QueryRecorder/Query.php', + 'Facade\\Ignition\\QueryRecorder\\QueryRecorder' => __DIR__ . '/..' . '/facade/ignition/src/QueryRecorder/QueryRecorder.php', + 'Facade\\Ignition\\SolutionProviders\\BadMethodCallSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/BadMethodCallSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\DefaultDbNameSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/DefaultDbNameSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\IncorrectValetDbCredentialsSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/IncorrectValetDbCredentialsSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\InvalidRouteActionSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/InvalidRouteActionSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MergeConflictSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingAppKeySolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/MissingAppKeySolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingColumnSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/MissingColumnSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingImportSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/MissingImportSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\MissingPackageSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/MissingPackageSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\RouteNotDefinedSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/RouteNotDefinedSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\RunningLaravelDuskInProductionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/RunningLaravelDuskInProductionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\SolutionProviderRepository' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php', + 'Facade\\Ignition\\SolutionProviders\\TableNotFoundSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/TableNotFoundSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\UndefinedVariableSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/UndefinedVariableSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\UnknownValidationSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/UnknownValidationSolutionProvider.php', + 'Facade\\Ignition\\SolutionProviders\\ViewNotFoundSolutionProvider' => __DIR__ . '/..' . '/facade/ignition/src/SolutionProviders/ViewNotFoundSolutionProvider.php', + 'Facade\\Ignition\\Solutions\\GenerateAppKeySolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/GenerateAppKeySolution.php', + 'Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php', + 'Facade\\Ignition\\Solutions\\MissingPackageSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/MissingPackageSolution.php', + 'Facade\\Ignition\\Solutions\\RunMigrationsSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/RunMigrationsSolution.php', + 'Facade\\Ignition\\Solutions\\SolutionTransformer' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/SolutionTransformer.php', + 'Facade\\Ignition\\Solutions\\SuggestCorrectVariableNameSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/SuggestCorrectVariableNameSolution.php', + 'Facade\\Ignition\\Solutions\\SuggestImportSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/SuggestImportSolution.php', + 'Facade\\Ignition\\Solutions\\SuggestUsingCorrectDbNameSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/SuggestUsingCorrectDbNameSolution.php', + 'Facade\\Ignition\\Solutions\\UseDefaultValetDbCredentialsSolution' => __DIR__ . '/..' . '/facade/ignition/src/Solutions/UseDefaultValetDbCredentialsSolution.php', + 'Facade\\Ignition\\Support\\ComposerClassMap' => __DIR__ . '/..' . '/facade/ignition/src/Support/ComposerClassMap.php', + 'Facade\\Ignition\\Support\\FakeComposer' => __DIR__ . '/..' . '/facade/ignition/src/Support/FakeComposer.php', + 'Facade\\Ignition\\Support\\Packagist\\Package' => __DIR__ . '/..' . '/facade/ignition/src/Support/Packagist/Package.php', + 'Facade\\Ignition\\Support\\Packagist\\Packagist' => __DIR__ . '/..' . '/facade/ignition/src/Support/Packagist/Packagist.php', + 'Facade\\Ignition\\Support\\StringComparator' => __DIR__ . '/..' . '/facade/ignition/src/Support/StringComparator.php', + 'Facade\\Ignition\\Tabs\\Tab' => __DIR__ . '/..' . '/facade/ignition/src/Tabs/Tab.php', + 'Facade\\Ignition\\Views\\Compilers\\BladeSourceMapCompiler' => __DIR__ . '/..' . '/facade/ignition/src/Views/Compilers/BladeSourceMapCompiler.php', + 'Facade\\Ignition\\Views\\Concerns\\CollectsViewExceptions' => __DIR__ . '/..' . '/facade/ignition/src/Views/Concerns/CollectsViewExceptions.php', + 'Facade\\Ignition\\Views\\Engines\\CompilerEngine' => __DIR__ . '/..' . '/facade/ignition/src/Views/Engines/CompilerEngine.php', + 'Facade\\Ignition\\Views\\Engines\\PhpEngine' => __DIR__ . '/..' . '/facade/ignition/src/Views/Engines/PhpEngine.php', + 'Faker\\Calculator\\Ean' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Ean.php', + 'Faker\\Calculator\\Iban' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Iban.php', + 'Faker\\Calculator\\Inn' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Inn.php', + 'Faker\\Calculator\\Luhn' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/Luhn.php', + 'Faker\\Calculator\\TCNo' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Calculator/TCNo.php', + 'Faker\\DefaultGenerator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/DefaultGenerator.php', + 'Faker\\Documentor' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Documentor.php', + 'Faker\\Factory' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Factory.php', + 'Faker\\Generator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Generator.php', + 'Faker\\Guesser\\Name' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Guesser/Name.php', + 'Faker\\ORM\\CakePHP\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php', + 'Faker\\ORM\\CakePHP\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/CakePHP/EntityPopulator.php', + 'Faker\\ORM\\CakePHP\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/CakePHP/Populator.php', + 'Faker\\ORM\\Doctrine\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php', + 'Faker\\ORM\\Doctrine\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Doctrine/EntityPopulator.php', + 'Faker\\ORM\\Doctrine\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Doctrine/Populator.php', + 'Faker\\ORM\\Mandango\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php', + 'Faker\\ORM\\Mandango\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Mandango/EntityPopulator.php', + 'Faker\\ORM\\Mandango\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Mandango/Populator.php', + 'Faker\\ORM\\Propel2\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php', + 'Faker\\ORM\\Propel2\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel2/EntityPopulator.php', + 'Faker\\ORM\\Propel2\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel2/Populator.php', + 'Faker\\ORM\\Propel\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php', + 'Faker\\ORM\\Propel\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel/EntityPopulator.php', + 'Faker\\ORM\\Propel\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Propel/Populator.php', + 'Faker\\ORM\\Spot\\ColumnTypeGuesser' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php', + 'Faker\\ORM\\Spot\\EntityPopulator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Spot/EntityPopulator.php', + 'Faker\\ORM\\Spot\\Populator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ORM/Spot/Populator.php', + 'Faker\\Provider\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Address.php', + 'Faker\\Provider\\Barcode' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Barcode.php', + 'Faker\\Provider\\Base' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Base.php', + 'Faker\\Provider\\Biased' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Biased.php', + 'Faker\\Provider\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Color.php', + 'Faker\\Provider\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Company.php', + 'Faker\\Provider\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/DateTime.php', + 'Faker\\Provider\\File' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/File.php', + 'Faker\\Provider\\HtmlLorem' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/HtmlLorem.php', + 'Faker\\Provider\\Image' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Image.php', + 'Faker\\Provider\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Internet.php', + 'Faker\\Provider\\Lorem' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Lorem.php', + 'Faker\\Provider\\Miscellaneous' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php', + 'Faker\\Provider\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Payment.php', + 'Faker\\Provider\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Person.php', + 'Faker\\Provider\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php', + 'Faker\\Provider\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Text.php', + 'Faker\\Provider\\UserAgent' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/UserAgent.php', + 'Faker\\Provider\\Uuid' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/Uuid.php', + 'Faker\\Provider\\ar_JO\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Address.php', + 'Faker\\Provider\\ar_JO\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php', + 'Faker\\Provider\\ar_JO\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Internet.php', + 'Faker\\Provider\\ar_JO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Person.php', + 'Faker\\Provider\\ar_JO\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php', + 'Faker\\Provider\\ar_SA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php', + 'Faker\\Provider\\ar_SA\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Color.php', + 'Faker\\Provider\\ar_SA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Company.php', + 'Faker\\Provider\\ar_SA\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Internet.php', + 'Faker\\Provider\\ar_SA\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php', + 'Faker\\Provider\\ar_SA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Person.php', + 'Faker\\Provider\\ar_SA\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ar_SA/Text.php', + 'Faker\\Provider\\at_AT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/at_AT/Payment.php', + 'Faker\\Provider\\bg_BG\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Internet.php', + 'Faker\\Provider\\bg_BG\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Payment.php', + 'Faker\\Provider\\bg_BG\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/Person.php', + 'Faker\\Provider\\bg_BG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bg_BG/PhoneNumber.php', + 'Faker\\Provider\\bn_BD\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Address.php', + 'Faker\\Provider\\bn_BD\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Company.php', + 'Faker\\Provider\\bn_BD\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Person.php', + 'Faker\\Provider\\bn_BD\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bn_BD/PhoneNumber.php', + 'Faker\\Provider\\bn_BD\\Utils' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/bn_BD/Utils.php', + 'Faker\\Provider\\cs_CZ\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Address.php', + 'Faker\\Provider\\cs_CZ\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Company.php', + 'Faker\\Provider\\cs_CZ\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/DateTime.php', + 'Faker\\Provider\\cs_CZ\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Internet.php', + 'Faker\\Provider\\cs_CZ\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Payment.php', + 'Faker\\Provider\\cs_CZ\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Person.php', + 'Faker\\Provider\\cs_CZ\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php', + 'Faker\\Provider\\cs_CZ\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/cs_CZ/Text.php', + 'Faker\\Provider\\da_DK\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/da_DK/Address.php', + 'Faker\\Provider\\da_DK\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/da_DK/Company.php', + 'Faker\\Provider\\da_DK\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/da_DK/Internet.php', + 'Faker\\Provider\\da_DK\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/da_DK/Payment.php', + 'Faker\\Provider\\da_DK\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/da_DK/Person.php', + 'Faker\\Provider\\da_DK\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/da_DK/PhoneNumber.php', + 'Faker\\Provider\\de_AT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php', + 'Faker\\Provider\\de_AT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Company.php', + 'Faker\\Provider\\de_AT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Internet.php', + 'Faker\\Provider\\de_AT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Payment.php', + 'Faker\\Provider\\de_AT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php', + 'Faker\\Provider\\de_AT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/PhoneNumber.php', + 'Faker\\Provider\\de_AT\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php', + 'Faker\\Provider\\de_CH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Address.php', + 'Faker\\Provider\\de_CH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php', + 'Faker\\Provider\\de_CH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Internet.php', + 'Faker\\Provider\\de_CH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Payment.php', + 'Faker\\Provider\\de_CH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Person.php', + 'Faker\\Provider\\de_CH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/PhoneNumber.php', + 'Faker\\Provider\\de_CH\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_CH/Text.php', + 'Faker\\Provider\\de_DE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Address.php', + 'Faker\\Provider\\de_DE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Company.php', + 'Faker\\Provider\\de_DE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Internet.php', + 'Faker\\Provider\\de_DE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Payment.php', + 'Faker\\Provider\\de_DE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Person.php', + 'Faker\\Provider\\de_DE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/PhoneNumber.php', + 'Faker\\Provider\\de_DE\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/de_DE/Text.php', + 'Faker\\Provider\\el_CY\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Address.php', + 'Faker\\Provider\\el_CY\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Company.php', + 'Faker\\Provider\\el_CY\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Internet.php', + 'Faker\\Provider\\el_CY\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Payment.php', + 'Faker\\Provider\\el_CY\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/Person.php', + 'Faker\\Provider\\el_CY\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_CY/PhoneNumber.php', + 'Faker\\Provider\\el_GR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Address.php', + 'Faker\\Provider\\el_GR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Company.php', + 'Faker\\Provider\\el_GR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Payment.php', + 'Faker\\Provider\\el_GR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Person.php', + 'Faker\\Provider\\el_GR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/PhoneNumber.php', + 'Faker\\Provider\\el_GR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/el_GR/Text.php', + 'Faker\\Provider\\en_AU\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_AU/Address.php', + 'Faker\\Provider\\en_AU\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_AU/Internet.php', + 'Faker\\Provider\\en_AU\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_AU/PhoneNumber.php', + 'Faker\\Provider\\en_CA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_CA/Address.php', + 'Faker\\Provider\\en_CA\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_CA/PhoneNumber.php', + 'Faker\\Provider\\en_GB\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/Address.php', + 'Faker\\Provider\\en_GB\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/Internet.php', + 'Faker\\Provider\\en_GB\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/Payment.php', + 'Faker\\Provider\\en_GB\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/Person.php', + 'Faker\\Provider\\en_GB\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_GB/PhoneNumber.php', + 'Faker\\Provider\\en_HK\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_HK/Address.php', + 'Faker\\Provider\\en_HK\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php', + 'Faker\\Provider\\en_HK\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_HK/PhoneNumber.php', + 'Faker\\Provider\\en_IN\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/Address.php', + 'Faker\\Provider\\en_IN\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php', + 'Faker\\Provider\\en_IN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/Person.php', + 'Faker\\Provider\\en_IN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_IN/PhoneNumber.php', + 'Faker\\Provider\\en_NG\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/Address.php', + 'Faker\\Provider\\en_NG\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/Internet.php', + 'Faker\\Provider\\en_NG\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/Person.php', + 'Faker\\Provider\\en_NG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NG/PhoneNumber.php', + 'Faker\\Provider\\en_NZ\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Address.php', + 'Faker\\Provider\\en_NZ\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NZ/Internet.php', + 'Faker\\Provider\\en_NZ\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_NZ/PhoneNumber.php', + 'Faker\\Provider\\en_PH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_PH/Address.php', + 'Faker\\Provider\\en_PH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_PH/PhoneNumber.php', + 'Faker\\Provider\\en_SG\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_SG/Address.php', + 'Faker\\Provider\\en_SG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_SG/PhoneNumber.php', + 'Faker\\Provider\\en_UG\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php', + 'Faker\\Provider\\en_UG\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/Internet.php', + 'Faker\\Provider\\en_UG\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/Person.php', + 'Faker\\Provider\\en_UG\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_UG/PhoneNumber.php', + 'Faker\\Provider\\en_US\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Address.php', + 'Faker\\Provider\\en_US\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Company.php', + 'Faker\\Provider\\en_US\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php', + 'Faker\\Provider\\en_US\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Person.php', + 'Faker\\Provider\\en_US\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/PhoneNumber.php', + 'Faker\\Provider\\en_US\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_US/Text.php', + 'Faker\\Provider\\en_ZA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php', + 'Faker\\Provider\\en_ZA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php', + 'Faker\\Provider\\en_ZA\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php', + 'Faker\\Provider\\en_ZA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php', + 'Faker\\Provider\\en_ZA\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php', + 'Faker\\Provider\\es_AR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php', + 'Faker\\Provider\\es_AR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php', + 'Faker\\Provider\\es_AR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php', + 'Faker\\Provider\\es_AR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_AR/PhoneNumber.php', + 'Faker\\Provider\\es_ES\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php', + 'Faker\\Provider\\es_ES\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php', + 'Faker\\Provider\\es_ES\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Company.php', + 'Faker\\Provider\\es_ES\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Internet.php', + 'Faker\\Provider\\es_ES\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Payment.php', + 'Faker\\Provider\\es_ES\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Person.php', + 'Faker\\Provider\\es_ES\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/PhoneNumber.php', + 'Faker\\Provider\\es_ES\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_ES/Text.php', + 'Faker\\Provider\\es_PE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/Address.php', + 'Faker\\Provider\\es_PE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/Company.php', + 'Faker\\Provider\\es_PE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/Person.php', + 'Faker\\Provider\\es_PE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_PE/PhoneNumber.php', + 'Faker\\Provider\\es_VE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/Address.php', + 'Faker\\Provider\\es_VE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/Company.php', + 'Faker\\Provider\\es_VE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/Internet.php', + 'Faker\\Provider\\es_VE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/Person.php', + 'Faker\\Provider\\es_VE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/es_VE/PhoneNumber.php', + 'Faker\\Provider\\et_EE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php', + 'Faker\\Provider\\fa_IR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php', + 'Faker\\Provider\\fa_IR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php', + 'Faker\\Provider\\fa_IR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Internet.php', + 'Faker\\Provider\\fa_IR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Person.php', + 'Faker\\Provider\\fa_IR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php', + 'Faker\\Provider\\fa_IR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fa_IR/Text.php', + 'Faker\\Provider\\fi_FI\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Address.php', + 'Faker\\Provider\\fi_FI\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Company.php', + 'Faker\\Provider\\fi_FI\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Internet.php', + 'Faker\\Provider\\fi_FI\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Payment.php', + 'Faker\\Provider\\fi_FI\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/Person.php', + 'Faker\\Provider\\fi_FI\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php', + 'Faker\\Provider\\fr_BE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php', + 'Faker\\Provider\\fr_BE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php', + 'Faker\\Provider\\fr_BE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Internet.php', + 'Faker\\Provider\\fr_BE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php', + 'Faker\\Provider\\fr_BE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/Person.php', + 'Faker\\Provider\\fr_BE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_BE/PhoneNumber.php', + 'Faker\\Provider\\fr_CA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php', + 'Faker\\Provider\\fr_CA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php', + 'Faker\\Provider\\fr_CA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Person.php', + 'Faker\\Provider\\fr_CA\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CA/Text.php', + 'Faker\\Provider\\fr_CH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Address.php', + 'Faker\\Provider\\fr_CH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php', + 'Faker\\Provider\\fr_CH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Internet.php', + 'Faker\\Provider\\fr_CH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Payment.php', + 'Faker\\Provider\\fr_CH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Person.php', + 'Faker\\Provider\\fr_CH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/PhoneNumber.php', + 'Faker\\Provider\\fr_CH\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_CH/Text.php', + 'Faker\\Provider\\fr_FR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Address.php', + 'Faker\\Provider\\fr_FR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php', + 'Faker\\Provider\\fr_FR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Internet.php', + 'Faker\\Provider\\fr_FR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php', + 'Faker\\Provider\\fr_FR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php', + 'Faker\\Provider\\fr_FR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php', + 'Faker\\Provider\\fr_FR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/fr_FR/Text.php', + 'Faker\\Provider\\he_IL\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php', + 'Faker\\Provider\\he_IL\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Company.php', + 'Faker\\Provider\\he_IL\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Payment.php', + 'Faker\\Provider\\he_IL\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/Person.php', + 'Faker\\Provider\\he_IL\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/he_IL/PhoneNumber.php', + 'Faker\\Provider\\hr_HR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Address.php', + 'Faker\\Provider\\hr_HR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Company.php', + 'Faker\\Provider\\hr_HR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Payment.php', + 'Faker\\Provider\\hr_HR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/Person.php', + 'Faker\\Provider\\hr_HR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hr_HR/PhoneNumber.php', + 'Faker\\Provider\\hu_HU\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Address.php', + 'Faker\\Provider\\hu_HU\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Company.php', + 'Faker\\Provider\\hu_HU\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php', + 'Faker\\Provider\\hu_HU\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Person.php', + 'Faker\\Provider\\hu_HU\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/PhoneNumber.php', + 'Faker\\Provider\\hu_HU\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php', + 'Faker\\Provider\\hy_AM\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Address.php', + 'Faker\\Provider\\hy_AM\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Color.php', + 'Faker\\Provider\\hy_AM\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Company.php', + 'Faker\\Provider\\hy_AM\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Internet.php', + 'Faker\\Provider\\hy_AM\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/Person.php', + 'Faker\\Provider\\hy_AM\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/hy_AM/PhoneNumber.php', + 'Faker\\Provider\\id_ID\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Address.php', + 'Faker\\Provider\\id_ID\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php', + 'Faker\\Provider\\id_ID\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Company.php', + 'Faker\\Provider\\id_ID\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Internet.php', + 'Faker\\Provider\\id_ID\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/Person.php', + 'Faker\\Provider\\id_ID\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/id_ID/PhoneNumber.php', + 'Faker\\Provider\\is_IS\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Address.php', + 'Faker\\Provider\\is_IS\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Company.php', + 'Faker\\Provider\\is_IS\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Internet.php', + 'Faker\\Provider\\is_IS\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Payment.php', + 'Faker\\Provider\\is_IS\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php', + 'Faker\\Provider\\is_IS\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/is_IS/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php', + 'Faker\\Provider\\it_CH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php', + 'Faker\\Provider\\it_CH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Internet.php', + 'Faker\\Provider\\it_CH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Payment.php', + 'Faker\\Provider\\it_CH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Person.php', + 'Faker\\Provider\\it_CH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/PhoneNumber.php', + 'Faker\\Provider\\it_CH\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_CH/Text.php', + 'Faker\\Provider\\it_IT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Address.php', + 'Faker\\Provider\\it_IT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Company.php', + 'Faker\\Provider\\it_IT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Internet.php', + 'Faker\\Provider\\it_IT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Payment.php', + 'Faker\\Provider\\it_IT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Person.php', + 'Faker\\Provider\\it_IT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/PhoneNumber.php', + 'Faker\\Provider\\it_IT\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/it_IT/Text.php', + 'Faker\\Provider\\ja_JP\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Address.php', + 'Faker\\Provider\\ja_JP\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Company.php', + 'Faker\\Provider\\ja_JP\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Internet.php', + 'Faker\\Provider\\ja_JP\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Person.php', + 'Faker\\Provider\\ja_JP\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php', + 'Faker\\Provider\\ja_JP\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php', + 'Faker\\Provider\\ka_GE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Address.php', + 'Faker\\Provider\\ka_GE\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Color.php', + 'Faker\\Provider\\ka_GE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Company.php', + 'Faker\\Provider\\ka_GE\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php', + 'Faker\\Provider\\ka_GE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php', + 'Faker\\Provider\\ka_GE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Payment.php', + 'Faker\\Provider\\ka_GE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Person.php', + 'Faker\\Provider\\ka_GE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/PhoneNumber.php', + 'Faker\\Provider\\ka_GE\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ka_GE/Text.php', + 'Faker\\Provider\\kk_KZ\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Address.php', + 'Faker\\Provider\\kk_KZ\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Color.php', + 'Faker\\Provider\\kk_KZ\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php', + 'Faker\\Provider\\kk_KZ\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Internet.php', + 'Faker\\Provider\\kk_KZ\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php', + 'Faker\\Provider\\kk_KZ\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php', + 'Faker\\Provider\\kk_KZ\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/PhoneNumber.php', + 'Faker\\Provider\\kk_KZ\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/kk_KZ/Text.php', + 'Faker\\Provider\\ko_KR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php', + 'Faker\\Provider\\ko_KR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Company.php', + 'Faker\\Provider\\ko_KR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php', + 'Faker\\Provider\\ko_KR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php', + 'Faker\\Provider\\ko_KR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php', + 'Faker\\Provider\\ko_KR\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php', + 'Faker\\Provider\\lt_LT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php', + 'Faker\\Provider\\lt_LT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php', + 'Faker\\Provider\\lt_LT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Internet.php', + 'Faker\\Provider\\lt_LT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Payment.php', + 'Faker\\Provider\\lt_LT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/Person.php', + 'Faker\\Provider\\lt_LT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php', + 'Faker\\Provider\\lv_LV\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Address.php', + 'Faker\\Provider\\lv_LV\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Color.php', + 'Faker\\Provider\\lv_LV\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Internet.php', + 'Faker\\Provider\\lv_LV\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Payment.php', + 'Faker\\Provider\\lv_LV\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/Person.php', + 'Faker\\Provider\\lv_LV\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php', + 'Faker\\Provider\\me_ME\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php', + 'Faker\\Provider\\me_ME\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/Company.php', + 'Faker\\Provider\\me_ME\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/Payment.php', + 'Faker\\Provider\\me_ME\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/Person.php', + 'Faker\\Provider\\me_ME\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/me_ME/PhoneNumber.php', + 'Faker\\Provider\\mn_MN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php', + 'Faker\\Provider\\mn_MN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php', + 'Faker\\Provider\\ms_MY\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Address.php', + 'Faker\\Provider\\ms_MY\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php', + 'Faker\\Provider\\ms_MY\\Miscellaneous' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Miscellaneous.php', + 'Faker\\Provider\\ms_MY\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php', + 'Faker\\Provider\\ms_MY\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php', + 'Faker\\Provider\\ms_MY\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php', + 'Faker\\Provider\\nb_NO\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php', + 'Faker\\Provider\\nb_NO\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Company.php', + 'Faker\\Provider\\nb_NO\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Payment.php', + 'Faker\\Provider\\nb_NO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/Person.php', + 'Faker\\Provider\\nb_NO\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php', + 'Faker\\Provider\\ne_NP\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php', + 'Faker\\Provider\\ne_NP\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Internet.php', + 'Faker\\Provider\\ne_NP\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php', + 'Faker\\Provider\\ne_NP\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ne_NP/PhoneNumber.php', + 'Faker\\Provider\\nl_BE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php', + 'Faker\\Provider\\nl_BE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Company.php', + 'Faker\\Provider\\nl_BE\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Internet.php', + 'Faker\\Provider\\nl_BE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php', + 'Faker\\Provider\\nl_BE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php', + 'Faker\\Provider\\nl_BE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_BE/PhoneNumber.php', + 'Faker\\Provider\\nl_NL\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Address.php', + 'Faker\\Provider\\nl_NL\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Color.php', + 'Faker\\Provider\\nl_NL\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Company.php', + 'Faker\\Provider\\nl_NL\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Internet.php', + 'Faker\\Provider\\nl_NL\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Payment.php', + 'Faker\\Provider\\nl_NL\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php', + 'Faker\\Provider\\nl_NL\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/PhoneNumber.php', + 'Faker\\Provider\\nl_NL\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php', + 'Faker\\Provider\\pl_PL\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Address.php', + 'Faker\\Provider\\pl_PL\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Company.php', + 'Faker\\Provider\\pl_PL\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Internet.php', + 'Faker\\Provider\\pl_PL\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Payment.php', + 'Faker\\Provider\\pl_PL\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php', + 'Faker\\Provider\\pl_PL\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/PhoneNumber.php', + 'Faker\\Provider\\pl_PL\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php', + 'Faker\\Provider\\pt_BR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php', + 'Faker\\Provider\\pt_BR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php', + 'Faker\\Provider\\pt_BR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Internet.php', + 'Faker\\Provider\\pt_BR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php', + 'Faker\\Provider\\pt_BR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/Person.php', + 'Faker\\Provider\\pt_BR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php', + 'Faker\\Provider\\pt_PT\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php', + 'Faker\\Provider\\pt_PT\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php', + 'Faker\\Provider\\pt_PT\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Internet.php', + 'Faker\\Provider\\pt_PT\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Payment.php', + 'Faker\\Provider\\pt_PT\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/Person.php', + 'Faker\\Provider\\pt_PT\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/pt_PT/PhoneNumber.php', + 'Faker\\Provider\\ro_MD\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Address.php', + 'Faker\\Provider\\ro_MD\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Payment.php', + 'Faker\\Provider\\ro_MD\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Person.php', + 'Faker\\Provider\\ro_MD\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/PhoneNumber.php', + 'Faker\\Provider\\ro_MD\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_MD/Text.php', + 'Faker\\Provider\\ro_RO\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Address.php', + 'Faker\\Provider\\ro_RO\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Payment.php', + 'Faker\\Provider\\ro_RO\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Person.php', + 'Faker\\Provider\\ro_RO\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php', + 'Faker\\Provider\\ro_RO\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php', + 'Faker\\Provider\\ru_RU\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Address.php', + 'Faker\\Provider\\ru_RU\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Color.php', + 'Faker\\Provider\\ru_RU\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Company.php', + 'Faker\\Provider\\ru_RU\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Internet.php', + 'Faker\\Provider\\ru_RU\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Payment.php', + 'Faker\\Provider\\ru_RU\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Person.php', + 'Faker\\Provider\\ru_RU\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/PhoneNumber.php', + 'Faker\\Provider\\ru_RU\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php', + 'Faker\\Provider\\sk_SK\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Address.php', + 'Faker\\Provider\\sk_SK\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php', + 'Faker\\Provider\\sk_SK\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Internet.php', + 'Faker\\Provider\\sk_SK\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Payment.php', + 'Faker\\Provider\\sk_SK\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php', + 'Faker\\Provider\\sk_SK\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sk_SK/PhoneNumber.php', + 'Faker\\Provider\\sl_SI\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php', + 'Faker\\Provider\\sl_SI\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php', + 'Faker\\Provider\\sl_SI\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Internet.php', + 'Faker\\Provider\\sl_SI\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Payment.php', + 'Faker\\Provider\\sl_SI\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/Person.php', + 'Faker\\Provider\\sl_SI\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sl_SI/PhoneNumber.php', + 'Faker\\Provider\\sr_Cyrl_RS\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Address.php', + 'Faker\\Provider\\sr_Cyrl_RS\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Payment.php', + 'Faker\\Provider\\sr_Cyrl_RS\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_Cyrl_RS/Person.php', + 'Faker\\Provider\\sr_Latn_RS\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Address.php', + 'Faker\\Provider\\sr_Latn_RS\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Payment.php', + 'Faker\\Provider\\sr_Latn_RS\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_Latn_RS/Person.php', + 'Faker\\Provider\\sr_RS\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Address.php', + 'Faker\\Provider\\sr_RS\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Payment.php', + 'Faker\\Provider\\sr_RS\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sr_RS/Person.php', + 'Faker\\Provider\\sv_SE\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Address.php', + 'Faker\\Provider\\sv_SE\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Company.php', + 'Faker\\Provider\\sv_SE\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Payment.php', + 'Faker\\Provider\\sv_SE\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/Person.php', + 'Faker\\Provider\\sv_SE\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/sv_SE/PhoneNumber.php', + 'Faker\\Provider\\th_TH\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Address.php', + 'Faker\\Provider\\th_TH\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Color.php', + 'Faker\\Provider\\th_TH\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Company.php', + 'Faker\\Provider\\th_TH\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Internet.php', + 'Faker\\Provider\\th_TH\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Payment.php', + 'Faker\\Provider\\th_TH\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/Person.php', + 'Faker\\Provider\\th_TH\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/th_TH/PhoneNumber.php', + 'Faker\\Provider\\tr_TR\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Address.php', + 'Faker\\Provider\\tr_TR\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Color.php', + 'Faker\\Provider\\tr_TR\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Company.php', + 'Faker\\Provider\\tr_TR\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/DateTime.php', + 'Faker\\Provider\\tr_TR\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Internet.php', + 'Faker\\Provider\\tr_TR\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Payment.php', + 'Faker\\Provider\\tr_TR\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/Person.php', + 'Faker\\Provider\\tr_TR\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/tr_TR/PhoneNumber.php', + 'Faker\\Provider\\uk_UA\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Address.php', + 'Faker\\Provider\\uk_UA\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Color.php', + 'Faker\\Provider\\uk_UA\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Company.php', + 'Faker\\Provider\\uk_UA\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Internet.php', + 'Faker\\Provider\\uk_UA\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Payment.php', + 'Faker\\Provider\\uk_UA\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Person.php', + 'Faker\\Provider\\uk_UA\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php', + 'Faker\\Provider\\uk_UA\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php', + 'Faker\\Provider\\vi_VN\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php', + 'Faker\\Provider\\vi_VN\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Color.php', + 'Faker\\Provider\\vi_VN\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Internet.php', + 'Faker\\Provider\\vi_VN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/Person.php', + 'Faker\\Provider\\vi_VN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php', + 'Faker\\Provider\\zh_CN\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php', + 'Faker\\Provider\\zh_CN\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php', + 'Faker\\Provider\\zh_CN\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Company.php', + 'Faker\\Provider\\zh_CN\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/DateTime.php', + 'Faker\\Provider\\zh_CN\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php', + 'Faker\\Provider\\zh_CN\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php', + 'Faker\\Provider\\zh_CN\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/Person.php', + 'Faker\\Provider\\zh_CN\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_CN/PhoneNumber.php', + 'Faker\\Provider\\zh_TW\\Address' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Address.php', + 'Faker\\Provider\\zh_TW\\Color' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Color.php', + 'Faker\\Provider\\zh_TW\\Company' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php', + 'Faker\\Provider\\zh_TW\\DateTime' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/DateTime.php', + 'Faker\\Provider\\zh_TW\\Internet' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Internet.php', + 'Faker\\Provider\\zh_TW\\Payment' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Payment.php', + 'Faker\\Provider\\zh_TW\\Person' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php', + 'Faker\\Provider\\zh_TW\\PhoneNumber' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/PhoneNumber.php', + 'Faker\\Provider\\zh_TW\\Text' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php', + 'Faker\\UniqueGenerator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/UniqueGenerator.php', + 'Faker\\ValidGenerator' => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker/ValidGenerator.php', + 'Fideloper\\Proxy\\TrustProxies' => __DIR__ . '/..' . '/fideloper/proxy/src/TrustProxies.php', + 'Fideloper\\Proxy\\TrustedProxyServiceProvider' => __DIR__ . '/..' . '/fideloper/proxy/src/TrustedProxyServiceProvider.php', + 'Fruitcake\\Cors\\CorsServiceProvider' => __DIR__ . '/..' . '/fruitcake/laravel-cors/src/CorsServiceProvider.php', + 'Fruitcake\\Cors\\HandleCors' => __DIR__ . '/..' . '/fruitcake/laravel-cors/src/HandleCors.php', + 'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php', + 'GuzzleHttp\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php', + 'GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', + 'GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', + 'GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', + 'GuzzleHttp\\Cookie\\SessionCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php', + 'GuzzleHttp\\Cookie\\SetCookie' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php', + 'GuzzleHttp\\Exception\\BadResponseException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php', + 'GuzzleHttp\\Exception\\ClientException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ClientException.php', + 'GuzzleHttp\\Exception\\ConnectException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ConnectException.php', + 'GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', + 'GuzzleHttp\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', + 'GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php', + 'GuzzleHttp\\Exception\\SeekException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/SeekException.php', + 'GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php', + 'GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', + 'GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php', + 'GuzzleHttp\\HandlerStack' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HandlerStack.php', + 'GuzzleHttp\\Handler\\CurlFactory' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php', + 'GuzzleHttp\\Handler\\CurlFactoryInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php', + 'GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', + 'GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', + 'GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', + 'GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', + 'GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php', + 'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', + 'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php', + 'GuzzleHttp\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php', + 'GuzzleHttp\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php', + 'GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', + 'GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php', + 'GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php', + 'GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php', + 'GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php', + 'GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php', + 'GuzzleHttp\\Promise\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php', + 'GuzzleHttp\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromiseInterface.php', + 'GuzzleHttp\\Promise\\PromisorInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromisorInterface.php', + 'GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php', + 'GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php', + 'GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php', + 'GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php', + 'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php', + 'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php', + 'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php', + 'GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php', + 'GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php', + 'GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php', + 'GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php', + 'GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php', + 'GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php', + 'GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php', + 'GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php', + 'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php', + 'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php', + 'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php', + 'GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php', + 'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php', + 'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php', + 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', + 'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php', + 'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php', + 'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php', + 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php', + 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php', + 'GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php', + 'GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php', + 'GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php', + 'GuzzleHttp\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php', + 'GuzzleHttp\\UriTemplate' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/UriTemplate.php', + 'GuzzleHttp\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php', + 'Hamcrest\\Arrays\\IsArray' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArray.php', + 'Hamcrest\\Arrays\\IsArrayContaining' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContaining.php', + 'Hamcrest\\Arrays\\IsArrayContainingInAnyOrder' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInAnyOrder.php', + 'Hamcrest\\Arrays\\IsArrayContainingInOrder' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingInOrder.php', + 'Hamcrest\\Arrays\\IsArrayContainingKey' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKey.php', + 'Hamcrest\\Arrays\\IsArrayContainingKeyValuePair' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayContainingKeyValuePair.php', + 'Hamcrest\\Arrays\\IsArrayWithSize' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/IsArrayWithSize.php', + 'Hamcrest\\Arrays\\MatchingOnce' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/MatchingOnce.php', + 'Hamcrest\\Arrays\\SeriesMatchingOnce' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Arrays/SeriesMatchingOnce.php', + 'Hamcrest\\AssertionError' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/AssertionError.php', + 'Hamcrest\\BaseDescription' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseDescription.php', + 'Hamcrest\\BaseMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/BaseMatcher.php', + 'Hamcrest\\Collection\\IsEmptyTraversable' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsEmptyTraversable.php', + 'Hamcrest\\Collection\\IsTraversableWithSize' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Collection/IsTraversableWithSize.php', + 'Hamcrest\\Core\\AllOf' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AllOf.php', + 'Hamcrest\\Core\\AnyOf' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/AnyOf.php', + 'Hamcrest\\Core\\CombinableMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/CombinableMatcher.php', + 'Hamcrest\\Core\\DescribedAs' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/DescribedAs.php', + 'Hamcrest\\Core\\Every' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Every.php', + 'Hamcrest\\Core\\HasToString' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/HasToString.php', + 'Hamcrest\\Core\\Is' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Is.php', + 'Hamcrest\\Core\\IsAnything' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsAnything.php', + 'Hamcrest\\Core\\IsCollectionContaining' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsCollectionContaining.php', + 'Hamcrest\\Core\\IsEqual' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsEqual.php', + 'Hamcrest\\Core\\IsIdentical' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsIdentical.php', + 'Hamcrest\\Core\\IsInstanceOf' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsInstanceOf.php', + 'Hamcrest\\Core\\IsNot' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNot.php', + 'Hamcrest\\Core\\IsNull' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsNull.php', + 'Hamcrest\\Core\\IsSame' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsSame.php', + 'Hamcrest\\Core\\IsTypeOf' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/IsTypeOf.php', + 'Hamcrest\\Core\\Set' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/Set.php', + 'Hamcrest\\Core\\ShortcutCombination' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Core/ShortcutCombination.php', + 'Hamcrest\\Description' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Description.php', + 'Hamcrest\\DiagnosingMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/DiagnosingMatcher.php', + 'Hamcrest\\FeatureMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/FeatureMatcher.php', + 'Hamcrest\\Internal\\SelfDescribingValue' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Internal/SelfDescribingValue.php', + 'Hamcrest\\Matcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Matcher.php', + 'Hamcrest\\MatcherAssert' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/MatcherAssert.php', + 'Hamcrest\\Matchers' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Matchers.php', + 'Hamcrest\\NullDescription' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/NullDescription.php', + 'Hamcrest\\Number\\IsCloseTo' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Number/IsCloseTo.php', + 'Hamcrest\\Number\\OrderingComparison' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Number/OrderingComparison.php', + 'Hamcrest\\SelfDescribing' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/SelfDescribing.php', + 'Hamcrest\\StringDescription' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/StringDescription.php', + 'Hamcrest\\Text\\IsEmptyString' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEmptyString.php', + 'Hamcrest\\Text\\IsEqualIgnoringCase' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEqualIgnoringCase.php', + 'Hamcrest\\Text\\IsEqualIgnoringWhiteSpace' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/IsEqualIgnoringWhiteSpace.php', + 'Hamcrest\\Text\\MatchesPattern' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/MatchesPattern.php', + 'Hamcrest\\Text\\StringContains' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContains.php', + 'Hamcrest\\Text\\StringContainsIgnoringCase' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContainsIgnoringCase.php', + 'Hamcrest\\Text\\StringContainsInOrder' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringContainsInOrder.php', + 'Hamcrest\\Text\\StringEndsWith' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringEndsWith.php', + 'Hamcrest\\Text\\StringStartsWith' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/StringStartsWith.php', + 'Hamcrest\\Text\\SubstringMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Text/SubstringMatcher.php', + 'Hamcrest\\TypeSafeDiagnosingMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/TypeSafeDiagnosingMatcher.php', + 'Hamcrest\\TypeSafeMatcher' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/TypeSafeMatcher.php', + 'Hamcrest\\Type\\IsArray' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsArray.php', + 'Hamcrest\\Type\\IsBoolean' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsBoolean.php', + 'Hamcrest\\Type\\IsCallable' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsCallable.php', + 'Hamcrest\\Type\\IsDouble' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsDouble.php', + 'Hamcrest\\Type\\IsInteger' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsInteger.php', + 'Hamcrest\\Type\\IsNumeric' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsNumeric.php', + 'Hamcrest\\Type\\IsObject' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsObject.php', + 'Hamcrest\\Type\\IsResource' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsResource.php', + 'Hamcrest\\Type\\IsScalar' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsScalar.php', + 'Hamcrest\\Type\\IsString' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsString.php', + 'Hamcrest\\Util' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Util.php', + 'Hamcrest\\Xml\\HasXPath' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Xml/HasXPath.php', + 'Highlight\\Autoloader' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/Autoloader.php', + 'Highlight\\HighlightResult' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/HighlightResult.php', + 'Highlight\\Highlighter' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/Highlighter.php', + 'Highlight\\JsonRef' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/JsonRef.php', + 'Highlight\\Language' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/Language.php', + 'Highlight\\Mode' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/Mode.php', + 'Highlight\\ModeDeprecations' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/ModeDeprecations.php', + 'Highlight\\RegEx' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/RegEx.php', + 'Highlight\\RegExMatch' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/RegExMatch.php', + 'Highlight\\RegExUtils' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/RegExUtils.php', + 'Highlight\\Terminators' => __DIR__ . '/..' . '/scrivo/highlight.php/Highlight/Terminators.php', + 'Illuminate\\Auth\\Access\\AuthorizationException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/AuthorizationException.php', + 'Illuminate\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/Gate.php', + 'Illuminate\\Auth\\Access\\HandlesAuthorization' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/HandlesAuthorization.php', + 'Illuminate\\Auth\\Access\\Response' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/Response.php', + 'Illuminate\\Auth\\AuthManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/AuthManager.php', + 'Illuminate\\Auth\\AuthServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php', + 'Illuminate\\Auth\\Authenticatable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Authenticatable.php', + 'Illuminate\\Auth\\AuthenticationException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/AuthenticationException.php', + 'Illuminate\\Auth\\Console\\ClearResetsCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Console/ClearResetsCommand.php', + 'Illuminate\\Auth\\CreatesUserProviders' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/CreatesUserProviders.php', + 'Illuminate\\Auth\\DatabaseUserProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php', + 'Illuminate\\Auth\\EloquentUserProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php', + 'Illuminate\\Auth\\Events\\Attempting' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Attempting.php', + 'Illuminate\\Auth\\Events\\Authenticated' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Authenticated.php', + 'Illuminate\\Auth\\Events\\CurrentDeviceLogout' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/CurrentDeviceLogout.php', + 'Illuminate\\Auth\\Events\\Failed' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Failed.php', + 'Illuminate\\Auth\\Events\\Lockout' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Lockout.php', + 'Illuminate\\Auth\\Events\\Login' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Login.php', + 'Illuminate\\Auth\\Events\\Logout' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Logout.php', + 'Illuminate\\Auth\\Events\\OtherDeviceLogout' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/OtherDeviceLogout.php', + 'Illuminate\\Auth\\Events\\PasswordReset' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/PasswordReset.php', + 'Illuminate\\Auth\\Events\\Registered' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Registered.php', + 'Illuminate\\Auth\\Events\\Validated' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Validated.php', + 'Illuminate\\Auth\\Events\\Verified' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Events/Verified.php', + 'Illuminate\\Auth\\GenericUser' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/GenericUser.php', + 'Illuminate\\Auth\\GuardHelpers' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/GuardHelpers.php', + 'Illuminate\\Auth\\Listeners\\SendEmailVerificationNotification' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php', + 'Illuminate\\Auth\\Middleware\\Authenticate' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php', + 'Illuminate\\Auth\\Middleware\\AuthenticateWithBasicAuth' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Middleware/AuthenticateWithBasicAuth.php', + 'Illuminate\\Auth\\Middleware\\Authorize' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php', + 'Illuminate\\Auth\\Middleware\\EnsureEmailIsVerified' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Middleware/EnsureEmailIsVerified.php', + 'Illuminate\\Auth\\Middleware\\RequirePassword' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Middleware/RequirePassword.php', + 'Illuminate\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php', + 'Illuminate\\Auth\\Notifications\\ResetPassword' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php', + 'Illuminate\\Auth\\Notifications\\VerifyEmail' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php', + 'Illuminate\\Auth\\Passwords\\CanResetPassword' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Passwords/CanResetPassword.php', + 'Illuminate\\Auth\\Passwords\\DatabaseTokenRepository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php', + 'Illuminate\\Auth\\Passwords\\PasswordBroker' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php', + 'Illuminate\\Auth\\Passwords\\PasswordBrokerManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php', + 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php', + 'Illuminate\\Auth\\Passwords\\TokenRepositoryInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Passwords/TokenRepositoryInterface.php', + 'Illuminate\\Auth\\Recaller' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Recaller.php', + 'Illuminate\\Auth\\RequestGuard' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/RequestGuard.php', + 'Illuminate\\Auth\\SessionGuard' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/SessionGuard.php', + 'Illuminate\\Auth\\TokenGuard' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/TokenGuard.php', + 'Illuminate\\Broadcasting\\BroadcastController' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastController.php', + 'Illuminate\\Broadcasting\\BroadcastEvent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php', + 'Illuminate\\Broadcasting\\BroadcastException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastException.php', + 'Illuminate\\Broadcasting\\BroadcastManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php', + 'Illuminate\\Broadcasting\\BroadcastServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/BroadcastServiceProvider.php', + 'Illuminate\\Broadcasting\\Broadcasters\\Broadcaster' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\LogBroadcaster' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/LogBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\NullBroadcaster' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/NullBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\PusherBroadcaster' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\RedisBroadcaster' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php', + 'Illuminate\\Broadcasting\\Broadcasters\\UsePusherChannelConventions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/UsePusherChannelConventions.php', + 'Illuminate\\Broadcasting\\Channel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/Channel.php', + 'Illuminate\\Broadcasting\\EncryptedPrivateChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/EncryptedPrivateChannel.php', + 'Illuminate\\Broadcasting\\InteractsWithSockets' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/InteractsWithSockets.php', + 'Illuminate\\Broadcasting\\PendingBroadcast' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/PendingBroadcast.php', + 'Illuminate\\Broadcasting\\PresenceChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/PresenceChannel.php', + 'Illuminate\\Broadcasting\\PrivateChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Broadcasting/PrivateChannel.php', + 'Illuminate\\Bus\\BusServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Bus/BusServiceProvider.php', + 'Illuminate\\Bus\\Dispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Bus/Dispatcher.php', + 'Illuminate\\Bus\\Queueable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Bus/Queueable.php', + 'Illuminate\\Cache\\ApcStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/ApcStore.php', + 'Illuminate\\Cache\\ApcWrapper' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/ApcWrapper.php', + 'Illuminate\\Cache\\ArrayLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/ArrayLock.php', + 'Illuminate\\Cache\\ArrayStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/ArrayStore.php', + 'Illuminate\\Cache\\CacheManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/CacheManager.php', + 'Illuminate\\Cache\\CacheServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php', + 'Illuminate\\Cache\\Console\\CacheTableCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Console/CacheTableCommand.php', + 'Illuminate\\Cache\\Console\\ClearCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php', + 'Illuminate\\Cache\\Console\\ForgetCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Console/ForgetCommand.php', + 'Illuminate\\Cache\\DatabaseLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/DatabaseLock.php', + 'Illuminate\\Cache\\DatabaseStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/DatabaseStore.php', + 'Illuminate\\Cache\\DynamoDbLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/DynamoDbLock.php', + 'Illuminate\\Cache\\DynamoDbStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/DynamoDbStore.php', + 'Illuminate\\Cache\\Events\\CacheEvent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/CacheEvent.php', + 'Illuminate\\Cache\\Events\\CacheHit' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/CacheHit.php', + 'Illuminate\\Cache\\Events\\CacheMissed' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/CacheMissed.php', + 'Illuminate\\Cache\\Events\\KeyForgotten' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/KeyForgotten.php', + 'Illuminate\\Cache\\Events\\KeyWritten' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/KeyWritten.php', + 'Illuminate\\Cache\\FileStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/FileStore.php', + 'Illuminate\\Cache\\Lock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Lock.php', + 'Illuminate\\Cache\\LuaScripts' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/LuaScripts.php', + 'Illuminate\\Cache\\MemcachedConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php', + 'Illuminate\\Cache\\MemcachedLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/MemcachedLock.php', + 'Illuminate\\Cache\\MemcachedStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/MemcachedStore.php', + 'Illuminate\\Cache\\NullStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/NullStore.php', + 'Illuminate\\Cache\\RateLimiter' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/RateLimiter.php', + 'Illuminate\\Cache\\RedisLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/RedisLock.php', + 'Illuminate\\Cache\\RedisStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/RedisStore.php', + 'Illuminate\\Cache\\RedisTaggedCache' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php', + 'Illuminate\\Cache\\Repository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Repository.php', + 'Illuminate\\Cache\\RetrievesMultipleKeys' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/RetrievesMultipleKeys.php', + 'Illuminate\\Cache\\TagSet' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/TagSet.php', + 'Illuminate\\Cache\\TaggableStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/TaggableStore.php', + 'Illuminate\\Cache\\TaggedCache' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/TaggedCache.php', + 'Illuminate\\Config\\Repository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Config/Repository.php', + 'Illuminate\\Console\\Application' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Application.php', + 'Illuminate\\Console\\Command' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Command.php', + 'Illuminate\\Console\\Concerns\\CallsCommands' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php', + 'Illuminate\\Console\\Concerns\\HasParameters' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Concerns/HasParameters.php', + 'Illuminate\\Console\\Concerns\\InteractsWithIO' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Concerns/InteractsWithIO.php', + 'Illuminate\\Console\\ConfirmableTrait' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/ConfirmableTrait.php', + 'Illuminate\\Console\\Events\\ArtisanStarting' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Events/ArtisanStarting.php', + 'Illuminate\\Console\\Events\\CommandFinished' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Events/CommandFinished.php', + 'Illuminate\\Console\\Events\\CommandStarting' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Events/CommandStarting.php', + 'Illuminate\\Console\\Events\\ScheduledTaskFinished' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskFinished.php', + 'Illuminate\\Console\\Events\\ScheduledTaskSkipped' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskSkipped.php', + 'Illuminate\\Console\\Events\\ScheduledTaskStarting' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Events/ScheduledTaskStarting.php', + 'Illuminate\\Console\\GeneratorCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/GeneratorCommand.php', + 'Illuminate\\Console\\OutputStyle' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/OutputStyle.php', + 'Illuminate\\Console\\Parser' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Parser.php', + 'Illuminate\\Console\\Scheduling\\CacheAware' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/CacheAware.php', + 'Illuminate\\Console\\Scheduling\\CacheEventMutex' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/CacheEventMutex.php', + 'Illuminate\\Console\\Scheduling\\CacheSchedulingMutex' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php', + 'Illuminate\\Console\\Scheduling\\CallbackEvent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php', + 'Illuminate\\Console\\Scheduling\\CommandBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/CommandBuilder.php', + 'Illuminate\\Console\\Scheduling\\Event' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/Event.php', + 'Illuminate\\Console\\Scheduling\\EventMutex' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/EventMutex.php', + 'Illuminate\\Console\\Scheduling\\ManagesFrequencies' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/ManagesFrequencies.php', + 'Illuminate\\Console\\Scheduling\\Schedule' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php', + 'Illuminate\\Console\\Scheduling\\ScheduleFinishCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleFinishCommand.php', + 'Illuminate\\Console\\Scheduling\\ScheduleRunCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php', + 'Illuminate\\Console\\Scheduling\\SchedulingMutex' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Console/Scheduling/SchedulingMutex.php', + 'Illuminate\\Container\\BoundMethod' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Container/BoundMethod.php', + 'Illuminate\\Container\\Container' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Container/Container.php', + 'Illuminate\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Container/ContextualBindingBuilder.php', + 'Illuminate\\Container\\EntryNotFoundException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Container/EntryNotFoundException.php', + 'Illuminate\\Container\\RewindableGenerator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Container/RewindableGenerator.php', + 'Illuminate\\Container\\Util' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Container/Util.php', + 'Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/Access/Authorizable.php', + 'Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/Access/Gate.php', + 'Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/Authenticatable.php', + 'Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/CanResetPassword.php', + 'Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/Factory.php', + 'Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/Guard.php', + 'Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/Middleware/AuthenticatesRequests.php', + 'Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/MustVerifyEmail.php', + 'Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/PasswordBroker.php', + 'Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/PasswordBrokerFactory.php', + 'Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/StatefulGuard.php', + 'Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/SupportsBasicAuth.php', + 'Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Auth/UserProvider.php', + 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/Broadcaster.php', + 'Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcastNow.php', + 'Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php', + 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Bus/QueueingDispatcher.php', + 'Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cache/Factory.php', + 'Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cache/Lock.php', + 'Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cache/LockProvider.php', + 'Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cache/LockTimeoutException.php', + 'Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cache/Repository.php', + 'Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cache/Store.php', + 'Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Config/Repository.php', + 'Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Console/Application.php', + 'Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php', + 'Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Container/BindingResolutionException.php', + 'Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Container/Container.php', + 'Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Container/ContextualBindingBuilder.php', + 'Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php', + 'Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Cookie/QueueingFactory.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/Castable.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/CastsAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Database/Eloquent/CastsInboundAttributes.php', + 'Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Database/Events/MigrationEvent.php', + 'Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php', + 'Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Debug/ExceptionHandler.php', + 'Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Encryption/DecryptException.php', + 'Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Encryption/EncryptException.php', + 'Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Encryption/Encrypter.php', + 'Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Events/Dispatcher.php', + 'Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Filesystem/Cloud.php', + 'Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Filesystem/Factory.php', + 'Illuminate\\Contracts\\Filesystem\\FileExistsException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Filesystem/FileExistsException.php', + 'Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Filesystem/FileNotFoundException.php', + 'Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Filesystem/Filesystem.php', + 'Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php', + 'Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Foundation/CachesConfiguration.php', + 'Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Foundation/CachesRoutes.php', + 'Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php', + 'Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Http/Kernel.php', + 'Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Mail/Factory.php', + 'Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Mail/MailQueue.php', + 'Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Mail/Mailable.php', + 'Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Mail/Mailer.php', + 'Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Notifications/Dispatcher.php', + 'Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Notifications/Factory.php', + 'Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Pagination/LengthAwarePaginator.php', + 'Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Pagination/Paginator.php', + 'Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Pipeline/Hub.php', + 'Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Pipeline/Pipeline.php', + 'Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/EntityNotFoundException.php', + 'Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/EntityResolver.php', + 'Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/Factory.php', + 'Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/Job.php', + 'Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/Monitor.php', + 'Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/Queue.php', + 'Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/QueueableCollection.php', + 'Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/QueueableEntity.php', + 'Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Queue/ShouldQueue.php', + 'Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Redis/Connection.php', + 'Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Redis/Connector.php', + 'Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Redis/Factory.php', + 'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Redis/LimiterTimeoutException.php', + 'Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Routing/BindingRegistrar.php', + 'Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Routing/Registrar.php', + 'Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Routing/ResponseFactory.php', + 'Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Routing/UrlGenerator.php', + 'Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Routing/UrlRoutable.php', + 'Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Session/Session.php', + 'Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/Arrayable.php', + 'Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/DeferrableProvider.php', + 'Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/DeferringDisplayableValue.php', + 'Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/Htmlable.php', + 'Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/Jsonable.php', + 'Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/MessageBag.php', + 'Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/MessageProvider.php', + 'Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/Renderable.php', + 'Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Support/Responsable.php', + 'Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Translation/HasLocalePreference.php', + 'Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Translation/Loader.php', + 'Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Translation/Translator.php', + 'Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Validation/Factory.php', + 'Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Validation/ImplicitRule.php', + 'Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Validation/Rule.php', + 'Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Validation/ValidatesWhenResolved.php', + 'Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/Validation/Validator.php', + 'Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/View/Engine.php', + 'Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/View/Factory.php', + 'Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Contracts/View/View.php', + 'Illuminate\\Cookie\\CookieJar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cookie/CookieJar.php', + 'Illuminate\\Cookie\\CookieServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cookie/CookieServiceProvider.php', + 'Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php', + 'Illuminate\\Cookie\\Middleware\\EncryptCookies' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php', + 'Illuminate\\Database\\Capsule\\Manager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Capsule/Manager.php', + 'Illuminate\\Database\\Concerns\\BuildsQueries' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php', + 'Illuminate\\Database\\Concerns\\ManagesTransactions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php', + 'Illuminate\\Database\\ConfigurationUrlParser' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/ConfigurationUrlParser.php', + 'Illuminate\\Database\\Connection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connection.php', + 'Illuminate\\Database\\ConnectionInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/ConnectionInterface.php', + 'Illuminate\\Database\\ConnectionResolver' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/ConnectionResolver.php', + 'Illuminate\\Database\\ConnectionResolverInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/ConnectionResolverInterface.php', + 'Illuminate\\Database\\Connectors\\ConnectionFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php', + 'Illuminate\\Database\\Connectors\\Connector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/Connector.php', + 'Illuminate\\Database\\Connectors\\ConnectorInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/ConnectorInterface.php', + 'Illuminate\\Database\\Connectors\\MySqlConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php', + 'Illuminate\\Database\\Connectors\\PostgresConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php', + 'Illuminate\\Database\\Connectors\\SQLiteConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php', + 'Illuminate\\Database\\Connectors\\SqlServerConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php', + 'Illuminate\\Database\\Console\\Factories\\FactoryMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Factories/FactoryMakeCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\BaseCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\FreshCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\InstallCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\MigrateCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\MigrateMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\RefreshCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\ResetCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\RollbackCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\StatusCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php', + 'Illuminate\\Database\\Console\\Migrations\\TableGuesser' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Migrations/TableGuesser.php', + 'Illuminate\\Database\\Console\\Seeds\\SeedCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php', + 'Illuminate\\Database\\Console\\Seeds\\SeederMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/Seeds/SeederMakeCommand.php', + 'Illuminate\\Database\\Console\\WipeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Console/WipeCommand.php', + 'Illuminate\\Database\\DatabaseManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/DatabaseManager.php', + 'Illuminate\\Database\\DatabaseServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/DatabaseServiceProvider.php', + 'Illuminate\\Database\\DetectsConcurrencyErrors' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/DetectsConcurrencyErrors.php', + 'Illuminate\\Database\\DetectsLostConnections' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php', + 'Illuminate\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php', + 'Illuminate\\Database\\Eloquent\\Collection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\GuardsAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasEvents' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasGlobalScopes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasGlobalScopes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasRelationships' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HasTimestamps' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\HidesAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HidesAttributes.php', + 'Illuminate\\Database\\Eloquent\\Concerns\\QueriesRelationships' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php', + 'Illuminate\\Database\\Eloquent\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php', + 'Illuminate\\Database\\Eloquent\\FactoryBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php', + 'Illuminate\\Database\\Eloquent\\HigherOrderBuilderProxy' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/HigherOrderBuilderProxy.php', + 'Illuminate\\Database\\Eloquent\\JsonEncodingException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/JsonEncodingException.php', + 'Illuminate\\Database\\Eloquent\\MassAssignmentException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/MassAssignmentException.php', + 'Illuminate\\Database\\Eloquent\\Model' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Model.php', + 'Illuminate\\Database\\Eloquent\\ModelNotFoundException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php', + 'Illuminate\\Database\\Eloquent\\QueueEntityResolver' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/QueueEntityResolver.php', + 'Illuminate\\Database\\Eloquent\\RelationNotFoundException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/RelationNotFoundException.php', + 'Illuminate\\Database\\Eloquent\\Relations\\BelongsTo' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php', + 'Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Concerns\\AsPivot' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/AsPivot.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Concerns\\InteractsWithPivotTable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Concerns\\SupportsDefaultModels' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasMany' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasManyThrough' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasOne' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOne.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasOneOrMany' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\HasOneThrough' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneThrough.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphMany' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphOne' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOne.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphOneOrMany' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphOneOrMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphPivot' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphTo' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php', + 'Illuminate\\Database\\Eloquent\\Relations\\MorphToMany' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Pivot' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php', + 'Illuminate\\Database\\Eloquent\\Relations\\Relation' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php', + 'Illuminate\\Database\\Eloquent\\Scope' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/Scope.php', + 'Illuminate\\Database\\Eloquent\\SoftDeletes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php', + 'Illuminate\\Database\\Eloquent\\SoftDeletingScope' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletingScope.php', + 'Illuminate\\Database\\Events\\ConnectionEvent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/ConnectionEvent.php', + 'Illuminate\\Database\\Events\\MigrationEnded' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/MigrationEnded.php', + 'Illuminate\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/MigrationEvent.php', + 'Illuminate\\Database\\Events\\MigrationStarted' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/MigrationStarted.php', + 'Illuminate\\Database\\Events\\MigrationsEnded' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/MigrationsEnded.php', + 'Illuminate\\Database\\Events\\MigrationsStarted' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/MigrationsStarted.php', + 'Illuminate\\Database\\Events\\NoPendingMigrations' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/NoPendingMigrations.php', + 'Illuminate\\Database\\Events\\QueryExecuted' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/QueryExecuted.php', + 'Illuminate\\Database\\Events\\StatementPrepared' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/StatementPrepared.php', + 'Illuminate\\Database\\Events\\TransactionBeginning' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/TransactionBeginning.php', + 'Illuminate\\Database\\Events\\TransactionCommitted' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/TransactionCommitted.php', + 'Illuminate\\Database\\Events\\TransactionRolledBack' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Events/TransactionRolledBack.php', + 'Illuminate\\Database\\Grammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Grammar.php', + 'Illuminate\\Database\\MigrationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php', + 'Illuminate\\Database\\Migrations\\DatabaseMigrationRepository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php', + 'Illuminate\\Database\\Migrations\\Migration' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Migrations/Migration.php', + 'Illuminate\\Database\\Migrations\\MigrationCreator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php', + 'Illuminate\\Database\\Migrations\\MigrationRepositoryInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php', + 'Illuminate\\Database\\Migrations\\Migrator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php', + 'Illuminate\\Database\\MySqlConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/MySqlConnection.php', + 'Illuminate\\Database\\PostgresConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/PostgresConnection.php', + 'Illuminate\\Database\\QueryException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/QueryException.php', + 'Illuminate\\Database\\Query\\Builder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Builder.php', + 'Illuminate\\Database\\Query\\Expression' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Expression.php', + 'Illuminate\\Database\\Query\\Grammars\\Grammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php', + 'Illuminate\\Database\\Query\\Grammars\\MySqlGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php', + 'Illuminate\\Database\\Query\\Grammars\\PostgresGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php', + 'Illuminate\\Database\\Query\\Grammars\\SQLiteGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php', + 'Illuminate\\Database\\Query\\Grammars\\SqlServerGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php', + 'Illuminate\\Database\\Query\\JoinClause' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/JoinClause.php', + 'Illuminate\\Database\\Query\\Processors\\MySqlProcessor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php', + 'Illuminate\\Database\\Query\\Processors\\PostgresProcessor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php', + 'Illuminate\\Database\\Query\\Processors\\Processor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php', + 'Illuminate\\Database\\Query\\Processors\\SQLiteProcessor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/SQLiteProcessor.php', + 'Illuminate\\Database\\Query\\Processors\\SqlServerProcessor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/SqlServerProcessor.php', + 'Illuminate\\Database\\SQLiteConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/SQLiteConnection.php', + 'Illuminate\\Database\\Schema\\Blueprint' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php', + 'Illuminate\\Database\\Schema\\Builder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Builder.php', + 'Illuminate\\Database\\Schema\\ColumnDefinition' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/ColumnDefinition.php', + 'Illuminate\\Database\\Schema\\ForeignIdColumnDefinition' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/ForeignIdColumnDefinition.php', + 'Illuminate\\Database\\Schema\\ForeignKeyDefinition' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/ForeignKeyDefinition.php', + 'Illuminate\\Database\\Schema\\Grammars\\ChangeColumn' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/ChangeColumn.php', + 'Illuminate\\Database\\Schema\\Grammars\\Grammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\MySqlGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\PostgresGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\RenameColumn' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/RenameColumn.php', + 'Illuminate\\Database\\Schema\\Grammars\\SQLiteGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php', + 'Illuminate\\Database\\Schema\\Grammars\\SqlServerGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php', + 'Illuminate\\Database\\Schema\\MySqlBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php', + 'Illuminate\\Database\\Schema\\PostgresBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php', + 'Illuminate\\Database\\Schema\\SQLiteBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php', + 'Illuminate\\Database\\Schema\\SqlServerBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Schema/SqlServerBuilder.php', + 'Illuminate\\Database\\Seeder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Seeder.php', + 'Illuminate\\Database\\SqlServerConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/SqlServerConnection.php', + 'Illuminate\\Encryption\\Encrypter' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Encryption/Encrypter.php', + 'Illuminate\\Encryption\\EncryptionServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php', + 'Illuminate\\Events\\CallQueuedListener' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Events/CallQueuedListener.php', + 'Illuminate\\Events\\Dispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Events/Dispatcher.php', + 'Illuminate\\Events\\EventServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Events/EventServiceProvider.php', + 'Illuminate\\Events\\NullDispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Events/NullDispatcher.php', + 'Illuminate\\Filesystem\\Cache' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Filesystem/Cache.php', + 'Illuminate\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Filesystem/Filesystem.php', + 'Illuminate\\Filesystem\\FilesystemAdapter' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php', + 'Illuminate\\Filesystem\\FilesystemManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php', + 'Illuminate\\Filesystem\\FilesystemServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php', + 'Illuminate\\Foundation\\AliasLoader' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/AliasLoader.php', + 'Illuminate\\Foundation\\Application' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Application.php', + 'Illuminate\\Foundation\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Auth/Access/Authorizable.php', + 'Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php', + 'Illuminate\\Foundation\\Auth\\AuthenticatesUsers' => __DIR__ . '/..' . '/laravel/ui/auth-backend/AuthenticatesUsers.php', + 'Illuminate\\Foundation\\Auth\\ConfirmsPasswords' => __DIR__ . '/..' . '/laravel/ui/auth-backend/ConfirmsPasswords.php', + 'Illuminate\\Foundation\\Auth\\RedirectsUsers' => __DIR__ . '/..' . '/laravel/ui/auth-backend/RedirectsUsers.php', + 'Illuminate\\Foundation\\Auth\\RegistersUsers' => __DIR__ . '/..' . '/laravel/ui/auth-backend/RegistersUsers.php', + 'Illuminate\\Foundation\\Auth\\ResetsPasswords' => __DIR__ . '/..' . '/laravel/ui/auth-backend/ResetsPasswords.php', + 'Illuminate\\Foundation\\Auth\\SendsPasswordResetEmails' => __DIR__ . '/..' . '/laravel/ui/auth-backend/SendsPasswordResetEmails.php', + 'Illuminate\\Foundation\\Auth\\ThrottlesLogins' => __DIR__ . '/..' . '/laravel/ui/auth-backend/ThrottlesLogins.php', + 'Illuminate\\Foundation\\Auth\\User' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Auth/User.php', + 'Illuminate\\Foundation\\Auth\\VerifiesEmails' => __DIR__ . '/..' . '/laravel/ui/auth-backend/VerifiesEmails.php', + 'Illuminate\\Foundation\\Bootstrap\\BootProviders' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php', + 'Illuminate\\Foundation\\Bootstrap\\HandleExceptions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php', + 'Illuminate\\Foundation\\Bootstrap\\LoadConfiguration' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php', + 'Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php', + 'Illuminate\\Foundation\\Bootstrap\\RegisterFacades' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php', + 'Illuminate\\Foundation\\Bootstrap\\RegisterProviders' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterProviders.php', + 'Illuminate\\Foundation\\Bootstrap\\SetRequestForConsole' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bootstrap/SetRequestForConsole.php', + 'Illuminate\\Foundation\\Bus\\Dispatchable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php', + 'Illuminate\\Foundation\\Bus\\DispatchesJobs' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bus/DispatchesJobs.php', + 'Illuminate\\Foundation\\Bus\\PendingChain' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bus/PendingChain.php', + 'Illuminate\\Foundation\\Bus\\PendingDispatch' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Bus/PendingDispatch.php', + 'Illuminate\\Foundation\\ComposerScripts' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/ComposerScripts.php', + 'Illuminate\\Foundation\\Console\\CastMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/CastMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ChannelMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ChannelMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ClearCompiledCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ClearCompiledCommand.php', + 'Illuminate\\Foundation\\Console\\ClosureCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ClosureCommand.php', + 'Illuminate\\Foundation\\Console\\ComponentMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ComponentMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ConfigCacheCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php', + 'Illuminate\\Foundation\\Console\\ConfigClearCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ConfigClearCommand.php', + 'Illuminate\\Foundation\\Console\\ConsoleMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ConsoleMakeCommand.php', + 'Illuminate\\Foundation\\Console\\DownCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php', + 'Illuminate\\Foundation\\Console\\EnvironmentCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/EnvironmentCommand.php', + 'Illuminate\\Foundation\\Console\\EventCacheCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/EventCacheCommand.php', + 'Illuminate\\Foundation\\Console\\EventClearCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/EventClearCommand.php', + 'Illuminate\\Foundation\\Console\\EventGenerateCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/EventGenerateCommand.php', + 'Illuminate\\Foundation\\Console\\EventListCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/EventListCommand.php', + 'Illuminate\\Foundation\\Console\\EventMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/EventMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ExceptionMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ExceptionMakeCommand.php', + 'Illuminate\\Foundation\\Console\\JobMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/JobMakeCommand.php', + 'Illuminate\\Foundation\\Console\\Kernel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php', + 'Illuminate\\Foundation\\Console\\KeyGenerateCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/KeyGenerateCommand.php', + 'Illuminate\\Foundation\\Console\\ListenerMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ListenerMakeCommand.php', + 'Illuminate\\Foundation\\Console\\MailMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/MailMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ModelMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php', + 'Illuminate\\Foundation\\Console\\NotificationMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/NotificationMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ObserverMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ObserverMakeCommand.php', + 'Illuminate\\Foundation\\Console\\OptimizeClearCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/OptimizeClearCommand.php', + 'Illuminate\\Foundation\\Console\\OptimizeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php', + 'Illuminate\\Foundation\\Console\\PackageDiscoverCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/PackageDiscoverCommand.php', + 'Illuminate\\Foundation\\Console\\PolicyMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ProviderMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ProviderMakeCommand.php', + 'Illuminate\\Foundation\\Console\\QueuedCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/QueuedCommand.php', + 'Illuminate\\Foundation\\Console\\RequestMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/RequestMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ResourceMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ResourceMakeCommand.php', + 'Illuminate\\Foundation\\Console\\RouteCacheCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/RouteCacheCommand.php', + 'Illuminate\\Foundation\\Console\\RouteClearCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/RouteClearCommand.php', + 'Illuminate\\Foundation\\Console\\RouteListCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/RouteListCommand.php', + 'Illuminate\\Foundation\\Console\\RuleMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/RuleMakeCommand.php', + 'Illuminate\\Foundation\\Console\\ServeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php', + 'Illuminate\\Foundation\\Console\\StorageLinkCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/StorageLinkCommand.php', + 'Illuminate\\Foundation\\Console\\StubPublishCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/StubPublishCommand.php', + 'Illuminate\\Foundation\\Console\\TestMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/TestMakeCommand.php', + 'Illuminate\\Foundation\\Console\\UpCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/UpCommand.php', + 'Illuminate\\Foundation\\Console\\VendorPublishCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/VendorPublishCommand.php', + 'Illuminate\\Foundation\\Console\\ViewCacheCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ViewCacheCommand.php', + 'Illuminate\\Foundation\\Console\\ViewClearCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Console/ViewClearCommand.php', + 'Illuminate\\Foundation\\EnvironmentDetector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/EnvironmentDetector.php', + 'Illuminate\\Foundation\\Events\\DiscoverEvents' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Events/DiscoverEvents.php', + 'Illuminate\\Foundation\\Events\\Dispatchable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Events/Dispatchable.php', + 'Illuminate\\Foundation\\Events\\LocaleUpdated' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Events/LocaleUpdated.php', + 'Illuminate\\Foundation\\Exceptions\\Handler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php', + 'Illuminate\\Foundation\\Exceptions\\WhoopsHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Exceptions/WhoopsHandler.php', + 'Illuminate\\Foundation\\Http\\Events\\RequestHandled' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Events/RequestHandled.php', + 'Illuminate\\Foundation\\Http\\Exceptions\\MaintenanceModeException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Exceptions/MaintenanceModeException.php', + 'Illuminate\\Foundation\\Http\\FormRequest' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php', + 'Illuminate\\Foundation\\Http\\Kernel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php', + 'Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php', + 'Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php', + 'Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php', + 'Illuminate\\Foundation\\Http\\Middleware\\TrimStrings' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php', + 'Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php', + 'Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php', + 'Illuminate\\Foundation\\Inspiring' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Inspiring.php', + 'Illuminate\\Foundation\\Mix' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Mix.php', + 'Illuminate\\Foundation\\PackageManifest' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/PackageManifest.php', + 'Illuminate\\Foundation\\ProviderRepository' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php', + 'Illuminate\\Foundation\\Providers\\ArtisanServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\ComposerServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Providers/ConsoleSupportServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\FormRequestServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php', + 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php', + 'Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Support/Providers/AuthServiceProvider.php', + 'Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Support/Providers/EventServiceProvider.php', + 'Illuminate\\Foundation\\Support\\Providers\\RouteServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Support/Providers/RouteServiceProvider.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithAuthentication' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithAuthentication.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithConsole' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithConsole.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithContainer' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithDatabase' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithDatabase.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithExceptionHandling' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithExceptionHandling.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithRedis' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithRedis.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\InteractsWithSession' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithSession.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\MakesHttpRequests' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php', + 'Illuminate\\Foundation\\Testing\\Concerns\\MocksApplicationServices' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php', + 'Illuminate\\Foundation\\Testing\\DatabaseMigrations' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/DatabaseMigrations.php', + 'Illuminate\\Foundation\\Testing\\DatabaseTransactions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/DatabaseTransactions.php', + 'Illuminate\\Foundation\\Testing\\RefreshDatabase' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php', + 'Illuminate\\Foundation\\Testing\\RefreshDatabaseState' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabaseState.php', + 'Illuminate\\Foundation\\Testing\\TestCase' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php', + 'Illuminate\\Foundation\\Testing\\WithFaker' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/WithFaker.php', + 'Illuminate\\Foundation\\Testing\\WithoutEvents' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/WithoutEvents.php', + 'Illuminate\\Foundation\\Testing\\WithoutMiddleware' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Testing/WithoutMiddleware.php', + 'Illuminate\\Foundation\\Validation\\ValidatesRequests' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php', + 'Illuminate\\Hashing\\AbstractHasher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Hashing/AbstractHasher.php', + 'Illuminate\\Hashing\\Argon2IdHasher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Hashing/Argon2IdHasher.php', + 'Illuminate\\Hashing\\ArgonHasher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Hashing/ArgonHasher.php', + 'Illuminate\\Hashing\\BcryptHasher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php', + 'Illuminate\\Hashing\\HashManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Hashing/HashManager.php', + 'Illuminate\\Hashing\\HashServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Hashing/HashServiceProvider.php', + 'Illuminate\\Http\\Client\\ConnectionException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/ConnectionException.php', + 'Illuminate\\Http\\Client\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/Factory.php', + 'Illuminate\\Http\\Client\\PendingRequest' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/PendingRequest.php', + 'Illuminate\\Http\\Client\\Request' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/Request.php', + 'Illuminate\\Http\\Client\\RequestException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/RequestException.php', + 'Illuminate\\Http\\Client\\Response' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/Response.php', + 'Illuminate\\Http\\Client\\ResponseSequence' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Client/ResponseSequence.php', + 'Illuminate\\Http\\Concerns\\InteractsWithContentTypes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithContentTypes.php', + 'Illuminate\\Http\\Concerns\\InteractsWithFlashData' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithFlashData.php', + 'Illuminate\\Http\\Concerns\\InteractsWithInput' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithInput.php', + 'Illuminate\\Http\\Exceptions\\HttpResponseException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Exceptions/HttpResponseException.php', + 'Illuminate\\Http\\Exceptions\\PostTooLargeException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Exceptions/PostTooLargeException.php', + 'Illuminate\\Http\\Exceptions\\ThrottleRequestsException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Exceptions/ThrottleRequestsException.php', + 'Illuminate\\Http\\File' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/File.php', + 'Illuminate\\Http\\FileHelpers' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/FileHelpers.php', + 'Illuminate\\Http\\JsonResponse' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/JsonResponse.php', + 'Illuminate\\Http\\Middleware\\CheckResponseForModifications' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Middleware/CheckResponseForModifications.php', + 'Illuminate\\Http\\Middleware\\FrameGuard' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Middleware/FrameGuard.php', + 'Illuminate\\Http\\Middleware\\SetCacheHeaders' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Middleware/SetCacheHeaders.php', + 'Illuminate\\Http\\Middleware\\TrustHosts' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Middleware/TrustHosts.php', + 'Illuminate\\Http\\RedirectResponse' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/RedirectResponse.php', + 'Illuminate\\Http\\Request' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Request.php', + 'Illuminate\\Http\\Resources\\CollectsResources' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/CollectsResources.php', + 'Illuminate\\Http\\Resources\\ConditionallyLoadsAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php', + 'Illuminate\\Http\\Resources\\DelegatesToResource' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php', + 'Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/Json/AnonymousResourceCollection.php', + 'Illuminate\\Http\\Resources\\Json\\JsonResource' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php', + 'Illuminate\\Http\\Resources\\Json\\PaginatedResourceResponse' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/Json/PaginatedResourceResponse.php', + 'Illuminate\\Http\\Resources\\Json\\ResourceCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceCollection.php', + 'Illuminate\\Http\\Resources\\Json\\ResourceResponse' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceResponse.php', + 'Illuminate\\Http\\Resources\\MergeValue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/MergeValue.php', + 'Illuminate\\Http\\Resources\\MissingValue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/MissingValue.php', + 'Illuminate\\Http\\Resources\\PotentiallyMissing' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Resources/PotentiallyMissing.php', + 'Illuminate\\Http\\Response' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Response.php', + 'Illuminate\\Http\\ResponseTrait' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/ResponseTrait.php', + 'Illuminate\\Http\\Testing\\File' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Testing/File.php', + 'Illuminate\\Http\\Testing\\FileFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php', + 'Illuminate\\Http\\Testing\\MimeType' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/Testing/MimeType.php', + 'Illuminate\\Http\\UploadedFile' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Http/UploadedFile.php', + 'Illuminate\\Log\\Events\\MessageLogged' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Log/Events/MessageLogged.php', + 'Illuminate\\Log\\LogManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Log/LogManager.php', + 'Illuminate\\Log\\LogServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Log/LogServiceProvider.php', + 'Illuminate\\Log\\Logger' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Log/Logger.php', + 'Illuminate\\Log\\ParsesLogConfiguration' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Log/ParsesLogConfiguration.php', + 'Illuminate\\Mail\\Events\\MessageSending' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Events/MessageSending.php', + 'Illuminate\\Mail\\Events\\MessageSent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Events/MessageSent.php', + 'Illuminate\\Mail\\MailManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/MailManager.php', + 'Illuminate\\Mail\\MailServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/MailServiceProvider.php', + 'Illuminate\\Mail\\Mailable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Mailable.php', + 'Illuminate\\Mail\\Mailer' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Mailer.php', + 'Illuminate\\Mail\\Markdown' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Markdown.php', + 'Illuminate\\Mail\\Message' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Message.php', + 'Illuminate\\Mail\\PendingMail' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/PendingMail.php', + 'Illuminate\\Mail\\SendQueuedMailable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php', + 'Illuminate\\Mail\\Transport\\ArrayTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/ArrayTransport.php', + 'Illuminate\\Mail\\Transport\\LogTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/LogTransport.php', + 'Illuminate\\Mail\\Transport\\MailgunTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/MailgunTransport.php', + 'Illuminate\\Mail\\Transport\\SesTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/SesTransport.php', + 'Illuminate\\Mail\\Transport\\Transport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/Transport.php', + 'Illuminate\\Notifications\\Action' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Action.php', + 'Illuminate\\Notifications\\AnonymousNotifiable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/AnonymousNotifiable.php', + 'Illuminate\\Notifications\\ChannelManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/ChannelManager.php', + 'Illuminate\\Notifications\\Channels\\BroadcastChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/BroadcastChannel.php', + 'Illuminate\\Notifications\\Channels\\DatabaseChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php', + 'Illuminate\\Notifications\\Channels\\MailChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php', + 'Illuminate\\Notifications\\Console\\NotificationTableCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Console/NotificationTableCommand.php', + 'Illuminate\\Notifications\\DatabaseNotification' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotification.php', + 'Illuminate\\Notifications\\DatabaseNotificationCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotificationCollection.php', + 'Illuminate\\Notifications\\Events\\BroadcastNotificationCreated' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Events/BroadcastNotificationCreated.php', + 'Illuminate\\Notifications\\Events\\NotificationFailed' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Events/NotificationFailed.php', + 'Illuminate\\Notifications\\Events\\NotificationSending' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Events/NotificationSending.php', + 'Illuminate\\Notifications\\Events\\NotificationSent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Events/NotificationSent.php', + 'Illuminate\\Notifications\\HasDatabaseNotifications' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/HasDatabaseNotifications.php', + 'Illuminate\\Notifications\\Messages\\BroadcastMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/BroadcastMessage.php', + 'Illuminate\\Notifications\\Messages\\DatabaseMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/DatabaseMessage.php', + 'Illuminate\\Notifications\\Messages\\MailMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/MailMessage.php', + 'Illuminate\\Notifications\\Messages\\SimpleMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/SimpleMessage.php', + 'Illuminate\\Notifications\\Notifiable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Notifiable.php', + 'Illuminate\\Notifications\\Notification' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Notification.php', + 'Illuminate\\Notifications\\NotificationSender' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/NotificationSender.php', + 'Illuminate\\Notifications\\NotificationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/NotificationServiceProvider.php', + 'Illuminate\\Notifications\\RoutesNotifications' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php', + 'Illuminate\\Notifications\\SendQueuedNotifications' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/SendQueuedNotifications.php', + 'Illuminate\\Pagination\\AbstractPaginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/AbstractPaginator.php', + 'Illuminate\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php', + 'Illuminate\\Pagination\\PaginationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php', + 'Illuminate\\Pagination\\Paginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/Paginator.php', + 'Illuminate\\Pagination\\UrlWindow' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/UrlWindow.php', + 'Illuminate\\Pipeline\\Hub' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pipeline/Hub.php', + 'Illuminate\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pipeline/Pipeline.php', + 'Illuminate\\Pipeline\\PipelineServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pipeline/PipelineServiceProvider.php', + 'Illuminate\\Queue\\BeanstalkdQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php', + 'Illuminate\\Queue\\CallQueuedClosure' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/CallQueuedClosure.php', + 'Illuminate\\Queue\\CallQueuedHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php', + 'Illuminate\\Queue\\Capsule\\Manager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Capsule/Manager.php', + 'Illuminate\\Queue\\Connectors\\BeanstalkdConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/BeanstalkdConnector.php', + 'Illuminate\\Queue\\Connectors\\ConnectorInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/ConnectorInterface.php', + 'Illuminate\\Queue\\Connectors\\DatabaseConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/DatabaseConnector.php', + 'Illuminate\\Queue\\Connectors\\NullConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/NullConnector.php', + 'Illuminate\\Queue\\Connectors\\RedisConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/RedisConnector.php', + 'Illuminate\\Queue\\Connectors\\SqsConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php', + 'Illuminate\\Queue\\Connectors\\SyncConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Connectors/SyncConnector.php', + 'Illuminate\\Queue\\Console\\FailedTableCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/FailedTableCommand.php', + 'Illuminate\\Queue\\Console\\FlushFailedCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/FlushFailedCommand.php', + 'Illuminate\\Queue\\Console\\ForgetFailedCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/ForgetFailedCommand.php', + 'Illuminate\\Queue\\Console\\ListFailedCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/ListFailedCommand.php', + 'Illuminate\\Queue\\Console\\ListenCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php', + 'Illuminate\\Queue\\Console\\RestartCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/RestartCommand.php', + 'Illuminate\\Queue\\Console\\RetryCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/RetryCommand.php', + 'Illuminate\\Queue\\Console\\TableCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/TableCommand.php', + 'Illuminate\\Queue\\Console\\WorkCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php', + 'Illuminate\\Queue\\DatabaseQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php', + 'Illuminate\\Queue\\Events\\JobExceptionOccurred' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Events/JobExceptionOccurred.php', + 'Illuminate\\Queue\\Events\\JobFailed' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Events/JobFailed.php', + 'Illuminate\\Queue\\Events\\JobProcessed' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Events/JobProcessed.php', + 'Illuminate\\Queue\\Events\\JobProcessing' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Events/JobProcessing.php', + 'Illuminate\\Queue\\Events\\Looping' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Events/Looping.php', + 'Illuminate\\Queue\\Events\\WorkerStopping' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Events/WorkerStopping.php', + 'Illuminate\\Queue\\Failed\\DatabaseFailedJobProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Failed/DatabaseFailedJobProvider.php', + 'Illuminate\\Queue\\Failed\\DynamoDbFailedJobProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Failed/DynamoDbFailedJobProvider.php', + 'Illuminate\\Queue\\Failed\\FailedJobProviderInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Failed/FailedJobProviderInterface.php', + 'Illuminate\\Queue\\Failed\\NullFailedJobProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Failed/NullFailedJobProvider.php', + 'Illuminate\\Queue\\InteractsWithQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/InteractsWithQueue.php', + 'Illuminate\\Queue\\InvalidPayloadException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/InvalidPayloadException.php', + 'Illuminate\\Queue\\Jobs\\BeanstalkdJob' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/BeanstalkdJob.php', + 'Illuminate\\Queue\\Jobs\\DatabaseJob' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/DatabaseJob.php', + 'Illuminate\\Queue\\Jobs\\DatabaseJobRecord' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/DatabaseJobRecord.php', + 'Illuminate\\Queue\\Jobs\\Job' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/Job.php', + 'Illuminate\\Queue\\Jobs\\JobName' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/JobName.php', + 'Illuminate\\Queue\\Jobs\\RedisJob' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/RedisJob.php', + 'Illuminate\\Queue\\Jobs\\SqsJob' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/SqsJob.php', + 'Illuminate\\Queue\\Jobs\\SyncJob' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Jobs/SyncJob.php', + 'Illuminate\\Queue\\Listener' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Listener.php', + 'Illuminate\\Queue\\ListenerOptions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/ListenerOptions.php', + 'Illuminate\\Queue\\LuaScripts' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/LuaScripts.php', + 'Illuminate\\Queue\\ManuallyFailedException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/ManuallyFailedException.php', + 'Illuminate\\Queue\\MaxAttemptsExceededException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/MaxAttemptsExceededException.php', + 'Illuminate\\Queue\\NullQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/NullQueue.php', + 'Illuminate\\Queue\\Queue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Queue.php', + 'Illuminate\\Queue\\QueueManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/QueueManager.php', + 'Illuminate\\Queue\\QueueServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/QueueServiceProvider.php', + 'Illuminate\\Queue\\RedisQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/RedisQueue.php', + 'Illuminate\\Queue\\SerializableClosure' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/SerializableClosure.php', + 'Illuminate\\Queue\\SerializesAndRestoresModelIdentifiers' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/SerializesAndRestoresModelIdentifiers.php', + 'Illuminate\\Queue\\SerializesModels' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/SerializesModels.php', + 'Illuminate\\Queue\\SqsQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/SqsQueue.php', + 'Illuminate\\Queue\\SyncQueue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/SyncQueue.php', + 'Illuminate\\Queue\\Worker' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/Worker.php', + 'Illuminate\\Queue\\WorkerOptions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Queue/WorkerOptions.php', + 'Illuminate\\Redis\\Connections\\Connection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connections/Connection.php', + 'Illuminate\\Redis\\Connections\\PhpRedisClusterConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisClusterConnection.php', + 'Illuminate\\Redis\\Connections\\PhpRedisConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisConnection.php', + 'Illuminate\\Redis\\Connections\\PredisClusterConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connections/PredisClusterConnection.php', + 'Illuminate\\Redis\\Connections\\PredisConnection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connections/PredisConnection.php', + 'Illuminate\\Redis\\Connectors\\PhpRedisConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php', + 'Illuminate\\Redis\\Connectors\\PredisConnector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Connectors/PredisConnector.php', + 'Illuminate\\Redis\\Events\\CommandExecuted' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Events/CommandExecuted.php', + 'Illuminate\\Redis\\Limiters\\ConcurrencyLimiter' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Limiters/ConcurrencyLimiter.php', + 'Illuminate\\Redis\\Limiters\\ConcurrencyLimiterBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Limiters/ConcurrencyLimiterBuilder.php', + 'Illuminate\\Redis\\Limiters\\DurationLimiter' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Limiters/DurationLimiter.php', + 'Illuminate\\Redis\\Limiters\\DurationLimiterBuilder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/Limiters/DurationLimiterBuilder.php', + 'Illuminate\\Redis\\RedisManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/RedisManager.php', + 'Illuminate\\Redis\\RedisServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Redis/RedisServiceProvider.php', + 'Illuminate\\Routing\\AbstractRouteCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php', + 'Illuminate\\Routing\\CompiledRouteCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/CompiledRouteCollection.php', + 'Illuminate\\Routing\\Console\\ControllerMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Console/ControllerMakeCommand.php', + 'Illuminate\\Routing\\Console\\MiddlewareMakeCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Console/MiddlewareMakeCommand.php', + 'Illuminate\\Routing\\Contracts\\ControllerDispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Contracts/ControllerDispatcher.php', + 'Illuminate\\Routing\\Controller' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Controller.php', + 'Illuminate\\Routing\\ControllerDispatcher' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php', + 'Illuminate\\Routing\\ControllerMiddlewareOptions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/ControllerMiddlewareOptions.php', + 'Illuminate\\Routing\\Events\\RouteMatched' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Events/RouteMatched.php', + 'Illuminate\\Routing\\Exceptions\\InvalidSignatureException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Exceptions/InvalidSignatureException.php', + 'Illuminate\\Routing\\Exceptions\\UrlGenerationException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Exceptions/UrlGenerationException.php', + 'Illuminate\\Routing\\ImplicitRouteBinding' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/ImplicitRouteBinding.php', + 'Illuminate\\Routing\\Matching\\HostValidator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Matching/HostValidator.php', + 'Illuminate\\Routing\\Matching\\MethodValidator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Matching/MethodValidator.php', + 'Illuminate\\Routing\\Matching\\SchemeValidator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Matching/SchemeValidator.php', + 'Illuminate\\Routing\\Matching\\UriValidator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Matching/UriValidator.php', + 'Illuminate\\Routing\\Matching\\ValidatorInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Matching/ValidatorInterface.php', + 'Illuminate\\Routing\\MiddlewareNameResolver' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/MiddlewareNameResolver.php', + 'Illuminate\\Routing\\Middleware\\SubstituteBindings' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php', + 'Illuminate\\Routing\\Middleware\\ThrottleRequests' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php', + 'Illuminate\\Routing\\Middleware\\ThrottleRequestsWithRedis' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequestsWithRedis.php', + 'Illuminate\\Routing\\Middleware\\ValidateSignature' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Middleware/ValidateSignature.php', + 'Illuminate\\Routing\\PendingResourceRegistration' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/PendingResourceRegistration.php', + 'Illuminate\\Routing\\Pipeline' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Pipeline.php', + 'Illuminate\\Routing\\RedirectController' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RedirectController.php', + 'Illuminate\\Routing\\Redirector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Redirector.php', + 'Illuminate\\Routing\\ResourceRegistrar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/ResourceRegistrar.php', + 'Illuminate\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/ResponseFactory.php', + 'Illuminate\\Routing\\Route' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Route.php', + 'Illuminate\\Routing\\RouteAction' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteAction.php', + 'Illuminate\\Routing\\RouteBinding' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteBinding.php', + 'Illuminate\\Routing\\RouteCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteCollection.php', + 'Illuminate\\Routing\\RouteCollectionInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteCollectionInterface.php', + 'Illuminate\\Routing\\RouteDependencyResolverTrait' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php', + 'Illuminate\\Routing\\RouteFileRegistrar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteFileRegistrar.php', + 'Illuminate\\Routing\\RouteGroup' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteGroup.php', + 'Illuminate\\Routing\\RouteParameterBinder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteParameterBinder.php', + 'Illuminate\\Routing\\RouteRegistrar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteRegistrar.php', + 'Illuminate\\Routing\\RouteSignatureParameters' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php', + 'Illuminate\\Routing\\RouteUri' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteUri.php', + 'Illuminate\\Routing\\RouteUrlGenerator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RouteUrlGenerator.php', + 'Illuminate\\Routing\\Router' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/Router.php', + 'Illuminate\\Routing\\RoutingServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php', + 'Illuminate\\Routing\\SortedMiddleware' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/SortedMiddleware.php', + 'Illuminate\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/UrlGenerator.php', + 'Illuminate\\Routing\\ViewController' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Routing/ViewController.php', + 'Illuminate\\Session\\ArraySessionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/ArraySessionHandler.php', + 'Illuminate\\Session\\CacheBasedSessionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php', + 'Illuminate\\Session\\Console\\SessionTableCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/Console/SessionTableCommand.php', + 'Illuminate\\Session\\CookieSessionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/CookieSessionHandler.php', + 'Illuminate\\Session\\DatabaseSessionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/DatabaseSessionHandler.php', + 'Illuminate\\Session\\EncryptedStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/EncryptedStore.php', + 'Illuminate\\Session\\ExistenceAwareInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/ExistenceAwareInterface.php', + 'Illuminate\\Session\\FileSessionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/FileSessionHandler.php', + 'Illuminate\\Session\\Middleware\\AuthenticateSession' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php', + 'Illuminate\\Session\\Middleware\\StartSession' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php', + 'Illuminate\\Session\\NullSessionHandler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/NullSessionHandler.php', + 'Illuminate\\Session\\SessionManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/SessionManager.php', + 'Illuminate\\Session\\SessionServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/SessionServiceProvider.php', + 'Illuminate\\Session\\Store' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/Store.php', + 'Illuminate\\Session\\TokenMismatchException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Session/TokenMismatchException.php', + 'Illuminate\\Support\\AggregateServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/AggregateServiceProvider.php', + 'Illuminate\\Support\\Arr' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Arr.php', + 'Illuminate\\Support\\Carbon' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Carbon.php', + 'Illuminate\\Support\\Collection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Collection.php', + 'Illuminate\\Support\\Composer' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Composer.php', + 'Illuminate\\Support\\ConfigurationUrlParser' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/ConfigurationUrlParser.php', + 'Illuminate\\Support\\DateFactory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/DateFactory.php', + 'Illuminate\\Support\\Enumerable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Enumerable.php', + 'Illuminate\\Support\\Env' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Env.php', + 'Illuminate\\Support\\Facades\\App' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/App.php', + 'Illuminate\\Support\\Facades\\Artisan' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Artisan.php', + 'Illuminate\\Support\\Facades\\Auth' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Auth.php', + 'Illuminate\\Support\\Facades\\Blade' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Blade.php', + 'Illuminate\\Support\\Facades\\Broadcast' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Broadcast.php', + 'Illuminate\\Support\\Facades\\Bus' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Bus.php', + 'Illuminate\\Support\\Facades\\Cache' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Cache.php', + 'Illuminate\\Support\\Facades\\Config' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Config.php', + 'Illuminate\\Support\\Facades\\Cookie' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Cookie.php', + 'Illuminate\\Support\\Facades\\Crypt' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Crypt.php', + 'Illuminate\\Support\\Facades\\DB' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/DB.php', + 'Illuminate\\Support\\Facades\\Date' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Date.php', + 'Illuminate\\Support\\Facades\\Event' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Event.php', + 'Illuminate\\Support\\Facades\\Facade' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Facade.php', + 'Illuminate\\Support\\Facades\\File' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/File.php', + 'Illuminate\\Support\\Facades\\Gate' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Gate.php', + 'Illuminate\\Support\\Facades\\Hash' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Hash.php', + 'Illuminate\\Support\\Facades\\Http' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Http.php', + 'Illuminate\\Support\\Facades\\Lang' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Lang.php', + 'Illuminate\\Support\\Facades\\Log' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Log.php', + 'Illuminate\\Support\\Facades\\Mail' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Mail.php', + 'Illuminate\\Support\\Facades\\Notification' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Notification.php', + 'Illuminate\\Support\\Facades\\Password' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Password.php', + 'Illuminate\\Support\\Facades\\Queue' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Queue.php', + 'Illuminate\\Support\\Facades\\Redirect' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Redirect.php', + 'Illuminate\\Support\\Facades\\Redis' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Redis.php', + 'Illuminate\\Support\\Facades\\Request' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Request.php', + 'Illuminate\\Support\\Facades\\Response' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Response.php', + 'Illuminate\\Support\\Facades\\Route' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Route.php', + 'Illuminate\\Support\\Facades\\Schema' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Schema.php', + 'Illuminate\\Support\\Facades\\Session' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Session.php', + 'Illuminate\\Support\\Facades\\Storage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Storage.php', + 'Illuminate\\Support\\Facades\\URL' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/URL.php', + 'Illuminate\\Support\\Facades\\Validator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/Validator.php', + 'Illuminate\\Support\\Facades\\View' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Facades/View.php', + 'Illuminate\\Support\\Fluent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Fluent.php', + 'Illuminate\\Support\\HigherOrderCollectionProxy' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php', + 'Illuminate\\Support\\HigherOrderTapProxy' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/HigherOrderTapProxy.php', + 'Illuminate\\Support\\HigherOrderWhenProxy' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/HigherOrderWhenProxy.php', + 'Illuminate\\Support\\HtmlString' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/HtmlString.php', + 'Illuminate\\Support\\InteractsWithTime' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/InteractsWithTime.php', + 'Illuminate\\Support\\LazyCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/LazyCollection.php', + 'Illuminate\\Support\\Manager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Manager.php', + 'Illuminate\\Support\\MessageBag' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/MessageBag.php', + 'Illuminate\\Support\\NamespacedItemResolver' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php', + 'Illuminate\\Support\\Optional' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Optional.php', + 'Illuminate\\Support\\Pluralizer' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Pluralizer.php', + 'Illuminate\\Support\\ProcessUtils' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/ProcessUtils.php', + 'Illuminate\\Support\\Reflector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Reflector.php', + 'Illuminate\\Support\\ServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/ServiceProvider.php', + 'Illuminate\\Support\\Str' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Str.php', + 'Illuminate\\Support\\Stringable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Stringable.php', + 'Illuminate\\Support\\Testing\\Fakes\\BusFake' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/BusFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\EventFake' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/EventFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\MailFake' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/MailFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\NotificationFake' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/NotificationFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\PendingMailFake' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/PendingMailFake.php', + 'Illuminate\\Support\\Testing\\Fakes\\QueueFake' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Testing/Fakes/QueueFake.php', + 'Illuminate\\Support\\Traits\\CapsuleManagerTrait' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/CapsuleManagerTrait.php', + 'Illuminate\\Support\\Traits\\EnumeratesValues' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/EnumeratesValues.php', + 'Illuminate\\Support\\Traits\\ForwardsCalls' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php', + 'Illuminate\\Support\\Traits\\Localizable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/Localizable.php', + 'Illuminate\\Support\\Traits\\Macroable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/Macroable.php', + 'Illuminate\\Support\\Traits\\ReflectsClosures' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/ReflectsClosures.php', + 'Illuminate\\Support\\Traits\\Tappable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/Traits/Tappable.php', + 'Illuminate\\Support\\ViewErrorBag' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/ViewErrorBag.php', + 'Illuminate\\Testing\\Assert' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/Assert.php', + 'Illuminate\\Testing\\Constraints\\ArraySubset' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/Constraints/ArraySubset.php', + 'Illuminate\\Testing\\Constraints\\CountInDatabase' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/Constraints/CountInDatabase.php', + 'Illuminate\\Testing\\Constraints\\HasInDatabase' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/Constraints/HasInDatabase.php', + 'Illuminate\\Testing\\Constraints\\SeeInOrder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/Constraints/SeeInOrder.php', + 'Illuminate\\Testing\\Constraints\\SoftDeletedInDatabase' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/Constraints/SoftDeletedInDatabase.php', + 'Illuminate\\Testing\\PendingCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/PendingCommand.php', + 'Illuminate\\Testing\\TestResponse' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Testing/TestResponse.php', + 'Illuminate\\Translation\\ArrayLoader' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Translation/ArrayLoader.php', + 'Illuminate\\Translation\\FileLoader' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Translation/FileLoader.php', + 'Illuminate\\Translation\\MessageSelector' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Translation/MessageSelector.php', + 'Illuminate\\Translation\\TranslationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Translation/TranslationServiceProvider.php', + 'Illuminate\\Translation\\Translator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Translation/Translator.php', + 'Illuminate\\Validation\\ClosureValidationRule' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/ClosureValidationRule.php', + 'Illuminate\\Validation\\Concerns\\FilterEmailValidation' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Concerns/FilterEmailValidation.php', + 'Illuminate\\Validation\\Concerns\\FormatsMessages' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Concerns/FormatsMessages.php', + 'Illuminate\\Validation\\Concerns\\ReplacesAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Concerns/ReplacesAttributes.php', + 'Illuminate\\Validation\\Concerns\\ValidatesAttributes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php', + 'Illuminate\\Validation\\DatabasePresenceVerifier' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php', + 'Illuminate\\Validation\\DatabasePresenceVerifierInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifierInterface.php', + 'Illuminate\\Validation\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Factory.php', + 'Illuminate\\Validation\\PresenceVerifierInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/PresenceVerifierInterface.php', + 'Illuminate\\Validation\\Rule' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rule.php', + 'Illuminate\\Validation\\Rules\\DatabaseRule' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/DatabaseRule.php', + 'Illuminate\\Validation\\Rules\\Dimensions' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/Dimensions.php', + 'Illuminate\\Validation\\Rules\\Exists' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/Exists.php', + 'Illuminate\\Validation\\Rules\\In' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/In.php', + 'Illuminate\\Validation\\Rules\\NotIn' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/NotIn.php', + 'Illuminate\\Validation\\Rules\\RequiredIf' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/RequiredIf.php', + 'Illuminate\\Validation\\Rules\\Unique' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Rules/Unique.php', + 'Illuminate\\Validation\\UnauthorizedException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/UnauthorizedException.php', + 'Illuminate\\Validation\\ValidatesWhenResolvedTrait' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php', + 'Illuminate\\Validation\\ValidationData' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/ValidationData.php', + 'Illuminate\\Validation\\ValidationException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/ValidationException.php', + 'Illuminate\\Validation\\ValidationRuleParser' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/ValidationRuleParser.php', + 'Illuminate\\Validation\\ValidationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/ValidationServiceProvider.php', + 'Illuminate\\Validation\\Validator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Validation/Validator.php', + 'Illuminate\\View\\AnonymousComponent' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/AnonymousComponent.php', + 'Illuminate\\View\\Compilers\\BladeCompiler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php', + 'Illuminate\\View\\Compilers\\Compiler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Compiler.php', + 'Illuminate\\View\\Compilers\\CompilerInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/CompilerInterface.php', + 'Illuminate\\View\\Compilers\\ComponentTagCompiler' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/ComponentTagCompiler.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesAuthorizations' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesAuthorizations.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesComments' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesComments.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesComponents' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesComponents.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesConditionals' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesConditionals.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesEchos' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesEchos.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesErrors' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesErrors.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesHelpers' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesHelpers.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesIncludes' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesIncludes.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesInjections' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesInjections.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesJson' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesJson.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesLayouts' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLayouts.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesLoops' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLoops.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesRawPhp' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesRawPhp.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesStacks' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesStacks.php', + 'Illuminate\\View\\Compilers\\Concerns\\CompilesTranslations' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesTranslations.php', + 'Illuminate\\View\\Component' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Component.php', + 'Illuminate\\View\\ComponentAttributeBag' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ComponentAttributeBag.php', + 'Illuminate\\View\\Concerns\\ManagesComponents' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Concerns/ManagesComponents.php', + 'Illuminate\\View\\Concerns\\ManagesEvents' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Concerns/ManagesEvents.php', + 'Illuminate\\View\\Concerns\\ManagesLayouts' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Concerns/ManagesLayouts.php', + 'Illuminate\\View\\Concerns\\ManagesLoops' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Concerns/ManagesLoops.php', + 'Illuminate\\View\\Concerns\\ManagesStacks' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Concerns/ManagesStacks.php', + 'Illuminate\\View\\Concerns\\ManagesTranslations' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Concerns/ManagesTranslations.php', + 'Illuminate\\View\\Engines\\CompilerEngine' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php', + 'Illuminate\\View\\Engines\\Engine' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Engines/Engine.php', + 'Illuminate\\View\\Engines\\EngineResolver' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Engines/EngineResolver.php', + 'Illuminate\\View\\Engines\\FileEngine' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Engines/FileEngine.php', + 'Illuminate\\View\\Engines\\PhpEngine' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php', + 'Illuminate\\View\\Factory' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Factory.php', + 'Illuminate\\View\\FileViewFinder' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/FileViewFinder.php', + 'Illuminate\\View\\InvokableComponentVariable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/InvokableComponentVariable.php', + 'Illuminate\\View\\Middleware\\ShareErrorsFromSession' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php', + 'Illuminate\\View\\View' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/View.php', + 'Illuminate\\View\\ViewFinderInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewFinderInterface.php', + 'Illuminate\\View\\ViewName' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewName.php', + 'Illuminate\\View\\ViewServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php', + 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', + 'Laravel\\Sanctum\\Contracts\\HasAbilities' => __DIR__ . '/..' . '/laravel/sanctum/src/Contracts/HasAbilities.php', + 'Laravel\\Sanctum\\Guard' => __DIR__ . '/..' . '/laravel/sanctum/src/Guard.php', + 'Laravel\\Sanctum\\HasApiTokens' => __DIR__ . '/..' . '/laravel/sanctum/src/HasApiTokens.php', + 'Laravel\\Sanctum\\Http\\Controllers\\CsrfCookieController' => __DIR__ . '/..' . '/laravel/sanctum/src/Http/Controllers/CsrfCookieController.php', + 'Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful' => __DIR__ . '/..' . '/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php', + 'Laravel\\Sanctum\\NewAccessToken' => __DIR__ . '/..' . '/laravel/sanctum/src/NewAccessToken.php', + 'Laravel\\Sanctum\\PersonalAccessToken' => __DIR__ . '/..' . '/laravel/sanctum/src/PersonalAccessToken.php', + 'Laravel\\Sanctum\\Sanctum' => __DIR__ . '/..' . '/laravel/sanctum/src/Sanctum.php', + 'Laravel\\Sanctum\\SanctumServiceProvider' => __DIR__ . '/..' . '/laravel/sanctum/src/SanctumServiceProvider.php', + 'Laravel\\Sanctum\\TransientToken' => __DIR__ . '/..' . '/laravel/sanctum/src/TransientToken.php', + 'Laravel\\Tinker\\ClassAliasAutoloader' => __DIR__ . '/..' . '/laravel/tinker/src/ClassAliasAutoloader.php', + 'Laravel\\Tinker\\Console\\TinkerCommand' => __DIR__ . '/..' . '/laravel/tinker/src/Console/TinkerCommand.php', + 'Laravel\\Tinker\\TinkerCaster' => __DIR__ . '/..' . '/laravel/tinker/src/TinkerCaster.php', + 'Laravel\\Tinker\\TinkerServiceProvider' => __DIR__ . '/..' . '/laravel/tinker/src/TinkerServiceProvider.php', + 'Laravel\\Ui\\AuthCommand' => __DIR__ . '/..' . '/laravel/ui/src/AuthCommand.php', + 'Laravel\\Ui\\AuthRouteMethods' => __DIR__ . '/..' . '/laravel/ui/src/AuthRouteMethods.php', + 'Laravel\\Ui\\ControllersCommand' => __DIR__ . '/..' . '/laravel/ui/src/ControllersCommand.php', + 'Laravel\\Ui\\Presets\\Bootstrap' => __DIR__ . '/..' . '/laravel/ui/src/Presets/Bootstrap.php', + 'Laravel\\Ui\\Presets\\Preset' => __DIR__ . '/..' . '/laravel/ui/src/Presets/Preset.php', + 'Laravel\\Ui\\Presets\\React' => __DIR__ . '/..' . '/laravel/ui/src/Presets/React.php', + 'Laravel\\Ui\\Presets\\Vue' => __DIR__ . '/..' . '/laravel/ui/src/Presets/Vue.php', + 'Laravel\\Ui\\UiCommand' => __DIR__ . '/..' . '/laravel/ui/src/UiCommand.php', + 'Laravel\\Ui\\UiServiceProvider' => __DIR__ . '/..' . '/laravel/ui/src/UiServiceProvider.php', + 'League\\CommonMark\\Block\\Element\\AbstractBlock' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/AbstractBlock.php', + 'League\\CommonMark\\Block\\Element\\AbstractStringContainerBlock' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/AbstractStringContainerBlock.php', + 'League\\CommonMark\\Block\\Element\\BlockQuote' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/BlockQuote.php', + 'League\\CommonMark\\Block\\Element\\Document' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/Document.php', + 'League\\CommonMark\\Block\\Element\\FencedCode' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/FencedCode.php', + 'League\\CommonMark\\Block\\Element\\Heading' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/Heading.php', + 'League\\CommonMark\\Block\\Element\\HtmlBlock' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/HtmlBlock.php', + 'League\\CommonMark\\Block\\Element\\IndentedCode' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/IndentedCode.php', + 'League\\CommonMark\\Block\\Element\\InlineContainerInterface' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/InlineContainerInterface.php', + 'League\\CommonMark\\Block\\Element\\ListBlock' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/ListBlock.php', + 'League\\CommonMark\\Block\\Element\\ListData' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/ListData.php', + 'League\\CommonMark\\Block\\Element\\ListItem' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/ListItem.php', + 'League\\CommonMark\\Block\\Element\\Paragraph' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/Paragraph.php', + 'League\\CommonMark\\Block\\Element\\StringContainerInterface' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/StringContainerInterface.php', + 'League\\CommonMark\\Block\\Element\\ThematicBreak' => __DIR__ . '/..' . '/league/commonmark/src/Block/Element/ThematicBreak.php', + 'League\\CommonMark\\Block\\Parser\\ATXHeadingParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/ATXHeadingParser.php', + 'League\\CommonMark\\Block\\Parser\\BlockParserInterface' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/BlockParserInterface.php', + 'League\\CommonMark\\Block\\Parser\\BlockQuoteParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/BlockQuoteParser.php', + 'League\\CommonMark\\Block\\Parser\\FencedCodeParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/FencedCodeParser.php', + 'League\\CommonMark\\Block\\Parser\\HtmlBlockParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/HtmlBlockParser.php', + 'League\\CommonMark\\Block\\Parser\\IndentedCodeParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/IndentedCodeParser.php', + 'League\\CommonMark\\Block\\Parser\\LazyParagraphParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/LazyParagraphParser.php', + 'League\\CommonMark\\Block\\Parser\\ListParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/ListParser.php', + 'League\\CommonMark\\Block\\Parser\\SetExtHeadingParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/SetExtHeadingParser.php', + 'League\\CommonMark\\Block\\Parser\\ThematicBreakParser' => __DIR__ . '/..' . '/league/commonmark/src/Block/Parser/ThematicBreakParser.php', + 'League\\CommonMark\\Block\\Renderer\\BlockQuoteRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/BlockQuoteRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\BlockRendererInterface' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/BlockRendererInterface.php', + 'League\\CommonMark\\Block\\Renderer\\DocumentRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/DocumentRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\FencedCodeRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/FencedCodeRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\HeadingRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/HeadingRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\HtmlBlockRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/HtmlBlockRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\IndentedCodeRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/IndentedCodeRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ListBlockRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/ListBlockRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ListItemRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/ListItemRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ParagraphRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/ParagraphRenderer.php', + 'League\\CommonMark\\Block\\Renderer\\ThematicBreakRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Block/Renderer/ThematicBreakRenderer.php', + 'League\\CommonMark\\CommonMarkConverter' => __DIR__ . '/..' . '/league/commonmark/src/CommonMarkConverter.php', + 'League\\CommonMark\\ConfigurableEnvironmentInterface' => __DIR__ . '/..' . '/league/commonmark/src/ConfigurableEnvironmentInterface.php', + 'League\\CommonMark\\Context' => __DIR__ . '/..' . '/league/commonmark/src/Context.php', + 'League\\CommonMark\\ContextInterface' => __DIR__ . '/..' . '/league/commonmark/src/ContextInterface.php', + 'League\\CommonMark\\Converter' => __DIR__ . '/..' . '/league/commonmark/src/Converter.php', + 'League\\CommonMark\\ConverterInterface' => __DIR__ . '/..' . '/league/commonmark/src/ConverterInterface.php', + 'League\\CommonMark\\Cursor' => __DIR__ . '/..' . '/league/commonmark/src/Cursor.php', + 'League\\CommonMark\\Delimiter\\Delimiter' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/Delimiter.php', + 'League\\CommonMark\\Delimiter\\DelimiterInterface' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/DelimiterInterface.php', + 'League\\CommonMark\\Delimiter\\DelimiterStack' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/DelimiterStack.php', + 'League\\CommonMark\\Delimiter\\Processor\\DelimiterProcessorCollection' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollection.php', + 'League\\CommonMark\\Delimiter\\Processor\\DelimiterProcessorCollectionInterface' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollectionInterface.php', + 'League\\CommonMark\\Delimiter\\Processor\\DelimiterProcessorInterface' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/Processor/DelimiterProcessorInterface.php', + 'League\\CommonMark\\Delimiter\\Processor\\EmphasisDelimiterProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/Processor/EmphasisDelimiterProcessor.php', + 'League\\CommonMark\\Delimiter\\Processor\\StaggeredDelimiterProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Delimiter/Processor/StaggeredDelimiterProcessor.php', + 'League\\CommonMark\\DocParser' => __DIR__ . '/..' . '/league/commonmark/src/DocParser.php', + 'League\\CommonMark\\DocParserInterface' => __DIR__ . '/..' . '/league/commonmark/src/DocParserInterface.php', + 'League\\CommonMark\\ElementRendererInterface' => __DIR__ . '/..' . '/league/commonmark/src/ElementRendererInterface.php', + 'League\\CommonMark\\Environment' => __DIR__ . '/..' . '/league/commonmark/src/Environment.php', + 'League\\CommonMark\\EnvironmentAwareInterface' => __DIR__ . '/..' . '/league/commonmark/src/EnvironmentAwareInterface.php', + 'League\\CommonMark\\EnvironmentInterface' => __DIR__ . '/..' . '/league/commonmark/src/EnvironmentInterface.php', + 'League\\CommonMark\\Event\\AbstractEvent' => __DIR__ . '/..' . '/league/commonmark/src/Event/AbstractEvent.php', + 'League\\CommonMark\\Event\\DocumentParsedEvent' => __DIR__ . '/..' . '/league/commonmark/src/Event/DocumentParsedEvent.php', + 'League\\CommonMark\\Event\\DocumentPreParsedEvent' => __DIR__ . '/..' . '/league/commonmark/src/Event/DocumentPreParsedEvent.php', + 'League\\CommonMark\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/league/commonmark/src/Exception/InvalidOptionException.php', + 'League\\CommonMark\\Exception\\UnexpectedEncodingException' => __DIR__ . '/..' . '/league/commonmark/src/Exception/UnexpectedEncodingException.php', + 'League\\CommonMark\\Extension\\Autolink\\AutolinkExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Autolink/AutolinkExtension.php', + 'League\\CommonMark\\Extension\\Autolink\\EmailAutolinkProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Autolink/EmailAutolinkProcessor.php', + 'League\\CommonMark\\Extension\\Autolink\\InlineMentionParser' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Autolink/InlineMentionParser.php', + 'League\\CommonMark\\Extension\\Autolink\\UrlAutolinkProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Autolink/UrlAutolinkProcessor.php', + 'League\\CommonMark\\Extension\\CommonMarkCoreExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/CommonMarkCoreExtension.php', + 'League\\CommonMark\\Extension\\DisallowedRawHtml\\DisallowedRawHtmlBlockRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlBlockRenderer.php', + 'League\\CommonMark\\Extension\\DisallowedRawHtml\\DisallowedRawHtmlExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlExtension.php', + 'League\\CommonMark\\Extension\\DisallowedRawHtml\\DisallowedRawHtmlInlineRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/DisallowedRawHtml/DisallowedRawHtmlInlineRenderer.php', + 'League\\CommonMark\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/league/commonmark/src/Extension/ExtensionInterface.php', + 'League\\CommonMark\\Extension\\ExternalLink\\ExternalLinkExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/ExternalLink/ExternalLinkExtension.php', + 'League\\CommonMark\\Extension\\ExternalLink\\ExternalLinkProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Extension/ExternalLink/ExternalLinkProcessor.php', + 'League\\CommonMark\\Extension\\GithubFlavoredMarkdownExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/GithubFlavoredMarkdownExtension.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalink' => __DIR__ . '/..' . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalink.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalinkExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkExtension.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalinkProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkProcessor.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\HeadingPermalinkRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkRenderer.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\Slug\\DefaultSlugGenerator' => __DIR__ . '/..' . '/league/commonmark/src/Extension/HeadingPermalink/Slug/DefaultSlugGenerator.php', + 'League\\CommonMark\\Extension\\HeadingPermalink\\Slug\\SlugGeneratorInterface' => __DIR__ . '/..' . '/league/commonmark/src/Extension/HeadingPermalink/Slug/SlugGeneratorInterface.php', + 'League\\CommonMark\\Extension\\InlinesOnly\\ChildRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/InlinesOnly/ChildRenderer.php', + 'League\\CommonMark\\Extension\\InlinesOnly\\InlinesOnlyExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/InlinesOnly/InlinesOnlyExtension.php', + 'League\\CommonMark\\Extension\\SmartPunct\\PunctuationParser' => __DIR__ . '/..' . '/league/commonmark/src/Extension/SmartPunct/PunctuationParser.php', + 'League\\CommonMark\\Extension\\SmartPunct\\Quote' => __DIR__ . '/..' . '/league/commonmark/src/Extension/SmartPunct/Quote.php', + 'League\\CommonMark\\Extension\\SmartPunct\\QuoteParser' => __DIR__ . '/..' . '/league/commonmark/src/Extension/SmartPunct/QuoteParser.php', + 'League\\CommonMark\\Extension\\SmartPunct\\QuoteProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Extension/SmartPunct/QuoteProcessor.php', + 'League\\CommonMark\\Extension\\SmartPunct\\QuoteRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/SmartPunct/QuoteRenderer.php', + 'League\\CommonMark\\Extension\\SmartPunct\\SmartPunctExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/SmartPunct/SmartPunctExtension.php', + 'League\\CommonMark\\Extension\\Strikethrough\\Strikethrough' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Strikethrough/Strikethrough.php', + 'League\\CommonMark\\Extension\\Strikethrough\\StrikethroughDelimiterProcessor' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Strikethrough/StrikethroughDelimiterProcessor.php', + 'League\\CommonMark\\Extension\\Strikethrough\\StrikethroughExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Strikethrough/StrikethroughExtension.php', + 'League\\CommonMark\\Extension\\Strikethrough\\StrikethroughRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Strikethrough/StrikethroughRenderer.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\AsIsNormalizerStrategy' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/Normalizer/AsIsNormalizerStrategy.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\FlatNormalizerStrategy' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/Normalizer/FlatNormalizerStrategy.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\NormalizerStrategyInterface' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/Normalizer/NormalizerStrategyInterface.php', + 'League\\CommonMark\\Extension\\TableOfContents\\Normalizer\\RelativeNormalizerStrategy' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/Normalizer/RelativeNormalizerStrategy.php', + 'League\\CommonMark\\Extension\\TableOfContents\\TableOfContents' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/TableOfContents.php', + 'League\\CommonMark\\Extension\\TableOfContents\\TableOfContentsBuilder' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/TableOfContentsBuilder.php', + 'League\\CommonMark\\Extension\\TableOfContents\\TableOfContentsExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TableOfContents/TableOfContentsExtension.php', + 'League\\CommonMark\\Extension\\Table\\Table' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/Table.php', + 'League\\CommonMark\\Extension\\Table\\TableCell' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableCell.php', + 'League\\CommonMark\\Extension\\Table\\TableCellRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableCellRenderer.php', + 'League\\CommonMark\\Extension\\Table\\TableExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableExtension.php', + 'League\\CommonMark\\Extension\\Table\\TableParser' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableParser.php', + 'League\\CommonMark\\Extension\\Table\\TableRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableRenderer.php', + 'League\\CommonMark\\Extension\\Table\\TableRow' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableRow.php', + 'League\\CommonMark\\Extension\\Table\\TableRowRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableRowRenderer.php', + 'League\\CommonMark\\Extension\\Table\\TableSection' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableSection.php', + 'League\\CommonMark\\Extension\\Table\\TableSectionRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/Table/TableSectionRenderer.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListExtension' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TaskList/TaskListExtension.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListItemMarker' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TaskList/TaskListItemMarker.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListItemMarkerParser' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TaskList/TaskListItemMarkerParser.php', + 'League\\CommonMark\\Extension\\TaskList\\TaskListItemMarkerRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Extension/TaskList/TaskListItemMarkerRenderer.php', + 'League\\CommonMark\\GithubFlavoredMarkdownConverter' => __DIR__ . '/..' . '/league/commonmark/src/GithubFlavoredMarkdownConverter.php', + 'League\\CommonMark\\HtmlElement' => __DIR__ . '/..' . '/league/commonmark/src/HtmlElement.php', + 'League\\CommonMark\\HtmlRenderer' => __DIR__ . '/..' . '/league/commonmark/src/HtmlRenderer.php', + 'League\\CommonMark\\InlineParserContext' => __DIR__ . '/..' . '/league/commonmark/src/InlineParserContext.php', + 'League\\CommonMark\\InlineParserEngine' => __DIR__ . '/..' . '/league/commonmark/src/InlineParserEngine.php', + 'League\\CommonMark\\Inline\\AdjacentTextMerger' => __DIR__ . '/..' . '/league/commonmark/src/Inline/AdjacentTextMerger.php', + 'League\\CommonMark\\Inline\\Element\\AbstractInline' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/AbstractInline.php', + 'League\\CommonMark\\Inline\\Element\\AbstractStringContainer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/AbstractStringContainer.php', + 'League\\CommonMark\\Inline\\Element\\AbstractWebResource' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/AbstractWebResource.php', + 'League\\CommonMark\\Inline\\Element\\Code' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Code.php', + 'League\\CommonMark\\Inline\\Element\\Emphasis' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Emphasis.php', + 'League\\CommonMark\\Inline\\Element\\HtmlInline' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/HtmlInline.php', + 'League\\CommonMark\\Inline\\Element\\Image' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Image.php', + 'League\\CommonMark\\Inline\\Element\\Link' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Link.php', + 'League\\CommonMark\\Inline\\Element\\Newline' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Newline.php', + 'League\\CommonMark\\Inline\\Element\\Strong' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Strong.php', + 'League\\CommonMark\\Inline\\Element\\Text' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Element/Text.php', + 'League\\CommonMark\\Inline\\Parser\\AutolinkParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/AutolinkParser.php', + 'League\\CommonMark\\Inline\\Parser\\BacktickParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/BacktickParser.php', + 'League\\CommonMark\\Inline\\Parser\\BangParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/BangParser.php', + 'League\\CommonMark\\Inline\\Parser\\CloseBracketParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/CloseBracketParser.php', + 'League\\CommonMark\\Inline\\Parser\\EntityParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/EntityParser.php', + 'League\\CommonMark\\Inline\\Parser\\EscapableParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/EscapableParser.php', + 'League\\CommonMark\\Inline\\Parser\\HtmlInlineParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/HtmlInlineParser.php', + 'League\\CommonMark\\Inline\\Parser\\InlineParserInterface' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/InlineParserInterface.php', + 'League\\CommonMark\\Inline\\Parser\\NewlineParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/NewlineParser.php', + 'League\\CommonMark\\Inline\\Parser\\OpenBracketParser' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Parser/OpenBracketParser.php', + 'League\\CommonMark\\Inline\\Renderer\\CodeRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/CodeRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\EmphasisRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/EmphasisRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\HtmlInlineRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/HtmlInlineRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\ImageRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/ImageRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\InlineRendererInterface' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/InlineRendererInterface.php', + 'League\\CommonMark\\Inline\\Renderer\\LinkRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/LinkRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\NewlineRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/NewlineRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\StrongRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/StrongRenderer.php', + 'League\\CommonMark\\Inline\\Renderer\\TextRenderer' => __DIR__ . '/..' . '/league/commonmark/src/Inline/Renderer/TextRenderer.php', + 'League\\CommonMark\\Input\\MarkdownInput' => __DIR__ . '/..' . '/league/commonmark/src/Input/MarkdownInput.php', + 'League\\CommonMark\\Input\\MarkdownInputInterface' => __DIR__ . '/..' . '/league/commonmark/src/Input/MarkdownInputInterface.php', + 'League\\CommonMark\\MarkdownConverterInterface' => __DIR__ . '/..' . '/league/commonmark/src/MarkdownConverterInterface.php', + 'League\\CommonMark\\Node\\Node' => __DIR__ . '/..' . '/league/commonmark/src/Node/Node.php', + 'League\\CommonMark\\Node\\NodeWalker' => __DIR__ . '/..' . '/league/commonmark/src/Node/NodeWalker.php', + 'League\\CommonMark\\Node\\NodeWalkerEvent' => __DIR__ . '/..' . '/league/commonmark/src/Node/NodeWalkerEvent.php', + 'League\\CommonMark\\Reference\\Reference' => __DIR__ . '/..' . '/league/commonmark/src/Reference/Reference.php', + 'League\\CommonMark\\Reference\\ReferenceInterface' => __DIR__ . '/..' . '/league/commonmark/src/Reference/ReferenceInterface.php', + 'League\\CommonMark\\Reference\\ReferenceMap' => __DIR__ . '/..' . '/league/commonmark/src/Reference/ReferenceMap.php', + 'League\\CommonMark\\Reference\\ReferenceMapInterface' => __DIR__ . '/..' . '/league/commonmark/src/Reference/ReferenceMapInterface.php', + 'League\\CommonMark\\Reference\\ReferenceParser' => __DIR__ . '/..' . '/league/commonmark/src/Reference/ReferenceParser.php', + 'League\\CommonMark\\UnmatchedBlockCloser' => __DIR__ . '/..' . '/league/commonmark/src/UnmatchedBlockCloser.php', + 'League\\CommonMark\\Util\\ArrayCollection' => __DIR__ . '/..' . '/league/commonmark/src/Util/ArrayCollection.php', + 'League\\CommonMark\\Util\\Configuration' => __DIR__ . '/..' . '/league/commonmark/src/Util/Configuration.php', + 'League\\CommonMark\\Util\\ConfigurationAwareInterface' => __DIR__ . '/..' . '/league/commonmark/src/Util/ConfigurationAwareInterface.php', + 'League\\CommonMark\\Util\\ConfigurationInterface' => __DIR__ . '/..' . '/league/commonmark/src/Util/ConfigurationInterface.php', + 'League\\CommonMark\\Util\\Html5Entities' => __DIR__ . '/..' . '/league/commonmark/src/Util/Html5Entities.php', + 'League\\CommonMark\\Util\\Html5EntityDecoder' => __DIR__ . '/..' . '/league/commonmark/src/Util/Html5EntityDecoder.php', + 'League\\CommonMark\\Util\\LinkParserHelper' => __DIR__ . '/..' . '/league/commonmark/src/Util/LinkParserHelper.php', + 'League\\CommonMark\\Util\\PrioritizedList' => __DIR__ . '/..' . '/league/commonmark/src/Util/PrioritizedList.php', + 'League\\CommonMark\\Util\\RegexHelper' => __DIR__ . '/..' . '/league/commonmark/src/Util/RegexHelper.php', + 'League\\CommonMark\\Util\\UrlEncoder' => __DIR__ . '/..' . '/league/commonmark/src/Util/UrlEncoder.php', + 'League\\CommonMark\\Util\\Xml' => __DIR__ . '/..' . '/league/commonmark/src/Util/Xml.php', + 'League\\Flysystem\\AdapterInterface' => __DIR__ . '/..' . '/league/flysystem/src/AdapterInterface.php', + 'League\\Flysystem\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractAdapter.php', + 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php', + 'League\\Flysystem\\Adapter\\CanOverwriteFiles' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/CanOverwriteFiles.php', + 'League\\Flysystem\\Adapter\\Ftp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftp.php', + 'League\\Flysystem\\Adapter\\Ftpd' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftpd.php', + 'League\\Flysystem\\Adapter\\Local' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Local.php', + 'League\\Flysystem\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/NullAdapter.php', + 'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php', + 'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php', + 'League\\Flysystem\\Adapter\\SynologyFtp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/SynologyFtp.php', + 'League\\Flysystem\\Config' => __DIR__ . '/..' . '/league/flysystem/src/Config.php', + 'League\\Flysystem\\ConfigAwareTrait' => __DIR__ . '/..' . '/league/flysystem/src/ConfigAwareTrait.php', + 'League\\Flysystem\\ConnectionErrorException' => __DIR__ . '/..' . '/league/flysystem/src/ConnectionErrorException.php', + 'League\\Flysystem\\ConnectionRuntimeException' => __DIR__ . '/..' . '/league/flysystem/src/ConnectionRuntimeException.php', + 'League\\Flysystem\\Directory' => __DIR__ . '/..' . '/league/flysystem/src/Directory.php', + 'League\\Flysystem\\Exception' => __DIR__ . '/..' . '/league/flysystem/src/Exception.php', + 'League\\Flysystem\\File' => __DIR__ . '/..' . '/league/flysystem/src/File.php', + 'League\\Flysystem\\FileExistsException' => __DIR__ . '/..' . '/league/flysystem/src/FileExistsException.php', + 'League\\Flysystem\\FileNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FileNotFoundException.php', + 'League\\Flysystem\\Filesystem' => __DIR__ . '/..' . '/league/flysystem/src/Filesystem.php', + 'League\\Flysystem\\FilesystemException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemException.php', + 'League\\Flysystem\\FilesystemInterface' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemInterface.php', + 'League\\Flysystem\\FilesystemNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemNotFoundException.php', + 'League\\Flysystem\\Handler' => __DIR__ . '/..' . '/league/flysystem/src/Handler.php', + 'League\\Flysystem\\InvalidRootException' => __DIR__ . '/..' . '/league/flysystem/src/InvalidRootException.php', + 'League\\Flysystem\\MountManager' => __DIR__ . '/..' . '/league/flysystem/src/MountManager.php', + 'League\\Flysystem\\NotSupportedException' => __DIR__ . '/..' . '/league/flysystem/src/NotSupportedException.php', + 'League\\Flysystem\\PluginInterface' => __DIR__ . '/..' . '/league/flysystem/src/PluginInterface.php', + 'League\\Flysystem\\Plugin\\AbstractPlugin' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/AbstractPlugin.php', + 'League\\Flysystem\\Plugin\\EmptyDir' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/EmptyDir.php', + 'League\\Flysystem\\Plugin\\ForcedCopy' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedCopy.php', + 'League\\Flysystem\\Plugin\\ForcedRename' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedRename.php', + 'League\\Flysystem\\Plugin\\GetWithMetadata' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/GetWithMetadata.php', + 'League\\Flysystem\\Plugin\\ListFiles' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListFiles.php', + 'League\\Flysystem\\Plugin\\ListPaths' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListPaths.php', + 'League\\Flysystem\\Plugin\\ListWith' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListWith.php', + 'League\\Flysystem\\Plugin\\PluggableTrait' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluggableTrait.php', + 'League\\Flysystem\\Plugin\\PluginNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluginNotFoundException.php', + 'League\\Flysystem\\ReadInterface' => __DIR__ . '/..' . '/league/flysystem/src/ReadInterface.php', + 'League\\Flysystem\\RootViolationException' => __DIR__ . '/..' . '/league/flysystem/src/RootViolationException.php', + 'League\\Flysystem\\SafeStorage' => __DIR__ . '/..' . '/league/flysystem/src/SafeStorage.php', + 'League\\Flysystem\\UnreadableFileException' => __DIR__ . '/..' . '/league/flysystem/src/UnreadableFileException.php', + 'League\\Flysystem\\Util' => __DIR__ . '/..' . '/league/flysystem/src/Util.php', + 'League\\Flysystem\\Util\\ContentListingFormatter' => __DIR__ . '/..' . '/league/flysystem/src/Util/ContentListingFormatter.php', + 'League\\Flysystem\\Util\\MimeType' => __DIR__ . '/..' . '/league/flysystem/src/Util/MimeType.php', + 'League\\Flysystem\\Util\\StreamHasher' => __DIR__ . '/..' . '/league/flysystem/src/Util/StreamHasher.php', + 'Maatwebsite\\Excel\\Cell' => __DIR__ . '/..' . '/maatwebsite/excel/src/Cell.php', + 'Maatwebsite\\Excel\\ChunkReader' => __DIR__ . '/..' . '/maatwebsite/excel/src/ChunkReader.php', + 'Maatwebsite\\Excel\\Concerns\\Exportable' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/Exportable.php', + 'Maatwebsite\\Excel\\Concerns\\FromArray' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/FromArray.php', + 'Maatwebsite\\Excel\\Concerns\\FromCollection' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/FromCollection.php', + 'Maatwebsite\\Excel\\Concerns\\FromGenerator' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/FromGenerator.php', + 'Maatwebsite\\Excel\\Concerns\\FromIterator' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/FromIterator.php', + 'Maatwebsite\\Excel\\Concerns\\FromQuery' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/FromQuery.php', + 'Maatwebsite\\Excel\\Concerns\\FromView' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/FromView.php', + 'Maatwebsite\\Excel\\Concerns\\Importable' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/Importable.php', + 'Maatwebsite\\Excel\\Concerns\\MapsCsvSettings' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/MapsCsvSettings.php', + 'Maatwebsite\\Excel\\Concerns\\OnEachRow' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/OnEachRow.php', + 'Maatwebsite\\Excel\\Concerns\\RegistersEventListeners' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/RegistersEventListeners.php', + 'Maatwebsite\\Excel\\Concerns\\ShouldAutoSize' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/ShouldAutoSize.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsErrors' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/SkipsErrors.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsFailures' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/SkipsFailures.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsOnError' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/SkipsOnError.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsOnFailure' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/SkipsOnFailure.php', + 'Maatwebsite\\Excel\\Concerns\\SkipsUnknownSheets' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/SkipsUnknownSheets.php', + 'Maatwebsite\\Excel\\Concerns\\ToArray' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/ToArray.php', + 'Maatwebsite\\Excel\\Concerns\\ToCollection' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/ToCollection.php', + 'Maatwebsite\\Excel\\Concerns\\ToModel' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/ToModel.php', + 'Maatwebsite\\Excel\\Concerns\\WithBatchInserts' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithBatchInserts.php', + 'Maatwebsite\\Excel\\Concerns\\WithCalculatedFormulas' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCalculatedFormulas.php', + 'Maatwebsite\\Excel\\Concerns\\WithCharts' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCharts.php', + 'Maatwebsite\\Excel\\Concerns\\WithChunkReading' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithChunkReading.php', + 'Maatwebsite\\Excel\\Concerns\\WithColumnFormatting' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithColumnFormatting.php', + 'Maatwebsite\\Excel\\Concerns\\WithConditionalSheets' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithConditionalSheets.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomChunkSize' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCustomChunkSize.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomCsvSettings' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCustomCsvSettings.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomQuerySize' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCustomQuerySize.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomStartCell' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCustomStartCell.php', + 'Maatwebsite\\Excel\\Concerns\\WithCustomValueBinder' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithCustomValueBinder.php', + 'Maatwebsite\\Excel\\Concerns\\WithDrawings' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithDrawings.php', + 'Maatwebsite\\Excel\\Concerns\\WithEvents' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithEvents.php', + 'Maatwebsite\\Excel\\Concerns\\WithHeadingRow' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithHeadingRow.php', + 'Maatwebsite\\Excel\\Concerns\\WithHeadings' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithHeadings.php', + 'Maatwebsite\\Excel\\Concerns\\WithLimit' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithLimit.php', + 'Maatwebsite\\Excel\\Concerns\\WithMappedCells' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithMappedCells.php', + 'Maatwebsite\\Excel\\Concerns\\WithMapping' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithMapping.php', + 'Maatwebsite\\Excel\\Concerns\\WithMultipleSheets' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithMultipleSheets.php', + 'Maatwebsite\\Excel\\Concerns\\WithPreCalculateFormulas' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithPreCalculateFormulas.php', + 'Maatwebsite\\Excel\\Concerns\\WithProgressBar' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithProgressBar.php', + 'Maatwebsite\\Excel\\Concerns\\WithStartRow' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithStartRow.php', + 'Maatwebsite\\Excel\\Concerns\\WithStrictNullComparison' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithStrictNullComparison.php', + 'Maatwebsite\\Excel\\Concerns\\WithTitle' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithTitle.php', + 'Maatwebsite\\Excel\\Concerns\\WithValidation' => __DIR__ . '/..' . '/maatwebsite/excel/src/Concerns/WithValidation.php', + 'Maatwebsite\\Excel\\Console\\ExportMakeCommand' => __DIR__ . '/..' . '/maatwebsite/excel/src/Console/ExportMakeCommand.php', + 'Maatwebsite\\Excel\\Console\\ImportMakeCommand' => __DIR__ . '/..' . '/maatwebsite/excel/src/Console/ImportMakeCommand.php', + 'Maatwebsite\\Excel\\Console\\WithModelStub' => __DIR__ . '/..' . '/maatwebsite/excel/src/Console/WithModelStub.php', + 'Maatwebsite\\Excel\\DefaultValueBinder' => __DIR__ . '/..' . '/maatwebsite/excel/src/DefaultValueBinder.php', + 'Maatwebsite\\Excel\\DelegatedMacroable' => __DIR__ . '/..' . '/maatwebsite/excel/src/DelegatedMacroable.php', + 'Maatwebsite\\Excel\\Events\\AfterImport' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/AfterImport.php', + 'Maatwebsite\\Excel\\Events\\AfterSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/AfterSheet.php', + 'Maatwebsite\\Excel\\Events\\BeforeExport' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/BeforeExport.php', + 'Maatwebsite\\Excel\\Events\\BeforeImport' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/BeforeImport.php', + 'Maatwebsite\\Excel\\Events\\BeforeSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/BeforeSheet.php', + 'Maatwebsite\\Excel\\Events\\BeforeWriting' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/BeforeWriting.php', + 'Maatwebsite\\Excel\\Events\\Event' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/Event.php', + 'Maatwebsite\\Excel\\Events\\ImportFailed' => __DIR__ . '/..' . '/maatwebsite/excel/src/Events/ImportFailed.php', + 'Maatwebsite\\Excel\\Excel' => __DIR__ . '/..' . '/maatwebsite/excel/src/Excel.php', + 'Maatwebsite\\Excel\\ExcelServiceProvider' => __DIR__ . '/..' . '/maatwebsite/excel/src/ExcelServiceProvider.php', + 'Maatwebsite\\Excel\\Exceptions\\ConcernConflictException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/ConcernConflictException.php', + 'Maatwebsite\\Excel\\Exceptions\\LaravelExcelException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/LaravelExcelException.php', + 'Maatwebsite\\Excel\\Exceptions\\NoFilePathGivenException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/NoFilePathGivenException.php', + 'Maatwebsite\\Excel\\Exceptions\\NoFilenameGivenException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/NoFilenameGivenException.php', + 'Maatwebsite\\Excel\\Exceptions\\NoTypeDetectedException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/NoTypeDetectedException.php', + 'Maatwebsite\\Excel\\Exceptions\\RowSkippedException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/RowSkippedException.php', + 'Maatwebsite\\Excel\\Exceptions\\SheetNotFoundException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/SheetNotFoundException.php', + 'Maatwebsite\\Excel\\Exceptions\\UnreadableFileException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exceptions/UnreadableFileException.php', + 'Maatwebsite\\Excel\\Exporter' => __DIR__ . '/..' . '/maatwebsite/excel/src/Exporter.php', + 'Maatwebsite\\Excel\\Facades\\Excel' => __DIR__ . '/..' . '/maatwebsite/excel/src/Facades/Excel.php', + 'Maatwebsite\\Excel\\Factories\\ReaderFactory' => __DIR__ . '/..' . '/maatwebsite/excel/src/Factories/ReaderFactory.php', + 'Maatwebsite\\Excel\\Factories\\WriterFactory' => __DIR__ . '/..' . '/maatwebsite/excel/src/Factories/WriterFactory.php', + 'Maatwebsite\\Excel\\Fakes\\ExcelFake' => __DIR__ . '/..' . '/maatwebsite/excel/src/Fakes/ExcelFake.php', + 'Maatwebsite\\Excel\\Files\\Disk' => __DIR__ . '/..' . '/maatwebsite/excel/src/Files/Disk.php', + 'Maatwebsite\\Excel\\Files\\Filesystem' => __DIR__ . '/..' . '/maatwebsite/excel/src/Files/Filesystem.php', + 'Maatwebsite\\Excel\\Files\\LocalTemporaryFile' => __DIR__ . '/..' . '/maatwebsite/excel/src/Files/LocalTemporaryFile.php', + 'Maatwebsite\\Excel\\Files\\RemoteTemporaryFile' => __DIR__ . '/..' . '/maatwebsite/excel/src/Files/RemoteTemporaryFile.php', + 'Maatwebsite\\Excel\\Files\\TemporaryFile' => __DIR__ . '/..' . '/maatwebsite/excel/src/Files/TemporaryFile.php', + 'Maatwebsite\\Excel\\Files\\TemporaryFileFactory' => __DIR__ . '/..' . '/maatwebsite/excel/src/Files/TemporaryFileFactory.php', + 'Maatwebsite\\Excel\\Filters\\ChunkReadFilter' => __DIR__ . '/..' . '/maatwebsite/excel/src/Filters/ChunkReadFilter.php', + 'Maatwebsite\\Excel\\HasEventBus' => __DIR__ . '/..' . '/maatwebsite/excel/src/HasEventBus.php', + 'Maatwebsite\\Excel\\HeadingRowImport' => __DIR__ . '/..' . '/maatwebsite/excel/src/HeadingRowImport.php', + 'Maatwebsite\\Excel\\Helpers\\ArrayHelper' => __DIR__ . '/..' . '/maatwebsite/excel/src/Helpers/ArrayHelper.php', + 'Maatwebsite\\Excel\\Helpers\\CellHelper' => __DIR__ . '/..' . '/maatwebsite/excel/src/Helpers/CellHelper.php', + 'Maatwebsite\\Excel\\Helpers\\FileTypeDetector' => __DIR__ . '/..' . '/maatwebsite/excel/src/Helpers/FileTypeDetector.php', + 'Maatwebsite\\Excel\\Importer' => __DIR__ . '/..' . '/maatwebsite/excel/src/Importer.php', + 'Maatwebsite\\Excel\\Imports\\EndRowFinder' => __DIR__ . '/..' . '/maatwebsite/excel/src/Imports/EndRowFinder.php', + 'Maatwebsite\\Excel\\Imports\\HeadingRowExtractor' => __DIR__ . '/..' . '/maatwebsite/excel/src/Imports/HeadingRowExtractor.php', + 'Maatwebsite\\Excel\\Imports\\HeadingRowFormatter' => __DIR__ . '/..' . '/maatwebsite/excel/src/Imports/HeadingRowFormatter.php', + 'Maatwebsite\\Excel\\Imports\\ModelImporter' => __DIR__ . '/..' . '/maatwebsite/excel/src/Imports/ModelImporter.php', + 'Maatwebsite\\Excel\\Imports\\ModelManager' => __DIR__ . '/..' . '/maatwebsite/excel/src/Imports/ModelManager.php', + 'Maatwebsite\\Excel\\Jobs\\AfterImportJob' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AfterImportJob.php', + 'Maatwebsite\\Excel\\Jobs\\AppendDataToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendDataToSheet.php', + 'Maatwebsite\\Excel\\Jobs\\AppendQueryToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendQueryToSheet.php', + 'Maatwebsite\\Excel\\Jobs\\AppendViewToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendViewToSheet.php', + 'Maatwebsite\\Excel\\Jobs\\CloseSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/CloseSheet.php', + 'Maatwebsite\\Excel\\Jobs\\ExtendedQueueable' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/ExtendedQueueable.php', + 'Maatwebsite\\Excel\\Jobs\\ProxyFailures' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/ProxyFailures.php', + 'Maatwebsite\\Excel\\Jobs\\QueueExport' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/QueueExport.php', + 'Maatwebsite\\Excel\\Jobs\\QueueImport' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/QueueImport.php', + 'Maatwebsite\\Excel\\Jobs\\ReadChunk' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/ReadChunk.php', + 'Maatwebsite\\Excel\\Jobs\\StoreQueuedExport' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/StoreQueuedExport.php', + 'Maatwebsite\\Excel\\MappedReader' => __DIR__ . '/..' . '/maatwebsite/excel/src/MappedReader.php', + 'Maatwebsite\\Excel\\Mixins\\DownloadCollection' => __DIR__ . '/..' . '/maatwebsite/excel/src/Mixins/DownloadCollection.php', + 'Maatwebsite\\Excel\\Mixins\\StoreCollection' => __DIR__ . '/..' . '/maatwebsite/excel/src/Mixins/StoreCollection.php', + 'Maatwebsite\\Excel\\QueuedWriter' => __DIR__ . '/..' . '/maatwebsite/excel/src/QueuedWriter.php', + 'Maatwebsite\\Excel\\Reader' => __DIR__ . '/..' . '/maatwebsite/excel/src/Reader.php', + 'Maatwebsite\\Excel\\RegistersCustomConcerns' => __DIR__ . '/..' . '/maatwebsite/excel/src/RegistersCustomConcerns.php', + 'Maatwebsite\\Excel\\Row' => __DIR__ . '/..' . '/maatwebsite/excel/src/Row.php', + 'Maatwebsite\\Excel\\Sheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Sheet.php', + 'Maatwebsite\\Excel\\Transactions\\DbTransactionHandler' => __DIR__ . '/..' . '/maatwebsite/excel/src/Transactions/DbTransactionHandler.php', + 'Maatwebsite\\Excel\\Transactions\\NullTransactionHandler' => __DIR__ . '/..' . '/maatwebsite/excel/src/Transactions/NullTransactionHandler.php', + 'Maatwebsite\\Excel\\Transactions\\TransactionHandler' => __DIR__ . '/..' . '/maatwebsite/excel/src/Transactions/TransactionHandler.php', + 'Maatwebsite\\Excel\\Transactions\\TransactionManager' => __DIR__ . '/..' . '/maatwebsite/excel/src/Transactions/TransactionManager.php', + 'Maatwebsite\\Excel\\Validators\\Failure' => __DIR__ . '/..' . '/maatwebsite/excel/src/Validators/Failure.php', + 'Maatwebsite\\Excel\\Validators\\RowValidator' => __DIR__ . '/..' . '/maatwebsite/excel/src/Validators/RowValidator.php', + 'Maatwebsite\\Excel\\Validators\\ValidationException' => __DIR__ . '/..' . '/maatwebsite/excel/src/Validators/ValidationException.php', + 'Maatwebsite\\Excel\\Writer' => __DIR__ . '/..' . '/maatwebsite/excel/src/Writer.php', + 'Matrix\\Builder' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Builder.php', + 'Matrix\\Exception' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Exception.php', + 'Matrix\\Functions' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Functions.php', + 'Matrix\\Matrix' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Matrix.php', + 'Matrix\\Operators\\Addition' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Operators/Addition.php', + 'Matrix\\Operators\\DirectSum' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Operators/DirectSum.php', + 'Matrix\\Operators\\Division' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Operators/Division.php', + 'Matrix\\Operators\\Multiplication' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Operators/Multiplication.php', + 'Matrix\\Operators\\Operator' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Operators/Operator.php', + 'Matrix\\Operators\\Subtraction' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/Operators/Subtraction.php', + 'Mockery' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery.php', + 'Mockery\\Adapter\\Phpunit\\MockeryPHPUnitIntegration' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryPHPUnitIntegration.php', + 'Mockery\\Adapter\\Phpunit\\MockeryPHPUnitIntegrationAssertPostConditions' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryPHPUnitIntegrationAssertPostConditions.php', + 'Mockery\\Adapter\\Phpunit\\MockeryTestCase' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryTestCase.php', + 'Mockery\\Adapter\\Phpunit\\MockeryTestCaseSetUp' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Adapter/Phpunit/MockeryTestCaseSetUp.php', + 'Mockery\\Adapter\\Phpunit\\TestListener' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php', + 'Mockery\\Adapter\\Phpunit\\TestListenerTrait' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListenerTrait.php', + 'Mockery\\ClosureWrapper' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/ClosureWrapper.php', + 'Mockery\\CompositeExpectation' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/CompositeExpectation.php', + 'Mockery\\Configuration' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Configuration.php', + 'Mockery\\Container' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Container.php', + 'Mockery\\CountValidator\\AtLeast' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/CountValidator/AtLeast.php', + 'Mockery\\CountValidator\\AtMost' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/CountValidator/AtMost.php', + 'Mockery\\CountValidator\\CountValidatorAbstract' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/CountValidator/CountValidatorAbstract.php', + 'Mockery\\CountValidator\\Exact' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/CountValidator/Exact.php', + 'Mockery\\CountValidator\\Exception' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/CountValidator/Exception.php', + 'Mockery\\Exception' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception.php', + 'Mockery\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception/BadMethodCallException.php', + 'Mockery\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception/InvalidArgumentException.php', + 'Mockery\\Exception\\InvalidCountException' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception/InvalidCountException.php', + 'Mockery\\Exception\\InvalidOrderException' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception/InvalidOrderException.php', + 'Mockery\\Exception\\NoMatchingExpectationException' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception/NoMatchingExpectationException.php', + 'Mockery\\Exception\\RuntimeException' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Exception/RuntimeException.php', + 'Mockery\\Expectation' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Expectation.php', + 'Mockery\\ExpectationDirector' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/ExpectationDirector.php', + 'Mockery\\ExpectationInterface' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/ExpectationInterface.php', + 'Mockery\\ExpectsHigherOrderMessage' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/ExpectsHigherOrderMessage.php', + 'Mockery\\Generator\\CachingGenerator' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/CachingGenerator.php', + 'Mockery\\Generator\\DefinedTargetClass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/DefinedTargetClass.php', + 'Mockery\\Generator\\Generator' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/Generator.php', + 'Mockery\\Generator\\Method' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/Method.php', + 'Mockery\\Generator\\MockConfiguration' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/MockConfiguration.php', + 'Mockery\\Generator\\MockConfigurationBuilder' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/MockConfigurationBuilder.php', + 'Mockery\\Generator\\MockDefinition' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/MockDefinition.php', + 'Mockery\\Generator\\MockNameBuilder' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/MockNameBuilder.php', + 'Mockery\\Generator\\Parameter' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/Parameter.php', + 'Mockery\\Generator\\StringManipulationGenerator' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulationGenerator.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\AvoidMethodClashPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/AvoidMethodClashPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\CallTypeHintPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/CallTypeHintPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\ClassNamePass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ClassNamePass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\ClassPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ClassPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\ConstantsPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/ConstantsPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\InstanceMockPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/InstanceMockPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\InterfacePass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/InterfacePass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\MagicMethodTypeHintsPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/MagicMethodTypeHintsPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\MethodDefinitionPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/MethodDefinitionPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\Pass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/Pass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\RemoveBuiltinMethodsThatAreFinalPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\RemoveDestructorPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveDestructorPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\RemoveUnserializeForInternalSerializableClassesPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/RemoveUnserializeForInternalSerializableClassesPass.php', + 'Mockery\\Generator\\StringManipulation\\Pass\\TraitPass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/StringManipulation/Pass/TraitPass.php', + 'Mockery\\Generator\\TargetClassInterface' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/TargetClassInterface.php', + 'Mockery\\Generator\\UndefinedTargetClass' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Generator/UndefinedTargetClass.php', + 'Mockery\\HigherOrderMessage' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/HigherOrderMessage.php', + 'Mockery\\Instantiator' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Instantiator.php', + 'Mockery\\LegacyMockInterface' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/LegacyMockInterface.php', + 'Mockery\\Loader\\EvalLoader' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Loader/EvalLoader.php', + 'Mockery\\Loader\\Loader' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Loader/Loader.php', + 'Mockery\\Loader\\RequireLoader' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Loader/RequireLoader.php', + 'Mockery\\Matcher\\AndAnyOtherArgs' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/AndAnyOtherArgs.php', + 'Mockery\\Matcher\\Any' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Any.php', + 'Mockery\\Matcher\\AnyArgs' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/AnyArgs.php', + 'Mockery\\Matcher\\AnyOf' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/AnyOf.php', + 'Mockery\\Matcher\\ArgumentListMatcher' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/ArgumentListMatcher.php', + 'Mockery\\Matcher\\Closure' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Closure.php', + 'Mockery\\Matcher\\Contains' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Contains.php', + 'Mockery\\Matcher\\Ducktype' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Ducktype.php', + 'Mockery\\Matcher\\HasKey' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/HasKey.php', + 'Mockery\\Matcher\\HasValue' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/HasValue.php', + 'Mockery\\Matcher\\MatcherAbstract' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/MatcherAbstract.php', + 'Mockery\\Matcher\\MultiArgumentClosure' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/MultiArgumentClosure.php', + 'Mockery\\Matcher\\MustBe' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/MustBe.php', + 'Mockery\\Matcher\\NoArgs' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/NoArgs.php', + 'Mockery\\Matcher\\Not' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Not.php', + 'Mockery\\Matcher\\NotAnyOf' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/NotAnyOf.php', + 'Mockery\\Matcher\\PHPUnitConstraint' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/PHPUnitConstraint.php', + 'Mockery\\Matcher\\Pattern' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Pattern.php', + 'Mockery\\Matcher\\Subset' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Subset.php', + 'Mockery\\Matcher\\Type' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Matcher/Type.php', + 'Mockery\\MethodCall' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/MethodCall.php', + 'Mockery\\Mock' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Mock.php', + 'Mockery\\MockInterface' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/MockInterface.php', + 'Mockery\\ReceivedMethodCalls' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/ReceivedMethodCalls.php', + 'Mockery\\Undefined' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Undefined.php', + 'Mockery\\VerificationDirector' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/VerificationDirector.php', + 'Mockery\\VerificationExpectation' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/VerificationExpectation.php', + 'Monolog\\DateTimeImmutable' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/DateTimeImmutable.php', + 'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php', + 'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', + 'Monolog\\Formatter\\ElasticaFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php', + 'Monolog\\Formatter\\ElasticsearchFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php', + 'Monolog\\Formatter\\FlowdockFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php', + 'Monolog\\Formatter\\FluentdFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php', + 'Monolog\\Formatter\\FormatterInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', + 'Monolog\\Formatter\\GelfMessageFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php', + 'Monolog\\Formatter\\HtmlFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php', + 'Monolog\\Formatter\\JsonFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php', + 'Monolog\\Formatter\\LineFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', + 'Monolog\\Formatter\\LogglyFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php', + 'Monolog\\Formatter\\LogmaticFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php', + 'Monolog\\Formatter\\LogstashFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php', + 'Monolog\\Formatter\\MongoDBFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php', + 'Monolog\\Formatter\\NormalizerFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', + 'Monolog\\Formatter\\ScalarFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php', + 'Monolog\\Formatter\\WildfireFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php', + 'Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', + 'Monolog\\Handler\\AbstractProcessingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', + 'Monolog\\Handler\\AbstractSyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php', + 'Monolog\\Handler\\AmqpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php', + 'Monolog\\Handler\\BrowserConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php', + 'Monolog\\Handler\\BufferHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php', + 'Monolog\\Handler\\ChromePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php', + 'Monolog\\Handler\\CouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php', + 'Monolog\\Handler\\CubeHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php', + 'Monolog\\Handler\\Curl\\Util' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php', + 'Monolog\\Handler\\DeduplicationHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php', + 'Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', + 'Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', + 'Monolog\\Handler\\ElasticaHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', + 'Monolog\\Handler\\ElasticsearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', + 'Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', + 'Monolog\\Handler\\FallbackGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', + 'Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', + 'Monolog\\Handler\\FingersCrossedHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php', + 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php', + 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php', + 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php', + 'Monolog\\Handler\\FirePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php', + 'Monolog\\Handler\\FleepHookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php', + 'Monolog\\Handler\\FlowdockHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php', + 'Monolog\\Handler\\FormattableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php', + 'Monolog\\Handler\\FormattableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php', + 'Monolog\\Handler\\GelfHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php', + 'Monolog\\Handler\\GroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php', + 'Monolog\\Handler\\Handler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Handler.php', + 'Monolog\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', + 'Monolog\\Handler\\HandlerWrapper' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php', + 'Monolog\\Handler\\IFTTTHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php', + 'Monolog\\Handler\\InsightOpsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php', + 'Monolog\\Handler\\LogEntriesHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php', + 'Monolog\\Handler\\LogglyHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php', + 'Monolog\\Handler\\LogmaticHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php', + 'Monolog\\Handler\\MailHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MailHandler.php', + 'Monolog\\Handler\\MandrillHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php', + 'Monolog\\Handler\\MissingExtensionException' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php', + 'Monolog\\Handler\\MongoDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php', + 'Monolog\\Handler\\NativeMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php', + 'Monolog\\Handler\\NewRelicHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php', + 'Monolog\\Handler\\NoopHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NoopHandler.php', + 'Monolog\\Handler\\NullHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NullHandler.php', + 'Monolog\\Handler\\OverflowHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/OverflowHandler.php', + 'Monolog\\Handler\\PHPConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php', + 'Monolog\\Handler\\ProcessHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessHandler.php', + 'Monolog\\Handler\\ProcessableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php', + 'Monolog\\Handler\\ProcessableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php', + 'Monolog\\Handler\\PsrHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php', + 'Monolog\\Handler\\PushoverHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php', + 'Monolog\\Handler\\RedisHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php', + 'Monolog\\Handler\\RollbarHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php', + 'Monolog\\Handler\\RotatingFileHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php', + 'Monolog\\Handler\\SamplingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php', + 'Monolog\\Handler\\SendGridHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SendGridHandler.php', + 'Monolog\\Handler\\SlackHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php', + 'Monolog\\Handler\\SlackWebhookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php', + 'Monolog\\Handler\\Slack\\SlackRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php', + 'Monolog\\Handler\\SocketHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php', + 'Monolog\\Handler\\SqsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php', + 'Monolog\\Handler\\StreamHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', + 'Monolog\\Handler\\SwiftMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php', + 'Monolog\\Handler\\SyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', + 'Monolog\\Handler\\SyslogUdpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', + 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', + 'Monolog\\Handler\\TelegramBotHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php', + 'Monolog\\Handler\\TestHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TestHandler.php', + 'Monolog\\Handler\\WebRequestRecognizerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php', + 'Monolog\\Handler\\WhatFailureGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', + 'Monolog\\Handler\\ZendMonitorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', + 'Monolog\\Logger' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Logger.php', + 'Monolog\\Processor\\GitProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', + 'Monolog\\Processor\\HostnameProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php', + 'Monolog\\Processor\\IntrospectionProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', + 'Monolog\\Processor\\MemoryPeakUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php', + 'Monolog\\Processor\\MemoryProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', + 'Monolog\\Processor\\MemoryUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', + 'Monolog\\Processor\\MercurialProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php', + 'Monolog\\Processor\\ProcessIdProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php', + 'Monolog\\Processor\\ProcessorInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', + 'Monolog\\Processor\\PsrLogMessageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php', + 'Monolog\\Processor\\TagProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php', + 'Monolog\\Processor\\UidProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php', + 'Monolog\\Processor\\WebProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php', + 'Monolog\\Registry' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Registry.php', + 'Monolog\\ResettableInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ResettableInterface.php', + 'Monolog\\SignalHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/SignalHandler.php', + 'Monolog\\Test\\TestCase' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Test/TestCase.php', + 'Monolog\\Utils' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Utils.php', + 'MyCLabs\\Enum\\Enum' => __DIR__ . '/..' . '/myclabs/php-enum/src/Enum.php', + 'MyCLabs\\Enum\\PHPUnit\\Comparator' => __DIR__ . '/..' . '/myclabs/php-enum/src/PHPUnit/Comparator.php', + 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/CollisionServiceProvider.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\Commands\\TestCommand' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/Commands/TestCommand.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\ExceptionHandler' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/ExceptionHandler.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\IgnitionSolutionsRepository' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/IgnitionSolutionsRepository.php', + 'NunoMaduro\\Collision\\Adapters\\Laravel\\Inspector' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/Inspector.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\ConfigureIO' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/ConfigureIO.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\Printer' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/Printer.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\PrinterContents' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/PrinterContents.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\State' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/State.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\Style' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/Style.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\TestResult' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/TestResult.php', + 'NunoMaduro\\Collision\\Adapters\\Phpunit\\Timer' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Phpunit/Timer.php', + 'NunoMaduro\\Collision\\ArgumentFormatter' => __DIR__ . '/..' . '/nunomaduro/collision/src/ArgumentFormatter.php', + 'NunoMaduro\\Collision\\ConsoleColor' => __DIR__ . '/..' . '/nunomaduro/collision/src/ConsoleColor.php', + 'NunoMaduro\\Collision\\Contracts\\Adapters\\Phpunit\\HasPrintableTestCaseName' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/Adapters/Phpunit/HasPrintableTestCaseName.php', + 'NunoMaduro\\Collision\\Contracts\\Adapters\\Phpunit\\Listener' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/Adapters/Phpunit/Listener.php', + 'NunoMaduro\\Collision\\Contracts\\ArgumentFormatter' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/ArgumentFormatter.php', + 'NunoMaduro\\Collision\\Contracts\\Handler' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/Handler.php', + 'NunoMaduro\\Collision\\Contracts\\Highlighter' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/Highlighter.php', + 'NunoMaduro\\Collision\\Contracts\\Provider' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/Provider.php', + 'NunoMaduro\\Collision\\Contracts\\SolutionsRepository' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/SolutionsRepository.php', + 'NunoMaduro\\Collision\\Contracts\\Writer' => __DIR__ . '/..' . '/nunomaduro/collision/src/Contracts/Writer.php', + 'NunoMaduro\\Collision\\Exceptions\\ShouldNotHappen' => __DIR__ . '/..' . '/nunomaduro/collision/src/Exceptions/ShouldNotHappen.php', + 'NunoMaduro\\Collision\\Handler' => __DIR__ . '/..' . '/nunomaduro/collision/src/Handler.php', + 'NunoMaduro\\Collision\\Highlighter' => __DIR__ . '/..' . '/nunomaduro/collision/src/Highlighter.php', + 'NunoMaduro\\Collision\\Provider' => __DIR__ . '/..' . '/nunomaduro/collision/src/Provider.php', + 'NunoMaduro\\Collision\\SolutionsRepositories\\NullSolutionsRepository' => __DIR__ . '/..' . '/nunomaduro/collision/src/SolutionsRepositories/NullSolutionsRepository.php', + 'NunoMaduro\\Collision\\Writer' => __DIR__ . '/..' . '/nunomaduro/collision/src/Writer.php', + 'Opis\\Closure\\Analyzer' => __DIR__ . '/..' . '/opis/closure/src/Analyzer.php', + 'Opis\\Closure\\ClosureContext' => __DIR__ . '/..' . '/opis/closure/src/ClosureContext.php', + 'Opis\\Closure\\ClosureScope' => __DIR__ . '/..' . '/opis/closure/src/ClosureScope.php', + 'Opis\\Closure\\ClosureStream' => __DIR__ . '/..' . '/opis/closure/src/ClosureStream.php', + 'Opis\\Closure\\ISecurityProvider' => __DIR__ . '/..' . '/opis/closure/src/ISecurityProvider.php', + 'Opis\\Closure\\ReflectionClosure' => __DIR__ . '/..' . '/opis/closure/src/ReflectionClosure.php', + 'Opis\\Closure\\SecurityException' => __DIR__ . '/..' . '/opis/closure/src/SecurityException.php', + 'Opis\\Closure\\SecurityProvider' => __DIR__ . '/..' . '/opis/closure/src/SecurityProvider.php', + 'Opis\\Closure\\SelfReference' => __DIR__ . '/..' . '/opis/closure/src/SelfReference.php', + 'Opis\\Closure\\SerializableClosure' => __DIR__ . '/..' . '/opis/closure/src/SerializableClosure.php', + 'OrganizeSeeder' => __DIR__ . '/../..' . '/database/seeds/OrganizeSeeder.php', + 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', + 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', + 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit\\Framework\\Constraint\\ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit\\Framework\\Constraint\\Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit\\Framework\\Constraint\\Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', + 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', + 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', + 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', + 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', + 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', + 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', + 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', + 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', + 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', + 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', + 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', + 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', + 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', + 'PHPUnit\\Framework\\Error\\Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit\\Framework\\Error\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Error.php', + 'PHPUnit\\Framework\\Error\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit\\Framework\\Error\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', + 'PHPUnit\\Framework\\ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', + 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit\\Framework\\IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', + 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', + 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', + 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', + 'PHPUnit\\Framework\\InvalidParameterGroupException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', + 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', + 'PHPUnit\\Framework\\MockObject\\Api' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', + 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', + 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', + 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', + 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', + 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', + 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', + 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', + 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit\\Framework\\MockObject\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', + 'PHPUnit\\Framework\\MockObject\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', + 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', + 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', + 'PHPUnit\\Framework\\MockObject\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', + 'PHPUnit\\Framework\\MockObject\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', + 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', + 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', + 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', + 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', + 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', + 'PHPUnit\\Framework\\PHPTAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', + 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', + 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit\\Framework\\SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit\\Framework\\SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', + 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', + 'PHPUnit\\Framework\\SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', + 'PHPUnit\\Framework\\SyntheticSkippedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', + 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', + 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit\\Framework\\TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', + 'PHPUnit\\Framework\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', + 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', + 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Warning.php', + 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', + 'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', + 'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', + 'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', + 'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', + 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', + 'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', + 'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', + 'PHPUnit\\Runner\\AfterTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', + 'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', + 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', + 'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', + 'PHPUnit\\Runner\\DefaultTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', + 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', + 'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php', + 'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', + 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', + 'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', + 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', + 'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', + 'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResultCache.php', + 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', + 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception.php', + 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', + 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', + 'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php', + 'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', + 'PHPUnit\\Util\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit\\Util\\ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', + 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', + 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php', + 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit\\Util\\InvalidDataSetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', + 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', + 'PHPUnit\\Util\\Log\\JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit\\Util\\Log\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php', + 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', + 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', + 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', + 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', + 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', + 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', + 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', + 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', + 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', + 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', + 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Util' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Util.php', + 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PermissionSeeder' => __DIR__ . '/../..' . '/database/seeds/PermissionSeeder.php', + 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', + 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', + 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', + 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', + 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', + 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', + 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', + 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', + 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', + 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', + 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', + 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', + 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', + 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', + 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', + 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', + 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', + 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', + 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', + 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', + 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', + 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', + 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', + 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', + 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', + 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', + 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', + 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', + 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', + 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', + 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', + 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', + 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', + 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', + 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', + 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', + 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', + 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', + 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', + 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', + 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', + 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', + 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', + 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', + 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', + 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', + 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', + 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', + 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', + 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', + 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', + 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', + 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', + 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', + 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', + 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', + 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', + 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', + 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', + 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', + 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', + 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', + 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', + 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', + 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', + 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', + 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Calculation' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Category' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Database' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\DateTime' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Engine\\CyclicReferenceStack' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Engine\\Logger' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Engineering' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Exception' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\ExceptionHandler' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Financial' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\FormulaParser' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\FormulaToken' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Functions' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Logical' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\LookupRef' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\MathTrig' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Statistical' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\TextData' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php', + 'PhpOffice\\PhpSpreadsheet\\Calculation\\Token\\Stack' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\AdvancedValueBinder' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AdvancedValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\Cell' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DataType' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DataValidation' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DataValidator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\DefaultValueBinder' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\Hyperlink' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\IValueBinder' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Cell\\StringValueBinder' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/StringValueBinder.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Axis' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Chart' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\DataSeries' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\DataSeriesValues' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Exception' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\GridLines' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/GridLines.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Layout' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Legend' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\PlotArea' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Properties' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Renderer\\IRenderer' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Renderer\\JpGraph' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php', + 'PhpOffice\\PhpSpreadsheet\\Chart\\Title' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php', + 'PhpOffice\\PhpSpreadsheet\\Collection\\Cells' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php', + 'PhpOffice\\PhpSpreadsheet\\Collection\\CellsFactory' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php', + 'PhpOffice\\PhpSpreadsheet\\Collection\\Memory' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php', + 'PhpOffice\\PhpSpreadsheet\\Comment' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php', + 'PhpOffice\\PhpSpreadsheet\\DocumentGenerator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DocumentGenerator.php', + 'PhpOffice\\PhpSpreadsheet\\Document\\Properties' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Document\\Security' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php', + 'PhpOffice\\PhpSpreadsheet\\Exception' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\HashTable' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/HashTable.php', + 'PhpOffice\\PhpSpreadsheet\\Helper\\Html' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php', + 'PhpOffice\\PhpSpreadsheet\\Helper\\Sample' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php', + 'PhpOffice\\PhpSpreadsheet\\IComparable' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php', + 'PhpOffice\\PhpSpreadsheet\\IOFactory' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php', + 'PhpOffice\\PhpSpreadsheet\\NamedRange' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\BaseReader' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Csv' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\DefaultReadFilter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Exception' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Gnumeric' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Html' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\IReadFilter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\IReader' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReader.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Ods' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Ods\\Properties' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Security\\XmlScanner' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Slk' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color\\BIFF5' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color\\BIFF8' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Color\\BuiltIn' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\ErrorCode' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Escher' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\MD5' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\RC4' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Style\\Border' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xls\\Style\\FillPattern' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\AutoFilter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\BaseParserClass' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Chart' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\ColumnAndRowAttributes' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\ConditionalStyles' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\DataValidations' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Hyperlinks' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\PageSetup' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Properties' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\SheetViewOptions' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\SheetViews' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Styles' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xlsx\\Theme' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php', + 'PhpOffice\\PhpSpreadsheet\\Reader\\Xml' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php', + 'PhpOffice\\PhpSpreadsheet\\ReferenceHelper' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\ITextElement' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\RichText' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/RichText.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\Run' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php', + 'PhpOffice\\PhpSpreadsheet\\RichText\\TextElement' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php', + 'PhpOffice\\PhpSpreadsheet\\Settings' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\CodePage' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Date' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Drawing' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DgContainer' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DgContainer\\SpgrContainer' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DgContainer\\SpgrContainer\\SpContainer' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\\BstoreContainer' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\\BstoreContainer\\BSE' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Escher\\DggContainer\\BstoreContainer\\BSE\\Blip' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\File' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Font' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\CholeskyDecomposition' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CholeskyDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\EigenvalueDecomposition' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\LUDecomposition' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\Matrix' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\QRDecomposition' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/QRDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\JAMA\\SingularValueDecomposition' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLERead' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\ChainedBlockStream' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS\\File' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\OLE\\PPS\\Root' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\PasswordHasher' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\StringHelper' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\TimeZone' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\BestFit' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\ExponentialBestFit' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\LinearBestFit' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\LogarithmicBestFit' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\PolynomialBestFit' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\PowerBestFit' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Trend\\Trend' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\XMLWriter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php', + 'PhpOffice\\PhpSpreadsheet\\Shared\\Xls' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php', + 'PhpOffice\\PhpSpreadsheet\\Spreadsheet' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Alignment' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Border' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Borders' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Color' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Conditional' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Fill' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Font' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\NumberFormat' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Protection' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Style' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php', + 'PhpOffice\\PhpSpreadsheet\\Style\\Supervisor' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter\\Column' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\AutoFilter\\Column\\Rule' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\BaseDrawing' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\CellIterator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Column' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\ColumnCellIterator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\ColumnDimension' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\ColumnIterator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Dimension' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Drawing' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Drawing\\Shadow' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\HeaderFooter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\HeaderFooterDrawing' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Iterator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\MemoryDrawing' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\PageMargins' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\PageSetup' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Protection' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Row' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\RowCellIterator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\RowDimension' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\RowIterator' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\SheetView' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php', + 'PhpOffice\\PhpSpreadsheet\\Worksheet\\Worksheet' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\BaseWriter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Csv' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Exception' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Html' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\IWriter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Cell\\Comment' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Content' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Meta' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\MetaInf' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Mimetype' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Settings' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Styles' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\Thumbnails' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Ods\\WriterPart' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/WriterPart.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\Dompdf' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\Mpdf' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\Tcpdf' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\BIFFwriter' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Escher' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Font' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Parser' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Workbook' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Worksheet' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xls\\Xf' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Chart' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Comments' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\ContentTypes' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\DocProps' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Drawing' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Rels' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\RelsRibbon' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\RelsVBA' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\StringTable' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Style' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Theme' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Workbook' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Worksheet' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\WriterPart' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php', + 'PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx\\Xlfn' => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php', + 'PhpOption\\LazyOption' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/LazyOption.php', + 'PhpOption\\None' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/None.php', + 'PhpOption\\Option' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/Option.php', + 'PhpOption\\Some' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/Some.php', + 'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', + 'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', + 'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', + 'PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', + 'PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', + 'PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', + 'PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', + 'PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', + 'PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', + 'PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', + 'PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', + 'PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', + 'PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', + 'PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', + 'PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', + 'PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', + 'PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php', + 'PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', + 'PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', + 'PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', + 'PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php', + 'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', + 'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', + 'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', + 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', + 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', + 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', + 'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', + 'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', + 'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', + 'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', + 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulatorInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulatorInterface.php', + 'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', + 'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', + 'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', + 'PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', + 'PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', + 'PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', + 'PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', + 'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', + 'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', + 'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', + 'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', + 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', + 'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', + 'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', + 'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', + 'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', + 'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', + 'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', + 'PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', + 'PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', + 'PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', + 'PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', + 'PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', + 'PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', + 'PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', + 'PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', + 'PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', + 'PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', + 'PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', + 'PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', + 'PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', + 'PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', + 'PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', + 'PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', + 'PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', + 'PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', + 'PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', + 'PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', + 'PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', + 'PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', + 'PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', + 'PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', + 'PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', + 'PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', + 'PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', + 'PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', + 'PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', + 'PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', + 'PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', + 'PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', + 'PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', + 'PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', + 'PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', + 'PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', + 'PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', + 'PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', + 'PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', + 'PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', + 'PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', + 'PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', + 'PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', + 'PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', + 'PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', + 'PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', + 'PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', + 'PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', + 'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', + 'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', + 'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', + 'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', + 'PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', + 'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', + 'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', + 'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', + 'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', + 'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', + 'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', + 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', + 'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', + 'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', + 'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', + 'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', + 'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', + 'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', + 'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', + 'PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', + 'PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', + 'PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', + 'PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', + 'PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', + 'PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', + 'PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', + 'PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', + 'PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', + 'PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', + 'PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', + 'PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', + 'PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', + 'PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', + 'PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', + 'PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', + 'PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', + 'PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', + 'PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', + 'PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', + 'PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', + 'PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', + 'PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', + 'PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', + 'PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', + 'PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', + 'PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', + 'PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', + 'PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', + 'PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', + 'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', + 'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', + 'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', + 'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', + 'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', + 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', + 'PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', + 'PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', + 'PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', + 'PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', + 'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', + 'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', + 'PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', + 'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', + 'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', + 'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', + 'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', + 'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', + 'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', + 'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', + 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', + 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', + 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', + 'Prettus\\Repository\\Contracts\\CacheableInterface' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/CacheableInterface.php', + 'Prettus\\Repository\\Contracts\\CriteriaInterface' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/CriteriaInterface.php', + 'Prettus\\Repository\\Contracts\\Presentable' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/Presentable.php', + 'Prettus\\Repository\\Contracts\\PresenterInterface' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/PresenterInterface.php', + 'Prettus\\Repository\\Contracts\\RepositoryCriteriaInterface' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/RepositoryCriteriaInterface.php', + 'Prettus\\Repository\\Contracts\\RepositoryInterface' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/RepositoryInterface.php', + 'Prettus\\Repository\\Contracts\\Transformable' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Contracts/Transformable.php', + 'Prettus\\Repository\\Criteria\\RequestCriteria' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Criteria/RequestCriteria.php', + 'Prettus\\Repository\\Eloquent\\BaseRepository' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Eloquent/BaseRepository.php', + 'Prettus\\Repository\\Events\\RepositoryEntityCreated' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityCreated.php', + 'Prettus\\Repository\\Events\\RepositoryEntityDeleted' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityDeleted.php', + 'Prettus\\Repository\\Events\\RepositoryEntityUpdated' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEntityUpdated.php', + 'Prettus\\Repository\\Events\\RepositoryEventBase' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Events/RepositoryEventBase.php', + 'Prettus\\Repository\\Exceptions\\RepositoryException' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Exceptions/RepositoryException.php', + 'Prettus\\Repository\\Generators\\ApiControllerGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/ApiControllerGenerator.php', + 'Prettus\\Repository\\Generators\\ApiRepositoryEloquentGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/ApiRepositoryEloquentGenerator.php', + 'Prettus\\Repository\\Generators\\BindingsGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/BindingsGenerator.php', + 'Prettus\\Repository\\Generators\\Commands\\ApiControllerCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ApiControllerCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\ApiRepositoryCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ApiRepositoryCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\BindingsCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/BindingsCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\ControllerCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ControllerCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\CriteriaCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/CriteriaCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\EntityCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/EntityCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\PresenterCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/PresenterCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\RepositoryCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/RepositoryCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\TransformerCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/TransformerCommand.php', + 'Prettus\\Repository\\Generators\\Commands\\ValidatorCommand' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Commands/ValidatorCommand.php', + 'Prettus\\Repository\\Generators\\ControllerGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/ControllerGenerator.php', + 'Prettus\\Repository\\Generators\\CriteriaGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/CriteriaGenerator.php', + 'Prettus\\Repository\\Generators\\FileAlreadyExistsException' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/FileAlreadyExistsException.php', + 'Prettus\\Repository\\Generators\\Generator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Generator.php', + 'Prettus\\Repository\\Generators\\MigrationGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/MigrationGenerator.php', + 'Prettus\\Repository\\Generators\\Migrations\\NameParser' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/NameParser.php', + 'Prettus\\Repository\\Generators\\Migrations\\RulesParser' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/RulesParser.php', + 'Prettus\\Repository\\Generators\\Migrations\\SchemaParser' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Migrations/SchemaParser.php', + 'Prettus\\Repository\\Generators\\ModelGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/ModelGenerator.php', + 'Prettus\\Repository\\Generators\\PresenterGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/PresenterGenerator.php', + 'Prettus\\Repository\\Generators\\RepositoryEloquentGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/RepositoryEloquentGenerator.php', + 'Prettus\\Repository\\Generators\\RepositoryInterfaceGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/RepositoryInterfaceGenerator.php', + 'Prettus\\Repository\\Generators\\Stub' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/Stub.php', + 'Prettus\\Repository\\Generators\\TransformerGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/TransformerGenerator.php', + 'Prettus\\Repository\\Generators\\ValidatorGenerator' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Generators/ValidatorGenerator.php', + 'Prettus\\Repository\\Helpers\\CacheKeys' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Helpers/CacheKeys.php', + 'Prettus\\Repository\\Listeners\\CleanCacheRepository' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Listeners/CleanCacheRepository.php', + 'Prettus\\Repository\\Presenter\\FractalPresenter' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Presenter/FractalPresenter.php', + 'Prettus\\Repository\\Presenter\\ModelFractalPresenter' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Presenter/ModelFractalPresenter.php', + 'Prettus\\Repository\\Providers\\EventServiceProvider' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Providers/EventServiceProvider.php', + 'Prettus\\Repository\\Providers\\LumenRepositoryServiceProvider' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Providers/LumenRepositoryServiceProvider.php', + 'Prettus\\Repository\\Providers\\RepositoryServiceProvider' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Providers/RepositoryServiceProvider.php', + 'Prettus\\Repository\\Traits\\CacheableRepository' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Traits/CacheableRepository.php', + 'Prettus\\Repository\\Traits\\ComparesVersionsTrait' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Traits/ComparesVersionsTrait.php', + 'Prettus\\Repository\\Traits\\PresentableTrait' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Traits/PresentableTrait.php', + 'Prettus\\Repository\\Traits\\Respondable' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Traits/Respondable.php', + 'Prettus\\Repository\\Traits\\TransformableTrait' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Traits/TransformableTrait.php', + 'Prettus\\Repository\\Transformer\\ModelTransformer' => __DIR__ . '/..' . '/prettus/l5-repository/src/Prettus/Repository/Transformer/ModelTransformer.php', + 'Prettus\\Validator\\AbstractValidator' => __DIR__ . '/..' . '/prettus/laravel-validation/src/Prettus/Validator/AbstractValidator.php', + 'Prettus\\Validator\\Contracts\\ValidatorInterface' => __DIR__ . '/..' . '/prettus/laravel-validation/src/Prettus/Validator/Contracts/ValidatorInterface.php', + 'Prettus\\Validator\\Exceptions\\ValidatorException' => __DIR__ . '/..' . '/prettus/laravel-validation/src/Prettus/Validator/Exceptions/ValidatorException.php', + 'Prettus\\Validator\\LaravelValidator' => __DIR__ . '/..' . '/prettus/laravel-validation/src/Prettus/Validator/LaravelValidator.php', + 'Prophecy\\Argument' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument.php', + 'Prophecy\\Argument\\ArgumentsWildcard' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php', + 'Prophecy\\Argument\\Token\\AnyValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php', + 'Prophecy\\Argument\\Token\\AnyValuesToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php', + 'Prophecy\\Argument\\Token\\ApproximateValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php', + 'Prophecy\\Argument\\Token\\ArrayCountToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php', + 'Prophecy\\Argument\\Token\\ArrayEntryToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php', + 'Prophecy\\Argument\\Token\\ArrayEveryEntryToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php', + 'Prophecy\\Argument\\Token\\CallbackToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php', + 'Prophecy\\Argument\\Token\\ExactValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php', + 'Prophecy\\Argument\\Token\\IdenticalValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php', + 'Prophecy\\Argument\\Token\\LogicalAndToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php', + 'Prophecy\\Argument\\Token\\LogicalNotToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php', + 'Prophecy\\Argument\\Token\\ObjectStateToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php', + 'Prophecy\\Argument\\Token\\StringContainsToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php', + 'Prophecy\\Argument\\Token\\TokenInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php', + 'Prophecy\\Argument\\Token\\TypeToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php', + 'Prophecy\\Call\\Call' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Call/Call.php', + 'Prophecy\\Call\\CallCenter' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Call/CallCenter.php', + 'Prophecy\\Comparator\\ClosureComparator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php', + 'Prophecy\\Comparator\\Factory' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/Factory.php', + 'Prophecy\\Comparator\\ProphecyComparator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php', + 'Prophecy\\Doubler\\CachedDoubler' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php', + 'Prophecy\\Doubler\\ClassPatch\\ClassPatchInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php', + 'Prophecy\\Doubler\\ClassPatch\\DisableConstructorPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\HhvmExceptionPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\KeywordPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\MagicCallPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ProphecySubjectPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ReflectionClassNewInstancePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\SplFileInfoPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ThrowablePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\TraversablePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php', + 'Prophecy\\Doubler\\DoubleInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php', + 'Prophecy\\Doubler\\Doubler' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php', + 'Prophecy\\Doubler\\Generator\\ClassCodeGenerator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php', + 'Prophecy\\Doubler\\Generator\\ClassCreator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php', + 'Prophecy\\Doubler\\Generator\\ClassMirror' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php', + 'Prophecy\\Doubler\\Generator\\Node\\ArgumentNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\ClassNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\MethodNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php', + 'Prophecy\\Doubler\\Generator\\ReflectionInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php', + 'Prophecy\\Doubler\\Generator\\TypeHintReference' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php', + 'Prophecy\\Doubler\\LazyDouble' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php', + 'Prophecy\\Doubler\\NameGenerator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php', + 'Prophecy\\Exception\\Call\\UnexpectedCallException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php', + 'Prophecy\\Exception\\Doubler\\ClassCreatorException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php', + 'Prophecy\\Exception\\Doubler\\ClassMirrorException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php', + 'Prophecy\\Exception\\Doubler\\ClassNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\DoubleException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php', + 'Prophecy\\Exception\\Doubler\\DoublerException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php', + 'Prophecy\\Exception\\Doubler\\InterfaceNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotExtendableException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\ReturnByReferenceException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php', + 'Prophecy\\Exception\\Exception' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Exception.php', + 'Prophecy\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php', + 'Prophecy\\Exception\\Prediction\\AggregateException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php', + 'Prophecy\\Exception\\Prediction\\FailedPredictionException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php', + 'Prophecy\\Exception\\Prediction\\NoCallsException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php', + 'Prophecy\\Exception\\Prediction\\PredictionException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsCountException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php', + 'Prophecy\\Exception\\Prophecy\\MethodProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ObjectProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php', + 'Prophecy\\PhpDocumentor\\ClassAndInterfaceTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php', + 'Prophecy\\PhpDocumentor\\ClassTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\LegacyClassTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\MethodTagRetrieverInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php', + 'Prophecy\\Prediction\\CallPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php', + 'Prophecy\\Prediction\\CallTimesPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php', + 'Prophecy\\Prediction\\CallbackPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php', + 'Prophecy\\Prediction\\NoCallsPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php', + 'Prophecy\\Prediction\\PredictionInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php', + 'Prophecy\\Promise\\CallbackPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php', + 'Prophecy\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php', + 'Prophecy\\Promise\\ReturnArgumentPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php', + 'Prophecy\\Promise\\ReturnPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php', + 'Prophecy\\Promise\\ThrowPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php', + 'Prophecy\\Prophecy\\MethodProphecy' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php', + 'Prophecy\\Prophecy\\ObjectProphecy' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php', + 'Prophecy\\Prophecy\\ProphecyInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php', + 'Prophecy\\Prophecy\\ProphecySubjectInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php', + 'Prophecy\\Prophecy\\Revealer' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php', + 'Prophecy\\Prophecy\\RevealerInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php', + 'Prophecy\\Prophet' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophet.php', + 'Prophecy\\Util\\ExportUtil' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php', + 'Prophecy\\Util\\StringUtil' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Util/StringUtil.php', + 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', + 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', + 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', + 'Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php', + 'Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php', + 'Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php', + 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', + 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', + 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', + 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', + 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', + 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', + 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', + 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', + 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', + 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', + 'Psy\\CodeCleaner' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner.php', + 'Psy\\CodeCleaner\\AbstractClassPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/AbstractClassPass.php', + 'Psy\\CodeCleaner\\AssignThisVariablePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/AssignThisVariablePass.php', + 'Psy\\CodeCleaner\\CallTimePassByReferencePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/CallTimePassByReferencePass.php', + 'Psy\\CodeCleaner\\CalledClassPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/CalledClassPass.php', + 'Psy\\CodeCleaner\\CodeCleanerPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/CodeCleanerPass.php', + 'Psy\\CodeCleaner\\EmptyArrayDimFetchPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php', + 'Psy\\CodeCleaner\\ExitPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ExitPass.php', + 'Psy\\CodeCleaner\\FinalClassPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/FinalClassPass.php', + 'Psy\\CodeCleaner\\FunctionContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/FunctionContextPass.php', + 'Psy\\CodeCleaner\\FunctionReturnInWriteContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.php', + 'Psy\\CodeCleaner\\ImplicitReturnPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php', + 'Psy\\CodeCleaner\\InstanceOfPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/InstanceOfPass.php', + 'Psy\\CodeCleaner\\LabelContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/LabelContextPass.php', + 'Psy\\CodeCleaner\\LeavePsyshAlonePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/LeavePsyshAlonePass.php', + 'Psy\\CodeCleaner\\ListPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ListPass.php', + 'Psy\\CodeCleaner\\LoopContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/LoopContextPass.php', + 'Psy\\CodeCleaner\\MagicConstantsPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/MagicConstantsPass.php', + 'Psy\\CodeCleaner\\NamespaceAwarePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/NamespaceAwarePass.php', + 'Psy\\CodeCleaner\\NamespacePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/NamespacePass.php', + 'Psy\\CodeCleaner\\NoReturnValue' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/NoReturnValue.php', + 'Psy\\CodeCleaner\\PassableByReferencePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/PassableByReferencePass.php', + 'Psy\\CodeCleaner\\RequirePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/RequirePass.php', + 'Psy\\CodeCleaner\\ReturnTypePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ReturnTypePass.php', + 'Psy\\CodeCleaner\\StrictTypesPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/StrictTypesPass.php', + 'Psy\\CodeCleaner\\UseStatementPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/UseStatementPass.php', + 'Psy\\CodeCleaner\\ValidClassNamePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidClassNamePass.php', + 'Psy\\CodeCleaner\\ValidConstantPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidConstantPass.php', + 'Psy\\CodeCleaner\\ValidConstructorPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidConstructorPass.php', + 'Psy\\CodeCleaner\\ValidFunctionNamePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidFunctionNamePass.php', + 'Psy\\Command\\BufferCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/BufferCommand.php', + 'Psy\\Command\\ClearCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ClearCommand.php', + 'Psy\\Command\\Command' => __DIR__ . '/..' . '/psy/psysh/src/Command/Command.php', + 'Psy\\Command\\DocCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/DocCommand.php', + 'Psy\\Command\\DumpCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/DumpCommand.php', + 'Psy\\Command\\EditCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/EditCommand.php', + 'Psy\\Command\\ExitCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ExitCommand.php', + 'Psy\\Command\\HelpCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/HelpCommand.php', + 'Psy\\Command\\HistoryCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/HistoryCommand.php', + 'Psy\\Command\\ListCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand.php', + 'Psy\\Command\\ListCommand\\ClassConstantEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/ClassConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\ClassEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/ClassEnumerator.php', + 'Psy\\Command\\ListCommand\\ConstantEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/ConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\Enumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/Enumerator.php', + 'Psy\\Command\\ListCommand\\FunctionEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/FunctionEnumerator.php', + 'Psy\\Command\\ListCommand\\GlobalVariableEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/GlobalVariableEnumerator.php', + 'Psy\\Command\\ListCommand\\MethodEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/MethodEnumerator.php', + 'Psy\\Command\\ListCommand\\PropertyEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/PropertyEnumerator.php', + 'Psy\\Command\\ListCommand\\VariableEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/VariableEnumerator.php', + 'Psy\\Command\\ParseCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ParseCommand.php', + 'Psy\\Command\\PsyVersionCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/PsyVersionCommand.php', + 'Psy\\Command\\ReflectingCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ReflectingCommand.php', + 'Psy\\Command\\ShowCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ShowCommand.php', + 'Psy\\Command\\SudoCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/SudoCommand.php', + 'Psy\\Command\\ThrowUpCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ThrowUpCommand.php', + 'Psy\\Command\\TimeitCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/TimeitCommand.php', + 'Psy\\Command\\TimeitCommand\\TimeitVisitor' => __DIR__ . '/..' . '/psy/psysh/src/Command/TimeitCommand/TimeitVisitor.php', + 'Psy\\Command\\TraceCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/TraceCommand.php', + 'Psy\\Command\\WhereamiCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/WhereamiCommand.php', + 'Psy\\Command\\WtfCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/WtfCommand.php', + 'Psy\\ConfigPaths' => __DIR__ . '/..' . '/psy/psysh/src/ConfigPaths.php', + 'Psy\\Configuration' => __DIR__ . '/..' . '/psy/psysh/src/Configuration.php', + 'Psy\\ConsoleColorFactory' => __DIR__ . '/..' . '/psy/psysh/src/ConsoleColorFactory.php', + 'Psy\\Context' => __DIR__ . '/..' . '/psy/psysh/src/Context.php', + 'Psy\\ContextAware' => __DIR__ . '/..' . '/psy/psysh/src/ContextAware.php', + 'Psy\\Exception\\BreakException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/BreakException.php', + 'Psy\\Exception\\DeprecatedException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/DeprecatedException.php', + 'Psy\\Exception\\ErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/ErrorException.php', + 'Psy\\Exception\\Exception' => __DIR__ . '/..' . '/psy/psysh/src/Exception/Exception.php', + 'Psy\\Exception\\FatalErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/FatalErrorException.php', + 'Psy\\Exception\\ParseErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/ParseErrorException.php', + 'Psy\\Exception\\RuntimeException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/RuntimeException.php', + 'Psy\\Exception\\ThrowUpException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/ThrowUpException.php', + 'Psy\\Exception\\TypeErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/TypeErrorException.php', + 'Psy\\Exception\\UnexpectedTargetException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/UnexpectedTargetException.php', + 'Psy\\ExecutionClosure' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionClosure.php', + 'Psy\\ExecutionLoopClosure' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoopClosure.php', + 'Psy\\ExecutionLoop\\AbstractListener' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/AbstractListener.php', + 'Psy\\ExecutionLoop\\Listener' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/Listener.php', + 'Psy\\ExecutionLoop\\ProcessForker' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/ProcessForker.php', + 'Psy\\ExecutionLoop\\RunkitReloader' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/RunkitReloader.php', + 'Psy\\Formatter\\CodeFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/CodeFormatter.php', + 'Psy\\Formatter\\DocblockFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/DocblockFormatter.php', + 'Psy\\Formatter\\Formatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/Formatter.php', + 'Psy\\Formatter\\ReflectorFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/ReflectorFormatter.php', + 'Psy\\Formatter\\SignatureFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/SignatureFormatter.php', + 'Psy\\Formatter\\TraceFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/TraceFormatter.php', + 'Psy\\Input\\CodeArgument' => __DIR__ . '/..' . '/psy/psysh/src/Input/CodeArgument.php', + 'Psy\\Input\\FilterOptions' => __DIR__ . '/..' . '/psy/psysh/src/Input/FilterOptions.php', + 'Psy\\Input\\ShellInput' => __DIR__ . '/..' . '/psy/psysh/src/Input/ShellInput.php', + 'Psy\\Input\\SilentInput' => __DIR__ . '/..' . '/psy/psysh/src/Input/SilentInput.php', + 'Psy\\Output\\OutputPager' => __DIR__ . '/..' . '/psy/psysh/src/Output/OutputPager.php', + 'Psy\\Output\\PassthruPager' => __DIR__ . '/..' . '/psy/psysh/src/Output/PassthruPager.php', + 'Psy\\Output\\ProcOutputPager' => __DIR__ . '/..' . '/psy/psysh/src/Output/ProcOutputPager.php', + 'Psy\\Output\\ShellOutput' => __DIR__ . '/..' . '/psy/psysh/src/Output/ShellOutput.php', + 'Psy\\ParserFactory' => __DIR__ . '/..' . '/psy/psysh/src/ParserFactory.php', + 'Psy\\Readline\\GNUReadline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/GNUReadline.php', + 'Psy\\Readline\\HoaConsole' => __DIR__ . '/..' . '/psy/psysh/src/Readline/HoaConsole.php', + 'Psy\\Readline\\Libedit' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Libedit.php', + 'Psy\\Readline\\Readline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Readline.php', + 'Psy\\Readline\\Transient' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Transient.php', + 'Psy\\Reflection\\ReflectionClassConstant' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionClassConstant.php', + 'Psy\\Reflection\\ReflectionConstant' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionConstant.php', + 'Psy\\Reflection\\ReflectionConstant_' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionConstant_.php', + 'Psy\\Reflection\\ReflectionLanguageConstruct' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionLanguageConstruct.php', + 'Psy\\Reflection\\ReflectionLanguageConstructParameter' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionLanguageConstructParameter.php', + 'Psy\\Reflection\\ReflectionNamespace' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionNamespace.php', + 'Psy\\Shell' => __DIR__ . '/..' . '/psy/psysh/src/Shell.php', + 'Psy\\Sudo' => __DIR__ . '/..' . '/psy/psysh/src/Sudo.php', + 'Psy\\Sudo\\SudoVisitor' => __DIR__ . '/..' . '/psy/psysh/src/Sudo/SudoVisitor.php', + 'Psy\\TabCompletion\\AutoCompleter' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/AutoCompleter.php', + 'Psy\\TabCompletion\\Matcher\\AbstractContextAwareMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/AbstractMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassAttributesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassNamesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassNamesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\CommandsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/CommandsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ConstantsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ConstantsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/FunctionsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\KeywordsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/KeywordsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoClientMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/MongoClientMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoDatabaseMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectAttributesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\VariablesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/VariablesMatcher.php', + 'Psy\\Util\\Docblock' => __DIR__ . '/..' . '/psy/psysh/src/Util/Docblock.php', + 'Psy\\Util\\Json' => __DIR__ . '/..' . '/psy/psysh/src/Util/Json.php', + 'Psy\\Util\\Mirror' => __DIR__ . '/..' . '/psy/psysh/src/Util/Mirror.php', + 'Psy\\Util\\Str' => __DIR__ . '/..' . '/psy/psysh/src/Util/Str.php', + 'Psy\\VarDumper\\Cloner' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/Cloner.php', + 'Psy\\VarDumper\\Dumper' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/Dumper.php', + 'Psy\\VarDumper\\Presenter' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/Presenter.php', + 'Psy\\VarDumper\\PresenterAware' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/PresenterAware.php', + 'Psy\\VersionUpdater\\Checker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/Checker.php', + 'Psy\\VersionUpdater\\GitHubChecker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/GitHubChecker.php', + 'Psy\\VersionUpdater\\IntervalChecker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/IntervalChecker.php', + 'Psy\\VersionUpdater\\NoopChecker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/NoopChecker.php', + 'Ramsey\\Collection\\AbstractArray' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractArray.php', + 'Ramsey\\Collection\\AbstractCollection' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractCollection.php', + 'Ramsey\\Collection\\AbstractSet' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractSet.php', + 'Ramsey\\Collection\\ArrayInterface' => __DIR__ . '/..' . '/ramsey/collection/src/ArrayInterface.php', + 'Ramsey\\Collection\\Collection' => __DIR__ . '/..' . '/ramsey/collection/src/Collection.php', + 'Ramsey\\Collection\\CollectionInterface' => __DIR__ . '/..' . '/ramsey/collection/src/CollectionInterface.php', + 'Ramsey\\Collection\\DoubleEndedQueue' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueue.php', + 'Ramsey\\Collection\\DoubleEndedQueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueueInterface.php', + 'Ramsey\\Collection\\Exception\\CollectionMismatchException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/CollectionMismatchException.php', + 'Ramsey\\Collection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidArgumentException.php', + 'Ramsey\\Collection\\Exception\\InvalidSortOrderException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidSortOrderException.php', + 'Ramsey\\Collection\\Exception\\NoSuchElementException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/NoSuchElementException.php', + 'Ramsey\\Collection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/OutOfBoundsException.php', + 'Ramsey\\Collection\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/UnsupportedOperationException.php', + 'Ramsey\\Collection\\Exception\\ValueExtractionException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/ValueExtractionException.php', + 'Ramsey\\Collection\\GenericArray' => __DIR__ . '/..' . '/ramsey/collection/src/GenericArray.php', + 'Ramsey\\Collection\\Map\\AbstractMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractMap.php', + 'Ramsey\\Collection\\Map\\AbstractTypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractTypedMap.php', + 'Ramsey\\Collection\\Map\\AssociativeArrayMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AssociativeArrayMap.php', + 'Ramsey\\Collection\\Map\\MapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/MapInterface.php', + 'Ramsey\\Collection\\Map\\NamedParameterMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/NamedParameterMap.php', + 'Ramsey\\Collection\\Map\\TypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMap.php', + 'Ramsey\\Collection\\Map\\TypedMapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMapInterface.php', + 'Ramsey\\Collection\\Queue' => __DIR__ . '/..' . '/ramsey/collection/src/Queue.php', + 'Ramsey\\Collection\\QueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/QueueInterface.php', + 'Ramsey\\Collection\\Set' => __DIR__ . '/..' . '/ramsey/collection/src/Set.php', + 'Ramsey\\Collection\\Tool\\TypeTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/TypeTrait.php', + 'Ramsey\\Collection\\Tool\\ValueExtractorTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueExtractorTrait.php', + 'Ramsey\\Collection\\Tool\\ValueToStringTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueToStringTrait.php', + 'Ramsey\\Uuid\\BinaryUtils' => __DIR__ . '/..' . '/ramsey/uuid/src/BinaryUtils.php', + 'Ramsey\\Uuid\\Builder\\BuilderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/BuilderCollection.php', + 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php', + 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php', + 'Ramsey\\Uuid\\Builder\\FallbackBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/FallbackBuilder.php', + 'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php', + 'Ramsey\\Uuid\\Codec\\CodecInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/CodecInterface.php', + 'Ramsey\\Uuid\\Codec\\GuidStringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/GuidStringCodec.php', + 'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php', + 'Ramsey\\Uuid\\Codec\\StringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/StringCodec.php', + 'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php', + 'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php', + 'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/NumberConverterInterface.php', + 'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php', + 'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php', + 'Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php', + 'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/TimeConverterInterface.php', + 'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php', + 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php', + 'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php', + 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php', + 'Ramsey\\Uuid\\DegradedUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/DegradedUuid.php', + 'Ramsey\\Uuid\\DeprecatedUuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidInterface.php', + 'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php', + 'Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php', + 'Ramsey\\Uuid\\Exception\\DateTimeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DateTimeException.php', + 'Ramsey\\Uuid\\Exception\\DceSecurityException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DceSecurityException.php', + 'Ramsey\\Uuid\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidArgumentException.php', + 'Ramsey\\Uuid\\Exception\\InvalidBytesException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidBytesException.php', + 'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php', + 'Ramsey\\Uuid\\Exception\\NameException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NameException.php', + 'Ramsey\\Uuid\\Exception\\NodeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NodeException.php', + 'Ramsey\\Uuid\\Exception\\RandomSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/RandomSourceException.php', + 'Ramsey\\Uuid\\Exception\\TimeSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/TimeSourceException.php', + 'Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php', + 'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php', + 'Ramsey\\Uuid\\FeatureSet' => __DIR__ . '/..' . '/ramsey/uuid/src/FeatureSet.php', + 'Ramsey\\Uuid\\Fields\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/FieldsInterface.php', + 'Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php', + 'Ramsey\\Uuid\\Generator\\CombGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/CombGenerator.php', + 'Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php', + 'Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php', + 'Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php', + 'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php', + 'Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php', + 'Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php', + 'Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php', + 'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php', + 'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php', + 'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php', + 'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php', + 'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php', + 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomLibAdapter.php', + 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php', + 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php', + 'Ramsey\\Uuid\\Guid\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Fields.php', + 'Ramsey\\Uuid\\Guid\\Guid' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Guid.php', + 'Ramsey\\Uuid\\Guid\\GuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/GuidBuilder.php', + 'Ramsey\\Uuid\\Math\\BrickMathCalculator' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/BrickMathCalculator.php', + 'Ramsey\\Uuid\\Math\\CalculatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/CalculatorInterface.php', + 'Ramsey\\Uuid\\Math\\RoundingMode' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/RoundingMode.php', + 'Ramsey\\Uuid\\Nonstandard\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Fields.php', + 'Ramsey\\Uuid\\Nonstandard\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Uuid.php', + 'Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php', + 'Ramsey\\Uuid\\Nonstandard\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidV6.php', + 'Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php', + 'Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php', + 'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/NodeProviderInterface.php', + 'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php', + 'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php', + 'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/TimeProviderInterface.php', + 'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php', + 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php', + 'Ramsey\\Uuid\\Rfc4122\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Fields.php', + 'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php', + 'Ramsey\\Uuid\\Rfc4122\\NilTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilTrait.php', + 'Ramsey\\Uuid\\Rfc4122\\NilUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilUuid.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidInterface.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV1' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV1.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV2' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV2.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV3' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV3.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV4' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV4.php', + 'Ramsey\\Uuid\\Rfc4122\\UuidV5' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV5.php', + 'Ramsey\\Uuid\\Rfc4122\\Validator' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Validator.php', + 'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VariantTrait.php', + 'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VersionTrait.php', + 'Ramsey\\Uuid\\Type\\Decimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Decimal.php', + 'Ramsey\\Uuid\\Type\\Hexadecimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Hexadecimal.php', + 'Ramsey\\Uuid\\Type\\Integer' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Integer.php', + 'Ramsey\\Uuid\\Type\\NumberInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/NumberInterface.php', + 'Ramsey\\Uuid\\Type\\Time' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Time.php', + 'Ramsey\\Uuid\\Type\\TypeInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/TypeInterface.php', + 'Ramsey\\Uuid\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Uuid.php', + 'Ramsey\\Uuid\\UuidFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactory.php', + 'Ramsey\\Uuid\\UuidFactoryInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactoryInterface.php', + 'Ramsey\\Uuid\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidInterface.php', + 'Ramsey\\Uuid\\Validator\\GenericValidator' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/GenericValidator.php', + 'Ramsey\\Uuid\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/ValidatorInterface.php', + 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PCOV.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', + 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', + 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', + 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', + 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', + 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', + 'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', + 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', + 'SebastianBergmann\\CodeCoverage\\Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util.php', + 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', + 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', + 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', + 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', + 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', + 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', + 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', + 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php', + 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\Exception' => __DIR__ . '/..' . '/sebastian/object-reflector/src/Exception.php', + 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-reflector/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', + 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', + 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', + 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', + 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', + 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/Exception.php', + 'SebastianBergmann\\Timer\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-timer/src/RuntimeException.php', + 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', + 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/CallableType.php', + 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', + 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/GenericObjectType.php', + 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/IterableType.php', + 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/NullType.php', + 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/ObjectType.php', + 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', + 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/SimpleType.php', + 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/Type.php', + 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', + 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/UnknownType.php', + 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/VoidType.php', + 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', + 'SignerSeeder' => __DIR__ . '/../..' . '/database/seeds/SignerSeeder.php', + 'Spatie\\Permission\\Commands\\CacheReset' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Commands/CacheReset.php', + 'Spatie\\Permission\\Commands\\CreatePermission' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Commands/CreatePermission.php', + 'Spatie\\Permission\\Commands\\CreateRole' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Commands/CreateRole.php', + 'Spatie\\Permission\\Commands\\Show' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Commands/Show.php', + 'Spatie\\Permission\\Contracts\\Permission' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Contracts/Permission.php', + 'Spatie\\Permission\\Contracts\\Role' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Contracts/Role.php', + 'Spatie\\Permission\\Exceptions\\GuardDoesNotMatch' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/GuardDoesNotMatch.php', + 'Spatie\\Permission\\Exceptions\\PermissionAlreadyExists' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/PermissionAlreadyExists.php', + 'Spatie\\Permission\\Exceptions\\PermissionDoesNotExist' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/PermissionDoesNotExist.php', + 'Spatie\\Permission\\Exceptions\\RoleAlreadyExists' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/RoleAlreadyExists.php', + 'Spatie\\Permission\\Exceptions\\RoleDoesNotExist' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/RoleDoesNotExist.php', + 'Spatie\\Permission\\Exceptions\\UnauthorizedException' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/UnauthorizedException.php', + 'Spatie\\Permission\\Exceptions\\WildcardPermissionInvalidArgument' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/WildcardPermissionInvalidArgument.php', + 'Spatie\\Permission\\Exceptions\\WildcardPermissionNotProperlyFormatted' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Exceptions/WildcardPermissionNotProperlyFormatted.php', + 'Spatie\\Permission\\Guard' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Guard.php', + 'Spatie\\Permission\\Middlewares\\PermissionMiddleware' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Middlewares/PermissionMiddleware.php', + 'Spatie\\Permission\\Middlewares\\RoleMiddleware' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Middlewares/RoleMiddleware.php', + 'Spatie\\Permission\\Middlewares\\RoleOrPermissionMiddleware' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Middlewares/RoleOrPermissionMiddleware.php', + 'Spatie\\Permission\\Models\\Permission' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Models/Permission.php', + 'Spatie\\Permission\\Models\\Role' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Models/Role.php', + 'Spatie\\Permission\\PermissionRegistrar' => __DIR__ . '/..' . '/spatie/laravel-permission/src/PermissionRegistrar.php', + 'Spatie\\Permission\\PermissionServiceProvider' => __DIR__ . '/..' . '/spatie/laravel-permission/src/PermissionServiceProvider.php', + 'Spatie\\Permission\\Traits\\HasPermissions' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Traits/HasPermissions.php', + 'Spatie\\Permission\\Traits\\HasRoles' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Traits/HasRoles.php', + 'Spatie\\Permission\\Traits\\RefreshesPermissionCache' => __DIR__ . '/..' . '/spatie/laravel-permission/src/Traits/RefreshesPermissionCache.php', + 'Spatie\\Permission\\WildcardPermission' => __DIR__ . '/..' . '/spatie/laravel-permission/src/WildcardPermission.php', + 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', + 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', + 'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', + 'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', + 'Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', + 'Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', + 'Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', + 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', + 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', + 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', + 'Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php', + 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php', + 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', + 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', + 'Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', + 'Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', + 'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', + 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', + 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', + 'Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', + 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', + 'Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', + 'Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', + 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', + 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', + 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', + 'Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', + 'Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', + 'Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', + 'Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', + 'Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', + 'Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', + 'Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', + 'Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', + 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', + 'Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', + 'Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', + 'Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', + 'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', + 'Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', + 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', + 'Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', + 'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', + 'Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', + 'Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', + 'Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', + 'Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', + 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', + 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', + 'Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', + 'Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', + 'Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', + 'Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', + 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', + 'Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', + 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php', + 'Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php', + 'Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php', + 'Symfony\\Component\\CssSelector\\CssSelectorConverter' => __DIR__ . '/..' . '/symfony/css-selector/CssSelectorConverter.php', + 'Symfony\\Component\\CssSelector\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/css-selector/Exception/ExceptionInterface.php', + 'Symfony\\Component\\CssSelector\\Exception\\ExpressionErrorException' => __DIR__ . '/..' . '/symfony/css-selector/Exception/ExpressionErrorException.php', + 'Symfony\\Component\\CssSelector\\Exception\\InternalErrorException' => __DIR__ . '/..' . '/symfony/css-selector/Exception/InternalErrorException.php', + 'Symfony\\Component\\CssSelector\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/css-selector/Exception/ParseException.php', + 'Symfony\\Component\\CssSelector\\Exception\\SyntaxErrorException' => __DIR__ . '/..' . '/symfony/css-selector/Exception/SyntaxErrorException.php', + 'Symfony\\Component\\CssSelector\\Node\\AbstractNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/AbstractNode.php', + 'Symfony\\Component\\CssSelector\\Node\\AttributeNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/AttributeNode.php', + 'Symfony\\Component\\CssSelector\\Node\\ClassNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/ClassNode.php', + 'Symfony\\Component\\CssSelector\\Node\\CombinedSelectorNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/CombinedSelectorNode.php', + 'Symfony\\Component\\CssSelector\\Node\\ElementNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/ElementNode.php', + 'Symfony\\Component\\CssSelector\\Node\\FunctionNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/FunctionNode.php', + 'Symfony\\Component\\CssSelector\\Node\\HashNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/HashNode.php', + 'Symfony\\Component\\CssSelector\\Node\\NegationNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/NegationNode.php', + 'Symfony\\Component\\CssSelector\\Node\\NodeInterface' => __DIR__ . '/..' . '/symfony/css-selector/Node/NodeInterface.php', + 'Symfony\\Component\\CssSelector\\Node\\PseudoNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/PseudoNode.php', + 'Symfony\\Component\\CssSelector\\Node\\SelectorNode' => __DIR__ . '/..' . '/symfony/css-selector/Node/SelectorNode.php', + 'Symfony\\Component\\CssSelector\\Node\\Specificity' => __DIR__ . '/..' . '/symfony/css-selector/Node/Specificity.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\CommentHandler' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/CommentHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/HandlerInterface.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\HashHandler' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/HashHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\IdentifierHandler' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/IdentifierHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\NumberHandler' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/NumberHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\StringHandler' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/StringHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Handler\\WhitespaceHandler' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Handler/WhitespaceHandler.php', + 'Symfony\\Component\\CssSelector\\Parser\\Parser' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Parser.php', + 'Symfony\\Component\\CssSelector\\Parser\\ParserInterface' => __DIR__ . '/..' . '/symfony/css-selector/Parser/ParserInterface.php', + 'Symfony\\Component\\CssSelector\\Parser\\Reader' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Reader.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\ClassParser' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Shortcut/ClassParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\ElementParser' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Shortcut/ElementParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\EmptyStringParser' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Shortcut\\HashParser' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Shortcut/HashParser.php', + 'Symfony\\Component\\CssSelector\\Parser\\Token' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Token.php', + 'Symfony\\Component\\CssSelector\\Parser\\TokenStream' => __DIR__ . '/..' . '/symfony/css-selector/Parser/TokenStream.php', + 'Symfony\\Component\\CssSelector\\Parser\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Tokenizer/Tokenizer.php', + 'Symfony\\Component\\CssSelector\\Parser\\Tokenizer\\TokenizerEscaping' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php', + 'Symfony\\Component\\CssSelector\\Parser\\Tokenizer\\TokenizerPatterns' => __DIR__ . '/..' . '/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/AbstractExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\AttributeMatchingExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\CombinationExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/CombinationExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/ExtensionInterface.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\FunctionExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/FunctionExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\HtmlExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/HtmlExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\NodeExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/NodeExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Extension\\PseudoClassExtension' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Extension/PseudoClassExtension.php', + 'Symfony\\Component\\CssSelector\\XPath\\Translator' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Translator.php', + 'Symfony\\Component\\CssSelector\\XPath\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/css-selector/XPath/TranslatorInterface.php', + 'Symfony\\Component\\CssSelector\\XPath\\XPathExpr' => __DIR__ . '/..' . '/symfony/css-selector/XPath/XPathExpr.php', + 'Symfony\\Component\\ErrorHandler\\BufferingLogger' => __DIR__ . '/..' . '/symfony/error-handler/BufferingLogger.php', + 'Symfony\\Component\\ErrorHandler\\Debug' => __DIR__ . '/..' . '/symfony/error-handler/Debug.php', + 'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/error-handler/DebugClassLoader.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorHandler' => __DIR__ . '/..' . '/symfony/error-handler/ErrorHandler.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php', + 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php', + 'Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => __DIR__ . '/..' . '/symfony/error-handler/Error/ClassNotFoundError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\FatalError' => __DIR__ . '/..' . '/symfony/error-handler/Error/FatalError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => __DIR__ . '/..' . '/symfony/error-handler/Error/OutOfMemoryError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedFunctionError.php', + 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedMethodError.php', + 'Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/error-handler/Exception/FlattenException.php', + 'Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/error-handler/Exception/SilencedErrorContext.php', + 'Symfony\\Component\\ErrorHandler\\ThrowableUtils' => __DIR__ . '/..' . '/symfony/error-handler/ThrowableUtils.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php', + 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php', + 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcherInterface.php', + 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php', + 'Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php', + 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => __DIR__ . '/..' . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php', + 'Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', + 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', + 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', + 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', + 'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', + 'Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', + 'Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', + 'Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', + 'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', + 'Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', + 'Symfony\\Component\\HttpFoundation\\AcceptHeader' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeader.php', + 'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeaderItem.php', + 'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => __DIR__ . '/..' . '/symfony/http-foundation/BinaryFileResponse.php', + 'Symfony\\Component\\HttpFoundation\\Cookie' => __DIR__ . '/..' . '/symfony/http-foundation/Cookie.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/BadRequestException.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ConflictingHeadersException.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/RequestExceptionInterface.php', + 'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SuspiciousOperationException.php', + 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/ExpressionRequestMatcher.php', + 'Symfony\\Component\\HttpFoundation\\FileBag' => __DIR__ . '/..' . '/symfony/http-foundation/FileBag.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/AccessDeniedException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/ExtensionFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileNotFoundException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FormSizeFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/IniSizeFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/PartialFileException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php', + 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UploadException.php', + 'Symfony\\Component\\HttpFoundation\\File\\File' => __DIR__ . '/..' . '/symfony/http-foundation/File/File.php', + 'Symfony\\Component\\HttpFoundation\\File\\Stream' => __DIR__ . '/..' . '/symfony/http-foundation/File/Stream.php', + 'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => __DIR__ . '/..' . '/symfony/http-foundation/File/UploadedFile.php', + 'Symfony\\Component\\HttpFoundation\\HeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderBag.php', + 'Symfony\\Component\\HttpFoundation\\HeaderUtils' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderUtils.php', + 'Symfony\\Component\\HttpFoundation\\InputBag' => __DIR__ . '/..' . '/symfony/http-foundation/InputBag.php', + 'Symfony\\Component\\HttpFoundation\\IpUtils' => __DIR__ . '/..' . '/symfony/http-foundation/IpUtils.php', + 'Symfony\\Component\\HttpFoundation\\JsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/JsonResponse.php', + 'Symfony\\Component\\HttpFoundation\\ParameterBag' => __DIR__ . '/..' . '/symfony/http-foundation/ParameterBag.php', + 'Symfony\\Component\\HttpFoundation\\RedirectResponse' => __DIR__ . '/..' . '/symfony/http-foundation/RedirectResponse.php', + 'Symfony\\Component\\HttpFoundation\\Request' => __DIR__ . '/..' . '/symfony/http-foundation/Request.php', + 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher.php', + 'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcherInterface.php', + 'Symfony\\Component\\HttpFoundation\\RequestStack' => __DIR__ . '/..' . '/symfony/http-foundation/RequestStack.php', + 'Symfony\\Component\\HttpFoundation\\Response' => __DIR__ . '/..' . '/symfony/http-foundation/Response.php', + 'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/ResponseHeaderBag.php', + 'Symfony\\Component\\HttpFoundation\\ServerBag' => __DIR__ . '/..' . '/symfony/http-foundation/ServerBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\NamespacedAttributeBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Session' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Session.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagProxy.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionUtils.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MetadataBag.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php', + 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php', + 'Symfony\\Component\\HttpFoundation\\StreamedResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedResponse.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php', + 'Symfony\\Component\\HttpFoundation\\UrlHelper' => __DIR__ . '/..' . '/symfony/http-foundation/UrlHelper.php', + 'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/Bundle.php', + 'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/BundleInterface.php', + 'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php', + 'Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php', + 'Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php', + 'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php', + 'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/http-kernel/Config/FileLocator.php', + 'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php', + 'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php', + 'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ContainerControllerResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerReference.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolverInterface.php', + 'Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ErrorController.php', + 'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php', + 'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableControllerResolver.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DumpDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/EventDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RequestDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RouterDataCollector.php', + 'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/TimeDataCollector.php', + 'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/FileLinkFormatter.php', + 'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/Extension.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LoggerPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php', + 'Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AbstractSessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractTestSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AbstractTestSessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DebugHandlersListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DumpListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ErrorListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/FragmentListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleAwareListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ProfilerListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ResponseListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/RouterListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/StreamedResponseListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SurrogateListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/TestSessionListener.php', + 'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ValidateRequestListener.php', + 'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ExceptionEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FinishRequestEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/KernelEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/RequestEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ResponseEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/TerminateEvent.php', + 'Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ViewEvent.php', + 'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/BadRequestHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ConflictHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/GoneHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpExceptionInterface.php', + 'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotFoundHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentHandler.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\AbstractSurrogate' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/AbstractSurrogate.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Esi.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/HttpCache.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Ssi.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\Store' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Store.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/StoreInterface.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SubRequestHandler.php', + 'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SurrogateInterface.php', + 'Symfony\\Component\\HttpKernel\\HttpClientKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpClientKernel.php', + 'Symfony\\Component\\HttpKernel\\HttpKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernel.php', + 'Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelBrowser.php', + 'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelInterface.php', + 'Symfony\\Component\\HttpKernel\\Kernel' => __DIR__ . '/..' . '/symfony/http-kernel/Kernel.php', + 'Symfony\\Component\\HttpKernel\\KernelEvents' => __DIR__ . '/..' . '/symfony/http-kernel/KernelEvents.php', + 'Symfony\\Component\\HttpKernel\\KernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/KernelInterface.php', + 'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Log/DebugLoggerInterface.php', + 'Symfony\\Component\\HttpKernel\\Log\\Logger' => __DIR__ . '/..' . '/symfony/http-kernel/Log/Logger.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/FileProfilerStorage.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\Profile' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/Profile.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/Profiler.php', + 'Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php', + 'Symfony\\Component\\HttpKernel\\RebootableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/RebootableInterface.php', + 'Symfony\\Component\\HttpKernel\\TerminableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/TerminableInterface.php', + 'Symfony\\Component\\HttpKernel\\UriSigner' => __DIR__ . '/..' . '/symfony/http-kernel/UriSigner.php', + 'Symfony\\Component\\Mime\\Address' => __DIR__ . '/..' . '/symfony/mime/Address.php', + 'Symfony\\Component\\Mime\\BodyRendererInterface' => __DIR__ . '/..' . '/symfony/mime/BodyRendererInterface.php', + 'Symfony\\Component\\Mime\\CharacterStream' => __DIR__ . '/..' . '/symfony/mime/CharacterStream.php', + 'Symfony\\Component\\Mime\\Crypto\\SMime' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMime.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeEncrypter' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMimeEncrypter.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeSigner' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMimeSigner.php', + 'Symfony\\Component\\Mime\\DependencyInjection\\AddMimeTypeGuesserPass' => __DIR__ . '/..' . '/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php', + 'Symfony\\Component\\Mime\\Email' => __DIR__ . '/..' . '/symfony/mime/Email.php', + 'Symfony\\Component\\Mime\\Encoder\\AddressEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/AddressEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64ContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64ContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64Encoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64Encoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64MimeHeaderEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64MimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\ContentEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/ContentEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\EightBitContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/EightBitContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\EncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/EncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\IdnAddressEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/IdnAddressEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\MimeHeaderEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/MimeHeaderEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\QpContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpMimeHeaderEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpMimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Rfc2231Encoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Rfc2231Encoder.php', + 'Symfony\\Component\\Mime\\Exception\\AddressEncoderException' => __DIR__ . '/..' . '/symfony/mime/Exception/AddressEncoderException.php', + 'Symfony\\Component\\Mime\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/mime/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Mime\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/mime/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Mime\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/mime/Exception/LogicException.php', + 'Symfony\\Component\\Mime\\Exception\\RfcComplianceException' => __DIR__ . '/..' . '/symfony/mime/Exception/RfcComplianceException.php', + 'Symfony\\Component\\Mime\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/mime/Exception/RuntimeException.php', + 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/mime/FileBinaryMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/mime/FileinfoMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\Header\\AbstractHeader' => __DIR__ . '/..' . '/symfony/mime/Header/AbstractHeader.php', + 'Symfony\\Component\\Mime\\Header\\DateHeader' => __DIR__ . '/..' . '/symfony/mime/Header/DateHeader.php', + 'Symfony\\Component\\Mime\\Header\\HeaderInterface' => __DIR__ . '/..' . '/symfony/mime/Header/HeaderInterface.php', + 'Symfony\\Component\\Mime\\Header\\Headers' => __DIR__ . '/..' . '/symfony/mime/Header/Headers.php', + 'Symfony\\Component\\Mime\\Header\\IdentificationHeader' => __DIR__ . '/..' . '/symfony/mime/Header/IdentificationHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxHeader' => __DIR__ . '/..' . '/symfony/mime/Header/MailboxHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxListHeader' => __DIR__ . '/..' . '/symfony/mime/Header/MailboxListHeader.php', + 'Symfony\\Component\\Mime\\Header\\ParameterizedHeader' => __DIR__ . '/..' . '/symfony/mime/Header/ParameterizedHeader.php', + 'Symfony\\Component\\Mime\\Header\\PathHeader' => __DIR__ . '/..' . '/symfony/mime/Header/PathHeader.php', + 'Symfony\\Component\\Mime\\Header\\UnstructuredHeader' => __DIR__ . '/..' . '/symfony/mime/Header/UnstructuredHeader.php', + 'Symfony\\Component\\Mime\\Message' => __DIR__ . '/..' . '/symfony/mime/Message.php', + 'Symfony\\Component\\Mime\\MessageConverter' => __DIR__ . '/..' . '/symfony/mime/MessageConverter.php', + 'Symfony\\Component\\Mime\\MimeTypeGuesserInterface' => __DIR__ . '/..' . '/symfony/mime/MimeTypeGuesserInterface.php', + 'Symfony\\Component\\Mime\\MimeTypes' => __DIR__ . '/..' . '/symfony/mime/MimeTypes.php', + 'Symfony\\Component\\Mime\\MimeTypesInterface' => __DIR__ . '/..' . '/symfony/mime/MimeTypesInterface.php', + 'Symfony\\Component\\Mime\\Part\\AbstractMultipartPart' => __DIR__ . '/..' . '/symfony/mime/Part/AbstractMultipartPart.php', + 'Symfony\\Component\\Mime\\Part\\AbstractPart' => __DIR__ . '/..' . '/symfony/mime/Part/AbstractPart.php', + 'Symfony\\Component\\Mime\\Part\\DataPart' => __DIR__ . '/..' . '/symfony/mime/Part/DataPart.php', + 'Symfony\\Component\\Mime\\Part\\MessagePart' => __DIR__ . '/..' . '/symfony/mime/Part/MessagePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\AlternativePart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/AlternativePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\DigestPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/DigestPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\FormDataPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/FormDataPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\MixedPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/MixedPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\RelatedPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/RelatedPart.php', + 'Symfony\\Component\\Mime\\Part\\SMimePart' => __DIR__ . '/..' . '/symfony/mime/Part/SMimePart.php', + 'Symfony\\Component\\Mime\\Part\\TextPart' => __DIR__ . '/..' . '/symfony/mime/Part/TextPart.php', + 'Symfony\\Component\\Mime\\RawMessage' => __DIR__ . '/..' . '/symfony/mime/RawMessage.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAddressContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailAddressContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAttachmentCount' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailAttachmentCount.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHasHeader' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHasHeader.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHeaderSame' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHeaderSame.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHtmlBodyContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailTextBodyContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailTextBodyContains.php', + 'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', + 'Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', + 'Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', + 'Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', + 'Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', + 'Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', + 'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', + 'Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', + 'Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', + 'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', + 'Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', + 'Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', + 'Symfony\\Component\\Routing\\Annotation\\Route' => __DIR__ . '/..' . '/symfony/routing/Annotation/Route.php', + 'Symfony\\Component\\Routing\\CompiledRoute' => __DIR__ . '/..' . '/symfony/routing/CompiledRoute.php', + 'Symfony\\Component\\Routing\\DependencyInjection\\RoutingResolverPass' => __DIR__ . '/..' . '/symfony/routing/DependencyInjection/RoutingResolverPass.php', + 'Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/routing/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => __DIR__ . '/..' . '/symfony/routing/Exception/InvalidParameterException.php', + 'Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => __DIR__ . '/..' . '/symfony/routing/Exception/MethodNotAllowedException.php', + 'Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => __DIR__ . '/..' . '/symfony/routing/Exception/MissingMandatoryParametersException.php', + 'Symfony\\Component\\Routing\\Exception\\NoConfigurationException' => __DIR__ . '/..' . '/symfony/routing/Exception/NoConfigurationException.php', + 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => __DIR__ . '/..' . '/symfony/routing/Exception/ResourceNotFoundException.php', + 'Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => __DIR__ . '/..' . '/symfony/routing/Exception/RouteNotFoundException.php', + 'Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator' => __DIR__ . '/..' . '/symfony/routing/Generator/CompiledUrlGenerator.php', + 'Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php', + 'Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php', + 'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/GeneratorDumper.php', + 'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php', + 'Symfony\\Component\\Routing\\Generator\\UrlGenerator' => __DIR__ . '/..' . '/symfony/routing/Generator/UrlGenerator.php', + 'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/UrlGeneratorInterface.php', + 'Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationClassLoader.php', + 'Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationDirectoryLoader.php', + 'Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\ClosureLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ClosureLoader.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\CollectionConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/CollectionConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\ImportConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/ImportConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\RouteConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/RouteConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/RoutingConfigurator.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\AddTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/AddTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\HostTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/HostTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\LocalizedRouteTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\PrefixTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php', + 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\RouteTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/RouteTrait.php', + 'Symfony\\Component\\Routing\\Loader\\ContainerLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ContainerLoader.php', + 'Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/DirectoryLoader.php', + 'Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/GlobFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\ObjectLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ObjectLoader.php', + 'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/XmlFileLoader.php', + 'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Routing\\Matcher\\CompiledUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/CompiledUrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumper.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php', + 'Symfony\\Component\\Routing\\Matcher\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/routing/Matcher/ExpressionLanguageProvider.php', + 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php', + 'Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RequestMatcherInterface.php', + 'Symfony\\Component\\Routing\\Matcher\\TraceableUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/TraceableUrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/UrlMatcher.php', + 'Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/UrlMatcherInterface.php', + 'Symfony\\Component\\Routing\\RequestContext' => __DIR__ . '/..' . '/symfony/routing/RequestContext.php', + 'Symfony\\Component\\Routing\\RequestContextAwareInterface' => __DIR__ . '/..' . '/symfony/routing/RequestContextAwareInterface.php', + 'Symfony\\Component\\Routing\\Route' => __DIR__ . '/..' . '/symfony/routing/Route.php', + 'Symfony\\Component\\Routing\\RouteCollection' => __DIR__ . '/..' . '/symfony/routing/RouteCollection.php', + 'Symfony\\Component\\Routing\\RouteCollectionBuilder' => __DIR__ . '/..' . '/symfony/routing/RouteCollectionBuilder.php', + 'Symfony\\Component\\Routing\\RouteCompiler' => __DIR__ . '/..' . '/symfony/routing/RouteCompiler.php', + 'Symfony\\Component\\Routing\\RouteCompilerInterface' => __DIR__ . '/..' . '/symfony/routing/RouteCompilerInterface.php', + 'Symfony\\Component\\Routing\\Router' => __DIR__ . '/..' . '/symfony/routing/Router.php', + 'Symfony\\Component\\Routing\\RouterInterface' => __DIR__ . '/..' . '/symfony/routing/RouterInterface.php', + 'Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php', + 'Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php', + 'Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php', + 'Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php', + 'Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php', + 'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php', + 'Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php', + 'Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php', + 'Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php', + 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php', + 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php', + 'Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php', + 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php', + 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/XliffLintCommand.php', + 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php', + 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', + 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php', + 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php', + 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/translation/Exception/LogicException.php', + 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/translation/Exception/RuntimeException.php', + 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php', + 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpStringTokenParser.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatterInterface.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php', + 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php', + 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php', + 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php', + 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php', + 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php', + 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php', + 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReader.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReaderInterface.php', + 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php', + 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php', + 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php', + 'Symfony\\Component\\Translation\\Util\\XliffUtils' => __DIR__ . '/..' . '/symfony/translation/Util/XliffUtils.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php', + 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ArgsStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\Caster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/Caster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ClassStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ConstStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutArrayStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DOMCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DateCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DoctrineCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsPairStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/EnumStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ExceptionCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FrameStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GmpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImagineCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImgStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/IntlCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MemcachedCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PdoCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PgSqlCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RdKafkaCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RedisCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ReflectionCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ResourceCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SplCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/StubCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SymfonyCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/TraceStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UuidCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlReaderCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlResourceCaster.php', + 'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/AbstractCloner.php', + 'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/ClonerInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Cursor.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Data' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Data.php', + 'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/DumperInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Stub' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Stub.php', + 'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/VarCloner.php', + 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php', + 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php', + 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php', + 'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => __DIR__ . '/..' . '/symfony/var-dumper/Command/ServerDumpCommand.php', + 'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/AbstractDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/CliDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextualizedDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/DataDumperInterface.php', + 'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/HtmlDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ServerDumper.php', + 'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => __DIR__ . '/..' . '/symfony/var-dumper/Exception/ThrowingCasterException.php', + 'Symfony\\Component\\VarDumper\\Server\\Connection' => __DIR__ . '/..' . '/symfony/var-dumper/Server/Connection.php', + 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php', + 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php', + 'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php', + 'Symfony\\Contracts\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/Event.php', + 'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php', + 'Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', + 'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => __DIR__ . '/..' . '/symfony/service-contracts/Test/ServiceLocatorTest.php', + 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => __DIR__ . '/..' . '/symfony/translation-contracts/Test/TranslatorTest.php', + 'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php', + 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', + 'Symfony\\Polyfill\\Iconv\\Iconv' => __DIR__ . '/..' . '/symfony/polyfill-iconv/Iconv.php', + 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php', + 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', + 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', + 'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php', + 'Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php', + 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', + 'Tests\\CreatesApplication' => __DIR__ . '/../..' . '/tests/CreatesApplication.php', + 'Tests\\Feature\\ExampleTest' => __DIR__ . '/../..' . '/tests/Feature/ExampleTest.php', + 'Tests\\TestCase' => __DIR__ . '/../..' . '/tests/TestCase.php', + 'Tests\\Unit\\ExampleTest' => __DIR__ . '/../..' . '/tests/Unit/ExampleTest.php', + 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', + 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', + 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', + 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', + 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', + 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', + 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', + 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', + 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', + 'TijsVerkoyen\\CssToInlineStyles\\CssToInlineStyles' => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Processor' => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Property\\Processor' => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Property\\Property' => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Rule\\Processor' => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php', + 'TijsVerkoyen\\CssToInlineStyles\\Css\\Rule\\Rule' => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php', + 'TitleSeeder' => __DIR__ . '/../..' . '/database/seeds/TitleSeeder.php', + 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'UserSeeder' => __DIR__ . '/../..' . '/database/seeds/UserSeeder.php', + 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + 'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', + 'Whoops\\Exception\\ErrorException' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Exception/ErrorException.php', + 'Whoops\\Exception\\Formatter' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Exception/Formatter.php', + 'Whoops\\Exception\\Frame' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Exception/Frame.php', + 'Whoops\\Exception\\FrameCollection' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Exception/FrameCollection.php', + 'Whoops\\Exception\\Inspector' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Exception/Inspector.php', + 'Whoops\\Handler\\CallbackHandler' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/CallbackHandler.php', + 'Whoops\\Handler\\Handler' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/Handler.php', + 'Whoops\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/HandlerInterface.php', + 'Whoops\\Handler\\JsonResponseHandler' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/JsonResponseHandler.php', + 'Whoops\\Handler\\PlainTextHandler' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/PlainTextHandler.php', + 'Whoops\\Handler\\PrettyPageHandler' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php', + 'Whoops\\Handler\\XmlResponseHandler' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Handler/XmlResponseHandler.php', + 'Whoops\\Run' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Run.php', + 'Whoops\\RunInterface' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/RunInterface.php', + 'Whoops\\Util\\HtmlDumperOutput' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/HtmlDumperOutput.php', + 'Whoops\\Util\\Misc' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/Misc.php', + 'Whoops\\Util\\SystemFacade' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/SystemFacade.php', + 'Whoops\\Util\\TemplateHelper' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/TemplateHelper.php', + 'XdgBaseDir\\Xdg' => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'ZipStream\\Bigint' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Bigint.php', + 'ZipStream\\DeflateStream' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/DeflateStream.php', + 'ZipStream\\Exception' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception.php', + 'ZipStream\\Exception\\EncodingException' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception/EncodingException.php', + 'ZipStream\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception/FileNotFoundException.php', + 'ZipStream\\Exception\\FileNotReadableException' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception/FileNotReadableException.php', + 'ZipStream\\Exception\\IncompatibleOptionsException' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php', + 'ZipStream\\Exception\\OverflowException' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception/OverflowException.php', + 'ZipStream\\Exception\\StreamNotReadableException' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Exception/StreamNotReadableException.php', + 'ZipStream\\File' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/File.php', + 'ZipStream\\Option\\Archive' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Option/Archive.php', + 'ZipStream\\Option\\File' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Option/File.php', + 'ZipStream\\Option\\Method' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Option/Method.php', + 'ZipStream\\Option\\Version' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Option/Version.php', + 'ZipStream\\Stream' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/Stream.php', + 'ZipStream\\ZipStream' => __DIR__ . '/..' . '/maennchen/zipstream-php/src/ZipStream.php', + 'phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', + 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', + 'phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', + 'phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', + 'phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', + 'phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', + 'phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', + 'phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', + 'phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', + 'phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', + 'phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', + 'phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', + 'phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', + 'phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', + 'phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', + 'phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', + 'phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', + 'phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', + 'phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', + 'phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', + 'phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', + 'phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', + 'phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', + 'phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', + 'phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', + 'phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', + 'phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', + 'phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', + 'phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', + 'phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', + 'phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', + 'phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', + 'phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', + 'phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', + 'phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', + 'voku\\helper\\ASCII' => __DIR__ . '/..' . '/voku/portable-ascii/src/voku/helper/ASCII.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit0e3f0c049033dd84006cc29dbf60fbc9::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit0e3f0c049033dd84006cc29dbf60fbc9::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit0e3f0c049033dd84006cc29dbf60fbc9::$prefixesPsr0; + $loader->classMap = ComposerStaticInit0e3f0c049033dd84006cc29dbf60fbc9::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..8353b38 --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,7438 @@ +{ + "packages": [ + { + "name": "asm89/stack-cors", + "version": "1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/asm89/stack-cors.git", + "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/asm89/stack-cors/zipball/b9c31def6a83f84b4d4a40d35996d375755f0e08", + "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0", + "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8.10", + "squizlabs/php_codesniffer": "^2.3" + }, + "time": "2019-12-24T22:41:47+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Asm89\\Stack\\": "src/Asm89/Stack/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander", + "email": "iam.asm89@gmail.com" + } + ], + "description": "Cross-origin resource sharing library and stack middleware", + "homepage": "https://github.com/asm89/stack-cors", + "keywords": [ + "cors", + "stack" + ], + "install-path": "../asm89/stack-cors" + }, + { + "name": "brick/math", + "version": "0.8.15", + "version_normalized": "0.8.15.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "9b08d412b9da9455b210459ff71414de7e6241cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/9b08d412b9da9455b210459ff71414de7e6241cd", + "reference": "9b08d412b9da9455b210459ff71414de7e6241cd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1|^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15|^8.5", + "vimeo/psalm": "^3.5" + }, + "time": "2020-04-15T15:59:35+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "install-path": "../brick/math" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "version_normalized": "0.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "time": "2019-12-04T15:06:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "install-path": "../dnoegel/php-xdg-base-dir" + }, + { + "name": "doctrine/inflector", + "version": "2.0.3", + "version_normalized": "2.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "time": "2020-05-29T15:13:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "install-path": "../doctrine/inflector" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "time": "2020-05-29T17:27:14+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "install-path": "../doctrine/instantiator" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "time": "2020-05-25T17:44:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "install-path": "../doctrine/lexer" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0" + }, + "time": "2019-03-31T00:38:28+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "install-path": "../dragonmantank/cron-expression" + }, + { + "name": "egulias/email-validator", + "version": "2.1.18", + "version_normalized": "2.1.18.0", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "cfa3d44471c7f5bfb684ac2b0da7114283d78441" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/cfa3d44471c7f5bfb684ac2b0da7114283d78441", + "reference": "cfa3d44471c7f5bfb684ac2b0da7114283d78441", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "time": "2020-06-16T20:11:17+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "install-path": "../egulias/email-validator" + }, + { + "name": "facade/flare-client-php", + "version": "1.3.2", + "version_normalized": "1.3.2.0", + "source": { + "type": "git", + "url": "https://github.com/facade/flare-client-php.git", + "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "~1.0", + "illuminate/pipeline": "^5.5|^6.0|^7.0", + "php": "^7.1", + "symfony/http-foundation": "^3.3|^4.1|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0" + }, + "require-dev": { + "larapack/dd": "^1.1", + "phpunit/phpunit": "^7.5.16", + "spatie/phpunit-snapshot-assertions": "^2.0" + }, + "time": "2020-03-02T15:52:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Facade\\FlareClient\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/facade/flare-client-php", + "keywords": [ + "exception", + "facade", + "flare", + "reporting" + ], + "funding": [ + { + "url": "https://www.patreon.com/spatie", + "type": "patreon" + } + ], + "install-path": "../facade/flare-client-php" + }, + { + "name": "facade/ignition", + "version": "2.0.7", + "version_normalized": "2.0.7.0", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition.git", + "reference": "e6bedc1e74507d584fbcb041ebe0f7f215109cf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition/zipball/e6bedc1e74507d584fbcb041ebe0f7f215109cf2", + "reference": "e6bedc1e74507d584fbcb041ebe0f7f215109cf2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "facade/flare-client-php": "^1.0", + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.4", + "illuminate/support": "^7.0|^8.0", + "monolog/monolog": "^2.0", + "php": "^7.2.5", + "scrivo/highlight.php": "^9.15", + "symfony/console": "^5.0", + "symfony/var-dumper": "^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "mockery/mockery": "^1.3", + "orchestra/testbench": "5.0" + }, + "suggest": { + "laravel/telescope": "^3.1" + }, + "time": "2020-06-08T09:14:08+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Facade\\Ignition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Facade\\Ignition\\Facades\\Flare" + } + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Facade\\Ignition\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://github.com/facade/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "install-path": "../facade/ignition" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "time": "2019-08-30T14:06:08+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "install-path": "../facade/ignition-contracts" + }, + { + "name": "fideloper/proxy", + "version": "4.3.0", + "version_normalized": "4.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", + "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/http": "^5.0|^6.0|^7.0|^8.0", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.0" + }, + "time": "2020-02-22T01:51:47+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Fideloper\\Proxy\\TrustedProxyServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Fideloper\\Proxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "install-path": "../fideloper/proxy" + }, + { + "name": "filp/whoops", + "version": "2.7.3", + "version_normalized": "2.7.3.0", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0", + "psr/log": "^1.0.1" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "time": "2020-06-14T09:00:00+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "install-path": "../filp/whoops" + }, + { + "name": "fruitcake/laravel-cors", + "version": "v1.0.6", + "version_normalized": "1.0.6.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/laravel-cors.git", + "reference": "1d127dbec313e2e227d65e0c483765d8d7559bf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/1d127dbec313e2e227d65e0c483765d8d7559bf6", + "reference": "1d127dbec313e2e227d65e0c483765d8d7559bf6", + "shasum": "" + }, + "require": { + "asm89/stack-cors": "^1.3", + "illuminate/contracts": "^5.5|^6.0|^7.0|^8.0", + "illuminate/support": "^5.5|^6.0|^7.0|^8.0", + "php": ">=7", + "symfony/http-foundation": "^3.3|^4.0|^5.0", + "symfony/http-kernel": "^3.3|^4.0|^5.0" + }, + "require-dev": { + "laravel/framework": "^5.5|^6.0|^7.0|^8.0", + "orchestra/testbench": "^3.5|^4.0|^5.0|^6.0", + "phpro/grumphp": "^0.16|^0.17", + "phpunit/phpunit": "^6.0|^7.0|^8.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "time": "2020-04-28T08:47:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Fruitcake\\Cors\\CorsServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "keywords": [ + "api", + "cors", + "crossdomain", + "laravel" + ], + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "install-path": "../fruitcake/laravel-cors" + }, + { + "name": "fzaninotto/faker", + "version": "v1.9.1", + "version_normalized": "1.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" + }, + "time": "2019-12-12T13:22:17+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "install-path": "../fzaninotto/faker" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "version_normalized": "6.5.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "time": "2020-06-16T21:01:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "install-path": "../guzzlehttp/guzzle" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "time": "2016-12-20T10:07:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "install-path": "../guzzlehttp/promises" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "version_normalized": "1.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2019-07-01T23:21:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "install-path": "../guzzlehttp/psr7" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "^1.0" + }, + "time": "2016-01-20T08:20:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "install-path": "../hamcrest/hamcrest-php" + }, + { + "name": "laravel/framework", + "version": "v7.16.1", + "version_normalized": "7.16.1.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "dc9cd8338d222dec2d9962553639e08c4585fa5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/dc9cd8338d222dec2d9962553639e08c4585fa5b", + "reference": "dc9cd8338d222dec2d9962553639e08c4585fa5b", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "dragonmantank/cron-expression": "^2.0", + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "league/commonmark": "^1.3", + "league/flysystem": "^1.0.34", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.17", + "opis/closure": "^3.1", + "php": "^7.2.5", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^3.7|^4.0", + "swiftmailer/swiftmailer": "^6.0", + "symfony/console": "^5.0", + "symfony/error-handler": "^5.0", + "symfony/finder": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/mime": "^5.0", + "symfony/polyfill-php73": "^1.17", + "symfony/process": "^5.0", + "symfony/routing": "^5.0", + "symfony/var-dumper": "^5.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^4.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/dbal": "^2.6", + "filp/whoops": "^2.4", + "guzzlehttp/guzzle": "^6.3.1|^7.0", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.3.1", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "^5.0", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^8.4|^9.0", + "predis/predis": "^1.1.1", + "symfony/cache": "^5.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "filp/whoops": "Required for friendly error pages in development (^2.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "mockery/mockery": "Required to use mocking (^1.3.1).", + "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.4|^9.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.0).", + "symfony/filesystem": "Required to create relative storage directory symbolic links (^5.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + }, + "time": "2020-06-16T14:31:25+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "install-path": "../laravel/framework" + }, + { + "name": "laravel/sanctum", + "version": "v2.4.2", + "version_normalized": "2.4.2.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "cf07490b92e07ee6206f712d4502e8a2a41f5049" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/cf07490b92e07ee6206f712d4502e8a2a41f5049", + "reference": "cf07490b92e07ee6206f712d4502e8a2a41f5049", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^6.9|^7.0", + "illuminate/database": "^6.9|^7.0", + "illuminate/support": "^6.9|^7.0", + "php": "^7.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.0|^5.0", + "phpunit/phpunit": "^8.0" + }, + "time": "2020-06-16T19:14:01+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "install-path": "../laravel/sanctum" + }, + { + "name": "laravel/tinker", + "version": "v2.4.0", + "version_normalized": "2.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "cde90a7335a2130a4488beb68f4b2141869241db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/cde90a7335a2130a4488beb68f4b2141869241db", + "reference": "cde90a7335a2130a4488beb68f4b2141869241db", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0", + "illuminate/contracts": "^6.0|^7.0|^8.0", + "illuminate/support": "^6.0|^7.0|^8.0", + "php": "^7.2", + "psy/psysh": "^0.10.3", + "symfony/var-dumper": "^4.3|^5.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.1", + "phpunit/phpunit": "^8.4|^9.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)." + }, + "time": "2020-04-07T15:01:31+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "install-path": "../laravel/tinker" + }, + { + "name": "laravel/ui", + "version": "v2.0.3", + "version_normalized": "2.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "15368c5328efb7ce94f35ca750acde9b496ab1b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/15368c5328efb7ce94f35ca750acde9b496ab1b1", + "reference": "15368c5328efb7ce94f35ca750acde9b496ab1b1", + "shasum": "" + }, + "require": { + "illuminate/console": "^7.0", + "illuminate/filesystem": "^7.0", + "illuminate/support": "^7.0", + "php": "^7.2.5" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^8.0" + }, + "time": "2020-04-29T15:06:45+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "install-path": "../laravel/ui" + }, + { + "name": "league/commonmark", + "version": "1.4.3", + "version_normalized": "1.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "412639f7cfbc0b31ad2455b2fe965095f66ae505" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/412639f7cfbc0b31ad2455b2fe965095f66ae505", + "reference": "412639f7cfbc0b31ad2455b2fe965095f66ae505", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1" + }, + "conflict": { + "scrutinizer/ocular": "1.7.*" + }, + "require-dev": { + "cebe/markdown": "~1.0", + "commonmark/commonmark.js": "0.29.1", + "erusev/parsedown": "~1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "~1.4", + "mikehaertl/php-shellcommand": "^1.4", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5", + "scrutinizer/ocular": "^1.5", + "symfony/finder": "^4.2" + }, + "time": "2020-05-04T22:15:21+00:00", + "bin": [ + "bin/commonmark" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "funding": [ + { + "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", + "type": "custom" + }, + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "install-path": "../league/commonmark" + }, + { + "name": "league/flysystem", + "version": "1.0.69", + "version_normalized": "1.0.69.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "7106f78428a344bc4f643c233a94e48795f10967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967", + "reference": "7106f78428a344bc4f643c233a94e48795f10967", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7.26" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "time": "2020-05-18T15:13:39+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "install-path": "../league/flysystem" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.19", + "version_normalized": "3.1.19.0", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c", + "reference": "96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0", + "php": "^7.0", + "phpoffice/phpspreadsheet": "^1.10" + }, + "require-dev": { + "mockery/mockery": "^1.1", + "orchestra/database": "^4.0", + "orchestra/testbench": "^4.0", + "phpunit/phpunit": "^8.0", + "predis/predis": "^1.1" + }, + "time": "2020-02-28T15:47:45+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "install-path": "../maatwebsite/excel" + }, + { + "name": "maennchen/zipstream-php", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": ">= 7.1", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": ">= 6.3", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": ">= 7.5" + }, + "time": "2020-05-30T13:11:16+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "install-path": "../maennchen/zipstream-php" + }, + { + "name": "markbaker/complex", + "version": "1.4.8", + "version_normalized": "1.4.8.0", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "8eaa40cceec7bf0518187530b2e63871be661b72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/8eaa40cceec7bf0518187530b2e63871be661b72", + "reference": "8eaa40cceec7bf0518187530b2e63871be661b72", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.4.0" + }, + "time": "2020-03-11T20:15:49+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "install-path": "../markbaker/complex" + }, + { + "name": "markbaker/matrix", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "5348c5a67e3b75cd209d70103f916a93b1f1ed21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/5348c5a67e3b75cd209d70103f916a93b1f1ed21", + "reference": "5348c5a67e3b75cd209d70103f916a93b1f1ed21", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "dev-master", + "phploc/phploc": "^4", + "phpmd/phpmd": "dev-master", + "phpunit/phpunit": "^5.7", + "sebastian/phpcpd": "^3.0", + "squizlabs/php_codesniffer": "^3.0@dev" + }, + "time": "2019-10-06T11:29:25+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/functions/adjoint.php", + "classes/src/functions/antidiagonal.php", + "classes/src/functions/cofactors.php", + "classes/src/functions/determinant.php", + "classes/src/functions/diagonal.php", + "classes/src/functions/identity.php", + "classes/src/functions/inverse.php", + "classes/src/functions/minors.php", + "classes/src/functions/trace.php", + "classes/src/functions/transpose.php", + "classes/src/operations/add.php", + "classes/src/operations/directsum.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "install-path": "../markbaker/matrix" + }, + { + "name": "mockery/mockery", + "version": "1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "6c6a7c533469873deacf998237e7649fc6b36223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/6c6a7c533469873deacf998237e7649fc6b36223", + "reference": "6c6a7c533469873deacf998237e7649fc6b36223", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~2.0", + "lib-pcre": ">=7.0", + "php": "^7.3.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0.0 || ^9.0.0" + }, + "time": "2020-05-19T14:25:16+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "install-path": "../mockery/mockery" + }, + { + "name": "monolog/monolog", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/38914429aac460e8e4616c8cb486ecb40ec90bb1", + "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^6.0", + "graylog2/gelf-php": "^1.4.2", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpspec/prophecy": "^1.6.1", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2020-05-22T08:12:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "install-path": "../monolog/monolog" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.5", + "version_normalized": "1.9.5.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", + "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "time": "2020-01-17T21:11:47+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "install-path": "../myclabs/deep-copy" + }, + { + "name": "myclabs/php-enum", + "version": "1.7.6", + "version_normalized": "1.7.6.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c", + "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^3.8" + }, + "time": "2020-02-14T08:15:52+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "install-path": "../myclabs/php-enum" + }, + { + "name": "nesbot/carbon", + "version": "2.35.0", + "version_normalized": "2.35.0.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "4b9bd835261ef23d36397a46a76b496a458305e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4b9bd835261ef23d36397a46a76b496a458305e5", + "reference": "4b9bd835261ef23d36397a46a76b496a458305e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "kylekatarnls/multi-tester": "^1.1", + "phpmd/phpmd": "^2.8", + "phpstan/phpstan": "^0.11", + "phpunit/phpunit": "^7.5 || ^8.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "time": "2020-05-24T18:27:52+00:00", + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev", + "dev-3.x": "3.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + }, + { + "name": "kylekatarnls", + "homepage": "http://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "install-path": "../nesbot/carbon" + }, + { + "name": "nikic/php-parser", + "version": "v4.5.0", + "version_normalized": "4.5.0.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/53c2753d756f5adb586dca79c2ec0e2654dd9463", + "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "0.0.5", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + }, + "time": "2020-06-03T07:24:19+00:00", + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "install-path": "../nikic/php-parser" + }, + { + "name": "nunomaduro/collision", + "version": "v4.2.0", + "version_normalized": "4.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "d50490417eded97be300a92cd7df7badc37a9018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/d50490417eded97be300a92cd7df7badc37a9018", + "reference": "d50490417eded97be300a92cd7df7badc37a9018", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.4", + "php": "^7.2.5", + "symfony/console": "^5.0" + }, + "require-dev": { + "facade/ignition": "^2.0", + "fideloper/proxy": "^4.2", + "friendsofphp/php-cs-fixer": "^2.16", + "fruitcake/laravel-cors": "^1.0", + "laravel/framework": "^7.0", + "laravel/tinker": "^2.0", + "nunomaduro/larastan": "^0.5", + "orchestra/testbench": "^5.0", + "phpstan/phpstan": "^0.12.3", + "phpunit/phpunit": "^8.5.1 || ^9.0" + }, + "time": "2020-04-04T19:56:08+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "install-path": "../nunomaduro/collision" + }, + { + "name": "opis/closure", + "version": "3.5.5", + "version_normalized": "3.5.5.0", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "dec9fc5ecfca93f45cd6121f8e6f14457dff372c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/dec9fc5ecfca93f45cd6121f8e6f14457dff372c", + "reference": "dec9fc5ecfca93f45cd6121f8e6f14457dff372c", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "time": "2020-06-17T14:59:55+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.5.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "install-path": "../opis/closure" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "time": "2018-07-08T19:23:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "install-path": "../phar-io/manifest" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "time": "2018-07-08T19:19:57+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "install-path": "../phar-io/version" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2020-04-27T09:25:28+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "install-path": "../phpdocumentor/reflection-common" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.1.0", + "version_normalized": "5.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "shasum": "" + }, + "require": { + "ext-filter": "^7.1", + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0", + "phpdocumentor/type-resolver": "^1.0", + "webmozart/assert": "^1" + }, + "require-dev": { + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" + }, + "time": "2020-02-22T12:28:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "install-path": "../phpdocumentor/reflection-docblock" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", + "shasum": "" + }, + "require": { + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "^7.2", + "mockery/mockery": "~1" + }, + "time": "2020-02-18T18:59:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "install-path": "../phpdocumentor/type-resolver" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.13.0", + "version_normalized": "1.13.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "21bfb5b3243b8ceb9eda499a4d699fc42c11a9d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/21bfb5b3243b8ceb9eda499a4d699fc42c11a9d1", + "reference": "21bfb5b3243b8ceb9eda499a4d699fc42c11a9d1", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "maennchen/zipstream-php": "^2.0", + "markbaker/complex": "^1.4", + "markbaker/matrix": "^1.2", + "php": "^7.2", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dompdf/dompdf": "^0.8.5", + "friendsofphp/php-cs-fixer": "^2.16", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^8.0", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.3" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "time": "2020-05-31T13:49:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "install-path": "../phpoffice/phpspreadsheet" + }, + { + "name": "phpoption/phpoption", + "version": "1.7.4", + "version_normalized": "1.7.4.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3", + "reference": "b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.3", + "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" + }, + "time": "2020-06-07T10:40:07+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "install-path": "../phpoption/phpoption" + }, + { + "name": "phpspec/prophecy", + "version": "v1.10.3", + "version_normalized": "1.10.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "451c3cd1418cf640de218914901e51b064abb093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5 || ^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "time": "2020-03-05T15:02:03+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "install-path": "../phpspec/prophecy" + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.10", + "version_normalized": "7.0.10.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "time": "2019-11-20T13:55:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "install-path": "../phpunit/php-code-coverage" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "version_normalized": "2.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "time": "2018-09-13T20:33:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "install-path": "../phpunit/php-file-iterator" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2015-06-21T13:50:34+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "install-path": "../phpunit/php-text-template" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "time": "2019-06-07T04:22:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "install-path": "../phpunit/php-timer" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "version_normalized": "3.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "time": "2019-09-17T06:23:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "abandoned": true, + "install-path": "../phpunit/php-token-stream" + }, + { + "name": "phpunit/phpunit", + "version": "8.5.6", + "version_normalized": "8.5.6.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3f9c4079d1407cd84c51c02c6ad1df6ec2ed1348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3f9c4079d1407cd84c51c02c6ad1df6ec2ed1348", + "reference": "3f9c4079d1407cd84c51c02c6ad1df6ec2ed1348", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.1", + "phar-io/manifest": "^1.0.3", + "phar-io/version": "^2.0.1", + "php": "^7.2", + "phpspec/prophecy": "^1.8.1", + "phpunit/php-code-coverage": "^7.0.7", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.2", + "sebastian/exporter": "^3.1.1", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" + }, + "time": "2020-06-15T10:45:47+00:00", + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "install-path": "../phpunit/phpunit" + }, + { + "name": "prettus/l5-repository", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ThanhSonITNIC/l5-repository.git", + "reference": "7f798a8fbe502ea52d7f14deb985daf94298cc22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ThanhSonITNIC/l5-repository/zipball/7f798a8fbe502ea52d7f14deb985daf94298cc22", + "reference": "7f798a8fbe502ea52d7f14deb985daf94298cc22", + "shasum": "" + }, + "require": { + "illuminate/config": "~5.0|~6.0|~7.0", + "illuminate/console": "~5.0|~6.0|~7.0", + "illuminate/database": "~5.0|~6.0|~7.0", + "illuminate/filesystem": "~5.0|~6.0|~7.0", + "illuminate/http": "~5.0|~6.0|~7.0", + "illuminate/pagination": "~5.0|~6.0|~7.0", + "illuminate/support": "~5.0|~6.0|~7.0", + "illuminate/validation": "~5.0|~6.0|~7.0", + "prettus/laravel-validation": "~1.1|~1.2" + }, + "suggest": { + "league/fractal": "Required to use the Fractal Presenter (0.12.*).", + "prettus/laravel-validation": "Required to provide easy validation with the repository (1.1.*)", + "robclancy/presenter": "Required to use the Presenter Model (1.3.*)" + }, + "time": "2020-03-30T04:48:31+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Prettus\\Repository\\Providers\\RepositoryServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Prettus\\Repository\\": "src/Prettus/Repository/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anderson Andrade", + "homepage": "http://andersonandra.de", + "email": "contato@andersonandra.de", + "role": "Developer" + } + ], + "description": "Laravel 5 - Repositories to the database layer", + "homepage": "http://andersao.github.io/l5-repository", + "keywords": [ + "cache", + "eloquent", + "laravel", + "model", + "repository" + ], + "support": { + "email": "contato@andersonandra.de", + "issues": "https://github.com/andersao/l5-repository/issues", + "wiki": "https://github.com/andersao/l5-repository", + "source": "https://github.com/andersao/l5-repository", + "docs": "http://andersao.github.io/l5-repository" + }, + "install-path": "../prettus/l5-repository" + }, + { + "name": "prettus/laravel-validation", + "version": "1.2.2", + "version_normalized": "1.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/andersao/laravel-validator.git", + "reference": "3d43037c2f497df3f8fbf3d8c16954a83c72e530" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/andersao/laravel-validator/zipball/3d43037c2f497df3f8fbf3d8c16954a83c72e530", + "reference": "3d43037c2f497df3f8fbf3d8c16954a83c72e530", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.4|^6.0|^7.0", + "illuminate/validation": "~5.4|^6.0|^7.0", + "php": ">=5.4.0" + }, + "time": "2020-03-14T19:28:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Prettus\\Validator\\": "src/Prettus/Validator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "authors": [ + { + "name": "Anderson Andrade", + "email": "contato@andersonandra.de", + "homepage": "http://andersonandra.de", + "role": "Developer" + } + ], + "description": "Laravel Validation Service", + "homepage": "http://andersao.github.io/laravel-validation", + "keywords": [ + "laravel", + "service", + "validation" + ], + "install-path": "../prettus/laravel-validation" + }, + { + "name": "psr/container", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-02-14T16:28:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "install-path": "../psr/container" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "time": "2019-01-08T18:20:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "install-path": "../psr/event-dispatcher" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "install-path": "../psr/http-message" + }, + { + "name": "psr/log", + "version": "1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2020-03-23T09:12:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "install-path": "../psr/log" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-10-23T01:57:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "install-path": "../psr/simple-cache" + }, + { + "name": "psy/psysh", + "version": "v0.10.4", + "version_normalized": "0.10.4.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a8aec1b2981ab66882a01cce36a49b6317dc3560", + "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1.*", + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", + "php": "^8.0 || ^7.0 || ^5.5.9", + "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", + "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "3.17.*" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", + "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + }, + "time": "2020-05-03T19:32:03+00:00", + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.10.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "install-path": "../psy/psysh" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "install-path": "../ralouphie/getallheaders" + }, + { + "name": "ramsey/collection", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", + "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "fzaninotto/faker": "^1.5", + "jakub-onderka/php-parallel-lint": "^1", + "jangregor/phpstan-prophecy": "^0.6", + "mockery/mockery": "^1.3", + "phpstan/extension-installer": "^1", + "phpstan/phpdoc-parser": "0.4.1", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "time": "2020-01-05T00:22:59+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP 7.2+ library for representing and manipulating collections.", + "homepage": "https://github.com/ramsey/collection", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "install-path": "../ramsey/collection" + }, + { + "name": "ramsey/uuid", + "version": "4.0.1", + "version_normalized": "4.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", + "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", + "shasum": "" + }, + "require": { + "brick/math": "^0.8", + "ext-json": "*", + "php": "^7.2 || ^8", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2", + "doctrine/annotations": "^1.8", + "goaop/framework": "^2", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-mockery": "^1.3", + "php-mock/php-mock-phpunit": "^2.5", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpdoc-parser": "0.4.3", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "3.9.4" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "time": "2020-03-29T20:13:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], + "install-path": "../ramsey/uuid" + }, + { + "name": "scrivo/highlight.php", + "version": "v9.18.1.1", + "version_normalized": "9.18.1.1", + "source": { + "type": "git", + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558", + "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4", + "symfony/var-dumper": "^2.8|^3.4" + }, + "suggest": { + "ext-dom": "Needed to make use of the features in the utilities namespace" + }, + "time": "2020-03-02T05:59:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" + }, + "files": [ + "HighlightUtilities/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" + } + ], + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", + "keywords": [ + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" + ], + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], + "install-path": "../scrivo/highlight.php" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "time": "2017-03-04T06:30:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "install-path": "../sebastian/code-unit-reverse-lookup" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "time": "2018-07-12T15:12:46+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "install-path": "../sebastian/comparator" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "time": "2019-02-04T06:01:07+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "install-path": "../sebastian/diff" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "version_normalized": "4.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "time": "2019-11-20T08:46:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "install-path": "../sebastian/environment" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "version_normalized": "3.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "time": "2019-09-14T09:02:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "install-path": "../sebastian/exporter" + }, + { + "name": "sebastian/global-state", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "shasum": "" + }, + "require": { + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "time": "2019-02-01T05:30:01+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "install-path": "../sebastian/global-state" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "time": "2017-08-03T12:35:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "install-path": "../sebastian/object-enumerator" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "time": "2017-03-29T09:07:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "install-path": "../sebastian/object-reflector" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "time": "2017-03-03T06:23:57+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "install-path": "../sebastian/recursion-context" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "time": "2018-10-04T04:07:39+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "install-path": "../sebastian/resource-operations" + }, + { + "name": "sebastian/type", + "version": "1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "time": "2019-07-02T08:10:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "install-path": "../sebastian/type" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "time": "2016-10-03T07:35:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "install-path": "../sebastian/version" + }, + { + "name": "spatie/laravel-permission", + "version": "3.13.0", + "version_normalized": "3.13.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-permission.git", + "reference": "49b8063fbb9ec52ebef98cc6ec527a80d8853141" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/49b8063fbb9ec52ebef98cc6ec527a80d8853141", + "reference": "49b8063fbb9ec52ebef98cc6ec527a80d8853141", + "shasum": "" + }, + "require": { + "illuminate/auth": "^5.8|^6.0|^7.0", + "illuminate/container": "^5.8|^6.0|^7.0", + "illuminate/contracts": "^5.8|^6.0|^7.0", + "illuminate/database": "^5.8|^6.0|^7.0", + "php": "^7.2.5" + }, + "require-dev": { + "orchestra/testbench": "^3.8|^4.0|^5.0", + "phpunit/phpunit": "^8.0|^9.0", + "predis/predis": "^1.1" + }, + "time": "2020-05-20T00:31:29+00:00", + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Permission\\PermissionServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Spatie\\Permission\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Permission handling for Laravel 5.8 and up", + "homepage": "https://github.com/spatie/laravel-permission", + "keywords": [ + "acl", + "laravel", + "permission", + "permissions", + "rbac", + "roles", + "security", + "spatie" + ], + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "install-path": "../spatie/laravel-permission" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.2.3", + "version_normalized": "6.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + }, + "time": "2019-11-12T09:31:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "install-path": "../swiftmailer/swiftmailer" + }, + { + "name": "symfony/console", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "34ac555a3627e324b660e318daa07572e1140123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/34ac555a3627e324b660e318daa07572e1140123", + "reference": "34ac555a3627e324b660e318daa07572e1140123", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "time": "2020-06-15T12:59:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/console" + }, + { + "name": "symfony/css-selector", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e544e24472d4c97b2d11ade7caacd446727c6bf9", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "time": "2020-05-20T17:43:50+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/css-selector" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.1.3", + "version_normalized": "2.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14", + "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2020-06-06T08:49:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" + }, + { + "name": "symfony/error-handler", + "version": "v5.1.5", + "version_normalized": "5.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "525636d4b84e06c6ca72d96b6856b5b169416e6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/525636d4b84e06c6ca72d96b6856b5b169416e6a", + "reference": "525636d4b84e06c6ca72d96b6856b5b169416e6a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "time": "2020-08-17T10:01:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ErrorHandler Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/error-handler" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.1.5", + "version_normalized": "5.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "94871fc0a69c3c5da57764187724cdce0755899c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/94871fc0a69c3c5da57764187724cdce0755899c", + "reference": "94871fc0a69c3c5da57764187724cdce0755899c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "time": "2020-08-13T14:19:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/event-dispatcher" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.1.3", + "version_normalized": "2.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f6f613d74cfc5a623fc36294d3451eb7fa5a042b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f6f613d74cfc5a623fc36294d3451eb7fa5a042b", + "reference": "f6f613d74cfc5a623fc36294d3451eb7fa5a042b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "time": "2020-07-06T13:23:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/event-dispatcher-contracts" + }, + { + "name": "symfony/finder", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187", + "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "time": "2020-05-20T17:43:50+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/finder" + }, + { + "name": "symfony/http-foundation", + "version": "v5.1.5", + "version_normalized": "5.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "41a4647f12870e9d41d9a7d72ff0614a27208558" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/41a4647f12870e9d41d9a7d72ff0614a27208558", + "reference": "41a4647f12870e9d41d9a7d72ff0614a27208558", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "time": "2020-08-17T07:48:54+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/http-foundation" + }, + { + "name": "symfony/http-kernel", + "version": "v5.1.5", + "version_normalized": "5.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "3e32676e6cb5d2081c91a56783471ff8a7f7110b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3e32676e6cb5d2081c91a56783471ff8a7f7110b", + "reference": "3e32676e6cb5d2081c91a56783471ff8a7f7110b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "time": "2020-09-02T08:15:18+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/http-kernel" + }, + { + "name": "symfony/mime", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "c0c418f05e727606e85b482a8591519c4712cf45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/c0c418f05e727606e85b482a8591519c4712cf45", + "reference": "c0c418f05e727606e85b482a8591519c4712cf45", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^4.4|^5.0" + }, + "time": "2020-06-09T15:07:35+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/mime" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "c4de7601eefbf25f9d47190abe07f79fe0a27424" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c4de7601eefbf25f9d47190abe07f79fe0a27424", + "reference": "c4de7601eefbf25f9d47190abe07f79fe0a27424", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "time": "2020-05-12T16:47:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-iconv" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "e094b0770f7833fdf257e6ba4775be4e258230b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e094b0770f7833fdf257e6ba4775be4e258230b2", + "reference": "e094b0770f7833fdf257e6ba4775be4e258230b2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-05-12T16:47:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-grapheme" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a", + "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-05-12T16:47:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-idn" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "1357b1d168eb7f68ad6a134838e46b0b159444a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/1357b1d168eb7f68ad6a134838e46b0b159444a9", + "reference": "1357b1d168eb7f68ad6a134838e46b0b159444a9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-05-12T16:14:59+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-normalizer" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-mbstring" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "f048e612a3905f34931127360bdd2def19a5e582" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", + "reference": "f048e612a3905f34931127360bdd2def19a5e582", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2020-05-12T16:47:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php72" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php73" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "shasum": "" + }, + "require": { + "php": ">=7.0.8" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php80" + }, + { + "name": "symfony/process", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", + "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "time": "2020-05-30T20:35:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/process" + }, + { + "name": "symfony/routing", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "bbd0ba121d623f66d165a55a108008968911f3eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/bbd0ba121d623f66d165a55a108008968911f3eb", + "reference": "bbd0ba121d623f66d165a55a108008968911f3eb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "time": "2020-06-10T11:49:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/routing" + }, + { + "name": "symfony/service-contracts", + "version": "v2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "time": "2020-05-20T17:43:50+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/service-contracts" + }, + { + "name": "symfony/string", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ac70459db781108db7c6d8981dd31ce0e29e3298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ac70459db781108db7c6d8981dd31ce0e29e3298", + "reference": "ac70459db781108db7c6d8981dd31ce0e29e3298", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "time": "2020-06-11T12:16:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony String component", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/string" + }, + { + "name": "symfony/translation", + "version": "v5.1.2", + "version_normalized": "5.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", + "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^2" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "time": "2020-05-30T20:35:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/translation" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e5ca07c8f817f865f618aa072c2fe8e0e637340e", + "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "time": "2020-05-20T17:43:50+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/translation-contracts" + }, + { + "name": "symfony/var-dumper", + "version": "v5.1.5", + "version_normalized": "5.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "b43a3905262bcf97b2510f0621f859ca4f5287be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b43a3905262bcf97b2510f0621f859ca4f5287be", + "reference": "b43a3905262bcf97b2510f0621f859ca4f5287be", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "time": "2020-08-17T07:42:30+00:00", + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/var-dumper" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "time": "2019-06-13T22:48:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "install-path": "../theseer/tokenizer" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.2", + "version_normalized": "2.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15", + "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "time": "2019-10-24T08:53:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "install-path": "../tijsverkoyen/css-to-inline-styles" + }, + { + "name": "vlucas/phpdotenv", + "version": "v4.1.7", + "version_normalized": "4.1.7.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "db63b2ea280fdcf13c4ca392121b0b2450b51193" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/db63b2ea280fdcf13c4ca392121b0b2450b51193", + "reference": "db63b2ea280fdcf13c4ca392121b0b2450b51193", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "phpoption/phpoption": "^1.7.3", + "symfony/polyfill-ctype": "^1.16" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "ext-pcre": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator.", + "ext-pcre": "Required to use most of the library." + }, + "time": "2020-06-07T18:25:35+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "homepage": "https://gjcampbell.co.uk/" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://vancelucas.com/" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "install-path": "../vlucas/phpdotenv" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.2", + "version_normalized": "1.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "618631dc601d8eb6ea0a9fbf654ec82f066c4e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/618631dc601d8eb6ea0a9fbf654ec82f066c4e97", + "reference": "618631dc601d8eb6ea0a9fbf654ec82f066c4e97", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "time": "2020-06-15T23:49:30+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "install-path": "../voku/portable-ascii" + }, + { + "name": "webmozart/assert", + "version": "1.9.0", + "version_normalized": "1.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "9dc4f203e36f2b486149058bade43c851dd97451" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/9dc4f203e36f2b486149058bade43c851dd97451", + "reference": "9dc4f203e36f2b486149058bade43c851dd97451", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "time": "2020-06-16T10:16:42+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "install-path": "../webmozart/assert" + } + ], + "dev": true, + "dev-package-names": [ + "doctrine/instantiator", + "facade/flare-client-php", + "facade/ignition", + "facade/ignition-contracts", + "filp/whoops", + "fzaninotto/faker", + "hamcrest/hamcrest-php", + "mockery/mockery", + "myclabs/deep-copy", + "nunomaduro/collision", + "phar-io/manifest", + "phar-io/version", + "phpdocumentor/reflection-common", + "phpdocumentor/reflection-docblock", + "phpdocumentor/type-resolver", + "phpspec/prophecy", + "phpunit/php-code-coverage", + "phpunit/php-file-iterator", + "phpunit/php-text-template", + "phpunit/php-timer", + "phpunit/php-token-stream", + "phpunit/phpunit", + "scrivo/highlight.php", + "sebastian/code-unit-reverse-lookup", + "sebastian/comparator", + "sebastian/diff", + "sebastian/environment", + "sebastian/exporter", + "sebastian/global-state", + "sebastian/object-enumerator", + "sebastian/object-reflector", + "sebastian/recursion-context", + "sebastian/resource-operations", + "sebastian/type", + "sebastian/version", + "theseer/tokenizer", + "webmozart/assert" + ] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 0000000..3518108 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,1274 @@ + + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'fda7245f7ca95deedb11dff95b8e6ff9702c2ac1', + 'name' => 'laravel/laravel', + ), + 'versions' => + array ( + 'asm89/stack-cors' => + array ( + 'pretty_version' => '1.3.0', + 'version' => '1.3.0.0', + 'aliases' => + array ( + ), + 'reference' => 'b9c31def6a83f84b4d4a40d35996d375755f0e08', + ), + 'brick/math' => + array ( + 'pretty_version' => '0.8.15', + 'version' => '0.8.15.0', + 'aliases' => + array ( + ), + 'reference' => '9b08d412b9da9455b210459ff71414de7e6241cd', + ), + 'cordoval/hamcrest-php' => + array ( + 'replaced' => + array ( + 0 => '*', + ), + ), + 'davedevelopment/hamcrest-php' => + array ( + 'replaced' => + array ( + 0 => '*', + ), + ), + 'dnoegel/php-xdg-base-dir' => + array ( + 'pretty_version' => 'v0.1.1', + 'version' => '0.1.1.0', + 'aliases' => + array ( + ), + 'reference' => '8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd', + ), + 'doctrine/inflector' => + array ( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '9cf661f4eb38f7c881cac67c75ea9b00bf97b210', + ), + 'doctrine/instantiator' => + array ( + 'pretty_version' => '1.3.1', + 'version' => '1.3.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f350df0268e904597e3bd9c4685c53e0e333feea', + ), + 'doctrine/lexer' => + array ( + 'pretty_version' => '1.2.1', + 'version' => '1.2.1.0', + 'aliases' => + array ( + ), + 'reference' => 'e864bbf5904cb8f5bb334f99209b48018522f042', + ), + 'dragonmantank/cron-expression' => + array ( + 'pretty_version' => 'v2.3.0', + 'version' => '2.3.0.0', + 'aliases' => + array ( + ), + 'reference' => '72b6fbf76adb3cf5bc0db68559b33d41219aba27', + ), + 'egulias/email-validator' => + array ( + 'pretty_version' => '2.1.18', + 'version' => '2.1.18.0', + 'aliases' => + array ( + ), + 'reference' => 'cfa3d44471c7f5bfb684ac2b0da7114283d78441', + ), + 'facade/flare-client-php' => + array ( + 'pretty_version' => '1.3.2', + 'version' => '1.3.2.0', + 'aliases' => + array ( + ), + 'reference' => 'db1e03426e7f9472c9ecd1092aff00f56aa6c004', + ), + 'facade/ignition' => + array ( + 'pretty_version' => '2.0.7', + 'version' => '2.0.7.0', + 'aliases' => + array ( + ), + 'reference' => 'e6bedc1e74507d584fbcb041ebe0f7f215109cf2', + ), + 'facade/ignition-contracts' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'f445db0fb86f48e205787b2592840dd9c80ded28', + ), + 'fideloper/proxy' => + array ( + 'pretty_version' => '4.3.0', + 'version' => '4.3.0.0', + 'aliases' => + array ( + ), + 'reference' => 'ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a', + ), + 'filp/whoops' => + array ( + 'pretty_version' => '2.7.3', + 'version' => '2.7.3.0', + 'aliases' => + array ( + ), + 'reference' => '5d5fe9bb3d656b514d455645b3addc5f7ba7714d', + ), + 'fruitcake/laravel-cors' => + array ( + 'pretty_version' => 'v1.0.6', + 'version' => '1.0.6.0', + 'aliases' => + array ( + ), + 'reference' => '1d127dbec313e2e227d65e0c483765d8d7559bf6', + ), + 'fzaninotto/faker' => + array ( + 'pretty_version' => 'v1.9.1', + 'version' => '1.9.1.0', + 'aliases' => + array ( + ), + 'reference' => 'fc10d778e4b84d5bd315dad194661e091d307c6f', + ), + 'guzzlehttp/guzzle' => + array ( + 'pretty_version' => '6.5.5', + 'version' => '6.5.5.0', + 'aliases' => + array ( + ), + 'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e', + ), + 'guzzlehttp/promises' => + array ( + 'pretty_version' => 'v1.3.1', + 'version' => '1.3.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a59da6cf61d80060647ff4d3eb2c03a2bc694646', + ), + 'guzzlehttp/psr7' => + array ( + 'pretty_version' => '1.6.1', + 'version' => '1.6.1.0', + 'aliases' => + array ( + ), + 'reference' => '239400de7a173fe9901b9ac7c06497751f00727a', + ), + 'hamcrest/hamcrest-php' => + array ( + 'pretty_version' => 'v2.0.0', + 'version' => '2.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '776503d3a8e85d4f9a1148614f95b7a608b046ad', + ), + 'illuminate/auth' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/broadcasting' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/bus' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/cache' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/config' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/console' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/container' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/contracts' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/cookie' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/database' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/encryption' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/events' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/filesystem' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/hashing' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/http' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/log' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/mail' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/notifications' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/pagination' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/pipeline' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/queue' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/redis' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/routing' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/session' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/support' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/testing' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/translation' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/validation' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'illuminate/view' => + array ( + 'replaced' => + array ( + 0 => 'v7.16.1', + ), + ), + 'kodova/hamcrest-php' => + array ( + 'replaced' => + array ( + 0 => '*', + ), + ), + 'laravel/framework' => + array ( + 'pretty_version' => 'v7.16.1', + 'version' => '7.16.1.0', + 'aliases' => + array ( + ), + 'reference' => 'dc9cd8338d222dec2d9962553639e08c4585fa5b', + ), + 'laravel/laravel' => + array ( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'aliases' => + array ( + ), + 'reference' => 'fda7245f7ca95deedb11dff95b8e6ff9702c2ac1', + ), + 'laravel/sanctum' => + array ( + 'pretty_version' => 'v2.4.2', + 'version' => '2.4.2.0', + 'aliases' => + array ( + ), + 'reference' => 'cf07490b92e07ee6206f712d4502e8a2a41f5049', + ), + 'laravel/tinker' => + array ( + 'pretty_version' => 'v2.4.0', + 'version' => '2.4.0.0', + 'aliases' => + array ( + ), + 'reference' => 'cde90a7335a2130a4488beb68f4b2141869241db', + ), + 'laravel/ui' => + array ( + 'pretty_version' => 'v2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '15368c5328efb7ce94f35ca750acde9b496ab1b1', + ), + 'league/commonmark' => + array ( + 'pretty_version' => '1.4.3', + 'version' => '1.4.3.0', + 'aliases' => + array ( + ), + 'reference' => '412639f7cfbc0b31ad2455b2fe965095f66ae505', + ), + 'league/flysystem' => + array ( + 'pretty_version' => '1.0.69', + 'version' => '1.0.69.0', + 'aliases' => + array ( + ), + 'reference' => '7106f78428a344bc4f643c233a94e48795f10967', + ), + 'maatwebsite/excel' => + array ( + 'pretty_version' => '3.1.19', + 'version' => '3.1.19.0', + 'aliases' => + array ( + ), + 'reference' => '96527a9ebc2e79e9a5fa7eaef7e23c9e9bcc587c', + ), + 'maennchen/zipstream-php' => + array ( + 'pretty_version' => '2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => 'c4c5803cc1f93df3d2448478ef79394a5981cc58', + ), + 'markbaker/complex' => + array ( + 'pretty_version' => '1.4.8', + 'version' => '1.4.8.0', + 'aliases' => + array ( + ), + 'reference' => '8eaa40cceec7bf0518187530b2e63871be661b72', + ), + 'markbaker/matrix' => + array ( + 'pretty_version' => '1.2.0', + 'version' => '1.2.0.0', + 'aliases' => + array ( + ), + 'reference' => '5348c5a67e3b75cd209d70103f916a93b1f1ed21', + ), + 'mockery/mockery' => + array ( + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '6c6a7c533469873deacf998237e7649fc6b36223', + ), + 'monolog/monolog' => + array ( + 'pretty_version' => '2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '38914429aac460e8e4616c8cb486ecb40ec90bb1', + ), + 'myclabs/deep-copy' => + array ( + 'pretty_version' => '1.9.5', + 'version' => '1.9.5.0', + 'aliases' => + array ( + ), + 'reference' => 'b2c28789e80a97badd14145fda39b545d83ca3ef', + 'replaced' => + array ( + 0 => '1.9.5', + ), + ), + 'myclabs/php-enum' => + array ( + 'pretty_version' => '1.7.6', + 'version' => '1.7.6.0', + 'aliases' => + array ( + ), + 'reference' => '5f36467c7a87e20fbdc51e524fd8f9d1de80187c', + ), + 'nesbot/carbon' => + array ( + 'pretty_version' => '2.35.0', + 'version' => '2.35.0.0', + 'aliases' => + array ( + ), + 'reference' => '4b9bd835261ef23d36397a46a76b496a458305e5', + ), + 'nikic/php-parser' => + array ( + 'pretty_version' => 'v4.5.0', + 'version' => '4.5.0.0', + 'aliases' => + array ( + ), + 'reference' => '53c2753d756f5adb586dca79c2ec0e2654dd9463', + ), + 'nunomaduro/collision' => + array ( + 'pretty_version' => 'v4.2.0', + 'version' => '4.2.0.0', + 'aliases' => + array ( + ), + 'reference' => 'd50490417eded97be300a92cd7df7badc37a9018', + ), + 'opis/closure' => + array ( + 'pretty_version' => '3.5.5', + 'version' => '3.5.5.0', + 'aliases' => + array ( + ), + 'reference' => 'dec9fc5ecfca93f45cd6121f8e6f14457dff372c', + ), + 'phar-io/manifest' => + array ( + 'pretty_version' => '1.0.3', + 'version' => '1.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '7761fcacf03b4d4f16e7ccb606d4879ca431fcf4', + ), + 'phar-io/version' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '45a2ec53a73c70ce41d55cedef9063630abaf1b6', + ), + 'phpdocumentor/reflection-common' => + array ( + 'pretty_version' => '2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '6568f4687e5b41b054365f9ae03fcb1ed5f2069b', + ), + 'phpdocumentor/reflection-docblock' => + array ( + 'pretty_version' => '5.1.0', + 'version' => '5.1.0.0', + 'aliases' => + array ( + ), + 'reference' => 'cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e', + ), + 'phpdocumentor/type-resolver' => + array ( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '7462d5f123dfc080dfdf26897032a6513644fc95', + ), + 'phpoffice/phpspreadsheet' => + array ( + 'pretty_version' => '1.13.0', + 'version' => '1.13.0.0', + 'aliases' => + array ( + ), + 'reference' => '21bfb5b3243b8ceb9eda499a4d699fc42c11a9d1', + ), + 'phpoption/phpoption' => + array ( + 'pretty_version' => '1.7.4', + 'version' => '1.7.4.0', + 'aliases' => + array ( + ), + 'reference' => 'b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3', + ), + 'phpspec/prophecy' => + array ( + 'pretty_version' => 'v1.10.3', + 'version' => '1.10.3.0', + 'aliases' => + array ( + ), + 'reference' => '451c3cd1418cf640de218914901e51b064abb093', + ), + 'phpunit/php-code-coverage' => + array ( + 'pretty_version' => '7.0.10', + 'version' => '7.0.10.0', + 'aliases' => + array ( + ), + 'reference' => 'f1884187926fbb755a9aaf0b3836ad3165b478bf', + ), + 'phpunit/php-file-iterator' => + array ( + 'pretty_version' => '2.0.2', + 'version' => '2.0.2.0', + 'aliases' => + array ( + ), + 'reference' => '050bedf145a257b1ff02746c31894800e5122946', + ), + 'phpunit/php-text-template' => + array ( + 'pretty_version' => '1.2.1', + 'version' => '1.2.1.0', + 'aliases' => + array ( + ), + 'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', + ), + 'phpunit/php-timer' => + array ( + 'pretty_version' => '2.1.2', + 'version' => '2.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '1038454804406b0b5f5f520358e78c1c2f71501e', + ), + 'phpunit/php-token-stream' => + array ( + 'pretty_version' => '3.1.1', + 'version' => '3.1.1.0', + 'aliases' => + array ( + ), + 'reference' => '995192df77f63a59e47f025390d2d1fdf8f425ff', + ), + 'phpunit/phpunit' => + array ( + 'pretty_version' => '8.5.6', + 'version' => '8.5.6.0', + 'aliases' => + array ( + ), + 'reference' => '3f9c4079d1407cd84c51c02c6ad1df6ec2ed1348', + ), + 'prettus/l5-repository' => + array ( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'aliases' => + array ( + ), + 'reference' => '7f798a8fbe502ea52d7f14deb985daf94298cc22', + ), + 'prettus/laravel-validation' => + array ( + 'pretty_version' => '1.2.2', + 'version' => '1.2.2.0', + 'aliases' => + array ( + ), + 'reference' => '3d43037c2f497df3f8fbf3d8c16954a83c72e530', + ), + 'psr/container' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', + ), + 'psr/container-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/event-dispatcher' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', + ), + 'psr/event-dispatcher-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/http-message' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + ), + 'psr/http-message-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', + ), + 'psr/log-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + 1 => '1.0.0', + ), + ), + 'psr/simple-cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + ), + 'psy/psysh' => + array ( + 'pretty_version' => 'v0.10.4', + 'version' => '0.10.4.0', + 'aliases' => + array ( + ), + 'reference' => 'a8aec1b2981ab66882a01cce36a49b6317dc3560', + ), + 'ralouphie/getallheaders' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', + ), + 'ramsey/collection' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca', + ), + 'ramsey/uuid' => + array ( + 'pretty_version' => '4.0.1', + 'version' => '4.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d', + ), + 'rhumsaa/uuid' => + array ( + 'replaced' => + array ( + 0 => '4.0.1', + ), + ), + 'scrivo/highlight.php' => + array ( + 'pretty_version' => 'v9.18.1.1', + 'version' => '9.18.1.1', + 'aliases' => + array ( + ), + 'reference' => '52fc21c99fd888e33aed4879e55a3646f8d40558', + ), + 'sebastian/code-unit-reverse-lookup' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '4419fcdb5eabb9caa61a27c7a1db532a6b55dd18', + ), + 'sebastian/comparator' => + array ( + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', + 'aliases' => + array ( + ), + 'reference' => '5de4fc177adf9bce8df98d8d141a7559d7ccf6da', + ), + 'sebastian/diff' => + array ( + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', + 'aliases' => + array ( + ), + 'reference' => '720fcc7e9b5cf384ea68d9d930d480907a0c1a29', + ), + 'sebastian/environment' => + array ( + 'pretty_version' => '4.2.3', + 'version' => '4.2.3.0', + 'aliases' => + array ( + ), + 'reference' => '464c90d7bdf5ad4e8a6aea15c091fec0603d4368', + ), + 'sebastian/exporter' => + array ( + 'pretty_version' => '3.1.2', + 'version' => '3.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '68609e1261d215ea5b21b7987539cbfbe156ec3e', + ), + 'sebastian/global-state' => + array ( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4', + ), + 'sebastian/object-enumerator' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '7cfd9e65d11ffb5af41198476395774d4c8a84c5', + ), + 'sebastian/object-reflector' => + array ( + 'pretty_version' => '1.1.1', + 'version' => '1.1.1.0', + 'aliases' => + array ( + ), + 'reference' => '773f97c67f28de00d397be301821b06708fca0be', + ), + 'sebastian/recursion-context' => + array ( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8', + ), + 'sebastian/resource-operations' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '4d7a795d35b889bf80a0cc04e08d77cedfa917a9', + ), + 'sebastian/type' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '3aaaa15fa71d27650d62a948be022fe3b48541a3', + ), + 'sebastian/version' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', + ), + 'spatie/laravel-permission' => + array ( + 'pretty_version' => '3.13.0', + 'version' => '3.13.0.0', + 'aliases' => + array ( + ), + 'reference' => '49b8063fbb9ec52ebef98cc6ec527a80d8853141', + ), + 'swiftmailer/swiftmailer' => + array ( + 'pretty_version' => 'v6.2.3', + 'version' => '6.2.3.0', + 'aliases' => + array ( + ), + 'reference' => '149cfdf118b169f7840bbe3ef0d4bc795d1780c9', + ), + 'symfony/console' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '34ac555a3627e324b660e318daa07572e1140123', + ), + 'symfony/css-selector' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'e544e24472d4c97b2d11ade7caacd446727c6bf9', + ), + 'symfony/deprecation-contracts' => + array ( + 'pretty_version' => 'v2.1.3', + 'version' => '2.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '5e20b83385a77593259c9f8beb2c43cd03b2ac14', + ), + 'symfony/error-handler' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '525636d4b84e06c6ca72d96b6856b5b169416e6a', + ), + 'symfony/event-dispatcher' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '94871fc0a69c3c5da57764187724cdce0755899c', + ), + 'symfony/event-dispatcher-contracts' => + array ( + 'pretty_version' => 'v2.1.3', + 'version' => '2.1.3.0', + 'aliases' => + array ( + ), + 'reference' => 'f6f613d74cfc5a623fc36294d3451eb7fa5a042b', + ), + 'symfony/event-dispatcher-implementation' => + array ( + 'provided' => + array ( + 0 => '2.0', + ), + ), + 'symfony/finder' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '4298870062bfc667cb78d2b379be4bf5dec5f187', + ), + 'symfony/http-foundation' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '41a4647f12870e9d41d9a7d72ff0614a27208558', + ), + 'symfony/http-kernel' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => '3e32676e6cb5d2081c91a56783471ff8a7f7110b', + ), + 'symfony/mime' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'c0c418f05e727606e85b482a8591519c4712cf45', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => '1c302646f6efc070cd46856e600e5e0684d6b454', + ), + 'symfony/polyfill-iconv' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => 'c4de7601eefbf25f9d47190abe07f79fe0a27424', + ), + 'symfony/polyfill-intl-grapheme' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => 'e094b0770f7833fdf257e6ba4775be4e258230b2', + ), + 'symfony/polyfill-intl-idn' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => '3bff59ea7047e925be6b7f2059d60af31bb46d6a', + ), + 'symfony/polyfill-intl-normalizer' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => '1357b1d168eb7f68ad6a134838e46b0b159444a9', + ), + 'symfony/polyfill-mbstring' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a6977d63bf9a0ad4c65cd352709e230876f9904a', + ), + 'symfony/polyfill-php72' => + array ( + 'pretty_version' => 'v1.17.0', + 'version' => '1.17.0.0', + 'aliases' => + array ( + ), + 'reference' => 'f048e612a3905f34931127360bdd2def19a5e582', + ), + 'symfony/polyfill-php73' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => 'fffa1a52a023e782cdcc221d781fe1ec8f87fcca', + ), + 'symfony/polyfill-php80' => + array ( + 'pretty_version' => 'v1.18.1', + 'version' => '1.18.1.0', + 'aliases' => + array ( + ), + 'reference' => 'd87d5766cbf48d72388a9f6b85f280c8ad51f981', + ), + 'symfony/process' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1', + ), + 'symfony/routing' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'bbd0ba121d623f66d165a55a108008968911f3eb', + ), + 'symfony/service-contracts' => + array ( + 'pretty_version' => 'v2.1.2', + 'version' => '2.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '66a8f0957a3ca54e4f724e49028ab19d75a8918b', + ), + 'symfony/string' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'ac70459db781108db7c6d8981dd31ce0e29e3298', + ), + 'symfony/translation' => + array ( + 'pretty_version' => 'v5.1.2', + 'version' => '5.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'd387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2', + ), + 'symfony/translation-contracts' => + array ( + 'pretty_version' => 'v2.1.2', + 'version' => '2.1.2.0', + 'aliases' => + array ( + ), + 'reference' => 'e5ca07c8f817f865f618aa072c2fe8e0e637340e', + ), + 'symfony/translation-implementation' => + array ( + 'provided' => + array ( + 0 => '2.0', + ), + ), + 'symfony/var-dumper' => + array ( + 'pretty_version' => 'v5.1.5', + 'version' => '5.1.5.0', + 'aliases' => + array ( + ), + 'reference' => 'b43a3905262bcf97b2510f0621f859ca4f5287be', + ), + 'theseer/tokenizer' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '11336f6f84e16a720dae9d8e6ed5019efa85a0f9', + ), + 'tijsverkoyen/css-to-inline-styles' => + array ( + 'pretty_version' => '2.2.2', + 'version' => '2.2.2.0', + 'aliases' => + array ( + ), + 'reference' => 'dda2ee426acd6d801d5b7fd1001cde9b5f790e15', + ), + 'vlucas/phpdotenv' => + array ( + 'pretty_version' => 'v4.1.7', + 'version' => '4.1.7.0', + 'aliases' => + array ( + ), + 'reference' => 'db63b2ea280fdcf13c4ca392121b0b2450b51193', + ), + 'voku/portable-ascii' => + array ( + 'pretty_version' => '1.5.2', + 'version' => '1.5.2.0', + 'aliases' => + array ( + ), + 'reference' => '618631dc601d8eb6ea0a9fbf654ec82f066c4e97', + ), + 'webmozart/assert' => + array ( + 'pretty_version' => '1.9.0', + 'version' => '1.9.0.0', + 'aliases' => + array ( + ), + 'reference' => '9dc4f203e36f2b486149058bade43c851dd97451', + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 0000000..a8b98d5 --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70205)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/vendor/dnoegel/php-xdg-base-dir/LICENSE b/vendor/dnoegel/php-xdg-base-dir/LICENSE new file mode 100644 index 0000000..029a00a --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Daniel Nögel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/dnoegel/php-xdg-base-dir/README.md b/vendor/dnoegel/php-xdg-base-dir/README.md new file mode 100644 index 0000000..ee06b2d --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/README.md @@ -0,0 +1,41 @@ +# XDG Base Directory + +[![Latest Stable Version](https://img.shields.io/packagist/v/dnoegel/php-xdg-base-dir.svg?style=flat-square)](https://packagist.org/packages/dnoegel/php-xdg-base-dir) +[![Total Downloads](https://img.shields.io/packagist/dt/dnoegel/php-xdg-base-dir.svg?style=flat-square)](https://packagist.org/packages/dnoegel/php-xdg-base-dir) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) +[![Build Status](https://img.shields.io/travis/dnoegel/php-xdg-base-dir/master.svg?style=flat-square)](https://travis-ci.org/dnoegel/php-xdg-base-dir) + +Implementation of XDG Base Directory specification for php + +## Install + +Via Composer + +``` bash +$ composer require dnoegel/php-xdg-base-dir +``` + +## Usage + +``` php +$xdg = new \XdgBaseDir\Xdg(); + +echo $xdg->getHomeDir(); +echo $xdg->getHomeConfigDir(); +echo $xdg->getHomeDataDir(); +echo $xdg->getHomeCacheDir(); +echo $xdg->getRuntimeDir(); + +print_r($xdg->getDataDirs()); // returns array +print_r($xdg->getConfigDirs()); // returns array +``` + +## Testing + +``` bash +$ phpunit +``` + +## License + +The MIT License (MIT). Please see [License File](https://github.com/dnoegel/php-xdg-base-dir/blob/master/LICENSE) for more information. diff --git a/vendor/dnoegel/php-xdg-base-dir/composer.json b/vendor/dnoegel/php-xdg-base-dir/composer.json new file mode 100644 index 0000000..94c4637 --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/composer.json @@ -0,0 +1,17 @@ +{ + "name": "dnoegel/php-xdg-base-dir", + "description": "implementation of xdg base directory specification for php", + "type": "library", + "license": "MIT", + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + } +} diff --git a/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php new file mode 100644 index 0000000..2dd314d --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php @@ -0,0 +1,132 @@ +getHomeDir(); + + $path = DIRECTORY_SEPARATOR === $homeDir ? $homeDir.'.config' : $homeDir . DIRECTORY_SEPARATOR . '.config'; + + return $path; + } + + /** + * @return string + */ + public function getHomeDataDir() + { + $path = getenv('XDG_DATA_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.local' . DIRECTORY_SEPARATOR . 'share'; + + return $path; + } + + /** + * @return array + */ + public function getConfigDirs() + { + $configDirs = getenv('XDG_CONFIG_DIRS') ? explode(':', getenv('XDG_CONFIG_DIRS')) : array('/etc/xdg'); + + $paths = array_merge(array($this->getHomeConfigDir()), $configDirs); + + return $paths; + } + + /** + * @return array + */ + public function getDataDirs() + { + $dataDirs = getenv('XDG_DATA_DIRS') ? explode(':', getenv('XDG_DATA_DIRS')) : array('/usr/local/share', '/usr/share'); + + $paths = array_merge(array($this->getHomeDataDir()), $dataDirs); + + return $paths; + } + + /** + * @return string + */ + public function getHomeCacheDir() + { + $path = getenv('XDG_CACHE_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.cache'; + + return $path; + + } + + public function getRuntimeDir($strict=true) + { + if ($runtimeDir = getenv('XDG_RUNTIME_DIR')) { + return $runtimeDir; + } + + if ($strict) { + throw new \RuntimeException('XDG_RUNTIME_DIR was not set'); + } + + $fallback = sys_get_temp_dir() . DIRECTORY_SEPARATOR . self::RUNTIME_DIR_FALLBACK . getenv('USER'); + + $create = false; + + if (!is_dir($fallback)) { + mkdir($fallback, 0700, true); + } + + $st = lstat($fallback); + + # The fallback must be a directory + if (!$st['mode'] & self::S_IFDIR) { + rmdir($fallback); + $create = true; + } elseif ($st['uid'] != $this->getUid() || + $st['mode'] & (self::S_IRWXG | self::S_IRWXO) + ) { + rmdir($fallback); + $create = true; + } + + if ($create) { + mkdir($fallback, 0700, true); + } + + return $fallback; + } + + private function getUid() + { + if (function_exists('posix_getuid')) { + return posix_getuid(); + } + + return getmyuid(); + } +} diff --git a/vendor/doctrine/inflector/LICENSE b/vendor/doctrine/inflector/LICENSE new file mode 100644 index 0000000..8c38cc1 --- /dev/null +++ b/vendor/doctrine/inflector/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006-2015 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/inflector/README.md b/vendor/doctrine/inflector/README.md new file mode 100644 index 0000000..341f8b2 --- /dev/null +++ b/vendor/doctrine/inflector/README.md @@ -0,0 +1,8 @@ +# Doctrine Inflector + +Doctrine Inflector is a small library that can perform string manipulations +with regard to uppercase/lowercase and singular/plural forms of words. + +[![Build Status](https://travis-ci.org/doctrine/inflector.svg)](https://travis-ci.org/doctrine/inflector) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/inflector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/inflector/?branch=master) +[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/inflector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/inflector/?branch=master) diff --git a/vendor/doctrine/inflector/composer.json b/vendor/doctrine/inflector/composer.json new file mode 100644 index 0000000..0cd85e5 --- /dev/null +++ b/vendor/doctrine/inflector/composer.json @@ -0,0 +1,40 @@ +{ + "name": "doctrine/inflector", + "type": "library", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "keywords": ["php", "strings", "words", "manipulation", "inflector", "inflection", "uppercase", "lowercase", "singular", "plural"], + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "license": "MIT", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "autoload-dev": { + "psr-4": { + "Doctrine\\Tests\\Inflector\\": "tests/Doctrine/Tests/Inflector" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + } +} diff --git a/vendor/doctrine/inflector/docs/en/index.rst b/vendor/doctrine/inflector/docs/en/index.rst new file mode 100644 index 0000000..29866f4 --- /dev/null +++ b/vendor/doctrine/inflector/docs/en/index.rst @@ -0,0 +1,226 @@ +Introduction +============ + +The Doctrine Inflector has methods for inflecting text. The features include pluralization, +singularization, converting between camelCase and under_score and capitalizing +words. + +Installation +============ + +You can install the Inflector with composer: + +.. code-block:: console + + $ composer require doctrine/inflector + +Usage +===== + +Using the inflector is easy, you can create a new ``Doctrine\Inflector\Inflector`` instance by using +the ``Doctrine\Inflector\InflectorFactory`` class: + +.. code-block:: php + + use Doctrine\Inflector\InflectorFactory; + + $inflector = InflectorFactory::create()->build(); + +By default it will create an English inflector. If you want to use another language, just pass the language +you want to create an inflector for to the ``createForLanguage()`` method: + +.. code-block:: php + + use Doctrine\Inflector\InflectorFactory; + use Doctrine\Inflector\Language; + + $inflector = InflectorFactory::createForLanguage(Language::SPANISH)->build(); + +The supported languages are as follows: + +- ``Language::ENGLISH`` +- ``Language::FRENCH`` +- ``Language::NORWEGIAN_BOKMAL`` +- ``Language::PORTUGUESE`` +- ``Language::SPANISH`` +- ``Language::TURKISH`` + +If you want to manually construct the inflector instead of using a factory, you can do so like this: + +.. code-block:: php + + use Doctrine\Inflector\CachedWordInflector; + use Doctrine\Inflector\RulesetInflector; + use Doctrine\Inflector\Rules\English; + + $inflector = new Inflector( + new CachedWordInflector(new RulesetInflector( + English\Rules::getSingularRuleset() + )), + new CachedWordInflector(new RulesetInflector( + English\Rules::getPluralRuleset() + )) + ); + +Adding Languages +---------------- + +If you are interested in adding support for your language, take a look at the other languages defined in the +``Doctrine\Inflector\Rules`` namespace and the tests located in ``Doctrine\Tests\Inflector\Rules``. You can copy +one of the languages and update the rules for your language. + +Once you have done this, send a pull request to the ``doctrine/inflector`` repository with the additions. + +Custom Setup +============ + +If you want to setup custom singular and plural rules, you can configure these in the factory: + +.. code-block:: php + + use Doctrine\Inflector\InflectorFactory; + use Doctrine\Inflector\Rules\Pattern; + use Doctrine\Inflector\Rules\Patterns; + use Doctrine\Inflector\Rules\Ruleset; + use Doctrine\Inflector\Rules\Substitution; + use Doctrine\Inflector\Rules\Substitutions; + use Doctrine\Inflector\Rules\Transformation; + use Doctrine\Inflector\Rules\Transformations; + use Doctrine\Inflector\Rules\Word; + + $inflector = InflectorFactory::create() + ->withSingularRules( + new Ruleset( + new Transformations( + new Transformation(new Pattern('/^(bil)er$/i'), '\1'), + new Transformation(new Pattern('/^(inflec|contribu)tors$/i'), '\1ta') + ), + new Patterns(new Pattern('singulars')), + new Substitutions(new Substitution(new Word('spins'), new Word('spinor'))) + ) + ) + ->withPluralRules( + new Ruleset( + new Transformations( + new Transformation(new Pattern('^(bil)er$'), '\1'), + new Transformation(new Pattern('^(inflec|contribu)tors$'), '\1ta') + ), + new Patterns(new Pattern('noflect'), new Pattern('abtuse')), + new Substitutions( + new Substitution(new Word('amaze'), new Word('amazable')), + new Substitution(new Word('phone'), new Word('phonezes')) + ) + ) + ) + ->build(); + +No operation inflector +---------------------- + +The ``Doctrine\Inflector\NoopWordInflector`` may be used to configure an inflector that doesn't perform any operation for +pluralization and/or singularization. If will simply return the input as output. + +This is an implementation of the `Null Object design pattern `_. + +.. code-block:: php + + use Doctrine\Inflector\Inflector; + use Doctrine\Inflector\NoopWordInflector; + + $inflector = new Inflector(new NoopWordInflector(), new NoopWordInflector()); + +Tableize +======== + +Converts ``ModelName`` to ``model_name``: + +.. code-block:: php + + echo $inflector->tableize('ModelName'); // model_name + +Classify +======== + +Converts ``model_name`` to ``ModelName``: + +.. code-block:: php + + echo $inflector->classify('model_name'); // ModelName + +Camelize +======== + +This method uses `Classify`_ and then converts the first character to lowercase: + +.. code-block:: php + + echo $inflector->camelize('model_name'); // modelName + +Capitalize +========== + +Takes a string and capitalizes all of the words, like PHP's built-in +``ucwords`` function. This extends that behavior, however, by allowing the +word delimiters to be configured, rather than only separating on +whitespace. + +Here is an example: + +.. code-block:: php + + $string = 'top-o-the-morning to all_of_you!'; + + echo $inflector->capitalize($string); // Top-O-The-Morning To All_of_you! + + echo $inflector->capitalize($string, '-_ '); // Top-O-The-Morning To All_Of_You! + +Pluralize +========= + +Returns a word in plural form. + +.. code-block:: php + + echo $inflector->pluralize('browser'); // browsers + +Singularize +=========== + +Returns a word in singular form. + +.. code-block:: php + + echo $inflector->singularize('browsers'); // browser + +Urlize +====== + +Generate a URL friendly string from a string of text: + +.. code-block:: php + + echo $inflector->urlize('My first blog post'); // my-first-blog-post + +Unaccent +======== + +You can unaccent a string of text using the ``unaccent()`` method: + +.. code-block:: php + + echo $inflector->unaccent('año'); // ano + +Legacy API +========== + +The API present in Inflector 1.x is still available, but will be deprecated in a future release and dropped for 3.0. +Support for languages other than English is available in the 2.0 API only. + +Acknowledgements +================ + +The language rules in this library have been adapted from several different sources, including but not limited to: + +- `Ruby On Rails Inflector `_ +- `ICanBoogie Inflector `_ +- `CakePHP Inflector `_ diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php new file mode 100644 index 0000000..b59ac46 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php @@ -0,0 +1,24 @@ +wordInflector = $wordInflector; + } + + public function inflect(string $word) : string + { + return $this->cache[$word] ?? $this->cache[$word] = $this->wordInflector->inflect($word); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php new file mode 100644 index 0000000..1b15061 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php @@ -0,0 +1,65 @@ +singularRulesets[] = $this->getSingularRuleset(); + $this->pluralRulesets[] = $this->getPluralRuleset(); + } + + final public function build() : Inflector + { + return new Inflector( + new CachedWordInflector(new RulesetInflector( + ...$this->singularRulesets + )), + new CachedWordInflector(new RulesetInflector( + ...$this->pluralRulesets + )) + ); + } + + final public function withSingularRules(?Ruleset $singularRules, bool $reset = false) : LanguageInflectorFactory + { + if ($reset) { + $this->singularRulesets = []; + } + + if ($singularRules instanceof Ruleset) { + array_unshift($this->singularRulesets, $singularRules); + } + + return $this; + } + + final public function withPluralRules(?Ruleset $pluralRules, bool $reset = false) : LanguageInflectorFactory + { + if ($reset) { + $this->pluralRulesets = []; + } + + if ($pluralRules instanceof Ruleset) { + array_unshift($this->pluralRulesets, $pluralRules); + } + + return $this; + } + + abstract protected function getSingularRuleset() : Ruleset; + + abstract protected function getPluralRuleset() : Ruleset; +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php new file mode 100644 index 0000000..2411918 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php @@ -0,0 +1,506 @@ + 'A', + 'Ã' => 'A', + 'Â' => 'A', + 'Ã' => 'A', + 'Ä' => 'Ae', + 'Æ' => 'Ae', + 'Ã…' => 'Aa', + 'æ' => 'a', + 'Ç' => 'C', + 'È' => 'E', + 'É' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'ÃŒ' => 'I', + 'Ã' => 'I', + 'ÃŽ' => 'I', + 'Ã' => 'I', + 'Ñ' => 'N', + 'Ã’' => 'O', + 'Ó' => 'O', + 'Ô' => 'O', + 'Õ' => 'O', + 'Ö' => 'Oe', + 'Ù' => 'U', + 'Ú' => 'U', + 'Û' => 'U', + 'Ü' => 'Ue', + 'Ã' => 'Y', + 'ß' => 'ss', + 'à' => 'a', + 'á' => 'a', + 'â' => 'a', + 'ã' => 'a', + 'ä' => 'ae', + 'Ã¥' => 'aa', + 'ç' => 'c', + 'è' => 'e', + 'é' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ñ' => 'n', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ö' => 'oe', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ü' => 'ue', + 'ý' => 'y', + 'ÿ' => 'y', + 'Ä€' => 'A', + 'Ä' => 'a', + 'Ä‚' => 'A', + 'ă' => 'a', + 'Ä„' => 'A', + 'Ä…' => 'a', + 'Ć' => 'C', + 'ć' => 'c', + 'Ĉ' => 'C', + 'ĉ' => 'c', + 'ÄŠ' => 'C', + 'Ä‹' => 'c', + 'ÄŒ' => 'C', + 'Ä' => 'c', + 'ÄŽ' => 'D', + 'Ä' => 'd', + 'Ä' => 'D', + 'Ä‘' => 'd', + 'Ä’' => 'E', + 'Ä“' => 'e', + 'Ä”' => 'E', + 'Ä•' => 'e', + 'Ä–' => 'E', + 'Ä—' => 'e', + 'Ę' => 'E', + 'Ä™' => 'e', + 'Äš' => 'E', + 'Ä›' => 'e', + 'Äœ' => 'G', + 'Ä' => 'g', + 'Äž' => 'G', + 'ÄŸ' => 'g', + 'Ä ' => 'G', + 'Ä¡' => 'g', + 'Ä¢' => 'G', + 'Ä£' => 'g', + 'Ĥ' => 'H', + 'Ä¥' => 'h', + 'Ħ' => 'H', + 'ħ' => 'h', + 'Ĩ' => 'I', + 'Ä©' => 'i', + 'Ī' => 'I', + 'Ä«' => 'i', + 'Ĭ' => 'I', + 'Ä­' => 'i', + 'Ä®' => 'I', + 'į' => 'i', + 'İ' => 'I', + 'ı' => 'i', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'Ä´' => 'J', + 'ĵ' => 'j', + 'Ķ' => 'K', + 'Ä·' => 'k', + 'ĸ' => 'k', + 'Ĺ' => 'L', + 'ĺ' => 'l', + 'Ä»' => 'L', + 'ļ' => 'l', + 'Ľ' => 'L', + 'ľ' => 'l', + 'Ä¿' => 'L', + 'Å€' => 'l', + 'Å' => 'L', + 'Å‚' => 'l', + 'Ń' => 'N', + 'Å„' => 'n', + 'Å…' => 'N', + 'ņ' => 'n', + 'Ň' => 'N', + 'ň' => 'n', + 'ʼn' => 'N', + 'ÅŠ' => 'n', + 'Å‹' => 'N', + 'ÅŒ' => 'O', + 'Å' => 'o', + 'ÅŽ' => 'O', + 'Å' => 'o', + 'Å' => 'O', + 'Å‘' => 'o', + 'Å’' => 'OE', + 'Å“' => 'oe', + 'Ø' => 'O', + 'ø' => 'o', + 'Å”' => 'R', + 'Å•' => 'r', + 'Å–' => 'R', + 'Å—' => 'r', + 'Ř' => 'R', + 'Å™' => 'r', + 'Åš' => 'S', + 'Å›' => 's', + 'Åœ' => 'S', + 'Å' => 's', + 'Åž' => 'S', + 'ÅŸ' => 's', + 'Å ' => 'S', + 'Å¡' => 's', + 'Å¢' => 'T', + 'Å£' => 't', + 'Ť' => 'T', + 'Å¥' => 't', + 'Ŧ' => 'T', + 'ŧ' => 't', + 'Ũ' => 'U', + 'Å©' => 'u', + 'Ū' => 'U', + 'Å«' => 'u', + 'Ŭ' => 'U', + 'Å­' => 'u', + 'Å®' => 'U', + 'ů' => 'u', + 'Ű' => 'U', + 'ű' => 'u', + 'Ų' => 'U', + 'ų' => 'u', + 'Å´' => 'W', + 'ŵ' => 'w', + 'Ŷ' => 'Y', + 'Å·' => 'y', + 'Ÿ' => 'Y', + 'Ź' => 'Z', + 'ź' => 'z', + 'Å»' => 'Z', + 'ż' => 'z', + 'Ž' => 'Z', + 'ž' => 'z', + 'Å¿' => 's', + '€' => 'E', + '£' => '', + ]; + + /** @var WordInflector */ + private $singularizer; + + /** @var WordInflector */ + private $pluralizer; + + public function __construct(WordInflector $singularizer, WordInflector $pluralizer) + { + $this->singularizer = $singularizer; + $this->pluralizer = $pluralizer; + } + + /** + * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'. + */ + public function tableize(string $word) : string + { + $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word); + + if ($tableized === null) { + throw new RuntimeException(sprintf( + 'preg_replace returned null for value "%s"', + $word + )); + } + + return mb_strtolower($tableized); + } + + /** + * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'. + */ + public function classify(string $word) : string + { + return str_replace([' ', '_', '-'], '', ucwords($word, ' _-')); + } + + /** + * Camelizes a word. This uses the classify() method and turns the first character to lowercase. + */ + public function camelize(string $word) : string + { + return lcfirst($this->classify($word)); + } + + /** + * Uppercases words with configurable delimiters between words. + * + * Takes a string and capitalizes all of the words, like PHP's built-in + * ucwords function. This extends that behavior, however, by allowing the + * word delimiters to be configured, rather than only separating on + * whitespace. + * + * Here is an example: + * + * capitalize($string); + * // Top-O-The-Morning To All_of_you! + * + * echo $inflector->capitalize($string, '-_ '); + * // Top-O-The-Morning To All_Of_You! + * ?> + * + * + * @param string $string The string to operate on. + * @param string $delimiters A list of word separators. + * + * @return string The string with all delimiter-separated words capitalized. + */ + public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-") : string + { + return ucwords($string, $delimiters); + } + + /** + * Checks if the given string seems like it has utf8 characters in it. + * + * @param string $string The string to check for utf8 characters in. + */ + public function seemsUtf8(string $string) : bool + { + for ($i = 0; $i < strlen($string); $i++) { + if (ord($string[$i]) < 0x80) { + continue; // 0bbbbbbb + } + + if ((ord($string[$i]) & 0xE0) === 0xC0) { + $n = 1; // 110bbbbb + } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { + $n = 2; // 1110bbbb + } elseif ((ord($string[$i]) & 0xF8) === 0xF0) { + $n = 3; // 11110bbb + } elseif ((ord($string[$i]) & 0xFC) === 0xF8) { + $n = 4; // 111110bb + } elseif ((ord($string[$i]) & 0xFE) === 0xFC) { + $n = 5; // 1111110b + } else { + return false; // Does not match any model + } + + for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ? + if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) { + return false; + } + } + } + + return true; + } + + /** + * Remove any illegal characters, accents, etc. + * + * @param string $string String to unaccent + * + * @return string Unaccented string + */ + public function unaccent(string $string) : string + { + if (preg_match('/[\x80-\xff]/', $string) === false) { + return $string; + } + + if ($this->seemsUtf8($string)) { + $string = strtr($string, self::ACCENTED_CHARACTERS); + } else { + $characters = []; + + // Assume ISO-8859-1 if not UTF-8 + $characters['in'] = + chr(128) + . chr(131) + . chr(138) + . chr(142) + . chr(154) + . chr(158) + . chr(159) + . chr(162) + . chr(165) + . chr(181) + . chr(192) + . chr(193) + . chr(194) + . chr(195) + . chr(196) + . chr(197) + . chr(199) + . chr(200) + . chr(201) + . chr(202) + . chr(203) + . chr(204) + . chr(205) + . chr(206) + . chr(207) + . chr(209) + . chr(210) + . chr(211) + . chr(212) + . chr(213) + . chr(214) + . chr(216) + . chr(217) + . chr(218) + . chr(219) + . chr(220) + . chr(221) + . chr(224) + . chr(225) + . chr(226) + . chr(227) + . chr(228) + . chr(229) + . chr(231) + . chr(232) + . chr(233) + . chr(234) + . chr(235) + . chr(236) + . chr(237) + . chr(238) + . chr(239) + . chr(241) + . chr(242) + . chr(243) + . chr(244) + . chr(245) + . chr(246) + . chr(248) + . chr(249) + . chr(250) + . chr(251) + . chr(252) + . chr(253) + . chr(255); + + $characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'; + + $string = strtr($string, $characters['in'], $characters['out']); + + $doubleChars = []; + + $doubleChars['in'] = [ + chr(140), + chr(156), + chr(198), + chr(208), + chr(222), + chr(223), + chr(230), + chr(240), + chr(254), + ]; + + $doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th']; + + $string = str_replace($doubleChars['in'], $doubleChars['out'], $string); + } + + return $string; + } + + /** + * Convert any passed string to a url friendly string. + * Converts 'My first blog post' to 'my-first-blog-post' + * + * @param string $string String to urlize. + * + * @return string Urlized string. + */ + public function urlize(string $string) : string + { + // Remove all non url friendly characters with the unaccent function + $unaccented = $this->unaccent($string); + + if (function_exists('mb_strtolower')) { + $lowered = mb_strtolower($unaccented); + } else { + $lowered = strtolower($unaccented); + } + + $replacements = [ + '/\W/' => ' ', + '/([A-Z]+)([A-Z][a-z])/' => '\1_\2', + '/([a-z\d])([A-Z])/' => '\1_\2', + '/[^A-Z^a-z^0-9^\/]+/' => '-', + ]; + + $urlized = $lowered; + + foreach ($replacements as $pattern => $replacement) { + $replaced = preg_replace($pattern, $replacement, $urlized); + + if ($replaced === null) { + throw new RuntimeException(sprintf( + 'preg_replace returned null for value "%s"', + $urlized + )); + } + + $urlized = $replaced; + } + + return trim($urlized, '-'); + } + + /** + * Returns a word in singular form. + * + * @param string $word The word in plural form. + * + * @return string The word in singular form. + */ + public function singularize(string $word) : string + { + return $this->singularizer->inflect($word); + } + + /** + * Returns a word in plural form. + * + * @param string $word The word in singular form. + * + * @return string The word in plural form. + */ + public function pluralize(string $word) : string + { + return $this->pluralizer->inflect($word); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php new file mode 100644 index 0000000..44bba5d --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php @@ -0,0 +1,45 @@ +getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset() : Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php new file mode 100644 index 0000000..be37a97 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php @@ -0,0 +1,193 @@ +getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset() : Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php new file mode 100644 index 0000000..2fdc020 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php @@ -0,0 +1,34 @@ +getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset() : Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php new file mode 100644 index 0000000..c6b9fc7 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php @@ -0,0 +1,36 @@ +pattern = $pattern; + + if (isset($this->pattern[0]) && $this->pattern[0] === '/') { + $this->regex = $this->pattern; + } else { + $this->regex = '/' . $this->pattern . '/i'; + } + } + + public function getPattern() : string + { + return $this->pattern; + } + + public function getRegex() : string + { + return $this->regex; + } + + public function matches(string $word) : bool + { + return preg_match($this->getRegex(), $word) === 1; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php new file mode 100644 index 0000000..a71f1ed --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php @@ -0,0 +1,34 @@ +patterns = $patterns; + + $patterns = array_map(static function (Pattern $pattern) : string { + return $pattern->getPattern(); + }, $this->patterns); + + $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i'; + } + + public function matches(string $word) : bool + { + return preg_match($this->regex, $word, $regs) === 1; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php new file mode 100644 index 0000000..155055f --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php @@ -0,0 +1,104 @@ +getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset() : Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php new file mode 100644 index 0000000..52360c4 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php @@ -0,0 +1,38 @@ +regular = $regular; + $this->uninflected = $uninflected; + $this->irregular = $irregular; + } + + public function getRegular() : Transformations + { + return $this->regular; + } + + public function getUninflected() : Patterns + { + return $this->uninflected; + } + + public function getIrregular() : Substitutions + { + return $this->irregular; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php new file mode 100644 index 0000000..6cace86 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php @@ -0,0 +1,53 @@ +getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset() : Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php new file mode 100644 index 0000000..b13281e --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php @@ -0,0 +1,36 @@ +from = $from; + $this->to = $to; + } + + public function getFrom() : Word + { + return $this->from; + } + + public function getTo() : Word + { + return $this->to; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php new file mode 100644 index 0000000..24cc34a --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php @@ -0,0 +1,56 @@ +substitutions[$substitution->getFrom()->getWord()] = $substitution; + } + } + + public function getFlippedSubstitutions() : Substitutions + { + $substitutions = []; + + foreach ($this->substitutions as $substitution) { + $substitutions[] = new Substitution( + $substitution->getTo(), + $substitution->getFrom() + ); + } + + return new Substitutions(...$substitutions); + } + + public function inflect(string $word) : string + { + $lowerWord = strtolower($word); + + if (isset($this->substitutions[$lowerWord])) { + $firstLetterUppercase = $lowerWord[0] !== $word[0]; + + $toWord = $this->substitutions[$lowerWord]->getTo()->getWord(); + + if ($firstLetterUppercase) { + return strtoupper($toWord[0]) . substr($toWord, 1); + } + + return $toWord; + } + + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php new file mode 100644 index 0000000..84ef08b --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php @@ -0,0 +1,38 @@ +pattern = $pattern; + $this->replacement = $replacement; + } + + public function getPattern() : Pattern + { + return $this->pattern; + } + + public function getReplacement() : string + { + return $this->replacement; + } + + public function inflect(string $word) : string + { + return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php new file mode 100644 index 0000000..9f4724e --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php @@ -0,0 +1,29 @@ +transformations = $transformations; + } + + public function inflect(string $word) : string + { + foreach ($this->transformations as $transformation) { + if ($transformation->getPattern()->matches($word)) { + return $transformation->inflect($word); + } + } + + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php new file mode 100644 index 0000000..74900cb --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php @@ -0,0 +1,40 @@ +getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset() : Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php new file mode 100644 index 0000000..c95ccbf --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php @@ -0,0 +1,36 @@ +word = $word; + } + + public function getWord() : string + { + return $this->word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php new file mode 100644 index 0000000..0e3a5eb --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php @@ -0,0 +1,55 @@ +rulesets = array_merge([$ruleset], $rulesets); + } + + public function inflect(string $word) : string + { + if ($word === '') { + return ''; + } + + foreach ($this->rulesets as $ruleset) { + if ($ruleset->getUninflected()->matches($word)) { + return $word; + } + + $inflected = $ruleset->getIrregular()->inflect($word); + + if ($inflected !== $word) { + return $inflected; + } + + $inflected = $ruleset->getRegular()->inflect($word); + + if ($inflected !== $word) { + return $inflected; + } + } + + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php new file mode 100644 index 0000000..f257055 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php @@ -0,0 +1,10 @@ +instantiate(\My\ClassName\Here::class); +``` + +## Contributing + +Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! + +## Credits + +This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which +has been donated to the doctrine organization, and which is now deprecated in favour of this package. diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json new file mode 100644 index 0000000..a84baa7 --- /dev/null +++ b/vendor/doctrine/instantiator/composer.json @@ -0,0 +1,52 @@ +{ + "name": "doctrine/instantiator", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "type": "library", + "license": "MIT", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "instantiate", + "constructor" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "config": { + "platform": { + "php": "7.1.27" + } + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-phar": "*", + "ext-pdo": "*", + "doctrine/coding-standard": "^6.0", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "autoload-dev": { + "psr-0": { + "DoctrineTest\\InstantiatorPerformance\\": "tests", + "DoctrineTest\\InstantiatorTest\\": "tests", + "DoctrineTest\\InstantiatorTestAsset\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + } +} diff --git a/vendor/doctrine/instantiator/docs/en/index.rst b/vendor/doctrine/instantiator/docs/en/index.rst new file mode 100644 index 0000000..0c85da0 --- /dev/null +++ b/vendor/doctrine/instantiator/docs/en/index.rst @@ -0,0 +1,68 @@ +Introduction +============ + +This library provides a way of avoiding usage of constructors when instantiating PHP classes. + +Installation +============ + +The suggested installation method is via `composer`_: + +.. code-block:: console + + $ composer require doctrine/instantiator + +Usage +===== + +The instantiator is able to create new instances of any class without +using the constructor or any API of the class itself: + +.. code-block:: php + + instantiate(User::class); + +Contributing +============ + +- Follow the `Doctrine Coding Standard`_ +- The project will follow strict `object calisthenics`_ +- Any contribution must provide tests for additional introduced + conditions +- Any un-confirmed issue needs a failing test case before being + accepted +- Pull requests must be sent from a new hotfix/feature branch, not from + ``master``. + +Testing +======= + +The PHPUnit version to be used is the one installed as a dev- dependency +via composer: + +.. code-block:: console + + $ ./vendor/bin/phpunit + +Accepted coverage for new contributions is 80%. Any contribution not +satisfying this requirement won’t be merged. + +Credits +======= + +This library was migrated from `ocramius/instantiator`_, which has been +donated to the doctrine organization, and which is now deprecated in +favour of this package. + +.. _composer: https://getcomposer.org/ +.. _CONTRIBUTING.md: CONTRIBUTING.md +.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator +.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard +.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php diff --git a/vendor/doctrine/instantiator/docs/en/sidebar.rst b/vendor/doctrine/instantiator/docs/en/sidebar.rst new file mode 100644 index 0000000..0c36479 --- /dev/null +++ b/vendor/doctrine/instantiator/docs/en/sidebar.rst @@ -0,0 +1,4 @@ +.. toctree:: + :depth: 3 + + index diff --git a/vendor/doctrine/instantiator/phpbench.json b/vendor/doctrine/instantiator/phpbench.json new file mode 100644 index 0000000..fce5dd6 --- /dev/null +++ b/vendor/doctrine/instantiator/phpbench.json @@ -0,0 +1,4 @@ +{ + "bootstrap": "vendor/autoload.php", + "path": "tests/DoctrineTest/InstantiatorPerformance" +} diff --git a/vendor/doctrine/instantiator/phpcs.xml.dist b/vendor/doctrine/instantiator/phpcs.xml.dist new file mode 100644 index 0000000..1fcac4a --- /dev/null +++ b/vendor/doctrine/instantiator/phpcs.xml.dist @@ -0,0 +1,35 @@ + + + + + + + + + + + + src + tests + + + + + + + + + + tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php + + + + src/Doctrine/Instantiator/Exception/UnexpectedValueException.php + src/Doctrine/Instantiator/Exception/InvalidArgumentException.php + + + + src/Doctrine/Instantiator/Exception/ExceptionInterface.php + src/Doctrine/Instantiator/InstantiatorInterface.php + + diff --git a/vendor/doctrine/instantiator/phpstan.neon.dist b/vendor/doctrine/instantiator/phpstan.neon.dist new file mode 100644 index 0000000..ecc38ef --- /dev/null +++ b/vendor/doctrine/instantiator/phpstan.neon.dist @@ -0,0 +1,19 @@ +includes: + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon + +parameters: + level: max + paths: + - src + - tests + + ignoreErrors: + - + message: '#::__construct\(\) does not call parent constructor from#' + path: '*/tests/DoctrineTest/InstantiatorTestAsset/*.php' + + # dynamic properties confuse static analysis + - + message: '#Access to an undefined property object::\$foo\.#' + path: '*/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php' diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php new file mode 100644 index 0000000..e6a5195 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php @@ -0,0 +1,12 @@ += 50400 && trait_exists($className)) { + return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className)); + } + + return new self(sprintf('The provided class "%s" does not exist', $className)); + } + + public static function fromAbstractClass(ReflectionClass $reflectionClass) : self + { + return new self(sprintf( + 'The provided class "%s" is abstract, and can not be instantiated', + $reflectionClass->getName() + )); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php new file mode 100644 index 0000000..d946731 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php @@ -0,0 +1,48 @@ +getName() + ), + 0, + $exception + ); + } + + public static function fromUncleanUnSerialization( + ReflectionClass $reflectionClass, + string $errorString, + int $errorCode, + string $errorFile, + int $errorLine + ) : self { + return new self( + sprintf( + 'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' + . 'in file "%s" at line "%d"', + $reflectionClass->getName(), + $errorFile, + $errorLine + ), + 0, + new Exception($errorString, $errorCode) + ); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php new file mode 100644 index 0000000..9c67862 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php @@ -0,0 +1,203 @@ +buildAndCacheFromFactory($className); + } + + /** + * Builds the requested object and caches it in static properties for performance + * + * @return object + */ + private function buildAndCacheFromFactory(string $className) + { + $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); + $instance = $factory(); + + if ($this->isSafeToClone(new ReflectionClass($instance))) { + self::$cachedCloneables[$className] = clone $instance; + } + + return $instance; + } + + /** + * Builds a callable capable of instantiating the given $className without + * invoking its constructor. + * + * @throws InvalidArgumentException + * @throws UnexpectedValueException + * @throws ReflectionException + */ + private function buildFactory(string $className) : callable + { + $reflectionClass = $this->getReflectionClass($className); + + if ($this->isInstantiableViaReflection($reflectionClass)) { + return [$reflectionClass, 'newInstanceWithoutConstructor']; + } + + $serializedString = sprintf( + '%s:%d:"%s":0:{}', + is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, + strlen($className), + $className + ); + + $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); + + return static function () use ($serializedString) { + return unserialize($serializedString); + }; + } + + /** + * @throws InvalidArgumentException + * @throws ReflectionException + */ + private function getReflectionClass(string $className) : ReflectionClass + { + if (! class_exists($className)) { + throw InvalidArgumentException::fromNonExistingClass($className); + } + + $reflection = new ReflectionClass($className); + + if ($reflection->isAbstract()) { + throw InvalidArgumentException::fromAbstractClass($reflection); + } + + return $reflection; + } + + /** + * @throws UnexpectedValueException + */ + private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void + { + set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error) : bool { + $error = UnexpectedValueException::fromUncleanUnSerialization( + $reflectionClass, + $message, + $code, + $file, + $line + ); + + return true; + }); + + try { + $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); + } finally { + restore_error_handler(); + } + + if ($error) { + throw $error; + } + } + + /** + * @throws UnexpectedValueException + */ + private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void + { + try { + unserialize($serializedString); + } catch (Exception $exception) { + throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); + } + } + + private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool + { + return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); + } + + /** + * Verifies whether the given class is to be considered internal + */ + private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool + { + do { + if ($reflectionClass->isInternal()) { + return true; + } + + $reflectionClass = $reflectionClass->getParentClass(); + } while ($reflectionClass); + + return false; + } + + /** + * Checks if a class is cloneable + * + * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. + */ + private function isSafeToClone(ReflectionClass $reflection) : bool + { + return $reflection->isCloneable() + && ! $reflection->hasMethod('__clone') + && ! $reflection->isSubclassOf(ArrayIterator::class); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php new file mode 100644 index 0000000..95299f4 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php @@ -0,0 +1,20 @@ +input = $input; + $this->tokens = []; + + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + * + * @return void + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + * + * @return void + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param int $position Position to place the lexical scanner. + * + * @return void + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Retrieve the original lexer's input until a given position. + * + * @param int $position + * + * @return string + */ + public function getInputUntilPosition($position) + { + return substr($this->input, 0, $position); + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param int|string $token + * + * @return bool + */ + public function isNextToken($token) + { + return $this->lookahead !== null && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead. + * + * @param array $tokens + * + * @return bool + */ + public function isNextTokenAny(array $tokens) + { + return $this->lookahead !== null && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * @return bool + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = isset($this->tokens[$this->position]) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param string $type The token type to skip until. + * + * @return void + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token. + * + * @param mixed $value + * @param int|string $token + * + * @return bool + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } + + return null; + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input A query string. + * + * @return void + */ + protected function scan($input) + { + if (! isset($this->regex)) { + $this->regex = sprintf( + '/(%s)|%s/%s', + implode(')|(', $this->getCatchablePatterns()), + implode('|', $this->getNonCatchablePatterns()), + $this->getModifiers() + ); + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($this->regex, $input, -1, $flags); + + if ($matches === false) { + // Work around https://bugs.php.net/78122 + $matches = [[$input, 0]]; + } + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = [ + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ]; + } + } + + /** + * Gets the literal for a given token. + * + * @param int|string $token + * + * @return int|string + */ + public function getLiteral($token) + { + $className = static::class; + $reflClass = new ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Regex modifiers + * + * @return string + */ + protected function getModifiers() + { + return 'iu'; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * + * @return int|string|null + */ + abstract protected function getType(&$value); +} diff --git a/vendor/dragonmantank/cron-expression/.editorconfig b/vendor/dragonmantank/cron-expression/.editorconfig new file mode 100644 index 0000000..1492202 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/vendor/dragonmantank/cron-expression/CHANGELOG.md b/vendor/dragonmantank/cron-expression/CHANGELOG.md new file mode 100644 index 0000000..e3939df --- /dev/null +++ b/vendor/dragonmantank/cron-expression/CHANGELOG.md @@ -0,0 +1,76 @@ +# Change Log + +## [2.3.0] - 2019-03-30 +### Added +- Added support for DateTimeImmutable via DateTimeInterface +- Added support for PHP 7.3 +- Started listing projects that use the library +### Changed +- Errors should now report a human readable position in the cron expression, instead of starting at 0 +### Fixed +- N/A + +## [2.2.0] - 2018-06-05 +### Added +- Added support for steps larger than field ranges (#6) +## Changed +- N/A +### Fixed +- Fixed validation for numbers with leading 0s (#12) + +## [2.1.0] - 2018-04-06 +### Added +- N/A +### Changed +- Upgraded to PHPUnit 6 (#2) +### Fixed +- Refactored timezones to deal with some inconsistent behavior (#3) +- Allow ranges and lists in same expression (#5) +- Fixed regression where literals were not converted to their numerical counterpart (#) + +## [2.0.0] - 2017-10-12 +### Added +- N/A + +### Changed +- Dropped support for PHP 5.x +- Dropped support for the YEAR field, as it was not part of the cron standard + +### Fixed +- Reworked validation for all the field types +- Stepping should now work for 1-indexed fields like Month (#153) + +## [1.2.0] - 2017-01-22 +### Added +- Added IDE, CodeSniffer, and StyleCI.IO support + +### Changed +- Switched to PSR-4 Autoloading + +### Fixed +- 0 step expressions are handled better +- Fixed `DayOfMonth` validation to be more strict +- Typos + +## [1.1.0] - 2016-01-26 +### Added +- Support for non-hourly offset timezones +- Checks for valid expressions + +### Changed +- Max Iterations no longer hardcoded for `getRunDate()` +- Supports DateTimeImmutable for newer PHP verions + +### Fixed +- Fixed looping bug for PHP 7 when determining the last specified weekday of a month + +## [1.0.3] - 2013-11-23 +### Added +- Now supports expressions with any number of extra spaces, tabs, or newlines + +### Changed +- Using static instead of self in `CronExpression::factory` + +### Fixed +- Fixes issue [#28](https://github.com/mtdowling/cron-expression/issues/28) where PHP increments of ranges were failing due to PHP casting hyphens to 0 +- Only set default timezone if the given $currentTime is not a DateTime instance ([#34](https://github.com/mtdowling/cron-expression/issues/34)) diff --git a/vendor/dragonmantank/cron-expression/LICENSE b/vendor/dragonmantank/cron-expression/LICENSE new file mode 100644 index 0000000..3e38bbc --- /dev/null +++ b/vendor/dragonmantank/cron-expression/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Michael Dowling , 2016 Chris Tankersley , and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/dragonmantank/cron-expression/README.md b/vendor/dragonmantank/cron-expression/README.md new file mode 100644 index 0000000..8e8021b --- /dev/null +++ b/vendor/dragonmantank/cron-expression/README.md @@ -0,0 +1,78 @@ +PHP Cron Expression Parser +========================== + +[![Latest Stable Version](https://poser.pugx.org/dragonmantank/cron-expression/v/stable.png)](https://packagist.org/packages/dragonmantank/cron-expression) [![Total Downloads](https://poser.pugx.org/dragonmantank/cron-expression/downloads.png)](https://packagist.org/packages/dragonmantank/cron-expression) [![Build Status](https://secure.travis-ci.org/dragonmantank/cron-expression.png)](http://travis-ci.org/dragonmantank/cron-expression) + +The PHP cron expression parser can parse a CRON expression, determine if it is +due to run, calculate the next run date of the expression, and calculate the previous +run date of the expression. You can calculate dates far into the future or past by +skipping **n** number of matching dates. + +The parser can handle increments of ranges (e.g. */12, 2-59/3), intervals (e.g. 0-9), +lists (e.g. 1,2,3), **W** to find the nearest weekday for a given day of the month, **L** to +find the last day of the month, **L** to find the last given weekday of a month, and hash +(#) to find the nth weekday of a given month. + +More information about this fork can be found in the blog post [here](http://ctankersley.com/2017/10/12/cron-expression-update/). tl;dr - v2.0.0 is a major breaking change, and @dragonmantank can better take care of the project in a separate fork. + +Installing +========== + +Add the dependency to your project: + +```bash +composer require dragonmantank/cron-expression +``` + +Usage +===== +```php +isDue(); +echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); +echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s'); + +// Works with complex expressions +$cron = Cron\CronExpression::factory('3-59/15 6-12 */15 1 2-5'); +echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); + +// Calculate a run date two iterations into the future +$cron = Cron\CronExpression::factory('@daily'); +echo $cron->getNextRunDate(null, 2)->format('Y-m-d H:i:s'); + +// Calculate a run date relative to a specific time +$cron = Cron\CronExpression::factory('@monthly'); +echo $cron->getNextRunDate('2010-01-12 00:00:00')->format('Y-m-d H:i:s'); +``` + +CRON Expressions +================ + +A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows: + + * * * * * + - - - - - + | | | | | + | | | | | + | | | | +----- day of week (0 - 7) (Sunday=0 or 7) + | | | +---------- month (1 - 12) + | | +--------------- day of month (1 - 31) + | +-------------------- hour (0 - 23) + +------------------------- min (0 - 59) + +Requirements +============ + +- PHP 7.0+ +- PHPUnit is required to run the unit tests +- Composer is required to run the unit tests + +Projects that Use cron-expression +================================= +* Part of the [Laravel Framework](https://github.com/laravel/framework/) +* Available as a [Symfony Bundle - setono/cron-expression-bundle](https://github.com/Setono/CronExpressionBundle) \ No newline at end of file diff --git a/vendor/dragonmantank/cron-expression/composer.json b/vendor/dragonmantank/cron-expression/composer.json new file mode 100644 index 0000000..c0b7903 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/composer.json @@ -0,0 +1,40 @@ +{ + "name": "dragonmantank/cron-expression", + "type": "library", + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": ["cron", "schedule"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0" + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/Cron/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php b/vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php new file mode 100644 index 0000000..8b1072a --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php @@ -0,0 +1,286 @@ +fullRange = range($this->rangeStart, $this->rangeEnd); + } + + /** + * Check to see if a field is satisfied by a value + * + * @param string $dateValue Date value to check + * @param string $value Value to test + * + * @return bool + */ + public function isSatisfied($dateValue, $value) + { + if ($this->isIncrementsOfRanges($value)) { + return $this->isInIncrementsOfRanges($dateValue, $value); + } elseif ($this->isRange($value)) { + return $this->isInRange($dateValue, $value); + } + + return $value == '*' || $dateValue == $value; + } + + /** + * Check if a value is a range + * + * @param string $value Value to test + * + * @return bool + */ + public function isRange($value) + { + return strpos($value, '-') !== false; + } + + /** + * Check if a value is an increments of ranges + * + * @param string $value Value to test + * + * @return bool + */ + public function isIncrementsOfRanges($value) + { + return strpos($value, '/') !== false; + } + + /** + * Test if a value is within a range + * + * @param string $dateValue Set date value + * @param string $value Value to test + * + * @return bool + */ + public function isInRange($dateValue, $value) + { + $parts = array_map(function($value) { + $value = trim($value); + $value = $this->convertLiterals($value); + return $value; + }, + explode('-', $value, 2) + ); + + + return $dateValue >= $parts[0] && $dateValue <= $parts[1]; + } + + /** + * Test if a value is within an increments of ranges (offset[-to]/step size) + * + * @param string $dateValue Set date value + * @param string $value Value to test + * + * @return bool + */ + public function isInIncrementsOfRanges($dateValue, $value) + { + $chunks = array_map('trim', explode('/', $value, 2)); + $range = $chunks[0]; + $step = isset($chunks[1]) ? $chunks[1] : 0; + + // No step or 0 steps aren't cool + if (is_null($step) || '0' === $step || 0 === $step) { + return false; + } + + // Expand the * to a full range + if ('*' == $range) { + $range = $this->rangeStart . '-' . $this->rangeEnd; + } + + // Generate the requested small range + $rangeChunks = explode('-', $range, 2); + $rangeStart = $rangeChunks[0]; + $rangeEnd = isset($rangeChunks[1]) ? $rangeChunks[1] : $rangeStart; + + if ($rangeStart < $this->rangeStart || $rangeStart > $this->rangeEnd || $rangeStart > $rangeEnd) { + throw new \OutOfRangeException('Invalid range start requested'); + } + + if ($rangeEnd < $this->rangeStart || $rangeEnd > $this->rangeEnd || $rangeEnd < $rangeStart) { + throw new \OutOfRangeException('Invalid range end requested'); + } + + // Steps larger than the range need to wrap around and be handled slightly differently than smaller steps + if ($step >= $this->rangeEnd) { + $thisRange = [$this->fullRange[$step % count($this->fullRange)]]; + } else { + $thisRange = range($rangeStart, $rangeEnd, $step); + } + + return in_array($dateValue, $thisRange); + } + + /** + * Returns a range of values for the given cron expression + * + * @param string $expression The expression to evaluate + * @param int $max Maximum offset for range + * + * @return array + */ + public function getRangeForExpression($expression, $max) + { + $values = array(); + $expression = $this->convertLiterals($expression); + + if (strpos($expression, ',') !== false) { + $ranges = explode(',', $expression); + $values = []; + foreach ($ranges as $range) { + $expanded = $this->getRangeForExpression($range, $this->rangeEnd); + $values = array_merge($values, $expanded); + } + return $values; + } + + if ($this->isRange($expression) || $this->isIncrementsOfRanges($expression)) { + if (!$this->isIncrementsOfRanges($expression)) { + list ($offset, $to) = explode('-', $expression); + $offset = $this->convertLiterals($offset); + $to = $this->convertLiterals($to); + $stepSize = 1; + } + else { + $range = array_map('trim', explode('/', $expression, 2)); + $stepSize = isset($range[1]) ? $range[1] : 0; + $range = $range[0]; + $range = explode('-', $range, 2); + $offset = $range[0]; + $to = isset($range[1]) ? $range[1] : $max; + } + $offset = $offset == '*' ? $this->rangeStart : $offset; + if ($stepSize >= $this->rangeEnd) { + $values = [$this->fullRange[$stepSize % count($this->fullRange)]]; + } else { + for ($i = $offset; $i <= $to; $i += $stepSize) { + $values[] = (int)$i; + } + } + sort($values); + } + else { + $values = array($expression); + } + + return $values; + } + + /** + * Convert literal + * + * @param string $value + * @return string + */ + protected function convertLiterals($value) + { + if (count($this->literals)) { + $key = array_search($value, $this->literals); + if ($key !== false) { + return (string) $key; + } + } + + return $value; + } + + /** + * Checks to see if a value is valid for the field + * + * @param string $value + * @return bool + */ + public function validate($value) + { + $value = $this->convertLiterals($value); + + // All fields allow * as a valid value + if ('*' === $value) { + return true; + } + + if (strpos($value, '/') !== false) { + list($range, $step) = explode('/', $value); + return $this->validate($range) && filter_var($step, FILTER_VALIDATE_INT); + } + + // Validate each chunk of a list individually + if (strpos($value, ',') !== false) { + foreach (explode(',', $value) as $listItem) { + if (!$this->validate($listItem)) { + return false; + } + } + return true; + } + + if (strpos($value, '-') !== false) { + if (substr_count($value, '-') > 1) { + return false; + } + + $chunks = explode('-', $value); + $chunks[0] = $this->convertLiterals($chunks[0]); + $chunks[1] = $this->convertLiterals($chunks[1]); + + if ('*' == $chunks[0] || '*' == $chunks[1]) { + return false; + } + + return $this->validate($chunks[0]) && $this->validate($chunks[1]); + } + + if (!is_numeric($value)) { + return false; + } + + if (is_float($value) || strpos($value, '.') !== false) { + return false; + } + + // We should have a numeric by now, so coerce this into an integer + $value = (int) $value; + + return in_array($value, $this->fullRange, true); + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php b/vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php new file mode 100644 index 0000000..594b435 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php @@ -0,0 +1,413 @@ + '0 0 1 1 *', + '@annually' => '0 0 1 1 *', + '@monthly' => '0 0 1 * *', + '@weekly' => '0 0 * * 0', + '@daily' => '0 0 * * *', + '@hourly' => '0 * * * *' + ); + + if (isset($mappings[$expression])) { + $expression = $mappings[$expression]; + } + + return new static($expression, $fieldFactory ?: new FieldFactory()); + } + + /** + * Validate a CronExpression. + * + * @param string $expression The CRON expression to validate. + * + * @return bool True if a valid CRON expression was passed. False if not. + * @see \Cron\CronExpression::factory + */ + public static function isValidExpression($expression) + { + try { + self::factory($expression); + } catch (InvalidArgumentException $e) { + return false; + } + + return true; + } + + /** + * Parse a CRON expression + * + * @param string $expression CRON expression (e.g. '8 * * * *') + * @param FieldFactory|null $fieldFactory Factory to create cron fields + */ + public function __construct($expression, FieldFactory $fieldFactory = null) + { + $this->fieldFactory = $fieldFactory; + $this->setExpression($expression); + } + + /** + * Set or change the CRON expression + * + * @param string $value CRON expression (e.g. 8 * * * *) + * + * @return CronExpression + * @throws \InvalidArgumentException if not a valid CRON expression + */ + public function setExpression($value) + { + $this->cronParts = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY); + if (count($this->cronParts) < 5) { + throw new InvalidArgumentException( + $value . ' is not a valid CRON expression' + ); + } + + foreach ($this->cronParts as $position => $part) { + $this->setPart($position, $part); + } + + return $this; + } + + /** + * Set part of the CRON expression + * + * @param int $position The position of the CRON expression to set + * @param string $value The value to set + * + * @return CronExpression + * @throws \InvalidArgumentException if the value is not valid for the part + */ + public function setPart($position, $value) + { + if (!$this->fieldFactory->getField($position)->validate($value)) { + throw new InvalidArgumentException( + 'Invalid CRON field value ' . $value . ' at position ' . $position + ); + } + + $this->cronParts[$position] = $value; + + return $this; + } + + /** + * Set max iteration count for searching next run dates + * + * @param int $maxIterationCount Max iteration count when searching for next run date + * + * @return CronExpression + */ + public function setMaxIterationCount($maxIterationCount) + { + $this->maxIterationCount = $maxIterationCount; + + return $this; + } + + /** + * Get a next run date relative to the current date or a specific date + * + * @param string|\DateTimeInterface $currentTime Relative calculation date + * @param int $nth Number of matches to skip before returning a + * matching next run date. 0, the default, will return the + * current date and time if the next run date falls on the + * current date and time. Setting this value to 1 will + * skip the first match and go to the second match. + * Setting this value to 2 will skip the first 2 + * matches and so on. + * @param bool $allowCurrentDate Set to TRUE to return the current date if + * it matches the cron expression. + * @param null|string $timeZone TimeZone to use instead of the system default + * + * @return \DateTime + * @throws \RuntimeException on too many iterations + */ + public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false, $timeZone = null) + { + return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate, $timeZone); + } + + /** + * Get a previous run date relative to the current date or a specific date + * + * @param string|\DateTimeInterface $currentTime Relative calculation date + * @param int $nth Number of matches to skip before returning + * @param bool $allowCurrentDate Set to TRUE to return the + * current date if it matches the cron expression + * @param null|string $timeZone TimeZone to use instead of the system default + * + * @return \DateTime + * @throws \RuntimeException on too many iterations + * @see \Cron\CronExpression::getNextRunDate + */ + public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false, $timeZone = null) + { + return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate, $timeZone); + } + + /** + * Get multiple run dates starting at the current date or a specific date + * + * @param int $total Set the total number of dates to calculate + * @param string|\DateTimeInterface $currentTime Relative calculation date + * @param bool $invert Set to TRUE to retrieve previous dates + * @param bool $allowCurrentDate Set to TRUE to return the + * current date if it matches the cron expression + * @param null|string $timeZone TimeZone to use instead of the system default + * + * @return \DateTime[] Returns an array of run dates + */ + public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false, $timeZone = null) + { + $matches = array(); + for ($i = 0; $i < max(0, $total); $i++) { + try { + $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate, $timeZone); + } catch (RuntimeException $e) { + break; + } + } + + return $matches; + } + + /** + * Get all or part of the CRON expression + * + * @param string $part Specify the part to retrieve or NULL to get the full + * cron schedule string. + * + * @return string|null Returns the CRON expression, a part of the + * CRON expression, or NULL if the part was specified but not found + */ + public function getExpression($part = null) + { + if (null === $part) { + return implode(' ', $this->cronParts); + } elseif (array_key_exists($part, $this->cronParts)) { + return $this->cronParts[$part]; + } + + return null; + } + + /** + * Helper method to output the full expression. + * + * @return string Full CRON expression + */ + public function __toString() + { + return $this->getExpression(); + } + + /** + * Determine if the cron is due to run based on the current date or a + * specific date. This method assumes that the current number of + * seconds are irrelevant, and should be called once per minute. + * + * @param string|\DateTimeInterface $currentTime Relative calculation date + * @param null|string $timeZone TimeZone to use instead of the system default + * + * @return bool Returns TRUE if the cron is due to run or FALSE if not + */ + public function isDue($currentTime = 'now', $timeZone = null) + { + $timeZone = $this->determineTimeZone($currentTime, $timeZone); + + if ('now' === $currentTime) { + $currentTime = new DateTime(); + } elseif ($currentTime instanceof DateTime) { + // + } elseif ($currentTime instanceof DateTimeImmutable) { + $currentTime = DateTime::createFromFormat('U', $currentTime->format('U')); + } else { + $currentTime = new DateTime($currentTime); + } + $currentTime->setTimeZone(new DateTimeZone($timeZone)); + + // drop the seconds to 0 + $currentTime = DateTime::createFromFormat('Y-m-d H:i', $currentTime->format('Y-m-d H:i')); + + try { + return $this->getNextRunDate($currentTime, 0, true)->getTimestamp() === $currentTime->getTimestamp(); + } catch (Exception $e) { + return false; + } + } + + /** + * Get the next or previous run date of the expression relative to a date + * + * @param string|\DateTimeInterface $currentTime Relative calculation date + * @param int $nth Number of matches to skip before returning + * @param bool $invert Set to TRUE to go backwards in time + * @param bool $allowCurrentDate Set to TRUE to return the + * current date if it matches the cron expression + * @param string|null $timeZone TimeZone to use instead of the system default + * + * @return \DateTime + * @throws \RuntimeException on too many iterations + */ + protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false, $timeZone = null) + { + $timeZone = $this->determineTimeZone($currentTime, $timeZone); + + if ($currentTime instanceof DateTime) { + $currentDate = clone $currentTime; + } elseif ($currentTime instanceof DateTimeImmutable) { + $currentDate = DateTime::createFromFormat('U', $currentTime->format('U')); + } else { + $currentDate = new DateTime($currentTime ?: 'now'); + } + + $currentDate->setTimeZone(new DateTimeZone($timeZone)); + $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); + $nextRun = clone $currentDate; + $nth = (int) $nth; + + // We don't have to satisfy * or null fields + $parts = array(); + $fields = array(); + foreach (self::$order as $position) { + $part = $this->getExpression($position); + if (null === $part || '*' === $part) { + continue; + } + $parts[$position] = $part; + $fields[$position] = $this->fieldFactory->getField($position); + } + + // Set a hard limit to bail on an impossible date + for ($i = 0; $i < $this->maxIterationCount; $i++) { + + foreach ($parts as $position => $part) { + $satisfied = false; + // Get the field object used to validate this part + $field = $fields[$position]; + // Check if this is singular or a list + if (strpos($part, ',') === false) { + $satisfied = $field->isSatisfiedBy($nextRun, $part); + } else { + foreach (array_map('trim', explode(',', $part)) as $listPart) { + if ($field->isSatisfiedBy($nextRun, $listPart)) { + $satisfied = true; + break; + } + } + } + + // If the field is not satisfied, then start over + if (!$satisfied) { + $field->increment($nextRun, $invert, $part); + continue 2; + } + } + + // Skip this match if needed + if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) { + $this->fieldFactory->getField(0)->increment($nextRun, $invert, isset($parts[0]) ? $parts[0] : null); + continue; + } + + return $nextRun; + } + + // @codeCoverageIgnoreStart + throw new RuntimeException('Impossible CRON expression'); + // @codeCoverageIgnoreEnd + } + + /** + * Workout what timeZone should be used. + * + * @param string|\DateTimeInterface $currentTime Relative calculation date + * @param string|null $timeZone TimeZone to use instead of the system default + * + * @return string + */ + protected function determineTimeZone($currentTime, $timeZone) + { + if (! is_null($timeZone)) { + return $timeZone; + } + + if ($currentTime instanceOf DateTimeInterface) { + return $currentTime->getTimeZone()->getName(); + } + + return date_default_timezone_get(); + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php b/vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php new file mode 100644 index 0000000..d4552e0 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php @@ -0,0 +1,145 @@ + + */ +class DayOfMonthField extends AbstractField +{ + /** + * @inheritDoc + */ + protected $rangeStart = 1; + + /** + * @inheritDoc + */ + protected $rangeEnd = 31; + + /** + * Get the nearest day of the week for a given day in a month + * + * @param int $currentYear Current year + * @param int $currentMonth Current month + * @param int $targetDay Target day of the month + * + * @return \DateTime Returns the nearest date + */ + private static function getNearestWeekday($currentYear, $currentMonth, $targetDay) + { + $tday = str_pad($targetDay, 2, '0', STR_PAD_LEFT); + $target = DateTime::createFromFormat('Y-m-d', "$currentYear-$currentMonth-$tday"); + $currentWeekday = (int) $target->format('N'); + + if ($currentWeekday < 6) { + return $target; + } + + $lastDayOfMonth = $target->format('t'); + + foreach (array(-1, 1, -2, 2) as $i) { + $adjusted = $targetDay + $i; + if ($adjusted > 0 && $adjusted <= $lastDayOfMonth) { + $target->setDate($currentYear, $currentMonth, $adjusted); + if ($target->format('N') < 6 && $target->format('m') == $currentMonth) { + return $target; + } + } + } + } + + /** + * @inheritDoc + */ + public function isSatisfiedBy(DateTimeInterface $date, $value) + { + // ? states that the field value is to be skipped + if ($value == '?') { + return true; + } + + $fieldValue = $date->format('d'); + + // Check to see if this is the last day of the month + if ($value == 'L') { + return $fieldValue == $date->format('t'); + } + + // Check to see if this is the nearest weekday to a particular value + if (strpos($value, 'W')) { + // Parse the target day + $targetDay = substr($value, 0, strpos($value, 'W')); + // Find out if the current day is the nearest day of the week + return $date->format('j') == self::getNearestWeekday( + $date->format('Y'), + $date->format('m'), + $targetDay + )->format('j'); + } + + return $this->isSatisfied($date->format('d'), $value); + } + + /** + * @inheritDoc + * + * @param \DateTime|\DateTimeImmutable &$date + */ + public function increment(DateTimeInterface &$date, $invert = false) + { + if ($invert) { + $date = $date->modify('previous day')->setTime(23, 59); + } else { + $date = $date->modify('next day')->setTime(0, 0); + } + + return $this; + } + + /** + * @inheritDoc + */ + public function validate($value) + { + $basicChecks = parent::validate($value); + + // Validate that a list don't have W or L + if (strpos($value, ',') !== false && (strpos($value, 'W') !== false || strpos($value, 'L') !== false)) { + return false; + } + + if (!$basicChecks) { + + if ($value === 'L') { + return true; + } + + if (preg_match('/^(.*)W$/', $value, $matches)) { + return $this->validate($matches[1]); + } + + return false; + } + + return $basicChecks; + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php b/vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php new file mode 100644 index 0000000..9db9e95 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php @@ -0,0 +1,196 @@ + 'MON', 2 => 'TUE', 3 => 'WED', 4 => 'THU', 5 => 'FRI', 6 => 'SAT', 7 => 'SUN']; + + /** + * Constructor + */ + public function __construct() + { + $this->nthRange = range(1, 5); + parent::__construct(); + } + + /** + * @inheritDoc + * + * @param \DateTime|\DateTimeImmutable $date + */ + public function isSatisfiedBy(DateTimeInterface $date, $value) + { + if ($value == '?') { + return true; + } + + // Convert text day of the week values to integers + $value = $this->convertLiterals($value); + + $currentYear = $date->format('Y'); + $currentMonth = $date->format('m'); + $lastDayOfMonth = $date->format('t'); + + // Find out if this is the last specific weekday of the month + if (strpos($value, 'L')) { + $weekday = $this->convertLiterals(substr($value, 0, strpos($value, 'L'))); + $weekday = str_replace('7', '0', $weekday); + + $tdate = clone $date; + $tdate = $tdate->setDate($currentYear, $currentMonth, $lastDayOfMonth); + while ($tdate->format('w') != $weekday) { + $tdateClone = new DateTime(); + $tdate = $tdateClone + ->setTimezone($tdate->getTimezone()) + ->setDate($currentYear, $currentMonth, --$lastDayOfMonth); + } + + return $date->format('j') == $lastDayOfMonth; + } + + // Handle # hash tokens + if (strpos($value, '#')) { + list($weekday, $nth) = explode('#', $value); + + if (!is_numeric($nth)) { + throw new InvalidArgumentException("Hashed weekdays must be numeric, {$nth} given"); + } else { + $nth = (int) $nth; + } + + // 0 and 7 are both Sunday, however 7 matches date('N') format ISO-8601 + if ($weekday === '0') { + $weekday = 7; + } + + $weekday = $this->convertLiterals($weekday); + + // Validate the hash fields + if ($weekday < 0 || $weekday > 7) { + throw new InvalidArgumentException("Weekday must be a value between 0 and 7. {$weekday} given"); + } + + if (!in_array($nth, $this->nthRange)) { + throw new InvalidArgumentException("There are never more than 5 or less than 1 of a given weekday in a month, {$nth} given"); + } + + // The current weekday must match the targeted weekday to proceed + if ($date->format('N') != $weekday) { + return false; + } + + $tdate = clone $date; + $tdate = $tdate->setDate($currentYear, $currentMonth, 1); + $dayCount = 0; + $currentDay = 1; + while ($currentDay < $lastDayOfMonth + 1) { + if ($tdate->format('N') == $weekday) { + if (++$dayCount >= $nth) { + break; + } + } + $tdate = $tdate->setDate($currentYear, $currentMonth, ++$currentDay); + } + + return $date->format('j') == $currentDay; + } + + // Handle day of the week values + if (strpos($value, '-')) { + $parts = explode('-', $value); + if ($parts[0] == '7') { + $parts[0] = '0'; + } elseif ($parts[1] == '0') { + $parts[1] = '7'; + } + $value = implode('-', $parts); + } + + // Test to see which Sunday to use -- 0 == 7 == Sunday + $format = in_array(7, str_split($value)) ? 'N' : 'w'; + $fieldValue = $date->format($format); + + return $this->isSatisfied($fieldValue, $value); + } + + /** + * @inheritDoc + * + * @param \DateTime|\DateTimeImmutable &$date + */ + public function increment(DateTimeInterface &$date, $invert = false) + { + if ($invert) { + $date = $date->modify('-1 day')->setTime(23, 59, 0); + } else { + $date = $date->modify('+1 day')->setTime(0, 0, 0); + } + + return $this; + } + + /** + * @inheritDoc + */ + public function validate($value) + { + $basicChecks = parent::validate($value); + + if (!$basicChecks) { + // Handle the # value + if (strpos($value, '#') !== false) { + $chunks = explode('#', $value); + $chunks[0] = $this->convertLiterals($chunks[0]); + + if (parent::validate($chunks[0]) && is_numeric($chunks[1]) && in_array($chunks[1], $this->nthRange)) { + return true; + } + } + + if (preg_match('/^(.*)L$/', $value, $matches)) { + return $this->validate($matches[1]); + } + + return false; + } + + return $basicChecks; + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php b/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php new file mode 100644 index 0000000..545e4b8 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php @@ -0,0 +1,54 @@ +fields[$position])) { + switch ($position) { + case 0: + $this->fields[$position] = new MinutesField(); + break; + case 1: + $this->fields[$position] = new HoursField(); + break; + case 2: + $this->fields[$position] = new DayOfMonthField(); + break; + case 3: + $this->fields[$position] = new MonthField(); + break; + case 4: + $this->fields[$position] = new DayOfWeekField(); + break; + default: + throw new InvalidArgumentException( + ($position + 1) . ' is not a valid position' + ); + } + } + + return $this->fields[$position]; + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php b/vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php new file mode 100644 index 0000000..f8366ea --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php @@ -0,0 +1,41 @@ +isSatisfied($date->format('H'), $value); + } + + /** + * {@inheritDoc} + * + * @param \DateTime|\DateTimeImmutable &$date + * @param string|null $parts + */ + public function increment(DateTimeInterface &$date, $invert = false, $parts = null) + { + // Change timezone to UTC temporarily. This will + // allow us to go back or forwards and hour even + // if DST will be changed between the hours. + if (is_null($parts) || $parts == '*') { + $timezone = $date->getTimezone(); + $date = $date->setTimezone(new DateTimeZone('UTC')); + $date = $date->modify(($invert ? '-' : '+') . '1 hour'); + $date = $date->setTimezone($timezone); + + $date = $date->setTime($date->format('H'), $invert ? 59 : 0); + return $this; + } + + $parts = strpos($parts, ',') !== false ? explode(',', $parts) : array($parts); + $hours = array(); + foreach ($parts as $part) { + $hours = array_merge($hours, $this->getRangeForExpression($part, 23)); + } + + $current_hour = $date->format('H'); + $position = $invert ? count($hours) - 1 : 0; + if (count($hours) > 1) { + for ($i = 0; $i < count($hours) - 1; $i++) { + if ((!$invert && $current_hour >= $hours[$i] && $current_hour < $hours[$i + 1]) || + ($invert && $current_hour > $hours[$i] && $current_hour <= $hours[$i + 1])) { + $position = $invert ? $i : $i + 1; + break; + } + } + } + + $hour = $hours[$position]; + if ((!$invert && $date->format('H') >= $hour) || ($invert && $date->format('H') <= $hour)) { + $date = $date->modify(($invert ? '-' : '+') . '1 day'); + $date = $date->setTime($invert ? 23 : 0, $invert ? 59 : 0); + } + else { + $date = $date->setTime($hour, $invert ? 59 : 0); + } + + return $this; + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php b/vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php new file mode 100644 index 0000000..fecc9b6 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php @@ -0,0 +1,75 @@ +isSatisfied($date->format('i'), $value); + } + + /** + * {@inheritDoc} + * + * @param \DateTime|\DateTimeImmutable &$date + * @param string|null $parts + */ + public function increment(DateTimeInterface &$date, $invert = false, $parts = null) + { + if (is_null($parts)) { + $date = $date->modify(($invert ? '-' : '+') . '1 minute'); + return $this; + } + + $parts = strpos($parts, ',') !== false ? explode(',', $parts) : array($parts); + $minutes = array(); + foreach ($parts as $part) { + $minutes = array_merge($minutes, $this->getRangeForExpression($part, 59)); + } + + $current_minute = $date->format('i'); + $position = $invert ? count($minutes) - 1 : 0; + if (count($minutes) > 1) { + for ($i = 0; $i < count($minutes) - 1; $i++) { + if ((!$invert && $current_minute >= $minutes[$i] && $current_minute < $minutes[$i + 1]) || + ($invert && $current_minute > $minutes[$i] && $current_minute <= $minutes[$i + 1])) { + $position = $invert ? $i : $i + 1; + break; + } + } + } + + if ((!$invert && $current_minute >= $minutes[$position]) || ($invert && $current_minute <= $minutes[$position])) { + $date = $date->modify(($invert ? '-' : '+') . '1 hour'); + $date = $date->setTime($date->format('H'), $invert ? 59 : 0); + } + else { + $date = $date->setTime($date->format('H'), $minutes[$position]); + } + + return $this; + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/MonthField.php b/vendor/dragonmantank/cron-expression/src/Cron/MonthField.php new file mode 100644 index 0000000..afc9caf --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/MonthField.php @@ -0,0 +1,59 @@ + 'JAN', 2 => 'FEB', 3 => 'MAR', 4 => 'APR', 5 => 'MAY', 6 => 'JUN', 7 => 'JUL', + 8 => 'AUG', 9 => 'SEP', 10 => 'OCT', 11 => 'NOV', 12 => 'DEC']; + + /** + * @inheritDoc + */ + public function isSatisfiedBy(DateTimeInterface $date, $value) + { + if ($value == '?') { + return true; + } + + $value = $this->convertLiterals($value); + + return $this->isSatisfied($date->format('m'), $value); + } + + /** + * @inheritDoc + * + * @param \DateTime|\DateTimeImmutable &$date + */ + public function increment(DateTimeInterface &$date, $invert = false) + { + if ($invert) { + $date = $date->modify('last day of previous month')->setTime(23, 59); + } else { + $date = $date->modify('first day of next month')->setTime(0, 0); + } + + return $this; + } + + +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php new file mode 100644 index 0000000..3811439 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php @@ -0,0 +1,139 @@ + + */ +class AbstractFieldTest extends TestCase +{ + /** + * @covers \Cron\AbstractField::isRange + */ + public function testTestsIfRange() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isRange('1-2')); + $this->assertFalse($f->isRange('2')); + } + + /** + * @covers \Cron\AbstractField::isIncrementsOfRanges + */ + public function testTestsIfIncrementsOfRanges() + { + $f = new DayOfWeekField(); + $this->assertFalse($f->isIncrementsOfRanges('1-2')); + $this->assertTrue($f->isIncrementsOfRanges('1/2')); + $this->assertTrue($f->isIncrementsOfRanges('*/2')); + $this->assertTrue($f->isIncrementsOfRanges('3-12/2')); + } + + /** + * @covers \Cron\AbstractField::isInRange + */ + public function testTestsIfInRange() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isInRange('1', '1-2')); + $this->assertTrue($f->isInRange('2', '1-2')); + $this->assertTrue($f->isInRange('5', '4-12')); + $this->assertFalse($f->isInRange('3', '4-12')); + $this->assertFalse($f->isInRange('13', '4-12')); + } + + /** + * @covers \Cron\AbstractField::isInIncrementsOfRanges + */ + public function testTestsIfInIncrementsOfRangesOnZeroStartRange() + { + $f = new MinutesField(); + $this->assertTrue($f->isInIncrementsOfRanges('3', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('13', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('15', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('14', '*/2')); + $this->assertFalse($f->isInIncrementsOfRanges('2', '3-59/13')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '*/13')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '3-59/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2-59')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*')); + $this->assertFalse($f->isInIncrementsOfRanges('0', '*/0')); + $this->assertFalse($f->isInIncrementsOfRanges('1', '*/0')); + + $this->assertTrue($f->isInIncrementsOfRanges('4', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('34', '4/1')); + } + + /** + * @covers \Cron\AbstractField::isInIncrementsOfRanges + */ + public function testTestsIfInIncrementsOfRangesOnOneStartRange() + { + $f = new MonthField(); + $this->assertTrue($f->isInIncrementsOfRanges('3', '3-12/2')); + $this->assertFalse($f->isInIncrementsOfRanges('13', '3-12/2')); + $this->assertFalse($f->isInIncrementsOfRanges('15', '3-12/2')); + $this->assertTrue($f->isInIncrementsOfRanges('3', '*/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*/3')); + $this->assertTrue($f->isInIncrementsOfRanges('7', '*/3')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '3-12/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2-12')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*')); + $this->assertFalse($f->isInIncrementsOfRanges('0', '*/0')); + $this->assertFalse($f->isInIncrementsOfRanges('1', '*/0')); + + $this->assertTrue($f->isInIncrementsOfRanges('4', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('34', '4/1')); + } + + /** + * @covers \Cron\AbstractField::isSatisfied + */ + public function testTestsIfSatisfied() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfied('12', '3-13')); + $this->assertFalse($f->isSatisfied('15', '3-7/2')); + $this->assertTrue($f->isSatisfied('12', '*')); + $this->assertTrue($f->isSatisfied('12', '12')); + $this->assertFalse($f->isSatisfied('12', '3-11')); + $this->assertFalse($f->isSatisfied('12', '3-7/2')); + $this->assertFalse($f->isSatisfied('12', '11')); + } + + /** + * Allows ranges and lists to coexist in the same expression + * + * @see https://github.com/dragonmantank/cron-expression/issues/5 + */ + public function testAllowRangesAndLists() + { + $expression = '5-7,11-13'; + $f = new HoursField(); + $this->assertTrue($f->validate($expression)); + } + + /** + * Makes sure that various types of ranges expand out properly + * + * @see https://github.com/dragonmantank/cron-expression/issues/5 + */ + public function testGetRangeForExpressionExpandsCorrectly() + { + $f = new HoursField(); + $this->assertSame([5, 6, 7, 11, 12, 13], $f->getRangeForExpression('5-7,11-13', 23)); + $this->assertSame(['5', '6', '7', '11', '12', '13'], $f->getRangeForExpression('5,6,7,11,12,13', 23)); + $this->assertSame([0, 6, 12, 18], $f->getRangeForExpression('*/6', 23)); + $this->assertSame([5, 11], $f->getRangeForExpression('5-13/6', 23)); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php new file mode 100644 index 0000000..9b82ae5 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php @@ -0,0 +1,586 @@ + + */ +class CronExpressionTest extends TestCase +{ + /** + * @covers \Cron\CronExpression::factory + */ + public function testFactoryRecognizesTemplates() + { + $this->assertSame('0 0 1 1 *', CronExpression::factory('@annually')->getExpression()); + $this->assertSame('0 0 1 1 *', CronExpression::factory('@yearly')->getExpression()); + $this->assertSame('0 0 * * 0', CronExpression::factory('@weekly')->getExpression()); + } + + /** + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::getExpression + * @covers \Cron\CronExpression::__toString + */ + public function testParsesCronSchedule() + { + // '2010-09-10 12:00:00' + $cron = CronExpression::factory('1 2-4 * 4,5,6 */3'); + $this->assertSame('1', $cron->getExpression(CronExpression::MINUTE)); + $this->assertSame('2-4', $cron->getExpression(CronExpression::HOUR)); + $this->assertSame('*', $cron->getExpression(CronExpression::DAY)); + $this->assertSame('4,5,6', $cron->getExpression(CronExpression::MONTH)); + $this->assertSame('*/3', $cron->getExpression(CronExpression::WEEKDAY)); + $this->assertSame('1 2-4 * 4,5,6 */3', $cron->getExpression()); + $this->assertSame('1 2-4 * 4,5,6 */3', (string) $cron); + $this->assertNull($cron->getExpression('foo')); + } + + /** + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::getExpression + * @covers \Cron\CronExpression::__toString + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid CRON field value A at position 0 + */ + public function testParsesCronScheduleThrowsAnException() + { + CronExpression::factory('A 1 2 3 4'); + } + + /** + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::getExpression + * @dataProvider scheduleWithDifferentSeparatorsProvider + */ + public function testParsesCronScheduleWithAnySpaceCharsAsSeparators($schedule, array $expected) + { + $cron = CronExpression::factory($schedule); + $this->assertSame($expected[0], $cron->getExpression(CronExpression::MINUTE)); + $this->assertSame($expected[1], $cron->getExpression(CronExpression::HOUR)); + $this->assertSame($expected[2], $cron->getExpression(CronExpression::DAY)); + $this->assertSame($expected[3], $cron->getExpression(CronExpression::MONTH)); + $this->assertSame($expected[4], $cron->getExpression(CronExpression::WEEKDAY)); + } + + /** + * Data provider for testParsesCronScheduleWithAnySpaceCharsAsSeparators + * + * @return array + */ + public static function scheduleWithDifferentSeparatorsProvider() + { + return array( + array("*\t*\t*\t*\t*\t", array('*', '*', '*', '*', '*', '*')), + array("* * * * * ", array('*', '*', '*', '*', '*', '*')), + array("* \t * \t * \t * \t * \t", array('*', '*', '*', '*', '*', '*')), + array("*\t \t*\t \t*\t \t*\t \t*\t \t", array('*', '*', '*', '*', '*', '*')), + ); + } + + /** + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::setExpression + * @covers \Cron\CronExpression::setPart + * @expectedException InvalidArgumentException + */ + public function testInvalidCronsWillFail() + { + // Only four values + $cron = CronExpression::factory('* * * 1'); + } + + /** + * @covers \Cron\CronExpression::setPart + * @expectedException InvalidArgumentException + */ + public function testInvalidPartsWillFail() + { + // Only four values + $cron = CronExpression::factory('* * * * *'); + $cron->setPart(1, 'abc'); + } + + /** + * Data provider for cron schedule + * + * @return array + */ + public function scheduleProvider() + { + return array( + array('*/2 */2 * * *', '2015-08-10 21:47:27', '2015-08-10 22:00:00', false), + array('* * * * *', '2015-08-10 21:50:37', '2015-08-10 21:50:00', true), + array('* 20,21,22 * * *', '2015-08-10 21:50:00', '2015-08-10 21:50:00', true), + // Handles CSV values + array('* 20,22 * * *', '2015-08-10 21:50:00', '2015-08-10 22:00:00', false), + // CSV values can be complex + array('7-9 * */9 * *', '2015-08-10 22:02:33', '2015-08-10 22:07:00', false), + // 15th minute, of the second hour, every 15 days, in January, every Friday + array('1 * * * 7', '2015-08-10 21:47:27', '2015-08-16 00:01:00', false), + // Test with exact times + array('47 21 * * *', strtotime('2015-08-10 21:47:30'), '2015-08-10 21:47:00', true), + // Test Day of the week (issue #1) + // According cron implementation, 0|7 = sunday, 1 => monday, etc + array('* * * * 0', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('* * * * 7', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('* * * * 1', strtotime('2011-06-15 23:09:00'), '2011-06-20 00:00:00', false), + // Should return the sunday date as 7 equals 0 + array('0 0 * * MON,SUN', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 1,7', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 0-4', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 7-4', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 4-7', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 7-3', strtotime('2011-06-15 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 3-7', strtotime('2011-06-15 23:09:00'), '2011-06-16 00:00:00', false), + array('0 0 * * 3-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), + // Test lists of values and ranges (Abhoryo) + array('0 0 * * 2-7', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), + array('0 0 * * 2-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), + array('0 0 * * 4-7', strtotime('2011-07-19 00:00:00'), '2011-07-21 00:00:00', false), + // Test increments of ranges + array('0-12/4 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true), + array('4-59/2 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true), + array('4-59/2 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:06:00', true), + array('4-59/3 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:07:00', false), + // Test Day of the Week and the Day of the Month (issue #1) + array('0 0 1 1 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), + array('0 0 1 JAN 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), + array('0 0 1 * 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), + // Test the W day of the week modifier for day of the month field + array('0 0 2W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), + array('0 0 1W * *', strtotime('2011-05-01 00:00:00'), '2011-05-02 00:00:00', false), + array('0 0 1W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), + array('0 0 3W * *', strtotime('2011-07-01 00:00:00'), '2011-07-04 00:00:00', false), + array('0 0 16W * *', strtotime('2011-07-01 00:00:00'), '2011-07-15 00:00:00', false), + array('0 0 28W * *', strtotime('2011-07-01 00:00:00'), '2011-07-28 00:00:00', false), + array('0 0 30W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), + array('0 0 31W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), + // Test the last weekday of a month + array('* * * * 5L', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), + array('* * * * 6L', strtotime('2011-07-01 00:00:00'), '2011-07-30 00:00:00', false), + array('* * * * 7L', strtotime('2011-07-01 00:00:00'), '2011-07-31 00:00:00', false), + array('* * * * 1L', strtotime('2011-07-24 00:00:00'), '2011-07-25 00:00:00', false), + array('* * * 1 5L', strtotime('2011-12-25 00:00:00'), '2012-01-27 00:00:00', false), + // Test the hash symbol for the nth weekday of a given month + array('* * * * 5#2', strtotime('2011-07-01 00:00:00'), '2011-07-08 00:00:00', false), + array('* * * * 5#1', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), + array('* * * * 3#4', strtotime('2011-07-01 00:00:00'), '2011-07-27 00:00:00', false), + + // Issue #7, documented example failed + ['3-59/15 6-12 */15 1 2-5', strtotime('2017-01-08 00:00:00'), '2017-01-31 06:03:00', false], + + // https://github.com/laravel/framework/commit/07d160ac3cc9764d5b429734ffce4fa311385403 + ['* * * * MON-FRI', strtotime('2017-01-08 00:00:00'), strtotime('2017-01-09 00:00:00'), false], + ['* * * * TUE', strtotime('2017-01-08 00:00:00'), strtotime('2017-01-10 00:00:00'), false], + ); + } + + /** + * @covers \Cron\CronExpression::isDue + * @covers \Cron\CronExpression::getNextRunDate + * @covers \Cron\DayOfMonthField + * @covers \Cron\DayOfWeekField + * @covers \Cron\MinutesField + * @covers \Cron\HoursField + * @covers \Cron\MonthField + * @covers \Cron\CronExpression::getRunDate + * @dataProvider scheduleProvider + */ + public function testDeterminesIfCronIsDue($schedule, $relativeTime, $nextRun, $isDue) + { + $relativeTimeString = is_int($relativeTime) ? date('Y-m-d H:i:s', $relativeTime) : $relativeTime; + + // Test next run date + $cron = CronExpression::factory($schedule); + if (is_string($relativeTime)) { + $relativeTime = new DateTime($relativeTime); + } elseif (is_int($relativeTime)) { + $relativeTime = date('Y-m-d H:i:s', $relativeTime); + } + + if (is_string($nextRun)) { + $nextRunDate = new DateTime($nextRun); + } elseif (is_int($nextRun)) { + $nextRunDate = new DateTime(); + $nextRunDate->setTimestamp($nextRun); + } + $this->assertSame($isDue, $cron->isDue($relativeTime)); + $next = $cron->getNextRunDate($relativeTime, 0, true); + + $this->assertEquals($nextRunDate, $next); + } + + /** + * @covers \Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentDates() + { + $cron = CronExpression::factory('* * * * *'); + $this->assertTrue($cron->isDue()); + $this->assertTrue($cron->isDue('now')); + $this->assertTrue($cron->isDue(new DateTime('now'))); + $this->assertTrue($cron->isDue(date('Y-m-d H:i'))); + $this->assertTrue($cron->isDue(new DateTimeImmutable('now'))); + } + + /** + * @covers \Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentDefaultTimezones() + { + $originalTimezone = date_default_timezone_get(); + $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 + $date = '2014-01-01 15:00'; //Wednesday + + date_default_timezone_set('UTC'); + $this->assertTrue($cron->isDue(new DateTime($date), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Asia/Tokyo')); + + date_default_timezone_set('Europe/Amsterdam'); + $this->assertFalse($cron->isDue(new DateTime($date), 'UTC')); + $this->assertTrue($cron->isDue(new DateTime($date), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Asia/Tokyo')); + + date_default_timezone_set('Asia/Tokyo'); + $this->assertFalse($cron->isDue(new DateTime($date), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Europe/Amsterdam')); + $this->assertTrue($cron->isDue(new DateTime($date), 'Asia/Tokyo')); + + date_default_timezone_set($originalTimezone); + } + + /** + * @covers \Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentSuppliedTimezones() + { + $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 + $date = '2014-01-01 15:00'; //Wednesday + + $this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'Asia/Tokyo')); + + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'UTC')); + $this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'Asia/Tokyo')); + + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'Europe/Amsterdam')); + $this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'Asia/Tokyo')); + } + + /** + * @covers Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentTimezonesAsArgument() + { + $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 + $date = '2014-01-01 15:00'; //Wednesday + $utc = new \DateTimeZone('UTC'); + $amsterdam = new \DateTimeZone('Europe/Amsterdam'); + $tokyo = new \DateTimeZone('Asia/Tokyo'); + $this->assertTrue($cron->isDue(new DateTime($date, $utc), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, $tokyo), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, $utc), 'Europe/Amsterdam')); + $this->assertTrue($cron->isDue(new DateTime($date, $amsterdam), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, $tokyo), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, $utc), 'Asia/Tokyo')); + $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam), 'Asia/Tokyo')); + $this->assertTrue($cron->isDue(new DateTime($date, $tokyo), 'Asia/Tokyo')); + } + + /** + * @covers Cron\CronExpression::isDue + */ + public function testRecognisesTimezonesAsPartOfDateTime() + { + $cron = CronExpression::factory("0 7 * * *"); + $tzCron = "America/New_York"; + $tzServer = new \DateTimeZone("Europe/London"); + + $dtCurrent = \DateTime::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent, 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + $dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent, 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + $dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent->format("c"), 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + $dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent->format("\@U"), 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + } + + + /** + * @covers \Cron\CronExpression::getPreviousRunDate + */ + public function testCanGetPreviousRunDates() + { + $cron = CronExpression::factory('* * * * *'); + $next = $cron->getNextRunDate('now'); + $two = $cron->getNextRunDate('now', 1); + $this->assertEquals($next, $cron->getPreviousRunDate($two)); + + $cron = CronExpression::factory('* */2 * * *'); + $next = $cron->getNextRunDate('now'); + $two = $cron->getNextRunDate('now', 1); + $this->assertEquals($next, $cron->getPreviousRunDate($two)); + + $cron = CronExpression::factory('* * * */2 *'); + $next = $cron->getNextRunDate('now'); + $two = $cron->getNextRunDate('now', 1); + $this->assertEquals($next, $cron->getPreviousRunDate($two)); + } + + /** + * @covers \Cron\CronExpression::getMultipleRunDates + */ + public function testProvidesMultipleRunDates() + { + $cron = CronExpression::factory('*/2 * * * *'); + $this->assertEquals(array( + new DateTime('2008-11-09 00:00:00'), + new DateTime('2008-11-09 00:02:00'), + new DateTime('2008-11-09 00:04:00'), + new DateTime('2008-11-09 00:06:00') + ), $cron->getMultipleRunDates(4, '2008-11-09 00:00:00', false, true)); + } + + /** + * @covers \Cron\CronExpression::getMultipleRunDates + * @covers \Cron\CronExpression::setMaxIterationCount + */ + public function testProvidesMultipleRunDatesForTheFarFuture() { + // Fails with the default 1000 iteration limit + $cron = CronExpression::factory('0 0 12 1 *'); + $cron->setMaxIterationCount(2000); + $this->assertEquals(array( + new DateTime('2016-01-12 00:00:00'), + new DateTime('2017-01-12 00:00:00'), + new DateTime('2018-01-12 00:00:00'), + new DateTime('2019-01-12 00:00:00'), + new DateTime('2020-01-12 00:00:00'), + new DateTime('2021-01-12 00:00:00'), + new DateTime('2022-01-12 00:00:00'), + new DateTime('2023-01-12 00:00:00'), + new DateTime('2024-01-12 00:00:00'), + ), $cron->getMultipleRunDates(9, '2015-04-28 00:00:00', false, true)); + } + + /** + * @covers \Cron\CronExpression + */ + public function testCanIterateOverNextRuns() + { + $cron = CronExpression::factory('@weekly'); + $nextRun = $cron->getNextRunDate("2008-11-09 08:00:00"); + $this->assertEquals($nextRun, new DateTime("2008-11-16 00:00:00")); + + // true is cast to 1 + $nextRun = $cron->getNextRunDate("2008-11-09 00:00:00", true, true); + $this->assertEquals($nextRun, new DateTime("2008-11-16 00:00:00")); + + // You can iterate over them + $nextRun = $cron->getNextRunDate($cron->getNextRunDate("2008-11-09 00:00:00", 1, true), 1, true); + $this->assertEquals($nextRun, new DateTime("2008-11-23 00:00:00")); + + // You can skip more than one + $nextRun = $cron->getNextRunDate("2008-11-09 00:00:00", 2, true); + $this->assertEquals($nextRun, new DateTime("2008-11-23 00:00:00")); + $nextRun = $cron->getNextRunDate("2008-11-09 00:00:00", 3, true); + $this->assertEquals($nextRun, new DateTime("2008-11-30 00:00:00")); + } + + /** + * @covers \Cron\CronExpression::getRunDate + */ + public function testGetRunDateHandlesDifferentDates() + { + $cron = CronExpression::factory('@weekly'); + $date = new DateTime("2019-03-10 00:00:00"); + $this->assertEquals($date, $cron->getNextRunDate("2019-03-03 08:00:00")); + $this->assertEquals($date, $cron->getNextRunDate(new DateTime("2019-03-03 08:00:00"))); + $this->assertEquals($date, $cron->getNextRunDate(new DateTimeImmutable("2019-03-03 08:00:00"))); + } + + /** + * @covers \Cron\CronExpression::getRunDate + */ + public function testSkipsCurrentDateByDefault() + { + $cron = CronExpression::factory('* * * * *'); + $current = new DateTime('now'); + $next = $cron->getNextRunDate($current); + $nextPrev = $cron->getPreviousRunDate($next); + $this->assertSame($current->format('Y-m-d H:i:00'), $nextPrev->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\CronExpression::getRunDate + * @ticket 7 + */ + public function testStripsForSeconds() + { + $cron = CronExpression::factory('* * * * *'); + $current = new DateTime('2011-09-27 10:10:54'); + $this->assertSame('2011-09-27 10:11:00', $cron->getNextRunDate($current)->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\CronExpression::getRunDate + */ + public function testFixesPhpBugInDateIntervalMonth() + { + $cron = CronExpression::factory('0 0 27 JAN *'); + $this->assertSame('2011-01-27 00:00:00', $cron->getPreviousRunDate('2011-08-22 00:00:00')->format('Y-m-d H:i:s')); + } + + public function testIssue29() + { + $cron = CronExpression::factory('@weekly'); + $this->assertSame( + '2013-03-10 00:00:00', + $cron->getPreviousRunDate('2013-03-17 00:00:00')->format('Y-m-d H:i:s') + ); + } + + /** + * @see https://github.com/mtdowling/cron-expression/issues/20 + */ + public function testIssue20() { + $e = CronExpression::factory('* * * * MON#1'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-14 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-21 00:00:00'))); + + $e = CronExpression::factory('* * * * SAT#2'); + $this->assertFalse($e->isDue(new DateTime('2014-04-05 00:00:00'))); + $this->assertTrue($e->isDue(new DateTime('2014-04-12 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-19 00:00:00'))); + + $e = CronExpression::factory('* * * * SUN#3'); + $this->assertFalse($e->isDue(new DateTime('2014-04-13 00:00:00'))); + $this->assertTrue($e->isDue(new DateTime('2014-04-20 00:00:00'))); + $this->assertFalse($e->isDue(new DateTime('2014-04-27 00:00:00'))); + } + + /** + * @covers \Cron\CronExpression::getRunDate + */ + public function testKeepOriginalTime() + { + $now = new \DateTime; + $strNow = $now->format(DateTime::ISO8601); + $cron = CronExpression::factory('0 0 * * *'); + $cron->getPreviousRunDate($now); + $this->assertSame($strNow, $now->format(DateTime::ISO8601)); + } + + /** + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::factory + * @covers \Cron\CronExpression::isValidExpression + * @covers \Cron\CronExpression::setExpression + * @covers \Cron\CronExpression::setPart + */ + public function testValidationWorks() + { + // Invalid. Only four values + $this->assertFalse(CronExpression::isValidExpression('* * * 1')); + // Valid + $this->assertTrue(CronExpression::isValidExpression('* * * * 1')); + + // Issue #156, 13 is an invalid month + $this->assertFalse(CronExpression::isValidExpression("* * * 13 * ")); + + // Issue #155, 90 is an invalid second + $this->assertFalse(CronExpression::isValidExpression('90 * * * *')); + + // Issue #154, 24 is an invalid hour + $this->assertFalse(CronExpression::isValidExpression("0 24 1 12 0")); + + // Issue #125, this is just all sorts of wrong + $this->assertFalse(CronExpression::isValidExpression('990 14 * * mon-fri0345345')); + + // see https://github.com/dragonmantank/cron-expression/issues/5 + $this->assertTrue(CronExpression::isValidExpression('2,17,35,47 5-7,11-13 * * *')); + } + + /** + * Makes sure that 00 is considered a valid value for 0-based fields + * cronie allows numbers with a leading 0, so adding support for this as well + * + * @see https://github.com/dragonmantank/cron-expression/issues/12 + */ + public function testDoubleZeroIsValid() + { + $this->assertTrue(CronExpression::isValidExpression('00 * * * *')); + $this->assertTrue(CronExpression::isValidExpression('01 * * * *')); + $this->assertTrue(CronExpression::isValidExpression('* 00 * * *')); + $this->assertTrue(CronExpression::isValidExpression('* 01 * * *')); + + $e = CronExpression::factory('00 * * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + $e = CronExpression::factory('01 * * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:01:00'))); + + $e = CronExpression::factory('* 00 * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + $e = CronExpression::factory('* 01 * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 01:00:00'))); + } + + + /** + * Ranges with large steps should "wrap around" to the appropriate value + * cronie allows for steps that are larger than the range of a field, with it wrapping around like a ring buffer. We + * should do the same. + * + * @see https://github.com/dragonmantank/cron-expression/issues/6 + */ + public function testRangesWrapAroundWithLargeSteps() + { + $f = new MonthField(); + $this->assertTrue($f->validate('*/123')); + $this->assertSame([4], $f->getRangeForExpression('*/123', 12)); + + $e = CronExpression::factory('* * * */123 *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + + $nextRunDate = $e->getNextRunDate(new DateTime('2014-04-07 00:00:00')); + $this->assertSame('2014-04-07 00:01:00', $nextRunDate->format('Y-m-d H:i:s')); + + $nextRunDate = $e->getNextRunDate(new DateTime('2014-05-07 00:00:00')); + $this->assertSame('2015-04-01 00:00:00', $nextRunDate->format('Y-m-d H:i:s')); + } + + /** + * When there is an issue with a field, we should report the human readable position + * + * @see https://github.com/dragonmantank/cron-expression/issues/29 + */ + public function testFieldPositionIsHumanAdjusted() + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage("6 is not a valid position"); + $e = CronExpression::factory('0 * * * * ? *'); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php new file mode 100644 index 0000000..2191b6b --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php @@ -0,0 +1,77 @@ + + */ +class DayOfMonthFieldTest extends TestCase +{ + /** + * @covers \Cron\DayOfMonthField::validate + */ + public function testValidatesField() + { + $f = new DayOfMonthField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertTrue($f->validate('L')); + $this->assertTrue($f->validate('5W')); + $this->assertTrue($f->validate('01')); + $this->assertFalse($f->validate('5W,L')); + $this->assertFalse($f->validate('1.')); + } + + /** + * @covers \Cron\DayOfMonthField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new DayOfMonthField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + $this->assertTrue($f->isSatisfiedBy(new DateTimeImmutable(), '?')); + } + + /** + * @covers \Cron\DayOfMonthField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new DayOfMonthField(); + $f->increment($d); + $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertSame('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\DayOfMonthField::increment + */ + public function testIncrementsDateTimeImmutable() + { + $d = new DateTimeImmutable('2011-03-15 11:15:00'); + $f = new DayOfMonthField(); + $f->increment($d); + $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + } + + /** + * Day of the month cannot accept a 0 value, it must be between 1 and 31 + * See Github issue #120 + * + * @since 2017-01-22 + */ + public function testDoesNotAccept0Date() + { + $f = new DayOfMonthField(); + $this->assertFalse($f->validate(0)); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php new file mode 100644 index 0000000..ef89b47 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php @@ -0,0 +1,154 @@ + + */ +class DayOfWeekFieldTest extends TestCase +{ + /** + * @covers \Cron\DayOfWeekField::validate + */ + public function testValidatesField() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('01')); + $this->assertTrue($f->validate('00')); + $this->assertTrue($f->validate('*')); + $this->assertFalse($f->validate('*/3,1,1-12')); + $this->assertTrue($f->validate('SUN-2')); + $this->assertFalse($f->validate('1.')); + } + + /** + * @covers \Cron\DayOfWeekField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + $this->assertTrue($f->isSatisfiedBy(new DateTimeImmutable(), '?')); + } + + /** + * @covers \Cron\DayOfWeekField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new DayOfWeekField(); + $f->increment($d); + $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertSame('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\DayOfWeekField::increment + */ + public function testIncrementsDateTimeImmutable() + { + $d = new DateTimeImmutable('2011-03-15 11:15:00'); + $f = new DayOfWeekField(); + $f->increment($d); + $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\DayOfWeekField::isSatisfiedBy + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Weekday must be a value between 0 and 7. 12 given + */ + public function testValidatesHashValueWeekday() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '12#1')); + } + + /** + * @covers \Cron\DayOfWeekField::isSatisfiedBy + * @expectedException InvalidArgumentException + * @expectedExceptionMessage There are never more than 5 or less than 1 of a given weekday in a month + */ + public function testValidatesHashValueNth() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '3#6')); + } + + /** + * @covers \Cron\DayOfWeekField::validate + */ + public function testValidateWeekendHash() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->validate('MON#1')); + $this->assertTrue($f->validate('TUE#2')); + $this->assertTrue($f->validate('WED#3')); + $this->assertTrue($f->validate('THU#4')); + $this->assertTrue($f->validate('FRI#5')); + $this->assertTrue($f->validate('SAT#1')); + $this->assertTrue($f->validate('SUN#3')); + $this->assertTrue($f->validate('MON#1,MON#3')); + } + + /** + * @covers \Cron\DayOfWeekField::isSatisfiedBy + */ + public function testHandlesZeroAndSevenDayOfTheWeekValues() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2011-09-04 00:00:00'), '0-2')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2011-09-04 00:00:00'), '6-0')); + + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), 'SUN')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), 'SUN#3')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), '0#3')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2014-04-20 00:00:00'), '7#3')); + } + + /** + * @covers \Cron\DayOfWeekField::isSatisfiedBy + */ + public function testHandlesLastWeekdayOfTheMonth() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2018-12-28 00:00:00'), 'FRIL')); + $this->assertTrue($f->isSatisfiedBy(new DateTime('2018-12-28 00:00:00'), '5L')); + $this->assertFalse($f->isSatisfiedBy(new DateTime('2018-12-21 00:00:00'), 'FRIL')); + $this->assertFalse($f->isSatisfiedBy(new DateTime('2018-12-21 00:00:00'), '5L')); + } + + /** + * @see https://github.com/mtdowling/cron-expression/issues/47 + */ + public function testIssue47() { + $f = new DayOfWeekField(); + $this->assertFalse($f->validate('mon,')); + $this->assertFalse($f->validate('mon-')); + $this->assertFalse($f->validate('*/2,')); + $this->assertFalse($f->validate('-mon')); + $this->assertFalse($f->validate(',1')); + $this->assertFalse($f->validate('*-')); + $this->assertFalse($f->validate(',-')); + } + + /** + * @see https://github.com/laravel/framework/commit/07d160ac3cc9764d5b429734ffce4fa311385403 + */ + public function testLiteralsExpandProperly() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->validate('MON-FRI')); + $this->assertSame([1,2,3,4,5], $f->getRangeForExpression('MON-FRI', 7)); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php new file mode 100644 index 0000000..a6e66b0 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php @@ -0,0 +1,42 @@ + + */ +class FieldFactoryTest extends TestCase +{ + /** + * @covers \Cron\FieldFactory::getField + */ + public function testRetrievesFieldInstances() + { + $mappings = array( + 0 => 'Cron\MinutesField', + 1 => 'Cron\HoursField', + 2 => 'Cron\DayOfMonthField', + 3 => 'Cron\MonthField', + 4 => 'Cron\DayOfWeekField', + ); + + $f = new FieldFactory(); + + foreach ($mappings as $position => $class) { + $this->assertSame($class, get_class($f->getField($position))); + } + } + + /** + * @covers \Cron\FieldFactory::getField + * @expectedException InvalidArgumentException + */ + public function testValidatesFieldPosition() + { + $f = new FieldFactory(); + $f->getField(-1); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php new file mode 100644 index 0000000..1849f28 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php @@ -0,0 +1,99 @@ + + */ +class HoursFieldTest extends TestCase +{ + /** + * @covers \Cron\HoursField::validate + */ + public function testValidatesField() + { + $f = new HoursField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('00')); + $this->assertTrue($f->validate('01')); + $this->assertTrue($f->validate('*')); + $this->assertFalse($f->validate('*/3,1,1-12')); + } + + /** + * @covers \Cron\HoursField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new HoursField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + $this->assertTrue($f->isSatisfiedBy(new DateTimeImmutable(), '?')); + } + + /** + * @covers \Cron\HoursField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + + $d->setTime(11, 15, 0); + $f->increment($d, true); + $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\HoursField::increment + */ + public function testIncrementsDateTimeImmutable() + { + $d = new DateTimeImmutable('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\HoursField::increment + */ + public function testIncrementsDateWithThirtyMinuteOffsetTimezone() + { + $tz = date_default_timezone_get(); + date_default_timezone_set('America/St_Johns'); + $d = new DateTime('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + + $d->setTime(11, 15, 0); + $f->increment($d, true); + $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + date_default_timezone_set($tz); + } + + /** + * @covers \Cron\HoursField::increment + */ + public function testIncrementDateWithFifteenMinuteOffsetTimezone() + { + $tz = date_default_timezone_get(); + date_default_timezone_set('Asia/Kathmandu'); + $d = new DateTime('2011-03-15 11:15:00'); + $f = new HoursField(); + $f->increment($d); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + + $d->setTime(11, 15, 0); + $f->increment($d, true); + $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + date_default_timezone_set($tz); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php new file mode 100644 index 0000000..41a536d --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php @@ -0,0 +1,73 @@ + + */ +class MinutesFieldTest extends TestCase +{ + /** + * @covers \Cron\MinutesField::validate + */ + public function testValidatesField() + { + $f = new MinutesField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertFalse($f->validate('*/3,1,1-12')); + } + + /** + * @covers \Cron\MinutesField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new MinutesField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + $this->assertTrue($f->isSatisfiedBy(new DateTimeImmutable(), '?')); + } + + /** + * @covers \Cron\MinutesField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new MinutesField(); + $f->increment($d); + $this->assertSame('2011-03-15 11:16:00', $d->format('Y-m-d H:i:s')); + $f->increment($d, true); + $this->assertSame('2011-03-15 11:15:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\MinutesField::increment + */ + public function testIncrementsDateTimeImmutable() + { + $d = new DateTimeImmutable('2011-03-15 11:15:00'); + $f = new MinutesField(); + $f->increment($d); + $this->assertSame('2011-03-15 11:16:00', $d->format('Y-m-d H:i:s')); + } + + /** + * Various bad syntaxes that are reported to work, but shouldn't. + * + * @author Chris Tankersley + * @since 2017-08-18 + */ + public function testBadSyntaxesShouldNotValidate() + { + $f = new MinutesField(); + $this->assertFalse($f->validate('*-1')); + $this->assertFalse($f->validate('1-2-3')); + $this->assertFalse($f->validate('-1')); + } +} diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php new file mode 100644 index 0000000..f329f4c --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php @@ -0,0 +1,103 @@ + + */ +class MonthFieldTest extends TestCase +{ + /** + * @covers \Cron\MonthField::validate + */ + public function testValidatesField() + { + $f = new MonthField(); + $this->assertTrue($f->validate('12')); + $this->assertTrue($f->validate('*')); + $this->assertFalse($f->validate('*/10,2,1-12')); + $this->assertFalse($f->validate('1.fix-regexp')); + } + + /** + * @covers \Cron\MonthField::isSatisfiedBy + */ + public function testChecksIfSatisfied() + { + $f = new MonthField(); + $this->assertTrue($f->isSatisfiedBy(new DateTime(), '?')); + $this->assertTrue($f->isSatisfiedBy(new DateTimeImmutable(), '?')); + } + + /** + * @covers \Cron\MonthField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new MonthField(); + $f->increment($d); + $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertSame('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\MonthField::increment + */ + public function testIncrementsDateTimeImmutable() + { + $d = new DateTimeImmutable('2011-03-15 11:15:00'); + $f = new MonthField(); + $f->increment($d); + $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\MonthField::increment + */ + public function testIncrementsDateWithThirtyMinuteTimezone() + { + $tz = date_default_timezone_get(); + date_default_timezone_set('America/St_Johns'); + $d = new DateTime('2011-03-31 11:59:59'); + $f = new MonthField(); + $f->increment($d); + $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + + $d = new DateTime('2011-03-15 11:15:00'); + $f->increment($d, true); + $this->assertSame('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); + date_default_timezone_set($tz); + } + + + /** + * @covers \Cron\MonthField::increment + */ + public function testIncrementsYearAsNeeded() + { + $f = new MonthField(); + $d = new DateTime('2011-12-15 00:00:00'); + $f->increment($d); + $this->assertSame('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s')); + } + + /** + * @covers \Cron\MonthField::increment + */ + public function testDecrementsYearAsNeeded() + { + $f = new MonthField(); + $d = new DateTime('2011-01-15 00:00:00'); + $f->increment($d, true); + $this->assertSame('2010-12-31 23:59:00', $d->format('Y-m-d H:i:s')); + } +} diff --git a/vendor/egulias/email-validator/LICENSE b/vendor/egulias/email-validator/LICENSE new file mode 100644 index 0000000..c34d2c1 --- /dev/null +++ b/vendor/egulias/email-validator/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2016 Eduardo Gulias Davis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/egulias/email-validator/composer.json b/vendor/egulias/email-validator/composer.json new file mode 100644 index 0000000..a275696 --- /dev/null +++ b/vendor/egulias/email-validator/composer.json @@ -0,0 +1,38 @@ +{ + "name": "egulias/email-validator", + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": ["email", "validation", "validator", "emailvalidation", "emailvalidator"], + "license": "MIT", + "authors": [ + {"name": "Eduardo Gulias Davis"} + ], + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "require": { + "php": ">=5.5", + "doctrine/lexer": "^1.0.1", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Egulias\\EmailValidator\\Tests\\": "tests" + } + } +} diff --git a/vendor/egulias/email-validator/src/EmailLexer.php b/vendor/egulias/email-validator/src/EmailLexer.php new file mode 100644 index 0000000..cb47c01 --- /dev/null +++ b/vendor/egulias/email-validator/src/EmailLexer.php @@ -0,0 +1,279 @@ + self::S_OPENPARENTHESIS, + ')' => self::S_CLOSEPARENTHESIS, + '<' => self::S_LOWERTHAN, + '>' => self::S_GREATERTHAN, + '[' => self::S_OPENBRACKET, + ']' => self::S_CLOSEBRACKET, + ':' => self::S_COLON, + ';' => self::S_SEMICOLON, + '@' => self::S_AT, + '\\' => self::S_BACKSLASH, + '/' => self::S_SLASH, + ',' => self::S_COMMA, + '.' => self::S_DOT, + '"' => self::S_DQUOTE, + '-' => self::S_HYPHEN, + '::' => self::S_DOUBLECOLON, + ' ' => self::S_SP, + "\t" => self::S_HTAB, + "\r" => self::S_CR, + "\n" => self::S_LF, + "\r\n" => self::CRLF, + 'IPv6' => self::S_IPV6TAG, + '{' => self::S_OPENQBRACKET, + '}' => self::S_CLOSEQBRACKET, + '' => self::S_EMPTY, + '\0' => self::C_NUL, + ); + + /** + * @var bool + */ + protected $hasInvalidTokens = false; + + /** + * @var array + * + * @psalm-var array{value:string, type:null|int, position:int}|array + */ + protected $previous = []; + + /** + * The last matched/seen token. + * + * @var array + * + * @psalm-var array{value:string, type:null|int, position:int} + */ + public $token; + + /** + * The next token in the input. + * + * @var array|null + */ + public $lookahead; + + /** + * @psalm-var array{value:'', type:null, position:0} + */ + private static $nullToken = [ + 'value' => '', + 'type' => null, + 'position' => 0, + ]; + + public function __construct() + { + $this->previous = $this->token = self::$nullToken; + $this->lookahead = null; + } + + /** + * @return void + */ + public function reset() + { + $this->hasInvalidTokens = false; + parent::reset(); + $this->previous = $this->token = self::$nullToken; + } + + /** + * @return bool + */ + public function hasInvalidTokens() + { + return $this->hasInvalidTokens; + } + + /** + * @param int $type + * @throws \UnexpectedValueException + * @return boolean + * + * @psalm-suppress InvalidScalarArgument + */ + public function find($type) + { + $search = clone $this; + $search->skipUntil($type); + + if (!$search->lookahead) { + throw new \UnexpectedValueException($type . ' not found'); + } + return true; + } + + /** + * getPrevious + * + * @return array + */ + public function getPrevious() + { + return $this->previous; + } + + /** + * moveNext + * + * @return boolean + */ + public function moveNext() + { + $this->previous = $this->token; + $hasNext = parent::moveNext(); + $this->token = $this->token ?: self::$nullToken; + + return $hasNext; + } + + /** + * Lexical catchable patterns. + * + * @return string[] + */ + protected function getCatchablePatterns() + { + return array( + '[a-zA-Z_]+[46]?', //ASCII and domain literal + '[^\x00-\x7F]', //UTF-8 + '[0-9]+', + '\r\n', + '::', + '\s+?', + '.', + ); + } + + /** + * Lexical non-catchable patterns. + * + * @return string[] + */ + protected function getNonCatchablePatterns() + { + return array('[\xA0-\xff]+'); + } + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @throws \InvalidArgumentException + * @return integer + */ + protected function getType(&$value) + { + if ($this->isNullType($value)) { + return self::C_NUL; + } + + if ($this->isValid($value)) { + return $this->charValue[$value]; + } + + if ($this->isUTF8Invalid($value)) { + $this->hasInvalidTokens = true; + return self::INVALID; + } + + return self::GENERIC; + } + + /** + * @param string $value + * + * @return bool + */ + protected function isValid($value) + { + if (isset($this->charValue[$value])) { + return true; + } + + return false; + } + + /** + * @param string $value + * @return bool + */ + protected function isNullType($value) + { + if ($value === "\0") { + return true; + } + + return false; + } + + /** + * @param string $value + * @return bool + */ + protected function isUTF8Invalid($value) + { + if (preg_match('/\p{Cc}+/u', $value)) { + return true; + } + + return false; + } + + /** + * @return string + */ + protected function getModifiers() + { + return 'iu'; + } +} diff --git a/vendor/egulias/email-validator/src/EmailParser.php b/vendor/egulias/email-validator/src/EmailParser.php new file mode 100644 index 0000000..6b7bad6 --- /dev/null +++ b/vendor/egulias/email-validator/src/EmailParser.php @@ -0,0 +1,137 @@ + + */ +class EmailParser +{ + const EMAIL_MAX_LENGTH = 254; + + /** + * @var array + */ + protected $warnings = []; + + /** + * @var string + */ + protected $domainPart = ''; + + /** + * @var string + */ + protected $localPart = ''; + /** + * @var EmailLexer + */ + protected $lexer; + + /** + * @var LocalPart + */ + protected $localPartParser; + + /** + * @var DomainPart + */ + protected $domainPartParser; + + public function __construct(EmailLexer $lexer) + { + $this->lexer = $lexer; + $this->localPartParser = new LocalPart($this->lexer); + $this->domainPartParser = new DomainPart($this->lexer); + } + + /** + * @param string $str + * @return array + */ + public function parse($str) + { + $this->lexer->setInput($str); + + if (!$this->hasAtToken()) { + throw new NoLocalPart(); + } + + + $this->localPartParser->parse($str); + $this->domainPartParser->parse($str); + + $this->setParts($str); + + if ($this->lexer->hasInvalidTokens()) { + throw new ExpectingATEXT(); + } + + return array('local' => $this->localPart, 'domain' => $this->domainPart); + } + + /** + * @return Warning\Warning[] + */ + public function getWarnings() + { + $localPartWarnings = $this->localPartParser->getWarnings(); + $domainPartWarnings = $this->domainPartParser->getWarnings(); + $this->warnings = array_merge($localPartWarnings, $domainPartWarnings); + + $this->addLongEmailWarning($this->localPart, $this->domainPart); + + return $this->warnings; + } + + /** + * @return string + */ + public function getParsedDomainPart() + { + return $this->domainPart; + } + + /** + * @param string $email + */ + protected function setParts($email) + { + $parts = explode('@', $email); + $this->domainPart = $this->domainPartParser->getDomainPart(); + $this->localPart = $parts[0]; + } + + /** + * @return bool + */ + protected function hasAtToken() + { + $this->lexer->moveNext(); + $this->lexer->moveNext(); + if ($this->lexer->token['type'] === EmailLexer::S_AT) { + return false; + } + + return true; + } + + /** + * @param string $localPart + * @param string $parsedDomainPart + */ + protected function addLongEmailWarning($localPart, $parsedDomainPart) + { + if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) { + $this->warnings[EmailTooLong::CODE] = new EmailTooLong(); + } + } +} diff --git a/vendor/egulias/email-validator/src/EmailValidator.php b/vendor/egulias/email-validator/src/EmailValidator.php new file mode 100644 index 0000000..a30f21d --- /dev/null +++ b/vendor/egulias/email-validator/src/EmailValidator.php @@ -0,0 +1,67 @@ +lexer = new EmailLexer(); + } + + /** + * @param string $email + * @param EmailValidation $emailValidation + * @return bool + */ + public function isValid($email, EmailValidation $emailValidation) + { + $isValid = $emailValidation->isValid($email, $this->lexer); + $this->warnings = $emailValidation->getWarnings(); + $this->error = $emailValidation->getError(); + + return $isValid; + } + + /** + * @return boolean + */ + public function hasWarnings() + { + return !empty($this->warnings); + } + + /** + * @return array + */ + public function getWarnings() + { + return $this->warnings; + } + + /** + * @return InvalidEmail|null + */ + public function getError() + { + return $this->error; + } +} diff --git a/vendor/egulias/email-validator/src/Exception/AtextAfterCFWS.php b/vendor/egulias/email-validator/src/Exception/AtextAfterCFWS.php new file mode 100644 index 0000000..97f41a2 --- /dev/null +++ b/vendor/egulias/email-validator/src/Exception/AtextAfterCFWS.php @@ -0,0 +1,9 @@ +lexer->moveNext(); + + $this->performDomainStartChecks(); + + $domain = $this->doParseDomainPart(); + + $prev = $this->lexer->getPrevious(); + $length = strlen($domain); + + if ($prev['type'] === EmailLexer::S_DOT) { + throw new DotAtEnd(); + } + if ($prev['type'] === EmailLexer::S_HYPHEN) { + throw new DomainHyphened(); + } + if ($length > self::DOMAIN_MAX_LENGTH) { + $this->warnings[DomainTooLong::CODE] = new DomainTooLong(); + } + if ($prev['type'] === EmailLexer::S_CR) { + throw new CRLFAtTheEnd(); + } + $this->domainPart = $domain; + } + + private function performDomainStartChecks() + { + $this->checkInvalidTokensAfterAT(); + $this->checkEmptyDomain(); + + if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { + $this->warnings[DeprecatedComment::CODE] = new DeprecatedComment(); + $this->parseDomainComments(); + } + } + + private function checkEmptyDomain() + { + $thereIsNoDomain = $this->lexer->token['type'] === EmailLexer::S_EMPTY || + ($this->lexer->token['type'] === EmailLexer::S_SP && + !$this->lexer->isNextToken(EmailLexer::GENERIC)); + + if ($thereIsNoDomain) { + throw new NoDomainPart(); + } + } + + private function checkInvalidTokensAfterAT() + { + if ($this->lexer->token['type'] === EmailLexer::S_DOT) { + throw new DotAtStart(); + } + if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN) { + throw new DomainHyphened(); + } + } + + /** + * @return string + */ + public function getDomainPart() + { + return $this->domainPart; + } + + /** + * @param string $addressLiteral + * @param int $maxGroups + */ + public function checkIPV6Tag($addressLiteral, $maxGroups = 8) + { + $prev = $this->lexer->getPrevious(); + if ($prev['type'] === EmailLexer::S_COLON) { + $this->warnings[IPV6ColonEnd::CODE] = new IPV6ColonEnd(); + } + + $IPv6 = substr($addressLiteral, 5); + //Daniel Marschall's new IPv6 testing strategy + $matchesIP = explode(':', $IPv6); + $groupCount = count($matchesIP); + $colons = strpos($IPv6, '::'); + + if (count(preg_grep('/^[0-9A-Fa-f]{0,4}$/', $matchesIP, PREG_GREP_INVERT)) !== 0) { + $this->warnings[IPV6BadChar::CODE] = new IPV6BadChar(); + } + + if ($colons === false) { + // We need exactly the right number of groups + if ($groupCount !== $maxGroups) { + $this->warnings[IPV6GroupCount::CODE] = new IPV6GroupCount(); + } + return; + } + + if ($colons !== strrpos($IPv6, '::')) { + $this->warnings[IPV6DoubleColon::CODE] = new IPV6DoubleColon(); + return; + } + + if ($colons === 0 || $colons === (strlen($IPv6) - 2)) { + // RFC 4291 allows :: at the start or end of an address + //with 7 other groups in addition + ++$maxGroups; + } + + if ($groupCount > $maxGroups) { + $this->warnings[IPV6MaxGroups::CODE] = new IPV6MaxGroups(); + } elseif ($groupCount === $maxGroups) { + $this->warnings[IPV6Deprecated::CODE] = new IPV6Deprecated(); + } + } + + /** + * @return string + */ + protected function doParseDomainPart() + { + $domain = ''; + $openedParenthesis = 0; + do { + $prev = $this->lexer->getPrevious(); + + $this->checkNotAllowedChars($this->lexer->token); + + if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { + $this->parseComments(); + $openedParenthesis += $this->getOpenedParenthesis(); + $this->lexer->moveNext(); + $tmpPrev = $this->lexer->getPrevious(); + if ($tmpPrev['type'] === EmailLexer::S_CLOSEPARENTHESIS) { + $openedParenthesis--; + } + } + if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) { + if ($openedParenthesis === 0) { + throw new UnopenedComment(); + } else { + $openedParenthesis--; + } + } + + $this->checkConsecutiveDots(); + $this->checkDomainPartExceptions($prev); + + if ($this->hasBrackets()) { + $this->parseDomainLiteral(); + } + + $this->checkLabelLength($prev); + + if ($this->isFWS()) { + $this->parseFWS(); + } + + $domain .= $this->lexer->token['value']; + $this->lexer->moveNext(); + } while (null !== $this->lexer->token['type']); + + return $domain; + } + + private function checkNotAllowedChars(array $token) + { + $notAllowed = [EmailLexer::S_BACKSLASH => true, EmailLexer::S_SLASH=> true]; + if (isset($notAllowed[$token['type']])) { + throw new CharNotAllowed(); + } + } + + /** + * @return string|false + */ + protected function parseDomainLiteral() + { + if ($this->lexer->isNextToken(EmailLexer::S_COLON)) { + $this->warnings[IPV6ColonStart::CODE] = new IPV6ColonStart(); + } + if ($this->lexer->isNextToken(EmailLexer::S_IPV6TAG)) { + $lexer = clone $this->lexer; + $lexer->moveNext(); + if ($lexer->isNextToken(EmailLexer::S_DOUBLECOLON)) { + $this->warnings[IPV6ColonStart::CODE] = new IPV6ColonStart(); + } + } + + return $this->doParseDomainLiteral(); + } + + /** + * @return string|false + */ + protected function doParseDomainLiteral() + { + $IPv6TAG = false; + $addressLiteral = ''; + do { + if ($this->lexer->token['type'] === EmailLexer::C_NUL) { + throw new ExpectingDTEXT(); + } + + if ($this->lexer->token['type'] === EmailLexer::INVALID || + $this->lexer->token['type'] === EmailLexer::C_DEL || + $this->lexer->token['type'] === EmailLexer::S_LF + ) { + $this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT(); + } + + if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENQBRACKET, EmailLexer::S_OPENBRACKET))) { + throw new ExpectingDTEXT(); + } + + if ($this->lexer->isNextTokenAny( + array(EmailLexer::S_HTAB, EmailLexer::S_SP, $this->lexer->token['type'] === EmailLexer::CRLF) + )) { + $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); + $this->parseFWS(); + } + + if ($this->lexer->isNextToken(EmailLexer::S_CR)) { + throw new CRNoLF(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH) { + $this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT(); + $addressLiteral .= $this->lexer->token['value']; + $this->lexer->moveNext(); + $this->validateQuotedPair(); + } + if ($this->lexer->token['type'] === EmailLexer::S_IPV6TAG) { + $IPv6TAG = true; + } + if ($this->lexer->token['type'] === EmailLexer::S_CLOSEQBRACKET) { + break; + } + + $addressLiteral .= $this->lexer->token['value']; + + } while ($this->lexer->moveNext()); + + $addressLiteral = str_replace('[', '', $addressLiteral); + $addressLiteral = $this->checkIPV4Tag($addressLiteral); + + if (false === $addressLiteral) { + return $addressLiteral; + } + + if (!$IPv6TAG) { + $this->warnings[DomainLiteral::CODE] = new DomainLiteral(); + return $addressLiteral; + } + + $this->warnings[AddressLiteral::CODE] = new AddressLiteral(); + + $this->checkIPV6Tag($addressLiteral); + + return $addressLiteral; + } + + /** + * @param string $addressLiteral + * + * @return string|false + */ + protected function checkIPV4Tag($addressLiteral) + { + $matchesIP = array(); + + // Extract IPv4 part from the end of the address-literal (if there is one) + if (preg_match( + '/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', + $addressLiteral, + $matchesIP + ) > 0 + ) { + $index = strrpos($addressLiteral, $matchesIP[0]); + if ($index === 0) { + $this->warnings[AddressLiteral::CODE] = new AddressLiteral(); + return false; + } + // Convert IPv4 part to IPv6 format for further testing + $addressLiteral = substr($addressLiteral, 0, (int) $index) . '0:0'; + } + + return $addressLiteral; + } + + protected function checkDomainPartExceptions(array $prev) + { + $invalidDomainTokens = array( + EmailLexer::S_DQUOTE => true, + EmailLexer::S_SEMICOLON => true, + EmailLexer::S_GREATERTHAN => true, + EmailLexer::S_LOWERTHAN => true, + ); + + if (isset($invalidDomainTokens[$this->lexer->token['type']])) { + throw new ExpectingATEXT(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_COMMA) { + throw new CommaInDomain(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_AT) { + throw new ConsecutiveAt(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) { + throw new ExpectingATEXT(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + throw new DomainHyphened(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH + && $this->lexer->isNextToken(EmailLexer::GENERIC)) { + throw new ExpectingATEXT(); + } + } + + /** + * @return bool + */ + protected function hasBrackets() + { + if ($this->lexer->token['type'] !== EmailLexer::S_OPENBRACKET) { + return false; + } + + try { + $this->lexer->find(EmailLexer::S_CLOSEBRACKET); + } catch (\RuntimeException $e) { + throw new ExpectingDomainLiteralClose(); + } + + return true; + } + + protected function checkLabelLength(array $prev) + { + if ($this->lexer->token['type'] === EmailLexer::S_DOT && + $prev['type'] === EmailLexer::GENERIC && + strlen($prev['value']) > 63 + ) { + $this->warnings[LabelTooLong::CODE] = new LabelTooLong(); + } + } + + protected function parseDomainComments() + { + $this->isUnclosedComment(); + while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) { + $this->warnEscaping(); + $this->lexer->moveNext(); + } + + $this->lexer->moveNext(); + if ($this->lexer->isNextToken(EmailLexer::S_DOT)) { + throw new ExpectingATEXT(); + } + } + + protected function addTLDWarnings() + { + if ($this->warnings[DomainLiteral::CODE]) { + $this->warnings[TLD::CODE] = new TLD(); + } + } +} diff --git a/vendor/egulias/email-validator/src/Parser/LocalPart.php b/vendor/egulias/email-validator/src/Parser/LocalPart.php new file mode 100644 index 0000000..3c21f34 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/LocalPart.php @@ -0,0 +1,145 @@ +lexer->token['type'] !== EmailLexer::S_AT && null !== $this->lexer->token['type']) { + if ($this->lexer->token['type'] === EmailLexer::S_DOT && null === $this->lexer->getPrevious()['type']) { + throw new DotAtStart(); + } + + $closingQuote = $this->checkDQUOTE($closingQuote); + if ($closingQuote && $parseDQuote) { + $parseDQuote = $this->parseDoubleQuote(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) { + $this->parseComments(); + $openedParenthesis += $this->getOpenedParenthesis(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) { + if ($openedParenthesis === 0) { + throw new UnopenedComment(); + } + + $openedParenthesis--; + } + + $this->checkConsecutiveDots(); + + if ($this->lexer->token['type'] === EmailLexer::S_DOT && + $this->lexer->isNextToken(EmailLexer::S_AT) + ) { + throw new DotAtEnd(); + } + + $this->warnEscaping(); + $this->isInvalidToken($this->lexer->token, $closingQuote); + + if ($this->isFWS()) { + $this->parseFWS(); + } + + $totalLength += strlen($this->lexer->token['value']); + $this->lexer->moveNext(); + } + + if ($totalLength > LocalTooLong::LOCAL_PART_LENGTH) { + $this->warnings[LocalTooLong::CODE] = new LocalTooLong(); + } + } + + /** + * @return bool + */ + protected function parseDoubleQuote() + { + $parseAgain = true; + $special = array( + EmailLexer::S_CR => true, + EmailLexer::S_HTAB => true, + EmailLexer::S_LF => true + ); + + $invalid = array( + EmailLexer::C_NUL => true, + EmailLexer::S_HTAB => true, + EmailLexer::S_CR => true, + EmailLexer::S_LF => true + ); + $setSpecialsWarning = true; + + $this->lexer->moveNext(); + + while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && null !== $this->lexer->token['type']) { + $parseAgain = false; + if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) { + $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); + $setSpecialsWarning = false; + } + if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) { + $this->lexer->moveNext(); + } + + $this->lexer->moveNext(); + + if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) { + throw new ExpectingATEXT(); + } + } + + $prev = $this->lexer->getPrevious(); + + if ($prev['type'] === EmailLexer::S_BACKSLASH) { + if (!$this->checkDQUOTE(false)) { + throw new UnclosedQuotedString(); + } + } + + if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) { + throw new ExpectingAT(); + } + + return $parseAgain; + } + + /** + * @param bool $closingQuote + */ + protected function isInvalidToken(array $token, $closingQuote) + { + $forbidden = array( + EmailLexer::S_COMMA, + EmailLexer::S_CLOSEBRACKET, + EmailLexer::S_OPENBRACKET, + EmailLexer::S_GREATERTHAN, + EmailLexer::S_LOWERTHAN, + EmailLexer::S_COLON, + EmailLexer::S_SEMICOLON, + EmailLexer::INVALID + ); + + if (in_array($token['type'], $forbidden) && !$closingQuote) { + throw new ExpectingATEXT(); + } + } +} diff --git a/vendor/egulias/email-validator/src/Parser/Parser.php b/vendor/egulias/email-validator/src/Parser/Parser.php new file mode 100644 index 0000000..ccdc938 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/Parser.php @@ -0,0 +1,249 @@ +lexer = $lexer; + } + + /** + * @return \Egulias\EmailValidator\Warning\Warning[] + */ + public function getWarnings() + { + return $this->warnings; + } + + /** + * @param string $str + */ + abstract public function parse($str); + + /** @return int */ + public function getOpenedParenthesis() + { + return $this->openedParenthesis; + } + + /** + * validateQuotedPair + */ + protected function validateQuotedPair() + { + if (!($this->lexer->token['type'] === EmailLexer::INVALID + || $this->lexer->token['type'] === EmailLexer::C_DEL)) { + throw new ExpectingQPair(); + } + + $this->warnings[QuotedPart::CODE] = + new QuotedPart($this->lexer->getPrevious()['type'], $this->lexer->token['type']); + } + + protected function parseComments() + { + $this->openedParenthesis = 1; + $this->isUnclosedComment(); + $this->warnings[Comment::CODE] = new Comment(); + while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) { + if ($this->lexer->isNextToken(EmailLexer::S_OPENPARENTHESIS)) { + $this->openedParenthesis++; + } + $this->warnEscaping(); + $this->lexer->moveNext(); + } + + $this->lexer->moveNext(); + if ($this->lexer->isNextTokenAny(array(EmailLexer::GENERIC, EmailLexer::S_EMPTY))) { + throw new ExpectingATEXT(); + } + + if ($this->lexer->isNextToken(EmailLexer::S_AT)) { + $this->warnings[CFWSNearAt::CODE] = new CFWSNearAt(); + } + } + + /** + * @return bool + */ + protected function isUnclosedComment() + { + try { + $this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS); + return true; + } catch (\RuntimeException $e) { + throw new UnclosedComment(); + } + } + + protected function parseFWS() + { + $previous = $this->lexer->getPrevious(); + + $this->checkCRLFInFWS(); + + if ($this->lexer->token['type'] === EmailLexer::S_CR) { + throw new CRNoLF(); + } + + if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] !== EmailLexer::S_AT) { + throw new AtextAfterCFWS(); + } + + if ($this->lexer->token['type'] === EmailLexer::S_LF || $this->lexer->token['type'] === EmailLexer::C_NUL) { + throw new ExpectingCTEXT(); + } + + if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type'] === EmailLexer::S_AT) { + $this->warnings[CFWSNearAt::CODE] = new CFWSNearAt(); + } else { + $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); + } + } + + protected function checkConsecutiveDots() + { + if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + throw new ConsecutiveDot(); + } + } + + /** + * @return bool + */ + protected function isFWS() + { + if ($this->escaped()) { + return false; + } + + if ($this->lexer->token['type'] === EmailLexer::S_SP || + $this->lexer->token['type'] === EmailLexer::S_HTAB || + $this->lexer->token['type'] === EmailLexer::S_CR || + $this->lexer->token['type'] === EmailLexer::S_LF || + $this->lexer->token['type'] === EmailLexer::CRLF + ) { + return true; + } + + return false; + } + + /** + * @return bool + */ + protected function escaped() + { + $previous = $this->lexer->getPrevious(); + + if ($previous && $previous['type'] === EmailLexer::S_BACKSLASH + && + $this->lexer->token['type'] !== EmailLexer::GENERIC + ) { + return true; + } + + return false; + } + + /** + * @return bool + */ + protected function warnEscaping() + { + if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) { + return false; + } + + if ($this->lexer->isNextToken(EmailLexer::GENERIC)) { + throw new ExpectingATEXT(); + } + + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) { + return false; + } + + $this->warnings[QuotedPart::CODE] = + new QuotedPart($this->lexer->getPrevious()['type'], $this->lexer->token['type']); + return true; + + } + + /** + * @param bool $hasClosingQuote + * + * @return bool + */ + protected function checkDQUOTE($hasClosingQuote) + { + if ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE) { + return $hasClosingQuote; + } + if ($hasClosingQuote) { + return $hasClosingQuote; + } + $previous = $this->lexer->getPrevious(); + if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] === EmailLexer::GENERIC) { + throw new ExpectingATEXT(); + } + + try { + $this->lexer->find(EmailLexer::S_DQUOTE); + $hasClosingQuote = true; + } catch (\Exception $e) { + throw new UnclosedQuotedString(); + } + $this->warnings[QuotedString::CODE] = new QuotedString($previous['value'], $this->lexer->token['value']); + + return $hasClosingQuote; + } + + protected function checkCRLFInFWS() + { + if ($this->lexer->token['type'] !== EmailLexer::CRLF) { + return; + } + + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { + throw new CRLFX2(); + } + + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { + throw new CRLFAtTheEnd(); + } + } +} diff --git a/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php b/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php new file mode 100644 index 0000000..da13253 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php @@ -0,0 +1,77 @@ +checkDNS($host); + } + + public function getError() + { + return $this->error; + } + + public function getWarnings() + { + return $this->warnings; + } + + /** + * @param string $host + * + * @return bool + */ + protected function checkDNS($host) + { + $variant = INTL_IDNA_VARIANT_2003; + if ( defined('INTL_IDNA_VARIANT_UTS46') ) { + $variant = INTL_IDNA_VARIANT_UTS46; + } + $host = rtrim(idn_to_ascii($host, IDNA_DEFAULT, $variant), '.') . '.'; + + $Aresult = true; + $MXresult = checkdnsrr($host, 'MX'); + + if (!$MXresult) { + $this->warnings[NoDNSMXRecord::CODE] = new NoDNSMXRecord(); + $Aresult = checkdnsrr($host, 'A') || checkdnsrr($host, 'AAAA'); + if (!$Aresult) { + $this->error = new NoDNSRecord(); + } + } + return $MXresult || $Aresult; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/EmailValidation.php b/vendor/egulias/email-validator/src/Validation/EmailValidation.php new file mode 100644 index 0000000..d5a015b --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/EmailValidation.php @@ -0,0 +1,34 @@ +errors = $errors; + parent::__construct(); + } + + /** + * @return InvalidEmail[] + */ + public function getErrors() + { + return $this->errors; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php b/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php new file mode 100644 index 0000000..feb2240 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php @@ -0,0 +1,124 @@ +validations = $validations; + $this->mode = $mode; + } + + /** + * {@inheritdoc} + */ + public function isValid($email, EmailLexer $emailLexer) + { + $result = true; + $errors = []; + foreach ($this->validations as $validation) { + $emailLexer->reset(); + $validationResult = $validation->isValid($email, $emailLexer); + $result = $result && $validationResult; + $this->warnings = array_merge($this->warnings, $validation->getWarnings()); + $errors = $this->addNewError($validation->getError(), $errors); + + if ($this->shouldStop($result)) { + break; + } + } + + if (!empty($errors)) { + $this->error = new MultipleErrors($errors); + } + + return $result; + } + + /** + * @param \Egulias\EmailValidator\Exception\InvalidEmail|null $possibleError + * @param \Egulias\EmailValidator\Exception\InvalidEmail[] $errors + * + * @return \Egulias\EmailValidator\Exception\InvalidEmail[] + */ + private function addNewError($possibleError, array $errors) + { + if (null !== $possibleError) { + $errors[] = $possibleError; + } + + return $errors; + } + + /** + * @param bool $result + * + * @return bool + */ + private function shouldStop($result) + { + return !$result && $this->mode === self::STOP_ON_ERROR; + } + + /** + * Returns the validation errors. + * + * @return MultipleErrors|null + */ + public function getError() + { + return $this->error; + } + + /** + * {@inheritdoc} + */ + public function getWarnings() + { + return $this->warnings; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php b/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php new file mode 100644 index 0000000..6b31e54 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php @@ -0,0 +1,41 @@ +getWarnings())) { + return true; + } + + $this->error = new RFCWarnings(); + + return false; + } + + /** + * {@inheritdoc} + */ + public function getError() + { + return $this->error ?: parent::getError(); + } +} diff --git a/vendor/egulias/email-validator/src/Validation/RFCValidation.php b/vendor/egulias/email-validator/src/Validation/RFCValidation.php new file mode 100644 index 0000000..8781e0b --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/RFCValidation.php @@ -0,0 +1,49 @@ +parser = new EmailParser($emailLexer); + try { + $this->parser->parse((string)$email); + } catch (InvalidEmail $invalid) { + $this->error = $invalid; + return false; + } + + $this->warnings = $this->parser->getWarnings(); + return true; + } + + public function getError() + { + return $this->error; + } + + public function getWarnings() + { + return $this->warnings; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/SpoofCheckValidation.php b/vendor/egulias/email-validator/src/Validation/SpoofCheckValidation.php new file mode 100644 index 0000000..e10bfab --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/SpoofCheckValidation.php @@ -0,0 +1,51 @@ +setChecks(Spoofchecker::SINGLE_SCRIPT); + + if ($checker->isSuspicious($email)) { + $this->error = new SpoofEmail(); + } + + return $this->error === null; + } + + /** + * @return InvalidEmail|null + */ + public function getError() + { + return $this->error; + } + + public function getWarnings() + { + return []; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/AddressLiteral.php b/vendor/egulias/email-validator/src/Warning/AddressLiteral.php new file mode 100644 index 0000000..77e70f7 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/AddressLiteral.php @@ -0,0 +1,14 @@ +message = 'Address literal in domain part'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php b/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php new file mode 100644 index 0000000..be43bbe --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php @@ -0,0 +1,13 @@ +message = "Deprecated folding white space near @"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php b/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php new file mode 100644 index 0000000..dea3450 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php @@ -0,0 +1,13 @@ +message = 'Folding whites space followed by folding white space'; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/Comment.php b/vendor/egulias/email-validator/src/Warning/Comment.php new file mode 100644 index 0000000..704c290 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/Comment.php @@ -0,0 +1,13 @@ +message = "Comments found in this email"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php b/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php new file mode 100644 index 0000000..ad43bd7 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php @@ -0,0 +1,13 @@ +message = 'Deprecated comments'; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/DomainLiteral.php b/vendor/egulias/email-validator/src/Warning/DomainLiteral.php new file mode 100644 index 0000000..6f36b5e --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/DomainLiteral.php @@ -0,0 +1,14 @@ +message = 'Domain Literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/DomainTooLong.php b/vendor/egulias/email-validator/src/Warning/DomainTooLong.php new file mode 100644 index 0000000..61ff17a --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/DomainTooLong.php @@ -0,0 +1,14 @@ +message = 'Domain is too long, exceeds 255 chars'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/EmailTooLong.php b/vendor/egulias/email-validator/src/Warning/EmailTooLong.php new file mode 100644 index 0000000..497309d --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/EmailTooLong.php @@ -0,0 +1,15 @@ +message = 'Email is too long, exceeds ' . EmailParser::EMAIL_MAX_LENGTH; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php b/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php new file mode 100644 index 0000000..ba2fcc0 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php @@ -0,0 +1,14 @@ +message = 'Bad char in IPV6 domain literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php b/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php new file mode 100644 index 0000000..41afa78 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php @@ -0,0 +1,14 @@ +message = ':: found at the end of the domain literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php b/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php new file mode 100644 index 0000000..1bf754e --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php @@ -0,0 +1,14 @@ +message = ':: found at the start of the domain literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php b/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php new file mode 100644 index 0000000..d752caa --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php @@ -0,0 +1,14 @@ +message = 'Deprecated form of IPV6'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php b/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php new file mode 100644 index 0000000..4f82394 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php @@ -0,0 +1,14 @@ +message = 'Double colon found after IPV6 tag'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php b/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php new file mode 100644 index 0000000..a59d317 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php @@ -0,0 +1,14 @@ +message = 'Group count is not IPV6 valid'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php b/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php new file mode 100644 index 0000000..936274c --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php @@ -0,0 +1,14 @@ +message = 'Reached the maximum number of IPV6 groups allowed'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/LabelTooLong.php b/vendor/egulias/email-validator/src/Warning/LabelTooLong.php new file mode 100644 index 0000000..daf07f4 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/LabelTooLong.php @@ -0,0 +1,14 @@ +message = 'Label too long'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/LocalTooLong.php b/vendor/egulias/email-validator/src/Warning/LocalTooLong.php new file mode 100644 index 0000000..0d08d8b --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/LocalTooLong.php @@ -0,0 +1,15 @@ +message = 'Local part is too long, exceeds 64 chars (octets)'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php b/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php new file mode 100644 index 0000000..b3c21a1 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php @@ -0,0 +1,14 @@ +message = 'No MX DSN record was found for this email'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php b/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php new file mode 100644 index 0000000..10f19e3 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php @@ -0,0 +1,14 @@ +rfcNumber = 5322; + $this->message = 'Obsolete DTEXT in domain literal'; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/QuotedPart.php b/vendor/egulias/email-validator/src/Warning/QuotedPart.php new file mode 100644 index 0000000..36a4265 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/QuotedPart.php @@ -0,0 +1,17 @@ +message = "Deprecated Quoted String found between $prevToken and $postToken"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/QuotedString.php b/vendor/egulias/email-validator/src/Warning/QuotedString.php new file mode 100644 index 0000000..817e4e8 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/QuotedString.php @@ -0,0 +1,17 @@ +message = "Quoted String found between $prevToken and $postToken"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/TLD.php b/vendor/egulias/email-validator/src/Warning/TLD.php new file mode 100644 index 0000000..2338b9f --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/TLD.php @@ -0,0 +1,13 @@ +message = "RFC5321, TLD"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/Warning.php b/vendor/egulias/email-validator/src/Warning/Warning.php new file mode 100644 index 0000000..bce7e7a --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/Warning.php @@ -0,0 +1,47 @@ +message; + } + + /** + * @return int + */ + public function code() + { + return self::CODE; + } + + /** + * @return int + */ + public function RFCNumber() + { + return $this->rfcNumber; + } + + public function __toString() + { + return $this->message() . " rfc: " . $this->rfcNumber . "interal code: " . static::CODE; + } +} diff --git a/vendor/facade/flare-client-php/.github/FUNDING.yml b/vendor/facade/flare-client-php/.github/FUNDING.yml new file mode 100644 index 0000000..2bec409 --- /dev/null +++ b/vendor/facade/flare-client-php/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: spatie diff --git a/vendor/facade/flare-client-php/.github/workflows/run-tests.yml b/vendor/facade/flare-client-php/.github/workflows/run-tests.yml new file mode 100644 index 0000000..864bce4 --- /dev/null +++ b/vendor/facade/flare-client-php/.github/workflows/run-tests.yml @@ -0,0 +1,47 @@ +name: Run tests + +on: + push: + pull_request: + schedule: + - cron: '0 0 * * *' + +jobs: + php-tests: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + php: [7.4, 7.3, 7.2, 7.1] + dependency-version: [prefer-lowest, prefer-stable] + os: [ubuntu-latest] + + name: P${{ matrix.php }} - ${{ matrix.dependency-version }} - ${{ matrix.os }} + + steps: + - name: Checkout code + uses: actions/checkout@v1 + + - name: Setup PHP + uses: shivammathur/setup-php@v1 + with: + php-version: ${{ matrix.php }} + extensions: fileinfo, dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick + coverage: none + + - name: Install dependencies + run: | + composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-suggest + + - name: Execute tests + run: vendor/bin/phpunit + + - name: Send Slack notification + uses: 8398a7/action-slack@v2 + if: failure() + with: + status: ${{ job.status }} + author_name: ${{ github.actor }} + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/vendor/facade/flare-client-php/CHANGELOG.md b/vendor/facade/flare-client-php/CHANGELOG.md new file mode 100644 index 0000000..03f60fb --- /dev/null +++ b/vendor/facade/flare-client-php/CHANGELOG.md @@ -0,0 +1,56 @@ +# Changelog + +All notable changes to `flare-client-php` will be documented in this file + +## 1.3.2 - 2020-03-02 + +- allow L7 + +## 1.3.1 - 2019-12-15 + +- allow var-dumper v5.0 + +## 1.3.0 - 2019-11-27 + +- Allow custom grouping types + +## 1.2.1 - 2019-11-19 + +- Let `registerFlareHandlers` return $this + +## 1.2.0 - 2019-11-19 + +- Add `registerFlareHandlers` method to register error and exception handlers in non-Laravel applications +- Fix get requests with query parameters (#4) + +## 1.1.2 - 2019-11-08 + +- Ignore invalid mime type detection issues + +## 1.1.1 - 2019-10-07 + +- Wrap filesize detection in try-catch block + +## 1.1.0 - 2019-09-27 + +- Add ability to log messages + +## 1.0.4 - 2019-09-11 + +- Fixes an issue when sending exceptions inside a queue worker + +## 1.0.3 - 2019-09-05 + +- Ensure valid session data + +## 1.0.2 - 2019-09-05 + +- Fix error when uploading multiple files using an array name + +## 1.0.1 - 2019-09-02 + +- Fix issue with uploaded files in request context + +## 1.0.0 - 2019-08-30 + +- initial release diff --git a/vendor/facade/flare-client-php/LICENSE.md b/vendor/facade/flare-client-php/LICENSE.md new file mode 100644 index 0000000..48c30e4 --- /dev/null +++ b/vendor/facade/flare-client-php/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Facade + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/facade/flare-client-php/README.md b/vendor/facade/flare-client-php/README.md new file mode 100644 index 0000000..bc5261c --- /dev/null +++ b/vendor/facade/flare-client-php/README.md @@ -0,0 +1,38 @@ +# Send PHP errors to Flare + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/facade/flare-client-php.svg?style=flat-square)](https://packagist.org/packages/facade/flare-client-php) +![GitHub Workflow Status](https://img.shields.io/github/workflow/status/facade/flare-client-php/run-tests?label=tests) +[![Quality Score](https://img.shields.io/scrutinizer/g/facade/flare-client-php.svg?style=flat-square)](https://scrutinizer-ci.com/g/facade/flare-client-php) +[![StyleCI](https://github.styleci.io/repos/204468479/shield?branch=master)](https://github.styleci.io/repos/204468479) +[![Total Downloads](https://img.shields.io/packagist/dt/facade/flare-client-php.svg?style=flat-square)](https://packagist.org/packages/facade/flare-client-php) + +This repository contains a PHP client to send PHP errors to [Flare](https://flareapp.io). + +![Screenshot of error in Flare](https://facade.github.io/flare-client-php/screenshot.png) + +## Documentation + +You can find the documentation of this package at [the docs of Flare](https://flareapp.io/docs/general/projects). + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. + +## Testing + +``` bash +composer test +``` + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## Security + +If you discover any security related issues, please email support@flareapp.io instead of using the issue tracker. + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. + diff --git a/vendor/facade/flare-client-php/composer.json b/vendor/facade/flare-client-php/composer.json new file mode 100644 index 0000000..9dae3d1 --- /dev/null +++ b/vendor/facade/flare-client-php/composer.json @@ -0,0 +1,50 @@ +{ + "name": "facade/flare-client-php", + "description": "Send PHP errors to Flare", + "keywords": [ + "facade", + "flare", + "exception", + "reporting" + ], + "homepage": "https://github.com/facade/flare-client-php", + "license": "MIT", + "require": { + "php": "^7.1", + "illuminate/pipeline": "^5.5|^6.0|^7.0", + "symfony/http-foundation": "^3.3|^4.1|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0", + "facade/ignition-contracts": "~1.0" + }, + "require-dev": { + "larapack/dd": "^1.1", + "spatie/phpunit-snapshot-assertions": "^2.0", + "phpunit/phpunit": "^7.5.16" + }, + "autoload": { + "psr-4": { + "Facade\\FlareClient\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Facade\\FlareClient\\Tests\\": "tests" + } + }, + "scripts": { + "test": "vendor/bin/phpunit", + "test-coverage": "vendor/bin/phpunit --coverage-html coverage" + + }, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + } +} diff --git a/vendor/facade/flare-client-php/src/Api.php b/vendor/facade/flare-client-php/src/Api.php new file mode 100644 index 0000000..0229e95 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Api.php @@ -0,0 +1,76 @@ +client = $client; + + register_shutdown_function([$this, 'sendQueuedReports']); + } + + public static function sendReportsInBatches(bool $batchSending = true) + { + static::$sendInBatches = $batchSending; + } + + public function report(Report $report) + { + try { + if (static::$sendInBatches) { + $this->addReportToQueue($report); + } else { + $this->sendReportToApi($report); + } + } catch (\Exception $e) { + // + } + } + + public function sendTestReport(Report $report) + { + $this->sendReportToApi($report); + } + + private function addReportToQueue(Report $report) + { + $this->queue[] = $report; + } + + public function sendQueuedReports() + { + try { + foreach ($this->queue as $report) { + $this->sendReportToApi($report); + } + } catch (\Exception $e) { + // + } finally { + $this->queue = []; + } + } + + private function sendReportToApi(Report $report) + { + $this->client->post('reports', $this->truncateReport($report->toArray())); + } + + private function truncateReport(array $payload): array + { + return (new ReportTrimmer())->trim($payload); + } +} diff --git a/vendor/facade/flare-client-php/src/Concerns/HasContext.php b/vendor/facade/flare-client-php/src/Concerns/HasContext.php new file mode 100644 index 0000000..2fb6a6d --- /dev/null +++ b/vendor/facade/flare-client-php/src/Concerns/HasContext.php @@ -0,0 +1,51 @@ +stage = $stage; + + return $this; + } + + public function messageLevel(?string $messageLevel) + { + $this->messageLevel = $messageLevel; + + return $this; + } + + public function getGroup(string $groupName = 'context', $default = []): array + { + return $this->userProvidedContext[$groupName] ?? $default; + } + + public function context($key, $value) + { + return $this->group('context', [$key => $value]); + } + + public function group(string $groupName, array $properties) + { + $group = $this->userProvidedContext[$groupName] ?? []; + + $this->userProvidedContext[$groupName] = array_merge_recursive_distinct( + $group, + $properties + ); + + return $this; + } +} diff --git a/vendor/facade/flare-client-php/src/Concerns/UsesTime.php b/vendor/facade/flare-client-php/src/Concerns/UsesTime.php new file mode 100644 index 0000000..5414409 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Concerns/UsesTime.php @@ -0,0 +1,24 @@ +getCurrentTime(); + } +} diff --git a/vendor/facade/flare-client-php/src/Context/ConsoleContext.php b/vendor/facade/flare-client-php/src/Context/ConsoleContext.php new file mode 100644 index 0000000..da87122 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Context/ConsoleContext.php @@ -0,0 +1,21 @@ +arguments = $arguments; + } + + public function toArray(): array + { + return [ + 'arguments' => $this->arguments, + ]; + } +} diff --git a/vendor/facade/flare-client-php/src/Context/ContextContextDetector.php b/vendor/facade/flare-client-php/src/Context/ContextContextDetector.php new file mode 100644 index 0000000..78aef0d --- /dev/null +++ b/vendor/facade/flare-client-php/src/Context/ContextContextDetector.php @@ -0,0 +1,24 @@ +runningInConsole()) { + return new ConsoleContext($_SERVER['argv'] ?? []); + } + + return new RequestContext(); + } + + private function runningInConsole(): bool + { + if (isset($_ENV['APP_RUNNING_IN_CONSOLE'])) { + return $_ENV['APP_RUNNING_IN_CONSOLE'] === 'true'; + } + + return in_array(php_sapi_name(), ['cli', 'phpdb']); + } +} diff --git a/vendor/facade/flare-client-php/src/Context/ContextDetectorInterface.php b/vendor/facade/flare-client-php/src/Context/ContextDetectorInterface.php new file mode 100644 index 0000000..b02ed8e --- /dev/null +++ b/vendor/facade/flare-client-php/src/Context/ContextDetectorInterface.php @@ -0,0 +1,8 @@ +request = $request ?? Request::createFromGlobals(); + } + + public function getRequest(): array + { + return [ + 'url' => $this->request->getUri(), + 'ip' => $this->request->getClientIp(), + 'method' => $this->request->getMethod(), + 'useragent' => $this->request->headers->get('User-Agent'), + ]; + } + + private function getFiles(): array + { + if (is_null($this->request->files)) { + return []; + } + + return $this->mapFiles($this->request->files->all()); + } + + protected function mapFiles(array $files) + { + return array_map(function ($file) { + if (is_array($file)) { + return $this->mapFiles($file); + } + + if (! $file instanceof UploadedFile) { + return; + } + + try { + $fileSize = $file->getSize(); + } catch (\RuntimeException $e) { + $fileSize = 0; + } + + try { + $mimeType = $file->getMimeType(); + } catch (InvalidArgumentException $e) { + $mimeType = 'undefined'; + } + + return [ + 'pathname' => $file->getPathname(), + 'size' => $fileSize, + 'mimeType' => $mimeType, + ]; + }, $files); + } + + public function getSession(): array + { + try { + $session = $this->request->getSession(); + } catch (BadMethodCallException $exception) { + $session = []; + } + + return $session ? $this->getValidSessionData($session) : []; + } + + /** + * @param SessionInterface $session + * @return array + */ + protected function getValidSessionData($session): array + { + try { + json_encode($session->all()); + } catch (Throwable $e) { + return []; + } + + return $session->all(); + } + + public function getCookies(): array + { + return $this->request->cookies->all(); + } + + public function getHeaders(): array + { + return $this->request->headers->all(); + } + + public function getRequestData(): array + { + return [ + 'queryString' => $this->request->query->all(), + 'body' => $this->request->request->all(), + 'files' => $this->getFiles(), + ]; + } + + public function toArray(): array + { + return [ + 'request' => $this->getRequest(), + 'request_data' => $this->getRequestData(), + 'headers' => $this->getHeaders(), + 'cookies' => $this->getCookies(), + 'session' => $this->getSession(), + ]; + } +} diff --git a/vendor/facade/flare-client-php/src/Contracts/ProvidesFlareContext.php b/vendor/facade/flare-client-php/src/Contracts/ProvidesFlareContext.php new file mode 100644 index 0000000..f3b7faa --- /dev/null +++ b/vendor/facade/flare-client-php/src/Contracts/ProvidesFlareContext.php @@ -0,0 +1,8 @@ +client = $client; + $this->recorder = new Recorder(); + $this->contextDetector = $contextDetector ?? new ContextContextDetector(); + $this->container = $container; + $this->middleware = $middleware; + $this->api = new Api($this->client); + + $this->registerDefaultMiddleware(); + } + + public function getMiddleware(): array + { + return $this->middleware; + } + + public function registerFlareHandlers() + { + $this->registerExceptionHandler(); + $this->registerErrorHandler(); + + return $this; + } + + public function registerExceptionHandler() + { + $this->previousExceptionHandler = set_exception_handler([$this, 'handleException']); + + return $this; + } + + public function registerErrorHandler() + { + $this->previousErrorHandler = set_error_handler([$this, 'handleError']); + + return $this; + } + + private function registerDefaultMiddleware() + { + return $this->registerMiddleware(new AddGlows($this->recorder)); + } + + public function registerMiddleware($callable) + { + $this->middleware[] = $callable; + + return $this; + } + + public function getMiddlewares(): array + { + return $this->middleware; + } + + public function glow( + string $name, + string $messageLevel = MessageLevels::INFO, + array $metaData = [] + ) { + $this->recorder->record(new Glow($name, $messageLevel, $metaData)); + } + + public function handleException(Throwable $throwable) + { + $this->report($throwable); + + if ($this->previousExceptionHandler) { + call_user_func($this->previousExceptionHandler, $throwable); + } + } + + public function handleError($code, $message, $file = '', $line = 0) + { + $exception = new \ErrorException($message, 0, $code, $file, $line); + + $this->report($exception); + + if ($this->previousErrorHandler) { + return call_user_func( + $this->previousErrorHandler, + $message, + $code, + $file, + $line + ); + } + } + + public function applicationPath(string $applicationPath) + { + $this->applicationPath = $applicationPath; + + return $this; + } + + public function report(Throwable $throwable, callable $callback = null) + { + $report = $this->createReport($throwable); + + if (! is_null($callback)) { + call_user_func($callback, $report); + } + + $this->sendReportToApi($report); + } + + public function reportMessage(string $message, string $logLevel, callable $callback = null) + { + $report = $this->createReportFromMessage($message, $logLevel); + + if (! is_null($callback)) { + call_user_func($callback, $report); + } + + $this->sendReportToApi($report); + } + + public function sendTestReport(Throwable $throwable) + { + $this->api->sendTestReport($this->createReport($throwable)); + } + + private function sendReportToApi(Report $report) + { + try { + $this->api->report($report); + } catch (Exception $exception) { + } + } + + public function reset() + { + $this->api->sendQueuedReports(); + + $this->userProvidedContext = []; + $this->recorder->reset(); + } + + private function applyAdditionalParameters(Report $report) + { + $report + ->stage($this->stage) + ->messageLevel($this->messageLevel) + ->setApplicationPath($this->applicationPath) + ->userProvidedContext($this->userProvidedContext); + } + + public function anonymizeIp() + { + $this->registerMiddleware(new AnonymizeIp); + + return $this; + } + + public function createReport(Throwable $throwable): Report + { + $report = Report::createForThrowable( + $throwable, + $this->contextDetector->detectCurrentContext(), + $this->applicationPath + ); + + return $this->applyMiddlewareToReport($report); + } + + public function createReportFromMessage(string $message, string $logLevel): Report + { + $report = Report::createForMessage( + $message, + $logLevel, + $this->contextDetector->detectCurrentContext(), + $this->applicationPath + ); + + $report->groupByException(); + + return $this->applyMiddlewareToReport($report); + } + + protected function applyMiddlewareToReport(Report $report): Report + { + $this->applyAdditionalParameters($report); + + $report = (new Pipeline($this->container)) + ->send($report) + ->through($this->middleware) + ->then(function ($report) { + return $report; + }); + + return $report; + } +} diff --git a/vendor/facade/flare-client-php/src/Frame.php b/vendor/facade/flare-client-php/src/Frame.php new file mode 100644 index 0000000..1c63181 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Frame.php @@ -0,0 +1,66 @@ +file = $file; + + $this->lineNumber = $lineNumber; + + $this->method = $method; + + $this->class = $class; + } + + public function toArray(): array + { + $codeSnippet = (new Codesnippet()) + ->snippetLineCount(9) + ->surroundingLine($this->lineNumber) + ->get($this->file); + + return [ + 'line_number' => $this->lineNumber, + 'method' => $this->getFullMethod(), + 'code_snippet' => $codeSnippet, + 'file' => $this->file, + ]; + } + + private function getFullMethod(): string + { + $method = $this->method; + + if ($class = $this->class ?? false) { + $method = "{$class}::{$method}"; + } + + return $method; + } + + public function getFile(): string + { + return $this->file; + } +} diff --git a/vendor/facade/flare-client-php/src/Glows/Glow.php b/vendor/facade/flare-client-php/src/Glows/Glow.php new file mode 100644 index 0000000..5f649e9 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Glows/Glow.php @@ -0,0 +1,42 @@ +name = $name; + $this->messageLevel = $messageLevel; + $this->metaData = $metaData; + $this->microtime = $microtime ?? microtime(true); + } + + public function toArray() + { + return [ + 'time' => $this->getCurrentTime(), + 'name' => $this->name, + 'message_level' => $this->messageLevel, + 'meta_data' => $this->metaData, + 'microtime' => $this->microtime, + ]; + } +} diff --git a/vendor/facade/flare-client-php/src/Glows/Recorder.php b/vendor/facade/flare-client-php/src/Glows/Recorder.php new file mode 100644 index 0000000..92216f2 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Glows/Recorder.php @@ -0,0 +1,27 @@ +glows[] = $glow; + + $this->glows = array_slice($this->glows, static::GLOW_LIMIT * -1, static::GLOW_LIMIT); + } + + public function glows(): array + { + return $this->glows; + } + + public function reset() + { + $this->glows = []; + } +} diff --git a/vendor/facade/flare-client-php/src/Http/Client.php b/vendor/facade/flare-client-php/src/Http/Client.php new file mode 100644 index 0000000..b612f4a --- /dev/null +++ b/vendor/facade/flare-client-php/src/Http/Client.php @@ -0,0 +1,210 @@ +apiToken = $apiToken; + + $this->apiSecret = $apiSecret; + + if (! $baseUrl) { + throw MissingParameter::create('baseUrl'); + } + + $this->baseUrl = $baseUrl; + + if (! $timeout) { + throw MissingParameter::create('timeout'); + } + + $this->timeout = $timeout; + } + + /** + * @param string $url + * @param array $arguments + * + * @return array|false + */ + public function get(string $url, array $arguments = []) + { + return $this->makeRequest('get', $url, $arguments); + } + + /** + * @param string $url + * @param array $arguments + * + * @return array|false + */ + public function post(string $url, array $arguments = []) + { + return $this->makeRequest('post', $url, $arguments); + } + + /** + * @param string $url + * @param array $arguments + * + * @return array|false + */ + public function patch(string $url, array $arguments = []) + { + return $this->makeRequest('patch', $url, $arguments); + } + + /** + * @param string $url + * @param array $arguments + * + * @return array|false + */ + public function put(string $url, array $arguments = []) + { + return $this->makeRequest('put', $url, $arguments); + } + + /** + * @param string $method + * @param array $arguments + * + * @return array|false + */ + public function delete(string $method, array $arguments = []) + { + return $this->makeRequest('delete', $method, $arguments); + } + + /** + * @param string $httpVerb + * @param string $url + * @param array $arguments + * + * @return array + */ + private function makeRequest(string $httpVerb, string $url, array $arguments = []) + { + $queryString = http_build_query([ + 'key' => $this->apiToken, + 'secret' => $this->apiSecret, + ]); + + $fullUrl = "{$this->baseUrl}/{$url}?{$queryString}"; + + $headers = [ + 'x-api-token: '.$this->apiToken, + ]; + + $response = $this->makeCurlRequest($httpVerb, $fullUrl, $headers, $arguments); + + if ($response->getHttpResponseCode() === 422) { + throw InvalidData::createForResponse($response); + } + + if ($response->getHttpResponseCode() === 404) { + throw NotFound::createForResponse($response); + } + + if ($response->getHttpResponseCode() !== 200 && $response->getHttpResponseCode() !== 204) { + throw BadResponseCode::createForResponse($response); + } + + return $response->getBody(); + } + + public function makeCurlRequest(string $httpVerb, string $fullUrl, array $headers = [], array $arguments = []): Response + { + $curlHandle = $this->getCurlHandle($fullUrl, $headers); + + switch ($httpVerb) { + case 'post': + curl_setopt($curlHandle, CURLOPT_POST, true); + $this->attachRequestPayload($curlHandle, $arguments); + break; + + case 'get': + curl_setopt($curlHandle, CURLOPT_URL, $fullUrl.'?'.http_build_query($arguments)); + break; + + case 'delete': + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'DELETE'); + break; + + case 'patch': + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'PATCH'); + $this->attachRequestPayload($curlHandle, $arguments); + break; + + case 'put': + curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'PUT'); + $this->attachRequestPayload($curlHandle, $arguments); + break; + } + + $body = json_decode(curl_exec($curlHandle), true); + $headers = curl_getinfo($curlHandle); + $error = curl_error($curlHandle); + + return new Response($headers, $body, $error); + } + + private function attachRequestPayload(&$curlHandle, array $data) + { + $encoded = json_encode($data); + + $this->lastRequest['body'] = $encoded; + curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $encoded); + } + + /** + * @param string $fullUrl + * @param array $headers + * + * @return resource + */ + private function getCurlHandle(string $fullUrl, array $headers = []) + { + $curlHandle = curl_init(); + + curl_setopt($curlHandle, CURLOPT_URL, $fullUrl); + + curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array_merge([ + 'Accept: application/json', + 'Content-Type: application/json', + ], $headers)); + + curl_setopt($curlHandle, CURLOPT_USERAGENT, 'Laravel/Flare API 1.0'); + curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curlHandle, CURLOPT_TIMEOUT, $this->timeout); + curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curlHandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_setopt($curlHandle, CURLOPT_ENCODING, ''); + curl_setopt($curlHandle, CURLINFO_HEADER_OUT, true); + + return $curlHandle; + } +} diff --git a/vendor/facade/flare-client-php/src/Http/Exceptions/BadResponse.php b/vendor/facade/flare-client-php/src/Http/Exceptions/BadResponse.php new file mode 100644 index 0000000..4962bdd --- /dev/null +++ b/vendor/facade/flare-client-php/src/Http/Exceptions/BadResponse.php @@ -0,0 +1,21 @@ +getError()}"); + + $exception->response = $response; + + return $exception; + } +} diff --git a/vendor/facade/flare-client-php/src/Http/Exceptions/BadResponseCode.php b/vendor/facade/flare-client-php/src/Http/Exceptions/BadResponseCode.php new file mode 100644 index 0000000..6e1e4c5 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Http/Exceptions/BadResponseCode.php @@ -0,0 +1,33 @@ +response = $response; + + $bodyErrors = isset($response->getBody()['errors']) ? $response->getBody()['errors'] : []; + + $exception->errors = $bodyErrors; + + return $exception; + } + + public static function getMessageForResponse(Response $response) + { + return "Response code {$response->getHttpResponseCode()} returned"; + } +} diff --git a/vendor/facade/flare-client-php/src/Http/Exceptions/InvalidData.php b/vendor/facade/flare-client-php/src/Http/Exceptions/InvalidData.php new file mode 100644 index 0000000..73ae1ac --- /dev/null +++ b/vendor/facade/flare-client-php/src/Http/Exceptions/InvalidData.php @@ -0,0 +1,13 @@ +headers = $headers; + + $this->body = $body; + + $this->error = $error; + } + + /** + * @return mixed + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * @return mixed + */ + public function getBody() + { + return $this->body; + } + + /** + * @return bool + */ + public function hasBody() + { + return $this->body != false; + } + + /** + * @return mixed + */ + public function getError() + { + return $this->error; + } + + /** + * @return null|int + */ + public function getHttpResponseCode() + { + if (! isset($this->headers['http_code'])) { + return; + } + + return (int) $this->headers['http_code']; + } +} diff --git a/vendor/facade/flare-client-php/src/Middleware/AddGlows.php b/vendor/facade/flare-client-php/src/Middleware/AddGlows.php new file mode 100644 index 0000000..ce47447 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Middleware/AddGlows.php @@ -0,0 +1,26 @@ +recorder = $recorder; + } + + public function handle(Report $report, $next) + { + foreach ($this->recorder->glows() as $glow) { + $report->addGlow($glow); + } + + return $next($report); + } +} diff --git a/vendor/facade/flare-client-php/src/Middleware/AnonymizeIp.php b/vendor/facade/flare-client-php/src/Middleware/AnonymizeIp.php new file mode 100644 index 0000000..2df3598 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Middleware/AnonymizeIp.php @@ -0,0 +1,19 @@ +allContext(); + + $context['request']['ip'] = null; + + $report->userProvidedContext($context); + + return $next($report); + } +} diff --git a/vendor/facade/flare-client-php/src/Report.php b/vendor/facade/flare-client-php/src/Report.php new file mode 100644 index 0000000..c82944d --- /dev/null +++ b/vendor/facade/flare-client-php/src/Report.php @@ -0,0 +1,266 @@ +setApplicationPath($applicationPath) + ->throwable($throwable) + ->useContext($context) + ->exceptionClass(get_class($throwable)) + ->message($throwable->getMessage()) + ->stackTrace(Stacktrace::createForThrowable($throwable, $applicationPath)) + ->exceptionContext($throwable); + } + + public static function createForMessage(string $message, string $logLevel, ContextInterface $context, ?string $applicationPath = null): self + { + $stacktrace = Stacktrace::create($applicationPath); + + return (new static()) + ->setApplicationPath($applicationPath) + ->message($message) + ->useContext($context) + ->exceptionClass($logLevel) + ->stacktrace($stacktrace) + ->openFrameIndex($stacktrace->firstApplicationFrameIndex()); + } + + public function exceptionClass(string $exceptionClass) + { + $this->exceptionClass = $exceptionClass; + + return $this; + } + + public function getExceptionClass(): string + { + return $this->exceptionClass; + } + + public function throwable(Throwable $throwable) + { + $this->throwable = $throwable; + + return $this; + } + + public function getThrowable(): ?Throwable + { + return $this->throwable; + } + + public function message(string $message) + { + $this->message = $message; + + return $this; + } + + public function getMessage(): string + { + return $this->message; + } + + public function stacktrace(Stacktrace $stacktrace) + { + $this->stacktrace = $stacktrace; + + return $this; + } + + public function getStacktrace(): Stacktrace + { + return $this->stacktrace; + } + + public function notifierName(string $notifierName) + { + $this->notifierName = $notifierName; + + return $this; + } + + public function languageVersion(string $languageVersion) + { + $this->languageVersion = $languageVersion; + + return $this; + } + + public function frameworkVersion(string $frameworkVersion) + { + $this->frameworkVersion = $frameworkVersion; + + return $this; + } + + public function useContext(ContextInterface $request) + { + $this->context = $request; + + return $this; + } + + public function openFrameIndex(?int $index) + { + $this->openFrameIndex = $index; + + return $this; + } + + public function setApplicationPath(?string $applicationPath) + { + $this->applicationPath = $applicationPath; + + return $this; + } + + public function getApplicationPath(): ?string + { + return $this->applicationPath; + } + + public function view(?View $view) + { + $this->view = $view; + + return $this; + } + + public function addGlow(Glow $glow) + { + $this->glows[] = $glow->toArray(); + + return $this; + } + + public function addSolution(Solution $solution) + { + $this->solutions[] = ReportSolution::fromSolution($solution)->toArray(); + + return $this; + } + + public function userProvidedContext(array $userProvidedContext) + { + $this->userProvidedContext = $userProvidedContext; + + return $this; + } + + public function groupByTopFrame() + { + $this->groupBy = GroupingTypes::TOP_FRAME; + + return $this; + } + + public function groupByException() + { + $this->groupBy = GroupingTypes::EXCEPTION; + + return $this; + } + + public function allContext(): array + { + $context = $this->context->toArray(); + + $context = array_merge_recursive_distinct($context, $this->exceptionContext); + + return array_merge_recursive_distinct($context, $this->userProvidedContext); + } + + private function exceptionContext(Throwable $throwable) + { + if ($throwable instanceof ProvidesFlareContext) { + $this->exceptionContext = $throwable->context(); + } + + return $this; + } + + public function toArray() + { + return [ + 'notifier' => $this->notifierName ?? 'Flare Client', + 'language' => 'PHP', + 'framework_version' => $this->frameworkVersion, + 'language_version' => $this->languageVersion ?? phpversion(), + 'exception_class' => $this->exceptionClass, + 'seen_at' => $this->getCurrentTime(), + 'message' => $this->message, + 'glows' => $this->glows, + 'solutions' => $this->solutions, + 'stacktrace' => $this->stacktrace->toArray(), + 'context' => $this->allContext(), + 'stage' => $this->stage, + 'message_level' => $this->messageLevel, + 'open_frame_index' => $this->openFrameIndex, + 'group_by' => $this->groupBy ?? GroupingTypes::TOP_FRAME, + 'application_path' => $this->applicationPath, + ]; + } +} diff --git a/vendor/facade/flare-client-php/src/Solutions/ReportSolution.php b/vendor/facade/flare-client-php/src/Solutions/ReportSolution.php new file mode 100644 index 0000000..5437e2e --- /dev/null +++ b/vendor/facade/flare-client-php/src/Solutions/ReportSolution.php @@ -0,0 +1,36 @@ +solution = $solution; + } + + public static function fromSolution(SolutionContract $solution) + { + return new static($solution); + } + + public function toArray(): array + { + $isRunnable = ($this->solution instanceof RunnableSolution); + + return [ + 'class' => get_class($this->solution), + 'title' => $this->solution->getSolutionTitle(), + 'description' => $this->solution->getSolutionDescription(), + 'links' => $this->solution->getDocumentationLinks(), + 'action_description' => $isRunnable ? $this->solution->getSolutionActionDescription() : null, + 'is_runnable' => $isRunnable, + ]; + } +} diff --git a/vendor/facade/flare-client-php/src/Stacktrace/Codesnippet.php b/vendor/facade/flare-client-php/src/Stacktrace/Codesnippet.php new file mode 100644 index 0000000..81bfcba --- /dev/null +++ b/vendor/facade/flare-client-php/src/Stacktrace/Codesnippet.php @@ -0,0 +1,72 @@ +surroundingLine = $surroundingLine; + + return $this; + } + + public function snippetLineCount(int $snippetLineCount): self + { + $this->snippetLineCount = $snippetLineCount; + + return $this; + } + + public function get(string $fileName): array + { + if (! file_exists($fileName)) { + return []; + } + + try { + $file = new File($fileName); + + [$startLineNumber, $endLineNumber] = $this->getBounds($file->numberOfLines()); + + $code = []; + + $line = $file->getLine($startLineNumber); + + $currentLineNumber = $startLineNumber; + + while ($currentLineNumber <= $endLineNumber) { + $code[$currentLineNumber] = rtrim(substr($line, 0, 250)); + + $line = $file->getNextLine(); + $currentLineNumber++; + } + + return $code; + } catch (RuntimeException $exception) { + return []; + } + } + + private function getBounds($totalNumberOfLineInFile): array + { + $startLine = max($this->surroundingLine - floor($this->snippetLineCount / 2), 1); + + $endLine = $startLine + ($this->snippetLineCount - 1); + + if ($endLine > $totalNumberOfLineInFile) { + $endLine = $totalNumberOfLineInFile; + $startLine = max($endLine - ($this->snippetLineCount - 1), 1); + } + + return [$startLine, $endLine]; + } +} diff --git a/vendor/facade/flare-client-php/src/Stacktrace/File.php b/vendor/facade/flare-client-php/src/Stacktrace/File.php new file mode 100644 index 0000000..f8bc0ea --- /dev/null +++ b/vendor/facade/flare-client-php/src/Stacktrace/File.php @@ -0,0 +1,41 @@ +file = new SplFileObject($path); + } + + public function numberOfLines(): int + { + $this->file->seek(PHP_INT_MAX); + + return $this->file->key() + 1; + } + + public function getLine(int $lineNumber = null): string + { + if (is_null($lineNumber)) { + return $this->getNextLine(); + } + + $this->file->seek($lineNumber - 1); + + return $this->file->current(); + } + + public function getNextLine(): string + { + $this->file->next(); + + return $this->file->current(); + } +} diff --git a/vendor/facade/flare-client-php/src/Stacktrace/Frame.php b/vendor/facade/flare-client-php/src/Stacktrace/Frame.php new file mode 100644 index 0000000..04304b3 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Stacktrace/Frame.php @@ -0,0 +1,71 @@ +file = $file; + + $this->lineNumber = $lineNumber; + + $this->method = $method; + + $this->class = $class; + + $this->isApplicationFrame = $isApplicationFrame; + } + + public function toArray(): array + { + $codeSnippet = (new Codesnippet()) + ->snippetLineCount(31) + ->surroundingLine($this->lineNumber) + ->get($this->file); + + return [ + 'line_number' => $this->lineNumber, + 'method' => $this->method, + 'class' => $this->class, + 'code_snippet' => $codeSnippet, + 'file' => $this->file, + 'is_application_frame' => $this->isApplicationFrame, + ]; + } + + public function getFile(): string + { + return $this->file; + } + + public function getLinenumber(): int + { + return $this->lineNumber; + } + + public function isApplicationFrame() + { + return $this->isApplicationFrame; + } +} diff --git a/vendor/facade/flare-client-php/src/Stacktrace/Stacktrace.php b/vendor/facade/flare-client-php/src/Stacktrace/Stacktrace.php new file mode 100644 index 0000000..0ba74e9 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Stacktrace/Stacktrace.php @@ -0,0 +1,126 @@ +getTrace(), $applicationPath, $throwable->getFile(), $throwable->getLine()); + } + + public static function create(?string $applicationPath = null): self + { + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS & ~DEBUG_BACKTRACE_PROVIDE_OBJECT); + + return new static($backtrace, $applicationPath); + } + + public function __construct(array $backtrace, ?string $applicationPath = null, string $topmostFile = null, string $topmostLine = null) + { + $this->applicationPath = $applicationPath; + + $currentFile = $topmostFile; + $currentLine = $topmostLine; + + foreach ($backtrace as $rawFrame) { + if (! $this->frameFromFlare($rawFrame) && ! $this->fileBlacklisted($currentFile)) { + $this->frames[] = new Frame( + $currentFile, + $currentLine, + $rawFrame['function'] ?? null, + $rawFrame['class'] ?? null, + $this->frameFileFromApplication($currentFile) + ); + } + + $currentFile = $rawFrame['file'] ?? 'unknown'; + $currentLine = $rawFrame['line'] ?? 0; + } + + $this->frames[] = new Frame( + $currentFile, + $currentLine, + '[top]' + ); + } + + protected function frameFromFlare(array $rawFrame): bool + { + return isset($rawFrame['class']) && strpos($rawFrame['class'], 'Facade\\FlareClient\\') === 0; + } + + protected function frameFileFromApplication(string $frameFilename): bool + { + $relativeFile = str_replace('\\', '/', $frameFilename); + + if (! empty($this->applicationPath)) { + $relativeFile = array_reverse(explode($this->applicationPath ?? '', $frameFilename, 2))[0]; + } + + if (strpos($relativeFile, '/vendor') === 0) { + return false; + } + + return true; + } + + protected function fileBlacklisted(string $currentFile): bool + { + $currentFile = str_replace('\\', '/', $currentFile); + + $blacklist = [ + '/ignition/src/helpers.php', + ]; + + foreach ($blacklist as $blacklistedFile) { + if (strstr($currentFile, $blacklistedFile) !== false) { + return true; + } + } + + return false; + } + + public function firstFrame(): Frame + { + return $this->frames[0]; + } + + public function toArray(): array + { + return array_map(function (Frame $frame) { + return $frame->toArray(); + }, $this->frames); + } + + public function firstApplicationFrame(): ?Frame + { + foreach ($this->frames as $index => $frame) { + if ($frame->isApplicationFrame()) { + return $frame; + } + } + + return null; + } + + public function firstApplicationFrameIndex(): ?int + { + foreach ($this->frames as $index => $frame) { + if ($frame->isApplicationFrame()) { + return $index; + } + } + + return null; + } +} diff --git a/vendor/facade/flare-client-php/src/Time/SystemTime.php b/vendor/facade/flare-client-php/src/Time/SystemTime.php new file mode 100644 index 0000000..8f24a7e --- /dev/null +++ b/vendor/facade/flare-client-php/src/Time/SystemTime.php @@ -0,0 +1,13 @@ +getTimestamp(); + } +} diff --git a/vendor/facade/flare-client-php/src/Time/Time.php b/vendor/facade/flare-client-php/src/Time/Time.php new file mode 100644 index 0000000..989212d --- /dev/null +++ b/vendor/facade/flare-client-php/src/Time/Time.php @@ -0,0 +1,8 @@ +reportTrimmer = $reportTrimmer; + } +} diff --git a/vendor/facade/flare-client-php/src/Truncation/ReportTrimmer.php b/vendor/facade/flare-client-php/src/Truncation/ReportTrimmer.php new file mode 100644 index 0000000..e8e18a3 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Truncation/ReportTrimmer.php @@ -0,0 +1,41 @@ +strategies as $strategy) { + if (! $this->needsToBeTrimmed($payload)) { + break; + } + + $payload = (new $strategy($this))->execute($payload); + } + + return $payload; + } + + public function needsToBeTrimmed(array $payload): bool + { + return strlen(json_encode($payload)) > self::getMaxPayloadSize(); + } + + public static function getMaxPayloadSize(): int + { + return self::$maxPayloadSize; + } + + public static function setMaxPayloadSize(int $maxPayloadSize): void + { + self::$maxPayloadSize = $maxPayloadSize; + } +} diff --git a/vendor/facade/flare-client-php/src/Truncation/TrimContextItemsStrategy.php b/vendor/facade/flare-client-php/src/Truncation/TrimContextItemsStrategy.php new file mode 100644 index 0000000..7e0ca9c --- /dev/null +++ b/vendor/facade/flare-client-php/src/Truncation/TrimContextItemsStrategy.php @@ -0,0 +1,44 @@ +reportTrimmer->needsToBeTrimmed($payload)) { + break; + } + + $payload['context'] = $this->iterateContextItems($payload['context'], $threshold); + } + + return $payload; + } + + protected function iterateContextItems(array $contextItems, int $threshold): array + { + array_walk($contextItems, [$this, 'trimContextItems'], $threshold); + + return $contextItems; + } + + protected function trimContextItems(&$value, $key, int $threshold) + { + if (is_array($value)) { + if (count($value) > $threshold) { + $value = array_slice($value, $threshold * -1, $threshold); + } + + array_walk($value, [$this, 'trimContextItems'], $threshold); + } + + return $value; + } +} diff --git a/vendor/facade/flare-client-php/src/Truncation/TrimStringsStrategy.php b/vendor/facade/flare-client-php/src/Truncation/TrimStringsStrategy.php new file mode 100644 index 0000000..6cb9ad4 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Truncation/TrimStringsStrategy.php @@ -0,0 +1,35 @@ +reportTrimmer->needsToBeTrimmed($payload)) { + break; + } + + $payload = $this->trimPayloadString($payload, $threshold); + } + + return $payload; + } + + protected function trimPayloadString(array $payload, int $threshold): array + { + array_walk_recursive($payload, function (&$value) use ($threshold) { + if (is_string($value) && strlen($value) > $threshold) { + $value = substr($value, 0, $threshold); + } + }); + + return $payload; + } +} diff --git a/vendor/facade/flare-client-php/src/Truncation/TruncationStrategy.php b/vendor/facade/flare-client-php/src/Truncation/TruncationStrategy.php new file mode 100644 index 0000000..ae29d45 --- /dev/null +++ b/vendor/facade/flare-client-php/src/Truncation/TruncationStrategy.php @@ -0,0 +1,8 @@ +file = $file; + $this->data = $data; + } + + public static function create(string $file, array $data = []): self + { + return new static($file, $data); + } + + private function dumpViewData($variable): string + { + $cloner = new VarCloner(); + + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + + $output = fopen('php://memory', 'r+b'); + + $dumper->dump($cloner->cloneVar($variable)->withMaxDepth(1), $output, [ + 'maxDepth' => 1, + 'maxStringLength' => 160, + ]); + + return stream_get_contents($output, -1, 0); + } + + public function toArray() + { + return [ + 'file' => $this->file, + 'data' => array_map([$this, 'dumpViewData'], $this->data), + ]; + } +} diff --git a/vendor/facade/flare-client-php/src/helpers.php b/vendor/facade/flare-client-php/src/helpers.php new file mode 100644 index 0000000..f54ed0a --- /dev/null +++ b/vendor/facade/flare-client-php/src/helpers.php @@ -0,0 +1,17 @@ + &$value) { + if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { + $merged[$key] = array_merge_recursive_distinct($merged[$key], $value); + } else { + $merged[$key] = $value; + } + } + + return $merged; + } +} diff --git a/vendor/facade/ignition-contracts/.styleci.yml b/vendor/facade/ignition-contracts/.styleci.yml new file mode 100644 index 0000000..3f78bdd --- /dev/null +++ b/vendor/facade/ignition-contracts/.styleci.yml @@ -0,0 +1,5 @@ +preset: laravel + +disabled: + - single_class_element_per_statement + - self_accessor diff --git a/vendor/facade/ignition-contracts/CHANGELOG.md b/vendor/facade/ignition-contracts/CHANGELOG.md new file mode 100644 index 0000000..e1b2f08 --- /dev/null +++ b/vendor/facade/ignition-contracts/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +All notable changes to `ignition-contracts` will be documented in this file + +## 1.0.0 - 2019-08-30 + +- initial release diff --git a/vendor/facade/ignition-contracts/CONTRIBUTING.md b/vendor/facade/ignition-contracts/CONTRIBUTING.md new file mode 100644 index 0000000..b4ae1c4 --- /dev/null +++ b/vendor/facade/ignition-contracts/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +Please read and understand the contribution guide before creating an issue or pull request. + +## Etiquette + +This project is open source, and as such, the maintainers give their free time to build and maintain the source code +held within. They make the code freely available in the hope that it will be of use to other developers. It would be +extremely unfair for them to suffer abuse or anger for their hard work. + +Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the +world that developers are civilized and selfless people. + +It's the duty of the maintainer to ensure that all submissions to the project are of sufficient +quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. + +## Viability + +When requesting or submitting new features, first consider whether it might be useful to others. Open +source projects are used by many developers, who may have entirely different needs to your own. Think about +whether or not your feature is likely to be used by other users of the project. + +## Procedure + +Before filing an issue: + +- Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. +- Check to make sure your feature suggestion isn't already present within the project. +- Check the pull requests tab to ensure that the bug doesn't have a fix in progress. +- Check the pull requests tab to ensure that the feature isn't already in progress. + +Before submitting a pull request: + +- Check the codebase to ensure that your feature doesn't already exist. +- Check the pull requests to ensure that another person hasn't already submitted the feature or fix. + +## Requirements + +If the project maintainer has any additional requirements, you will find them listed here. + +- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](https://pear.php.net/package/PHP_CodeSniffer). + +- **Add tests!** - Your patch won't be accepted if it doesn't have tests. + +- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. + +- **Consider our release cycle** - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. + +**Happy coding**! diff --git a/vendor/facade/ignition-contracts/LICENSE.md b/vendor/facade/ignition-contracts/LICENSE.md new file mode 100644 index 0000000..48c30e4 --- /dev/null +++ b/vendor/facade/ignition-contracts/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Facade + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/facade/ignition-contracts/README.md b/vendor/facade/ignition-contracts/README.md new file mode 100644 index 0000000..9bf3e6c --- /dev/null +++ b/vendor/facade/ignition-contracts/README.md @@ -0,0 +1,36 @@ +# Flare contracts + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/facade/ignition-contracts.svg?style=flat-square)](https://packagist.org/packages/facade/ignition-contracts) +[![Build Status](https://img.shields.io/circleci/build/gh/spatie/ignition-contracts/master.svg?token=d92a2ec635d3e408b1df80ba214a5e8d549dea09&style=flat-square)](https://travis-ci.org/facade/ignition-contracts) +[![Quality Score](https://img.shields.io/scrutinizer/g/facade/ignition-contracts.svg?style=flat-square)](https://scrutinizer-ci.com/g/facade/ignition-contracts) +[![Total Downloads](https://img.shields.io/packagist/dt/facade/ignition-contracts.svg?style=flat-square)](https://packagist.org/packages/facade/ignition-contracts) + +This repository contains the interfaces used to display solution on [Ignition](https://flareapp.io/docs/ignition-for-laravel/introduction) and [Flare](https://flareapp.io.). + +![Screenshot of solution](https://facade.github.io/ignition-contracts/screenshot.png) + +## Documentation + +You can find the documentation of this package at [the docs of Flare](https://flareapp.io/docs/solutions/introduction). + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. + +## Testing + +``` bash +composer test +``` + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## Security + +If you discover any security related issues, please email support@flareapp.io instead of using the issue tracker. + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/vendor/facade/ignition-contracts/Tests/SolutionTest.php b/vendor/facade/ignition-contracts/Tests/SolutionTest.php new file mode 100644 index 0000000..2901f90 --- /dev/null +++ b/vendor/facade/ignition-contracts/Tests/SolutionTest.php @@ -0,0 +1,18 @@ +assertInstanceOf(BaseSolution::class, $solution); + } +} + diff --git a/vendor/facade/ignition-contracts/composer.json b/vendor/facade/ignition-contracts/composer.json new file mode 100644 index 0000000..5d53bbc --- /dev/null +++ b/vendor/facade/ignition-contracts/composer.json @@ -0,0 +1,40 @@ +{ + "name": "facade/ignition-contracts", + "description": "Solution contracts for Ignition", + "keywords": [ + "flare", + "contracts", + "ignition" + ], + "homepage": "https://github.com/facade/ignition-contracts", + "license": "MIT", + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "require": { + "php": "^7.1" + }, + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Facade\\IgnitionContracts\\Tests\\": "tests" + } + }, + "scripts": { + "test": "vendor/bin/phpunit", + "test-coverage": "vendor/bin/phpunit --coverage-html coverage" + + }, + "config": { + "sort-packages": true + } +} diff --git a/vendor/facade/ignition-contracts/docs/screenshot.png b/vendor/facade/ignition-contracts/docs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9581f014845bab7e9c4a877c4bd8ba342175d6 GIT binary patch literal 406900 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

^d8^C zJcq%dLJp;>et=5!=SGJd5{97RP4W$_;`e#RZ?NU1Xd;UjD$)!Lh=ul$7f!9C$uV9^ zrNv~@X?hoooQ@%>c{^>b4hfW*^nnkLcWl|EUA2Xk(s_($#(rcxIkF2-(bS)zs8&GF z_iz#@Ph`Jhge2b%eR z%92MFpDWRU#KYhG3r;uCC(qALVaxYF!+7X))T#2UF4G}XV+?K(F@rv!qDgq;TTxC5f1Vi|cyV^Q&Zwj0RQ(p!W@V8hYE;(W4-)D^5u&(Npg||?lN9l|xF*VzOM{R7pzw2P8y8|@rTqbJ74!nJH&w_& zc+wqcxwdLk72V%A!bU0@#NKj8>bAc(g>y>e32Q!;&$?XD7EsN!(tLsXe78gLJDsOp z)ZE}+*Xsj3Otp!eWmh(7MzfQ!$a>rdrnRes#_0FLo{~w7SZI}wS{YE>p`BSi;dz_8uycqg)(_1m7rtoeZJm2%Li|Oh}TGfhxX7W=xt`ob3@3OY=q5 z4?z^QVqu)`7#ZE9b!@@U$X6CFXv-Axmp5$ysIe4Mhr@pq7Xy50V1D=-!!yFm{`*@f zf$TM0;s^bga0%?eHD;)vX@V>{jF}9bwOVY!Q%=rMyS#RPZr!R(j*!zdkj~EnOhznu zTe;%}N%i3&$@Ejche2WdoBQ@7oM--Du_cJ~zr+^cZE}Z0pjRD(eGuOuY=4(lkr7#_ z5nFpW0l9Fm>`Ja(?D*(k6nLRlzfc?s*=Y~5y46rbe^7AVUCe#6Ir8A(h#7eP9!B;x z{(rIitp9I^JHJXy-~(t(F@Nf`N0lJc=Ye}K_TlxyS<{0N^tvbE_d16{r;>&kh<%c5 zLWR=ffcn&VUy>FKFY#}`W_?uPKj6Vgf581ONA*8$Hb2}SooRDEaQX77^q=)Yd6)l# z3xG&3fR*xpxch#5dJPAcFu+InK@R*QnCPGX{*wInpyP@5x|NU)|NmF=f4PePacSR@ zy{e2DMX`^eY7_c2ud|9f%j;ho!Z59?z>FO#wywyRdrOg_kA4*8p9pWb`kpt(M9 zPOi|MNF~tXDcjN57$?SK|Ia6H;(KQdx#`+O&yJFA^M#Qg)Ej#-nbr7rfBgpk>xYs9 z0TJQv8|^>-5-K#>?Lno2NbyE*7!kCLf*2J{hZjtV+8#uuE@-CA>}WAT|FUTnEQrd| z6vU8r9ZbM=VlkU7n?i=l@1TxYL5h{}KdlsSk@CBq(y^C-{fpi8$5E;E{1{W8a2}v% zQc!O-QD5T|gYbWk3xB=3_ixGG+kBeJlf(b}d4Bj}T`VQTsk4BPir)tKs=xu(S&$7@ zyb$lufB6SRl!{a=FO*5APTs+zxn67&rSo}UG3vFwYqS;c<^J|n^!~Cq$8`Wou|+ng zvg#KgoyGI>dA@@^1*umXdJWCwwcve%*eSHuB3qjt(Cf^%H!u2}OHUz*3f4bN#tNTZ zO`g$J))ZL-1$3^oq8MBRd7a*#u@!x(Bm+tpM8n>D#y;Wk(g$2__scS68?`z6wVe~J zjeX%aR4{OUwg`V6vdn+AqYU2zM{3fBoj<$D^^BKr*$00#vmJ3PvpoPPP=)`HpoYraMh3~J=Ho#RrU@30*TSR`(TbSb&FBqTaD>PPPX;?hgJYeY^ zM9O&?qxs#?S9G18A35gRyrVD~oe$^7a}_Kl)45}8w6!1wy&vH|M7}@)Ny{r1+*Jt@ z#28GbUxrV3w#ef6k4?=g$NhbZJ0 z%&_k`w6f+%(!wz6v_Kv$AsTw4fEyuVsh(oS@86;|xo=@#9VLT=L4bWM#*hekr^`=YQ00Fk{=e=aD!r8*dY1SZNdTd4}b*U4+FM)iLgN zzI60=+*8`?Q+w-rbL|3`*#Pr=_n6|Az^1@yHrrOPehFAJKpm)_1RczsNLv6iBq{y) z-D-rdG_i6@ENNP2AJv$^ox^L!K|=;~`hCND*Wx8rVnKv=5>03a6D>u`IG#F!mDrE2xJ z)abOhLeEw%Fi_6d+7c8VRmx{|ATDv$I!8hZ5<8FN&yu1#e1S*OfCdS=Qz>UFPP8dj zdgmu=;l)wDoUSVrt?xsgfPJD3<0P2dL8q5+$ z5e*jMoK$rlPxi;O{N9&{$ID)DXB)kN;byjSS@_Zk4D|Eme|p185z;3!V`-hFPY-8h zxmJBBJO2a{tgmKBC^>~C{zj=kXnIsDv8~OVDr5-csswktR2vF6W-=fx+`QvH_$y~g ze$D*}U!%7#=HD^yhaV8s!@y>ZHmku>-WO|^<{Y2J@W>qs9GQ*O)%>FKZakkK@vxbe zVR9~1*~GESU7Ze8{W^4ytng79ZTaAOJPTQ+%G5cqyhmd+D!EfnP{h-rK;InJ_G*(_ z%z*|oVH>Pl(QkRPB3uqKNv@6^sP4ozg@ue)X(CTU4thY^SCS zJ{M>8nq{#0mDr!_)S1>!pp>SKlE#t|{`g)dUHNT`&r5X`?4}nNy~egJj)tn`Q-yXj z`>g_AQCKe^5H|QVuFvhQ?Ik5l%%itT$V~YgRw+-iAgzGkw_G5abk(eO zg1u+1cp~L4$b6+m@RDH7M(tj2%KZ+AB1J0gamrCF8~4KHi&)9-co{>w9i9w?_d{6$ z?=U|8TF<9V4=*ss>6}0fnO!x5xTE_mA_cL~W{sRDSL)OJJM*XQd=*Y#Wa{Xr6`bn% zbp*TX_${p;Q`t6Lu9wv3=&HFu9_-?(*1BDv{G)eOpkIH@S4wuGRD})}gNjFjXHes! zS?Nq`tivF%J!Wpz3;{m129DDTaqbAYX}jLV7Ur0UKnjP}EhhefrMzB=tH+l8V_M>> z-PJxrv9nnZF;9VMcu{$6pTD}>U6XnXzi)gcNU`$ug6_olpALb{idj+m)WX-Iy;;H& zE{Kvj>QX$E2uRm#3Xr)KMciv$A8+o@Av9Y?rO%+#w!lmyPA`N{ip`h;2e5{tOE8IG z$}H7vMGq38o0u)oQkm^!sq`0QVn1$(+%V>@Z4T%)xh|0DuXk8U9xa3j2LqPfXaD_icxp~Ig4Gju`gl2yisXC`c z4^7MVJH*QUt@M}oG*C;To#=69t8K`x4^_bqk-&Qn;j^E2oUbviRL)S!hwlkr=*iF& z0CGvJRWlh+@ao3e5l75`?Oh2?GK<MZxlZ*TaRYY67SK8g;SrX95)Q`HFk{p4t_I|b{V+jLM&+=nPdUwAI$9K zJ2xuMsEKRzXu-)6_OSwUFl)Opa{6diRAt!<$cUuxGKB=zHIWe-W1g*82Tm2 zJ|n2anGMJ}(z+1S7oIo>&7DZmH@5hTOo&r^?}F6^-hd$s(QI=e$2_j9^}pamC%>)~t-NfBgWm&+5XWq42!XHNbq@W`(f} zNu2LSTzjq-EN=Z(p2772OCo_jmE*YQ@XoIM5`P*k6mtMUA*%!Rn(F7npJadK%LH~_ zIQ89o6NCA;$!s2hBcbMKRpT6IyX$Nejoz9e$&~sA&8L0*3M*I_dIv?SaeaF(G2lTS3f(#~>u zIMtWa22h%dmC_d**kF|MrE{d`q&;%^&j6oFVE{fltbldrP;cY+4dX+rvg)~K0BS8f z6osrdU*3BDH&x>VqI@?&%<~?suVw13wc4#`lg9}f(6iBb|1K84W~FDw@e@!n2Za;( z{r9r_FX-nZ;-|HlQgEQs2Zd)*MEdqCvF&E+PSM)q_9c-N)^%8C}Z>%jr1j|+4ki!Y;_OOXo&>`PliE^q91Z^+~u=ibLW_MEB zJwIaYVKq$bR=0ETX?2M-Q=TI$SW~lGrRPNAf3P7GHDd9=tkP|FM?gAoYTUb43iEZ^ z85K2KOfDCSde93A%`fi~%NwGC3byL07nbK^v z1lwpdow(yg5c{Id^?rxyX2V`*IK?L9?w(JM28t!hq_+oSQ2=^}PbHt6 zE6rrqr%0{UKz-3VbCvkPCf+yjD>~Ltw+nIL_do~H`h8X^GU zSLzksN5hLi0t9*vOJ_fD(?ZM4B$fUCD?X@`{XBG0d%= zv#{A1@f%P`9b66=3R33KvF>_b-i3u10=HhAYo%+0ek@OGUw zW`m9$ghHl%TcsKv&~K|2SE)_zZ@^jEqOD!w1pH@2x}MZp71W!*Q{Dk}5)6F>*YW5MV0-JH9tJ#JSy$4(I0q1&kv2g0^XDG+Zu%D?$%$}UQFqzc%^=UGttgmAqqHJqDtC(&ua6pXC3%ErL{f==TM zZTbQg>?_mzC+H!X;fCIjOcHak!y}U>Aq3LvgLGp&GZ6zcdS$jMzUi;a1g}YAsKiO! zPP$fXNIG^Sq~X-&@DOx#UhGiJky2@s$K-|YHDQk$_0ISklW%QZBZ={b1OAaVjaqxG zLYjlUkHam7`=fkBS5h-+S#{@szEjNp$VjD=|BYDhrvanUvpQA!KlW$6{xfefaoeZR zLAt_KUzVv4pEYu%dUQ*mw{kzI3a4{dU)7+mZunWXxzbBbD}EAtuM81_@c~&aWmwkT zELu#oAwin$n$YHa(CRH+F1-4WwAj3%p)?6p7PdxiXti=@tbrQUdQxJ{$E!KL?}K5U z<(yNM9m?v5Y`Z1Ch4VN0gGMSH^Ne6GSmY=bkNYrSi}Pz2uMf7^67h8*Sj^I!!ZUj8 z8`44}KoMj(SQ!V>R-bM3fBpUm0n+k{@sxlBNB{(0q77CIW-lobSq7*fhi2*tF{zWk zZ1pW6LLOWn!H$8@fNK z2}UM&dI!(Om*ff=pH(#FE|MG;!lzgUb{%HHeW zMWi8E&Q^(I#Jj7;2AYf!z3G*~WM1Y1aX?{Lk~kgizP;F~G+>?})6e zW4m~nqgbIG-!dJZZH$WDx83gS#cVVho4F)z7GJEK!|=7p-ckv}Ge~^UW21+U|75Y8 z((&BL_G{?6Tg4ku99dtHz@NW0fqYh%ha83;s9G7+@-&H-%etcH1P?gngJn}Dztwg^ zFJD=91HeXUcq_T`A)O{Y3A?%K%J_)9?2i5~^CssjWbF<|=uANmn$6&22%t>`FPEws zj81vg&qBO;vg(A{V7-6>RJU=+IiDlSB_});ODhoKX}-*}pS?v9c(}@ZAO9|*Upk+e z5a*A-rFerCo{B5a_XGwg?CTe3kEouII1t>H$RG1nPo8Y^uvA5WB6{pszW{A)x;}WI zY=#NO@J4K~Sw-Qh02?eaYhBBBTdxl$$e5##Br>hQYc(Dw#WHHtWM>E95_@Bc?35+m z(->m#PjMRD4#e#+XM-sUl5r~~PE=DZr2z;gozEx1O^C^=>?1P|fKmZ>M%-#|2oV8P zA&MV`6uQHdDA`y6(u4lX>W1CUv1l=Py@^^chkLr@3#9!{$i9am8TW|-N+_A_pA*qw z7nQ)?rRz-Mp0%D}P~M}%&LF&~gtJ-#>~!{$!!X9&zk(S{;$KS(Bj zyscG9b60GQ3^Pd!W3samaz5nud_2e<++rUU9*F&rFbPz%dI_22PF=r-FPSJ*5Q%@6 zV1%cQCuxLzD{u3-iBTS9TuBvulk^7|BPEu@1k90@+Kp@C5=&4{3Z;YzBp0ZmIBuL^ zI4?l*ps0uXRrqN@WW2`7`gZ~!0WPV&!Hd|O`Oc_zptOp#{f>@SM1#0^XNguL{Nn@SpF@kKN)bD>@^OhwpGe4?*xk_> zL}XR0DMv^GFc)o2^%rY>a&o?vbG;`d)z8t~2Oa@H>%I&x2ZQmN9gO|OZDw+eiod4@ z&;wgWH&g>;!UZg%825X?Oouki`77*C(&Trphv;xtw$2jEpY4?2PIbbS$aT7X+3{r2bg zU9)<%=dujuF23j7Xit^HgK(42Nep{G8S;Y9C}RD-a=<>vpapHKCeKT93PH7e5n`+H zl=pn?!;k5gs>*o! EzaaxdH^2WByGXGXq-jez$4x2i4TvdfvR)Eya=ya`remn3 z%Aj6^r%Vbj*o$?RYaoekEUiAl+A>JTQ$r4?vq9OcHo>y_Cv~rrn^MxtXXq4mpXvXi z;da>`1UWU)mb2Y5#0vQ!`zdxk*wlsk2Ig@*Qfai?!)iC#$qkY$flPF8?3@^&P2QUQ`sq@gf-!P7;0M0nmgz&j{T{B%P^J1kHCdf1CU_iaqRC%>UbU_EbOHTt~JsLJ|4 zSiRBxgLadvoNLq*laC+ac=k7rBK2w*m*rD9_3KefleY!!>V|EM8S_sLsQ?r-iD^5- zMRlwabPvONQN&GU2g>_}J_H6Y={Q7I7mfe|u{X7*6`0x0?keTlG~WGxTm~M+Hju7F z(M<1jr5~+VAHQ|$>fUkptQHxwrQkB7mZ&mV*YXV`>K4?5oL#G%9MNc|oNpshoIKol zr0g{)%~$q%8wLTZnY;lR@bzGNAgsz}gt5t!#{v}i)cnyeJ(|l0xoAyEd46e##559C zTgdsC8_~gpVUEI(^sGc>sU@1#n6-5=gDgb?$iTK)HhTY6v*RP&FEbeLmnQ+`lJTHo z|IB+dKm|jY^9Zz9LOlcfOq1;Q{TENY5R^&2^Pjpqkw8mCiR00*gvX8>0>#7WI@@^R z2bs>v*7E0ml9Tl)p`Y4`IfimIMu)JBmAaAWRj4j=gU5*Ppip`xBKF?Q=a9Swq z*om56-X+4ROQxDlW`A&~3a6DO@4rMx#@&j-hD3<4C{)mm{{C}FjNS7h6HvW~_`6%R z)NY3x{$P_nM=N0Cv8yT&#s-7DpOBxQA8cu4*fpu7F`d3xopugXdE6KjNH$37v~?Ws zEkNPwmwXB|ZL0?(8l}JKLi?OtOThHqM{_^~1Ww)={`Zn4;Tr*u&!$P?d zBDeo$n|LsH!ttzI4wbM@vXWM@Ox-(~btKr_!;ONU;%tAzbc%r{sNb>ES(C|u z7*d)pa&p(|jcVKD6BUv#uIK4Yq4hPy#sd|JK{5;9{;6cCz&GS}mzU~Gd=!HlG5SB(rs)ntN#+9-fzq)C zVdMiIW~WC>9{d;HPX&0&h)t7d^25)C8pH- z>Hg9h#d?WLe{xD`iO16_PKxt2xK@ zAXsM%Dz}9;tYb5u&#~-voyQZkNRFraGoG#n33-lM5rzDY&UK6?4>-gDjb^h^G(YXz zRf&rLbuc8Wu{^@leU+DbCLH?iDJrK^YW(v4*Q|pX>pBbTI9TGHITU1x^gwG?E@J-k z##mVaGdmo!#j>E|WHjjPZWHz27Px{fg=;11p2MhB`_siRD<1XVe}!PYn;;_9KVx*# zPXh!nxU-c}N;vgmol21$goUlw!(2xl^UOaup%z6uyL;G|gNHNgwHx6iFEg=N(UtNP zN%YU))bVQbYWM8XLr{g;f+1tWHltFm(BEaOK2b^if-aX{!{_v#gb2E=)G~k=C(~bO zm8feI75w6)<7oJjj(s?!GE;B=%u;)O9`EjUWdrU&dv!x$&jI5( za1^-R9E;-ey5c8k=g+LPe z-MrGZi@zb6c6J!3$xSo!cy+3bzRl8x9kYaY-8WUpB$^~Inqv5;k%ZP~U%+grOr^cn zqI|K{2hHK#uQCBKI&irb89*rdxa~BO%E;_2qSyYD^#sKE5b_x+G54!HGE}T)d;4RG z3<5vuH&Ed9MV5n6qAs5Uzdn^@_?Os-Eo0G{GtGKB=A;riCkS{ee4q{Zzd;`-069LM zS3aFuEFV`LX()7{np^3jjrh*A?QLjAedhHiIa|uJt&9>Wgl(wuC_>8N|;#MIB+% z_cgzQX8~WA!*&6{X5P<5rM>QtyZa^5z0Tp)0Fj)Q*^vF<`;^&A#I#msA{rESkY0-` z+s5E;YJ*RiNqGLGgCj0xT**9b!nrfE8Kj7qMU#IPzTx^e6RUFD-bL;fw0th5aN5nM zA;H-F4=#XzFvgTAk{aHz+glwibJFIoTZ`sFaJk8m?ZFVL2E9Wh@4C5cR%iTW6}#Y5 zS>n4^i>kp3O@jzyX>(V!Tn?ku)WwS8Um}_KWnWI86|h*wc3uB8*N@xxgf>nlY+{mt zE7rDEb&5hKMAvv~RYiU;|4!Q%Cw6?{<8Y-G4YHVRLdos^<$zYUb?j=hi@Uuou&OHl zy+!+OWH^0*y!Yw)*d;+azNUg(e$FU-vgH`3ze38gGOCz^B{2!p#zH)e#m|{gE^r0-)=3 zFe?@lSWg>abUbT)U|!MsXN$)J)E@3@{U&kuxZHe0FnkcH0o)?TmM4RFYkf3Zlteqc z7%@d@SQo?5H^J#Zwf@OGSom@4m$aJ)kdScq3Lz#kEDf`_p7ZsoW_?Up9e~V{jh^`W zz&hAya!Au~-W|p}Q|fGV-DPqEnfyFwBE%xnSz|aHGXGP=sa19RTFXyZ6z0mzGo6Dt z+7*k{qdo^A)GP~N%ccKN7pJm9=muCHP^geV8uB+0^FP>a0L1whjf!9koARw{PYqcV z5f28?r%}rf7H_zZC=t1X7i*Tr(tM+cPR*nf;|HmJ1W7v{34;)O|C=shr5z4wKz=6`pD{Mr&X?J z)N1Sk?)83$LK4J-T7e0xqyf9gKXz21hDgzsd++gBt|eeA4Bf_OWoT7cl=W!IfvC-iz zO=zxS+8Iv4(&hJg<8e)_vbEBf#aCyprgxta+%thuihKSu5mIlj`)YRNVZ4pTgO31f zUc0o~!GHF4!V=>Uw2K^m;8qbthneny+iLfEY*}o{M%|O zw5y3CNdyo823}4}OvJ9~am)C&D)T5RGSXwey6&At z{1tcZi=lh6Y9yh?T3LxuU;Lw?fLfyeBGnm5)-D`XyFnhQ#!1Tv8f zeO+#$HCKSp{Z1{RK<&hNyhBv9K)vC2g8LH^mZl<)l4p2XlBAMYLT}s$AA>D?s)dn)rLJTdTtq_ra?pYNGEf<{v`n)|Mxu)w2wR5y8l-fyO^1`*} zyq|f(vY~>C@#{CQWDDcFCt+2<>rg2u9%DdaO{^oEsVM99(fj$xvgC6|%7-_ovo>&wk_N(q4bZ?4is-3(_KwpBp3 zIYP5=)fmY2Y>-M=R;rWt+aD;$6V~r(#JW&T9y^d+0*`|4(nodEtL!7Ip)6P1s4J;Q ztpQ@rX9u~YlL!`KZw!C}nk9n1n}{$l0#se@8)MS+Za6BNFtsXlE}ayhX4#ndL9qBN zuEY}Jk%)syIqD!9z__JBS+oSEYS2DmGdoq0I%%OtUC}5Ds1E1BBH>xhb*Sjlx`Wigjb(12) zr%I+l;l(Nq_-JD~>ldVMp?Tj$64?6u&-q~InD4eIwI$-O!{xM0MOz$;!ySp>Hy{AI zl05{!hVs8++OfQH{i-8^j$zKOw}3s)p@o4YZHDMr{ux<1e%SU49-Y~~p?ckq1cM|3 z_y|Y5Em#J8<DSQ2Oh9L3e;|{#Vh_!8%_>W2B3!! zN$2G$>|3AU9o5vzL-{T`H0$lZ(~*-$CBV=Rqfm}V@C&nfHq(;Klsf9)lS`}4mFf+c z#7e^N&qua*g#`i6R0t0nH~L=xjl3=#&?J?ZhsZPn)rd&`urF4J(k@L3oG#8? zcBk!GH&6(yDN9oz4<;RSZZM{=d()8O9=4ZEs*ktF*U)_mN9sCG=|e2!K1dz$Jmgb(T?GcKw$prKP*1yIUFrq@+8fk#6ad4k@KW>F(~7?i8fE zJEZ4uKlgv;nYCu#@P@Tm@Z-A9`Nn7OjR|it^+ZY4Y_)@qw~pDdxv_Nw$)qFESiVW@ z40LV?=i853;UUL3iv-t3y%0?^sl4+#h#U@H@Fn`K=>tduv|yMK|6TEPm9c|GRiZ+# zYWT-N??>^cYFO|5<{WE%i%{; z=3~6m1pp1a-<3bI?tgPykl$l3r;uhD<}DKbjsYa2KY=3KW6*wN;AJxxQotI-+^kA0n!(hN6K=U63$D!*Gx_*S-l`1<-q^(f-QToTtC1 zYnXW4ZYhIX1Wh~pGd$rrZhPyX1W_*?XLoi({WM+?&dRfvIk>OJ-{DJM+!VUCeFc1> zJ_hfanH=#<`b@}og!9@X-rblky&asvjl`&ME1L$8Oc$6@IWNVnrE&YN!N||WO4_Rg zv&nXx9}6Q~AMy86W;-{J>L5ATqQaZpCxDOLL86`|_VK9tC+AxxMfrx`74Fm~{V|fX z5wTZsQZ3@Ys7XI6NT(z1xH@z28R|~+5apFG63z$I3Peo^BKA)3bN*r#z^Kxd7R%s? zw)Uf!$k0obg}W;tm};wy4oAxoVBJBlI867w+?HHkh`6#`sKIeVIizhw=o0@kO46-* zVAiu{nx|TEIcRKF*4rvoxGtY;8-UAA{R-J&8Uoyp1^Wj>8uIA<<$pCBpFwxGw$?EB zGfMG|?}yMIZ%A6)FH+wrYQ**1f6#8Tq!+J{(r7K1X7II->h=!IMvWuXV`wg3z`^!{ zd%eeq?m3p$2=o4L3~5n>`_K(aD2@JWB{2P4N)@?}LV>NX#d{Tx(Ci+inww9#r^(l+ z>0b*zAeN0tqA3;fc#sJW2>_x3Yb$N1P<8&4j>TS9~iILaXP5sCq?PrlbA zn~<2jBk|XD?;-xwpXAh_sxGizE@UkKi3Yp4!@dtB-~Qhv8>r;=CB+@b-<&|mbG>p$ ze)wIy@{_*C$*vy{9{ekF^Dy)0QkvAb-BwM0x8Ad=D4x~PK7FEsl$EpVYM2k!?fFSo zD_xzkI$P63hx;`Ot>W{s0DPN}3ckSi9Li<+)knC*0^RSY!6jg?ls(n8{20;T-A@9_ zJZ)4(B7@OX;n#?`VUz({@*Uc(mNar{tRaO(OfF;sj7jJaF#3;!qMp znq65!?qva$p#P&M;CMg<&H>fv%HoneL8McrG!739UYN>f?o=pL7AaC4AoC7Z zjl&>2>F60L&9mPv^cqKbcd)G=Ir&vEm?ayuWk$JRp+q;g_IH0%NL3;<=G&jk$j6B= z29n+;_2Z5bJ~y|@&*Bw>ut=zI$jvN9v7DdXO-KPY>qklL`QzVJvD_tgabDLLAG>UO zrgpj%TtY_)<K5qtE(n9!!5Yap;q(COi4H1cXhbB^c&sH zXH2M!!iv|#obgK8-OzOvzc7)z2dus^>*Fpng0R-CMh4j%ENCar9h$(0q2F!0H7g+52ub2>Wj(<$ykzN8+fB- zW;t%4h99Fk{WaT~ipJpVecyYzWWu-FTqM^g{E*Oh_iXMA?a3u+#w8soJS^+Fk%=(h zsP1D6W!?TNot|Br`*6q#aB-CHUBNO`_O!%=Mw#&622fs}v_-&zWOP%X#BZLza6vJ} zupl=)Cewuw4Pm*tPO-pJTE#<;U|@z-CL#CT;-{yUQXx*ampn|#|2|LXrn;`Rngm2# z*zj)VYKvUW4v_?E<-uw)!St!6_KT(Q7JY8uaS)7-5;69U)S}gf>lDZ~4su!8HDzse z|GNA~5}X*bmuUarBI%3}Wky+X-*YccJ~;IKUovb??*bVyZTD0{6czN4#FTwH3aK0?6)=SL_W&!hJe3yv){uw3$Mly^ir& zU)6~e#&E_9WmSSZXxlBQdkO!g#>|!rYO1W~&8UYnvxiWcg`9JiKk`G$!oUtl1D|jX z2|VnLb^mm!d$Qros&h%k6NuOGV{hF!{o`^GS$S@13BK(ti*wqZtuubC!=}CukttV1 z^jVt>Yr6O%;1?ePkyM6W;$}RX;P3v=(5ZtmPv6lfE2C2Qt%IP?L(6KD^waORNm{JF z#B!+mU4e`99!Q zX)3j8q4RwNOHJrm%UND7=O;5FLKMPu7{+CN6EL=pY<2?OSH^)wx!++`<{W4DQGo@5e{naCjCl#Gx`h}FQ4GN%343BvLD0~Qp zvAgwReC2a}NHtwHku0rHrkqu;-{$*F)9~FmUULi4Y|!JZ%|AvYfmTV30&O>#ty&5c z8`w9rGIMKYGgg~Hl3$)$8jB6Vz$K4a#xcIiI%*ia{2OUn3}hz9GI;_m(0a&z++XH7 z)ZwkN|2A-ycSdTpN`lKaxiO_)(%5S;d%93#fHiY+@DZ-u2dpssn_L(y#ky5G#OE&M zb$}Of)1|%3=HsP>teQ#kzia+Q6L%O5G0Me<8q%$Khx%nUBdx;JnY+B(~kCu7t zp8VX-)e>^?Gl+5d|Oii#VuF=|yAHY&c=yyx!v;`r8xn zHHiQM&^k^>`t?3qbhatxeA1^w9t--WRnI*r&OjA5gb%}53AH=A+3}=ePrFV@B;?gg zjgNx*$7~osQ<-rM(hSV~Txt6#$bK?NJ5#*zb>qo!Grd=aVJz*&twz)w)G;iW4CV>l zsxJl|l+6+bBt>xLCPNP=r!^54z4h=Fd9akLw&!Qk0E&>YqR6p9?k=5pW17o&ThxoY zKy*hx<@8ZxzR3v>UkfPpRu45i&55hIk<^<8TX-dT%kh}elzW@V2+9VAM7!=I9aI<| zhk}@2P8&s(2J_0Ro!27gQvP2We=4q}#k7ljD0@5Ki{fbr3_*%2%ea(Q+FX7l_c?eS zE)beo2G!r7b^P< zQbM6BTyfpw-xDZJHpYFD)j6%Q^@&I4IFAUNZGRR>&bE@?&0{vp%h4l5y04rlDq5 zb@4|?;8#;-dV^O2zX%_e4qd}%1y%vf+um-w;`8Q^$yT=&I@;G8@#a`)`&b2Bn@|a* z&~GElA7$1*p^ypOe{hH^c(qLV>}k;WC}HtK^QlJ}-wSmN_U3@B#-}=gOA- zixcgTiZnxKzNWf1&P-7l@UcJdj(qL*4giaxs&C15P@W4i8p)+8E!~h?kvz3dLGSzC>1G-Qt%qRVazsO>8jge7iY`W<= zkm#ZXBBz#`SNER-sBLGEZ+J{aiu(fCy=(Y@ zF!}vo_lF*z6i@MH1`%|W7pbE->)tDJs08MBb|MnoJiC8tYL z9p(lQ-_lodAXl|Z881??!KE^YXU0xt58t55Sf*h*a^w4Wg$~B8@Ts#W0jKt}S9y5S zWsH8d%Q84tT{-zK&>AG~3ug_dHO(bj+bJQ3W-}*&2Pe=!yqSTdQ5aZzdhA2vb%%WS zE{%P07T}GNn@hYqRH0k8OL;sTJpzBK%q~zBZUTbW}M(wj*YC;`Z z%0j*pTgl*q0={iMl)0|E3%OJFhELTuN+ceqi&;O5b6VVeg9n+9a$JZ8UhOJZcqJz& z&ysfn{8*6n^Cj}0YwnN~g(=q*b&HGK2XINZ8{D>IK@ROV?Ow6C>&%OHROMR!Y_Wd> zDxq16)^3g5KeE|YHL*_xxYTd4Dq;+#>vDO-B|9Gc ztm*E-Sx--R%?9qEQ9WodHR6n~C4rQ+`?$Lym^|+^IET`Dbv~RdySm3Vtm+=`KccT& z5ucna7|sE&SrA&~^GE`p(lj0uUZaT%4uRGS)Vy*Y9{M?b&uOI*XNcDGr1at+Lf&*} zxhw6@KXs5*Q;v3KNE~+tMgwadpAGYTjL0fh+&qvqVlmyZ#kgulm$b!3Qns8AtT;u= zkB#xbTqaC2`E~RvGmQb=SxxS0u*Jpqc!{|+^)awPDdl0IKT|F%_V9!-_2RflDdnyw zkagF;zb1jRV`(d@Vww@5(A1tVGtw%hPNSWgIyk6X=pzA4U!HM-$Pfi5-BN>(JPc#c ziB;BEPkc}7K^jsgDKwj1$ut@|SyyHk1$=^c*iiSEi|i+k8o+ZCFAi^#81${4QV zS{Q0`91>xOSN%c|Vmr|RT@sND%6N2tDBBe^8yy({ca6~d;8|cyNfJc%qF8=IP2m?J zy*os_)e+x2I`1SUdWHcTxPSKgs`taG5ppn?slQ^;Z%J4UC1oMW8AID^Is)OAip3r@ zujsc>R(Ht_29W$I@k>%y{>~Sfajy4{=tCuhG?$Zgm#D8)xp1gN8goGol?+Ln&V#38 zoGC)5TR-v~ji3W6|GsECB16bKmt9{jog1dgZ0Jp(d?Itae2`Mc1pbg9pFOK;iDp+- z=GT37C-bsEE-P173mhQ67u$}G_vt3gzd068c&c-e)kii_AS&LsN$|V6yW)SJ!da-&)?dpHqq@v=Ht}4w9p03pC6` z*lnYA(3dp8Furb7*8fZeSuA;l$ZBgOOcwf2VZF75?eK{Xv~hlaup0DdOM07lW1FEl z#jhuA#$rqkPpTcgxCX7fFZO`hr>f zlGzOSTnZ;M5Mik?2>rg~Wyf#O7X?qp=yUOv`*y@UPyQ0zus664uL-!wL;e4tWB*KK z`6!N}Q5QX^w$KB_77_Z-aT=^|!LAyYi%EMr2r}TUWHLZ;oSGiN+M)%8laT8= zRvCN^HF&;@UUB*Q-li~XAKbcXlGSc>15#!iL*1$K*_!elU5(}Db8IQ}8g=_uR0x`b zwHj9K`|q3kH?##cj2Av}B(Z+3TZ=#+9Ku#V79O5fh(cPx1xCXN5jdqhFkEqzAgHal zklvIw))$&in#h9^BSX2wYvpH;O7t`?z!$w*9+Sx_yy6y*~xrS`H=Pnx?u70o{_XC+{*0A9iF`1bxp;S0Zx!*d>P#tn&0<;RG} zo>~2_LAE}pB_Yu5h;l70_wAn<*zwV3IQ=7W{QF-L$0cQ$<3)EELiH2ON$VqhLLmPb z&GEgRWOB1Vp~GTKgPzQbSWwl{hSxIUuO|%}!nG9zh9;f0+S2Bx#uiNtVSUh?jYxQ4 zih{^SB?*M?D|k=^wpaUCgoWyWh7KU&tNL9+br*lL&+m`G;rveF({I+vU$}YmKlORQ zR^9$%r5SxsIJWHH$H`p6@wSmS)RDVBbiAf|^Lqco0@$-L>h=?md55@!NPgAJJyk~s z>1(Yhq|Z+}GCUIDCQ#^ovzWZ@nfnQM3s;>nT2eL>V2swpUHmb>SiJSa*x#_QK2<1? zmxlXOClUSi8ik}}*n{;vyW`X(`F9w(D}R}I>yuc;GXSKf$~7f(0Hl~KYex2^j>1$re$bFQneGQC#v*1JHoYpPF?=~z=9coSGlPL<9uc>0ETkTfZ z=wyj*NHRu{aXF+XNmc9p;tx0z8cp`PSY2ekAB_ClyH$A2t0x_j(r<-?2ZIS~)TssCKJZQp@H%w_G0rBo3A1g$$62A+ycb&N_E2*uV8=ZBPq?`PpP zqx5Of{9`e#&Um&&<49~9#y-vFpmJoy<4VY(eAY7HfMHxD<+hs)IWR&)FwY&r3I;5t z*!3a)+V9Gbs+J8vB=R3!eXbU^sb~L8@YSrWbN6DAyD#<8hxAmC!Q+J+*dq3wHhCom z$(6#!5Gdy?z{FJfnD5tl)}Rsg+++-&?5q9+Cc)K=a+e`UIhQoP=iSoQfR+ctvE^)K z_Y&pNX-k&k9ZPqi7Xdzypsg(?57}Q2Q^_ZO!h=(5me5EBr@-au>_Ojd)%|#8wf**{ zgowtFwk-o2vGWhzc2Uz-N|zM|=_EYSAvN~4R329@KxU;$YkcTXzNSO|G(^m;@Kw=S zet(#+SHI+HTY_r!BNF70mgYLaY>}34gZB<32-wqZu@C!^6UTyTf+On*&V(s&CV(~X z>S=7XTq`Px)+=CnpkcU%?71<^gwATD`Q}@q@|EMS@FO%_ zZ(m{hUNybxohcN&#wwMD>$`gxuZ5a#0i;e>ePippk{9aIip6j%X`?WHzy_iTQxL?; zZ**p`D-!Lz^u$)I)c?maqA3?%x51-BRv))-%daaQ_*q!B>4Qwpt54pj}1xTvlr=VtRVMneNCXx!V zqv16nv|&oNWb3;&{R+C>(Ys$T0>nO)91LTUuy=g=Zbw=l1Xad2-8VrWz-<7%V zoB@};JL%4=QcEKEM+7dqx696>_i48$ey6G%2hspYEm%KKJLlOty841{;mr1|OqUpb zB(>@o4wvyf-~o18hT9_~4$>#H!e~pq(AI<5KJrpeKUwxWEp35Y_*m=)L(s{w4$ldP zi)dmnaCtSZng_G`_v73bNfwx((42XMJvjTPy#-kifLb;G{+4pqW;;zuvC1TezW8B{ zjul8bCrTVhw+%3CuykC5?Qeb;aEH*lI;y=BB#%u7p5vrOnHnP{m-=hk)pg>>QiRfYib8IA8T-z^5xaDjU#p-m> zm^9T+A@i4P0{U)RP0pD7b0sNR?)c?kNLBP0o96fHKt)E4#NF(r<^BT(vQJ<>`=XkJ z&2`Q_FRtFk%ho*bmZJT$`f{-&$ujBq6Ty{6aF|u98d=qh^th>GesD8+N98X)45&lN zWrC<%o8JPM>?ZFiOuimWiLm%?$07M_s1_?lIaEg(s^rU%9V%=^gV%LgpoaqOh0I7O zJ^0OGQ@HL$cOO>T8W?ZGhI1aZi>X$#GOKJ@*z+23x#bCEG^6cRG^tR4T=JBNe-~e%vtm4hMO9D2 z^q>8Aqd(eT5ih|Z4ZM;&^M`zV4D{s}>kv!i1V8|$(87eDT9%2>THW^yB(d-6f-d_Q z0v?xG<3S(7H>EQ_RW8O*$-c^4pyhjh_+V3zL2oLJrHa@d6G=0^w=91p$hgPL&3O*K@>C_ge*XsVWDXSs(KCxgN&0s}=d&_P zy4iF#ciLb>%I+P*Ud*v)tn#-w%+y}MOJ+j&t~8k9tY%i0_5rco`RVJazJOnD4#rky zF8iBQNnB3&7y2K>RwXE*aDMpZO89Xc6iHfaip2ZFMm%yZeO=Qp1tPg&(UM8lU@L0? zK_zX!t3oBoSkqU20$bqM+B`Q#ugUBMj(-!=<2A-ds{zo8K z2>d<2)uC18#oZh#U#`D>ol-<@NVZ3HKb8z(cQ*%y*8}bUB1FuT4J+?*msAVCAz5OA zVH1S&n#r~jiS1xK`{tfz5O&@G&_SPQ!v)GvK_fFH?#^+%fDJDii2bq>2KFB3fpCbK zzY?Y_MD31=*_u4JnThyS(aE3tDn9)#Q?4ZD5UTk2L)ceB260Z9^DdiTV=LR0c7TF3 zjQNwB=~CqetJmG7^j~Iq;IRabab>RPv+40oi$;Ju(oF@!3$N+tNX|qJH^hh3Cc+s1 zPd`&a8XZ_=rI2*&`a}JhZU4*oe$(me&)S^j(9m9*uA!vDK7pge!G*RD{NEtfcs`d6 zrdQxhIF6*~t@1>3@KL|6Lt5QK+WcTy*Ie*H^^H6f#H4taxDDW;p0aM z)i{awYN5?4gUV749I+rHJis53y*7bRkwjWI+Arwp{Nf*fHhLoUvfs=NXR*Qs1~WkO zxkl4^h0#sBq@8W4aXM_ccpMVm7V7XX<f=pZD!tD6te&4RS$}@a0SeukP$&VaE~r~4(ckN|@h-*Nc*Pam>@0%^wp@_12Y({? z_vn3U5M|l4mU%FbOV7eWd8xLdys_1Gl=Dnj*meyq)KbG>l@^RP5eFnsRf5;_E>H0% zu@_U+HK=wNJt^!y`g!;G4vK_9JRC2bKur*iK<>YXBWS#zFUg4n z`;8>2MPTMw3$L z(U}f^f3>LnuE{FArP7(?195W!y%R9<%+xBj#Hgh4+Hq*G&xj|-rXXWu^o2~AHbsDc zP5p&5w=~5Qfk#d$&Ig!!DHgp`AyWg>txushKL9H{XlooHae0327jp9h{^S(rDaqjw zPSB_4LuyqhgXdRUIBL0lIEM|%BHmT9nR9F%7{|HSU;l(nLE(0Td?7NWE*Owc?KP0( zZ$h`y>Hj5yWGmoSE=9o4^G_@sm+hq3PFWD26UBYpIdI;^1_MQvM_Z(Pp~uCw$CDE> zU|oqzGwif^ieE&ikc7}gf{?+6JZWAbZ)RWdNAdER6>43QQ+^@m*$|7o*ymu@`_pl6 zk>={jU-YQ5ubZz_DIv>s+vFvVJ5QUtb~s*%3shWv5`O109%Q(*L@0ixy#*U~08BS& z8&*WJif1WYvEKw&hWpii92s|80Mdy;- zR)PH%R;M7NGx2az+q?KQL0e0=ePoI7%^?2({z6;)j}7)Hy^%?UaThy{H|zMzF%`U{ z<>fVS9pVeN85C;9l~(l$;{zOy<&?f9CG`S&K=O%PPC4;&4QIyOE$#_~&`cYIQhrsT zVS(S!-V+k_foJtzP}Zz4DE&?xx5jOgTDoAqhmUu*T5nz0-z|UESz~Wak6P>ocjJgn zVy)7cf|}Q-vc5s=mdxf6zC|Q##$BRQA3=A2+=}!@i(Ngpo4$mV0!Z}gECLQ_OsEt;%^eX|#;6LMyxT@r8?fcb=d0Qm2*DHl z-+ROp5KVR18aJBW8jr$blYNmQ*q^M0bw1AetkvJGG5pT`eb$y3Vz;M99mJSzuO4~0 z`#%*dPM(FSZ|9}keSyVPNYNr6!4Zoj0@&8Ts-fu)RzAXA#58~E`m+Hdyi|@LS<^TW z(4?Z${FenaU6|7nV`!P$SzWG&O?RiP(!ybe!4;CZQnEJ`$VJ?K>v?Tc+O%m}GqSms z72t=>ZjQa!Oz6U}qRyv4BwS7|FI};&_T5rpc6kxJB)sPD6)~|s5nxA`^H=-08J9Vk_DYuG zVC%u%%5Xa}7icq(_mRP*%gE<`Bl_k`GsTt=!}_@L(EC8i8(K})7ii;RbHJ%Urx-~E z^}*+8K12;=qcG-_nSG51-sfacnsYS6_i|SM;T4NU%F;KZ8KYRqYlP26`%3b>SF>~NQFICt|WIDGDaXa=&|Est*5FFK9v>o0YBe+ z)mnODRi{cvJAY7%92ehltHp_wq!^cUE%dj1veL5w)EY8Dm;TSn8FjO5u2$}Pa1fJb z*g)HSc0(6;7mb`Nzp4Nx4n61eY6a(8Bans>kB4o4M+o@^vXEYcZ9&PDGoEmi@qM1KN%{`4jB(`*TR8(BC3Vy0om2aWCy6IEs5}hMG5rz+>KM*~`+Ag**1n$i@GlBfPenpj$^k#zXVQuE1QpL6gk^Vnz6k>Na zJ^lKMV5~viIv&Hts*+cg)q}uu?l$#BN|lg?zrXvllLH-OBFoD6{Xj`rf%lxn;|2v? zSi8b6JY7~3#3+qmQZ*RnJuZ45dDDz67G!?FRK%kNHD8$HdAO zKLK%};0HG5Y&&o8#GHqOtqhL~0N3ux7@ShuoUatrbY^N@rf zPHh*M|84d8 zz^{4tFqFXX%8fP*u0zI@2DzJJOjFN}?*llOH1p4lx8Wt-iN?HJ--;Z)Re~$<_`Tst zk}NiF+y3~J5fPEpraKeuDo(W1+H_U?Vj~EFjW%1h44cYxqK2&?{dqke<;DRp&mn+$ zMhuw(Do~|H6=jmTPsBf)8fOB@e^IEZjit8%f&8(?%v8a>oVzK=>_z!7J2fKXcZ-g zESk0%{EQF8s4+2U3#C#>Bivgv!1w|z=}xD`ez}vsO!N=vgB_?Lkx-L$8m_jsqbUbV z=Gh@I25ta>dn5yvk@~g;dg*FfHG|k{&S(|G!-6u{{lGW?2~J)c)$VIo1@DgpCLPrz z@tSLKCoxI!%Jth3ECr4dd?=h~qA#0M>PG}3v0aTYUB5E}@(n#I?${x4I^ZE?8EMPt zfZPKcp6(u%NF$y!Y$Ow@Pc~#ia#nWnp0i{{ytYq7OlQk->y5=E>FRk z@;-dH6c=ka9YTRmBkFyeb>4n3HaP;mi5zn27x*GW1-MAVcr~cA~cP!z)5|>n_TpKMF)ouS* zP&Lom(CzGy3rGe;;z@k+OSO5vIuKjU5E*07N^VQ=%|_81Bm;tXTcNn3$IESB;T(xl zfG}Z_tA->&y*4>CVse)17!?tB5PFXzr}7{RcC7RqP-AL|MQIjx(^X-E_t0h1+8emt zXUz6%CoPSgp{3Xxqv^uIjYMzSe+C^4RVXdVr(bz}{kNokjo@pG;#qi&&TH4C&Oq~9 z)%8T6=W+Qr5NJLmQHJLP9c@IO{p5k0xZnLxY5n29OKWuSr*j`Je1=hsEy^~BR$BlA z}<}ya|NObWCMm29%9|WYA_o3*YpO&f*vFupGm25=1MG>c6mDV9AUqhWa%&U zy-y|JtArm={^Zxi+JJzl!wadLFHM&dZ~~Rj9GnZxu6;@QD`gt={7A8Pjo`OLmGFVs1af3a)cGHWn+Oq+R*v|U;7~ee`*RBDC=Y8lxP&4xQOgQoj zp_@gg3YJ0PY7I=JbN(l2~zRoucHrK`Ytx{o|#O)!9%r`rexF$GT@c z&Qtr^^Lp{vB-*P@g#2~4?)`G9FD@KwCHpK%2?>@l@L#mntMOlUD4ng;`qbl|F_%~* zK1m4Ma!@d4f&1#|g2DUP@^0m6E8k&Cz?149(wtH=z<fG<5(KsOFe-rFGwJqRO$ARvJ^O%aY%59Mv_dx`5f1)1 zrqttQ79b2t&q}#ERjh;AQYebPcMETnBwQxQjV)US@7_8+u~l7XmEs+FJ0^B{*nF|t zUA#4hbu;_ju2Rk4Z}O=&TWQu4isN)fyc^O`h;8x5>zoYd z#&nn;SZfYci8^N&yX_J3I% z)?-0}-_vvu`^)4OV!`0$`7c6EPTz=A&u`mmWGdS=a(Jp&9jRIc&Q!ieP{8&{S`CuAs!g3{Ks|rEhrqZlf1u5>Sz2$o!5X z#Vy2h-0f%YWkNM_+~1Vw|Hjk2sjgg}okg&aDQ=!=IivhfECp|oA%K!}Xjgz!LXJ*s z))#DgS4Qo98t?aEu@fSTXCI*}G4gTb?~!EmW^{-Af3znSx&0;M=rJ!ky$_b>cw;PC zH?}_$vWyAk0nQHDuV~A<#9Y>I=S+X%WPH*j7OHA46YC0qYwzlKdWsYKp?@EGGJ#iR zJ%bf*=jmlf1&K7(9ldduZSG)4V-=5USMd7$DliaXgRm$L+~X%PC|_A1{bM(ET0>|e zm>Zf=P`5BxLj8V`?=zB5zL2eTat_Mn#An{+%Ql&@j80g2zJ128fbL?B7X{+JRF&|npH7noWY@EX( zJdru6i}x?a2d~nr6|us|5q}y?&lWH=B^+G&dT{^;ybsWPst_4SAcw|Q2+d$wY70LF z+;8ty2Nz#QOGZ9wg7pu!H1uv0FmRSG7QMeZc|*&b1x)|yDsNaj)ukp=+TG}J&z&Pl zWY(Lw7J1-b6TdYr5OxJ_QcIqNdSe3=40?=UHq5(zw2?WO?R_9xB#2hjE0>h>q|T-+ zVh-x8eHNozcN>Z}r+<8;s>)KWXZ|q0R9P^8gSx`wV{wPvP)C0~eQV8ZVkmCfkb?@; zj3VZL-96s<&E_+qD$Bd(0Ix?yAd5OqSImXcBY1n);|zr}ON#n*mNi$?5fr?-J5?`O zW2>`bi~Fuc4p>&O3i(jf+Ol;}-$LHl0x>S+a~PRif(N4Jd*)`B3n7ip_Zf=+aek+A zBh+JIOaI5lAdwqEBLlZgzMy6c`5uU(!ehl%7^|6XK78>${s{Y#lG54wq*yjb+*ECA z3lA)RBxa*WOK{FuYS6)J(aZcWVkg9V@*XNVxO;jz@S$&h{+19CRkX-b#){RK z$fbDm9u9o>BygPnx$&Ftob_jM?qn1+?;WC1X*1hYbF;*enLGDv-^Pj0$V?93s`u%LRs_vTy(9N|!leBQl8h zavF}(V_`#SZbSD)KRx?z95zyGjq4Rt>-xi^*1xJ-50F2n9L({~6gSoX>PM!@4UVO+nR z$`%rxX79kh;z6rHz1tlptr86K6|G4Q)QcBKJ)k?}(Dh3fF52EQEr@ntyz$$*m1K>+ zcR8rD1RjRbkJKf%XvO0Bz4U4ePNCf@2iwp`;CmL=krLXqgOA;67r|b@>a5261~QT7 zS+3zamF;oS>_-J=2O^V!;qtrNqdBz{fwP@Hp9VXjn4|H=$||!Fv@$7Gke!`j*0?KN zk*{Bbj%9ypcEMTe{AmbHs1zc>eadAfWxzHc)A1D}=Jk~VA!l*UJjnk3iBoFn*}clR zVIe&{o-k5H_>R3Cm1qbhgeXVrmHD7TyB6fZxLGg<^H;(-#Ubw6cuotW^3f@n9(g?T z?qD0+EqTvh;ae&<8Kp~5>zzpV=Pe=&i4+O z1nlrq?9TJ$6SYkTag=fgsYnTFxq2x=6wd!X{9Q-dy1e!z=Jei&O3a-G57zK45co@1 z=dsMzSY(_)Ur6|oOI#E>&E**`L!0Sx>q%R>BcSm^GV|BSKIj(*=#9!7f*c-(m|LXkGzal3Y{mJAFtJZ$wdE< z{*$<4B(z9yJM*r7&VC!ZQiGqXN?%r;er0e=^$_Nb*k}T-z<2b?p<#o^?%#a2WN;UE z^(u+mvytN;QPR=O{N{$?4ZrYiUj-y9t#>QvYjl2T>}nD)B;gryNM(7?$9=&|$lG9^ zbR`F=aB~9us=FWG^0}Flw(^Kw;FdTadn_Il#RPDUsR6z4WUoBGK-*}MMtuyskd4YnHOk@##(-6QOFRmYRyaLFb|V*y3j5jVL$;KwM2P)1IF^f>X8+e zoiHcYW2)a`gPplY3wNh^Mzh04-mqMKMw^M@Xsh|j=UJhnsM=|K?o^cpef z)vGYDow3p!X*4nUbQ8ZcN4j?Qn(x&GN$0fmh2XMzUWq$Nfns5Uc5NYHX0m^)J7aRY zEcFws!c-otxBH(;{O-543cX-El@&vl;6q3hwPDh$`oNLLbczSh zU9JR-2a8q`%boa2KOgC<&mA9s{Dd%ePe+zc#9BEilJ!C)RFY?@-m> zR3+*Y#83+!^W!s*#Bge5rZ-Z)-4B);=Xru?$Pz*x+r8-c)LPT255&Coa%Q(k9KEZ5 zG{_QS_ZH8Lt#Ha${h2vhcMtRe68@&PpYrEQUyRkK4U<-vyF9#4tv__+wh}5}&}xdg zf;2i?zwK^S4c1~eyREufXxy+n_|=4v6tp-@iXk0GS(8vgtJ0M0;x^m>Nn&ow+IQD> z6?FA=XmtnM%dBL^DlhQvm2UK$@XWq2Pq9ntokw=a0pXUA_v*xNU**;HpyFBge7P;X zinaDoljXn`=e=;yB!jSGdiV35*$YK5skHI-vtt}_s?pLvd}xeldR~pKGWl@e6)@`s zU9Gjjqt`#;XaMRR_pHPEP z5#cda*Z5=jBEj8hvc~F|>Vm~kY);Fz)qTS zeU_du;vo;~Bu}Q#)^qb=KW5H^!yInUeb{bp_f&SAPoBIFYBLag1qYsayxf_$#c3}L zLvB}p3&2U5APn?3`D{ZEbL5X59JhMTKHt)*P$Ri&xSlLmXBF z1;HRdz~sSskl~Z?L%i%`d!Y)=82y{o6r*2JxtxV6w0d{G3GUUN7QB_C`L< zuGoKW6F{GB3>L6mKH$1Jt+nDQz40Ah;Wdj#;MY0zq?a7tJ-?7Od|V-7P#?DEIVj#q zGVgrbLPLr_X0=`0Gv(8EJ=>`C$2v&KN5?5+m)ER*{a9YO8)+3k#qA*&v@5Z zaQ75ep3xpzxnbvju>)Ol$R8*3AuLE<>mVq*rgX&TPnFbX4uV zhZv%MGviHQ*;#A!KoLp;|?KbNol$ztuw+iiG*WYlYYkIH~rySrh-%+a=)=Z%Rw_ht4(hy-JI zQR8)sS+G?HX6XrXaX83~rRwudzI+Kj&61xQ~J`}jZ0KrlS8E9LjL z^Z8-BltEEQ{1X!X-(Nl=xoI06C*H1Ti|&}a+}AwU&mzl2jd&TZ)d#K6Ijjec?Z@Eb zLcs^BfW%kcPBFR<5JPzskc_E*syBrqCU6x*0bEmwsZ@f%8K_vW`8EGorgQ}EckU%& z7PKE*5VM)$eKUWzNM?VJd|&2sGIMCexgiy(NSI(x)hZTJ8#JL;I_KlE(>kb}8>VcJ zz(vvi=G8x5ui7X>7roW&O8k?{>e&$iCpo!%Fww>^o@XuVx|~}%*2ujC?YptMUsg~+ zf*AsS2m4A2?Z>)Ymtn?6jWS)O9b^@=fkJ|4Eyuy(|Ha*VMm4!^ZKHx<0TmSi5dj+@ zARt{jihxR!5<(A%)KH{^9*T%qC`;*Gq!T)X-Vu;4C7~BVS|IdZ&mCRcwf0`G?(dxO zj`59g{y20%%=6r3mg~Caoc7C`qq1njMj{SaVSD7m7VcyDH(o{H=WVo?zJ#B&LYwtU zIg8t zl^uQ-mnUqDbl|Onf|7kqd|it;GNbb%F_@@cozJnsy`4J+K-KKPj?O=*im}>Y))6f?L$CvuS zv{R?oI!**$62KsyDY~7P?$S0LGhOiXt1y1V`GIDB5_I?_71AZkfvya=*#n(@Xlfgn z3itTvalgWVB2#7A{yY=4!g<NsfguSo@O?5OHMp)sMgrD-*PqTH>%8av>b4wbHh%RzrQI&Z~uI4v_b% zxcc?!QOYS9piR`gXo{r=zW0q$RK_TsK-$OPwD+3%*X#Xg>r$raY5hs#jLh~nk3v$P zF=Uqsx$hNd3CtO`RR(iep8esAr|2 ztE*>i%pqnP9mc7NQrhvi#jakc=7~?jVe~MQo{}adf7CEHdfh$RXgZZ4jm?Igag|My zqshx^drfJ=H<>cZXE=3luJ5_DVTdr|O=IjX4ibf#@K?&@S@h_`Xf50Z^>;j1i4*L{Wrb60nbl3v5z@jjcgd@zd37(Y$jaz-|WQF ztrKUfSK1&~JdL{F0SH7geOK*D9&Cq@WSBQ$dV_4wQXI;wqizdK3ATP8#| zG_LIYGX)91m}%PpF07lL^QzJMth20)p#!mov1m;gC0`ZGE5;78r$U8qs2*vxERs^_ zM;J1e3*G|_E9^sgTXuwqAvGQwU`a!sckF?P%*S2(PQ%10F=kWDM>Fd%Zc^*f0!-pV zg$hg&GQ1oBA}XjUr2YKX?CnN+Q7{7a_%S`zGVEe;4}wo6%YqwDof9`rIHgAJyLbxZ zTFo<)xU2qcDt>Vk_{^Ek1YhSf7bLHg6O-iBvdcLCb||@*i88@DW|0Bk6ada9vC41? zF%TtUKaOGv!Ik-7e1P^~H#1k^J+(?BbBUax zddI!igiYf%w76`0e{=oP0VYrwfs4+!O7=5bpB)oK+iuJF(~C$U%%ND>ID0z=kFBM6 z8UN^Uo!T!pA0!WSc8Wcq{28Oe1N={VcG*;uUk!$zVYrjb?C+|zE8=LDb%tK=3}Og$ zUFi925R`dEV~Inzw8sT)NQp_C*w1?h&DQIcW%T=!4vEqo0Ikx~_0l!jOll&r<&38AD1LX!q4huWl4L3*agdiw&=hORp$Kl5^|G3L9d$ejVPi53yOmn&& zW^2~n>W0DlQ@^1TR4mS>qdL1J0~T2DQSjZr#}EJ56DRC+6~b|!-vzm>&Aj6= zdSrs)=yuO$@Xqwqn2_O`#XE{PiPBJNiMVcjBqk=N;?mPeQkaunVrxYy5|x4THBY9( zNc4}Fk^Jjb$28A^urdlI`7{2JJwg;mwuWEz3FXvIsP$PjAKEUn663&V*J&!2Ed4(OHR1Q*b_8wNqPNdy7K<4PlsK(^uqR|uL?3Y)i1{9PANS8KHGO2dk|K`yq5v+~b^;hpd?BJP-jbvij04j702$#zJLV7gplryl{};RSf&_To zW0C*v3(9@?}j}!g`X{@Oz^=sJ~le6JB$XH4<))hrSRQ2_qQee zYjOYfH?PC!BSg1Gb!-8qOAkUFl0;$R6MfXTi83Y{mF7yOZPT8FoOe0cu6=Xv`b)e+ z-2I~zjN)C{RT*E>L!t^+0#CPd2C>L}1al<`&|Y(t;BL@GGUR`TSpR&!|hHEtK3XZAa64cM-_og*8_V1^&aE8ZfkjB_Rpk5$?ELdH|A%vDxSFB z+2kleYoS1-pq1wv>b5y$cpr^~c~_!yyP;B^_z@MiAr52QNcDIQE)Jqiz{mt!(3T z?4IOIr?h_4INGIX@$q!!czs;AprQCis{QJeC4c&1X?sl7H_?%Oe*yF1LeBJGJ9kml z@6ROki)XT|UpbBIhCfS%=0g`Z%&{MhFO&}`xqlY49#Tm-HXQSno|hc^k!j+B#NBch ziHk1w=Vk_{$vLzO8%nJAUUaDC=yL`>$~WP_m>jLL5fWG|vJU3dHCOx1<{5wAJeB`( z^M<$v!lc~41hZC^UUtgwWoLush7-&?2We}eED<~zULzZ zpTc|51wp1$c{$YuU3Mqzn%hvTRgv{*CpkpVMzb)-EGQB;TqO4KH*3WEeT`WExkg@g zCfOPZiZRUJ5B{kVqkQp!qQyV*moNA8!f~x!*HiKjAE0(O>9Kf`&5V2ih;e!xsvW-L z^(a&V($;(eIB@AH@chBoWv3n=7k&E0Ng+;rbaE?Qf`vD#KOgy;mi`x)aVd_#&qTE- z{M|8>#LlJ;s8;JSZz^NV*zNkA6>2(<=XA zQAoQ0JLnVwEDn5g;b`P-_bdU6z6Bkgtfx))%!jkG9);eTxn&)CELy?Hn}>R^_3|W|_(xLplpApb8qx~Qvsm`!)H#D1tLdH!6ZSx(wo^JNsAcB? zQkKAn#fW$`v4yc3YE6EQkUmXU@nM{a?1ghX^A)sxlQ74YWfB-8GG*IFM$?oMW*!2a z?ee)G=3*ac+5cmyW1rq61w&JkR*bZZFLP+z4s1}mc(Ic??bn&BrxGDFdKvV0-}(K7 zE31Q+eMUR>)u!1E5>gS2%aK&VWmWD?8c@I$B~q-M)`oZ@6OO z$x;xYaB=Rf0Ww5HNucOj!b_#D7bow=bLWQuL#10L2+eP>e(Azs*humC>ow=~VZm;G zht{>nEs%`ID&AEy`22{N^5^SgnkaQ6#@ZC)?1l? z@QYJtfoaX=^4)|yCs`H?UEhd|aMZ#M3;bms<7o+OY~jhwWB+-Hubed^b)%~0x%vS=xLGPhLZR=h)y#3LxN~$} z_4Qd^KA%(iRG;JI!j5Lm^rYFv3xtVko<}%WBpq{GL1^gW@Q%W1%0S3>Yr2K_>d{9I z0O6L>GVsT|NRdIV#y_clGpl0X7Fo3>Q$%C{abyr|?>3=;<~@C_i+dp|VZA^Di}CLD z_K>eJ>!voJ8O!BldVc&ovh%p*uY-uQ%7kz(#4c0z=gs#s7vuYv763$wzzSR;BLj2a z>n|a2d=C@GW{`qU^DoC~@_eyCsaraj^}R4#q51rEs2A_A-WOmS%d@6sx`nQ%aRF38Msgd5gTb=rSsu=aQuBCHmA_}T7HB;GD&D^( zm^{-@^Zm0)T--ff#SX`v!-8)uN3a|CT}&lj#H#Mrs+)lr^k(20M$!0sIrTF7L$?|2 zbe*JNyTi#AuXJeH+d+Qb78+{KXehwzdXoJIV_Gf=vqieU^w{^3+x=QWur`&Y>Vt&~ z7*uxobeB$t;9#0GYM>JL+yNN8Uxd=Ha*hyXoaio518mQqY3q-8^DHUpWv=_(TZctQ zHEOtY|79z)!syhYqnjcw<)!hY<^zS6smJ`&SrsDHN*q%k1rj?EMJ7f&uW>;~C%ccOQtxM8r2}NKMpmfvXN<_CPBX{Ok^#}N4-SSAWxS@GGW)c|sQXgPW@Q>g zm1TCL7*y}NZAGu{JyQr<7;*AeQRRAmO$m%iGN{Y$qY%+>tEqj8wU;pY{-M}KN z=ely$Lb`6sN4W|v-@Om4s?Uu#Z7q-^3m=#jV7C3!X0#2~jccm80OfiY{D8h$hxcF*0tDTK2kj_2u8QS(rRs}h7AjVLkZs?yO# zj@nUt8!mH%aYU|leZ9^SjrTp(=1ivV<4_eY<7RWFvfPPTUL)Q@E{vHS!j=T8UME|u zOv!(7h=4miaq?{So3l~cO#h6rK`^{4oljX!h;FMmE+v2=JSF_)26YYy{7{FHN47W~ zli{oo=-B>ZaoV)!^Fz+Y2Bj@|04wEffG5h-;*|!?KoDv97PDIGNO)>XrKX+iO}nWz z&Rx*;6R1U8%I4{Ij9`!qwei=({gtQm+d#$@M{#L_X9JAiLh0_lWK+)bgvzm74Hc{E z3M0RDHI$E5DuWK?Vv+JOJTTZP+C@?0(2zZw75(YOs~w9rn{U&;y|r6fuV+^;_KKQy zoDg3|2p0U>jYt*)H{ui3YDoI)w|5z`kd!zq*EtFxu-RuIF(u$>;H7sEgP6>>aDDjL zhgg^8dRz7FKL9Txg-z!V8XnlOTQ^>xIY?_cm}F;Rvw8o5b5}7&G^G>`v+Jh`IjV8| z%w-7hC@uy3>P&LfYF;20(~pmChFwXqGtM2On%Xbd*_YDc%?CX9;8&?e#KIoa^w)1q z?@gOl7^ACvPwD&cy9RT$*YqmMU1ek>MCX1&b;#k<_+LinSI$}i!}^tZRm1B)oTlW3 z3n0{T@0=&eF~_851nxSnIFQ9W&*?Pl8x=kCK z*GzbhQ@eLA?Pnj$dG5yyuYJ*PAkL$31tr}gY(Dzc2q2LKpAz~-b@Ol2kt^%hO+~an zgE|>++431~Ual1x$!RV!TP}216dJoFbAHq~@RjeF|7q(O#KzNz89J5h5N? z5rb!sqo=p6oL7-ZWGEE*IFSp43#OV-A}$ z-IaJ(kc?)pYM2t;QXK=i=s=!PAfWn_EeAJBddT~o+AdLH77vjwrN;X^nRVllMQ|74n9Ds{koa}eErzbCcu?}v@RZfsl0UZl7k%tXO)IU$+ z?~y|Y)+|Ym&mq@Y=Lq|arTtxs0{HZ3q>$x1YA#K@ZQm`~Vqj>y1#-$6gE11pI&wxo_R-jAo%QY;SuL4lD7T;`= zVWU#nJS-Q-!t^M(dSKJ~l>Rz?qBP@!P{$~>dkUYKN{O)3iF^Va91#gxRHU_p5hH}g z-f-%kPy+*`gSkA;6lpJ26jj-h8z{sH$pg-$XL~hFZKD1RCqi#=M9Xpjv+BfdJy;3_ zWsvV-xNm^LE>THQ1O)eap_Z2{o|7oMrAfnuF)u^&f#MXoAkcFa8-*O$&Z8T+_e;Nc za(cDrz3N~1-n!}RSn}w+gCB& zC|4##!Yv1Pk2aWM=cPG!sk!I~?2zWJ-rQEMfaSnf+dbdcacPoXI-I*_F5gKv_8+yU z+XeSKX1A8IdSy~*3m0GDfQR8m5T0^&#t$1J(apQ*7epUc=M3%s0J9~t+p8JEjn_~xG*PwniDtGrp*xOtMmNX7|W>n!VnXu z5jjme%A6|{k~O4hKR;uZsl6IDN$=JY%$-TqV`~v5@SSb6om-s@L!qAKiee8ewKvQT z_Cl--cmE7T^R0jaG5LLVdkr-3AuoLL#mRi#$S8it7d$44izrUhIl$8#@N~r&b_I{+Fo?M% zLI*3dLHhAh`eRoTIefU(!yNU53qv#`M?$$euIhMGBt4rrW<9g?jAr6m>`fw^1=9&=zeXj`T&k# z^tMAY;^+1q+$SOCgkfg8X%G_w3QP|!LRnRqA(sw=8Fs~yxaUB5!YWbq?NQ{dcUih+ zSMwKfA#{%-MdQ0tlro)`CxqulDv{8}z?fY3j_@X!%|ydS-$Lj06#LBuB$MKMNwY4e zh27WsBy%@1&IWBux&od+*lFnn@zE?cqx5ghVO&vw6TUF@7_?SN0)p(B@ol+BL0F{{ zI}`P()>$3#$7lLK0|u?Yq~q?K7I2`d01;FtB+M)UWo8@U5YW zE^v)VWb?|`FCEKqb3UVYdXL+uJ-Xz>0Kafau+y@S?WH@#DZfusl?d?H3+124@cIL) z+l=a5n#GE)j*Jd-EUMHVkaQItFd5fDNWgOC31HvuLQr8{{oOQZc;nr$37|CTBIkd^ zF5B*hJpd{+v)10bEjTsj+{9S+@Vd-wP&7F+_>MPop9)0{{d%qB+Io3~<(|#eWO5qL zxpmH?KnkE-G{vTVGfnCE=GsL+m!&Z;@q;Behel3Urk>Yc$=Wte#pHBY?POn)9F%Xb z<#ps@yyEk%Wj@mfTw;fA=fZ?ZfUdeZSn7%`c$bp0m#3OQfuO9IYtgzB(Y5obHhcxh zUH7)|Jju6V85?~L1osQ{s?A{?`-j(6YZQ;bF>yfz2t3SP>0c3{;95&%x<=alZ$oZ@ zX6xo-2;_P_$^OBvaG24)?bD77Mcqg(Lo(-sSa6Nsu1<5AVb|&-1uQEYC&}BoUP`~2 zQk~9H2;obcgTMYmYN!yAZLFw$0msjKC{gH~RLSqHz7&yt8GnDxeR)#o{@RlR(M`wG zTi@VexKX!WB{0wWm1$7VuT!S#6aqe2_wZ*v9;oIu8fMuQP_?0ryz%G)EFv!v(?(Z> z*!uDi4g+W(rcjDL?8>|Ao*_5Pu951MB&z`c)6zu(uAU)v{6JGY1v$O*DEf{UroFtM zJySrTgt-m&Oe95DgujA^dxKfSZQJ$(7@L;p z=_#3{7^DK~iXroTu_oniIUY6R2*f&XZnH#8H7d__{W5fnxVV{LM)CJ1^!BH#WFI6luJY<<+q)x@V)6hP99$w+I-aCj8loXs;yt|@U?aTq?; zK_2<~8>W3dWahBumaK1bHYE_-!8g{@2R}SXjInc~JHzp*XVqT`ZH_TUl`OKjB|j(i zHlF7(NRuY-o$=nR%5z`*5}zyVXoj12XjqfJBx>rnzB{;RuQJiVB@8gXJXw0!X|47& zcrUffB<3Zy<1I}#whZY#Ft_6(hql!2pv3`^<$H6rMSc1?Y(>Zb8ntK$H=uWg(P_SRAqKn zipd6Z$R5L_!DdMV(wS9iI2+Y*MMV;dvY6eFN)G0%@A4w14Ec=V0D0QpcP-ct%tmM_Lm87TwzmuUvip^TsPd82?-XG6P`1XJ%Vzp|H!6wEpTwF(0VX?Qci$X`ppgV z;mX2QrzP>hN-bI7$qEA$_RZb_y+i7AX*-l{$dh-rmFFybR9`ihCQeyiAFeZ1F&~{ zfD43Gp469KV^gL0zNcO+T(_5ktoa=m&YLu%;ol_^t}935Wq+~ZAR(yz&cj=4HCRrGW9?G2DIl$L-jUvJ`BFES_kCeXC4e zG^FW0lltHpM1gZ1L*~H*7o3_i|H62FA;7Z;;1rMpC}VHY^4YaN3zQOwPwQfe(rRq* zqx%5xs^(UG%tuXY_-GtF<)&VFv0ltVI5#g~3RE-mCYz~MGfP8)*`dZs4}%^7MmE?` zwAFKxipA%w(-YzVnvZ6CLE^dMvnPIaG5>ru7y&-;zxfkB5K|#x5OqpD2b0eoumZOZ zbn=}-NB|8I&`PZDJ4$FH(Wcr`Z{2kXs5hk0&47w4q+^a-H0?QvB}5z-po7@EawoI& z2vA+w@wANvvBc1}T@9lH4Y7wODI0n#TsI-<_YL8rf&{+cJn4{P9Z3;@<1$S<6B8eL z8@HK_Zirb9Rzl<3iuvt7Q$z|+LXE3kR0K))uZ$%D^#ND>&6mGKLkK@ulK&3KPG0>9 z?Z`$}ud&M6?|gGMYI%1TfrCDqn_h|!8Ys63-4KN4Djf@PX6tcLAwVmq5G~p#j7_bf6L$Od0!+5c z96=70tRW^EIQY%Kfblc1Yo1h{Z{@{Et~~_6$c>t=TfahozAr>IB>8$={Wlmle zvwZ|QhUW})K(9nKtKYO}o3cMVI2t4DtY~L^t0;g8L|J%YtR1JSsh}s?Wb-OVY*o9n z9xZQ@avd||I$jhHS{8d64Ukvf((mon#wCR{H;qb!5M)oYfO%<;W>PPTqd>|*(t~Z! z7)&(8xMX(AViyT+qioSpW#!vLf|hQoRdY(md?_Ii28}5V$*{d%x${s$F&e(VH}UCi za}-zEN9ni8lq~J3qrRZto-03>BtC{+L6^jh3uJ(s$px=|ztP_alwCvgUuGta7|4>b z?@8e?$nYcBwx}ZA9gDt#bRJ{*i6Ij~PXr)s{TamT`bXaK$3aKjG_S9VULSA*I2W%r z3tc9P;ko2fcWoc4)$)`IjASc zns;Q?VRN&@BJYF=`mF_>HaQ+onj_C^oSf4MQ^I7>lIuQ)GM~l7t5Wh?sfhKAOttUp z8dk*^bI{N9$ybyjP&l-e0@ZbyQ(>h5Ne2374C>23d>7;9nv6?r0v<Xs1rWtFl6UeQ5a>(VKSP#Z zf*5zddoz~*Q8e;#Oxp1CFF*PH2Ug!duKNGCk8duB<;c*ptNY!&6LPgpc@3-$iF1o|F=H)@k8}wOK+w!i&E@uvVhpD|K$Rl{T|3W z68{Vp{;6dXlal!vG5wD`^A&*fhgvU?{B%`7Klnp_2OQmna?}5E_^ZDcSy++%Z+=`! z|I|+{z;_|w|FtLiAwz7B*~O+#e0ohwD%)!a6W=9GBLB(1{r=<tnEq1iX$}SMb&5P>zI-MoDkN*PhVdAI!e}`*+$CBy87|@Lw^)IVTws z0qc>Zw4kXuK+&Z?E=k1oW{=V;)dN4%5 z(wvH2SrP<$YCx-Wy@xsE>?<)%S@KKwXq%C43w#nTisVC+k@IB z%;pDOA7pB;qlrzVs+_b#*uvJP>~)(7fxw*ZG1JZ1qYQH!bB8Yh?|gQ_AfJz%?HR8y0HcO{6Mm6Y|nlXZ7y_P+`{9=vb4S$$YekoX9;5B@s^y zs!>04&(QnNr|apn(3K16eNx<-6r<;4w$;;c_NOcW+zH$^?>;HXQwOq*@{4ruk& zgTjv#)oKEAq5E5!R4qop=Nvc*AScRyNh@fTk$PLF;rBtir>E@q_=WpN{4z=Vr8U5A zzK>S-WO3He{R-yWU=LAiwRJx`;MqE|8w5D;H(B$ClJ;7TK5FV}l4+ zL5<{-d?^^snraaPWxF}rhY@*OD3y@$N1>v*ExBevG;^(KWDI2y?XI0ZpwYI5*gPV%sOsSH+TdK5DiTELoRx8+k0GOh0)0_k2jgCYwWIJFm_bQZpvRJLxWpPz0Bj# z3rObEyG`2X@RjtK;)e+9$f9PQ3K!iFwt_T{l-UxsHsS=??$U6E5Mm03tnZ{`gg7; z?qmQO|5(;${F6g0>VIZ?6z{a47juHoULU>*i1z?eF_M$OW{cLJ%$=B-bM0N#uVf%L$peAJvjjb+-y%}2F z;g_{f*a_q&YID;u0BIT5W`K z0i=j4vxx(ffWLhe{%Y8$h}HVFNGVTk!aVehdtBq7$4GKxNe=PQQDaft-!7}2MMC`{q0NurC4C3K9eT-H9B1@^Tld7NVFY- zS)mW=7B+uX|_d{wz6q|RC5nug?-lKa`I?M(a#x+iuh_i)sv*&Kixv3-lVdf z5w|#0f@+fBEO@SN{P4bA=4FH1`8U2YwjA0XD;+?j!Z}`>7LN5MIP9-9$410$dM=Ni<}U@BzUrwuz_Y{;D2eVA{;RT$tni&eo73Z4k-1$-eU z$xZ^*4qDfVwac3X_yd7kf~=AsVU@Xs9`h$#k2m57xIV%^dUrliSwPH6=Y>@Drh zw$BmRj;m4+jpHIT&1$ke*v7gbldOM8OTQ&;`%qwB4;#oc3zY9m!=n&Gp@qC&sgRaK zm4b_%J*j5=>_d}pkEny)4dxE28jPVV$A4*--!Z7~d5>6)~w@D()@Qa6`FG9m9Ub z^sDzN@*gjuTeKS6h=_DIfA_Ot{T{Cj2RjC%+5O z=`o7bO_YSw7OH1Nrd|XL$D9tMxLc~A>#6se*e@2wezd%M9@NE@DVh2S{mmil$y~nc zkhPi4I?RD})qZ@S_(iL>BZcN|-yYAkM^wmzLUZ*$iL|dc@7fchbN_{>w#u z!A3~*1&{wom=B0_K;-dAJKMBhevJ^G1K*h z;{nwGlkJQ5>FQib#2rSPxJNtJJl9=1lHbs>Cu@7u3~s13+&U?ULz$^pK!vgB=Z04W zdEfR4UVmPDr>5mjJKA))oDG)tO1pxCZc{7&MFi6^?Lw3peU;;8rOat^T(-jQfEBNU z&#^-HHpNWseBJH1mMn9Oob#KE?(1@xr7OWv8_!Sad1+&kqSR(JRBm^9q8`$rmkpZ2eTev4 zTh(s~Og9`-~WAI@*An@(u$-kYsJ;7zvJf01N=}rjg zfAJd40%pq}32_HR3`UaUQiaAXPi)of(v%P( z)~GRwCKG=Jw3G1d_X>~RU3;xnlx;~*HUeAfFQ|PU`J;!yexHqSgK6kZ3v7BR1lxLs z-*sn^Kqlmq^Tx_+cCp#1dw|Kp%tO2!KK$x1Mh~4Mb1RdQ7}Rh*885;mGeX$G;@kWP zP;_iB&S6qErx}!zoR+88@Zo`$G0B=LE1*CJ?QzJBiqR?IVRa3Ve?!-cFwS4H&vU^T zuRBesqMDOA@}*8I00Dtgo$p~Pp{fe-n04KxM(3QSz!HkBhP@)X_Rj*#zb(GgRd8y_ zZ*aWt;cTll=Y5Pz!J+d$z6mtcu=Nn*FlUpk*WDAyh`A1H5 zv#BO1YECxC^zZbat7e0yy?R4Mq4k`5Yl_tq?J=s%u{Eg#XRQIyw$t!pvGvppsG8Rc z5xmR8s~Tp=dpA*mZqu|8wu=BMYnVW5h6w_eW!mPxkzo}`u8-UrInf5o0n&+NbnShh z^l=bcd|&TPtT|D|n0gQNCox(xE(0pdQp9XFXb4bD#VF|RNk(H+H4+F1;k@NQ?z;8< z{^mI*x!C*8D@IT--XWMt?u&&k5K8vEyPkqJ=_Ml7IiuDdt+}T2H5#<`{6nw~-8?_+ z`T!sSx$b(EE3!-v$Hk+fgf=EY<>N}CGaIZjyzdm=;LO2aIr(kQ0+cA|GRU*96xc^5a{ea;=b=30$NAtkiMN#Umg#n zI3JO8aiZQX?qQQo961fK{Zx-MDs!Uoxp6&@K~8|~B{p@7O{U8grJnC}ZWjFPJEOh` zB$yiUNn?Zi$0-V|hSlNFg`xgnHY1*po7>TmMH!QrR|*>VLF;7rvg{=4-NSx}_f)#Rm&r zWI=f~^v`PZ`=&Z-_r^2Wyhz(RfPB&)dfFFQU|U{iFUQvxyT z-c5VBN+a5QfHsOd*h1z%=hCHdOA~F(dvTRL>I24mm*Rq$j6En5bPYP-Zo*PUPJL;Y8W znYv8SaX@^pSgsfsUJG>DWQd1VUoP(XH;O|Dce|cF!;hr?t^--n7H6v8mnh zMOYcXeQ<=`sluLij}TW$zol+V>Tu47Hm}i&o~3aM&6%>)Q^EDH>fk^R8_89V?e3NK z7_NLU&(Dy46vWW<;!d?>%fW8qRdV!{eYE2CdFbo`xuoDKNr$Mw^3Q1uT1V!(lGs5d z2rS;gd?Ci`sEl@_c0p=_ML#c__Qt8^xWl+zc3YXtJ-BM6N=$T#+yx0e9VAbVFSs{f zyN1C*K&(9da_i}ASCS36My5utG7v||3tA7Wd+%_~R8WZc3JuYA)0i!N;8rh5>#hQJ z?QV-vWSh=npu|Npj{a~Utl-e*u5sq_?Z5qhLbJt&6T;cYKVZu_MoG$h5rQT@0rWzK zJ{%ypNdqJOv?Suh5qfZS>!MmP_K|Y_Vd$;g{FNO?YxPeY5!+*rS) zn}p`_Y6CSz^tya_^Q~Ev=bFixk?YN@ko2eOALc&4Q;n3cMnhPv4>DYG8&~!MQ^9IXRDtOxxfhFKF2jG|gwy zU^}Pr@%}O<%TR2Z$LHK>eNqZlqmBq=h~7G%&W{ISr=JIn5rfI~+V8%aNB1BN{as^z+|qh6iVJbkH44h)V8qV4Eu zBIiTyxXo$&=*M`4PT;>2PhKVf7X^)5{)}ODhzPk@glZ_Rmb90t<9V3*z>4&Ciozsw zl~autz8}$7GD?DOwa^S`>z>!3X+Lh-_2R<^-~M}8?z?eeQR=E)PhUqH9gKLi(zcTc zy;3nEH{XvN%p87qu9^q`XEcm(u)L=jAQ^6GQkM)_m)KZ1+MGUDNpom@?3nRP1&!AY z$&V**+>lJAL22f_nc&>i8^7Vs#nrTXIO@7xHTjLP>W1R@C!594NoKji4C5AD#g!XG z_s$b{M$O!=t}aKkJ8?Sh(6`eUL*3f7^kPd)7Lo3|`5mO#E=RnWl}=r|N)sZHC?j!^ zyrb&;=FqZ6RELPcc&gJJ|8%lfQ3DE%u+W?SMA`UBJ6nv)QAh85!A|F<`{2{I$ju1n zo#5i7kGwqYbER3XLO`ire3-VC-{HaSvWcVGlvwkoE{mp04|ze^p}jQHS7Bo9whcQF zZWk(=Kxh>|d+4^%eJFzO9zbjxO*b5F4R+jzjFdr4#Rkq@k^FF(6u|w|9pY#{4&*{V z@4%_cGy_>2-rp97_K%V8?QI4InVW4whupguJJHurdF=q z!iLYF>*h%Vv1g0jxpvdB1xmIgqu*4OUd{3}0YvY+H{)4qLubEqMTo-`*Gw)SXmp}q0R z(%6B`gzxCU$I5R96BJy{ZGvWhyhuoHyTdxg5gtLVJn1NpU5?+SX?RaV;XD3*_ccDk zE~S3fB=&qrNQgr0dIQ~Hw|I7Cd3w|I{_!>c{3)dld}zoryw_-0V$ZAUwND4fYYO+V zovqfm%9OF`Z;PJm_{9U=)@Y%Uu}V!k_uauNKaayA#)dVspoubxtupyKzMfAF8{U1$B0E7 z`A8^sH&CqJ=4F+iMu*p(<_8_GH2Bd|0}Kndb3Am0GS+F$$7w52#KnDTb9mkExNF$Aoa(tUrG0Pw4D;WvVUQV3vX-u{Fl-Dq=$PfRc|5L*@4Q2FY84{ zkh4*y#>w~o?J)d#JiH9AU-5)ob|lL13n138Jjz^l6W^CBf}_C5W{+SxQ3zu8Fl}DYZ|QY~GnBm&>WBw~>*!nZY7Qlvn0n zq&a+3*7m+`9xI=m|UvWJ^U2Rnz?uf+H;)NPm-4Wgg(7q`4ezO+|6x7pDpsvRtvh% zq+b+GTz@vWvmP~(yf_+BST@69QtubR680%7n55%y0_Glx%^Ta(AiTj8+TEdEFYk}l{QjI<)%zV&0qlp}T;+qxjn;)Uy>9<}PE!RLtAF(c zIC1t4Gx*|q1DfjQnVX&==N>zLH=vJS5*~*}0X)w5fooiVNvziUmmkHqOC-!zi$^vF zs4i8TFS6U+h!5r2BV#K$>SgOh5s=uh=rPxuYt*uF$E>T^X>PE6o#8)i@t<3Mj<8Oi z7taxE&;mopLyS}Weo31jOCFh9`iKUR{Z2!GM!vCOh9;WZd~+f2;OI`n=T2|Ku5ZiA z%F3Nj>uEULgbFQ(X+g7x05nQ4d6QXzmJzwTq399ov@&y%*Vw7N(pDF^2Tq5DAcxx53PyM9uLsqx6h z;;3Ll03!oSjA&L{jv7xNprE^T9U^;&_t5(rz1IG~WH%(TvV01Ga+$7X0v)W$RH5tU zh||t%rr9kPB?h|dhj$L|(MQn~+D$KLfF>bt{O1H@<0>njEPWy3w%mEGtUH|VBdu*`I} z_@=$sR|yoJ^XH^|&-igq_$Dphm4&V-X27bL1T3AdJ1q23B6rsxaU?6oUF5Gw51bJh z-HRx5z`wTMYvk$<5^`wk)a!gQV9V8>1L#xp?l!& z;T(_WC`Wzg|K45iu637dp)#=J%ikA!Z*L$LH81gmYq#+3TNEfS;(h1&52fvmC(8Y+ zochDmlb~DB9a^F1S99z(D+^|aE0o;C8;!Xm#0<%+xd93)L3W>1A~TyWId4+ig`FU; zLOC``0gu5}DeRsBKHn!IpSCv9pO?a)Z%sL>kTyP(A)BABB2Kj9 z3wJrbTRUJ_LV4oM{J`kG8MdmI`=U~~8&{U~Tpx@2cz|3z=##LrpA#?=ML}?WgQMs3?RbR496*Z`*cXr!1P;i*p zXy0KT?)0W>Cvd%TJg+p9{6p_BHl)DDX)Us3w?()k;Hh5E9%gE-;%aJPNr=EEG@FN6 zE_3i)Yf9(xvMn;Y?4!D82+(rDCTVTePYcn0t+C;q8-TftV-h=r( z_9okUyWw`~2bR=qv@e)}>)zzsuNKade4*x`TAv3!M@kppBI6-FL* zf7q12BR-5%1+>7uM{nNw1M}S%96EhyiCppsKjQMxxJ1=G6wI@eJaBQ)*zJy)S(NeZ z>71dfOAc#oLhdge$L^r29qujXBN`QTeZpremu#Tf8WFfyop0Wtm#aTBC#?iyCbA{r zEpa-trEyAQ?=)4%8#&X7p5Ow}I;pI2>+08u?n$j;cZhxESGIjA9QD=~>^Ri|U$Rtg zgv3o969mSALLSm_Zb{d%V(a}%$!;+YdNy?ctD0cb4SCb-Ov{)EC8d$%J7lDKM!Z-o zPE2^TetwOHA-TE}JA>tPv7EG7rTcrdGA+0;)*V{6#QHPdH3nUCb5XsH<3T<5TVwf5 z<1Fy2!3lTyy(OOFDP55|Nz0q!-4+vibEad|Bc+?=2VRnx!Cq_#YM&nBK+!X{n{PdP zFgO&BUJMAdi%SgB44%yo*Nv1+lazo1rq{q@)5Vq z=ALDY?^-Q=j;DS1@hR1bTG+6ijW@R;veqGYudA!{LZBt+xAg>F$`d&;_ik|%Y)d*WojR@{d^4=>N*?EA72dX!8?B+k&bnWlhWnId z^^;;tnZ0p$E4FRNm>VYM<_MLDMX?@Yh4Q6#E|%4ThRl7NiMvODe~eSCMCYpMTX-)2 z%_*Z~K~NEU+&w1HlN#NXAxrU`M!nz1=D99;xmts&a)Hg=U4fNu6rc*Sp%Z=q@cpeB ztv?{fGeIa*!+BQ@hl7^2VIdd^8MUL0cwz_Y^ASTYnKA$t{uWn#Zj z$TpKD>)V40za+zN(3e>uLLGxId2V>e?J*H4?@p&?>E-Q8JEAe@2<-aEjLw^BPFgmK zy}w$uKY=VYZrd}{s#P>gos8`nz66kEy_BP|7L!ld%karqJ}RO;QC;!jE|L*V3{Oz+1zr-hZYA@dXcRf7{=p4b*J9C^f|loLjCFhOS`Tmo z$@N^r8{WHSPb0CJV)0T7O_WuXRvE|nMEph{REqn;!eXr2NLU=|L}yrnK^U-Y)wAF~ z?)rR6`36r*xS8(a>xL)xNVwDM{aB3JKxcKtFk9(vDR+Zx4S6^Eg;Ax5GDD0x@4b(!`SM9NqB~}E;U0%S7P+~czAlggaXQ2mL6ig-u z-vTtS%%~p-@eL$%37m^0ZSnWSs~_(lcZbyZQk?Ip8XF}Cm{HPnHyTJCLlo@*q<+b&Q6GsbZ>*0c+7a#IZ^`HC`B*B{RmyMDeN|mx8ky9NE zT>T)43VLxJ<|E}O0$xTK?n{4YQ=E!*vW<3}ye834aDiBq8~?&1UGi!%T`^s~1>2Er zc~c(37`u^qPNdHVo<004Ar!1)mVw+e<8CoNk*co>fTGr(QX{yTz4s&%p%y}6sly-` z%$vw^J@8WD<}j{Ggq^;f+18&JG3DKBT&K}~_7_)4+4Vj9D|Qpo)9LT~l0W$vjHN3x zU7iZ!c&1W)L#PI*-CeC*T~|$prP8c!)o8)VhsxMqhOSJ-mIqO6ee5zIXSVJ!qVTL` zzAm*}v0K-qgc05!_3$!072!BmWL}&^{bfB@N;PhPENi<2JI?0X{t}F?!#~LO$BqQ0V9VSNc+aOc%v)O7N(CSxzd-}*o&I8FLOEGc*}Lr_$Pa|5j7-csS|#r`Z)Q^ zyRQeu{VX2%Rhfef&5xlpB@}Q$?w#BI4^aNiGDQN_{UXN)DkPFK9^x&yJZu7W%ub)F zeO8*Y_irN83S)e+a5Mnv8?&#SzDj-jRZ-Snj72|oS3#FR)uNQ+;sOfucBLHB8$wVm z=C?nP>mWZrSjq!3i6l*gRiQk0Zg8D2b{v*`y!|w6)A36qF}J=N)U0y5-m1R8i?k!> z!G%bj^8U!Xrol>iQ3|GPaJD%Q)z4?S$!E$}{c-dc&KJWs9$r@}yHc?p?_b5Zvxx}W zj~3YMn2NqQrE&uX?%o4&hNIKw*bH*Kq*O*SM&ZU?VR)+j+%n$%x>BO(;mKa83jEwA zlEpcsinQO44A!B+O`1)u%`xZGVDi4EO~UWW^>J9oaBiaL!84AcXYxfwmb^d@xZ6wd zKjb!S#=oFqLm-hd%Yz-_W=Rcgeln?&A|Gsgd4dS`0<}RW`H!Z{MF0y3-<0gRBV#s3 zf%(q8lES@Y2|uUZovMQ?$Z72pIg-3K`pOOqHU^c?0gN1j@6V*H?Z5O)95dih{`{6> zB{U9B$`G3Ed!EX@1~zP^80CPiW5s%0p`k3(*1^H{%!pogRs$JJPd`RKwi=s25lhuU ztJ4Z>jpWsdoTAEHs>xzUE=HQ+k9eolplbh?8q>vKB7`Ve~S+&oh_`}#Q2;oR>qf2 zy4a=)c0-Y?0(&m245~_D!vbdeKAd*%e3S?7d|-;fQJbLXDETs|$fC8_>DrSJ z;8q)LWtya(HzuPb?-)L{fGDE|$+1}WX50Z~sPcm~dqWn`c$Skx-Jo*&JzcApucH8X*U@=}%+BKqiFIeZt;%7~KPQ-+ z*cPU;+~|e%$Y*)04({!mrxjQ21`^*&x%{kSkG^224NGmpT{iHERt!H4I5tXt*X@i) zCDK+1bjYgrWbrNg9%yskT+znNS?RgL^<-gGyyg0A+*v?JrQ2`nT%D|1@s{`Uo7z?3 zoAJ;`1LKXj0|i9=;{BBc=0bZLMegm6L=aoKPn-+mu6*2B95libASA)5KS|5e6T?-U zV=QkW;m_{hHwa5*@6H^!G}o=~7Z#eOpC>L83PF(DZEahxjZC#a5!ls2_$U)JZCUN&#QE>s}<(Afdpj%dF7mAyu+LDgasZ?IIuYS64lqcmoY z38w29Z8}?XCsdsDdl^JYrJor(dd6ru+7I+o>uKpPnB{j^U}`5o&#027@Oc=|F)w;gWM@g%mrS~?YK+#fU{<{r*x5JI z7~A1cANAB2jhq`e+m7F#6;Nt{-~AD{uwY^fp<2nsSC>%{AhXY@)f`2>+8PmIcFnvv zzJ>gDIPaHk)nTG0RUHNYIk=694=G1Ntu3`nIFIA1@%(TFo$Y3pCquU3fk#6fx)&FM z`r%r^Lz{oJV%CP~7>$nz4d?Uxmn*{~7(5eH16QCmHro0WW(;CAwC&2FBy8NO>woJQgP+ev#>NaJ@(qleg_td9nnlj zBS+hgpnhTtUU(d2dkNPha(LZ zw<;#%<0sKGPJ>*SY)^E@s6xenk=@l$M#yWwp?*n4@G_ep4ReM^?wEUh!3|4iIr(z+5oBJ%!EN3Rn2F}#6 zDL$(@Dm!dE2(tSGQv~0k8^Jdjm|g^^E5fYoSE0q@*C&C$Et8e4YoPPj%f0)#xXMwF z>B~)r$p#i2 zbs!|HJG<`^D$HXt4g$}K0I;-5?w~EryCL$S%}&%56U%X zHDs;mLu_JQTyV%~!|Pvy-{NVs2b;_+J_a|?`_nLAZ>@+D{eq~&g>+GO_V7A~_}l`? z!f=ba@ijh`VngwZ<+_7x^rdint90tmYbYSC6);~JI{!Y@3B~e-RsZ@2nXM5dcinM( z#5xD^Ah31u8GTc>G#a4bahYPN}dVO>=7 zaRtSxz}nnIgtWq;t?=<4%aw1^M%Tn-j6}AJ( zxfutpvb;y=c_KBcG6z}%{sG4@8lSvTK+nJ!DN@;Oo2UkNycn z5ZCkvim3SLb29%*vY5ga1tEI_0teKaimMP00ORp;wMX(;DTC*uySiloYxeN=bYNgNmrsYmuVTiV8K%3I{o6DD8{0+JgWUO7*r|%xtG&Y!pjgP@Uf|bSPsf>QF))D0tC&fG0$9h4HQ+*Rc++cc!WCd=W%5@0 zG6e+6gXERW9GXH_M?2rrg|5RvCgX?@?#uLPpmFt2ehj4hDws3N6HiF`aWa>IUnRqX?WVGU1HyMNco5}$Mw+a z#xJa#)HX7F^%59ZUgI}RfyTXoL}A5ge5Z*dK;5EpnF0rPoooS34!Ex3xYRg>3sQV- z<{Vk$DyGWAeN!zyEE;abX%!W0;und`hLwsJJiu{(RtMabY?;(J;?cf}f-MLdSI$HBY4rRS*iph_;6dM((|bGh2aVgaKZ4oirvnn+i%Bp8Sq0d4TWH^27VT< zs;o#WMuarYucIEH25k_bTFrfm8S8p8IQQN_tss+L`QoD-cX!bI%s*9#y@L3##; zF_1LBOF>H#ruqYm5W55^`0xyi^@5Gn#S@HC0Wux39Wsc^9e)-5?DUpJOLKEAg(p%lWRbgiUps-$)urPU6=elpGB`il zOz@rId#F0D;)5U9PU+m0qg_0_qAi*^%+|wx3A0xY4XUutWN&Md0fDjLsKnU4i!itd zP;1gTf{r_HmMe4_oMk`Sb#dNTLeIEU$2lB233Bxh{1c*YJbe&-b0KNWU`HszC|iYZ zEU@?!Q=`I(%SRcNW(HIMSV(Y0k^;wDPB;EFh&sglYQ^uUG_V+K3*)gngA1ap4tA^_^~ z<_rj*#O&J2c22!-kFA(36RSS|5<;V=e8dPKL(Cb9B4XQ*K`W2tyaaTyCp+Z~)M+&= z8Y9OLHnDG>pizh8-Oy7-ttMUrPJ-VI;gJl*cl9$Gm<;1J?%H> zo(a+bfp!epouhIPsO{|KX%AH}QL6R!&bWBqaQAW~em$m~j90or@?9S*1Po z&#hj)>r&_B;YZB%<_uK+=1+F-a^f(kJAIUfogtF=+0=}OGe7!aW-#DQWmcM>kgwnz zs*EK5T^Z?6z#5I)f**WGWNu@5(j|HDSrc8mCQ zx5=DKIG}T*pW>` ze+G!3DN#m-6|5sHwXB z7@aYPvjoS30ZEu5f40*nhZ{})aiie&14$@3XO0z#T=q|t(QRs9KmDrC{}d7zjVq`~((?a>iGW40 zIC(Zj)+&2e?!RsCEB-zi{9jGl|6zvZn8JUxp!&n*w=!)%22}nx>;1n?DE`w#&#xLU zeTgraH5{UE%CY?!;5es!h&ZBtgtUKl_x@Lt_J0`G0RZMdf;yMFsss14bMpU9WB>nd zkk;L2JJK2G85;ku82wEX{}nR-55x$Ev?x^;mtwf;zr`g-`Lk~x%lH8*B>BMf&%pKH zqlv@4*55XU} z*R`4dnL2GmMO2sMM16l^9~Mq`c9HosM_Jw%5(>1NImv*6JSWPN<~A1W)DJ4l(z3F= zDjoC^lr|fEsQ&DIKNVaCe&}s>z|K$D*pDajULI!IecxcgWx6fjZVds)RzO9=XRJkg z#$SO)46MqqL%n~2un#8?EImaHQ^g_f9e8U*Li7NfyijZBJN?uEUc_;hjQjD+wlmW7cVa_aN?(Ij@dqs?)Gj-8tXr`Pa|?@Q;`a#^Y+KCEP>cs7c4OR~8@#@kx~7-($|d z2=0;vN^-MLRMAmKNvmhCD15l^&4~TY0RK~F%*BAV$SB7cUU%-&$$QTY!okTTaJTF) zmnzr;B58}vY_Pp;_7gc}+Sb1{-?`~vK_Emiy4faALBRTo%c3j#E5=9Q~B8247k2w5WpHy1-D zxZ*iPyN)T)6a^epfRs=U%_b&HsuA&5fBq#I&|I?c0NJ?*u2X@0UE7>%B^bdulH-|B z>)rFR?qwU7?;lmt`A&1qU4VWNy&-%mf}U}OlF$sCg;3Wmx&*DfnUE(B>EW-L{*8q& z0XRB)tnSr%I%RXrCu1}wqrfB;h{Sv~waQc^{2(qBsS>7s^=Yqeq6oX%b zzuxzbP!cpSDTI)*cYL?*qjdk_O~6;0e0&KkaFIr?#rbM(G3@pVe){wUSBu~RKDU3$ z-w`8Rbp^yYe-5SwsK6xHd@~76j<7;hF1Zcnw}@E{b2K=(mElR~`+T;rDnaXAK-fhEX& zLINYl58c+zAHSO04f_#J4wx)6Y@a_F>NT zW;)aTBsKgeLl%HkgiP)Ny*QK!eWIiUVTXITmoqeASh0T`aQnd=|4q~mkE}!@K$_Sy z(;JXOCE$>g^(CkLe?!F!P}$_>;yY;2nrq3R^@m^WksmW~ zHSNkq=ouH3h)`bwlA_ah(x!EYGA<~S(EMCy-ZWv(&dq7eK1p_xeViIQcSB1+$h&Q2kr;tQD)ihmQjuj~1{V1B;yrgHHi z?@EtVa$MZXyIbm?uiYJxwOtQmuG^_s@kbAGuj#~XZ76iuJ1C_qx;}Jn2nrn?HLBvH zhhhobnTcQ?qOjvw@WjiGx=1zYXD5@T5yij{L90^?L~^z zxYn)la$>U)&jotMy_LJU8zTg5cGgv#2nPA7{^8aAxH=cU-3~bO-t4+GUs8(N0^Dgy zE7z!}l5@f#wf-ek>RO5FHIBip@mcFxibZkp@=+}Wqu5(L3S|-=IekxbIvl_At92YC zX6pzQUm;aHR-}GsA6<=3oa)11tU%^dqN$uER@90S$l zw6eFO;5ZjZ>{u60Y}MBga{+V&_{=ph50gg4LP)7vFB0Wf8XE>lS`=C=xBJKXB6&7y zgEv3v{6ma7i{?e84}rC!P|w4+;LcmvOl&ho;w)PL{inEYW6WEO91= zEnT+nSy+Za6T9%jMn#*^r)pwutp|^BGyLv=w^if~y_;LJ{rj6?iJHcUX{*sU#OAX( zR4VWINUiEOlXVa%|6*-mJ$qQ{Zveyq*S*Yq;>&ninRNbP7$={D_LuzbA zx3y)aqzlCr`BBb))H!Hz$X#CUIv?_y=d9^~c$7v@`oi*Twu;XXspUO5%W?JhAvnTp z8*w*Tcl>6EOs=Xg++`U3y#In_&4;DUOt6)Zjcm~A20MQttz|_e(1oh7viZ^zKP!L% z4!XQYHO4*J^QBX-9coH|pMIh7E{w_OQMF6V?&#~PG6o#n2~~n2`Z1p>UI9Yn+=stO zI;pFWZ%=&L-Q`ZAgL6@Fsy*tDkacH$BH~ofIn=K+Tfc9x_O4pCE_Xyg8FwD9&z{HL zZ&gav)RyqJYcf>9&)&0__HGU0iry&2WHH?@q227qQY)MaKJ)oWmDc{qzQVzHy4+N+ zwxuz`rDU!ys)Jn%*($EF)R{6;Fh2cWtJ2)*67OfzTOrF~QhskKB0JRgcKI#z=KBh6 zN!lQ0a-TQ2^=_@r63%fT@mAG8ZR0&zgIKgem-l)o47&6-h*~5*7(#4Lt63y3zV>Hy zwivgBw9BAD#TC4Hv^RIs(u%O>iY@l5vmE7f$sjcd890X0;J1AOc4_ z?e$O=I;pOqOAn+dxZcnfRhF~JA0$~t6VeUc$ZTlpBCZy5)oCz;o?P>Ck#VaVZnje& zV2Cm`Xx%L?7DAkNFs+($&u(9jWw|*N0cE+z4!c_TwHF}F-tt|QDiPla%OObxP;*3@ zB`74GRwEG46Bz>`-03{1`&$%Vh9J+4{Q?+Ozedq_t~OhMoB?6O#b`9^-r}=t6cNlL zaZMm8c+jZwcsGN9)8){i@+D(<6Wv70c3q&v^438a9S(snub%R!o%f|=7pR4oh8)J4 zb>iBlqR-tDD5mVu8emXD$u||!p?j*;^R<@0l+*Cad$%>N1~&7_>G1U_>;$`PH>#7H z71E^sd(C9IR;!DwB9{AA6^y!W8)688Th3hy<3XzB9Dy+zPoj)Ky9;t)v)&=Dlx9{J zH_0V``@r~lR$WqS!ht<+H(%Zrhnks#iE?7c$=+yD4K#*rO0E^-#$Bx`SDmO>MLenf zA&T~*F(%$?DGsKFS?~`B>wc`1VHibBTeAbE_1xsW6#|R9o!RX-dU{vs>ei%M5ys7a z1ukgauNy541VH4uzOXh8uskgfJ6Tzmu#hh##}B76_2*&s8x5B|G`adr+~R4za@FX~ z5U3eNfknYEAL2mgVhM@KWN$c9wMB2)g9dKLt+Lx3xV8$KV(kQWn$m`f=x`3AS6n)j z)*#yh&zDE7Vnqb1_EM~-T=@-}srpXOj#QQNRXFUZ#==L5%Q*;*d}c3KB=+PCmtH1x zm>5xTIMAEPk|DBR?@ycUNNiZ*QH7J^?$>5_v`QkYqd7+!8)jOQFH}F-{oo=a7B{R`hg{;NhxJpzr_sLFP8`ZRw z>}SXW0-Cv@kq(R;Zfg1na1kl4&|@}zjp<)NGne)Y(~W4|`(%a7Fx&&)n5A-N74qX! z^s~rOT6Rt7cX95^E$w#X|6BR;h4@@zjN)2E^myDZxSH zz8g!>!?ptdPoD8wK8EM7HzGQS?{IJLkeICSXcd%MOF1m#<}UZK0mFHkWv=z2Wfwh2 zRcPE`;$k;Jfh1idgQ3$kLZ{6JbN3AI%GC|!sJc>rE~7i2wm$VS?o_UQ&>HJfQhi`m zR<=aiGqDIih!{}cbR(O|QcE4SzVB12cE=p5)5|um4FTblc$r!2`Rdtd`LJTb>RHp# zQNA}<5)!N+%XPOd{KPt{3*i zveEWFPyd+_*2VB(3KV>Cv)(fz_1lNecA59Q-8&XER2ZnYp&Cs}HCd!;*S=V5BtXJ| zu)fA|uQ=V1#k${vnBDGy53il_29l!NL;&F`)E9+dD@SS=SDdXOX2JL14gzH}!Gwal{J5bJ$X|74!ako_R5Vy?v@1dI!q9o9bdxpkO|A5rDD z^*g-C{kBq;jrJfc-MCATtyyNm)txK%76or*xFY+TV~AIc%v1Pwbp@va0ndk^)NyC6FFxW1&FQK$VWEArs|gf#{A+qmfXDD>tu9F zXX0eeivNM0(dJwAO!(qDY;?bMpPtNc9uwtIn#G+Qr?IOftV}LC^^J$`jBsW0FTOso z)Y7-JF!O;eC53M^lkNsQY+haXrO>9`awj)dgSPfn?C zMYEWU7Iq}0OZi*g=HSf*f?=!Exd8Rvc5+gD{8)}v2Tojc@utJG=`{7KYoo}wwe6>+@7%rCwoeyeqCy-AIp@Kh?5~WVKf^nKenCCF>h?K0arbb zl)4m5YJ^DPTds~9zIYOsRo}3k*LfXi4slHMX&7{NfN*c+N zj--}k0c-Y9_=dWB{Uc4JCTLzHn2!Vpt|4Q#HHkpdScX^@6kgA7^gl`sy(O8v#I6RTIC8!nSz*%$!?U|8 zzF~&8> z=H9Z7hYl(&;mY5Kn;^|v1p?8!zuHqjmM=AzP5J?_RH3p>T{o~bgz#==iRqgoLj^?@c{JqPP@euv z0;eCvtWH1^ZPhHYBmhiGdY6B&_b|imnGkf$w`yx#VH+0KVF%8Uz~mM@PVVm&(IQhE zmp&0Y)h4kYR}dXL&a+wj!pYH2cd*-{`=EsSgcRxU_y!Q#K=iM0(BLAS9_QwPop{ht z6}NJ^Bs(Y>Q1?pfGC5lWzrl9!L6eJrMAMrEkVgvBl|Gy%p`V6kpsV}w8`RlZV+q6v zaGot683KN=8ZCLiWCBVmQ>#t+WI+CK*4V1aZcujScQZ|pFE0BV}qlPM? z$+IW+V#pAzR_4H16^abRg)5Y^#3I{~sBpVLVl3CiU;)G%dZwLUR#k0S*_jPF7ju_& z2fOsPNHm@hgEOwS3*9uirLEIy3vyI)b+pGjCtdsjDxPil0Q*GA#f&Z=30 ztw=}WX>671W29JW1g9*5qfV=lJzw$zuUL1ze&`9$PWShU1u6T9Xw zD!{XEoxQqiwdjoss^ed*OW#V9?>w_0J59wiwD@o+z87X9H4m2sr*YOjR1$YVGJWW~tzua5KEroQ`*%L*u4(l;04{h8&> z#pDV!{Tf}pl%)8Xf&%D!SFOjbU&J!h^gO5BF$ZD%qE!X0IlSuGjNUdKW@iiYXlzF> zG`V+=X@+tVrs6%)@6tdLN55ObcSc}I6RgNKKTCi6lQ?(@yE~mY1n}{0u7?JQtk16! zpOsZ5k?w;o63cyQ``2xK9kV)0qWUaIHzs^bHJZ!n=b+^B^Jp61w_gSX)c{k@(kpU%sw(5+u&xmOpmD~P1Ib6mRL2>$9`Jjd{ zN#tv)RwR++*Of$0a@6S(vo6dWF?|U5m;P-pSxKRLLWnYTU(H_^&c1LS)@+2n79esl zuW5eGta^*;{vzKEZkyyiEI8?6|CKMtFOBw6u{a+hMBZuqYx0>~2Goyi0*wf$dX=m? z_M>^zvL0cfLP(BRvo7z?H3Kz0XzmV~r2jU(xe!+uC>vEUoM5N@CFhqk56drI1b->! zjMrDiEOYG+|JC}xG^1{qh=l%Gf(6TO7y8OQ@B19!@wi`%u%vlNe%Ze*Al;Py3cYQQ zMb~uQuN7zbC8(|>mx8M2*AfdvQBv07@tQgQQ~3*|QU5CQf68Ea1WNPF*uF_mSxNL^ zgaz3<_u&^=H88jl)?o?h{x|8*VoJ4hc>H((6AF#+mHMZe|ER;mXAalz^=#$AE^ z=CwPd#I}eEZx0Vj3EPwB3Eo-cW)SpPfInkdi?jKm77GMI0rU{tpoCMdYd4+OZWhGj z7~ENjCXESr;3(?YKz+-K7QyAd>J&W)XUs-OOma!_AJ~2OoGO+pxSpO5dJj!JzwBIf zdj_QqUyL?P;Q|*XLv|m@ubyf`-Jb5^3SRIKZ>2vEewzs+hm}Eu|3Uo)BRtQ-i4Pyo zc>esYgFipz2G7;E=W~PKhGL^%Z^jD5?Z_4Oyho$B`t+IG&tI(+{PRuA81S^qj3U`F zg~+Z~XrY>z4XHB8)}Ow? z3ZDJ@?p2H<{;N#`NC7qFq`UhUJ-4}Hhygu0F&PBJt9yTEkZEc#NUH8&IEoarcfd%l zd@E4vhZ{I7**-yjn&m!R%WdG{dv*l(?5JQZA>wAZ=G&;HjS(>KVxJ!tyU zKRgIO{(EC2f-&rCHd$D|jd3$Z0j4lo>h&IV|v)>t)STuq)04cRoEd7eZse_j*;}{|A$y z0dir_FCQTp-wV$dc|cp$1bZFO>Z96Qfh&e$^E7)5MwEiOep$2E_V>SVG&yT!Y}stW^WryC)dm}@$?t6F z>L)PBS_ac!<^VrwhWbhE1xNtxC*|KUZGx2Nz>`KU+7l3^V+uA}2D;S86jH*qpHZJP zAQHaL4`9tLF&nrWn%r>I?xoi#A9&5VBe$kcXtcyD2QAd^ z+HY`}@{0^g=t*Dxpj?WsvwUaeeeK6;Fdm{1~tU zohvLxzheh{08wU2nNh}w2zYdYBuXi|cl4p*uH|Tx-=1kdCx#x?Mcc!q95nq>+f%{^ z=XuZCzdmFYAPknZa*Dh9=_xhLQ-q6?K>Qdl-9`!z)CPXMrf~kTN$6k7XnpF^?u_$Z z-ZR*xCx!A%F-_)n6$+*Jq6P|*x>kDE36$i8{}ma%K?63dJzwP8_N)J}ru|r3^x=oz z+u85f)LG4suM2lq%yrjy*n-l+(|AccY-{Ot%-Bi&_g?;rru?P`&Or$O3a^FV`RlvU4iqn%C(R;+$c<2G&&oy!XeAn6?%W0 zVW}yQEN?Ga(Jg3tt#$uVp+n4G3}xccf-BeyAm6JP&NOtu(OSYvcksVfc6B?yLT{Q_ z=qakA{p**2|2q{Vm~=8{c0>P)LEIcUA*gmfecHS#xnKz!2`7XJQGYsF%DB6GrmxsO zY=#Y9tX5D%TNi04^_uh(6=LFU=qctPxk@5 zXjFB&FMJdj5j+Wu7Wd;I}4QS@Q1+Sdfm%fE(;u2P^v>-o#R(o z3`x0Hi+^pXBw=hlNXbuRfxkIYlj- zDFnHMC{1>;2QChHH;Ur8jk{A?Xmh&M2^Jo@F+zDNR8 z@Gg_=){%Rod<-ahhlZrz5wNlQR!;?}Be7j3vp%1bhUg2-*!siToV(xx$kyb^=q|Bd z=+G!-dUGNC>44^DamZ+hSmbQ#{jeQ%&%AJ5Qm^~+t*W8R75iGfvO}?8pZ;B5t>|G01srD3h3zCtL&i35D)OC{iEk)A>=6Md|IoFfG2aJ>UIcz!UF%=WC~&l!z@&e5EJZU4_pXEM?__%$8*Ndn8p2!w&k0xP62Q7> za~n)KDeS>1j86R%eK-y~MqO?4|@3{NJz5u|p*?!m>q` zOrMYA(Zi$>W@SOlmhQwc&MP)yG##YW?+M3R=$(6sO?$+KZ$fox4;F)F?^ zmDUN@#EpEJF7eU9rVL-p@c1>_RN|oaW)j6cjm2qKeBFlhb)%zwH$K5>cL@>3`#YceD^luZag=!5 zZ;N$3Sm)XBG^l@u*kd%cJeX01Yo)gE#7VDTdy<Uz-Pw8E)=RHt zL%d(`bDF}9F>%aF<9n2@qA2=S@qYS{w5nM5)d?%V;fu;JYuU#*xS7LLQ)i=`J)jnfjY3aL3$(D!jJ~xc4+f19E6R zZ=ZU};GFC##*>l}M0Sgv^98qNihQva-dlk!&8qm*x6rQ>j4SSh8I7-1206NCwY{wz zT)8JND#F6wM+ z9MSJ{BBaFZJ+1qeX6XCYx;FPyuIa`a9JE8|;j`rGE4yzz($2L_W><#2fFoEs2HR51 zV^-SN_SqjLLk!|tKb0St$?R6A1+7RxMK-M#+4<;t+@Sk>^6irbr)L${Ka(+Uyq=Aj zwR2FxbS&~gUVc+3tEVa)Io#9z*qRZ4mv3Q!F>ki8)J<=CqYm;YUY4!6$KJPZI|SYD z359a0l3e-C`cADTi9~LZ#Q4l(SU1w~YS?{|w;lJ@L*V^yZ)nv!ZCGWz0I?*~#Um}r z!|B7si27fNk!u+po<-g?uVr$u^lTJ~0Ds;@34-E0$*yFRD;;h4St62%wH>vRU>${F zhOjC$xdoNxXCt@pBrsX?PF|B^5-KZax#uO%G-5G0c;Zp#x|R6Bo^SL69>Pw!G+QMD zo!wN!6e+A*w>+}Zxpy_+&nzFH>b?rnCA$zN2+MvQ$*AiUn@I8;wJX zV@Sin*ZxlLV@eKYPUnn{z`oV%`RM#>+W8yIYp)|A74ERd^`%3IbpMAZbC}{PsiE*Q z`q^o3REmocfxY9_RVuU3GA9ng$sV42Xwg5}kaa=z%I(l9)+S>g$%A=j*@2#A9)6so z{o5P0!{EyCn?nsx4N}7s_nBf7d}Y&+frE;mDV;FxkX4JpP45x%@o>HQ64ch%_4Z~3 zf4QpIV+Ng5V<5>~aTmf>x*k5jrmtzyRpP);cCD74#68CpPo$yOPK=P3jYa+)YvEY} z{5hUUN13M=Zq03g3xJmedHR;N#cmB*7tE~mtGyjeaYJYsT+tg=xjvAZjjMa6$DO_? zgNf{*OI00DgKvi(bWi9JWqnK#aG;tQI6Kv!(N|%RRGT(Xu@Mx7j2+UsdR(Ddcu;fp zF?}K?TPduNDrstN%C_4gV)x_Lo8y7>r%Eguxj$S6;k7NS9sNk%#Jq#j&F28P{E-a^ zxWh|k7cBBPu<%@VK=NU3WBSUuMzqkfCq}bhaLveWG!{ws^sQ4I@OUzZPQROAa1K!# zz-mqxD?T{ORzAzzE9kW@7W(NT*L?u^J}#_XYL%}_j2&El1P@q4{csfe?RFE2(lfcqMi=M8gRZzE^tiG7j}9D9ztH3;6jfRnZ)juzj3t}xyY>oHd{J$ z^?2R>uwI(XdWFvXMa6>|t5UMMB^wmTOO`n@)F=SBE*TPsJ!dg}rym&$Y@tj5JTBw5<)@4pVq>E_X~vUIZ%A z)3dS|a4gOh(c+8B!ufu5ejA0?lymv0zO;|2c=;J53dYN5$HT|{o#?`+Xe;tq!+dF=kre35NnbzU{ z%?V;Mh#FMW!GB2o!rD?a z&~3sk)$Y4b^L%ZS&ujZ#Hi~q*F*pi)7fM*PzuCglt+b*2jP5dAcFIeqdQj2k(qWAZ z5QRLbFJ_NY#qYjtF=$V|GYjs7<^QJNDC{A6ixc)0>T(U+3z^v(l4csuJ~2?ck%AF^ zE%M0D80zMI$hWFSmPFvwl2d!&z|(72-oBSE zYBnNYylV$8V)G4t{M#B*>ca_eoGi`~k-Gg-{mQ8fB3uWcoV&NPwJ#I*$&k2DNutgg z8a4d#U5pY-Cr@O>qiX@3N){_bsnqnOKy+-f12iak@_tXi=oR%A9XUgU`){e;LyG=b$Gs3)s0>2bq z)PC+6iwNf4OKz|8v{KsZF_w<2IPpN~+;19C2k3_T(t4cyjSmP>gG>}E?Gm~tgV*mZ zIwgN~#~WK7B)dHuMPQwS5)d~+{U)m4tB(rzxF@p`Tr5)%2%#My z8Tv$T(N_dUvFyM&ozJj&*?Lu(Dnp?(0}UQOJ@IRo}@)4xDbI(5AGA8BpUCn9|i=olS^DX z#-3dl*zKod96km?ZUAEJrlViBrxznsb{ScmdEGOYNbBCyk=Z6v;J7|O>5nPBkXkPrUt>0Gr2$VjNY z;8$vU-WxWW`TC6WTd!~~?*f+HQbR#i+NTxo0tx8XD1Q z2)XXO=1OJN)eP<>vyvxiU%{mPK4p0EBW3tIoj(#E$}+)v$~xpdZL!)uOi**`E07#& z%&J$q-%#aYlDKT)E6h@jw29tm;j7^h?jebWtUlqR z!~VfddjNutApM8{Y-pf9{Cpz6@u9NZoX0SIzM~3 zjzXY<*Oy4xd~GHm6L%kj=g^ECQaBTpi??3B5`=E?L%XZX*bbuXQuk$Ka>xZ`{3q`L~J4(HbI}E`R?oH2od_ zeqW41meV|c-y%J(oERdBelWe;TkL4ARFyd9tDtBjd2P`A~vv7IR>Zp$xC+sGw<;GqpM zZ5=L{Q0ntEYI3r}AE-jSVLjPKqLH-xW~L0fxmrDxio&$-TCkoi<2!29>1X`${J494 zp%39YG$Jy7_Gx%s!Nn{7Gvzk?zcy_4v99+I_kq*be`VsQEc-!wf(2w{m-83%=!sBX zIk8aTm@aZ@5E&7fZ}D%`xQC+R_g7C<^_gEaX6|?9W8S*0xFRcLBk8;|6|Tn7x~=m* z;IzHw;rQgl;J^t*&l_u5slgDE=#hTEA-_*5fEEdd z+80F4?fDmT+x-s7&kPBO8F0QN%`=Q%d^^M2c|*@4;!*k62h`<4x^{75-^eT77iu2i zypR$s4tKvln^?J*6nMj5{Riw4f+#)2P#^D#ZE?iBTx0jfc6g|K4`JD2R25it`OZkn zrTU!z_V2L1_x1aQ$@9OLBcQ+NiuT>7lHV?oHEG=-dVPP%08kMfFBs#tp3qqo_%>-T zaSw8sp+0A@^uyTRZQg!qZeP2c^Sh5Ak8q?We!MI>QOB-acD(Mv zgBYJlKGo^fD#K%N>iE^d)45t=bKsy@0-$VLmH@tS0g4lKONbA#;xEEh6Vb4>Vc`b)fI})nb=7KRih{?} z1?KwoK7My1$kg^0>W&r2^4G2+7-rEFS^x%pw^lnLm}suDW_nfxcfDU;YZqxh{SE7N z432fj8nDCCKDJmNyzcKZhpYWG*R4tg)2`ONY>D+&QZ;w2)^9E$NJ4C7xO_A|8rz*O zX8>!n;NBl2`E{pT<4owt(wpkE+qqVDkQc@sQjiOqv<>HP?p?DXlTviZ}#f# zz29%U`~J4S{d?P8{)(~DDK13J{{!6-brS1s`Qqsq7SS3-hz?FfrB+%zd$=m_3vDp= zarpwmNg9Zse|qlIQJ~Izy|j}7D-(t=Q}UnxWY!>}js2|BxQ7eF*QQnI**~^wc=R|D zM#@zb>^(6l0O72}!r52~9zV^FQe;{UfT4H}??=t)vx)4$>QzPi&4#W{S)Y?1-*N!{p6$6ZSwf`@{D%i z#@ucj39$l22nSZ*N#&`@$4sUDME|LT^T;*NTgQyd zk~<=0$r0$Pp+q)K59>LUX;z<0oBWDWP&HuXj+vcB;QRu|qW~^S&RPMLe9geK?|eRQ z)#l5SSa<4%nBg|jfhc~j^z5Tfii_9+y=v#qLS{0p$-OJ7e!mToo5bQmhS9O>>EBl3 zL2NmH5(q!2CAy#azC3XIWc?>?+x5FGgfm@V)!aX`-Y96%HF!q(`9PtStKEeq!UP=B z*MXCa>BlL?Cwsjo%?oMiYM-u_xV8xW8Qt(*$^sSMv*CKeZrb5;Eb`vhoie547PRgF zkiB$vsp%8`+*G~%c=Cg^C8u$`q91be%{pF}@)$hIR!i2?_et2KHON5FxYD3W`H=Xu93F-aPykPq! zJZ+oYcHD5oNoV9e1+{$9tESpeuVte^Z>NZr6N!79Gh4FG^?fquoMDbG6Fn^76ql6TS6 z|r8zs5azoWd7)XzEO0wCL49`V! zDj8BES^Z1R#=<@=Pt635=k|~8gjO0FM~FkP9lqbbU`%cxCyNX+VTAU>Ea{%?VK58H zn;ME4jC|f*nlD#(CyQ?of+-9jFVz?qPSsaAV#2-0k&F;QG)^!^P|1xp_=ep_Osb=Z zpI9Stfg3PoA5DI1rX{C)a)bGVN%3ELgb*@nec~3qL zmVN1B4fenq_WHr6ozCq*6BdBEV|cLuc;-A?SJ0p-Nla%#ai3SwZ9=d}9te`>S|l?m zS7`w|x#T88moksIBm>V~&eI!OZbLI%+BZEv!5$`fep`+UlQ)(N{}2bsr5u!1!#D34 zyozK$wVTk^5>ZKEq<_;>G2)jDf@1{>52)#Qn+s3f04k`$rfLpJNJ~rD4V7sgKEQ9CnEm-vjFaN zS1hYap5rUfCVs`;&N`oPyfvD_dIlsyHC?4Ggh1I!^JLOuDc3syQy$pGbc}Ow8sLYJ zYPw=QiaBMumu1sKUW%B_eVJ`s??2q`bI6O~c$KVFnB> zHKrLU5h6bE^1(Um0dGBR6B0lw;5-OL%8k}=8{l|B+|v;oR&3+Xp03DQ?`sYDM5xwZ z-=NR+?t*S`lBda4j|SR$C)LdC_#f46W^HPJhsG)B&V#F;q24iEc-*lRCr#_TfsBmE z99_i%!_IIT-LS8`lw~-o_-sWAqqqq={@;=>-%IW1rryNdRCbbj_&;2LeePz1voG!a z!eEx>z(Yj;OhR^x;yH(Z>0T=BC(D{O_6H+0s<0^i){5yPmZposk2p%+CwJPCa6UXk zTYpw;`=pFN3sUJCDc4|2FV$hQJyjZo2Y282E%gaN!Ay|6E8>zBE%u^*RO_HOG+R2o zZRuzQOkFTnVFY1nc7nmtk>H2ALh0heRuAi}EyJ4!CEm>HZUAD(CBj|6&+JUq` zE^G)HFa1#B^&tk!_VVRjL<{djTUALg<((QpFxAjsEnel)wGEL0ip|mAl8fx0g#bA ziTZq~P|d;`q06evmQUqrP(YpYRs)M&j!+R$bs9JHJp}q4l~?#y2xHD?x)H`+KLa}? zF1GUNjcOV{QWog5O8&35z&F$0kL^Z`4FqfZK+jm75p?!(#V&GxT9_0@{HY zyaXKxnWw8?ck4`*BypiiE2pUk$$I~k%Wu8f(I8@diu$`gRcK*1`au}Gs7tn=#y$yn z2s$=je+G%e5)>!bX!`)jG3fopHdJ`4+O_lX$8xdWy9~#yCS9n2JIS`D7YftAjFQwn z8L5nsmTiid>2eE{l`9ReTwudZ?jAGB7S%(qF}jmY!y3!blZ-j$Ke9{NzwjR6Z}=H@-uVmMt*Z*l1S>cehL zOI1}n-{E6}k*5*?oc(%jwE9WvE`tVERZ=a}P!MYh)L*1hNjj3?2x?`CE@ z+VtOoc8`m1H~^@TS#2Gr41@?)iA3&1AALsay!iZHAlkk5R?2MOLa-u$!) zTQ=$Qs$&eB_U!p7i&rxH`phs{yi_f{*ZtF3Yj6F_0}v*4VR z7Dqsp+5~e>Xa!vg_qd^2=3S{%*1a==EPivSJUq~?-1UG(pSi6du#{ZPax(t;otCP@ zch!t6Y+yoEIQtD#`fSNn7?>(me*Rs`gdq=TlbtJ5#|trx>MWpbFH*2m_`(>7!T8P# z?c@0q+@cmX{In!F@Zw53_{q)DD;rcTo>KA$EdqKGsUn0Vh5ep2Prz2&7^Algtak5GP77=3z}sXaSseBPGtXqPYul>@CNV6;2{cMOP( zDjUO3aybLc-Vp;!@PReY=DPkH_&p^mxT~L6ET|SnRw{mvzW^dXH*ueK{vz@p>0dj2 zzvNZZ?yW;desDWaXawYSO)_my30GPdw&qG_@iZ;X<`TlvfzEJbSJTD-a} zvYkcF*JU}97Eel1wum_|sJ<}dVG;$O(tq1QL;uCRG`OnadbXajtQBV^Bg)l2^I6*EqQB zzRJkQa6O$Rtnr6&89~~znhVI|$#fx2mt@Ue2~WTQHD^-Gpbnjl(VtzTbi9sFY!ni_ zc<+>Ih+J!Y_6xiG?ZA%uA71{KcKhi|#Cnzvu*-kK7_p(5Qa|{@O+)`W6u&tr7a*Wh zKT}#!xds@aPHn{+fUo#EKEUy!5s{2N>ex#j_G1@*+lcv_nkn@jFsaCB+Y>P00nH)-;W^v-w6-!n9V%lzc@(O7$IcQH>>ZT*F5>@?!S-u zzu)L9Cs+{=7RKS5;QMSG^|A(CSvGV36G!*^co!Gn7W~Omr0R2taY*R!KfVZp><2(Z z2S4!dfA(K%9Z&M-(rYs zj0CbDl8R`*t2)1!!*73l3vO-Fs@$N2fx$BkEayz2fC~M5s>qwRaKFUg7CC(Aw<*Uj zF79)0@~yv2|ACbp%_G`~yv$!%x&qsifPI#IfMg5JZ_n$mulFzJbFAXG zpWCbP?TJ{xf1i&3UWcF0^0y~0$MT84de)CbZc*$L!V{m;o@S!{BVh;-y+kFBZ*1epe&JuVG5cj^lH#4#rF!j&xucs zO28+ue6B?yGvz){Oa=>ZY{;7dUGp#`H(m98G0l^+=4@+RKhpmH_o5dNoy!MU&*~+jQ;mOuIxXD@gFDQ>8U~)_!lN?$^~tv-y-Y( zdXUNft{wZwu8~p>b6>)^Ti185{lT__k8II_q!0;)9{*MU(-iuPH?uAn)hrh|KezAvu+don*n!i&miu?6+ z)-=Jho4Niyzt3oYc|(6$@KsnptXG^R%@aF>6*^DK<#)TLAlF}flod=Q{{Cm0qJ~RA z*u<4rxg1HNQ9vOL2V&G7&pzD=is6C5XUZNzOqc)UFr2X5k3l#8;rdm{5`E2H1^*sX z{^d+h%K=qV!Bzw28fji(?;+TA(!6hD?i_>zi*zTwY6J+Z^4MgUyKw;@re6kAbVKwIB8yeO~XVyiNc3yofBwZb@%$PNOYzWt$fd$fuCxEW{QrvC z;7Cb10o(GV`x^$n^hBggE8#wWrr}+{9Nh1a|I?)ZZT0@M#PGs(;xDthGwi(BD_E3E zLicB3`#rc~k!wlrd+dKb!e(LNbJh`E{`Nm{>hJyc(L~UG`Oiw;`rlTP=!-4(n+`wt zcegW4%3lso<)8ed6a6RZd#TU+PZ<9T(7JLvqj6sIq{`zz`SpkIiOHt6#NXEF53F&~ zIINn9l+!Hu-)sKw9XV}7+{dAR^#6_a_pyYVOr!18{<%6D?%!z@F_my!)^XlgrAAKf zR=nq(4)j*Dw4)T2G1S|DD(<8s}&jC-swj2$zTE<=RkMe4KivjL1Ezx;a zrk=@`ruwMS+7CA>b%Kn|?R-p$wxpNO4G|HYQ*yNLrUyO(wBtH^e@XbAmU}qHRzRi9 zJ844HDTI~*o+cMnP{}4PvHXw)CNYu`u{-TvX;Yk|g6cYS3rjmsZO~oCgPJh71gBb< z*n1(NQf!UC&t{AVH2nZ6^PPin{98Uqg`XW>$mfoA`=f_7m!q5fl4fJ2h%Nq`+ZTZr zvJ*-%v-Wji1=b75y{$_!EI#cgg==vY0N}bj6R#c(Bs6l{=20xH>^xx>O;7&4Pf}07 z*?8(iiB;VfN*WPB4Syijqu{`PIMQ?Z{DV1nlB>{fn@4*Gdp6_X_wes&22eT`s2`;) zkM01lxKPs?io@1Q4hcJSa9lG@vSJqfB5;y( z#<4q*jiv5PW{3Ou<$^fuL;Q;2ybfzf%t5OfH zhG}H|cVtG}XJ(8D^U7A3uS&l3c!OoQi8@e*zBBVnVUZbH*{GTz5|fkckH33QP(Qvxq5ZS5+kF5-(t^dDsV4XH=T+W{*|fdwhr^t+vBsj#Id3 zD$B&>C+hh&H!24USXTBTICsFZs$2*QI(b!rEYmfkJx|&2W{h)7h)}`_VJ{-iSD8+nPqyp4*i4xk?XrZ|mBuMIw>qb=E19hHu5?2| z|2lsM^@s)M!N19Sw?!EDQz-7VTodhm!|-7F#<0(_5ZSZ#hxf$r-I!V2>vyyx$O`Xm zJQDUB!-sUi31g~O=*Olv$BPf&n66(>3V$djYvr8HR@Az7ix*shKwOaIAB@GR-EnV z^qK%s6{+i!ykw*GZ-w7!y?yT!`d4Cbbl%yfNbucbMJPwwj2UqOq>?Erh@?4jzyO(a zu>qQ6-Dbj7(8HJ04DT#8`zCpAF3&VdZC+^E?Zf=d+n(3Y zg0C=+q6y*KQ3iJc>qZJli|TjEvA!m!Ceuoaxiw@ zT8T;}uIQdb1>;()sMxJDLa)dGWg=LsSPYpA6F>_jTa)DeBuJ4eDJ9jPqCH0&?r8y- z^(f5(c?IK=sVg*wl0%#t!LNcHcPX2~dL=es_F2-Wz<`FC#=2_Hy;m>Cd5UD$LTlf~ zNWzK>L@`oX67~(^*oSq7w}oL(1|Gg}9;8s;Q_NOb8c@obXlLSC5O?5~H~wyX_jaN9 zAceeUw?3V`TI3gc*;RNZXsa4i*!X~jx<1Oez{k(}8E+F$!* znl(vUh$iPc0yWs4lrDso8w7|}M#-lgq z3G?rr2-)8(UL@qmMd0ixc0BuuT7pcslqVg~*`zmVz4}7iY04W~=mkBQ+Ck*)AU{mR z^nfYWC!rl1g4$^pEVxoGW?OT3;C+Fuyc#D9kzi!Y6EJiw*5_oznajB7#mLJj-*@D> zuA&kIpu3!RPtj0K@q@mwECoZH;eo+_`+k1?bV08kzP^?1+-^77OJWUF#}tVXwTj@Vja4sAtmyUCtvn&C`kO&f;;v zXWq!$E=7HE+Y=lqw*l+?WVBKO?UrYZvQo*lpkasQeUf>6Ew(#a3ez&U5yP?s&;R7t zdK_tytn<kxBtTh=q>#)ur#Oz`0#`>BDM6e=8|g% zAJ26~(Ayeu?*bUe_(Vnf8a9ym-`SUxCebHr1pe)lM}FkxsKeX0_DcbP6@bq900ndZ z^7g>lSxf%3sIgrwnewwl!s|u|iU&d!-DYd$-fC z9qK*xST+5@gZbUj_x>7w#_;QL8(+1MdzNL271gZud6th*2h+)~6TP5#f;egP#eOIMKS2NQ>~#`E8mc-3XX+mX~M zQBB>77;R>>6yT1`%t|`*i}jkLzNDBg;pETbCw3pRRl0Azwn;%3!*2o}@`AjlOItj| zM>*5WBzwF%j!290#WoQoT2C$5aCuQj)y8*hG{blo-8#pB5VGQ=;O0;(IcG9oEn5tf zU*1>yQ=^4fqYu+Z9}Dx31uKYUdjz*Np?a8`D`V#gmC?aZl0K#4l^Ycuzy%d&blxkA z&`zye6){6Ip>|U~hwH4|i|y&yQA@}-ghZ7x^EmMnStfxBK3|XowxARVEuI9n-MPp1 z&Mz#kPVg3>ux{LW(6WG`p4SQ1DID(AYsKo0rg(`)nL)2jKng!WTepMxP}H@m*VWus z*W!h}|86}wlOb+Ivw#ifp(_pV9lwH-i-ub$r+!!t5QP;D3|2WY?KGSf>{u28(*$~Q z#6RtnZX3X&@rgU4uI+OLb~w)1ZaP1KZYEwN;+j3r5@A%=YGR~*btW-oyolmDAV(cE zD3=`xj3TnuuK-#0qjN6dgMH8k*lRAfc@y1$24&~n5S2pZ>AAulC%n#Qk?Wfxd4a_` zO0YQJ@;B(nG???2=luvPdXRJE?hjQ-mC`H|u$2~%i}@}cl9$Z=1eF?brhFlE(yD}Miitv*|Hl*a?QJ%?9X5c5_bR=0C<5_e!nQm9yf(ICRq ze)B^TxU}%R4o;@YEUP8d{g#*=uLD|o&@YJqB`CGB1ylIdOa~oQ$9iMe2iJWb?nvwkJZE z8-7ew8D$^}&Ox^(9Ksd4B=k`q6gw>OcQOkXMfqr4d zzyy034ps3E_;&g#0nvJijYHTdKajvK8b;6VE_V7ND(Yee05@&$T_|J|8~YU6EuOj> zwc{13R~8G;R?0DaR1e{N!EDe|+CgzoO3UgskO7+WpI}>{l58*M>#Y&D5 zS`Hu3DZZ#LS*>rK&ydsIo!71*bQ$d>)3X?+FTSG^ph_#|f>-v+&@1K$_xS#_W&SC? zIds#DJKx%HA^z(M!M={DJKTU_xzBJH1=m5!1d5Trv)1SGz&=XT)^tg@auBDlU4(QP=JvDc8vnv1OU<`Kg)Ex`CJ$AEh;!@Sv7fAb;wD*%S3ny`=#gk+~faaey-?KW>#Znw3kc?*~k_ zd(VeBQKeVh_Dba@1XiBC_7Uh#2pgZE-A{5oa)XwiJSR`YU6Ni3xf_bA)AM_cd2w|6 zK{fJnxk!m`MscLI+B}T2+vZY>5OX*!A$H1@TW3W{=1ic+tk`B0k+FI`ueUTIppG|R z^OGr{m?VX5i`?am#C3Iu=_8;cOZGlFxhB+rjqWy_jp8dt(S6-tKp)=cp@OG7DbU z;F}~=YStks5errW%n0pi%y#ce$l-L;H!61B+aQN7_8hHE5k^#7@hln6EmgQa9B2uC zaAm6Aa(mgHFH!T0x!W?YfBI;4w=LR3xlWt5Mg3K1cXrlQ8N@=ZsP*)j@(VdfuV~cP zhHfxO(E94*mQR&G>>1}{j`?!B+nUhfTeg*3xuciti)gV+@hBHZj5{1O#)MVrIG_og zPL$$kW}KI7wnpEIh1Di*Q5-Nc(rHZi*%iN(zW_=2j0KlD|)`P zOp7b@dYIkKs~ait-_AojBlOeu>gmkO(o%UOYl`YSE7y94`WAYRXC!By{IyWpmz;u5 zhx`P#;xAZD<$i`q*r}oxZOT?Ft$k)9nBhZYq@DOuk!&v-bK|Ex4C#kEYBW>BasQyB z+Dmq1*v@xXwDrc=Q#xY4QR*78vQsboyqCUf;jShP`o&&PT$m`-rpqHddgp1~O6*B! zpoin`c`&$vj^Gl%Q7%OI5W!#7j*HTqta{qxqGL|3*CP?F_3nw9Ou6NOCnU;nh>(P-Uy% z+}re(SLO14E0nJ8^hqj=tDcd4>57+m8A~jD66nzaeG;l>hVBSL>xolCYG?F zRs$-z-GerIY%37k_X7OSVv4&ZQeM9us9J_e<~$i3sFr*pif$@Dv6eh1b~qR;Q-5lkiALLJ}?xm$t&%E!t!jFeDREGe3mT3OlHguyYo;0jf{4ej#^W zpc#%?vItZUVXIjNEy|DfR2e+eCTcqH_O*;`G{0+>%yAJ}QVV}i3B4E>`mysFhg$cQ8ud8I$j%X!R;z6ybC{%@)RCK z7o1HnMJH@9rVh-h8H&^lw>%rPx!+(T-f^h#b}g{1ZWn6zYK@N4l!r?*iPlSmnP=fD z<9M~SMTh?=z}8YYN_uhqljhO0L#)VPw{Zj$>r4XTCii^-ja!WrwFKmteA3>CVNMyu zWJ@~+jtznOzd=poOQ}i%%~$nso36I+7c6?2Guu9tdNJw`Esfk6m4J;G;+XdU*Sce3 z&OIM}nKAuQXznAQB~BRD1n0cDVedZl2$jv8~26$Ds#uMpr_y_0yUHe?%B{rJU%eIRE3#_~?A{scd=fWQk747#D z#Xk;p81F-u>-R1IWFfc~;o`d;w;?A8Zr&cD4s|imo?fD~)C`~n(LtQDT-Y}%0o+=# z4L5Cq&feTne)RrUgiPhFT;Bc`Y?VWfX4k_w>n95O;=?oOTN0EmdtZg)Jh4Gtf^I$= zu^Xe}==O&%G&+{)_(<~-KV0y;$R~iw@#}U;R?+x5$psk+Vlbq?wrC6!!(@;tx)H#e zm}wbT`LxYtED_g$Zo5g#bVg+3I^^OFfs1Ify|m9O!m}B-1MtoGE|X+)=~L#YM}q#e z3!qr>Em$#3&1G@IoXn|BeoE&N!HTAXv;FCRl*`dez32$i4hF z(%R*qr{qD2#x)scwYjYCjULjG=5sIbnOMI=Z+Y$OR{Tv^kMe$6eg1RKVv*n*BKsKM zwU*KuSRO@3JuxdtWsl=PQoQz&WMofYh+L~W;1d5m@)olQgcDqF#IT8$?y@%PtZ=tZ zRosrp4#T>jZrn_d**fpJAM)!2fiGwKhgQ~JZ%W8`zS#HK{Q|$n755^D+KO8DYB7B7 zITuVIvvZUy*B}MCrH&R|Xl3L@yVT{8y*7099N$K$+vjrI5(XZel5;m`I`a|@6!2C0 zcj4=wF@4i@Lk5z(Wb+ASzX9kCK!>7@a;Clo%2=(k7rg+Xqk94Hp|#=WQ)H)6;fYIzlYwK9@S- zToUpKHZL|b?@b;ozDQAwzILwuD7uc1Ptp+B1X8**MxUH@;^~u-sodPs+&`M(EUHN@y>|6B^eqaKYL@T?i||+mEp}%6#J_Yl+I6~B!G-~{mo{bx(C}m z2RV?(Q=&F-N^OSXgZP+?TtlJ5@s)vq39w?={-F3OeBz zF|Ld@t|l-}w>OISbT>fSD}k~oXU}q_)g64>_kcrI4joQ*FBqEoCK(cElbWnwYWz*pH;raK@NAAu)$jPcVd?+P# z;@lCkrz)qpUY@=Mrlh~xyi|)l^5Mn9+m93C2u`fare$4=%Zpt}(@DtI)DdxP;z}JN zX@p_}?o=M)p{bu$sFuK3pg7Kbk6YNH=(UxkVU^?FOtWig&|nRZr>H*~Lqm9j@^d!$ zFpY8LvsuwwmYg4QpM52B6p^Dr!igrNqnLOntjZD}*&iyDYqUuf(ig1reT*yj;mTio z2gP$TNv_m2#OMU&ari7LwnS4JrH`}Ni*Bw929(U|^mWI-Xy!VbTE3<8I@aD)xcRD& z5AP?cM`NBcc4sN`_^R9$N^f(Tg=``G<;b+A_V@(th6%e3CzqDUh9-1Y#J0`# zu#HZX2rI_GtWD|NA<{fX$f%I{`H^jxUhQj;%`%^;oybu5LZZ0IG#Ov{%@PgLJS#)D zD0gRp8r6L3O1-SC5{%Ws!oI|?U2wzWZVHwz!_c`yrD&EHs=h@?{~V4e8=efc@LNxZ0$PPp^P?3K44LJL)>d)^?-9n#9>A)U;C3wwv)G)l;jv z-v>pLId@%}#D_v>Ty^tptmW*>D_WV|UI{}5(R!Rz`O|f6O_D-H1v$bih`|OuzD_uMk%CP?m`vA zMD|dr9*>%uj+X$r7L5V!Lc#FTO4EFTy``oVVu#Mw@=0k5uf8y$59#Dpo{0LfxqvQ; zKK>d}y^(3=CRH`V7SlX@*pMgDT!~yOT{K0Yn!Bh8W;}3XqxtLIdrgHSK~4S_$te+@ zi_F;OREr7yEkf*jStl4tHvL5*t+ zoHQ4V8>j*3Hf}(7Z8^fkWKo=#p4_T)N+&2vm)Wo7k!EwQn}p%kI>TX`(;@by-Xl%| z{=Z)B@m2urex8e|oH&@WhXSq8W(Jkandx(v*2$NA)iak=1;K433-{hvgFD};_xfAy zo@@?XN5qGe-CXIC*o8XA@O^(KG{O6tuoG~uX^vZzuv)S?q%2NllrF$5j4p8B-NjL& zcuUc*iWb6zUZOA(yb~Tf&=-(=uPwTwZ#yC7^Hb0Ks>GA4wmvk#;FL+F65lqc*_yT! zl*ZMqQGUy`e4UbLj9mJMs3qPBw!p65z5Fu>A5T5KYOHY6yceH8x=ALb$s-|2PtO|V zgn1pOvvgo^M~qo)2IIaEj?u4Lzvw%^#Gr}rQ{XD;>{MN)I#5EdINufV zpCg^kgflMEzz;<*&y96z+MXJFKzKMky4T0t+@mb5yQ+@czOnbh zZ7N5+izDy4^U!1we#XmfxS$VS_`setkC)B2_oI+*;@)_yS&=fMPI?kO@5m0M>6H+F`w;Pry$KJ%t8u8sLF;q0N3n;*K!&SR6FIEi@;`W>A@YI}S* zvw>R@8LOSnRf4_@DchF!7M^c!*s?lM$Xc`OtG71J_X=(AyW=+1m$avm2lc=v3^8)x z-wG#TUFiuI4pF5PHQtL}J{DysQ;Mg>-H|2)e&1?$6XTZfcDg;eaxSG%dh*#chAF)~ zSProQoMJq5Q+hiJqbC|YUOJUj7Z18w1!GHjTU$%)$Tjpc!O&h^E={pF1>P?WJt_02 zOUKQ;WTxtyT_5PI`1kKrZEfO}ratBq)WlqaADhU5r4ThNj7tu~K;cu{JDg!j_3iW*Z``B1t3Qk%6K@Q}{7)aOO6?R57*$HNV(=Hs?ty)XqI@tUP? zkI!5~Bh6SKy3PN(BWFPtRYUHv1*#HB&IV%#*ao73f%Mk8B zTNRI`CEuvJ32pzW{2+snbJSH??yiQCPo~b)&J6S@f=QVkpQYD&4DES+vl&S9_(#+c z!o_DU$(Lt&;j)Wf2t<$VS{IEfHJ5NAM6MNo6G=50zg%wPw%B6tdpc&>-D=HC-oD&1 z@6(DWck_hjoY`7)EiY}IAodky^F20Ogn2<20rzOE0&$Sru6F=Vn#b1VbAd@>smqu< zX^BU*N>p3KsD%^z=Bx#io>&joG6ZvMJe?JdTtk$d+tyIHR<)+OQ94gFl;fCGtAM}*TSC;RfU6H_P1XzzZ3WXhn z8Gh8SvXU^oMDH*w(n1THpVP=RS@B}A+n#4>a_Bc9LA}ULdFjXOC*5n5pW??!H{zZx zD8BP8YRzF|kN&h9RF2$}p?(LZ3~QDblGNAAO?BzVPI#<$RxAf0>8uy7`m4`d%U2?0 zEU)q|y)PS-gwm4-9T4nZ^JjHbu7V49O?-&i zpY%duqFxpHy&)#Qv5P$pd>+mAkjFpD4$ki|*0R<+ytal(wLfjo2lLJdvHhgrJ!O$l z=Jh@4;7v!vnePiL$?7#!kK&Dr`|D_mxg}&mD&^eLEcfn}l4*4tU>=WQTXaVU_Bx@9 z48^?Snn9ghk-)yB+mP^VhE5d~ zudw@a9}LwPwMc3RYO|EdaAP`mt{lI<{(af7liUmB)FaPj9Y#X^I15Dk$1a==`b&p zK5TEPfG(iKSPJ__q&tnMV^_%-dTQ4%-jRGPtjHyM0lm7uVYI zJi7Eo*cX1>jV)($@IC*Lip}G>UpW2`d*2z?va6Y0`a1QZBGN@xKrfYMv&5a}gAC=bZB%e7`?m@g?mh_>EL@4X*{-RPE4(3QRRk0g2-1?aQJm(Dh7 z9k00wHyWumGsSDx%UAl4PR+{2Lg{P<-)5GyObPl%`N$ZQ)pi`XJtSh4KW3Ix$P_Z< z+{l^?7v>s-FE+ZrI8)U(gKh_8(?N-=yx@xw)FvM`SPZU3ip{_bgKXcXP-&*-@Qo#L zjF6YE_vcb}Rg1JEoGN`j*YH8#+;U(bO@(fTAWuem%Vr(449g_xjScYkq*f>Tp4i$u z)inuDIPtkL+ zVnodT5^PY@#2o^8g*%c@szK0^B>*Uk?Ty5!2wZXyzSe(BKk)%_)>J$QF|W{YzG(Xj zgg&g07e%VeYoj3AhxqQ-?YgLogC4vUe(uLvfbh;6NYe3=uWxQ3*}NteC`_`!O0FVZ zY6z;%*9#HD9}sDS*>Bf2kf?h(%Kj|~xBWM3Q|CXHXYw7P-$AUk9N}bw>RKvA18!7Z6b?U&6zKYFD6CJbWGNy*G?lNR8%ZpWhq| zZ=N_E5U*f6ZH0^it}3~6bvi$1xW-%H{BlM9#3i~cX=g&Do(|N-pr2UAGE!p8A)p-L zz$Q)+1M9ccbm%Y!WUIZt7K)l=hdO9ooEz#I3EUxIC#Y3wNE;ISvVEXXLh_-!3dKzd z+SGBtu(Z=M!Td%;e(zQc%N2IoSL65@YeSv@&)&VGQJrdt z3B~8m{qUL^dSWu>{zU`il=$*{794Y>;d<$x(z|mHeR`l(Tk8r-ZXXvZAQ0j<#tmIx znp&j;7xoyZ92|rsIR}}y@dxJfNoxsvFPjI$@F7PjZIbp$Hf+0cxxMY*j;=ZWh=lYd z2bx@83Mw+um`;gi<_s)c4l>|n)^^U*#!Vu6J9?wK=9*}<5y|O|vO*I&t}l;DVRKjA zXI9mkSKr@>Z3~|AK>#5dp8MIJinjY&q zQpFAFNI$(ZcRdpJT$gt%c(r~m!O6J=dOb{50>Y}P(8Ndc{ki@@ZlGJx~X{m$d zFxSr%J3Vx+@M;%w1m4+Ym2~9uS|=$N4!d#1&18eOLw|1+R)9cB1UF)@&7kBTshh^qCxm!OhVOgony>{XhTZBVEanDp) z;l=XjT?Qqk+#ckjq?F@bPG_kj#y3?1jlZU@UtG<_MJd&1 zt1M}^6%DY69<(kjhT@#*9^T3URAer>LP&5b;o<#TGgFduz2o$TDr;T+Jr0uaRX-3|e*&yV_wm#B~P0fex!}XO`)&`9-2*H3f>a7Pxb#)DR#zN^{m}gqqPv4^&Xa zJ%|q)iaIjLh2$}u(wFwGh-`{7OlDu}tL%NS6y4`R(1s$>BOkkJnT?p+9kekU*d{*Z z%rfb$8rOv?4hOzDn~v7~zSfDH&440G%r<>^2FisJv`xYw1={5P5Ebsgp}Jiv5hOSc zCNASmOj&hmV-|FJd0Vi4Qk*X5Jz!A54^>c^z&UDl+VC$XrVl{lcaEdQ2!6sG1aM1T|OrE z{HsHq(X-M(eGQIR>D~n?qfW4QW>Lprc#K2E$Q@qpKB8`45tCHu%qs@TTJ?7|8@-<& z>CG8$;J>!`$A&A4wl zopl;(w`7&U_45_6t2+CVT-}2c;Nw=47*$e$f`!-6H0Lm;7Nfdar(fU9!IHc&%byct zTUY%FDI5A2=fkR$>~m14NrE@9QBb|%Pp3fs<|yc;wbe$3l$UU`eR1|yX;A!)lP^_j zypJTKR&JUgBj2Y4*5-=KySVSI<4^Vy+wZ>coO5IjV`OykU7MUvDPc4n=gpd2DVyic ze&sqnHrlnedzoAeRDO(3Z%~L`cvjO(PY%Q{~4NKRiF85^4B29QpX6ZB}13>hC5I7HkbEu`8`;y)6HV9)r@4xakidVO>D_R9Z z6h2q6blXdCsQu_g(;A@nSNE}rWW74!dbSYidaE=^)`u9exj7$$SKUv7B(7G632+z~uEpL6+UKNL?aFr7qijNAr1RfQ{d{$N&Cr3Dh zSZ2Gw{?p>^}mmUTE2Ml1rsP8A(>MRh{y~bs0<CL=@#D52xoVwDXZbgFa+KXQh)Wrx%JR9aaswt00HonS`2Yo$P8k05s~) zr1E*c;qn1gqc)mO==LS!5B0cOMvQdIoACRNQ<^5u*~M~0(O#_w!X1nVZ6VE{PQxpO zDiZMKjx+pSvm84fx{`{*CetB)E-d-!0v^TpSiT_Hz4;7LOKYb-pG%)%b>)8BPI3hp`84&>z=X`PD|C`u~<<2^!VQ< zScN|UE=o4?@BPV~YwEwOG+$dEx%6#u@!3_(9NtV5_E4wzYZgh6&ed@Y^fC37-2?|} zi<}!TT;IG}dvT;@TGm+Z*7{_-=#t&{T%e|K<)xhpyJ`lBPW?`ksrIT&eRtzlYnnv^ zqRjpDKMmCCvj_}sxWseQh8;bmWaN!L^*Rm&L}quhC}sAWiFM1hh7QnmPK%^di~i3q=)Y{+3Jt0XPS5uyHrLKRH0T+AFs|!E*2d;Gn$2hVrzajx z+}(6{W=GB^gNH`wb5gDA9Tqxwm$g?u^O>zm2`TNcoIPT5a?`Qa2x&>RnNFQW>I!Q1 zxS=*7Fz8uU&n`bN84i`i6=Nxv-bC}TEsS2LW})kgj=J!-vC6#=0P3@Txddzbhq3EG zmR1-@qiYOW+bs6`>R(M6$Vq#fCUI;NsXu2`rQ_hoN7#M%DppsQfX%8l6wKQRVkdiq z^l*4X?e+?ggPsQ>^JpIq-^BH79E`3bH+mBvOF&({}Uz5Po#6hAZBoDq#fHUlr zai2oDuY3_RThxj$o9De^+Ie>TiHS2k?tSonL_n1#$E_z?4xSQ&-gAi6$+4A`sroO1 zR;&90x>n=bu+^{ft6A$y6YuhQnkoI&jZpb5gC61UJj{RD!}aSx1RA>6j zYW)?{4xDIV0RVw|*}EjZE7#LO8+~kNZbqGWqjEG$_mQFObM1EUL{Q3n%NhM$p5K3C zrLvio>H>F`zT@KE+ypN({>7Z390=#ITFKm3c$MqlXAS^X1;~FrvTV3|XD)Zzbi5ypw)cpBSmyUstwtD1U1&S` zy$J+E5IK@5`;bbLpac^JQGD2HT95w{fa!FqXmG82n^F8ZK(}dxgkMG&?&LJp=}&)* z>-w>6o&}()1gyg5gCX=bb=JG9-jYC`5ERx#q|69?C8p!Xzb)P-8h9Fk2UbGL^6yh= zx^;Li90d#T3Gwmm(iRF#=Q^D|43_z?xbfe=L4#iH8AVpE^zHpdUA?tP% zKcUJ1;G<{e+0T*V9RVdOd33$Zh#*)t_BU($i}2+Pw!DYZPsMF}2)4Br!#OUNFlZGV z+5Yt^TdxQG(Z350Z}N?ic^AJ(-R|X7ex;jVN=HLyE{9JcKeonCy%&h?S3@t>Zx08JAxlJP0bN$!Q ztDP3<*FG~O^at_8KL58@Z+&&_7Ln^w`p@T`cEq1L?&(OazCB*FZyKCvAJ?zRe=|21 z;-%j}3%LNGHH?=D3!tit%x(cBXgMwZa-HH+VRY3;Rh^XlNN9V*S-%5NPo;#%@D^33 zX-37d^S)@Yrb7L*7+L12u>Y@Uv&cv)c8x8+PHRAslIE9w_|7!QJ_71aRWiCht4;i}x{n z!!8=_?Ku~fA2+~V4eC7RG{As&btK*5@SpDi1W`+w1+hX7eRX-rYT{lFIp7Pb$fp3cb_7y-40de?EBohGZNT9J{ zOgmDQL1QYC4gev|0@E0UV-DvqUdgODj6AfR6~>acpxpVF2?F;1>sZmhGB>|L;6bPP zdXgG>e9=Oc8614R8m?`I$+@{i^ouk@quOoN*tZJLw`s@ZUv|7}><4+Kjyk!mBFHgp z+M;h)&_iI0ryShUfGvjV&W3&uf@bM*L5aa_zU9w>EgFLUNki1q68fvs9tEyv=oD`A zEa1=HTkIS1^Xaym;%hbfqwTY_(%TsErf|JM#E+)^JfMAX5_*h*OHIkPJ4u~YmtZ5#{hd6QxgeOCcHkuxz4(%rx3k8UMz`O~uR{xmW0w?m-2 zn^btOffXp3`HjhkfM>6b(u$a;9M$;O1^>2$r!H@X0e-(8{&q?$D#YQ<{cWAVjm=S) zgLdp&v0Ja$nQuO*P~hsWZDmd6cW7&+_J3cgS(ay;{#%tOapxbE>%Xn|JmXdX0l;_D zfuoB~{(oTBvCZH^`wCeLbg()XA7=r6{q^%J@GVSbhrau8blSG@7j>3GWQOFqO|@4Y5O4f@zV&Z|dQ$|1PBVn^A}2;Rb&b$5T_Yi3PdLQ?;CLkvQynn_^ZIU?n0qIRS2C|r+v=-if z&p~MHvpBKc1Wu?rgGG3bd@%s(Rc%?}AY==)elK^^5x%L)@t}C*rWp}@u52aVP?e#K zzu|h(n-N@^1!4S9RYsDzh6VURXZA4Sx1p;ee)Hv$=f1z(@XEK;yC;NNX!{^~r{`@D z!!kR<{w&;D!4a^6gQ|%a(g$)pn>!n}mpu;nDnf;$n;Ov29@miqQD6R5b z;+IBHqjNjiPwoJsmyw&RIRvyu4%>JIP&s)qu@_vg^4!KnLG|zL2JsIW{R|n%HIlS%I zRTaU@b*J6Ri@w7+@S5MUZxRu40o$(LiKo=y`F+AK6Ax`#PRuw}XKs&0gSNS=rgG&Y zt2g=2qd+Zz?M5+qbt{bqa^E%UZLGkp==?_3A8gS)stTJRUJp`OUqLD=@#%pxQHmsJ zC)1{1irhYYJ@7dem`>4gu#b!I`4nTM>~Q<) z<~m4x*pvFQHn$K0&;Q2bPX#yET;wVhj~*#^2blIt)@|SD`|ZF0`XG3ca0O@!Np=7B z<2+%z3GLIs!xgQ!raezf)34#V11hR+XI8#)e7n|HAaBMN+ey8ET~q>;y)bxU3>-S& zZb5B8T1KO9H((Tc+UAe(0}*v-zV#6JTT!S##TD+}7J)gaRy>F7{CP&5svt z&YFOf_>C0-gLmB&ZEd6aZ+^TG5WEaTC3@Rr@YdVkY~DGLa7b$V&5t9180|?2&`aw# z1~113Tm{;3De^ZzZV$w0gN3+muc(`EpVkIz6dIrI@_Qe*;Q?aQgJ=GRhXfF;x*1ry z_DiMy=EwDb7<%FA=Em2^IM;7}ychVY|Ec=l4gG(r{?F?6KUM!{EBqg- z|1&tf`5&tPBkNZEAFBUj5cA@H1m+*ft=#_z%s*0VzyA@Kf9A{oBQU>5VAA&b$tHUl zdaVv|Ry!Mb6q=hg#EPT^IlDarr0`8@6%6NdAU)C3G4FxBTle|vVTQS{p3Rl5fJ5-k)lYu)X2RUZbTq6;;I)pQFjj8|8m4@TLUTe2#ml2@jWu zUzkca3g!_gL#PratC@rCk(f8bLb1YA`4^{F^Y@Ne#+n$x-4$-IDjchESl0g+}hpUJ+ztxss=nJysv6ox>1kFALL#jK(bm8QI)I1 z_2B#9M-0{5%tFO2LU6c3d*ry&0Y4|2!!oPqvr*$s?&EJ`hC}io)q0Q$7JrMQN1dCc zVZ0@yr}CQCGiw&>-N;hPwybUqn3T8HPIw&VC@tF}>I20SA1bF}D8}QFh)c})j~w0$ zna$8PACmFoI9*3nl|}r9Q8{sN)wB_tQ+b`$x!+Gj_96bg+f<5CqW7=?j?lG1qe|sB zCHJ-8IXhHcSti{*O%H;)y@8*AX}XLvC%D;f484XQshKP4(_HvSf;u?%`w=Okb0rhu zAG(w`J~o%JvA=l}E5U)UW;Uv3$tmYB^69y=eCs$1i|PAo^3^Xc?WhYCd0|Tp-Cwd9KyNgiqY zYqLw+I-Y(-xFxWC45a6h%%L7QJoyD{aW-dZAhYiFuYe{^351W<`8iEbzT3l7E!%J?JM!h5Ay%tZA*p?!6c2A0*JYwC&_n9P$aKC3APrpN(gR{T1ng0CEIuN@NY z6Trs(oWtKTLC~Ri4FALs3o_*G$&Zu0m>}g66}f#HsbP_{%0n*>3a!bNs^u%x>@hCX zn4V=A2Uq58vgh?Mx&l4~tatB`{s>Q=lI!a>x3E;2x+}r?J}im?`BpKC-B?&o(v1_;d$ z{^>V$OODD`!nU~m$9_x4#3NAAXR6<8@3{Ktm|6FuW2Pvd_ywl#i@!G7E!0H)iXu1E59-4htn}?W|?@xkxEAG(7BFa2xmItCQEi}teP7SiJ z_>?cUb+1my=2+eSssbnbcY9*#b-fUr1dFMu7DKAclolOJ*Gl{_Hg74Ewh$cTh)PxN zg7Zy9`%BKh)_H+CqFz_#$n^wR?F&k zFRPNAVSfT7lIMDXVx&=NVhCRpe(FU#I3e6w&?;~F<5=S70+4>e6@VRkH~mHhW8H(R zBYP}s*O>L&$6YGO1jdn1vgE88>+jN8OUFD(OZ!so=>KrvlU+${2al11)@(aO#wf?Msuha|`8X4EmuV4mzX=LTW*`o0KopU~GR^`x}N065g5 zcKFuMWbW264J9!I^woF4`1S6=U!%eX2~-4M^53oL^=x+Fey*e>sFb8|4qWy2r6%zh zmZkU^`K)Q|W7S@JIOEM&^<2tB!Tkk(M@v$IomO*xN}<}DmoHx$2@4D3UndxfFSo03 zUZapnJQe4hOT2D9$LpAQmDq9(fMQF~F;4-vXV#>S2`Af__;g+AsSsygEn>kkDW}5b zi6GWn?40+q&QOPsM|arpo73roP{Mk=a+r?Al$Rwa_>g442&oh~SyL${a!bUeJ6Mo% zIX^lPpXhjanDp#`X75?s@K)zY>1+=BPct;OsjTznRdxwk8x^mGMtR=wx941N_U*Lmapm3)PA?RlGM?s5kJU^ zxlM)j-BHPm8MJPH60M9A>C}TEMa{|%S1I6l+F-t+A6_yt9=YufZ)^9+Sdhufr0`Ep zZnR0M8!Dy;Qt=d8LG(qM5S&;yLN}a*9lE$$Wft^s7S*hrM_ei5msG+g_CN<*Ggn*5 zlE{nMpa_kPz8Tsb6F(@HKB34&VQVYB1Qv7VCROI~E|>^~ZT(B_;nOkAwNFp_?`^jI zj{}>iO=D!q82@%F2`sYJ$rct+rigkVDrVrgiqwLBIUZbyATa6Q8`L%l038qP#e%Of zB~~hN?(e4{1<9m63-4(;s>^U8kOk7(cp}ekhNPGCg%Di1j@`Sd=k}p0l=tM9v>aiX z*~QXHu;nrLC4?KDSsOon5MQZWaL?UFZ3s!jZ2s%9dc$3m3SzkXOzXrj@I4`%?C^>M zkw>LQf(0>N&NXU^0!)%K1veXHDgAuoB@>vi8f!QzcfN3(?UVxTYleZg6pAm|aa~8= z4eMWkH))?mN*@r@hgp`-58GDjg}&|!;VqaiUubOX3Uck#DH+b~&ddo8;o&b6VfUJU z>`p-E1+0%J*)D54lvJBNHfIXa(9}7{r2S&dqv&DRZ3CX{To>L#{HwfAZF_5VZ4v!* zaMjBB4eUrDc8*tB5)82#;zJyP!Xjl}U!2IQ55g!?!pV^UWLAgt=oDsA6GMEV(u=Vq zv&oi|j_Vly$1IRlEkV3fjZS4qYK)FBJF!{Fv2B53B{Tut;=y$C)cxX>3i%)m?CX$X zUq@8-LMDG1AG_!3msciBh40?S=G4Z9RI=wc5BlV$5PF50rPLE#>Y7h`|KZq^Dpu>- z)qe~U?46lw;ko}zy@4C%6qBKQ#k;P1DxPhgi%AJ)J(trzQcn@aUhMGE^YShwr&ZPt z!blSAu$j0IT|Q3p?0EzGS=_k67Gsqy(eKAufc(7^CFz5_J72b)4!Fi_}mD8k4K zs_(UCuAb+6Haaf-Px&RYezLvo7Qe?WTRO^S%G zU-%T!%xrrTM=v($g4iTZrZp6lEY9kcmfS-s+%i74{2D{d7V){93Rwnm)xaaAzM5a|M-+-+O7KV1n|sFv(d zHa6%!TPU`7DHSdh%#Je7DzAGNko*z7uOmjXGTVpZ>m9~bA#dP0RXtoFBERuaSN}Ycsa^}*X{Uan$X|Mr-Dm!b`$BbBko3*wD1w;wY02((=!sy;= zEHC=Dd(%v*4sYJ*2XpM3YTu-C2k2Q}jgSea#hVmp$>^*2;T}svZn7RM{MvXJK$eR| zeI_Z|UXMc)RW?XE3#(?$Or9Py3$k1rIGuDOb}@ap)vlWR%Fyy_xCFOE+ZL z`ZY=8+LcAtZ=_PPePA^$ZM`?>s|BA#}Zn zq!rFjD)2?3`}A982?I&*&-d_-w4dJ9^AFAy<4qcHVUj7UFRxlg%odDTVi`Iw^N(qxb5lGL`YudOO(Iq%HF;?fKGUz*$j|D@q z3NK${*kHOrxB+k6uIj2D&SbCSELp@vCXDPFxTc%mTz-Mw1OJxEh(e5$XUz6Lk{~%> zTU)R?$f!jThYo`1kYUI3N)O7Fm?OkQsGtJJ8GWBMC3AZCLZ&wzhgy+O0TL>a%t8A4 z$bIASghT>TUoJge+S;)A_=Gl-r39<0XZ;JDmnF8_5|c>BK_dp&PL}yBf%|Y+BI;n( zG&vyRgOY$W1?qTT99+T|YHnL}eVgASOSV!wsfyl+g;m6vrG;O40*8;FS4JYj(q|k* z?N);Ws?>Dz@vVkb*uof0kP4@d;qs^PIQaNc!S)V<0)zYd0@tNp{0-_X>K&5%uepjA z5yW2)oImH)vbY?C*qdmUeNeF8jt^p{v3yrycfo$+)D{i#Fc0R~vw>kp`%U8}l6-{J z4)93trayilh<9*pzd2VyG)@1M;K$${W<%8$IE5aRL=jRp7N<;=i6>+dhh&)}V@WUKQ-N_eM zmLJ(8+1iI-U-HaqtAR_!3^SkXjmN%@fV10XPdXN8%#NQgUg= z%rv{CR|e9?Z(Pf^wDJ!3R=s!z4`&^)E|v|V{Rud3kJCPtS?EMq0!L-eYgtt772If-edBNJ|3^yBtbIp^su3Vt zLMoNKWa#uR^BAdNG1<@%v9;@EBWm}i%i)G>=?NRn$`dzFmSGa_-6-=b#@92;b9mVF zdt#*%oAPRt`f8IXNbep`qUTm1Om9rUmn7VhA6>;c?Ees6o=VQ6W&6kB@;BKS6h8bM;6)l6f zLN8-5W@X)2TFE1Ucnhjb)C*Xgck(0Kjx(HjwiY`4ab0jN`)JXicD@y+=$eCD$U-KOjlzbwm#M>g+L-@^35=0 zN{glh=Tlb0UuNHGY6bHi@X9BQOxrr}NRGu>Qi|sFNC*z}#x)a*VSJU#TIp9)) zqWX}PVVz_cc_DAobnhp54(~%|ofL-!?1aI+%Vma(wAz(pJDQ^11d?hpG)*s(w zNGp6)WK-&u0EKO2Y-G;O@<&bE?5B-t66q>GZ8q9qf5i-Su*zlzqqSjSRpCr_WeLv0J<4hdPX0T!?5MCTI-`gxa&EW%gcc zZG7wrTU``?)WDhPsE-QGX7zkxybomfOD9V|=yE-E zZE&Q8mO9Wiz$s<2JfSy{HXH8^A1alwe@`et!{8)>nAwWKe*44j3b;g>xK-=;l@eNx zcb0Z#r0e$Mp0j95jhh=$C*DKt(O9NHd~bQBHEyC&No?ToL(=eTCg=1Q9Zz`p*l;Mx zifUy|t~V~^YR(!E<=Y6#%wBaR(YqC{>Pk=w`ZVaCM+G*hJ;icRr1-~UQ)WY7;!rD> zW=h-N+c(KJqCLC%+g7|l$sUJF5_z@fWG&KBacBZL=!FdF6Q3Ye7b?&|QpnIP%J`mh~nZ>@qg4F|0=Igvw_G-3h>0~vVReWU}bSI09ot4ybcRt_x z+LF=SVLiK^W#&_!)98p1*kY;9W+c!&7D`S`&PJJBd04RLdNy)ydZ7=)(Gi#`>>FjM z@*Gl~xLcHBK$Xb}u1x=Qdv&0WZPejK@1NNN_Puv_K<%>AZf%b(i{5gQXy?zy=$~Qt z#!o@vdn?6vM(n>;iAr$DeWaDme~0VJ07GH!jWV?m{+@7d5|djhM`SPu#l)^`tYUUf zE_d`$(2-7Sfz{4I@w7b4L`R*3^{%4Iyg_|47fu ztp{EBz-K*INy!uKx|*@p;OwKf&zS%UnWk`lIYwEv=SAUP&CdCvTLl}DCuSy*Z zu~_G(o?$}Qpxuft7izHm_}G2dx10z_ZI8a5lN2_&w&;AJuJp|aO)M*H#ygK&nXloL-}(a%yQC9}Nb+5@9+!6?t7i-0ijVYBI8j8YA9pL66l$?#evr;z&MQRGFK-~zlXG<8YO zsmG&K7n%cba4WN=Q1-w<_0S1>QpF2S!ZP<=W=;rORqtFM3$p{Nd&3H)r;43|FJUW> zxRoosoKA$2G`(QN9dsWh09xA;X<-`~)pIeG5*zY)(>C=?5V6(qc-*J(hm?|QZ#L>| z$-3^C+w14)Wl~oTR+1Zi@*3U+F}m$lTH08ZmuJ3m7@L)E!|Jy2zM9LaMBlEoHL1Ev z-IJjLM=qD1K#yQ<_uRwo~z3EfurNEX+HMHuJ!tlz}*VsGN;}FM3_t zl`f1l+JdWH1pT;+uX%Xdlbhj5As^ujwZp`mBMlP7eoP^ZWtQJiSA)f8-8$wIMy2e{ zpO~UP2Uc2+QhD^a@?lq|Dg~qfq#~)k8*e!NC}o9b1D3NEo}FjJ?y0tb;hdeFiKBVg z2N4ocEyQN)Rg3n8aTzvGNk~!pZFOft(GvT*B>sp_60*%fsW~DC@bw~7m>A>$6!NkF z4@u$4SyPP9HP%=ty{H2ch4s5~GZyrf)17}ZXK?!;yLRcN23)tM%3Nc4xB-yeDgyGUDUSPz19;y$J--gX2i;cF4yVpYtyDjVsjx6i`px_t|qB%0+Su zEJrasRG5WZo9oFdHO5Pq4qm(TT2bS`Q~qlQo@Tq;mb-R<@!&2P((jwPlG(+Cvf681 zq9xL@JCXZ9ziaJC5oB6+@iVIJE%pl6bCq<+L+r;~%VeyvCS6OaP9S~U^uepn@Yq5K z=8|>)3x9c8yx+Bt*IgTuB^&)T1D;xWWQ6$Xk$#@n^@Hsa%vo?fERU?oHQi}$&`&V(`ysdcRti4m^S$;Y{Z`(UXWaJ$7X^bk?I;hnqk%1EaZJ- zb+GQ3A;;x|RSIj@-kFaWio-;$Z^|JOUQ;LEbC{#%g->+nI;1ba6vVurzEz~PXc%3a zcf_#6x^MccmhMb;RYXulFDu3@*3aa=9vU22zNej3-jjNj3sy<9;L2cZ{V3Bkb?43G z_d*S04*JDb4qSK6gn1mtvSKd;+e{be%qB|hm~yk3i+Ij3UWfsW*@RCBJ9WG0RCpDN zk7{rCYXHL~Pqq6p&ihm(t#0ngr;=bg-n*(#tO1>yOMhO6Qg zgB6h}yTOmvH(u*3joLuo8>$ZtV%CwDx*Y6BUv`Fk@T3DBML6L40zzs07w-Fd!cq5H zgPy5o<<_nZ?9j{>$SQ^wXj-%h%#=&iR~w2{nQ}#cHe}i_K;eO_W9&^(4}R_U7(Dj z)RIlwv3Qj@9(uZP_YMN7a06vsw1R?BVbMLOQ+pYc&|d0QpHKcrON^aoz#-%l=b)E= z_KE-F+6h)_Uhl~~k0sf6&J#X8DCeA+{yeR@(h1FyanM^P6Rvy-;Yo0a9uhdCvFn~a zSZq&e={ik&g)2f!hAgwIPc8AEwMG$0&F2%26wxA0v6eA@{dk`g*h1f7spx@r2!TV! zWfrmlKxG+3cAcSJXzzcz-68r0jWy%_L9*b6y{ zhzYj&V=g{oNDo)edsg8Hp}ULArPv9bdHreq{KhcnROL$k><#_S#ky4mr2XCKP zJ;5FES#_$i&Soef;$Em=WOKT^B(!!}+KJ+A&|t!6Afxkyk;jz05+`Jty3F_GQsYha z-8VyyYhAo>09YS-VPbut=1_d;n7~uTLkbtQLlt;b~NjC`i@p<-&Azb;%MWL zd-3j07j^-|jV^a-#pqkt?g!G-xx2Uk*tB!%;5*Ke#mPPNYuE+OAzc0WY zsd`72Sz&xysQJKEqwJmLzC}&ydR^*PqZik48U~Cdco|6J#PT%46=H8c2--!xj_>zw zMudLsN`)Y(CAyU7-p3(hl%j{LBj8#k%k4x;1gCQE{jZ&er-&}?Y4F$Dmrv#pi!o)T z+##jCaWdxN4bP+Qc*x`WESq8P7ub!Ax>D&_1{1xMN@;WZDf=BYE)$^kR*xD8VuMF3 z-^x9-o?*@g-3KwGa|ROoixT_Z+QiyEEXj|li~N$)vy9}2bya|OjM;nfRp+^4_j|Za zaa!obU9fz{nPlf6wdypjl{2VvV~O@zOmZI7bm%^#lQHJxlDt^ISCmfA$-*7l^eltt zb|m2@UC9ZTRsDCnMZu1DI7!tEv~=y@@V@9_Mo&b3s#Tfc6dQ;vh)iiOkq@5cLt+fu zNBVVdW4~}F<&(TRVk^|r=Lj{;AH+F_Sj|)+2^TSI=wpz&;A4=ZDK6_X?a6vE*`*V6 zy%(&koQ&)1z(M~p=K30pTipA^ja|++E<3_v(Y^0njUbjTIjeW+jm?{$-R8dIlwI+9 zRww34#}k#PjP?EeiBgU=7i$Wm5Za&gJ5}M)y41V|&zlSHzKZaNJt<&&5k zo&4Ro_>*2^JYIS;X!Bz$oC5XQgpARL<+`dfVHoJqda>zo;bu6bM<8AKoOE}WaUTEF zQF}cbnb@v82@R!vpX9F8Eg5l~_E;J(nq^mj?+}OR&W;?Za$*nQ$%P+XU! zkkb-FGE_>X#d7n7ZS>_gcI66BYGTJn>Fz-I6Gw$QUfE+0wPY`O6?;b8^GmoMwbQ(c zHm>iENeX`#ec*v??b3w6XFf3*tGP6^B$0mRt00ElyJwW3(&fYH?HMBK=DLeyAZxXx z%F(krp*bQu5F_panmMFe$efSt`=5eMx1DT0-IxuNbJr+_gt^+*0SkR zUYEQkW=qBMwCL1DzJ%jHtU~UDGHBLSJ@x4V?~g`aC!X(AJMHT_-C^BRU>$GQpNn>% ze2sZJSg^*SH(zIdK!K{Bq=)KFldUxwc_j0S12BW4Q5ibGHqEpE>CsB*n3jBiB(sG)a0QBmVfn?tf`z!MJr;@nx zFWnej#!HmGw=_B@y3*Av4UME^-q3nwFTI8Wx$KZkKM_@;KJ0+;3`>*vo{6J7N|N{kyz%e7B6hPiWKcEZ zu_smrwVKT)=PpS=6lFKbnnwOwn6%Se|E?5jc>P$w@v6FL>7Yo&*An4~%$0btxo~I8 zi1lHJ(SSTp-Q+uu>_(KSCTLqgvnSBn{21cKSg%49-x+adb9$R+S=79UtEr4{z3gkl z5}D}BN<WH`k0#_xgSM2FX(IRm#qPU6}UZ1nN| zMm8SKfHusZ?*jTG)u|L&5(VwU%hwguM9vw|d48y0RxKbb>EY-HjYQPnnb%K?`4-xC z$&}>WnnBYrww(AA}hSXbDMXR&l{A)_v(!*@@Tk;w##*S!-oarr5f#L=^SvnztwO=I$ zrG3p&kVGkhN6Fl}jf{#p;_DQ9l_!PNY(8JLr)EJyb}%~JB~dQMwW~;kdm_)fmA4ZnIIHP70o}J?p#K|CBB2z8up-Il^cXEsGf$&Y!Hk}@#7_g z9wEAtGH3$Tm`EiXAQcGM%wt_T;ioEM{unHA&Jnil?Ge4x_3pWrk>1VhH=3=sghExX z4<2^kI9PA9DyF`(a!-Mc#^t=rG7l+@T9vVWd@HF%2Arw8fCwX$-w<8ChZ`Ka&?uPfrUap;Ei1i17`y48UsNq)@ z*Ggry?U%YyH8SrL`n;{#qz8{z(RC#}fCZm4scwBg$JoFQ%ZeKn7(KRH>`uO4F6L}X>Z^J5LS2zu-@9_6Wbp%O{P zq5xU6=Ioqwj$s%EDX7()jRhkA(vdlIl`^X=UtiHV+5+x7%1;~OBDgbI#a%8#aZ;x2 zdT(_dzdU{KJe6s@o_w5`w(Re*LKUsK%Lx<8DsDrb440oHXs5N5!q1bG=qn?Oruclv ze8R?ja$0h57uQxta)R57YKzpUu<$ixoiZ4|*IIp7-zJXW%1H4jE*`@Y=#g7qu!k{aU#6kqkxTP#Dp zU7oo9B70|#cV<>AX>+7S=BhT#C0m&_O-)|n)r$4?bl<=+_Nq32QOLS{smt-{)w68g z29!aY?&9qJu9^KgmolO_yiWS>E*~vq=rV8%=yz4Iw{FSpJd51<^3{VyLuke*OUqpf zQhnq)Qju~=CGO#YD!S`o-aizVdZ!vVtD(emu}+?GuVQN2j1yRg~EP`=j#5qvbqGhI2;eY}^)E`ND;*15&L zT8#>epAu4=&?LT#dB4BdfJi&~c==}iA<$)xF3#2_NAHO+ zaFS%#tBLaFQ272Yc`50^%!T)ZG?nR~ONGHNUH4oD-B#%jSUCyKo>c*wRCQM|)c#J9{@4QvJ6fIz6&yMBsEd&wNGl5FW8!euu z*!~jQ+^l*kS{vH|+!h}`peUX;%Ie3Sf45cPnB+L4*$Q`5ef`Xuz)nvqIU;D~I_0|X zVLqpXFm}bn$k7d^lu4MsgzGE#x>uF>~jO!Fy4`OqyMP#I)J<+ZI)D?NCm=QRWW~#9N z>Mtf90lLxud8uvRFCBIBySEeAFZ^EOLQ@MND=gHA->hJuD4?5I}eJ*0Sa-Z-a_4N-PB*G}{h6D7~A^KQIBw56tRsX0xJF%+$5I_@z)IE8#>OIdgxi zY<}o_?=_ipvO)Q3j@6$Hh1LXagehZ#1;RIq4`#uo_kQKj15TBMg9a8Yg$9O&vGPYf zyOuvbb02-37o=JIf9$C!<0p?4A#r9Bmfd|?xZm%_2ev)pYaQ4L}Qla|8VvhX}S`bhg%C>!K{qFPF_PT9`*%J7rU2ux4< z{yFnySI1(eC5sLCY_WND*4bd`#StGr%Wrr3xs6x-_q2Dq&M_QM+B<-t32S3D#VG9+ z!8gd_K~d38Oa>TR=Kl5dM1WO!c;YeIso0@$u6_ld8seUPB#U2 z`>_WQ$B?c4#GZ-y%tVO`391p_x&lek^@^xc45S7h`&(?-=6ZqcE10zR457p#S zl0}O-hf83$a#gMhB~o>#O2qX8kOV5FtKa*adEI`ls;tv=V^6Ifgs?}wcUZwZKeRk3 z$^p@B-|=6KqJnfduZnh{{c&r%fn$BeIYNw0>)6{VQZ4` zt9X#e5W&QIdm*vWJ1z(bFiw-?DDy9?WfHJjKJlse{sNJhPR*V%Zz}r^rjv6@EM89s zr$=+BJ8c)deo}n>J^8DP&8{DC!q4t&*3I=Yw8#$TYo^7(5l6aLdd)bH$B2#*1le=N zw-5c#WC?@-s^vuwexL?_Yho{i5;DFz5ZVO=-)srhC|j4?T)^ZkQt30u`IhbtZsBL7 zy3xCLKWEi&h|4}2aLzg2U(KklwjZkf#EI985oPL#|<9qS`HA!lV$oj+Mv>*d<^*HhInq{N3M%1=OqnE z3=l7^mCk2GPf5i>zi!hut3dhFbm|5?6K)sZ%1iiSlEQCTpn8?80{CU%D+CU!9#3)r z)BqRw=st`ZOq24wD|%ekc39WD{pOO*lbMYi>)lgy#<#7`;1L@iQ{}md>h{eElbctj zDcAyX*LT-N6h}%3BiGYwa=-Ei6D5Y+PZsv-JoFp!Ee9aJXfn?#u_AnJXbj-HRvHbN zda{wfmjy{_x-NDzZFF@!(vU)@8FiaIhCYb&QzLC^mgw5RzMVvB7lcY>!_W#i% zu7?3PZ>Kea;3G&W;H4)Iid7BxA(%@O<=ufMBqJ|yYtsU5Hb_=gXo(=C(R|jR@KKpN zi<(`zrah$hfc_N{U(V!^*0Oo&phI0uSF`LKG3@f73(KEphWxwJXUv1o#yd%QI> zL4|&5JIC=2Wqz3Y1~Dv=k3j{W9z_P`Vv>>59Y1_gSM-=L;<=jG z1eNKnVWk2f0Ya-Po~Y85<^P8npH-ZGMS$aAZ%`qjlfHb`KqKZA_# zVq=+KnnR(CzApP}AOJt()*r?P9mFZzr{(5UeyYmOjX!T^tJ0!fq8{{kU#h#xFvvRi z(w1`OCmcJ*kJOR0FZ1L?pd*{5&wED(DDhlc&M2YExGNX%5nRkV$ za+Vi)N~`QzoFpJeS!HHGKxCnNd3(`?9yCZ}TZ1If7zR0-=AstX1Szf{4pvlW{Ba9!t2R|{1mwKP6kjD|8hayR+1 z@e$`+)OgNhI31;3I$^gHe%|MJ$VA?24|12ZD!PH#N z&rnd^HIuUFa_rz=;yA(1m+T>w;z@1JDE{1lemc!$x6^F+7NKEbzGE;}s^)lxD&_}e zl8{58T3YP&EFTY?a^Z_$@cFd;+zcN4kh6^*)OG*nn;N3Ta4Krq z-)!YF;D+S-;?|&+Um8Q-hf=3=cg+w+#q$qRS5P~Wa<20QE|B%gx=@Z{NYH)D=}A=5 zc*eF50OeX~ zG3qD0n)BuaUEQFK5FXv>4dY@u{=RbL=)m}1o5*2-+^qdQF>XP>5j^*z7gl4v5+5vD z1Zv8NUZkG1K1h;%?Q__FRK22E-;#`4RK=~0&Esdpy5^!dsg@xfdR_#jnjzLpJFW$`lydLmCnJUl3HO@wH{VRy0l69M! z8UMJ5YYC08$ODBtQ-;j8P14ry*b#5N%WD6kQ`{n4;LXTtE^4$-G{a;k9)sc_gEhsbwRzOj&-klNKiT;kjL`CYR@aL z5{(GRIY)C&P*v{g!xN53GRkFghC)?Z$TSmZd1TAhrMy?RU8i=3BQk*VEq6WGLF1D| ztMDF6__w%P{gn#6obBOtM(6m-(;o90fYUY zwaeX%w`|-1FyMZXGid|hIr!;vOdzoZ*GE%Kf_VW~NelKwwoTiJ$J$Q3n>KwgjS$@U zl2O5a4a*d=akP^?u$7rZR56%mv34VfqpOV>VvSh4Y(H|9gvxvwAwZd7QFL>=_1mUa z9;|6)G#4;EsN1dz=-q#@K5gSA6+D0Hthpid_K+`&>ByKdEibw$XxbUwv`%J+&J3oj zMEicA8@$3WD@E0cGQB-+Wv8*8e=q;IEXZ73Ye+dtjJhm0Vf}Dtc2mZ0G=?c;W_Z#3?=I*)0(5Y0-UoWCL0=f4~kU-=;wyr zkyY!p9|+KlY6*M!F4GZC$|*jSxlBJxEfVj0+i?Y|#N_in-+O)e>M0;hxg_)|7tf}U zk@3u!X@IMCfiEC8BV+#y4VCmVZbV8z_07cxj1B8Yo*6)#4~S>nFN$3j4BF70gHahl zr5iWud7f-l-fivL|B~F#YIf&X(Wu_99L)l)dby#^Xxx$Qh&>k~IgD2?M(qLcmE`vf z$T$n*IOp+{kni+4ty~pvr8pVi^U6h69zr}vO0*T2oCZgKTz7RmU8+UU`gZ!KEE1ja z2Tn$pH!J~viei0$?;~Z+0&3Mm$2!-=+dSnkqum6`C9&QYuVsg9`wB{QKIj;oXO!hu zojGi0eVs)vPFgB@vx57h)|_uT|mxc%K}8?pI*|+L%&mgZz_`{nmG1L7Pa>XwWB`!)WwtH9RlQOiUuFfmqj+^q zP;(>~3d_(Rzd{V_6S#)YJze#{RHf9mOgihvO>`cT`8<<22RV+ZCfHLrKF5Mfm6&@j z8n8s`k-j1&liua39RoNOCQL6V8Y#L?3wExr9$27w_%_whk>>c>m;k3HaDL=<5v}-- z>oc}x2DSAp;9=w^-W9?qsc3THf#Y4v{71<^0yDTL*_Wux3nl)lZZgQWKBG4%1f41> zaxhnu#w6f<VT8 zmDFPe^oxi2v4x$Nrt2{NR)JJ4dFhVL2!-_i3|bG)(PK2pZrynW8h(|(bCFN#$x03>(+x0?IN-Zv zhBWEhT^?c5RhvRmx?-C=JB0{w@Z;}@F74@YO*zNteBRk>j>~0j$sOPxY^Cn2fxZ2W zh8gS8uN~C~t_0p?xxR{e7@Yk~F>T=vHU|TQ<2Ls!o0ME4dr#cVL=ZM=8YDZ`NM_ph zY^+gzyb9dA=C(Sbp6gbV^C19mGvXRnWSkIry3xDN2|LS!6Y_Fi$8O%!T7~OhHc_2? zHJ}vN9UXDODp^d+CTN7hk}>_-Eo8}rZG_2jn)%nS8ceDeR-kFZUu_8lE5fHpCRHLH zT7IVF-_RAH>z&>sleLJS($5lokvN}7k7eBeIyHejjxOUhQxOG-q32wC@Rn2hrBn%y zoN|SiiedPUCVn}8Ml~Zn`=w;l(Oen-oQ-LT<(CEr>!q*IAbTaoosar4H*xF{pp@eh zwba|_GCs3mqQ*48*2)K4D?F+%S0=O>nPZhErdM4e_&*MOLpXuJX&PBwS0lm8bWzr3 zd76f76;Dag0{Qk&|3Fu8QnJNM*2OECqZF?xY$myHXCmK3#B9|+f!|BtAI+E?W=7D-435s!pDs8OBZdXgfj4U1CM+b9 zy#}n9i{s;EoAgvK_J>Aoq#!^Dt;cN(r-G==3BH?VW3~P@e3QAD5sF7XOvO6ccR7Jn zhvkG@3w4vRWL2WhlXIhH4hx)Mc}GTl00nW>Imo`tOF+6|1iW_s33n&O^DSe5cw?H7 zYGOp}9c@JkPh4ZFl;=lL#6KZQ%!+;qqsLggP(Etxt=k9CmGmO+!(y)nR6i=%0bazB zuaW+OQe&0Sx>m=^p83x0K{=ojBtO{2nL)=YW(3KXn7YfzO5HiB9+Q_(86IC*?klur zX~^r49dQwM^a+(dNX5u(z>!YzxTpzeV~J@|NCcA&oaqDOdBCeYkkAb%*3Qp+oVhd9 zA+$B+iA+Xnn$Tpo?j%Thz-#IZS{n9W>UGvvjqGZbe6n_3`g+0JbBwdPG}bqvh*jxr zhpA^}RaN2a9)nY(A_Z-)z{JrQd-zpOzK4tBlTdYc_|n{pLf|Ry2MQuHe%s-5-~u3A z#Uo=^YSqGQeAtWBYxg-=r;a3~o-)|qj%ms3lEV5usm{e_1HPzoq2L#5bT4762QBCO zs_u|af2qc*u(qY43*A|IBOQWVIsnF~P1LNvfUy)=y{} zJdmWdF|fS<;jCDjKro;I5c?~f-u0_zQX-C;T);g%>(@BeZH;gSe~+UUE~nC=t3QQQn~` z2gCnh1b|tE<>~Fm6Qck`?aozt>6atQO#!5vJTOUC{1f3+zIaB7NOfXwKF)c5Ox6lq zzEZOXZ~W#uA?OWYtB#+!-hHz-VJ_KONB6!csd7L-5ltlLES5<+k}5(TcEp}#BAC{i z2djD6X~;uEap3RYovJA=myqlRdbi<%o*geaJMK*3^Cv!;9cdKMN-y>pu9Qt?)y&m< zpxMLduTgiURWnZDug%;WS+G8I++X+F9iiafNRjPBTeIY=gQv`d6azj_4BXm(Uc9ZX zApIfSkO4d&|L$#*U&<>KR#8>bA2h4!cV3oj$Icza@`Zx7gy zw6xqB#e0?ikOwpMQgef|Z^goh(AfoNL~ff?ncInTZ?@a@KTn49X-;3)%8Cb{Rn8~; zk<>E*s&BNv(>CMaFGZip2$W8c)7^3ZfC`HqDX|mjysOaQrSqtK?4{>)q=3 zP(FW7Pcbol0x;+iV zYI6?+-qo0JsHbA|m0O-qZ`!4~zcq+t%vhf3opS@`YYBrqcFz99AZsfDL(|k~yT|rt04nhH znH=GO1)VR;K#;97{>{1T3QC^SF5x@gxU+^kt>l7ktvB6ZK;)#pB}%RYx*TVQx79>4 z%D8kAQNz=u@SPK?dL08ba;|o#3{tHxT>;9hMLYS^t79aks^MO z#jtoB-PIB${Niw=wy1cnO%wQTrX~`-n>^^sA810fI^r154u{9t3j5($@Y@jzbZC2zM)auBooN=wfH za{=}-yLuEgU_9+Cxzugra@d7TQ{d#bv+v@bN8E{Cl?36FqxnL= z;*iIB>dG5 zzDn>?eZ0aQtGacyd%?5YXxIV&_I}igDLp-pzoCCe3~M;-*dugIBlp7>c7@h?>y$}_ zC-kuK>fL~)EyzZS-s(VeJd#`INYatYoK~ZqkCb9Q7Fn|f6>=IzRx+B(mOkpA)M6nz zhxQhOP1yB1Ch{glP&_TGwj)x(W>1@yjjUp?H^J>k=SAm0oC;(ZYdX`p^MF=ps}ryj zvFl_hd^|^y-4Rb#YE)UP$nAmEoE8l6Bwv3Y|b4AucSTt6fB2U+{yQA-1TIwA94W?#qp)nd8m;8ODQ| z`rW31tOe7%V2hiv=wkn*yF~?jsmRIAb64z3h8LNhc|^r;3fhz$p_{6zyr*CwA$`|{ z&e=P{O-D9r;Hf*&gD0t^?b+(N&Zs+E!)Q6WHiV>aj!wfTp;sjdrB}KQH^iy;Yf|(; ztK$TVDC?W1i~}?y4cL+dQny4&fBu!Ncb=2p;nG{Sm)h_)Y?$ul$=Rb+wA-tF(2HH| zqFVyqR=K=}hkF5dZ1( z%o_1i4d>fC;yBrXt|eNHUKSltInA)P7yCnWbId~msYn)pIpSUhZ|zauS(5vVo$!1F z_(8mYHxqM;bXz6n6DgZBV)AY<^UlYZBZcii5~cZ}LT$w_uy0?&PZOf>MolYU?>b^i z=iAfO!!GmP8Y}mv4j?`CkL)A>?z}GH*X{M*o#;ssgI*SRe81cVbwx+}&6~C-GYExPIS7+g?=CS!*ttYv8hKpG z#w5W}w>=-7_2Aqa{;D}Fv6p?+iO1JtrRJzGj;uUgDcQNKjhSB?+itbd9DyaVtB$BC zE^+dS64c~8wqRvX()H2@7VzZ@?UsI`jrHdgMW6tnPcO?|NTU5AtqQ3EA{M z%!{DAPx5rk?aA3{qtOV!X>c#ozp8b2*V9&vDED(o_s z`J{qmutj5ZgC-6hSjc$J-rNhKU|%M*l%)Au z59T?xV(gX$zp&rPeEwl_g3k>1hLTzG%eCYh_8U`e;H5`do1Q^$HL>E!G_u zCoyX8)9uPKR;RJeM+&VoWP95fk=A*g9?_wrr5Ul5qeG?MR2hL>RnBW@{l)H&$A|$W zGk#r$t^RV8o))kEh9EqXCtr5eBX7Ilh73U_omEMcOFQp=cdwPbUvDVDtaS~t`nYu| zULb5GdL)WQD(qsFM1L|Pz@}M-fa4>KIuBO($+N#A1K%F8uy@^36ly`pym5UF87Pm~ zH%D&KvTHZ$SPDnQA#TvXPXQq?LqPKQfx-a1#OI&5C+5$YU&Qndrii2bjDt~2x?Q31pc_v zr=sZgw8@bdQ{2_x^G-zV;zbIH^F~l7zxmARMF()Yoj}h9Fbp>E8sne#=0E&8`DP&c zcPh_P={ExWTyEg=GoO8kR!94_W4)H*%bv`>nah6w&2x36<>6EYOt6-Z_ZiNxM0cJt zu6`C5%Cu&e&hA_NY#bkOH=QcC!ut-*AV#Q4z zy!i91|6_?ad4a_BPnVjP|MK}i@~G5VMo55I8#Zn*zt>yM7;#D>$KcH&blhDKblTGB zYZ_2U(mty#)B4^5#%n0l6~n3|17Z-#gAWz@g4Lo@dRhO(u>OH&z0wD^*h|Ka>L+=B zrT5A=N6Ev;OGSYLhhJie-ah?MBKLlWU$@MuGoRl#>zfhS2nTO#bZcGd6?40~I!mvn zC&sd0vV0!zPWK;g#v%eFMCRu4JO1U_|9AnfGk|{JdK0QaFNcbe3ct*q%9$5`eocAZ4p2&_7WOdiaASE`>^i-{q zNoyc+n2XD}Bxk6=JNHR%>RIW(?xyq!lK1!*lK0>L$8{N)r*TjG{J#-`pZxJ3*9&kn z@C>T|{?5Pf#s9ya5%~Sgngm2gk9mTP0ktMZ4~wrV9qKZDd{J=WEb6Q+>Ax)Ow-qZt z00g%1wd&xnWt?I8YAoNPFMvJ1*Gs@=Ikt5#3o2ti)zEzUcIsCd#&0b4PrVXYaFr#1 zc31m8`EMNm+AMG{6v%(c$BUo;-udk8Kz;M>rj(ar$e$?8f8^v7a=Y9BB!@pQ=I(E_ zr%5?Q@NB|7CUlBiEPg4{=oK`2{aVv6&+=d2Mim&*F~Tl1OnLd&@&lJH0j~&lyBGBv z1^#*|i#R}$kKScsziXCPj|14xw7h<({X3cd^6E4ffD12JU~+!{&HGcnz03(vJY=?v zGLv6!wC+1!Y%~}3qu+n?m-__B>zt!$4qI8ybo=dBpOFC}r9Zcr%$Uo;q7d3}bGGP5 zhL7Uw|CE~YCTDku2~(UGTqr5kmuP`B{(NH~;d@f4aPX$AJHiP``a9 z&jx6V2lvw4ZvOV+fBnS2x90Dy`CDrKmYTm6+TUl*e>8UfnzaXJDHR-q|HqDj{L0xJRZgvX_p^l%e59*qkg*o_ zK2*8ubm_fRTPid4lybJudg9lA`Huhfe}R=(m-@;iZop{9&YB0G8Ex9W#%&gC+dliB zIvIcYBId#^?YviwJFeLFRB4S~6(XL`Z=MajH-63cT>O9RAjMqhTR1agc;|*7XH;Cp z#byeZn|t^54C0PxQGegIEgR01xP z`=4J3JGt=i|Fa8OK&N{%kSzIcGZNiwP#wodR|T>yub;_DldpHbnN;y4ajmZWA&?k2 zxbZpl&!F824Db!~6*pmj&Fb(+9QK<(jFRTprU%AT@ES^L?98kPJy8}|9?Vy@6N0X} zoUqG22UUIW=&8^@fH8U4IoluHn_nNl)Gw2b*^%Quy%W{YNV-k)DJ*R4{iWab{WCC< z4))`nlHxC}jjlgM-|Xs0Cv@=>gh z;=m=E_E?dM`Hl=8Nl68P-?xQj@uYzH@UkG$pWs=bFij~?z1KC6BxtQ1RMCp!0y4$L zp}-nW&p-d?ufEBDZBAFvL52l+KRMIS`W`Y$t8$A*hB1rtxA$hD83Y^`OP~EE=|5Rh zp8l)>iGfdNcM^~XprA>_bB!+){5$h~4s1S}3jJn&`Q)uH-ZF_G(sS=Q)AVN`g+`v` z#mO6QO!m9|dgIDVURE6j6CHxqy)4TExt9n7?)y8-10}3?d^k=S+|amA45J~I_@|f# zil4ap#IEf zn>YLp1f5k3=mZ~;cA?#YD#T4o_5j+OEPpTu4f%=3XMU0H-q2Y9m#OEi!4TUM)Xq`p z9^^Over*bvKxI;%JHJ#k%Q|pD@KbeQb#efO_Fev<(B=t+n4ZSmxt{_&$TsD|e$b!v z4Uk_uq0m%aHs&`9ah_1f;eksVz&fHI71)9$5Nq670dMye(s9%(Ihx|8%HA)Lmt-(zR z^$U(2IFSq65#S!%tO2xH%s;sj==5Fs&Eg83LgfipR?}t5{UXMh&m{oWM$@Exe&fm) zzyPl|5&E#Yz7&@dhqP7Wtcn{=wOQvk=k$ zp)6E3x$U>-s#+9E-&r#QivtS1WD-N~&HN#GUoTz&*nIr{|2susS%+EAc*ZYc53-<~ zowCm8EVpKE+j_nv^@n~i0Y-L|-b;D%uj(q$_MAB_f2tXiKP<+?MOUH@rt@;XJIS;+ zU52ya#RimW^*E8;85SG4TGPr42F}$d{ZdwJ4kNtf8)&`(B>vSq#&e8#ej4CRy!n7a z1qF&ysdrz#PM(cz;xn%9f+L^B&-hOOiD)L~;}>2_1Ohc+ofU+1ni%&jEb_Q>I|!6G zn2&0m6kjT>Xr9v)j#EkKq!)O5P1Y1>WUvTb8Fwh^4C2Gy!5z4-WfjS(GVcda@Bu|4VW9D{fs(xx-FskJw}QSLN4Lx z1If$qIKVN+>N5Lt9pIT&cFWKu;3nZ`I&I=89-*0dx#L5rVN}Q2wNsndn?D$CbJrmh zMYs&h3xM8u+B-rAKgtHneetqmrAGpLUxQE!kmG}lHulGPYG;>6m+#IoVOtW++E<3n z+{RuRzSo>-%l)>H+pUM(^GWMYYSQ61slB!+)PMb_&ZYro`5I(O04DffRsVf$qScTT zc47Jpwz@xOgc_X;|30``ul{z8#`J zpHT{@Qb8v3X&Py~YQjT$ZZYAc0Z*89Mo1Hwen;SBpBzdGdDH4EcjVq5UFV z7;W=1D4Ga3ihF`eC-GMrsa#$kD0OkPLNY@}S+w(k`8L;HyfzJ7Eh*yAtaRq^pPcTyG773|q)9SX1@Y;Aco)xaD!n{TaA`^vci~>y@5EMo*CmD6{>%kX>*&@e_oZrY z$e8W>n5}rretXezR-#UUNArcP#px&RDG~&}J=}zu_PUAi8ZS*0(B!~qcWJLc=Yz>O zrji**arxmV`(o{tBeLGZpD82Ib2Z&in zQsCkr1_VpUiKQTF_-_uv{)^2%FjH;s531+lbb|EA&tJcDN~g{Z6a6Xp+-tokS4Ri* z;Vp1|)6yMM0gW}jnvuHJAKs`EfliDAB;tdeN;uI-XVoAZK%V|ztu-1dVpyZM+nbOO6XGIf#0(3;N2631-kB~_BrR4MG}MqC z(lK2~P~JOAnRzxSPozqz3dAeHo~@Qd4sAHF;E%lyrswqjep#kMKoY^Lz47^n@Gg|x z@dd+qaVaTkn6}M59-Uk4;0*9&_T~{vBOZKkKCkzoorwBLh69(US{lrCp?shMpZzog zl`1QsdIcV@DMy$-Od>1YKpg1V^%W%2i6gu=v)tEitL+>sO(>pNacsN$a}?%wOF&zz z8`YQWs=kKNs&?t3bzR)x$Q9QY z6=tR@F6(;5Mj%NKJN6_Y&fxP^TC)|X2(fj5o?tpsj{v<}gG73J6zq&qQZ9#;YN@62 z)lQMUeXfs!tZn|F>uZJ+#iI^%TK}t6E-!q#G<|L89uuUz@Z%n8rXlx190+7*mcExd zRABhUi?EIIk4aBcn!vFKJRstspN4J%8T{V3m8lUErdR9@pCCYoeF|h@bwSs-PNC6= z?cr#DT&$Gl`8kNTHLph_Yd<$JOu0bmSVHJYJIf^wTpVmnkS=YQeVpw4J2s%i!)?v4 z%rZFlH~{zb0c-&aOIYa2cJ43*ELX^SaM4MT^oX17BLr4RQ#rlyA#z5zbl1J6-*tZ{ z>AA-jTVM>mfrR#u0l{g$;a3ya#ws3GKQm-E#_>M=-h(!*yf<@F)ywQ}z-(kA z{%8NMGbg<``dI#rPm*;bK;)^VK%r@V{YMG6l?g$&l@yR&5y%h(O6?o;B22&`(7S|K zZX6}!@B#|P|u?wnl3G8slQomCRM^)~_3Q4UTTjGuc zp3qcTu-=P}QBF6IA-@^;sA7hz*X(wb`|4h)PO+YzE2e|X29+A8&QR0kIdk+h6*~ht zwsByMWkHi)6ToygYjT(A0~dH zYC@C#m2O{D_Qm9xH>wMa-|hq?NO@||;kB3*Hri+B1{%=Ul)h-?hIJ5nu;?_Zkq>Nab*0nhKyK7VAt3Z3A6U^k@S8@NnqsCGcj0^! z)*Z3bJ)yGGWZ728_3Gr-pa|d%+P{P!cLIYG7E<8oj?RP(hOQ5_)%&~7KxurViaTAR z-(FmAE^#1`Gj;9Q7bt@l^c|V-pBnwBEziuYo^q$}hqMk*Bc>iZ%i56KnwCz#n4liz zfgJgu55Eai3h1dMs?iX-Wq?BqcCf1n^iZuzmCI<9jxXweUiqz2DOpe#>SGnXONXaIUg_yA_k%0% zKoHfy@ISqA>5NGZ1md&8#2o|q~e}Jz{i-Fz~^U4(U zZqFAIdUDUo9qcG2iFqcW&kw`A6DD0SktZptK-a%Gm-Y3@I{idm5PK*!rz8`Gsd<01 zZFc}R#^~yuE2vfa2s9_8flZh;MJW0ogDYlGwNd&IRx`iZMjgL6j+%~Pw2tWbHQ8tN zb71IOL+G_89MJI%`;d?ZbQd5t-0tw)8rGK!-$i`?QdY45w6~p2dw-_#iY75{nm|*l z#~_hr+j$(f^G4%ThX4H?XUeG%%JiE`Z`lZuSf*y9+sCH;sInEbUSbzN&(lLw-|t^9 z?0wtLcs5Mkq(0LlrVll$f{RQujFnr*xnX+gj`O}B`DS$1d!$^ab~}Cs2Qt3v7DgO$ zpN+-F$|^`E{TMhkR_ju@P6Q$$>x?wZ!Hrrsgx6o#2sfze>og72B>dL)w$UQ*nDsEzY?R?Ab+C zeUMvS1k-V4nNCK{dK8s$Zch-(8*JKQOcGLA!*^f-RA7}=I~E1D%8l2Ho;0Jn(o|)c zI=?5d;{vpaup222y&%0=W#=^)2M2A|Y0fYSbR-YY&>g^zEb}f{O1dq=czqlbD!m(H z)<>tO+Pd;H*!cRh9Z~P39(C&1b~_vZ%)WPy4ZMLAc0!;-Kku7+?swl^tjfFl4yZr#92$P! z_G)u`AxdtI8vUuCY;f6(MdXx$(O%}Uo2E+tt5YDU+s?hNdutWU*Uix6wLa_1Bv13z z6<~23{I^dfj`Zxa>}69U6M?RVB0Pf2{(ek9kW41NluQF(&P1$MAEt?v`|TwMoKOGZ zD%Wof_h1lxQh(uPh11cZ9zxh)e=?LfXMknk>!Q&70jwE(?4b^p7IOvm@l-)sLL7%eZjE+ zL*pJHtI|YNpJr2`abx*%s&M}F1pkr`podSpnapM156nd|%2*uM0KKBa1`7PIO89** z=+A)zJ=9l=@vSMDr7fXR4=czt52(!S8jScHmJjA4-R1?N+t$#TK@Vpv(LPdX6Oqxy zkagjs2>{dfH)f_;B{@&X`yS^Q+PUvx909({OJ|`c@w^T=4o*sn$9r=LO+^~yQ8f=# zicP4hd{_MK@I&CI4da+>CCzKp%2gDR4uke)#l}0~VKvs$fJc;>76Nr2YQq~ivN7E52lFip$X>}k=cj%|JAh|kH?CVhXt&^fU!%mr7p>=1GUD*rrU?N0jPH zmdh$vANh{}qVajdl)Ny2_A4#MrxgA+P3k zfs_QrbEW7!P!?+nIYv#J2B1gf&j6LqCY6Z3ikz`e+pYCECnNb_NK-f%a!=8l(U zo(3*s+_K$MK=q3Xdyk~gpgf5gBVd`^WE!x|U*&+j+obDH%aPzh||a1i0&bxBbXqz~C-= zM@{PiXVp+AXkY28q^=WHyEV|qj-2yt1`pVWx{}0U1dFXZ_VNB|fpS-_UmA)~K+^Lm zz4gj#gJ%}w$pxgd2cjDG)|*x7B+w9Fn?3f;**+h z=e6Sd?ro;%aWQ$s(Uw?}e(ZS;BiI1?gDSby#`Za8+UWh>Kle@KwX{nHT(L!6(-i}yy~jan=5jq(7FpnVqwg+$JX1B zroEhmCw>s@>O7^UVN|hMjqbG1_PGYvdsX%e^Xb0Mw`ZkIE9=MRWM<06Xx})Rl+0c2 zbx{JwYL%LUyf+s%^3M5?;3LtpP@s@$!gK{Ef3;Az;pJY9b2E!C4z{(Q5;cz64nC)s zWY-L{`{v$R$C-hcC@IasGVeov6gN3yBA+-M8wK7PbqCFgn`*4u2S-uw%Q>8v(9&&j zw>K<)YdbY*R{x|psda=x-ma<;)YLGZ84dQOeh9ZY@Fs-Ma$7`IVsd* zDw}2DNQCwyH<|G63O+8N-Lq2ykEiG$aT=~$!g{<3KgF`UqJJl9**7kb5bE7jJqgxS zvg_;Hrc*(6fKYy4bwxUB?4wGy$G*-2zN^-tV!o?0x}?x#xcn{E_qkFRLI1;u0Juxw z%iAMiXLXxb25TBF^T(oLABeAlH6=VZ1P5(o@VgRPbzz?GGl=w_^mZsaKPYOQ_QwQs zckdheweCC+T#Vwnq0f8HeQNFaqi6Zk9*#j%g5}7Z<|KQriZ8dss&|&IUm9(4>c{(3 zE>wGdIfaKdy3gGZdCS;(kKLn-VOWO-|F=L3!wf=RtjB?OM=?^v#iRygU6b;#w5fjO zAdiZnnq$>}^v|@7=x8E90bt1gtrkd>ydv=UQ3xft!JN!flSugKUeHI0~#@Lc>PvDE-l!faZuCsNY2j#FwTY6-_yEM z;HA$2gY7)F?s;d0LJ|a~;2|CLGDC(dL&Yp|$KrR%8u4jno;#bq4Ia0V$7^wB3l*9n zN}pB41nm~DW+i-d_r~nP=P}GjTN6m3oZJ_D489)69i>MJPYWMcr0x+?$5a;vKg#(QUjkBrE~15~ z&LR5n#BRJk3WPW5*!DM<@}D#-p~iH%4w~?hyk;APi7O_x>A}7)NI`O3#4yhEM&r%| zfv2KNjfmxV@P2)EIGHlY+phH4L^aRHZRfE8kFC2%=QR&M5`&MY0%Vw)rq0Xnk>RHF zng_PaQQ_$V9ZOjW!Lav{+vce#eS!=ztUWcZqYP*cT?e8UhON}t5e^$&T3#dxyS(K! zD80E<0*0r6&3?2WZM_;+HftmE8=5G&H-^~@1g+Y>KT57v2igZp3w~|M1Oh!iNP~ntzo4Pn$Xxu&JZp zy)3y8oU6>lyikAPf5zK^Y=JEHfZRl*Z%FLwRIcH6GAO|*wbzH05Da4O2&oE0>e2y} zjCb+PKaLy7vGb_-;QZaD^`*1=@lJ?NXtj(rMpQHS`b_Sy2o)R9H^FtM-G%PXq4RdB zGtuheYDSEiBGP$e@In5a#>}Zpu0Ou_KdPsDp7xx?z!C0mfZLFao+n7~g!Cjeb*p*U z@;Sj&pgi0Pkez1^m|n1}X%W-i1M#Qd+Bll?0-Ne}N%RRSTf`ih7C>B}GOSs$ZCizB z(7HGEA<(#fO=LI3U#ba{?L4OaO58bwaTIbt-G623y``Sl!we}??C$BSyLqoQ9BrrO zhaH)vUfldDnhu%0%Vory;mtch%xiNC6NE=n8M(C5v8Bj5#`sCh>o>rIBH%(XMl&c!{!eZ<@_%ys~=og_2Z7noI+=G8V-A!*Nhdns$u?F6urlZBqHX zit_r`vmX>K8E!DHStGP^fG&{rl`)CMD|Ex3L4$tF>xwy3s_e9hQhRIer*!m&Pt6~bC*xu^42ygJ$xZBo+IE5rzQ z{?X+fcl1S;nVhnDNjOwf7OdZl+wXb=;QO`d%ZSurtsTNg1ekn%g{uo%4E4uC82b`d zlU4_Np0NO2FNIxUiKO?HMT(Q;q)F8z78#?(kQowIWqzA`0>n~<8DC`g=e@Vn)p!DB zw|9JTKD|VV&R>);tvlml-{&yv@6+A5@7ECXVkGL!k5sgS`TM>xjB^IiCb( zpG8C#Cy5{7UC!1($3OtRsoTl^BP(Q+g+`s2w@c_j*kxA*%oSJlgAlEHwa306(eW0RX@VT1?rf@`&&eS6 zBDp)M;&aLKOKYRG7L1*A*TyA#8Q>?4rpOz-HEFZa@9t*c%JM(^!P-*%Gv#c&RGbf& zFNb`*Qk?p|k5w!sG%c`1`59{^E20q{=1x>}|INLD)w&YV59tbSPX%H&Aw87W-j(SM zm99u(W$ciN5-mvxRvoy%ZXu{ed%B#EAO$;i=N7tdu<~O+s(5Jw>))?{fPkQ*A_4-U0@9^R7m(hhg(gMm1c(x9=%Sz^Aieiy=pE@OBE1tjM5Tn@ zLks2H%$~OQ%=tg(d2!ZR&pP|ftXZNV`Q9x5BR659p^S&jd>5Ub8I-_qMGS>5FRe9jA)#)!Ad2KqvEG0_G*NErb!QG zXBhBZw&xQj#s|$p_UB*+Goe0L#BP$SP;wePB)!&V#^y}L8I3M<*k9ft;kE3#);QvV zp;GY_THDw*Ot?OAMCo(-cdGyOTX*S_f!r<2e6dAW`1XPrtBq4Pjp3*kj|5@hYQ`mhHa?k|H z5-LHv9rHE9lF`4$zr_ZlN+zDWd2uzJ?ipew$n?Z0soMZm>);dszadW|5l*uSV({CxSI=)tJh{Yfd+D=8Z%Me{LS|R_f#dR#t}f1IxZ75rV5divo8_g4>W^*Q3F2(?qUanzAF#OmsBBdp4UA0KNXBwhsC zWY3&FL;I09Nau;zx+&%$29>ObpAi;csZmT}(@{DwFJ?)M8Uiz)g;tOhc3rOJz&^&` zwE%a->9-3x4nf>cqQ=vL<(TB-*f>-qF%|Y#XSj6qIk|=tiGr;)uFKYjr||h=2QSUc z7ByO)7w;pcUwI}`wfOU5-m62Jz47JHF~3j%r&Lu-7PGI!o)rixSCVg?4yreBgI+%A zc;E=yO~nzj`AQB*_~sMqVht5jB$CQ)Q4eVZ3ZJSU7vRth_Mtng@E-yXhTt9ggj|o$ zo%QPn8f4%|ow9IHG!XpUNPZV=t+SPi6LHRsMb7$jE|1tpQ4dnJ|7^*d?PEM;n^c#C z7e#Vu-8F^Vi>98sO65`2E(-m*P&3cqShMlLSJu(FV)sD2fR5P;6} zF7~f}aq>t@yhH*T_s6Mz%@%DrRN4Gw76}c@k9d8fB)kl$1%KMt){#x+onc{u zN57wEw0hH3fHGX)i?rmleXZKJo|MMBGQsn-D#+Yl@1iLv$LdbIir;DShbO4xx<+?MHHLgu6Pmw2%01-PZ@>H2Z@gV_M*XI3f;q02jpHUpUy)qZ^Z76Og| zITQ>cTdfa$oH2-@3 zvu`Nfk(kQWc%^{%HUti8CPmX8d+ef#-#s~%?M{1INAjmRV2yL`tK?WY#|IOQH%FW$ zSiEE&D{ejySs5%(r|zn(k=#&viIPov%8#%2HrUBYvQVqG5{mxn zP3H*VBFEOmJqB30N8)IVw_@DD_88i=-}d<-;oak#MV;J|>K{tXn)7~Lr3t?b?C~YR zZ0Vj~HL%}aF7hT5u_zTJz1|crYE>QAGo&BZr7CF?^t&kb5g;W-iz@y@$f1nKf#m{~ zo}-N*jNE>IM(bQI5mh$H02+8u#NS`#Yfl{8ZuO`S<9F>*iW9aEt0t*+z*_eEe$7yy zX0Dok5v<=z-NdGw_Q_Mc>*^uUuGBhJuOW-o2+-$--!Cf9Ergj30@_aBX8a zEBJkKn+O(?EP| znQPH=8)aEL)7l+w5_n1%-d=+;e4;*cV<6;;9_w`iJ&`$3^YNZ_)&?^84||es;|)K4 z)V;MVaO>n;&2$eMpHG2fI3j$Qd&%CyCMu2QCk8-8J`!WR@haEJHY_LElf~KtqdJvI zRGd#c*q|jtev)5AV!YIS=)LYmJHTUo4my~Cov4`%<2 zpR<@VO}7=As>}D6rT~(d&=URhfog+*8`Ni!S^X5qboB0kfcHnX%{dr?qxkrtDDCF;!#HhCj-gB z{2LhYZE!qz99pF_-ZV<~K={6Az?|B1q)S$=OEm(;qk)uZ^g#N_pg~g zCI2F;Cv1$br{ruhqNWLoP#M`mx5{Z=CT9!})VUi~&k3sQz4$HH|8m7e4V~TFPP}$W zf*fPy>KYjkEH+4YNK{Pkwc>)*u8wqH$zyD6FSpq~KKzj=*C7O=N19F3s+hTzF`s6U zkgt&8C8JPmoz{Srf*B-9%qIEb@vxS@I+cSS3-gWfnV#aN+$dVv#xVvv8*d#WR>%|o z>$iih7e@OLG?eK&2juKnJ_!x1Abn#+dKaCglNaD`r38EW4N3 zbDxcOZvoUO%nC6D9mXa#?3}H2XK^?YV#j%7vU=NvFxGTLU)%vK_GDYeg3Au)^3cTf zceUo7EGK{_EbN4VqGE5xGwJBC6K%eveY&Uc*13Zk9Q|u#LxpJK-tobs2HdVLb6dJ{ zbAZ5Xp+_N~B(!O+`O*==`XRNt%=<$hqeQ%X`p{`+fMgSF9AO;{@ciYIZLv4FppIEq z?LmZK=fr(7b2yEJ*!RYG0$|~t!5nUd;;TK|u*p~(UeA3K%j3uXou2_475km|IHkg5 zFJ)c4i9%LXbT;2K3V2$bl~v^04h+^Ndx+P4mUY8~`n*9H>xIrp>tNNA#(fC}0r2(T z#|9K~L3t&!!+rdhCP$3?xy~$x?tg{WZ;1VrL5$c;P1aBWTc|twVtQ~~<@0jD<O~enPG03n@hX& zhS1{GvzC+%m0eBkkd0v|(|t{D9*zOJWHy z^jqvZ)VRt^=K5l{{%N-;fm-iV9XzsY&){pY-Jk1S-9fLuSgLI^1&wrgRqa&>{rIMI zdaDrc{!}9oywG8?TU&*++`6Td07n6wx+A#VvFxiRVuZy`xoY(`cB-{$s9p)&j+Ms^ z{)Z?ZQ*J&rM8;tWJ#1_cwI32See}R__7jP`aBJzQFJ{Fwd|j0sN?YTVG|Z~Q*1N;d zfS1o@G_KGINmg&0UCmCjiyC-?&F^ignv@K|X1@`aOQD*YjY0xd{a= z=T!=d#;O#z)}(#3=a1FMkaI^GXS`H7@`$!ZT|j5a1|b{=IqkcOT!AW#TMUghZgFom zNRdC5yjVc0`>E*CW?chOGLhFf%PehS4=bma3}w%TwlwBda*TmZYt5p#?d)A@0o(AW zAzuZ5y4T%ywkt3c3J0>o`0mBv&s52@_khZUtj4{-5>;Wyg4>+#^}Yuj5vooLD2tX* zMQr+|=8@ci?=O5x@?)sKWi#lW&Eq|nB~|LaO|e~8_ESk(NRU<_mk~hCqT3@d2&}*m zZF^X05N36s=zh7#Ocnach5AGKT8S7F#KF^clUp(F)+cpQTkWk>g?D-$w!bksiIzOM zaAb_q&$1ZqV%j>eYF;&x1ySN0)g6L>>yyU4`6Jx*m4<`WCp?IE?l1&wWVw5D0auzF z+CY6jwgbz-+nfKGK<{wwTGHVs18k{fD^0Wqa-AhTO0FPF%74jmub!?;vO?Mfv^fY@ zG8-_p%WD+OHw8d+ zTwmwpv(F5-Zb;!wY+b(i;6%jp<$LO@)7M^w?bk(WpH5bnbuPmYCnrxiNyG!a_6CuI zsDZ=yfcdfr?*@aCXGWT}(xSghWxuC`fg#6Mm4C=;8GW&<>O~V;cs6>ApK-=~gA)f_ zG|32TK_HV(ZsdGg9A9)t#-+L+6$V8OMp-lD-CgV7PK6DVJ(gsOS_OvqUVOvMyMn|h zY*>|HW1@GP+c{#FE@AX+wTf>%x2nc?_o`kjIPZi`;y%FcHA~fJ8XqfJ(jA*QV3w2l zC5Zu#)hsGEGP<|1-_|r4=Bb`k_c(ds7f+E&Q%p)({4igr&#ee%x9sERTxmqb-_)r& z^h+&yh2Z1H*bgfcu5D0JU6a9w#_k!lQ&#A6(X{MS{jSaE@|*_!GDO5A9BR_|aI9Gz z7ACspV0D;vY^S|k=$lq%YTUkw1N=B-FS*bYPWy4e^57KDBcr0!gz0jw$9;U9Z`4$G z#`FADqb_5f9dAz4ORyb6)2f6uhrjL?_(sp>3!k zFZlHRqLlN(^QdyD&ky%i+9o!Q^bb3T9=qB!4eXbIT^(gM9D;R?`|D(ap>ugW2fTDJ|>J^0wKOeo}^ zigC>!ZnuA@Qn{c>MSjtf|2r|*pA`)1ts$J5s};ekXc$P$4tJ@)S4^j>|*v-DZOc7E?+jo&a+phH7^>9C)hKT_0{!o70DYd6xW2Ah-YHj;M*2{#m3JFESx zs4qMjuYj`A6~Y`E=@+!iL|xY^bl*NYw;Uo`6!A^fHrBo;sciCQ==#rHMD_&SxF}JI z8iO^?Swvt~8NG2B#P#umxKV?&^TkexuH;a(je14S#F5959kt-frK0ZTWmKzwa+L{- zzbfPCUQ1x+;~!$#1?%N~ppGk1xV~rXesHyDPlSfo{nX!TrMOPb=wvt{x!0)XLC(UE z540He^$p4H3{5ej9Aj@O4t)V6D6Z=bd*$K`0=@LaD7R2R!4qfL zKACvAHmL8Xdzu7p;7a&ePx2lCdkZ-2fIv)VPCF_4anyB8#Fl8uZ%Y6cIe#Wn(Ls7y23;@2C`*S5Ql2I zIBYi@WKA3{)sks7bHp}EtEC+2HXPWNccqj~mb*eM#(}2vh|i{>E56|o8-$IOJV84u zJd4zWya0AinPJH0YQg#AJ5YyTlL)^-xs-E+c7j)B3?v zkk6Ob*klL^1Doc%5iDI{iC`Mr{~Ia`vg)|2YHrjD;?8eM6Sk&nRg#kBIZ{KcO>!r^ ziqV|sCXHWB?JEva zV-keU-){fFSdWy8V1c<5rELN07C|D<%%~c%i9Yb;2S-Sc=UvZqC*wG<%;}BKFT=zDeATVzDrSeD zgsypN?+G_K4MZUCK`$$MBT}N!Ov1H?SHHoo9{E!v!;%okTr45s+<|{^m>0IYcDp24 zZ>urV3x&}QZFRub*!awDywHlX9qI9!M`)xzq^})F-qm4usN4D3x(gp&YUEo%nl(7K z$eqb;$6UG%D6`Cw(k>5`2`+Hg?}v?~?Rl?xvl^$T9wb$!@Oi|!(?glk&a&J^-q)*` z1JIf5+KC>%vJ^b4Y(oddxj-^YznO1mCuPS+sFmbnWI<`8Zo2dRDLngVe@3rS#;a0S zm+z#;x(^2Ij!G@Da(u~HTI~qOxu7w7?|tulmDum%_VBy-djHD8KcS~XjdON7&&_;O z+s^G+m`BXlh6)+uRECStw!3lS9uW8Cq+~pTS8DeQt=3XlA?K7$&@k8b;*NdbmS6u{n49i_ZE=+IYGN-rzbMu z;vUz_e7t&*_5`X@AD5S{{DshnFW!>bje~uS-t+w<`gutw6S>o8zTpS4Hw_n1wRs~L z+|^d~&aF9UH;yN1SXUCaj2+7Tn&b7{`#|cHZpoPs=+d@{TH! zO{W8qR8-@wNucK-$z4rNfbMWSyy@`?2c74mCHtdw3IlV3lfn1?q2L&BE?UHRq9m?v zBRuC&6uEjc^!EyvwTmx-!}x$C!bf0*(!=)aL*nIfgF5R9r}`PD zB2>7oh5e)8z|)iDg(}!pgPr+aRl1Z)8Oygx^6dw1U@&AT*L}OjvD1EJ)Q-Dx|EclEH2Fqs1@{$^U7i9C*!Wx@e4>wyLZij^bIY^(rx1k z#jqKcnutz2LUPR=+y*u7qleg$ToW?P^H+2(tZptYTGj+sE4lHGWL3CX3(;fQ7TZH{ zfhZlNq{O{Tx1dwacxB>KS3p1NhphlPdG-U?5YfcT#N*T9;XHrveva*pqToI`dm%skYN5a3s1P zkz#S;scs62ge6`x-O0vJ#~&^e=040^mc8wpHPLUQ&S$krLCI}gE=RP(u!Ks=H118D zFe!Bl-Z|~_s1-s_LJDp5TUV4})64wN8+5pF4k8MPfr-){&Ml=M$*VxpEV#1iYmO}B#IC}KJ3)6?65&IsV66Hfz$B(@y$xF z3Hoj00n%w8p%_@5>xxq~b}tAtvgveX5IN2XU@x#WK3{x=ZcDlJWdnoH@+!++(1vAP zm3%x``M4+n)V7yKiY&7i%D;H{iDabE<|6~Wa+EL4RZNX%g9MmSim=*Se0ZAz`FQgS zRgAF@R%@*IsiCHj;vXUQEn6`ARZUCt4@FN-JdTQ??~laR`qMLH=f}WLeLcc8p?R`*-Y=XOv zEO(iKb#;jAisNfbI7TQ1$4~2|?v#LS-ywhO6P^-yyjXDz8r}vZc0(ovDkyrWq3ZG! z?eHSxqqPLJ*eu~TxjU2^hjUt-n9xGr89EnTm^aAjCA>n}o^tx73RPfl+k(V9Ziq;e zM6kJ?CpBe4b+|WWbzF~%G4bhJHXIn9IV9iPoUv>N8o)SMqkQw3aNc=!Pl~%ea_p+g z5UEa4y+~V-VIKa}NJYdf_jjK{>x#=sT#7kUgDC`@XJe2ezwux=pqV6!%|;Yck^ zCwr0jGkUT!N4=3kBgM5koJi5-0ErX;G-p9yIyRCxK598npjQ)omLW%2R^Ssk?5+vl zLz5p*!4T4U&8qQ3;ma`VMFF}G*jOS#5Q_-`b&XBm;7;X4k-(s`z7FTkXzlcb5RKaM z$2EWWyY}Cd3a=*7dpL13b@AQb1VzSp9CX`Yf2aUW1Rkg`l#RGxpCp61Al*53C?V)` zA}1~!+|uj6VC|;VEC`Oz3vPF?D`Rk8pJ_*+>iR+QZqbF_ZG)LrtMU!n#is21`!2RghxXjZPlmc^)5O?t2(GsPJarCKm8~aPQA84Sgtf4oMed8;qB+NVJb}$ z-33Oy$G1K9n8oVDiH_(OU*yG!Ot{)%j}ASKRH!A6ihSuV&N0_R;78`q83w(3*Zc=+ zbtN0^7ezqtCge#ZPk?YvR>ag1#aGjM)O)#E$ zr~1o|;$){{&Xo#4;8k=-gsU|qIdXCEdfRA;mVX2N!LD?U-P&YUg^9)Eq!R~OLHX5{i`jKq(4I!Qb~l)S=p!~hFKXEP z*y3eZ;v#Zs<%x8?12b46tBXTO1I0n1uLZpoFU+zN8p-vvZqx#|tOg*9P+D>W1FVY1 z-gCd;Dsao(K71(!e+p{d019Nz;Sq^xH6U2b4TR4B3smvd{~+`);qY< zNvQf7pS)#}oadN(2ooJ}0xaZiBeim(?I&E?vsEWlshmWbzvAmbOn@7))#3B+O;5+F z;YGR@>5oHm6vB?u)9%+(XAI7O;u7!|AVa#ZO$ujP_aB7=I{a9aW6vpGGbdP=Y?V%?`ylUQe|Kc{!{m$Wl0uPVyo}e z)KzBg&UH`<6;a3WT74kEUFsYz5M8wyl1BC2ic)LM?v<}6sWWf4ZCotBG9FE2@s5hy z9KY-In8k8j)Qj$EN6KUQTU*OEpDIj0i=`L!gF_%3l_x~#MZr?;TF(`EPeTFdE;&Sc z5W#~b^|3(>jVNf=iAhleNs=z8wmO8qU5+#SJZn?5-oN9eIp0M+2Ta%JZw~J%|KOs@ z&V8JgiF}wh@+e6{ct}=88#qk}rljn|FBvLw4y~RySWj|IDP?CDKN+21Z1jPb_0BqY z=xmQ$Qu(OY-4`%-T;G1?V1hPV6h{7N0LGp1&@~_^;-`11{Mi>4c_;W`7u02+(Y`1DEkblVKai!&ex{a=lUDWDk))ty zxyszN^Rxe*Q*Yx&s`%7GSToD)W-{y>AtS&r-;krg|GjSf@K)T}{Ymf-?UXaJ%r)U( z89q^BcK}h${mEEv`7Ir2=?Btn$5p3hD{c?`qE{^tASJyOv3mZZ7!jGdfWT&B)`)$@e-D%pclKM zdj-5L+Xuoo{_?i2oV~5+|M_i|2mckz^G4oJ8>!iGuzmU#QvVJE=KRG%xmy3kvtMQf zqd_5J6WQpig6@4NO4I(5(SH#U>pKe3rs z{=#NzYB{@+dgA|gp84;jv(dkj&Vm4RsxwL8@7dWIQYoYDH+U88Kf$ZO)Z(AKCMxx_ z?md84{ik5?41y&W_B$);_CK(q%>K%X;z~X{)&MJN5u+?g zNB=Q_hbgw63XA20>z5esY{_g_%RdDg&1@w13-2cxP(C*qK_vta!CHXHrw=UD+ z0~ta%yGh8x!o~W(dR6$vp80KT%e3MBNsoJS{%o^-`1@vS`avK+w}a%{e17jH0lo&~ z2WETQ_Hc16?VZx!}Y! zb-Wn!oiF)m@mM${h%NPV9_SJ)AF3=~Ffr10clq;%@_l%8_MT69<}ds%1I0T(3I52@ zO5s0F_y0A>^i%oSHFfZx*VJF1`yVmSzr7k)!P#+n@}I}$UmwB0{r%s6;HUiSLy-KB zhw#t8qZ18@G~lTU zkArDV{DD8vl5cpxw&D>qb)x!**ZTcyeR&3w>}r<+s);*bFva(`!4&Z0XDWb(_@4a6 zlT+4%=9 z_xUq4Wn6?m5MIfHOa;&8547ahSnxS+(B7~4Lyh>?)9E*bq7=wAWanqWZyyK)FY)lt zPsYOxqMUC;@7MmAp!kOm^cZ}ZVZy>7jC9%|H$8Az1EF>8e=emBzdPBY`lTMdujy62 zGXLi%bPqfs_cf2%_86wmD6MRjUpnTwCY-_R-$eX>`swca&RzNNTZIH1?eEXvo+Wr0 zwSRvmze_)FUDgIm)m)7Nyl=XzWTw@VVt=edu)|co_u=(ES7WM zP$Uq!Z(EQTF+x4gqHT9+@E;O|Kk&Y{zMb6(qrUw{|HCU?U;|$%FAFi)QX&5*?@CY| z`|n3TJ3jyWt^aqy|KD7r|K02VXB>04^a)RJ>a#}&r?ZmBKX?raKm8lZhJh|iXSAy5>d9<-gp3G!oQ>^Jo~4fPC#P?P*92FbfLV!f8z3Vpm0fqP zqi{n{6KwTnR!cFY@Y)ovOnEekO&7li{&a!;cn|Hf)$;v^<8GHe9P~<}!oPLfZfbA* z5-V(;jD1E_IS>+NDdu6&Fnhf z{?%{Iq}!I<5#0$@2{K6IvX|G`jqlS_u-|TdzQ3Unw}H7>R=^K(zS`w@CihzT(3=s} zWijn*M!4Di&4{h_F`w>8sk5HRP2n=7F;b>8l}bA1w(<%ohjF=qrAi!(;+E_?_SwQh zp;&kzQzhY!GHHU~%Go?bM|(uh9AGC>hOw(OajDh}0hSyWn1-mbW}>;ihi_Zwz3L+D zv=9q$jB>#A+Nus)lgO%tV10Zqbha~QHQl{PuTl}r{5VkL+Z}uf7l1P3ZejNhKXFm> zWdqmiAP+pyP*f1i-+p2SpYLL0Qf?igGP3M8UTny1Kv3eM;|*AINqd3r^5 zU;i0^o#EQTe);ze!$mmXW6V{S?eUV}EhinUPKoq-N5rUYOv?;(#4hSZqk0rDhgPZz z6g9ctYDYI)WfBrCLmaBKowp3ek*9rP8?`UPEx97b_+nzGth%EW!CGZ}O@@gmrF>_U z%Tn}|%IPW9~t$yIiU?%qRT+q#UL_l7{ZwoO5f-&lC zOlZKXZz0Lg800%5S+k&foy!%xky43Adv^NOp7r_yKA$HYr?8w??B~VMSB&&w+r}?m zU*n25SrYvC4FBb3-TNbpmn)NNB;{aWR&7Zr|9WpA?QqGW>Z!WqVZQ^sGigLAnuE%r zF0iyDfRqayHmm8^B7zQ*i0Wzi zb7w0>HBcwLKqq*@4>dN@%u#gKzyaZWv+B9!^kkQni+|j7x4xVucmzQ0^OyAS38@~S z%NdPfY!H}51*T5Vf#zrLOxuJqezRP6x8@SH_@@(-u7qus=LsXB&mwWGPXa!tP(-r zEl5P(l0x+s70Ux0CKg%xbP7_21jOZxU|1XISDVb zsxVNq4hnc+P+@;pHb~FtC$?Y69cl;Y75-rNtNI%W^F!zK}b`Fn)IyYnm z&$h*_{&Whjf292|&$v6e`bh|#DD|*QMTZ79K8xGHIlEYds)e0F93gGl`(*RfRyWOA zyQp6$FD81jIzs3kFmTv+19R`IPgK_`E|@Y^-Jkf2r-Itq{^~`q`gw~DO>Af=`-9_Zc z*a_$p@?R)OOVG;caa(1PFU;30HsxxMkNG|v0LdCtcXt)#zhz?2SwBRc8{RZyv1kqPvg|$B!ra%o zyw8;&xW=z@1>8)WuY=sOImMh7KCVo`6?iR_xPfrw@>EZu5%KJIzvgg3BO0I;tDWtN z+7MdqO%mmvs9KEzY`P9)L=KbDVYw#grME{UnxV$F1Wi$Bl2lRQOi z0aT3PB06mC$$UYxohf`$QU#ZbEw&wm5&N+V-QPS9;BgIsv`r#_3bQidF?xj8@Tk2h z>Q=cA?eO~jV~rq{I6gP5YE_9xtG6(qvS#+i8avMRA$Rfjd@vzi^M-5Hj#g2itKSZW z9W5{+$MX+B&EyOhrNVzPZDO=)??a-9dq+6{omSag?YQ=;ry*N0K@OPQ+kI1PoLa5j zPo_Ftw@+~G49jTElFqsk&ZPW(F=!`Xpr&G?Yo7T;K&vP5KsQ&L{SHD)Kj!EF9{l5&YyyhLI-)?C!1Hk^2_XD%F$=(L9z^>6GNgrcg%MNfi&ekss zTHoFIdfV689i-OA$y|!tK>(TM?*w7W9Z8MXE(qJWX7X0meeu=ch%aExwU46`>cm8+ zM>V(RYwxc4~ddz_uAUDRm0k(*QV)6~r#JR2I})eC_o~KnuV$-sScmFun)a|} z9|Q?`K`=c}dp>;7-u|wxgZd5C#;B7$lQMJEyI^k|>l6MIeg}w5sl_%$>ao}g_f>wV zx3ke$g;`O)UgdON!EUYW@*!Tcsg+tvl*S$A&K^3C5P(>&?;ZAVW0C=KE@gM=5uFPI$Uu9^O0u$mV z^B^fWr}%uc7$1{c+^w|Mxt7GmEllO*4Q=C%Jh?j*T4vRwlskl!Ub6)P;&B)`88N9n z(b5}To%EyXOqttS0s&W>N_TU#=#~UV;;(4Jn$TXS%xUxyYeH85g_uR4 z?&^ZL)UD31*|&yF-Ey_pdZ!fZSSGjcjw;^l+1@;=-sauUARFmUaDZXF3m)@GAleptKBHOz+&uRP0nf%Sr<`Oi^*#F8h{2p!)^Nv2knD|R| z^6OH2BdhKCsZ!gP*G=#SPvI;_onFlMSJB|=@2nHfThVc}vCgxM`x+nDip8q7vJ8!6 zg1Od3xQxGL+Ah;5o}6P>vwH)$rxzoYccZ}FAj%{9XP-nt?(Cla{GazU7>yq=vYksS z$q@HThl&bD04@IUX=u}Fdoir_4Ftc#4JS=l_7_dw-Tfzi0M4RDiSL z>T~TZwyexWor=1UF6yNLV&G}PC=9oX0tO~=w_>?yR&2*=lBaq|rx&;fa@5U+*>$qt zAUi6Yx7CD?PFWqxZNmd%6FY(T#oP!(>qO%~s@CC-jYVfRou%mTE|^Y8!tEt`N-R*p z-#ahqMvptQ9|lkEzu;5dXYmN(a9mEZUu`{&d!Qc8VPJMrfcjR>O>=#`{Auk$((YVk zZIM8$1t;XbLZ1BMi}|iNoh`~P&eqVR4N{URXSB0%ROJp)D?>)Mn|-aqCcfiN-;1$I z`zn&e#q`#+ABCipK^}CinI!P;NVA%Snii#NkpRgvF;igXGt;fBJYG)KfU-}bs%dc0 zJuTA7-}$CcPo#qn5gJ^Dn&cdpHLXB5zo6z%!QC1u<_?cd$v&PQXF7FD`vXPRHEP`-w1pX3~8>ne3$0nUQZ) z-{QimlU;mJRj8GzCoxuq`LHrwkM^E)y}08Cwj-Zs7UosJO>B1aQdBan)M2gRnjH&b zdsUPBeDN1DQ*vstNs2pD2wmKHg1f^tBHwBXx2pwVyS(~!&$FmcYOr}q2TDv9pO2zS zZJHrkajGd=$s@5xniU9Ptz%WHg7Xi|#-+!KU4oEyAA^W8%C}5GYU&T+x+(AzHdc%C z)o;XBsCMm$_OvYJHMmT<>^VCEm|dKpMT6Z$jWYke^q}dx-SOgO{5HmhfaaLIfXvfM z?M`fXxN~!mwrx0Fs9iall?`PZ8POGYoVOHAeH^+n*&y%qQh=P|!GyjfrX#{=+_jF) zlwo&ejJqtGJ6ybW*Mr)Iso8N(`K}(ywsSsds}+{KVSi8O?b)IRuK2aPBExVBq1XgCz}wO8{=k@|{ZZS14Z=D{B{5pN=llM!BhYTjN%QOO>LQ=CZ&9z7%YYh}4wRunqz#)MFvO zbd#s(E#e|VB9c}2iS00Q!Fly!K$^~7D;1+#qE+hxy~ONo*)uxD&yA4=^`1>Ln^V(= zSVIf!JM#GhOC5!Nv%#fs9oxtlr6_-0#gfXb)?&BMw)&Ok6|DygEvl*3q&?@0!k703UCqqF=tFh^q;qMv zPgSb7O1yTjGoL!hqPNg%7v3gP=t!xg0JPCpFV;R7-VEV?<|w=m%} z6>R%DIYysMqc~z`kV^BO_CxSd(#nr};!`4HwT=d}T}i5iwG#W0QHLjvYb#l&K9cK; z5nMFBC?pwlBoB-vKKV$x?;fPK#tWAY>KfmeVs#jbAQ|Q6 zmmY_W+O9vT@@%;h&TX=h+j=-=fnBl(0WD7}PtN`82W0c%KU>68LZf`17GZ=Z#Ncm5U%0xz6eRB8z1 zsQ&{HeU~2&g||TGQW`Pw##1g;t`>ys))}ETHy*KH6V4OkOsvwhR53Ik7ikth4D5jg zz893bO-}4oQ=KL5oFF0SwRF3`vc}10hZ!dq&gYilRadA5uRRPu@pGGG80-qZX0+z> zF~aLA1SSZ5%}q{VlbS7)Gw<@6<5*_R#LTMWu)c>zH_p4CI?MYUm&}mcMk{=D?eoLCPCkYAIgNm>z0#S%a$HePnSy zZ}ofES$!{O{j{`zO_$YTj|FKaftZzKevpG(ax|o!Fve{)SDAHh=O7BU22wRpj};=E z>G1V_5Ee@;p4N-gyH2~-llT)EUNIQaw?TTggwKl^RawHDR2PF~$e(A`Z7EUjuC5yo zF769j59L?7H{iH>kXZbJnU!U_J*N-rjR#W{hv%2HvE!6kYEvC}xIC%I{zkR(X8O;b zJ46<^c zWBiPH>(KZtiWfXhtgn`_Y8=0AG&lBq*45IXR%}2GC>+f#L1~oUhEI=-z6xorB83#c zGfca&tYMeMpxmTjLSR!gC23ji*<}7| zfnI~u$-zWpdN$mLM!RO-pa9|iS*ckih{|o6ouyoCbmltlY0hg2^tx9QZrq~alii|7 zoQRFuvxMk)XLjX+@e`AWeE~hovH*D9xw5Ey#Zz^7FZ^>ZVWED7j-bPi%3_j)j6wh7 z;PvoP5sy9kNWyJ^-6lW2b}v$XxM0(p6Ab$%E<+V&K^4y*aksLN@0M1995pEAL7SEu zhbaJf^KQj55ryW7xOXz$yLQ0Q*3SKT-17D-k^S)dxm_vnU%wYQp^Ybcbjp45t+^Yr$JRNsRMUW!DpelFhqK#Tnmvly5TLXI37~hEj@Sos%*0%riw+z}#%M zv!_ZCC`;V2bg{ivd$i&bkuVDY#jt7LEy{nAyy2|c_$K_Z>Du?t8O$rzgh&2#5fVi- z0?2UF%dX3ig2Tk;K05-2%`Xq#+g%koe6xI9WBH)3Z;Ci|Ipm_sm6@LRyb?L7F?Kv( z%%56iGf1yrZ5J`y5usx{LQ+r~zsr(X2@c>W5+AM)pcWs8dEEaq86&HC9bZpTBjb1F zI1m?gDg3*9B?cb?W~jRthI~h!Ote7-tnOz?&Dd%dO7k4d2Wc>y52k7eTz&R} zt0%P^HNyXa*P=ehcu>+dgq~;26ROW{w&>(Moc=kdJHaIm27#g|F{M6eMqvBJGp{Rz zp8i(&?dQemg(3HrcOK{!@#o)*J@-%y*-7vYNvj*JLXWbSZLNQFs>_d};-%wWKAufP=e{jgN%o80-+oDMiWu7fh6OZ!cY z*v@G8Za0MeMkZcqPgUg>?)nZmmSZ~<4&`SmS7|2_hBgON)ml2TGWE&U+01JO>V(4yj=##v(M17YRGL;$>fnZr^R;7U z&s0{t)?*%{;lgQ-hF*dkc+7->hckRJ+?m(?B__bUEYDWCg>4#-GHL$B_BT4s3ORk7 zq0E{oL2yL6eOFH=g<{#1R}s@f4=&M(uo=AW)~{#h8JzV@JU5(m2@pN6pq11S+nu=v z=`%$?{I3C3Vc;bXw(Co(c|ZU@MyZ<*f8^sc;w7{%?h57SpFrAt0Af^-+sO$LT236ZmlA; z{|-xgC8y}|;o>rM*TaIedV4wqk02ZEQ^05z3Qt1N;FB9i-9zGWOjSZ+;`dJ39*8(h z(Kn3ctsA)iOkliIUzgAJX#6ySMGZlixii1P=~`Kpr+HKCxt`pS*mR=2TI*LffTC-V zmplGRH(AOivq=8X3dOqmd^7xYCQ4v>U2$g*3?7Cw!Wi(A8WEl&&bEvPTL-$c@#1DB z9I;iCoeJ#ki`_m`U_!q}6O_i44oFY%0)J_4O<43z3UZJ?-l>n&LCGws8@tL8^PEBCuY-b{#&v$Mf`;}T`0B#&X4S7vXSH`aS9R;kPZYn+K-(gp)zP6gQic{r1k?i!^|Pgym-)UriF7UG1Dzm!iqFGW?MJpvDpcF4=Ei@Wq+ z-y3=ywZ;Do4kt9ieiZAXv1fOF2Z{q{+wrBx`jCU1Q$81jfM9{bNEN{~meTC(C0=zJSKe3XW)U1_ zoagK*Ff=1Jf~`=K(eumBnEdo2CSQN!H=%2!dEkpRm@}6?~Lu&Qq?I)Zy{@|po@<+5zTvM z)51}ZI9I!{>2tXGd>e`pf!zNH+9tpbRG`s?3{wzpqjf#Dq~?I4H`o|cnJ6V_WtMcf z5hT?ZZz7x*DU2JR8x{h zIyO5_laZfIA=&P__Fj$K9x4n)MI44GJv)q5UYpGAb&|tJKGpXG1vvM-X{9 z=h78;dfynB=0X22_TDle%C_qQ6$B)tyQCXLQUL+!VaORmy1N@`L}KWWZiX2eq@_Uw z0TGa)OBCr;TJqfbzVG)v&-=wW-~aP-M27pmV()dWwf4S7hdzurs+6NJ--}Q8@iPAc z+7+uX^wfW700WwIgO7q1D!|h^c+u>Xt{&8fgyJ z$lzi;8ChfgT%fM@O%XD^nszqL>iE}V??WT~I;Xs#i|fSBqdS!=n>RnA$1`CuF@=Sp z7Vi?wl)cYgT7<3prS$H=XQi9zdNA$+^>c4t3tsXYKM zK)^)u=;`uNe}Jux?Q$01BmRw4z6~A)Y?4?`@^799_1)KRXJJ)WLL;)@hoz-jZKEs8w;WxhoW*Zdi$E> zY;atc8|z}C^R6=l{bZnt*$i2lS17$Pv_$}U;O|t(K9Aa^9-eGWKJW4$(R5g9j^>^* zS8sMvWY2|oIKwFwm0ZNQWO}K77^H66b2anxNEr3}NEbpj{>X@2 zj?t3Wq(vS4vy4ohE;LZobxxC>Ftf(6L5-BY(subYdsE?s zDH@9cR9-qhd$Rb)yv~%@D=NG%1%2W~t*J-42_bv)A{T4-W|(WL_1cu<86ziqf-ZAP z3x#rxI2g8BIMTS+j)Dcn7lULPKSKr$=`uE%D z_zT7wh-_tuReW9LBrg|28gG0VPYCLQk;m>*mRc1O})N)xdi_U-jf?9r?#rZkpb$B5JR(9Vc za8&YU68Sa@c95E^rhWj{snFFdFg(}4&&BdHN;qM(Ukg3m$vqJX7@4$kLK@>q_5{yBqgqu=ZOQa-E9zl4RrCKN`BA4pZf_MMd+Q;1&+o`J_Tz zyB3?IbwSQSjZQ_4+-Ge=@53}58OleKLot8hljK5sd$}R;Zev5wH)md>>*`L6&DTw_ z?_x%sYn^1v5EO56Z|Ej9b8(d-I1M@J#g(#4{Jhq(&CrI)!A4OykI>kAFf#9unxU(H zwPEW)Pq(#+#N>^o)9&-c8avoGWEUK{l3iLnJ}1?(iPOlIk_5ooKjno4?PQx1yRU(H;a1L-T&tuE%Quk*1) zU*`GFzp=rCOq3rQ94u)S(gok{fwZBS(dg+?hr>A7*zeUOW)&FV-Ls=)9`J)|*9Kd3W%R!(m|r;dKgl(@-15^kXN&YJ=#u zvy=$4AmWWLs-N6-dc=b+?pGVNWf4i@_46Xx`nsbnH_C_~8#KltBI6sAMNiNv!tqHkk_! z=1UlHqtR^2^yzKx7^15Cucn%3CsBhip%Uj5={7u1g$ zbMlO$4j6N444Recl@g`)Sh=)$^GRygM-603!_PvB185Th#5odeZtAq@(ZB3PEx%FQ zsGzL2cD1V4H%#Gb zw5Mg)@**|LH#g0;z0=i~Q`%8!Johx0F4hOU&hq_kt`z1QB=o_hu&@GpS=rrU(Xi!g z9nc!jSO(-mS_4;{aONVDzBz#esq%Y&8<*!l~$y zLzRVV8OEtsp^YQ)i9^s6r~FGA$<&kFt83@v>`xfHK~|y-A}jkH+dBc^9&zu(`+JMQ zn%iCB8tx902#U0a&iP$NbV@P{?0u!0{sy8;S}PA7md9@ryBE#hqo+$Wwg7kKpsR-d zGjR2cD28J4j(x($)1wfp549#{d~Eysr+Tb~*m~9<)8UtjC)}E@KidgDmz;Qj$zZY| ze%n+J8Di%!ZcNSFcOM{R^3?V{Nuy*`tgaP^(mc3dgYH5+VTy7;V+gqOCZjH&s5X^T z$5~vs2#ff%oc0kmTV8%UaqVcqaOu!@O3=o5h#LoP#i|CFM&?-LqAqw_u`aWIEG>Eq zRZKp0KjZOzZL~@?G6hi&wH}X?T=r{0QF&GOh3yrju@R1j>Z&U+SO=BEf1=&D&l(3bX3gq^DQ>nYaL( zf7BC=9bMOAM34s=u99F9XF4MZF*8YYKRwzo2utgt%}uHxIEQulF@)$E3!c{X%%YdQ zD!DJBjVQ?G=3!~2fwj`^TlV#J`3KC#LM! zUqyNgr3QWOCP%~D3%PO0_Rrn#TyT(Q2uuXg4kTJ@>NS~7Tw=oIU6#336uP>QcC*)~ z2ZS}adbka-zcLWQCKlmbk{XcnGQ)1HCYMsRG+^b&t&$=&9u#5r8An)CbKz8qo<+Ne>|vY)Jy5^>gD_KI)6j4<&MRN*T-matv-5JAs| zSaASh8@LuUu~H-Cm+?s1uJRN4oS9(@s+!w-4D^NN>*ap$MZ|7Ov$nk#9#x1oeO{95 zyUUVNlyXSo%>r*ccnPcxM)`zW`*d-37A|$ViG;oAM$bw$lb4fNt!i8=N4=b=qFG8k zPWxZ;%;Lo_8RK?v78%vE$d$a0(J5F--8(L%@|1Nff^5ANWJ;`t>RU3t{L2dvP-d-q zcfvFD2?7*%k?L?sng}tN=PKt5mU4VxJhL>cUD561olEnsN_UT&%%GnlXfR8g?ZIb= zF~U&kn4L_X-(jXGd5gibaCALBK$}{b|2+(yg4x!4cX4*B{UCoyX|vBei|8!FhrW?m z(*4u*Wun&n&(|m_VtZ9(>GIs~A5L&EhNuCj)<^Bm$g3#Hd|p^HHnB2U_wlvsLVei6P%6+nibCdSkrSYeFMN*GEj$w#rL6nFVtV-a5+TZPcWN zXI&7BlsVs9un~j{s1657SJ>mXzq?z)i?X~sj7lGhxbNRVhWPSoTMsXafF`Snc1pHL$B+NM@iz7=bx2L=hcpYbVq zRokFWKB3WqYz{yd!ypV2LT<2JLO8Y(aNV!MJ>pu%K3KmFn&Z@=o_L_9dK2_ZcP<(I z5F~n`uAtd@j!&nYjs((!S-e9a2xZ!nr_Mo(!>xK9k48VJz9&^WI z-Eqg+nn5KD!#SW=OhE-*Ej(so?fk~SE@N0%xVCPR9uRY__c7z@B^@*Fh#8T(-{bUo z&6{NDc|Km+I6jpdkF&h7o?k?*!Sa{mTq#$~_cx1U&Kav`_ z*)sXI_%crL$L_9Cwxn~G{{z@=1c(z%{4XQ{3$TIqM3c@5hXBTGZT@yYk1u^?x_YG- zjR7@PT6GB=7`*Z@IfLg&Mu&nF+;OL;E1gQ+`F$G^LRomseBlOUO7(f|Mtv6m2y5M2 zoHC&ks7y?Sf$rJq<|;pgm#wP0MK3jG5Ygi(@JH^>y_V$=TrC4U9O>|q5j>x3W_Sv7 z$JRu*AGn7EvkZj{LSQQ<#854%6yR!-)q;OrXnHk%?{cG)C;dX>sG{P?x)@Ct2Y0A8 zrPavbAKtP{j?_}6wzuYMo1j23t;=V<>3JsY@LBUxsFj1oOh#KMB{EGw4)iLs1h^Pu z8=56JKlyHSlu$b0!`@T*q+?B>5ssqs!UBevKm~b?P7t@c?RD((4rWzQv=SE&k47~K zjX|=*6pnYP%G+&m(%MJe!x^)1ndTiT^RpxWs~RiW)F%Z{UoF+03-yo?MuOTxXQp?2 zhPjSAe4fR%>qvpDqqOT+3pf|9Ux|_{EV5X?5F02Dk+(kDsp>KSIy&&>XG4;{EN@H zhPGTv8Rc#7r6j0qrS~|^UQ5~?J`t;rrTU3?`+;958jhsN7MZCtJu;OomEPW;KV~JdNJuE+{L<8(QO;XM)Vhs*6i;JOMzo6g9bV;) zJlE>v8t`T})4{EI)_Jh^)y+gusNVh^oqnN=-+A=A5(_dYG4qn(y1?Tz-aP4mm!o-O z9FNFj0q7IC1)%pyeD}$Ib^%mLgm$&O&ik-3BeA`J_*qkRpNAtPeJmZ0VzE{)&OZxy zclvG-vnU9W#!9Ws_Y?v1kOWpK=PAjqVjxzpo~KgTa*@1K^BizHQd<{%OuJdz3`QKs z3&?$i#7J4BbDHV57QoPT>ns$IFl!skv$S$qFDZeFe2xwLWIkV)Wgh(ZVNXTB7-|P#7IEIz|Bsff@P2?iU6r%-vj}lKl|`VqsXq=#_f%1om2aTcPG|VIh0NM zWEnV)FiLZAO}Q_nJqB6xC;VKAP;m%C@HkD3Qs_X*YUz+o69o-aTPplrTbO(ZrQ@ID ziqA(AvL4UAZhRL*IDF;7;y(vED(qg5(5_)m5qMUhy+?=CJ^6;S-i3dHPdAS^zU zT9fTzPC+dTS;1;!K34)@LdAWKF|Ng2t0zro@&&YuOMJcyo*nC7T+j5Q&M>1x*%Xg) zt4TN&x@8@bl8c+R+CO(QV@2q^QI+(6+nlpk%#{^B$gR^GhQK!XXv#z>-y^#rRPwO6 zs>(=Nm`1oG*4QhPT*Y$BEQRg_Affu|z|K+LMG~(a$pQ<#c7gVVt=qMXg>>Z!b|q^d*B}LR%>>qb)kc zYG&R7$=27G#Xhoeb2QD&X4j$+^?rjS3krKKmZeiwZ?d$(m{9L+D}s@{R$2OHi1wtI96h3o72mz*3L>^nc{qBb(37GN1cdhNyXuMNMHzUONF65e zEINQdnWTV6f#0kMpIIFk{n1q0akv6kmH(qAySdNm>eAUM>cbSyZfl<-y+1+ksoy#i z18u@AbZv(UcDBwT`d`Zo_%hp0VO&3+9OL&p4o)3Mk`9dOvJ`Hy(Q7Pe0LQE>y;V@p z;c7>C%cL-(b?dROdr#sG>@y#=PreZoYW#@n?)pD%vF=Fot+AeJv)6(xwNtt9#?~@$ZJg?JQHT)127WPpK z6)g4<0o~_vrxbB9FeGU>?guX%A5WwbW$=2>b=qpR6%W!oobj58Fc-`;16 z#+L=ldvjUiAQ%EeuIx&*P2;dI1pwm86EVg_Ewd=wNPdM*Vy{mmpuz=!=vpQT-wzJr z-rJ3=RbIO^YD`7s$Pv82X1g!q$|Q1JKnnG#)OA84c5;}{ePeZrCtJ#MQ#5#)$L3FZ z%d9IS!~LGg$A5~WGk9d%q)kt(!|29kkBi4`#>SvtiVXQk+c|q2?WC;|^8{;p;q5N6 zB~N+#$1%FD!M1X?v?0Y|ujBKgLB*ya=|bK$(-!%mA^S%2_*_Amg882|M75%>i+s^e zoOh$VOK{1r5ZElXqq(Iz!_DCFVojIuP@N>P0rpxF-8lU{b406*WmL3AqW3M;ncvM*t#xY(I{D~YL7 zk3)H(?OIbKgfx-Yc8+nejwL7#OsLzP3wn0JVf7O2)!u|1AkS!}jA;^W?Y&dF*Annz z;$lT)Qm}+r1a{wd{%s~nox(84VRo>2e82oM8rVo0qdA#10#8_z{Am!6ym2+kzT%*% z(7omvUw1p7;%WX|bXN(PjG>EL*mW&YQEY)WEGn}PQcD216sLtIxr7QBsyPVZMc=N4 zn((w+{=(uwDxWRe$AxSW(pB>A-_+WVBlJFKc~$25+)%hF3|9~2+U}y(;eWn9?v0dA zlF@In;9%M&!@U7<@_v%SwMBJVre^ztE3`Dfjf}U(hGjw|I}FWS+#bNFIE`&1GQ%_( z{60DD!i}C+D?ZYB1~gg7L-nnP=Q z_~Zrf$lAF008i)b)V;v@N?*} zNK7>1s$27)3-cc*BK6GtMr}tXmKl%JnoW)%Xy`IBQ_v=EflUV?O zjOO9_o9z!(K#vJs13!klHP{C|?LSDd&LuAPhtAa_ryi#BeUXnMECG9vAQ+vd;hb=M z*7R6PetTAS1X2q(yma2X!Y;DWV~#?+*7QrG%*#h5AkCGK0NEbd+oZ@64P*F&y9M6@ zQ{81B$+DIKBfDi^YWIa#KVKG&V=d$AqV-Ab0cW*QSO1U2G{OV=*_Yh+o@?%qY4^z9 zlW1l~P0va?n6CI`933HrF+Zh*<~;Hv>z{w4)Ih#mT*>kPp5j#wW>qh7 zZLQe(Frfzxge*wA{KT<&;zs@#|Dpv6-BkTrZFSO<3{UFfl4te)O$}0V)G=lw%;(?+JsW;%MAtu#@ooJu>tLc8wzDbq(jMQE~wrE!Bp2KV?TOMvs2mZ*nDNe4wBTD_)h zzijhsSsvY8^({h3DpV6-DT(*+Al;g&sh%LYx0X49*D|LL%XM|;74s9NV_@Q;RFq&z zmyOZrLn8Nwj9Mab6*ah?u)rn>^>p(zXtNU+_w%m%X*|zUfOfS^%BGwFJ{%L#JF-x7 zTs=j{nN7OnUZ~%PscO@B;Bq^Do%al+)h1lG?g>zEYD*3}`bRJ`;W`kC;Jw#15oDcFN5mqHb&O=iQ@e&;v?Rv{?#%Efu zwPMg)`eds5c^W$REPRS7kA<~Th4Qup)y2kH5`TJ)0xw)g4{X_eRK~3&mTz)&WQl4B zU2~fL74RRD9+1CZ8phwj)636-P}K5zSfLFwKXV!V4W(;AJ@jZQ#Kr0bQgR_zZSvwC z4HWog_ObrikY^W}$HReJ4gUBJn(YZ{h+7H;TKP@=F1rRY2$+jVK3h>q^BQYvZxpw? zWvSkeaBsdQJ_#aF+mYJkyuGRb&G~XYuVt4Og9<4vwH@!sIxJb67$X#76*;}kO0k;g z)S#`mZq)Gae;v`D&zT&*2fc1d;=)lqyR9NhViBlj5Zlk z%ZD2Z`F+A3Kb@8I;o_(j_`=)v@_5*x?g?q_DO<_sY;r?n{NA^-v(JtFvpy~hO70S8 zmFOhg;kx*6bz{TN@LxMytI>2^f|(|%a*~5`hN2v^$PL-m%1vG3?Z_q%O$}^4Jy$*7 zCI6<9Z4qwA(SbDYP^`>@wOC7}cDRN86nhL%+b>Hyy`Rc#$s|$?rE{l1J}f2+2mS>f ze*P+a1a_L|6w>VQz9`f?3q<9X&EyF{gg^E08Cgj~Bv zJjp9{x~6fcW4xMHOa6WKHc=vLDJq7oUONI+q$NC6Rh?Fpc5uo{2Ors4i`N3^wu-en zuk*s(c?#mf3xZt`8d`AVru_aWMisD%?9Z=H%Y*t8&i2GqX{YxzrAb)A)UqBW9v)dU z-9Zg^-jyhqZ4Gv_h*7mgPw(PG*}5#(E2Xjg47!H7IZP?4QAc4N22qK{=VX!EB`1#7L{jR9CC?eWNoU?HUYVu$hwBJi1lYuARf z_Nkcb$_dui!8Z;pF}Z^u0l+k@WPXBQh_$IR(@qtw^U+r5bQt%19Fmf2_xU(p^5bf2 z5?Q`Q2jiN+)#~ZJ!$=^*DEqDsAZo470?D*CiXK2)n9^wBJuVB(N>K`saMquFqBRd z^DqG7A7!c=XM?0!vdDw9>lD>`k#@bD92)CT*$%av%9%oOoeHa~T_pp_E2D5YC2(Su zR=9V{b3k;MOWp_rOat_0L9X+)N@;^`-Hy}~p@D(B6X)c|Eno>AKsTsM8(u-wz%92S zbM^I)_$dT*%myAp9B}1$oX0~JYpleR-Lv5|Q-wWX1F?8a-pb0bg+Ds}KUDruoENlc z6tz!VU7w7O$in3Yt z$VoM==Lr#Y7DvP(&W2TX5bnJlOAeD()L01Qo_*7y$Jm5%e=NW*BJ*m7dg&}>*6C&j zBk+D5&#dvJJi^97%fWoCWsWv12}~9vAPcKE?SxaSmzwyr&|~m+da>g^@CV_v6GC?* zjkgDCu=Nt9MEcx31*G=xI4`lfdNFNdFmo{F)#$%tXRVPd2FY9Ge2Q}d4h6{LWPNRT z7`9%B@l8%}PDd!w8ZM@#jJTNlQ^)7d#dj~)w6$Jz#ZgTS90yX28nP(3%DOA`c#wUw z+eTobj?j@lOAeFGuR4<|?#q+q<>Khsedo29Sk&j)oW$|dYS-RM5ne&lpOw9MS0_CS zC6(Q;hU)N~aa)Rq?4!#(fB=~~?RB2g+I3TXBle5YxV2PoV=(1FnD~lhpesX0wynrCMh`;K*}r=XEp+ChUR#B{zFKQwL2AtrtLmSG2Ykn zOAe_FFr{h(CD3?bYNP9uH=DXANRWyJF(yAkFg~Wjye0kk`)52oSpF;TSaf2_t2lWF zq-Px78UBw6N?_&dJ%e97AN|UKqfIpVLk#@BEL*!M>{pNx8B$YPu!0@)Ng03s*!)!c zz}iP4keW41d*JN2HEdNqwBVxLcE^;w17$mVF-3e zn0I_^rFwXQ9%!ck{NBzm#c+zH_UmjiD!Xp=vAlNRR5o;0p4m*S-PU*&Kn85j;DJ-Q zRBypVbe>=3km1w`pc6|$eZ#7>3vT5D`Tm$M%2ST>C`}r3ZiC6Iptd`DtvG+>y6=#- z6#WMD_g(%im;Yc!&xd)fDwGb(S);4=gaZkGA4jkIwoNmI3Bt%37g+m-ULOI?dF+T} zP2gPf0c1<+PXKo#ZY^Yvv;1XC~{1o7o`!FuK3n#(fmqjCQBxYJ9uT5GZEH_UMgK%AJK0gn1 zbVBbpr8KHdmNIjD{+{Q2ckU=$I~vUW#1qYt6vL zP4^*Q-eU1;W&Rf@Z1!TYuXCu;eb48ly^Q??QI-!To>;=CnoqlWQ;IR^TSCbII8a9U zA8*95GK;v9Dqb^ci;206!30|&Xf7|O9sYhW%Fzp2T_C{8Ow;*?2&I%Wk zx_ULHm{Z|9I`e9let3N_qomgs@psMMUK;%;woU9LB_@lqeepQbW6-Dw?P)m-85KHL zAAnoVZ&tk?RuA>%GGmCfnOm}V+3FVZeoT4JMxk}`Cd=%uKA6gonC=1|kmt%J_h(X5;P zo*~=mOJ*VNvx}EGLpuKwjm3>_r=3~0_IK=!(xezwWY*gPf4Mdp0!|ol5Tq>i>sMUu z(tLLe#X)8w7dOI}Eu;n_NwRXzz{P0TdQWaf^X_eVol@I#5;>Yx|?&o%GO+aa)hhHzx{TeJ4d^^kt?( z8+18!s=1X$6$MCZf8=Fu6Wx9g!b=`}st@>>s0J$5+>d8WpL2HT))uX%23(*!&+#ge z9-xeKz!TsFXF~!_^=8qqMrz99h{A7 zi(bm?GIkQ(=R33^KPX$}Bo3oW0k64j^4@a`V6zEf)GE(+mijr+jnVbH^Yfauasc4n zf>i%mvqh4$_raWEOz6G3&Cf;O8(pS!MNo0Fx4`~$tAS}FV7BWL2 zt69i%4=P{Z^Q~L3GU>KyXZL0#01%J-OA@+B>Cc8FKl@UWgHvvD-|Et9fYKPZ$J?t7 zFl8qixnd^|4!YV~QazrlzKi+@D~vqBn#04~+E$cyc#yXzZ$mLsz*p+v!}^Hk=Nl4T zeG=b~=|?&Pegd~7fZ`X|{9%83F%g~n0&*+UeB23sl{PG@b;u;PjSpVB5GiX?x9VfR zsgh17fopO1gJA8{m;mQQ3%^@!(xq>$S#O17ua-^(#gk*q6ZNj+Rxt0B@j@x#7&Myk zA?Y(Fq-8UEMQq6+Q^0YXffTBINbW{wee3EKV2Wk=c=z0jnCo0toq}v za2JzhumYlJ;}}NZewDfmMpaYgcWwQ91K9Wxn`FF8w~XtIG@9E2S?y4OK=h_24x9d- z-AGTlQ)*Lf1~7d{VRenMqM(2^PMC#EDueu`K+M-n0O*mNu~tq2Kx&TCAuk_qF zN;tXkM=OxXY~9_XxGuG8=AR?K0$KQNj3VM)Cw@K2g$^!ri%z9WY?-AFfUCs-Ts^qO z+E1c4R6ryADB&6Rv_x{2N&tyd`NOLg!ks0bMPkloY3$FLNV^u;f}c?pBcQ`#GnRoCCB%2 zG4?cn8O<9m<;x+RIw+=za-3%A3Z-hXJ~9!hW|0yisU@0na1C?b3&W?P;1AB2m)=*% zdAtu%cs%G%FFwcYQ3Pi}!&@Hsz>fOW;Bm~GS~0~98Oa`Hk)7vbe@$paUi)y}G#wtg zbC>R5-W{f%Klpn87f7Hi@pF^(&nHatxfxLGPNfGk9)) z-i0HXye&cGhR1TnqQE|GvuJtn*Yw*n0{SgAf5QDYshKPZ2p*Ui10$KC8Ki(Lbws+U z3UhCc-gEj+jgHRD$pww@!0O-UE{TynzfZdb)+W8W^dYVVEFsDqLJd>V{WNbh-)W@0 zNIKoy%{ubg)tpoPtz5GpSr_`aoqQ~`T0KAt+p}y2k_4iYA@tJE8|vqdWHrp$5F!m!E3`r zs5eZqF~p9Yp=qfv!l$d}Y$Uh#l)ia7)u*sv_9g{x?PrOlKO&Nl@yI4?V>xJO=q zV&nY3dL3FNtOti46dOK=}p1R}F z_j8OQ1Tb}KIF+eW%u;;7o_S^?1hjL*E;qT7_xiCyMolYYkQXO~8cb0>_%sd^?yb;L zMs!^pn}>T-(T|B(W5`-3_PZ(;CxBg!iS?ua*spu}5t#vt4DT?)V!FOwrVE_lKz@Dt z*e2pJNniK%OJq~o;;VPx5+r_P(IF=Q4*uF}Z~Fy4&#_j0BVk%g`;$CL-S|b1TU)K& zHyn@hq4Hspp4)OnmG|1Vj=1l7*taY4lF$e-9fZ^mC4cZ0VRDCu=a|EKc~t?wh_eI3 zwfov3{dRUwtGN_#jc!D&qBsXzMcRumis%$w%gxpdd198a9x(zkFJ9e$@#}ymHRqMU z9It#ar}roZuMrD~iQ9w+67QJO{pz^4gfihBC2(qs;ame`DuWM`6Cl0T)?ba*udi|m z$}}UHnJbmIHr?k35^cx3B$bc{K=(XFCZ_q#8r^wu@qyz>I`C|eJjn)QL@QLU$0LGd z#{56cp#Wai#{tyitSsRC$gBi_X7ttdKY5>@ndq%h^os93htmh|?fKqV#nC^=`8CE9 z^z;DY+8zL?%g?v!wEtos#bJd3rfM)e9qK}fhL`eTcWZcSMIk^8WEF0!v0bNn!UAO1 zu+dyvhmj_m)=h?z^GKdjm#8x-U(g-mST%Yp3qHy<0hOPo$L z^NG$4ZRXZy;kK$pC#|UVI84Kt_5h`Yg^lK9q0pSqVQxNHiwNGc60x(#4BNU4J%_0o zTjOtH@=ltzJJ8b4x-#f1E>qTg-|sZkS~GKA6+nJzp2di1&u2%?bx45uIGXc*U6P0g z86>o)0)5r^bK>>kWoWRj*ryzl;bGI zU(^cF!&JbPO$?3VG}vT0X!*TkC`SEurmwwpVWWr*&E5?cTtdR4^Cw5gk)StG$1qMs zc*^X?=-$1}V|)Ft_X(;&-rM2XHTZ*z3(dQa$-F<&e4`G>wovpeX&f4nRFZhhkyXMk zFNv6x$n;v=@?%se-*_yDIi3mb5q+qynuFc$y-5@^ zlmToHnCWoFuD0P@dj=Uc6$h>R2TPu*(8M`}o_zbo4vPGw?G2T70?@0%{0Tab^T=oh zW>r`fhRff)5no6Ch(5djCi?s-@c_sl>X!>@Js$@L;Srvz!ltu*bk~`>J=r%4%p#H| zs_iA(Z-TwwQ>&>+DpzI<%;T_uE+@M@J-H7|6XbEw28bW4J$8k?4kt_fT#;55@J2Lp zKp7D7fx{Hy;1fLUYx^H}(ND$l2k_E3e?)hQwCx6);+OGZi;I`>xArA%Opav8d$R9< z<+&-Z*lZr2Xv4?M$y}eFTBFHj1B4GHZV^Pd78Fg~;T1@ai1(C(omNp^R=!63#6fdn z{X}HTjn25)vb&%Jta(PTi%=HXQ0)mTL&&rBUQNZ8DVtA)8F#5LTFmygR^sHGT!dkp zgd?g!%HpN(6ea~&e1KEpBfD4Rz>*7sqXDCQF4sWR%7B(>cSFXnUHdNje6 zx-9bIiCf)#B}W@;jq=6;%_SA)r(DseY!8y3P(_F7v4A{bAczH6toY?OsakK(4r4NY zqziC!UzuNJB;eppPZ=J^arv#(?m#K`* zhWug^Rp96Jm-ma`fAx1-Y$_RMWSym_fB4<_#_JFGAeS8hwqgF8O6T;uf zPRUiKruJBU#xg!Qe&Nx)uLV{A{OwgeM&t?I9JYlqH@$Rlue$K7Tyg^u&1{Z_od?&9 zd0!ItlpP$N5u?>~!hn940jbP<**JP&3B;^Kc8dA=!+hp!Nh@KF~1O4VatfKRxMPt4q}iZ%nhW60fZ?=1&cK zb-f3rjQQS-n%=ycn9$IYH4;qw!KJ<@F6@OvtOWGnC;fdy{a397kPemqq{HZcPlx}| zi+%{Azs(NyF8(QJH6)&8sIYIQ6uI_z_ z>2x`r>@=c&4P2gV9ykAWw$yW!2yOv%kCA5srx(^+tB}CE%vex)g1`BlAjt}Ot737$ zdgYj-yHEFC-?*v);9|K}w7Hg3w2Lgn4o|$hWSpk?5u)<7oDhJ4KH{+y=YVoIHSz+e z+BX_U{2AaOBzsyWe_W{pOR%;f~VQOI*x0|A^1+76hDEw^YgKBW4pgQX({ex0W#?dK3(x_HSTsH!-Wl5>p8 zEv*+pLfA|=sCyXkVNy|5aql38*fK=UOti%0MFIO<>`13q!f9FV*{A!;x;asiSkP+m z1Zy4b51vFD_nX;*_65lGjKnyQZ(=EL;lmj9&WX6U{)8k2&)Q zQ;Qzg3!l)D{@4($I=I4SKFMKg%Vlt=fSGfiR8Yd<(JdUf3Q;plP>NutEzP|hMd6v2 z;hX=^I7JI$k^keVn{9sWgP%@MJx`g_INd4JxU^7v8(B|u5ze2w-J%~FcgZ5bOMH?? z^vDpOwWoOP2>?_3A#?{%Hm$+q+m$KGfa{xQ23h||o&~a6VnCo`7(HDlY%%|Dm51G| zzbg+n8~*N7_>YtY=oKAKy)RlG=Z0q1e@ZKpe;gPZ*kc$IO66XC(4$U9wHcz4$53z| zIIZoIf?ygYuVveYKd1qS;@uK~g6bX&TW6$r=Lj7lYcWoFM)^ro3Zd8o9L_c@6=k4^ZnZwH+20{^@&{SVdVEV+O*9`!gRvT z6AT+Q!-^8&I9P?+cr|n9P44+0rB(3`BpxW3VA(BV^f&*xvac{+CmMEJax&LIY3H~r zb@COT#Suiz*!t*YFFP;}s+oXI!Nh)1`mcx2XXbw#k6u7s=3p{Vpn0cN>@Pp=hy$M5 zMAZE0;%#_O+tk9=eD_S*Aib~Vj*l8{YRRTF^%I849c(&@Y;`Ur6w*CP7YFVzl~+o0 z)b@H6?T>2>3`N}@v{Igl%YmNnDLkSe#`lCipLiveQVSt(Z0a7x56jhWa4cA z{Dp~r^z`R^h7WlE@@|=-3BRXApXA^4s(*UaOnw)D@#j2x@YlL97a4TQBmRjG_&C`@ zJWvF-h@D;@w>D=0UcNv9YUHEo1dw}JtX@^l`a-DGlw5pfgS*8{5 z`ko-MIVzzad>q-jBJj8WP4%0Z5aRj$LVvC8{m0tx8UFnY)}$Za1M;3Pm^RHv}kKLAbhqVgmqSg)4 zg9S!37Vw&qZy&CV{wc)y*Mqp+`TgB@v;L1y{8~FsBlur8_umHY&vX7Q zMEvSB(-}2`jwScwZXX9S`{}TNEH6H)NxBULg zp`DEz>FE9so9@5)mOtZe_NPLFm*D>pA^xX#ee|b7o#NiVF>wEw zqtJ}sKGk9NxTwDsdi~AI`kx;%|HRYS|LcbM|CiPOn0x-q?*4BU#Q&#dRcq+g0(9Su zK%oS;5+wEu&!htL_uDFG`TR@XPTRK%x(*~DC-z%d=erLc8GyXmgxNyTOM14b@wTS5E==4AAtMNo4DD9h>(S#dr0ih5G#> zxq(ffn4vuQng-wA!Wm5dCz-Foi9RKwNP>z~JC(zlv`C4Os;QV}u^_iY1(R<_D93bDkNsOIyC;8a7S zBMAcJINyd}Mwl^BuMY4X0CqWHf!tRT_*-zX{gmd412}%(6j!D0{1cqjF;Y~2o zai%8gix&No=UW%GLhnjzKfV$*Er&VoZ5uIbmG9@@7MAVi8zT<=`h}5+QrFTd*Gn$( zBhw4Njwm;yTua6KAk9_$nA$&BZtqAt5D}{*RWdsGe(Wt5sQ&J%Gb#c%cix^Z9&vX6 zqN{;QJ0ti>1>AgCyf!QfUHKxH3P?mKl)C266<^4+PzId}qhy1A;UYj}an13zP3wN! zSRmjm5OlU@<=xWcs8j0xTIw+U+wu?hn6XoWJVVH9_7j(Ls`Jpl%oQi^@2DHe`@cq# zPyOFMxFnQP4g_*eB_se%xr2Y!$MU%bid?OPeDXX{xwpUEO)L3$UB;WJ+TgzSZNS{e zA?{nXONZTuEw!uUxpVe-5B;eUiFbWph|+tMg9> zklB-O6qV%iJs!fYRHHd>f)pI5`@k%CKhBC}nmMbuD zReI(-#1c$sSd`vTJ#C?syso12JJ98}9m_9$U~C=T1Wq&ie+YZ;peEm~YgiBjK|xeN zx`K2NrT3_m(2?GI@4Z7n6hV3kARP(4_a1`Md+$wp?}0#Q-|g=?=e*DR$9cb*%ss<| z86fOyUwf^+_S(sU`?6<9%~sCz?Zi&sk12eI(3Y=1P*=#Ze5n{(zMD!<#G8X+K9A1xH5EFm?(%fL*HmkfRNs;FcZ)IKri!h^&?_lZ^JLbacPaza zUfQnh!SBO!v$IG0?oiBT=IPG6FDHtEM){Ty(k*5(O%suD&>oqEfXvQ%R zAt&m}D5$TSfOAL2MOv^FU%yGMU2jUc;OB8n!KKL|1oWW(mizxF<+if_tz3ipsyYAv zBHBAHfX8_2)OAlY+0|S&L2)!Y5a0tk9@c4=yu?g^c{O>TvAFGWhrZEod>yfu=8*v- zm>SE}qGaJiJjQ*V5I}F=>&;m?IlxW7J9U^jrGKkRK6^#xB+XFfvRFF%(eV=uWD3n9fNo`<*Av=n@?#-^-_){XW~Ko- z=AmNM(Ho(xIyDmY=vedhz;A)3yIKvB@>`u-U)TQ>>6wmyYd^A<|93q@8obMnnZSfK zUaFSXDIW_PV+z7%BW0X7=JCL0vp99XJTVxrSip5t4NFw`lmC=tbIaXYUlVgO^H#Ay zNhzV^`Yd7I^zNkUA-Bf?r&Yt2ieF`bn~k0XFrjVc2LH}g>C~p+eYo$S=0v&#Ki;^@ zm#zEpF^wM(h7y-`33{9_I<5DDkkeviBfrF$-Mef*AxL;^s4cntdjG8jkmmVaqzv2$ z%p&Y@<^#IMiMa%i&sGY%6as`Q#s4aL1)ki#_%kSUSnWDL_wyaTW?dWGsldN0+Iqi# zD&Pi-|9%7;_>444bz^uP4(eA4P~_y}ot>?SyQjqL)^;v`4iRO;dLG1Ml)r!hf&wR_ z_tQ`Mh7eL6p~Q4F89sYV#kwuu7rm}1wogZ3IAi(24=i^8Z9jUq3{l{D+{88%Q+2#c z_@`i1o0^}9tOUObvOrv(I*_8@I$Ld~{#jxBBnPo|V&E@rWs;f`+2FoUt_SxXpeuOn z^!N|CN5Z#9XP=7gj~ci%urarnCDU~`H-`)|ZKiJNX)>Pfz{}ra6~{4FS+&BQxv6YB z?=Jd$-Y6Zn&)56VR5Arbb;j?wP_Prm>g%=SRL33C`(yd(tDpS+|5jMZA_qR z<}8;3)u7I=<4*=t>1}b<%cx~)cE>Y+(s>Kczwq@OXT^G#ZQH6MZSJ16+?1u0h2I%Pp^*%(m0^XmJ_#0)JZNZV!BecB<$2r~kjpLPSCd}Gj zn=mI27H}*NigT37GyD5hMqglF-v9z1o}IBWE*`ttR#&2au1Z!8CmLM+)L2yN)$89`rfI#5wH?lF3k!3M3&j?|( zceV?P7gzzt4G8@^qf6qCN!RMHp2ltW4RscnTy6yO6=X*z^jJn`_;aSmp3@|>{Jwld zJ-<*&E}kHPKQ)@HR-sHzZKgL~tQAkrXZQZ*f$O^keiw~a&XhV0{p;{bg>@;4;2v;f zkx9ESQ%pAff1Im5$c><= zlb!N%?UNj@*1`h3K9u7r6-~`Y_Q+(d_Gj65E($g9b2iwsEZ6dV3dA4!jC=we1rAQk z&-7UV|L^PrM>y!LU#g8KE!jJ8(QDP_tVu)PKMYk;ZtD}wa-8s~LRT9aI1@gi z=|pKwwYll=Ijd}j970wU5$r7B%AxI>8&k7A(7fgO=IbY$bfVTGr3jK1dmzewQ>6q$ zBL`5m7PO+QwivQriwk~=PQVAxx7TiXj0J7H*lWsIoYdu$WP9dLlRZG;@yXUU63$5j`LuBR%7KIyY^ybdi6>g{b)#1xa(Wgo@`7^&114qR3?U)_oq7h z5}q@>RRPFf;S`q(8Q{8`7#kN=G=-5Kzdr|7NwhC1u+}tdItGmWfL%3irO1XC+c^7B zB&0rX8z#*{MT}fD!5VzFJCMHwg{qPZTw|ZH;&Qhg?wT~-;-64TS}1~!dG-1c;+q_6 zMTa66y1x34sb|9kJ!%k)Dby+Pp zPgL7zWF@mu-eBS2C|^a6j2F1b;^lu@oEev1q5Nd ztd$kfT5@cj=5XY1#!;}96(je^F>-2$!T}_&R@jT`C*w*O4yE6nC=C<~+}cN_J9!cU zb5cBZbLp9pkK-%UQ@A65=oV6zlFGEY`ki{e>dQ`sY;>o&f{xt7hd9|DI_nnqj`l(M zLJ~ZMCV~(^p#%aCCN+FLKM=`x4sKqo))FJk^41bpNYgW6$~zFVy(o7~j?sT0@MhADg0CB|59wWLq;;_u<#GCP3~+ z-f$G8=%N;;qNx3h^K&7RozewE)zxyrH^O(n#m4Il7~3obvffvlUcUa=jt9PhpQBaA zOTZLkt7(GqVnd=g>20Fu^ZkzlFuLt^Qcwc=`@gV{QAXk$y$q; z$s<0fxED^>&S(t}{A@!b`5+t%Xh5J2Zp#~uYTest+!0?r7!20|4>Ar>GBB&Uy(>S& z_Qj3xtzX;Y;=u5wUZ)D_(V{uAoo}5f4k9M?zlu_aXSg==!F(ycfA0~M(+#5J(}hN! z&z-`k7O@9EzP#fQm61=Gs4Lox3|O~ZY=7=x{^i$$vkcj;B7-mrkmB7ThK#Jphto}t zDeftJ&FSu|tuGnlOw8t8za`OipccCqe)3RX2vEu=^V>hzpN=t{R{K{8`m$RiDjYIl zAE#l3WwjApaVQv`YGhXWGF9YmuW59-JU6j4)wKS*pv5F7dZ+K<15~R_duHCaS(-o%WA8q`X1&ApAZ|6a^1+faLR-RW^Q1 za)nlg^bThEd!hwIy?#@YgCLDqZp6Pw{89DmGPR5~vYWlq}UtHdk z&yQECZ}s}OvJJe>9`1}3r7;s;zv=@Ll)B2QAZDJys_~kPMXUeyrJwbaS9e5RL!j#q zzy?ByEQ>-$yHp!pr3Zd=3^>EqqavbWb9^mlvZ-{jeL7OM>IZt3P^j&?dxg4yc7TQ6#**nDQe!%BdywMAzbvr zGB_v(=LMkJ-8;sn@;v`Qbi8grL5a1Wh2P%SC}s3eiNopF3Q0i!?fCd!U+M zLLi?bl;}Sujeef-`($dz-Sxx81FJY5u=S_5h=)uRR&co}Oxt zNjpyo~#C% z-j16%%)pme4g=AkkCt<_0`R*S_LZcOWXJQCivw>;wVz|MNSzI5j4n6Ib{ z+PJr8Pz8ivsQLljh6gxKPty@5<4;TCcq2!QT$k?8T805q#B`%j$1TfNgxrNxXb3$C z{CccGC43Ad^WLWlWsj@EA$*0gKU*_J@1Bork3)@=6T$a)U}bkcw{$8E3tRUHMYzR7 zal>7UgP09Jw0Pepp_oPWBk%3V{JKIjW*{sXjl8@GbjiXlPL-;1A6w0xFIaQUt9(MD z;u+*=x5CN{s-8`BSY%$D(xKn(;-m5_o{3iP%K9#~k%vVre zqSO^k>}`p3?>+eegDg5uwK(%Lz(g9D0Z0DwSt|NSJUft%qWe(zH0%Q38L*$SMO@Fu zsTS2XV?26ic;26b+~6w?mDMik+u;)0{>> z$G%r^^n?dmqNa=`8WS4{WAnCk>o(a8W>Mx_fPfrbW&_%v z-(Sg;iEsQEg@h8n5kl0fYW2Ntq~*!$?n{HWtD^iTZFA*sR#|x-M?2e!*!bT5{t=wB zB}y*~xOgyc$TxubWj-*4;&0)M^gP)Ic3!I!Pzg#BF5da?_& z8@jnT0lQ<9ndHzu2~8-X8}C-M&mHUzCK<7tPZ?c^mz6}@xSgT4av3_(-=78Zf(7KH z(q%mqL2kVaZ2f*#X*(l1aAQz_LRP^n|Fo9wcn|jxNDgTLd4)1BbI3{jfZ|>Mxot4_ z*@n>FSctP{o#*aZnW|R@8~R!2=aA&9bE;T{1-Z_4kMu^=^G}eaHJVfEe;g zA;;&8U`%h5*%WerJ?e7j14c8J`YAmj=?eDQ&5z-*URy$eUWk><@hVNtb%Z7U(~Xb_ zQ!kQ_NIyhhy7o@=Kvw*F@i-nKdIh9+LAG@W)Y$e2u4)J98@~c}n`Y#zp zMCap<${<3Fi<>hCywD1E?>giQkG6Q7@;BLN#i27eMkLVt{zFJU zaUM{Qm;g?7fiwlG%ywAJNFK=Eqhw*PTJ8tqIu+)j=JNn-MYj6Y;$l2eP4_c`E;Ja$ z;VOkBuxS-REM6PFil1%0RV;L)tUw>^GIN`BW>_yAKLe>@bNc3!5|&G!9$Rn-%3smm z#x6=}eprg61(t*$LT@kZTAs(?DoIEG&eE(fc9#PdTY_oyqxg-Xcq0qPJ}dQ4aGxxQ zea}U%$VMq0w#+^zO2vKs!^a0ym>w5vEqnPsJll+98Q+cQm7U{V-o(J`n`93_V`sJq z%%Dj!XFyLoc!JOBO^>y=b&(&F`7e!KpZnp7jgL7zmH&Z!7&L`9R!n2d|9A%lHGgLR zD+3V?a3#s!As0?d<(m_i*MC+?3*=K6k_FR~i{ktEMuZ&tM%Kc4O**)PR_=wr=5`wU zlyR^(76thkgs+iYDzc6*j!iZ_(uvSDCLwxVM+*;ZeTF+n&jMiV8K~ zZAepgyg!pJZL8Rjm8jhKP0OvEsbk<%RFxraplPOj|7sEnI+&yGACm=GQmf=ysjxQC z8ESb&c6HH@To~j^ukfNT&rm~;$KrSBTnF!5idp=_roIg!fbdv34|Itj8Xdy*Ow0gztp`XK)c%vFC>8!6N4*Plx27?)p0 zcpcmyXi}1sQ$cU3Xt_$h+riJ+RVm@nYfc9$Q=i9G-Q9o}WYlbR)sqzfOy^CyynYSX zu6 z_ukJb9wq&=?V>ZxgqZoL$YTP?UC5nEPQ&N>KEqr?piF_>Tfd>0*LP>6ahB(M^wvH% zL;R(cf4u(}+He&AJJD23_}`=%jzteOr=NSSR7_21X;yfLK7T01X3YKEx5aWBi@ETd zvcA_b*KEC06LN?#gIroH7{!^U_HI8chM)d6(6?VUN_nY;>haY_nH=f`$)crg?0d%? zqZOZpA*0}Aq=s>xw-sP2_0)eRG9npd4zXkU_S2x79!BG-braMCX_Mrj?oYdW1_(M2 zk7S;x6f9rhCx&x9uT9N)`L)~i;>Zc_5u1Y`#NApXqYZ9e)%6a?>eJGX)vMJGRG8jn0;U*3rwQ zUDOBL>9Z|PZ9SdHY<|~r;~55T6qQcsNJk$-EMOZ{;}F9`OBUg^{VEuRLx*9r`YjFF zD_biSq}N!TtFh$yyTCW-KK!U3$J#p`WbRuuBh`uWUN+m}{`8NCnP9*$@n znrX2Wl{U&0FX|vGzvjnm1zwDA!JmEq`p0L{#lw84KW)x^W46OTol(*KFcl3ra4+&8 zu3F-l?F6sf#=_{E&e_K1`Gkqe`$X~DHr#Q{)h?a$iQHfr?RcfUHxco zMH}Q~fxh}2b8P~Jj7SNN`tz=+hC7Sv9}FpJBkgqjb6PR9lhkg7jmLrRW!;HSHKu9? z%d`xJ4X|F1o7uJ0e4k&L0z5KGgXZ{om`Zx z(on04v-d2@8du-n1hTYgd)}Ki3Oo_LxgvYP<{-7>G#h=J$LU*qbPGW*+B1;5ss98 zKX|@qXRDpISj*5VRHz~#^m%>Urk|MX7Mo?EfZ4!o-DA};#>UwG`o{tbQKFRrY}Dm) zHE-q<)Q4w&Sse>jQ@jj4s)K1|zZKMds9B0$K5cTR%7(<&|Mbs)7JsZWQYMO*6jRSo z)^z(TzJEBWJvUq}QZh3NbG0;J{h(1ot<|}fbl#{Gy1YfC!pN>lr}RQXC7R}`+y3Oo z>{D*RHJt6iQev%qo5kigHI{mcc7we&E0XKG8vapnuq&tR@X&SJn3Id2H@!7WMJBP> zJn(yfo9tb_O7LfEEe~Y@wUTLNdBW%1*%a|_PHVIc%uAvmM(w&BhE7TPBHs!mv|dua z&Htiv65mWpwUD71!lEX8@{1J&Js2yCV99Q%LJ2oSbt{$F#u&7a67ls@Iu|N~3Hz7C zF~T}F4N;*j-_y&IWc_TTgLO6>C}z;cNpBhP2ZqosKYZ$l$W18MFKn31W)ffM@2YkB)TEAm_}c zu3$Bkf{%d5K`U{kGa}sDCMSS?NvJ^ulA(pL%FP9ty}c8@N$iD2$~g>`xg?)CJ)=YH znfyI48tWp5QjH07I}0YS_h(!_HIG+Y*;y}?e)iUe5V}HZ^_hKFP%h)SY6izeO4$OJ zrxal)_aC^q3g+a<@+og!%w&ZtscLw5Wm4h>-22yypY|R`Uosp6qwh5sSCauFOYr}^ z*KCBf$cqtnJd{=wo2zKRrv5R5K$gRDo903n;hwTH@m(%&qL!*pvvY|_J;8gOaJle^ zhsXAX-}wx9=S}q8XI&19?YdBdHv65rfHNYHX~Qoi8Sw@ATa6q3taMPgUaqJ$LiR~2 zfO*@h87TF@XuWg;IDv*pL!`ViXK#6s9EtE8*BDJt1>!E_+!6#N{LDv@yo%6+mEYhzSwm}ao7`w=z#BHA}sV8q=CN(nB?NH zQ7&+z;=)XrKv7di#a|7Khy)lUViRa^MkS$^^YJt(lfKjS={7pXm+H2>IzRx*35|7k zGy763HjCfk{on-T8IkRpvw5f4xhRu=?V4q<)o8AJZF{xDArVi6hmb$WdcIx1(q+>n z_*w$@V0Zz=p7$k;zaWabodeiU8j{RiWTmOsA_~QHUIWu%^eI6>uzWQ%G{O6_OG{kQ z&)Nw7p0120Dh;FqIiKkwc(*@ym$H%So3;as6_8Qe86nQpm0;YxnXJiPpA zjYG`wl?Wf}RI48KiBED7ZvA|2>Q4F?ABtxB!@dkj`OZ|C3{{h5keHX;$r6KP24AWl z33qZzD(~C^$8mih?)v+CSpRwjJbd3;X-)%d$?73u#+Anm&u|5H4z?;GNoR;s~VQj6Yh(!y=oCG|)^2JBG9azdVMdE$+vM=IbtiWh%g8G`}%g9l? zp3}SCvOLumxiwICAK_0CB0?zddN5hhlspXB`uSqTy(6lt#%fhTyUx65LCglcYY`M+ zCV>zZwa5x%L%xvE(FFV*3P@hH6x!?JKYeFlL%{NZcQ|?s}&tTF44Pr7C~+m=9`l}uY}fetS#3p^`mcq;ox$bAnMv0FQ~2oGM+cK%l^mjkg(c26tztqjV1;;K9klf*xA zzWkg~8*$56H#rm^uwMF=8GjDV^hNjyYp2FXuJkDvMyjLLpWzpwI(Wpn*`)^+l=*^|G~TCH~@k}~H^Z`h+;3mG&44`s)*@)dCO z(Guk;vT3oMI7H+ht#FiF@RWQ&TUyVn$1(5}MEJwWPtpj(YYsTo1 zQU>jGT1Zj4<43J0_b~qT3J5S8paveXfL&i@wR31G z1Y^HIIX)KCeCxui+I3s-xM~DczpLWl)rc92%p7;2f6}uraCT92GrI1wsCaNd#-+M87-wIv08S9)2G`j)m#TktTOcl z*K#Kw6#r!0-H^u!>zZx2F$BzJMZOAWtY?#Q7>s^@X3<{oKY?mi>RkANo?Y7z;Z$vR z#gP?4JKdvn^E~Fz|4s;8qBE`B{X)VZrfYZSS2kxl_Nn?9N`*Akz-FTGJz%x^DX~Ka zBaDJwukh_-f`cs4Ygcz7?$h0$y-B;ggPChRae{1vs0KG6yc*SXQWrJCOTiwcuX0S1 z9KJkID-g5j8ey1kXwCcjCKKpBgk+(Ss?L76n!MyA^oGZ`WPEl0qYSy|0LR5b0R6}j9xSI0V;U`XH%sxol8-m_Ng&ia3>eF4Q=a-l^D>?FwJwZ z;3yp7(|f2%IpNTcW!EbRBe*z?eCovHXlTKr@iSk$ztG9)ixQkr)c-bBhB&Ixu&uxh z=ka!NQe#tw&{{~O%za6#G%EJ_I7WXWe5nfKj;D7{)nXFWP*kw;k`yj!zr*x% zUCKQyHk(OO%mnGkC*^WLY9+wvBai$)8MXBaYf&A8)wfLnk6KXro+`EP7OX`sgD22= zy*KxB|F(ZJ??GuxtzpIf-0uTwtI_P-i{sUTj*=(k_3z|&l9)drFE<-f39LF!iCCJ52~UJ46g^rNpL^aGw|! zGJyw+p}cn1G6`(o`I*5bA@+bquSVJY4cL9f4_K|OR;W5iG9kmE)FoEt(;p3QN7ytU87c~6V|CYrq70n$id3F8k z3s|*AS=K4ktX}}%mXKyaKvP%f_=*fz1MqzR@-kD8W$foKk$ltbZmFpQT`?I1r-8+G z);t+wVvL!*zzVDdB1cq?M49@jGJ9xAg7H3b0bh>fYfctumpob@jQhfAp#W}aVV(#{ zb*`oZk}=XjPhjl92Y(8O-|FaH?++A7I9<2xF=``O)Z3E`vir zsb(;m*BfS!A*m&`5BD$=cy=HC zyQG#>4Gu7S46erfHzNJxhv`rh(6MA*_KBA>4GV1B=z09WZJS@}Jx?h5cbSW75DPIK zU7hVLXW~OzIv08O z{@|d^Ip@BY?Wchv}v5hHlC@Nqk!x57Km@nck2}$UFIZ?pz~} zU)1%<`cTH4WA90N#Q(%AgU>&h$s{cKHxXji&9*RCVn8yD_9CF_z2zRBS`a%!Cn1N?SGZ3asNsZ|LNAv-#97Wso*d zOW=(Kipt~Q%SnqHF@0~EPb!dnkr|iqwNyFhaaRc-R;DsOTg?c-2$vQTFQLEgd$wan zC3A@8U~^2%mA6sZb+1K2-f6Xtf)9*;mHTj{wC`=dI>avRJ9GnBL5&Xo1~@qCHhZ

1_8aB5z*6#T?71tEjsL_98pW9Fg#5$(3cLiS~ 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¨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 literal 0 HcmV?d00001 diff --git a/vendor/facade/ignition-contracts/src/BaseSolution.php b/vendor/facade/ignition-contracts/src/BaseSolution.php new file mode 100644 index 0000000..b4a4909 --- /dev/null +++ b/vendor/facade/ignition-contracts/src/BaseSolution.php @@ -0,0 +1,56 @@ +title = $title; + } + + public function getSolutionTitle(): string + { + return $this->title; + } + + public function setSolutionTitle(string $title): self + { + $this->title = $title; + + return $this; + } + + public function getSolutionDescription(): string + { + return $this->description; + } + + public function setSolutionDescription(string $description): self + { + $this->description = $description; + + return $this; + } + + public function getDocumentationLinks(): array + { + return $this->links; + } + + public function setDocumentationLinks(array $links): self + { + $this->links = $links; + + return $this; + } +} diff --git a/vendor/facade/ignition-contracts/src/HasSolutionsForThrowable.php b/vendor/facade/ignition-contracts/src/HasSolutionsForThrowable.php new file mode 100644 index 0000000..39a62bb --- /dev/null +++ b/vendor/facade/ignition-contracts/src/HasSolutionsForThrowable.php @@ -0,0 +1,14 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/facade/ignition/README.md b/vendor/facade/ignition/README.md new file mode 100644 index 0000000..b4528c5 --- /dev/null +++ b/vendor/facade/ignition/README.md @@ -0,0 +1,27 @@ +# Ignition: a beautiful error page for Laravel apps + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/facade/ignition.svg?style=flat-square)](https://packagist.org/packages/facade/ignition) +![GitHub Workflow Status](https://img.shields.io/github/workflow/status/facade/ignition/run-php-tests?label=Tests) +[![Quality Score](https://img.shields.io/scrutinizer/g/facade/ignition.svg?style=flat-square)](https://scrutinizer-ci.com/g/facade/ignition) +[![StyleCI](https://github.styleci.io/repos/204472210/shield?branch=master)](https://github.styleci.io/repos/204472210) +[![Total Downloads](https://img.shields.io/packagist/dt/facade/ignition.svg?style=flat-square)](https://packagist.org/packages/facade/ignition) + +[Ignition](https://flareapp.io/docs/ignition-for-laravel/introduction) is a beautiful and customizable error page for Laravel applications running on Laravel 5.5 and newer. It is the default error page for all Laravel 6 applications. It also allows to publicly share your errors on [Flare](https://flareapp.io). If configured with a valid Flare API key, your errors in production applications will be tracked, and you'll get notified when they happen. + +![Screenshot of ignition](https://facade.github.io/ignition/screenshot.png) + +## Official Documentation + +The official documentation for Ignition can be found on the [Flare website](https://flareapp.io/docs/ignition-for-laravel/installation). + +### Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/vendor/facade/ignition/composer.json b/vendor/facade/ignition/composer.json new file mode 100644 index 0000000..0b7b2e2 --- /dev/null +++ b/vendor/facade/ignition/composer.json @@ -0,0 +1,77 @@ +{ + "name": "facade/ignition", + "description": "A beautiful error page for Laravel applications.", + "keywords": [ + "error", + "page", + "laravel", + "flare" + ], + "homepage": "https://github.com/facade/ignition", + "license": "MIT", + "require": { + "php": "^7.2.5", + "ext-json": "*", + "ext-mbstring": "*", + "facade/flare-client-php": "^1.0", + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.4", + "illuminate/support": "^7.0|^8.0", + "monolog/monolog": "^2.0", + "scrivo/highlight.php": "^9.15", + "symfony/console": "^5.0", + "symfony/var-dumper": "^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "mockery/mockery": "^1.3", + "orchestra/testbench": "5.0" + }, + "suggest": { + "laravel/telescope": "^3.1" + }, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Facade\\Ignition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Facade\\Ignition\\Facades\\Flare" + } + } + }, + "autoload": { + "psr-4": { + "Facade\\Ignition\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Facade\\Ignition\\Tests\\": "tests" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": { + "format": [ + "vendor/bin/php-cs-fixer fix" + ], + "test": "vendor/bin/phpunit", + "test-coverage": "vendor/bin/phpunit --coverage-html coverage" + }, + "support": { + "issues": "https://github.com/facade/ignition/issues", + "forum": "https://twitter.com/flareappio", + "source": "https://github.com/facade/ignition", + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction" + } +} diff --git a/vendor/facade/ignition/config/flare.php b/vendor/facade/ignition/config/flare.php new file mode 100644 index 0000000..d91e820 --- /dev/null +++ b/vendor/facade/ignition/config/flare.php @@ -0,0 +1,48 @@ + env('FLARE_KEY'), + + /* + |-------------------------------------------------------------------------- + | Reporting Options + |-------------------------------------------------------------------------- + | + | These options determine which information will be transmitted to Flare. + | + */ + + 'reporting' => [ + 'anonymize_ips' => true, + 'collect_git_information' => false, + 'report_queries' => true, + 'maximum_number_of_collected_queries' => 200, + 'report_query_bindings' => true, + 'report_view_data' => true, + 'grouping_type' => null, + ], + + /* + |-------------------------------------------------------------------------- + | Reporting Log statements + |-------------------------------------------------------------------------- + | + | If this setting is `false` log statements won't be send as events to Flare, + | no matter which error level you specified in the Flare log channel. + | + */ + + 'send_logs_as_events' => true, +]; diff --git a/vendor/facade/ignition/config/ignition.php b/vendor/facade/ignition/config/ignition.php new file mode 100644 index 0000000..1c1b648 --- /dev/null +++ b/vendor/facade/ignition/config/ignition.php @@ -0,0 +1,125 @@ + env('IGNITION_EDITOR', 'phpstorm'), + + /* + |-------------------------------------------------------------------------- + | Theme + |-------------------------------------------------------------------------- + | + | Here you may specify which theme Ignition should use. + | + | Supported: "light", "dark", "auto" + | + */ + + 'theme' => env('IGNITION_THEME', 'light'), + + /* + |-------------------------------------------------------------------------- + | Sharing + |-------------------------------------------------------------------------- + | + | You can share local errors with colleagues or others around the world. + | Sharing is completely free and doesn't require an account on Flare. + | + | If necessary, you can completely disable sharing below. + | + */ + + 'enable_share_button' => env('IGNITION_SHARING_ENABLED', true), + + /* + |-------------------------------------------------------------------------- + | Register Ignition commands + |-------------------------------------------------------------------------- + | + | Ignition comes with an additional make command that lets you create + | new solution classes more easily. To keep your default Laravel + | installation clean, this command is not registered by default. + | + | You can enable the command registration below. + | + */ + 'register_commands' => env('REGISTER_IGNITION_COMMANDS', false), + + /* + |-------------------------------------------------------------------------- + | Ignored Solution Providers + |-------------------------------------------------------------------------- + | + | You may specify a list of solution providers (as fully qualified class + | names) that shouldn't be loaded. Ignition will ignore these classes + | and possible solutions provided by them will never be displayed. + | + */ + + 'ignored_solution_providers' => [ + \Facade\Ignition\SolutionProviders\MissingPackageSolutionProvider::class, + ], + + /* + |-------------------------------------------------------------------------- + | Runnable Solutions + |-------------------------------------------------------------------------- + | + | Some solutions that Ignition displays are runnable and can perform + | various tasks. Runnable solutions are enabled when your app has + | debug mode enabled. You may also fully disable this feature. + | + */ + + 'enable_runnable_solutions' => env('IGNITION_ENABLE_RUNNABLE_SOLUTIONS', null), + + /* + |-------------------------------------------------------------------------- + | Remote Path Mapping + |-------------------------------------------------------------------------- + | + | If you are using a remote dev server, like Laravel Homestead, Docker, or + | even a remote VPS, it will be necessary to specify your path mapping. + | + | Leaving one, or both of these, empty or null will not trigger the remote + | URL changes and Ignition will treat your editor links as local files. + | + | "remote_sites_path" is an absolute base path for your sites or projects + | in Homestead, Vagrant, Docker, or another remote development server. + | + | Example value: "/home/vagrant/Code" + | + | "local_sites_path" is an absolute base path for your sites or projects + | on your local computer where your IDE or code editor is running on. + | + | Example values: "/Users//Code", "C:\Users\\Documents\Code" + | + */ + + 'remote_sites_path' => env('IGNITION_REMOTE_SITES_PATH', ''), + 'local_sites_path' => env('IGNITION_LOCAL_SITES_PATH', ''), + + /* + |-------------------------------------------------------------------------- + | Housekeeping Endpoint Prefix + |-------------------------------------------------------------------------- + | + | Ignition registers a couple of routes when it is enabled. Below you may + | specify a route prefix that will be used to host all internal links. + | + */ + 'housekeeping_endpoint_prefix' => '_ignition', + +]; diff --git a/vendor/facade/ignition/package.json b/vendor/facade/ignition/package.json new file mode 100644 index 0000000..3eb1d10 --- /dev/null +++ b/vendor/facade/ignition/package.json @@ -0,0 +1,65 @@ +{ + "private": true, + "scripts": { + "dev": "webpack --mode development --watch", + "build": "NODE_ENV=production webpack --mode production", + "format": "prettier --write 'resources/**/*.{css,js,ts,vue}'" + }, + "dependencies": { + "git-url-parse": "^11.1.2", + "highlight.js": "^9.15.6", + "lodash": "^4.17.4", + "markdown-it": "^9.0.1", + "md5": "^2.2.1", + "sql-formatter": "^2.3.3" + }, + "devDependencies": { + "@babel/core": "^7.4.5", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-transform-runtime": "^7.4.4", + "@babel/preset-env": "^7.4.5", + "@babel/preset-typescript": "^7.3.3", + "@fullhuman/postcss-purgecss": "^1.1.0", + "@types/jest": "^24.0.15", + "@types/lodash": "^4.14.133", + "babel-loader": "^8.0.6", + "css-loader": "^3.0.0", + "husky": "^1.3.1", + "jest": "^24.8.0", + "lint-staged": "^8.1.5", + "postcss-import": "^12.0.1", + "postcss-loader": "^3.0.0", + "postcss-preset-env": "^6.6.0", + "prettier": "^1.16.4", + "style-loader": "^0.23.1", + "tailwindcss": "^1.0.4", + "typescript": "^3.5.2", + "vue": "^2.6.10", + "vue-loader": "^15.7.0", + "vue-template-compiler": "^2.6.10", + "webpack": "^4.35.0", + "webpack-cli": "^3.3.5" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged && yarn build && git add resources/compiled/ignition.js" + } + }, + "lint-staged": { + "linters": { + "*.{css,js,ts,vue}": [ + "yarn format", + "git add" + ] + }, + "ignore": [ + "resources/compiled/**/*" + ] + }, + "jest": { + "testPathIgnorePatterns": [ + "/node_modules/", + "/__helpers__/" + ] + } +} diff --git a/vendor/facade/ignition/resources/.gitignore b/vendor/facade/ignition/resources/.gitignore new file mode 100644 index 0000000..4dcdd85 --- /dev/null +++ b/vendor/facade/ignition/resources/.gitignore @@ -0,0 +1,3 @@ +compiled/* +!compiled/index.html +!compiled/ignition.js diff --git a/vendor/facade/ignition/resources/compiled/ignition.js b/vendor/facade/ignition/resources/compiled/ignition.js new file mode 100644 index 0000000..5ce8c8e --- /dev/null +++ b/vendor/facade/ignition/resources/compiled/ignition.js @@ -0,0 +1,32 @@ +!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="/",n(n.s=280)}([function(t,e,n){"use strict";function r(t,e,n,r,o,i,a,s){var c,u="function"==typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},u._ssrRegister=c):o&&(c=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),c)if(u.functional){u._injectStyles=c;var l=u.render;u.render=function(t,e){return c.call(e),l(t,e)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,c):[c]}return{exports:t,options:u}}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";var r=Object.prototype.hasOwnProperty;function o(t,e){return r.call(t,e)}function i(t){return!(t>=55296&&t<=57343)&&(!(t>=64976&&t<=65007)&&(65535!=(65535&t)&&65534!=(65535&t)&&(!(t>=0&&t<=8)&&(11!==t&&(!(t>=14&&t<=31)&&(!(t>=127&&t<=159)&&!(t>1114111)))))))}function a(t){if(t>65535){var e=55296+((t-=65536)>>10),n=56320+(1023&t);return String.fromCharCode(e,n)}return String.fromCharCode(t)}var s=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,c=new RegExp(s.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),u=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=n(55);var f=/[&<>"]/,p=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function h(t){return d[t]}var m=/[.?*+^$[\]\\(){}|-]/g;var g=n(36);e.lib={},e.lib.mdurl=n(56),e.lib.ucmicro=n(107),e.assign=function(t){return Array.prototype.slice.call(arguments,1).forEach((function(e){if(e){if("object"!=typeof e)throw new TypeError(e+"must be object");Object.keys(e).forEach((function(n){t[n]=e[n]}))}})),t},e.isString=function(t){return"[object String]"===function(t){return Object.prototype.toString.call(t)}(t)},e.has=o,e.unescapeMd=function(t){return t.indexOf("\\")<0?t:t.replace(s,"$1")},e.unescapeAll=function(t){return t.indexOf("\\")<0&&t.indexOf("&")<0?t:t.replace(c,(function(t,e,n){return e||function(t,e){var n=0;return o(l,e)?l[e]:35===e.charCodeAt(0)&&u.test(e)&&i(n="x"===e[1].toLowerCase()?parseInt(e.slice(2),16):parseInt(e.slice(1),10))?a(n):t}(t,n)}))},e.isValidEntityCode=i,e.fromCodePoint=a,e.escapeHtml=function(t){return f.test(t)?t.replace(p,h):t},e.arrayReplaceAt=function(t,e,n){return[].concat(t.slice(0,e),n,t.slice(e+1))},e.isSpace=function(t){switch(t){case 9:case 32:return!0}return!1},e.isWhiteSpace=function(t){if(t>=8192&&t<=8202)return!0;switch(t){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},e.isMdAsciiPunct=function(t){switch(t){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},e.isPunctChar=function(t){return g.test(t)},e.escapeRE=function(t){return t.replace(m,"\\$&")},e.normalizeReference=function(t){return t=t.trim().replace(/\s+/g," "),"á¹¾"==="ẞ".toLowerCase()&&(t=t.replace(/ẞ/g,"ß")),t.toLowerCase().toUpperCase()}},function(t,e,n){"use strict";e.a={functional:!0,props:{label:{default:""}},render:function(t,e){return[t("dt",{attrs:{class:"definition-label"}},e.props.label),t("dd",{attrs:{class:"definition-value"}},e.children)]}}},function(t,e,n){"use strict";var r={props:{title:{default:""},className:{default:""}}},o=n(0),i=Object(o.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{class:t.className},[t.title?n("h3",{staticClass:"definition-list-title"},[t._v(t._s(t.title))]):t._e(),t._v(" "),this.$slots.default?n("dl",{staticClass:"definition-list"},[t._t("default")],2):t._e(),t._v(" "),this.$slots.default?t._e():n("div",{staticClass:"definition-list"},[n("div",{staticClass:"definition-list-empty"},[t._v("—")])])])}),[],!1,null,null,null);e.a=i.exports},function(t,e,n){var r=n(160),o=n(161),i=n(162);t.exports=function(t){return r(t)||o(t)||i()}},function(t,e,n){"use strict";var r=n(33),o={props:{file:{required:!0},editable:{default:!1},relative:{default:!0},lineNumber:{required:!1},pathClass:{default:""}},data:function(){return{segments:[],filename:"",fileSegments:[]}},inject:["config","report"],watch:{file:{immediate:!0,handler:function(){this.segments=this.path.replace(/^\/Users/,"~").split("/"),this.filename=this.segments.pop()||"",this.fileSegments=this.filename.split(".")}}},computed:{path:function(){return this.relative?this.file.replace(this.report.application_path+"/",""):this.file},editorUrl:function(){return Object(r.a)(this.config,this.file,this.lineNumber)}}},i=n(0),a=Object(i.a)(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("span",{staticClass:"inline-flex justify-start items-baseline"},[n("span",t._g({staticClass:"ui-path",class:t.pathClass},t.$listeners),[t._l(t.segments,(function(e,r){return n("span",{key:"segment-"+r},[t._v(t._s(e)+"/"),n("wbr")])})),t._l(t.fileSegments,(function(e,r){return n("span",{key:"file-"+r,class:0===r?"font-semibold":""},[t._v(t._s(r>0?".":"")+t._s(e))])})),t.lineNumber?n("span",[t._v(":"+t._s(t.lineNumber))]):t._e()],2),t._v(" "),t._t("default"),t._v(" "),t.editable&&t.editorUrl?n("a",{staticClass:"ml-2 inline-block text-sm text-purple-400 hover:text-purple-500",attrs:{href:t.editorUrl}},[n("Icon",{attrs:{name:"pencil"}})],1):t._e()],2)}),[],!1,null,null,null);e.a=a.exports},function(t,e){t.exports=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}},function(t,e,n){"use strict";(function(t,n){ +/*! + * Vue.js v2.6.10 + * (c) 2014-2019 Evan You + * Released under the MIT License. + */ +var r=Object.freeze({});function o(t){return null==t}function i(t){return null!=t}function a(t){return!0===t}function s(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function c(t){return null!==t&&"object"==typeof t}var u=Object.prototype.toString;function l(t){return"[object Object]"===u.call(t)}function f(t){return"[object RegExp]"===u.call(t)}function p(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function h(t){return null==t?"":Array.isArray(t)||l(t)&&t.toString===u?JSON.stringify(t,null,2):String(t)}function m(t){var e=parseFloat(t);return isNaN(e)?t:e}function g(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(n,1)}}var y=Object.prototype.hasOwnProperty;function E(t,e){return y.call(t,e)}function k(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var x=/-(\w)/g,w=k((function(t){return t.replace(x,(function(t,e){return e?e.toUpperCase():""}))})),C=k((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),A=/\B([A-Z])/g,T=k((function(t){return t.replace(A,"-$1").toLowerCase()}));var S=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function R(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function O(t,e){for(var n in e)t[n]=e[n];return t}function N(t){for(var e={},n=0;n0,tt=Z&&Z.indexOf("edge/")>0,et=(Z&&Z.indexOf("android"),Z&&/iphone|ipad|ipod|ios/.test(Z)||"ios"===X),nt=(Z&&/chrome\/\d+/.test(Z),Z&&/phantomjs/.test(Z),Z&&Z.match(/firefox\/(\d+)/)),rt={}.watch,ot=!1;if(Y)try{var it={};Object.defineProperty(it,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var at=function(){return void 0===V&&(V=!Y&&!K&&void 0!==t&&(t.process&&"server"===t.process.env.VUE_ENV)),V},st=Y&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ct(t){return"function"==typeof t&&/native code/.test(t.toString())}var ut,lt="undefined"!=typeof Symbol&&ct(Symbol)&&"undefined"!=typeof Reflect&&ct(Reflect.ownKeys);ut="undefined"!=typeof Set&&ct(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ft=L,pt=0,dt=function(){this.id=pt++,this.subs=[]};dt.prototype.addSub=function(t){this.subs.push(t)},dt.prototype.removeSub=function(t){_(this.subs,t)},dt.prototype.depend=function(){dt.target&&dt.target.addDep(this)},dt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(i&&!E(o,"default"))a=!1;else if(""===a||a===T(t)){var c=qt(String,o.type);(c<0||s0&&(pe((u=t(u,(n||"")+"_"+c))[0])&&pe(f)&&(r[l]=yt(f.text+u[0].text),u.shift()),r.push.apply(r,u)):s(u)?pe(f)?r[l]=yt(f.text+u):""!==u&&r.push(yt(u)):pe(u)&&pe(f)?r[l]=yt(f.text+u.text):(a(e._isVList)&&i(u.tag)&&o(u.key)&&i(n)&&(u.key="__vlist"+n+"_"+c+"__"),r.push(u)));return r}(t):void 0}function pe(t){return i(t)&&i(t.text)&&!1===t.isComment}function de(t,e){if(t){for(var n=Object.create(null),r=lt?Reflect.ownKeys(t):Object.keys(t),o=0;o0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&n&&n!==r&&s===n.$key&&!i&&!n.$hasNormal)return n;for(var c in o={},t)t[c]&&"$"!==c[0]&&(o[c]=ve(e,c,t[c]))}else o={};for(var u in e)u in o||(o[u]=be(e,u));return t&&Object.isExtensible(t)&&(t._normalized=o),H(o,"$stable",a),H(o,"$key",s),H(o,"$hasNormal",i),o}function ve(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({});return(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:fe(t))&&(0===t.length||1===t.length&&t[0].isComment)?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function be(t,e){return function(){return t[e]}}function _e(t,e){var n,r,o,a,s;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;rdocument.createEvent("Event").timeStamp&&(pn=function(){return dn.now()})}function hn(){var t,e;for(fn=pn(),un=!0,on.sort((function(t,e){return t.id-e.id})),ln=0;lnln&&on[n].id>t.id;)n--;on.splice(n+1,0,t)}else on.push(t);cn||(cn=!0,re(hn))}}(this)},gn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||c(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){Ht(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},gn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},gn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},gn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||_(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var vn={enumerable:!0,configurable:!0,get:L,set:L};function bn(t,e,n){vn.get=function(){return this[e][n]},vn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,vn)}function _n(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},o=t.$options._propKeys=[];t.$parent&&At(!1);var i=function(i){o.push(i);var a=$t(i,e,n,t);Rt(r,i,a),i in t||bn(t,"_props",i)};for(var a in e)i(a);At(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?L:S(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;l(e=t._data="function"==typeof e?function(t,e){mt();try{return t.call(e,e)}catch(t){return Ht(t,e,"data()"),{}}finally{gt()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,o=(t.$options.methods,n.length);for(;o--;){var i=n[o];0,r&&E(r,i)||q(i)||bn(t,"_data",i)}St(e,!0)}(t):St(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=at();for(var o in e){var i=e[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new gn(t,a||L,L,yn)),o in t||En(t,o,i)}}(t,e.computed),e.watch&&e.watch!==rt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function Nn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=Rn(a.componentOptions);s&&!e(s)&&Ln(n,i,r,o)}}}function Ln(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,_(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=Cn++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Ut(An(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Je(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=he(e._renderChildren,o),t.$scopedSlots=r,t._c=function(e,n,r,o){return qe(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return qe(t,e,n,r,o,!0)};var i=n&&n.data;Rt(t,"$attrs",i&&i.attrs||r,null,!0),Rt(t,"$listeners",e._parentListeners||r,null,!0)}(e),rn(e,"beforeCreate"),function(t){var e=de(t.$options.inject,t);e&&(At(!1),Object.keys(e).forEach((function(n){Rt(t,n,e[n])})),At(!0))}(e),_n(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),rn(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(Tn),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Ot,t.prototype.$delete=Nt,t.prototype.$watch=function(t,e,n){if(l(e))return wn(this,t,e,n);(n=n||{}).user=!0;var r=new gn(this,t,e,n);if(n.immediate)try{e.call(this,r.value)}catch(t){Ht(t,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(Tn),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var o=0,i=t.length;o1?R(n):n;for(var r=R(arguments,1),o='event handler for "'+t+'"',i=0,a=n.length;iparseInt(this.max)&&Ln(a,s[0],s,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return B}};Object.defineProperty(t,"config",e),t.util={warn:ft,extend:O,mergeOptions:Ut,defineReactive:Rt},t.set=Ot,t.delete=Nt,t.nextTick=re,t.observable=function(t){return St(t),t},t.options=Object.create(null),F.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,O(t.options.components,Dn),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=R(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Ut(this.options,t),this}}(t),Sn(t),function(t){F.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Tn),Object.defineProperty(Tn.prototype,"$isServer",{get:at}),Object.defineProperty(Tn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Tn,"FunctionalRenderContext",{value:De}),Tn.version="2.6.10";var Mn=g("style,class"),Pn=g("input,textarea,option,select,progress"),jn=function(t,e,n){return"value"===n&&Pn(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Un=g("contenteditable,draggable,spellcheck"),Fn=g("events,caret,typing,plaintext-only"),$n=function(t,e){return Gn(e)||"false"===e?"false":"contenteditable"===t&&Fn(e)?e:"true"},Bn=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),zn="http://www.w3.org/1999/xlink",qn=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Hn=function(t){return qn(t)?t.slice(6,t.length):""},Gn=function(t){return null==t||!1===t};function Vn(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Wn(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=Wn(e,n.data));return function(t,e){if(i(t)||i(e))return Yn(t,Kn(e));return""}(e.staticClass,e.class)}function Wn(t,e){return{staticClass:Yn(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Yn(t,e){return t?e?t+" "+e:t:e||""}function Kn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?yr(t,e,n):Bn(e)?Gn(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Un(e)?t.setAttribute(e,$n(e,n)):qn(e)?Gn(n)?t.removeAttributeNS(zn,Hn(e)):t.setAttributeNS(zn,e,n):yr(t,e,n)}function yr(t,e,n){if(Gn(n))t.removeAttribute(e);else{if(J&&!Q&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Er={create:br,update:br};function kr(t,e){var n=e.elm,r=e.data,a=t.data;if(!(o(r.staticClass)&&o(r.class)&&(o(a)||o(a.staticClass)&&o(a.class)))){var s=Vn(e),c=n._transitionClasses;i(c)&&(s=Yn(s,Kn(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var xr,wr,Cr,Ar,Tr,Sr,Rr={create:kr,update:kr},Or=/[\w).+\-_$\]]/;function Nr(t){var e,n,r,o,i,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(m=t.charAt(h));h--);m&&Or.test(m)||(u=!0)}}else void 0===o?(d=r+1,o=t.slice(0,r).trim()):g();function g(){(i||(i=[])).push(t.slice(d,r).trim()),d=r+1}if(void 0===o?o=t.slice(0,r).trim():0!==d&&g(),i)for(r=0;r-1?{exp:t.slice(0,Ar),key:'"'+t.slice(Ar+1)+'"'}:{exp:t,key:null};wr=t,Ar=Tr=Sr=0;for(;!Yr();)Kr(Cr=Wr())?Zr(Cr):91===Cr&&Xr(Cr);return{exp:t.slice(0,Tr),key:t.slice(Tr+1,Sr)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function Wr(){return wr.charCodeAt(++Ar)}function Yr(){return Ar>=xr}function Kr(t){return 34===t||39===t}function Xr(t){var e=1;for(Tr=Ar;!Yr();)if(Kr(t=Wr()))Zr(t);else if(91===t&&e++,93===t&&e--,0===e){Sr=Ar;break}}function Zr(t){for(var e=t;!Yr()&&(t=Wr())!==e;);}var Jr,Qr="__r",to="__c";function eo(t,e,n){var r=Jr;return function o(){var i=e.apply(null,arguments);null!==i&&oo(t,o,n,r)}}var no=Kt&&!(nt&&Number(nt[1])<=53);function ro(t,e,n,r){if(no){var o=fn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Jr.addEventListener(t,e,ot?{capture:n,passive:r}:n)}function oo(t,e,n,r){(r||Jr).removeEventListener(t,e._wrapper||e,n)}function io(t,e){if(!o(t.data.on)||!o(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Jr=e.elm,function(t){if(i(t[Qr])){var e=J?"change":"input";t[e]=[].concat(t[Qr],t[e]||[]),delete t[Qr]}i(t[to])&&(t.change=[].concat(t[to],t.change||[]),delete t[to])}(n),ce(n,r,ro,oo,eo,e.context),Jr=void 0}}var ao,so={create:io,update:io};function co(t,e){if(!o(t.data.domProps)||!o(e.data.domProps)){var n,r,a=e.elm,s=t.data.domProps||{},c=e.data.domProps||{};for(n in i(c.__ob__)&&(c=e.data.domProps=O({},c)),s)n in c||(a[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var u=o(r)?"":String(r);uo(a,u)&&(a.value=u)}else if("innerHTML"===n&&Jn(a.tagName)&&o(a.innerHTML)){(ao=ao||document.createElement("div")).innerHTML=""+r+"";for(var l=ao.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(r!==s[n])try{a[n]=r}catch(t){}}}}function uo(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return m(n)!==m(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var lo={create:co,update:co},fo=k((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function po(t){var e=ho(t.style);return t.staticStyle?O(t.staticStyle,e):e}function ho(t){return Array.isArray(t)?N(t):"string"==typeof t?fo(t):t}var mo,go=/^--/,vo=/\s*!important$/,bo=function(t,e,n){if(go.test(e))t.style.setProperty(e,n);else if(vo.test(n))t.style.setProperty(T(e),n.replace(vo,""),"important");else{var r=yo(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(xo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Co(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(xo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function Ao(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&O(e,To(t.name||"v")),O(e,t),e}return"string"==typeof t?To(t):void 0}}var To=k((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),So=Y&&!Q,Ro="transition",Oo="animation",No="transition",Lo="transitionend",Io="animation",Do="animationend";So&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(No="WebkitTransition",Lo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Io="WebkitAnimation",Do="webkitAnimationEnd"));var Mo=Y?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Po(t){Mo((function(){Mo(t)}))}function jo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),wo(t,e))}function Uo(t,e){t._transitionClasses&&_(t._transitionClasses,e),Co(t,e)}function Fo(t,e,n){var r=Bo(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s=o===Ro?Lo:Do,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n=Ro,l=a,f=i.length):e===Oo?u>0&&(n=Oo,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ro:Oo:null)?n===Ro?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ro&&$o.test(r[No+"Property"])}}function zo(t,e){for(;t.length1}function Yo(t,e){!0!==e.data.show&&Ho(e)}var Ko=function(t){var e,n,r={},c=t.modules,u=t.nodeOps;for(e=0;eh?_(t,o(n[v+1])?null:n[v+1].elm,n,d,v,r):d>v&&E(0,e,p,h)}(p,g,v,n,l):i(v)?(i(t.text)&&u.setTextContent(p,""),_(p,null,v,0,v.length-1,n)):i(g)?E(0,g,0,g.length-1):i(t.text)&&u.setTextContent(p,""):t.text!==e.text&&u.setTextContent(p,e.text),i(h)&&i(d=h.hook)&&i(d=d.postpatch)&&d(t,e)}}}function C(t,e,n){if(a(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(M(ti(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Qo(t,e){return e.every((function(e){return!M(e,t)}))}function ti(t){return"_value"in t?t._value:t.value}function ei(t){t.target.composing=!0}function ni(t){t.target.composing&&(t.target.composing=!1,ri(t.target,"input"))}function ri(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function oi(t){return!t.componentInstance||t.data&&t.data.transition?t:oi(t.componentInstance._vnode)}var ii={model:Xo,show:{bind:function(t,e,n){var r=e.value,o=(n=oi(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,Ho(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=oi(n)).data&&n.data.transition?(n.data.show=!0,r?Ho(n,(function(){t.style.display=t.__vOriginalDisplay})):Go(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},ai={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function si(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?si(Ye(e.children)):t}function ci(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var i in o)e[w(i)]=o[i];return e}function ui(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var li=function(t){return t.tag||We(t)},fi=function(t){return"show"===t.name},pi={name:"transition",props:ai,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(li)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=si(o);if(!i)return o;if(this._leaving)return ui(t,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var c=(i.data||(i.data={})).transition=ci(this),u=this._vnode,l=si(u);if(i.data.directives&&i.data.directives.some(fi)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!We(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=O({},c);if("out-in"===r)return this._leaving=!0,ue(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),ui(t,o);if("in-out"===r){if(We(i))return u;var p,d=function(){p()};ue(c,"afterEnter",d),ue(c,"enterCancelled",d),ue(f,"delayLeave",(function(t){p=t}))}}return o}}},di=O({tag:String,moveClass:String},ai);function hi(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function mi(t){t.data.newPos=t.elm.getBoundingClientRect()}function gi(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete di.mode;var vi={Transition:pi,TransitionGroup:{props:di,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=tn(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ci(this),s=0;s-1?er[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:er[t]=/HTMLUnknownElement/.test(e.toString())},O(Tn.options.directives,ii),O(Tn.options.components,vi),Tn.prototype.__patch__=Y?Ko:L,Tn.prototype.$mount=function(t,e){return function(t,e,n){var r;return t.$el=e,t.$options.render||(t.$options.render=_t),rn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new gn(t,r,L,{before:function(){t._isMounted&&!t._isDestroyed&&rn(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,rn(t,"mounted")),t}(this,t=t&&Y?rr(t):void 0,e)},Y&&setTimeout((function(){B.devtools&&st&&st.emit("init",Tn)}),0);var bi=/\{\{((?:.|\r?\n)+?)\}\}/g,_i=/[-.*+?^${}()|[\]\/\\]/g,yi=k((function(t){var e=t[0].replace(_i,"\\$&"),n=t[1].replace(_i,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+n,"g")}));var Ei={staticKeys:["staticClass"],transformNode:function(t,e){e.warn;var n=zr(t,"class");n&&(t.staticClass=JSON.stringify(n));var r=Br(t,"class",!1);r&&(t.classBinding=r)},genData:function(t){var e="";return t.staticClass&&(e+="staticClass:"+t.staticClass+","),t.classBinding&&(e+="class:"+t.classBinding+","),e}};var ki,xi={staticKeys:["staticStyle"],transformNode:function(t,e){e.warn;var n=zr(t,"style");n&&(t.staticStyle=JSON.stringify(fo(n)));var r=Br(t,"style",!1);r&&(t.styleBinding=r)},genData:function(t){var e="";return t.staticStyle&&(e+="staticStyle:"+t.staticStyle+","),t.styleBinding&&(e+="style:("+t.styleBinding+"),"),e}},wi=function(t){return(ki=ki||document.createElement("div")).innerHTML=t,ki.textContent},Ci=g("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Ai=g("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Ti=g("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Si=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ri=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Oi="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+z.source+"]*",Ni="((?:"+Oi+"\\:)?"+Oi+")",Li=new RegExp("^<"+Ni),Ii=/^\s*(\/?)>/,Di=new RegExp("^<\\/"+Ni+"[^>]*>"),Mi=/^]+>/i,Pi=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Bi=/&(?:lt|gt|quot|amp|#39);/g,zi=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,qi=g("pre,textarea",!0),Hi=function(t,e){return t&&qi(t)&&"\n"===e[0]};function Gi(t,e){var n=e?zi:Bi;return t.replace(n,(function(t){return $i[t]}))}var Vi,Wi,Yi,Ki,Xi,Zi,Ji,Qi,ta=/^@|^v-on:/,ea=/^v-|^@|^:/,na=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,ra=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,oa=/^\(|\)$/g,ia=/^\[.*\]$/,aa=/:(.*)$/,sa=/^:|^\.|^v-bind:/,ca=/\.[^.\]]+(?=[^\]]*$)/g,ua=/^v-slot(:|$)|^#/,la=/[\r\n]/,fa=/\s+/g,pa=k(wi),da="_empty_";function ha(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:Ea(e),rawAttrsMap:{},parent:n,children:[]}}function ma(t,e){Vi=e.warn||Ir,Zi=e.isPreTag||I,Ji=e.mustUseProp||I,Qi=e.getTagNamespace||I;var n=e.isReservedTag||I;(function(t){return!!t.component||!n(t.tag)}),Yi=Dr(e.modules,"transformNode"),Ki=Dr(e.modules,"preTransformNode"),Xi=Dr(e.modules,"postTransformNode"),Wi=e.delimiters;var r,o,i=[],a=!1!==e.preserveWhitespace,s=e.whitespace,c=!1,u=!1;function l(t){if(f(t),c||t.processed||(t=ga(t,e)),i.length||t===r||r.if&&(t.elseif||t.else)&&ba(r,{exp:t.elseif,block:t}),o&&!t.forbidden)if(t.elseif||t.else)a=t,(s=function(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}(o.children))&&s.if&&ba(s,{exp:a.elseif,block:a});else{if(t.slotScope){var n=t.slotTarget||'"default"';(o.scopedSlots||(o.scopedSlots={}))[n]=t}o.children.push(t),t.parent=o}var a,s;t.children=t.children.filter((function(t){return!t.slotScope})),f(t),t.pre&&(c=!1),Zi(t.tag)&&(u=!1);for(var l=0;l]*>)","i")),p=t.replace(f,(function(t,n,r){return u=r.length,Ui(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Hi(l,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""}));c+=t.length-p.length,t=p,A(l,c-u,c)}else{var d=t.indexOf("<");if(0===d){if(Pi.test(t)){var h=t.indexOf("--\x3e");if(h>=0){e.shouldKeepComment&&e.comment(t.substring(4,h),c,c+h+3),x(h+3);continue}}if(ji.test(t)){var m=t.indexOf("]>");if(m>=0){x(m+2);continue}}var g=t.match(Mi);if(g){x(g[0].length);continue}var v=t.match(Di);if(v){var b=c;x(v[0].length),A(v[1],b,c);continue}var _=w();if(_){C(_),Hi(_.tagName,t)&&x(1);continue}}var y=void 0,E=void 0,k=void 0;if(d>=0){for(E=t.slice(d);!(Di.test(E)||Li.test(E)||Pi.test(E)||ji.test(E)||(k=E.indexOf("<",1))<0);)d+=k,E=t.slice(d);y=t.substring(0,d)}d<0&&(y=t),y&&x(y.length),e.chars&&y&&e.chars(y,c-y.length,c)}if(t===n){e.chars&&e.chars(t);break}}function x(e){c+=e,t=t.substring(e)}function w(){var e=t.match(Li);if(e){var n,r,o={tagName:e[1],attrs:[],start:c};for(x(e[0].length);!(n=t.match(Ii))&&(r=t.match(Ri)||t.match(Si));)r.start=c,x(r[0].length),r.end=c,o.attrs.push(r);if(n)return o.unarySlash=n[1],x(n[0].length),o.end=c,o}}function C(t){var n=t.tagName,c=t.unarySlash;i&&("p"===r&&Ti(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=t.attrs.length,f=new Array(l),p=0;p=0&&o[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=o.length-1;u>=a;u--)e.end&&e.end(o[u].tag,n,i);o.length=a,r=a&&o[a-1].tag}else"br"===s?e.start&&e.start(t,[],!0,n,i):"p"===s&&(e.start&&e.start(t,[],!1,n,i),e.end&&e.end(t,n,i))}A()}(t,{warn:Vi,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,outputSourceRange:e.outputSourceRange,start:function(t,n,a,s,f){var p=o&&o.ns||Qi(t);J&&"svg"===p&&(n=function(t){for(var e=[],n=0;nc&&(s.push(i=t.slice(c,o)),a.push(JSON.stringify(i)));var u=Nr(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=o+r[0].length}return c-1"+("true"===i?":("+e+")":":_q("+e+","+i+")")),$r(t,"change","var $$a="+e+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+o+")":o)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Vr(e,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Vr(e,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Vr(e,"$$c")+"}",null,!0)}(t,r,o);else if("input"===i&&"radio"===a)!function(t,e,n){var r=n&&n.number,o=Br(t,"value")||"null";Mr(t,"checked","_q("+e+","+(o=r?"_n("+o+")":o)+")"),$r(t,"change",Vr(e,o),null,!0)}(t,r,o);else if("input"===i||"textarea"===i)!function(t,e,n){var r=t.attrsMap.type;0;var o=n||{},i=o.lazy,a=o.number,s=o.trim,c=!i&&"range"!==r,u=i?"change":"range"===r?Qr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()");a&&(l="_n("+l+")");var f=Vr(e,l);c&&(f="if($event.target.composing)return;"+f);Mr(t,"value","("+e+")"),$r(t,u,f,null,!0),(s||a)&&$r(t,"blur","$forceUpdate()")}(t,r,o);else{if(!B.isReservedTag(i))return Gr(t,r,o),!1}return!0},text:function(t,e){e.value&&Mr(t,"textContent","_s("+e.value+")",e)},html:function(t,e){e.value&&Mr(t,"innerHTML","_s("+e.value+")",e)}},isPreTag:function(t){return"pre"===t},isUnaryTag:Ci,mustUseProp:jn,canBeLeftOpenTag:Ai,isReservedTag:Qn,getTagNamespace:tr,staticKeys:function(t){return t.reduce((function(t,e){return t.concat(e.staticKeys||[])}),[]).join(",")}(Ca)},Ra=k((function(t){return g("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(t?","+t:""))}));function Oa(t,e){t&&(Aa=Ra(e.staticKeys||""),Ta=e.isReservedTag||I,function t(e){e.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||v(t.tag)||!Ta(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(Aa)))}(e);if(1===e.type){if(!Ta(e.tag)&&"slot"!==e.tag&&null==e.attrsMap["inline-template"])return;for(var n=0,r=e.children.length;n|^function\s*(?:[\w$]+)?\s*\(/,La=/\([^)]*?\);*$/,Ia=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Da={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ma={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Pa=function(t){return"if("+t+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Pa("$event.target !== $event.currentTarget"),ctrl:Pa("!$event.ctrlKey"),shift:Pa("!$event.shiftKey"),alt:Pa("!$event.altKey"),meta:Pa("!$event.metaKey"),left:Pa("'button' in $event && $event.button !== 0"),middle:Pa("'button' in $event && $event.button !== 1"),right:Pa("'button' in $event && $event.button !== 2")};function Ua(t,e){var n=e?"nativeOn:":"on:",r="",o="";for(var i in t){var a=Fa(t[i]);t[i]&&t[i].dynamic?o+=i+","+a+",":r+='"'+i+'":'+a+","}return r="{"+r.slice(0,-1)+"}",o?n+"_d("+r+",["+o.slice(0,-1)+"])":n+r}function Fa(t){if(!t)return"function(){}";if(Array.isArray(t))return"["+t.map((function(t){return Fa(t)})).join(",")+"]";var e=Ia.test(t.value),n=Na.test(t.value),r=Ia.test(t.value.replace(La,""));if(t.modifiers){var o="",i="",a=[];for(var s in t.modifiers)if(ja[s])i+=ja[s],Da[s]&&a.push(s);else if("exact"===s){var c=t.modifiers;i+=Pa(["ctrl","shift","alt","meta"].filter((function(t){return!c[t]})).map((function(t){return"$event."+t+"Key"})).join("||"))}else a.push(s);return a.length&&(o+=function(t){return"if(!$event.type.indexOf('key')&&"+t.map($a).join("&&")+")return null;"}(a)),i&&(o+=i),"function($event){"+o+(e?"return "+t.value+"($event)":n?"return ("+t.value+")($event)":r?"return "+t.value:t.value)+"}"}return e||n?t.value:"function($event){"+(r?"return "+t.value:t.value)+"}"}function $a(t){var e=parseInt(t,10);if(e)return"$event.keyCode!=="+e;var n=Da[t],r=Ma[t];return"_k($event.keyCode,"+JSON.stringify(t)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ba={on:function(t,e){t.wrapListeners=function(t){return"_g("+t+","+e.value+")"}},bind:function(t,e){t.wrapData=function(n){return"_b("+n+",'"+t.tag+"',"+e.value+","+(e.modifiers&&e.modifiers.prop?"true":"false")+(e.modifiers&&e.modifiers.sync?",true":"")+")"}},cloak:L},za=function(t){this.options=t,this.warn=t.warn||Ir,this.transforms=Dr(t.modules,"transformCode"),this.dataGenFns=Dr(t.modules,"genData"),this.directives=O(O({},Ba),t.directives);var e=t.isReservedTag||I;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function qa(t,e){var n=new za(e);return{render:"with(this){return "+(t?Ha(t,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ha(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return Ga(t,e);if(t.once&&!t.onceProcessed)return Va(t,e);if(t.for&&!t.forProcessed)return Ya(t,e);if(t.if&&!t.ifProcessed)return Wa(t,e);if("template"!==t.tag||t.slotTarget||e.pre){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',r=Ja(t,e),o="_t("+n+(r?","+r:""),i=t.attrs||t.dynamicAttrs?es((t.attrs||[]).concat(t.dynamicAttrs||[]).map((function(t){return{name:w(t.name),value:t.value,dynamic:t.dynamic}}))):null,a=t.attrsMap["v-bind"];!i&&!a||r||(o+=",null");i&&(o+=","+i);a&&(o+=(i?"":",null")+","+a);return o+")"}(t,e);var n;if(t.component)n=function(t,e,n){var r=e.inlineTemplate?null:Ja(e,n,!0);return"_c("+t+","+Ka(e,n)+(r?","+r:"")+")"}(t.component,t,e);else{var r;(!t.plain||t.pre&&e.maybeComponent(t))&&(r=Ka(t,e));var o=t.inlineTemplate?null:Ja(t,e,!0);n="_c('"+t.tag+"'"+(r?","+r:"")+(o?","+o:"")+")"}for(var i=0;i>>0}(a):"")+")"}(t,t.scopedSlots,e)+","),t.model&&(n+="model:{value:"+t.model.value+",callback:"+t.model.callback+",expression:"+t.model.expression+"},"),t.inlineTemplate){var i=function(t,e){var n=t.children[0];0;if(n&&1===n.type){var r=qa(n,e.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map((function(t){return"function(){"+t+"}"})).join(",")+"]}"}}(t,e);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",t.dynamicAttrs&&(n="_b("+n+',"'+t.tag+'",'+es(t.dynamicAttrs)+")"),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function Xa(t){return 1===t.type&&("slot"===t.tag||t.children.some(Xa))}function Za(t,e){var n=t.attrsMap["slot-scope"];if(t.if&&!t.ifProcessed&&!n)return Wa(t,e,Za,"null");if(t.for&&!t.forProcessed)return Ya(t,e,Za);var r=t.slotScope===da?"":String(t.slotScope),o="function("+r+"){return "+("template"===t.tag?t.if&&n?"("+t.if+")?"+(Ja(t,e)||"undefined")+":undefined":Ja(t,e)||"undefined":Ha(t,e))+"}",i=r?"":",proxy:true";return"{key:"+(t.slotTarget||'"default"')+",fn:"+o+i+"}"}function Ja(t,e,n,r,o){var i=t.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?e.maybeComponent(a)?",1":",0":"";return""+(r||Ha)(a,e)+s}var c=n?function(t,e){for(var n=0,r=0;r':'

',as.innerHTML.indexOf(" ")>0}var ls=!!Y&&us(!1),fs=!!Y&&us(!0),ps=k((function(t){var e=rr(t);return e&&e.innerHTML})),ds=Tn.prototype.$mount;Tn.prototype.$mount=function(t,e){if((t=t&&rr(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ps(r));else{if(!r.nodeType)return this;r=r.innerHTML}else t&&(r=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(r){0;var o=cs(r,{outputSourceRange:!1,shouldDecodeNewlines:ls,shouldDecodeNewlinesForHref:fs,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a}}return ds.call(this,t,e)},Tn.compile=cs,e.a=Tn}).call(this,n(11),n(154).setImmediate)},function(t,e,n){var r=n(71),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){t.exports=n(99)},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){var r=n(199),o=n(202);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e,n){"use strict";var r={props:{lineNumber:{required:!0}}},o=n(0),i=Object(o.a)(r,(function(){var t=this.$createElement,e=this._self._c||t;return e("span",{staticClass:"ui-line-number"},[this._v("\n :"),e("span",{staticClass:"font-mono"},[this._v(this._s(this.lineNumber))])])}),[],!1,null,null,null);e.a=i.exports},function(t,e,n){"use strict";var r={props:{name:{required:!0},method:{default:null}},data:function(){return{segments:[],segmentsClass:""}},watch:{name:{immediate:!0,handler:function(){this.segments=this.name.split("\\"),this.segmentsClass=this.segments.pop()}}}},o=n(0),i=Object(o.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("span",{staticClass:"ui-exception-class"},[t._l(t.segments,(function(e,r){return n("span",{key:r,staticClass:"opacity-75"},[t._v(t._s(e)+"\\"),n("wbr")])})),n("span",[t._v(t._s(t.segmentsClass)),n("wbr")]),t.method?n("span",{staticClass:"opacity-75"},[t._v("::"+t._s(t.method))]):t._e()],2)}),[],!1,null,null,null);e.a=i.exports},function(t,e,n){var r=n(215);t.exports=function(t){return t&&t.length?r(t):[]}},function(t,e,n){var r=n(70);t.exports=function(t){return null==t?"":r(t)}},function(t,e,n){var r=n(22),o=n(176),i=n(177),a="[object Null]",s="[object Undefined]",c=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?s:a:c&&c in Object(t)?o(t):i(t)}},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e){function n(t,e,n,r,o,i,a){try{var s=t[i](a),c=s.value}catch(t){return void n(t)}s.done?e(c):Promise.resolve(c).then(r,o)}t.exports=function(t){return function(){var e=this,r=arguments;return new Promise((function(o,i){var a=t.apply(e,r);function s(t){n(a,o,i,s,c,"next",t)}function c(t){n(a,o,i,s,c,"throw",t)}s(void 0)}))}}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){var r=n(8).Symbol;t.exports=r},function(t,e,n){var r=n(17),o=n(18),i="[object Symbol]";t.exports=function(t){return"symbol"==typeof t||o(t)&&r(t)==i}},function(t,e,n){"use strict";e.__esModule=!0;var r=c(n(180)),o=c(n(39)),i=c(n(185)),a=c(n(193)),s=c(n(194));function c(t){return t&&t.__esModule?t:{default:t}}var u=function(){function t(e,n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e||{},this.indentation=new i.default(this.cfg.indent),this.inlineBlock=new a.default,this.params=new s.default(this.cfg.params),this.tokenizer=n,this.previousReservedWord={},this.tokens=[],this.index=0}return t.prototype.format=function(t){return this.tokens=this.tokenizer.tokenize(t),this.getFormattedQueryFromTokens().trim()},t.prototype.getFormattedQueryFromTokens=function(){var t=this,e="";return this.tokens.forEach((function(n,r){t.index=r,n.type===o.default.WHITESPACE||(n.type===o.default.LINE_COMMENT?e=t.formatLineComment(n,e):n.type===o.default.BLOCK_COMMENT?e=t.formatBlockComment(n,e):n.type===o.default.RESERVED_TOPLEVEL?(e=t.formatToplevelReservedWord(n,e),t.previousReservedWord=n):n.type===o.default.RESERVED_NEWLINE?(e=t.formatNewlineReservedWord(n,e),t.previousReservedWord=n):n.type===o.default.RESERVED?(e=t.formatWithSpaces(n,e),t.previousReservedWord=n):e=n.type===o.default.OPEN_PAREN?t.formatOpeningParentheses(n,e):n.type===o.default.CLOSE_PAREN?t.formatClosingParentheses(n,e):n.type===o.default.PLACEHOLDER?t.formatPlaceholder(n,e):","===n.value?t.formatComma(n,e):":"===n.value?t.formatWithSpaceAfter(n,e):"."===n.value?t.formatWithoutSpaces(n,e):";"===n.value?t.formatQuerySeparator(n,e):t.formatWithSpaces(n,e))})),e},t.prototype.formatLineComment=function(t,e){return this.addNewline(e+t.value)},t.prototype.formatBlockComment=function(t,e){return this.addNewline(this.addNewline(e)+this.indentComment(t.value))},t.prototype.indentComment=function(t){return t.replace(/\n/g,"\n"+this.indentation.getIndent())},t.prototype.formatToplevelReservedWord=function(t,e){return this.indentation.decreaseTopLevel(),e=this.addNewline(e),this.indentation.increaseToplevel(),e+=this.equalizeWhitespace(t.value),this.addNewline(e)},t.prototype.formatNewlineReservedWord=function(t,e){return this.addNewline(e)+this.equalizeWhitespace(t.value)+" "},t.prototype.equalizeWhitespace=function(t){return t.replace(/\s+/g," ")},t.prototype.formatOpeningParentheses=function(t,e){return[o.default.WHITESPACE,o.default.OPEN_PAREN,o.default.LINE_COMMENT].includes(this.previousToken().type)||(e=(0,r.default)(e)),e+=t.value,this.inlineBlock.beginIfPossible(this.tokens,this.index),this.inlineBlock.isActive()||(this.indentation.increaseBlockLevel(),e=this.addNewline(e)),e},t.prototype.formatClosingParentheses=function(t,e){return this.inlineBlock.isActive()?(this.inlineBlock.end(),this.formatWithSpaceAfter(t,e)):(this.indentation.decreaseBlockLevel(),this.formatWithSpaces(t,this.addNewline(e)))},t.prototype.formatPlaceholder=function(t,e){return e+this.params.get(t)+" "},t.prototype.formatComma=function(t,e){return e=this.trimTrailingWhitespace(e)+t.value+" ",this.inlineBlock.isActive()?e:/^LIMIT$/i.test(this.previousReservedWord.value)?e:this.addNewline(e)},t.prototype.formatWithSpaceAfter=function(t,e){return this.trimTrailingWhitespace(e)+t.value+" "},t.prototype.formatWithoutSpaces=function(t,e){return this.trimTrailingWhitespace(e)+t.value},t.prototype.formatWithSpaces=function(t,e){return e+t.value+" "},t.prototype.formatQuerySeparator=function(t,e){return this.trimTrailingWhitespace(e)+t.value+"\n"},t.prototype.addNewline=function(t){return(0,r.default)(t)+"\n"+this.indentation.getIndent()},t.prototype.trimTrailingWhitespace=function(t){return this.previousNonWhitespaceToken().type===o.default.LINE_COMMENT?(0,r.default)(t)+"\n":(0,r.default)(t)},t.prototype.previousNonWhitespaceToken=function(){for(var t=1;this.previousToken(t).type===o.default.WHITESPACE;)t++;return this.previousToken(t)},t.prototype.previousToken=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return this.tokens[this.index-t]||{}},t}();e.default=u,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=a(n(195)),o=a(n(210)),i=a(n(39));function a(t){return t&&t.__esModule?t:{default:t}}var s=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.WHITESPACE_REGEX=/^(\s+)/,this.NUMBER_REGEX=/^((-\s*)?[0-9]+(\.[0-9]+)?|0x[0-9a-fA-F]+|0b[01]+)\b/,this.OPERATOR_REGEX=/^(!=|<>|==|<=|>=|!<|!>|\|\||::|->>|->|~~\*|~~|!~~\*|!~~|~\*|!~\*|!~|.)/,this.BLOCK_COMMENT_REGEX=/^(\/\*[^]*?(?:\*\/|$))/,this.LINE_COMMENT_REGEX=this.createLineCommentRegex(e.lineCommentTypes),this.RESERVED_TOPLEVEL_REGEX=this.createReservedWordRegex(e.reservedToplevelWords),this.RESERVED_NEWLINE_REGEX=this.createReservedWordRegex(e.reservedNewlineWords),this.RESERVED_PLAIN_REGEX=this.createReservedWordRegex(e.reservedWords),this.WORD_REGEX=this.createWordRegex(e.specialWordChars),this.STRING_REGEX=this.createStringRegex(e.stringTypes),this.OPEN_PAREN_REGEX=this.createParenRegex(e.openParens),this.CLOSE_PAREN_REGEX=this.createParenRegex(e.closeParens),this.INDEXED_PLACEHOLDER_REGEX=this.createPlaceholderRegex(e.indexedPlaceholderTypes,"[0-9]*"),this.IDENT_NAMED_PLACEHOLDER_REGEX=this.createPlaceholderRegex(e.namedPlaceholderTypes,"[a-zA-Z0-9._$]+"),this.STRING_NAMED_PLACEHOLDER_REGEX=this.createPlaceholderRegex(e.namedPlaceholderTypes,this.createStringPattern(e.stringTypes))}return t.prototype.createLineCommentRegex=function(t){return new RegExp("^((?:"+t.map((function(t){return(0,o.default)(t)})).join("|")+").*?(?:\n|$))")},t.prototype.createReservedWordRegex=function(t){var e=t.join("|").replace(/ /g,"\\s+");return new RegExp("^("+e+")\\b","i")},t.prototype.createWordRegex=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return new RegExp("^([\\w"+t.join("")+"]+)")},t.prototype.createStringRegex=function(t){return new RegExp("^("+this.createStringPattern(t)+")")},t.prototype.createStringPattern=function(t){var e={"``":"((`[^`]*($|`))+)","[]":"((\\[[^\\]]*($|\\]))(\\][^\\]]*($|\\]))*)",'""':'(("[^"\\\\]*(?:\\\\.[^"\\\\]*)*("|$))+)',"''":"(('[^'\\\\]*(?:\\\\.[^'\\\\]*)*('|$))+)","N''":"((N'[^N'\\\\]*(?:\\\\.[^N'\\\\]*)*('|$))+)"};return t.map((function(t){return e[t]})).join("|")},t.prototype.createParenRegex=function(t){var e=this;return new RegExp("^("+t.map((function(t){return e.escapeParen(t)})).join("|")+")","i")},t.prototype.escapeParen=function(t){return 1===t.length?(0,o.default)(t):"\\b"+t+"\\b"},t.prototype.createPlaceholderRegex=function(t,e){if((0,r.default)(t))return!1;var n=t.map(o.default).join("|");return new RegExp("^((?:"+n+")(?:"+e+"))")},t.prototype.tokenize=function(t){for(var e=[],n=void 0;t.length;)n=this.getNextToken(t,n),t=t.substring(n.value.length),e.push(n);return e},t.prototype.getNextToken=function(t,e){return this.getWhitespaceToken(t)||this.getCommentToken(t)||this.getStringToken(t)||this.getOpenParenToken(t)||this.getCloseParenToken(t)||this.getPlaceholderToken(t)||this.getNumberToken(t)||this.getReservedWordToken(t,e)||this.getWordToken(t)||this.getOperatorToken(t)},t.prototype.getWhitespaceToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.WHITESPACE,regex:this.WHITESPACE_REGEX})},t.prototype.getCommentToken=function(t){return this.getLineCommentToken(t)||this.getBlockCommentToken(t)},t.prototype.getLineCommentToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.LINE_COMMENT,regex:this.LINE_COMMENT_REGEX})},t.prototype.getBlockCommentToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.BLOCK_COMMENT,regex:this.BLOCK_COMMENT_REGEX})},t.prototype.getStringToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.STRING,regex:this.STRING_REGEX})},t.prototype.getOpenParenToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.OPEN_PAREN,regex:this.OPEN_PAREN_REGEX})},t.prototype.getCloseParenToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.CLOSE_PAREN,regex:this.CLOSE_PAREN_REGEX})},t.prototype.getPlaceholderToken=function(t){return this.getIdentNamedPlaceholderToken(t)||this.getStringNamedPlaceholderToken(t)||this.getIndexedPlaceholderToken(t)},t.prototype.getIdentNamedPlaceholderToken=function(t){return this.getPlaceholderTokenWithKey({input:t,regex:this.IDENT_NAMED_PLACEHOLDER_REGEX,parseKey:function(t){return t.slice(1)}})},t.prototype.getStringNamedPlaceholderToken=function(t){var e=this;return this.getPlaceholderTokenWithKey({input:t,regex:this.STRING_NAMED_PLACEHOLDER_REGEX,parseKey:function(t){return e.getEscapedPlaceholderKey({key:t.slice(2,-1),quoteChar:t.slice(-1)})}})},t.prototype.getIndexedPlaceholderToken=function(t){return this.getPlaceholderTokenWithKey({input:t,regex:this.INDEXED_PLACEHOLDER_REGEX,parseKey:function(t){return t.slice(1)}})},t.prototype.getPlaceholderTokenWithKey=function(t){var e=t.input,n=t.regex,r=t.parseKey,o=this.getTokenOnFirstMatch({input:e,regex:n,type:i.default.PLACEHOLDER});return o&&(o.key=r(o.value)),o},t.prototype.getEscapedPlaceholderKey=function(t){var e=t.key,n=t.quoteChar;return e.replace(new RegExp((0,o.default)("\\")+n,"g"),n)},t.prototype.getNumberToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.NUMBER,regex:this.NUMBER_REGEX})},t.prototype.getOperatorToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.OPERATOR,regex:this.OPERATOR_REGEX})},t.prototype.getReservedWordToken=function(t,e){if(!e||!e.value||"."!==e.value)return this.getToplevelReservedToken(t)||this.getNewlineReservedToken(t)||this.getPlainReservedToken(t)},t.prototype.getToplevelReservedToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.RESERVED_TOPLEVEL,regex:this.RESERVED_TOPLEVEL_REGEX})},t.prototype.getNewlineReservedToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.RESERVED_NEWLINE,regex:this.RESERVED_NEWLINE_REGEX})},t.prototype.getPlainReservedToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.RESERVED,regex:this.RESERVED_PLAIN_REGEX})},t.prototype.getWordToken=function(t){return this.getTokenOnFirstMatch({input:t,type:i.default.WORD,regex:this.WORD_REGEX})},t.prototype.getTokenOnFirstMatch=function(t){var e=t.input,n=t.type,r=t.regex,o=e.match(r);if(o)return{type:n,value:o[1]}},t}();e.default=s,t.exports=e.default},function(t,e,n){var r=n(12)(Object,"create");t.exports=r},function(t,e,n){var r=n(223),o=n(224),i=n(225),a=n(226),s=n(227);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0&&(t.localSitesPath||!1).length>0?e.replace(t.remoteSitesPath,t.localSitesPath):e,Object.keys(o).includes(r)?o[r].replace("%path",encodeURIComponent(e)).replace("%line",encodeURIComponent(n)):(console.error("'".concat(r,"' is not supported. Support editors are: ").concat(Object.keys(o).join(", "))),null)}n.d(e,"a",(function(){return r}))},function(t,e,n){var r=n(171)("toUpperCase");t.exports=r},function(t,e,n){"use strict";var r={props:{label:{required:!0},name:{required:!0},disabled:{required:!1},value:{required:!1,default:!1}},methods:{checkboxChanged:function(t){this.$emit("input",t.target.checked)}}},o=n(0),i=Object(o.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("label",{staticClass:"checkbox-label",class:t.disabled?"text-gray-400 pointer-events-none":"",attrs:{for:t.name}},[n("input",{staticClass:"checkbox",attrs:{id:t.name,type:"checkbox",disabled:t.disabled},domProps:{checked:t.value},on:{change:t.checkboxChanged}}),t._v("\n "+t._s(t.label)+"\n")])}),[],!1,null,null,null);e.a=i.exports},function(t,e){t.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(t,e,n){"use strict";function r(){this.__rules__=[],this.__cache__=null}r.prototype.__find__=function(t){for(var e=0;e=0&&(n=this.attrs[e][1]),n},r.prototype.attrJoin=function(t,e){var n=this.attrIndex(t);n<0?this.attrPush([t,e]):this.attrs[n][1]=this.attrs[n][1]+" "+e},t.exports=r},function(t,e,n){"use strict";e.__esModule=!0,e.default={WHITESPACE:"whitespace",WORD:"word",STRING:"string",RESERVED:"reserved",RESERVED_TOPLEVEL:"reserved-toplevel",RESERVED_NEWLINE:"reserved-newline",OPERATOR:"operator",OPEN_PAREN:"open-paren",CLOSE_PAREN:"close-paren",LINE_COMMENT:"line-comment",BLOCK_COMMENT:"block-comment",NUMBER:"number",PLACEHOLDER:"placeholder"},t.exports=e.default},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(73),o=n(42);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},function(t,e){var n=9007199254740991;t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=n}},function(t,e){var n=9007199254740991,r=/^(?:0|[1-9]\d*)$/;t.exports=function(t,e){var o=typeof t;return!!(e=null==e?n:e)&&("number"==o||"symbol"!=o&&r.test(t))&&t>-1&&t%1==0&&t2?n.slice(1-n.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=n[0],e.source="cloudforge.com";break;case"visualstudio.com":if("vs-ssh.visualstudio.com"===e.resource){4===(i=e.name.split("/")).length&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}2===(i=e.name.split("/")).length?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):3===i.length?(e.name=i[2],"DefaultCollection"===i[0]?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):4===i.length&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break;case"dev.azure.com":case"azure.com":if("ssh.dev.azure.com"===e.resource){4===(i=e.name.split("/")).length&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}5===(i=e.name.split("/")).length?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):3===i.length?(e.name=i[2],"DefaultCollection"===i[0]?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):4===i.length&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break;default:var a=(i=e.name.split("/")).length-1;if(i.length>=2){var s=i.indexOf("blob",2),c=i.indexOf("tree",2),u=i.indexOf("commit",2);a=s>0?s-1:c>0?c-1:u>0?u-1:a,e.owner=i.slice(0,a).join("/"),e.name=i[a],u&&(e.commit=i[a+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>a+2&&["blob","tree"].indexOf(i[a+1])>=0&&(e.filepathtype=i[a+1],e.ref=i[a+2],i.length>a+3&&(e.filepath=i.slice(a+3).join("/"))),e.organization=e.owner}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}o.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var n=t.port?":"+t.port:"",r=t.user||"git",o=t.git_suffix?".git":"";switch(e){case"ssh":return n?"ssh://"+r+"@"+t.resource+n+"/"+t.full_name+o:r+"@"+t.resource+":"+t.full_name+o;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+r+"@"+t.resource+n+"/"+t.full_name+o;case"http":case"https":return e+"://"+(t.token? +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +function(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"")+t.resource+n+"/"+t.full_name+o;default:return t.href}},t.exports=o},function(t,e,n){(function(t,r){var o; +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */(function(){var i,a=200,s="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",c="Expected a function",u="__lodash_hash_undefined__",l=500,f="__lodash_placeholder__",p=1,d=2,h=4,m=1,g=2,v=1,b=2,_=4,y=8,E=16,k=32,x=64,w=128,C=256,A=512,T=30,S="...",R=800,O=16,N=1,L=2,I=1/0,D=9007199254740991,M=17976931348623157e292,P=NaN,j=4294967295,U=j-1,F=j>>>1,$=[["ary",w],["bind",v],["bindKey",b],["curry",y],["curryRight",E],["flip",A],["partial",k],["partialRight",x],["rearg",C]],B="[object Arguments]",z="[object Array]",q="[object AsyncFunction]",H="[object Boolean]",G="[object Date]",V="[object DOMException]",W="[object Error]",Y="[object Function]",K="[object GeneratorFunction]",X="[object Map]",Z="[object Number]",J="[object Null]",Q="[object Object]",tt="[object Proxy]",et="[object RegExp]",nt="[object Set]",rt="[object String]",ot="[object Symbol]",it="[object Undefined]",at="[object WeakMap]",st="[object WeakSet]",ct="[object ArrayBuffer]",ut="[object DataView]",lt="[object Float32Array]",ft="[object Float64Array]",pt="[object Int8Array]",dt="[object Int16Array]",ht="[object Int32Array]",mt="[object Uint8Array]",gt="[object Uint8ClampedArray]",vt="[object Uint16Array]",bt="[object Uint32Array]",_t=/\b__p \+= '';/g,yt=/\b(__p \+=) '' \+/g,Et=/(__e\(.*?\)|\b__t\)) \+\n'';/g,kt=/&(?:amp|lt|gt|quot|#39);/g,xt=/[&<>"']/g,wt=RegExp(kt.source),Ct=RegExp(xt.source),At=/<%-([\s\S]+?)%>/g,Tt=/<%([\s\S]+?)%>/g,St=/<%=([\s\S]+?)%>/g,Rt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ot=/^\w*$/,Nt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Lt=/[\\^$.*+?()[\]{}|]/g,It=RegExp(Lt.source),Dt=/^\s+|\s+$/g,Mt=/^\s+/,Pt=/\s+$/,jt=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Ut=/\{\n\/\* \[wrapped with (.+)\] \*/,Ft=/,? & /,$t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Bt=/\\(\\)?/g,zt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,qt=/\w*$/,Ht=/^[-+]0x[0-9a-f]+$/i,Gt=/^0b[01]+$/i,Vt=/^\[object .+?Constructor\]$/,Wt=/^0o[0-7]+$/i,Yt=/^(?:0|[1-9]\d*)$/,Kt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Xt=/($^)/,Zt=/['\n\r\u2028\u2029\\]/g,Jt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Qt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",te="[\\ud800-\\udfff]",ee="["+Qt+"]",ne="["+Jt+"]",re="\\d+",oe="[\\u2700-\\u27bf]",ie="[a-z\\xdf-\\xf6\\xf8-\\xff]",ae="[^\\ud800-\\udfff"+Qt+re+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",se="\\ud83c[\\udffb-\\udfff]",ce="[^\\ud800-\\udfff]",ue="(?:\\ud83c[\\udde6-\\uddff]){2}",le="[\\ud800-\\udbff][\\udc00-\\udfff]",fe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",pe="(?:"+ie+"|"+ae+")",de="(?:"+fe+"|"+ae+")",he="(?:"+ne+"|"+se+")"+"?",me="[\\ufe0e\\ufe0f]?"+he+("(?:\\u200d(?:"+[ce,ue,le].join("|")+")[\\ufe0e\\ufe0f]?"+he+")*"),ge="(?:"+[oe,ue,le].join("|")+")"+me,ve="(?:"+[ce+ne+"?",ne,ue,le,te].join("|")+")",be=RegExp("['’]","g"),_e=RegExp(ne,"g"),ye=RegExp(se+"(?="+se+")|"+ve+me,"g"),Ee=RegExp([fe+"?"+ie+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[ee,fe,"$"].join("|")+")",de+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[ee,fe+pe,"$"].join("|")+")",fe+"?"+pe+"+(?:['’](?:d|ll|m|re|s|t|ve))?",fe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",re,ge].join("|"),"g"),ke=RegExp("[\\u200d\\ud800-\\udfff"+Jt+"\\ufe0e\\ufe0f]"),xe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,we=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Ce=-1,Ae={};Ae[lt]=Ae[ft]=Ae[pt]=Ae[dt]=Ae[ht]=Ae[mt]=Ae[gt]=Ae[vt]=Ae[bt]=!0,Ae[B]=Ae[z]=Ae[ct]=Ae[H]=Ae[ut]=Ae[G]=Ae[W]=Ae[Y]=Ae[X]=Ae[Z]=Ae[Q]=Ae[et]=Ae[nt]=Ae[rt]=Ae[at]=!1;var Te={};Te[B]=Te[z]=Te[ct]=Te[ut]=Te[H]=Te[G]=Te[lt]=Te[ft]=Te[pt]=Te[dt]=Te[ht]=Te[X]=Te[Z]=Te[Q]=Te[et]=Te[nt]=Te[rt]=Te[ot]=Te[mt]=Te[gt]=Te[vt]=Te[bt]=!0,Te[W]=Te[Y]=Te[at]=!1;var Se={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Re=parseFloat,Oe=parseInt,Ne="object"==typeof t&&t&&t.Object===Object&&t,Le="object"==typeof self&&self&&self.Object===Object&&self,Ie=Ne||Le||Function("return this")(),De=e&&!e.nodeType&&e,Me=De&&"object"==typeof r&&r&&!r.nodeType&&r,Pe=Me&&Me.exports===De,je=Pe&&Ne.process,Ue=function(){try{var t=Me&&Me.require&&Me.require("util").types;return t||je&&je.binding&&je.binding("util")}catch(t){}}(),Fe=Ue&&Ue.isArrayBuffer,$e=Ue&&Ue.isDate,Be=Ue&&Ue.isMap,ze=Ue&&Ue.isRegExp,qe=Ue&&Ue.isSet,He=Ue&&Ue.isTypedArray;function Ge(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function Ve(t,e,n,r){for(var o=-1,i=null==t?0:t.length;++o-1}function Je(t,e,n){for(var r=-1,o=null==t?0:t.length;++r-1;);return n}function En(t,e){for(var n=t.length;n--&&cn(e,t[n],0)>-1;);return n}var kn=dn({"À":"A","Ã":"A","Â":"A","Ã":"A","Ä":"A","Ã…":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","Ã¥":"a","Ç":"C","ç":"c","Ã":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","ÃŒ":"I","Ã":"I","ÃŽ":"I","Ã":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ã’":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ã":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ä€":"A","Ä‚":"A","Ä„":"A","Ä":"a","ă":"a","Ä…":"a","Ć":"C","Ĉ":"C","ÄŠ":"C","ÄŒ":"C","ć":"c","ĉ":"c","Ä‹":"c","Ä":"c","ÄŽ":"D","Ä":"D","Ä":"d","Ä‘":"d","Ä’":"E","Ä”":"E","Ä–":"E","Ę":"E","Äš":"E","Ä“":"e","Ä•":"e","Ä—":"e","Ä™":"e","Ä›":"e","Äœ":"G","Äž":"G","Ä ":"G","Ä¢":"G","Ä":"g","ÄŸ":"g","Ä¡":"g","Ä£":"g","Ĥ":"H","Ħ":"H","Ä¥":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Ä®":"I","İ":"I","Ä©":"i","Ä«":"i","Ä­":"i","į":"i","ı":"i","Ä´":"J","ĵ":"j","Ķ":"K","Ä·":"k","ĸ":"k","Ĺ":"L","Ä»":"L","Ľ":"L","Ä¿":"L","Å":"L","ĺ":"l","ļ":"l","ľ":"l","Å€":"l","Å‚":"l","Ń":"N","Å…":"N","Ň":"N","ÅŠ":"N","Å„":"n","ņ":"n","ň":"n","Å‹":"n","ÅŒ":"O","ÅŽ":"O","Å":"O","Å":"o","Å":"o","Å‘":"o","Å”":"R","Å–":"R","Ř":"R","Å•":"r","Å—":"r","Å™":"r","Åš":"S","Åœ":"S","Åž":"S","Å ":"S","Å›":"s","Å":"s","ÅŸ":"s","Å¡":"s","Å¢":"T","Ť":"T","Ŧ":"T","Å£":"t","Å¥":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Å®":"U","Ű":"U","Ų":"U","Å©":"u","Å«":"u","Å­":"u","ů":"u","ű":"u","ų":"u","Å´":"W","ŵ":"w","Ŷ":"Y","Å·":"y","Ÿ":"Y","Ź":"Z","Å»":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Å’":"Oe","Å“":"oe","ʼn":"'n","Å¿":"s"}),xn=dn({"&":"&","<":"<",">":">",'"':""","'":"'"});function wn(t){return"\\"+Se[t]}function Cn(t){return ke.test(t)}function An(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}function Tn(t,e){return function(n){return t(e(n))}}function Sn(t,e){for(var n=-1,r=t.length,o=0,i=[];++n",""":'"',"'":"'"});var Dn=function t(e){var n,r=(e=null==e?Ie:Dn.defaults(Ie.Object(),e,Dn.pick(Ie,we))).Array,o=e.Date,Jt=e.Error,Qt=e.Function,te=e.Math,ee=e.Object,ne=e.RegExp,re=e.String,oe=e.TypeError,ie=r.prototype,ae=Qt.prototype,se=ee.prototype,ce=e["__core-js_shared__"],ue=ae.toString,le=se.hasOwnProperty,fe=0,pe=(n=/[^.]+$/.exec(ce&&ce.keys&&ce.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",de=se.toString,he=ue.call(ee),me=Ie._,ge=ne("^"+ue.call(le).replace(Lt,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ve=Pe?e.Buffer:i,ye=e.Symbol,ke=e.Uint8Array,Se=ve?ve.allocUnsafe:i,Ne=Tn(ee.getPrototypeOf,ee),Le=ee.create,De=se.propertyIsEnumerable,Me=ie.splice,je=ye?ye.isConcatSpreadable:i,Ue=ye?ye.iterator:i,on=ye?ye.toStringTag:i,dn=function(){try{var t=Fi(ee,"defineProperty");return t({},"",{}),t}catch(t){}}(),Mn=e.clearTimeout!==Ie.clearTimeout&&e.clearTimeout,Pn=o&&o.now!==Ie.Date.now&&o.now,jn=e.setTimeout!==Ie.setTimeout&&e.setTimeout,Un=te.ceil,Fn=te.floor,$n=ee.getOwnPropertySymbols,Bn=ve?ve.isBuffer:i,zn=e.isFinite,qn=ie.join,Hn=Tn(ee.keys,ee),Gn=te.max,Vn=te.min,Wn=o.now,Yn=e.parseInt,Kn=te.random,Xn=ie.reverse,Zn=Fi(e,"DataView"),Jn=Fi(e,"Map"),Qn=Fi(e,"Promise"),tr=Fi(e,"Set"),er=Fi(e,"WeakMap"),nr=Fi(ee,"create"),rr=er&&new er,or={},ir=fa(Zn),ar=fa(Jn),sr=fa(Qn),cr=fa(tr),ur=fa(er),lr=ye?ye.prototype:i,fr=lr?lr.valueOf:i,pr=lr?lr.toString:i;function dr(t){if(Ss(t)&&!vs(t)&&!(t instanceof vr)){if(t instanceof gr)return t;if(le.call(t,"__wrapped__"))return pa(t)}return new gr(t)}var hr=function(){function t(){}return function(e){if(!Ts(e))return{};if(Le)return Le(e);t.prototype=e;var n=new t;return t.prototype=i,n}}();function mr(){}function gr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=i}function vr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=j,this.__views__=[]}function br(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Mr(t,e,n,r,o,a){var s,c=e&p,u=e&d,l=e&h;if(n&&(s=o?n(t,r,o,a):n(t)),s!==i)return s;if(!Ts(t))return t;var f=vs(t);if(f){if(s=function(t){var e=t.length,n=new t.constructor(e);e&&"string"==typeof t[0]&&le.call(t,"index")&&(n.index=t.index,n.input=t.input);return n}(t),!c)return ri(t,s)}else{var m=zi(t),g=m==Y||m==K;if(Es(t))return Zo(t,c);if(m==Q||m==B||g&&!o){if(s=u||g?{}:Hi(t),!c)return u?function(t,e){return oi(t,Bi(t),e)}(t,function(t,e){return t&&oi(e,ic(e),t)}(s,t)):function(t,e){return oi(t,$i(t),e)}(t,Nr(s,t))}else{if(!Te[m])return o?t:{};s=function(t,e,n){var r=t.constructor;switch(e){case ct:return Jo(t);case H:case G:return new r(+t);case ut:return function(t,e){var n=e?Jo(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case lt:case ft:case pt:case dt:case ht:case mt:case gt:case vt:case bt:return Qo(t,n);case X:return new r;case Z:case rt:return new r(t);case et:return function(t){var e=new t.constructor(t.source,qt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case nt:return new r;case ot:return o=t,fr?ee(fr.call(o)):{}}var o}(t,m,c)}}a||(a=new kr);var v=a.get(t);if(v)return v;a.set(t,s),Is(t)?t.forEach((function(r){s.add(Mr(r,e,n,r,t,a))})):Rs(t)&&t.forEach((function(r,o){s.set(o,Mr(r,e,n,o,t,a))}));var b=f?i:(l?u?Li:Ni:u?ic:oc)(t);return We(b||t,(function(r,o){b&&(r=t[o=r]),Sr(s,o,Mr(r,e,n,o,t,a))})),s}function Pr(t,e,n){var r=n.length;if(null==t)return!r;for(t=ee(t);r--;){var o=n[r],a=e[o],s=t[o];if(s===i&&!(o in t)||!a(s))return!1}return!0}function jr(t,e,n){if("function"!=typeof t)throw new oe(c);return oa((function(){t.apply(i,n)}),e)}function Ur(t,e,n,r){var o=-1,i=Ze,s=!0,c=t.length,u=[],l=e.length;if(!c)return u;n&&(e=Qe(e,vn(n))),r?(i=Je,s=!1):e.length>=a&&(i=_n,s=!1,e=new Er(e));t:for(;++o-1},_r.prototype.set=function(t,e){var n=this.__data__,r=Rr(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},yr.prototype.clear=function(){this.size=0,this.__data__={hash:new br,map:new(Jn||_r),string:new br}},yr.prototype.delete=function(t){var e=ji(this,t).delete(t);return this.size-=e?1:0,e},yr.prototype.get=function(t){return ji(this,t).get(t)},yr.prototype.has=function(t){return ji(this,t).has(t)},yr.prototype.set=function(t,e){var n=ji(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Er.prototype.add=Er.prototype.push=function(t){return this.__data__.set(t,u),this},Er.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.clear=function(){this.__data__=new _r,this.size=0},kr.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},kr.prototype.get=function(t){return this.__data__.get(t)},kr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.set=function(t,e){var n=this.__data__;if(n instanceof _r){var r=n.__data__;if(!Jn||r.length0&&n(s)?e>1?Hr(s,e-1,n,r,o):tn(o,s):r||(o[o.length]=s)}return o}var Gr=ci(),Vr=ci(!0);function Wr(t,e){return t&&Gr(t,e,oc)}function Yr(t,e){return t&&Vr(t,e,oc)}function Kr(t,e){return Xe(e,(function(e){return ws(t[e])}))}function Xr(t,e){for(var n=0,r=(e=Wo(e,t)).length;null!=t&&ne}function to(t,e){return null!=t&&le.call(t,e)}function eo(t,e){return null!=t&&e in ee(t)}function no(t,e,n){for(var o=n?Je:Ze,a=t[0].length,s=t.length,c=s,u=r(s),l=1/0,f=[];c--;){var p=t[c];c&&e&&(p=Qe(p,vn(e))),l=Vn(p.length,l),u[c]=!n&&(e||a>=120&&p.length>=120)?new Er(c&&p):i}p=t[0];var d=-1,h=u[0];t:for(;++d=s)return c;var u=n[r];return c*("desc"==u?-1:1)}}return t.index-e.index}(t,e,n)}))}function _o(t,e,n){for(var r=-1,o=e.length,i={};++r-1;)s!==t&&Me.call(s,c,1),Me.call(t,c,1);return t}function Eo(t,e){for(var n=t?e.length:0,r=n-1;n--;){var o=e[n];if(n==r||o!==i){var i=o;Vi(o)?Me.call(t,o,1):Fo(t,o)}}return t}function ko(t,e){return t+Fn(Kn()*(e-t+1))}function xo(t,e){var n="";if(!t||e<1||e>D)return n;do{e%2&&(n+=t),(e=Fn(e/2))&&(t+=t)}while(e);return n}function wo(t,e){return ia(ta(t,e,Oc),t+"")}function Co(t){return wr(dc(t))}function Ao(t,e){var n=dc(t);return ca(n,Dr(e,0,n.length))}function To(t,e,n,r){if(!Ts(t))return t;for(var o=-1,a=(e=Wo(e,t)).length,s=a-1,c=t;null!=c&&++oi?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=r(i);++o>>1,a=t[i];null!==a&&!Ms(a)&&(n?a<=e:a=a){var l=e?null:xi(t);if(l)return Rn(l);s=!1,o=_n,u=new Er}else u=e?[]:c;t:for(;++r=r?t:No(t,e,n)}var Xo=Mn||function(t){return Ie.clearTimeout(t)};function Zo(t,e){if(e)return t.slice();var n=t.length,r=Se?Se(n):new t.constructor(n);return t.copy(r),r}function Jo(t){var e=new t.constructor(t.byteLength);return new ke(e).set(new ke(t)),e}function Qo(t,e){var n=e?Jo(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function ti(t,e){if(t!==e){var n=t!==i,r=null===t,o=t==t,a=Ms(t),s=e!==i,c=null===e,u=e==e,l=Ms(e);if(!c&&!l&&!a&&t>e||a&&s&&u&&!c&&!l||r&&s&&u||!n&&u||!o)return 1;if(!r&&!a&&!l&&t1?n[o-1]:i,s=o>2?n[2]:i;for(a=t.length>3&&"function"==typeof a?(o--,a):i,s&&Wi(n[0],n[1],s)&&(a=o<3?i:a,o=1),e=ee(e);++r-1?o[a?e[s]:s]:i}}function di(t){return Oi((function(e){var n=e.length,r=n,o=gr.prototype.thru;for(t&&e.reverse();r--;){var a=e[r];if("function"!=typeof a)throw new oe(c);if(o&&!s&&"wrapper"==Di(a))var s=new gr([],!0)}for(r=s?r:n;++r1&&y.reverse(),p&&lc))return!1;var l=a.get(t);if(l&&a.get(e))return l==e;var f=-1,p=!0,d=n&g?new Er:i;for(a.set(t,e),a.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(jt,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return We($,(function(n){var r="_."+n[0];e&n[1]&&!Ze(t,r)&&t.push(r)})),t.sort()}(function(t){var e=t.match(Ut);return e?e[1].split(Ft):[]}(r),n)))}function sa(t){var e=0,n=0;return function(){var r=Wn(),o=O-(r-n);if(n=r,o>0){if(++e>=R)return arguments[0]}else e=0;return t.apply(i,arguments)}}function ca(t,e){var n=-1,r=t.length,o=r-1;for(e=e===i?r:e;++n1?t[e-1]:i;return n="function"==typeof n?(t.pop(),n):i,La(t,n)}));function Fa(t){var e=dr(t);return e.__chain__=!0,e}function $a(t,e){return e(t)}var Ba=Oi((function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return Ir(e,t)};return!(e>1||this.__actions__.length)&&r instanceof vr&&Vi(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:$a,args:[o],thisArg:i}),new gr(r,this.__chain__).thru((function(t){return e&&!t.length&&t.push(i),t}))):this.thru(o)}));var za=ii((function(t,e,n){le.call(t,n)?++t[n]:Lr(t,n,1)}));var qa=pi(ga),Ha=pi(va);function Ga(t,e){return(vs(t)?We:Fr)(t,Pi(e,3))}function Va(t,e){return(vs(t)?Ye:$r)(t,Pi(e,3))}var Wa=ii((function(t,e,n){le.call(t,n)?t[n].push(e):Lr(t,n,[e])}));var Ya=wo((function(t,e,n){var o=-1,i="function"==typeof e,a=_s(t)?r(t.length):[];return Fr(t,(function(t){a[++o]=i?Ge(e,t,n):ro(t,e,n)})),a})),Ka=ii((function(t,e,n){Lr(t,n,e)}));function Xa(t,e){return(vs(t)?Qe:po)(t,Pi(e,3))}var Za=ii((function(t,e,n){t[n?0:1].push(e)}),(function(){return[[],[]]}));var Ja=wo((function(t,e){if(null==t)return[];var n=e.length;return n>1&&Wi(t,e[0],e[1])?e=[]:n>2&&Wi(e[0],e[1],e[2])&&(e=[e[0]]),bo(t,Hr(e,1),[])})),Qa=Pn||function(){return Ie.Date.now()};function ts(t,e,n){return e=n?i:e,e=t&&null==e?t.length:e,Ci(t,w,i,i,i,i,e)}function es(t,e){var n;if("function"!=typeof e)throw new oe(c);return t=Bs(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=i),n}}var ns=wo((function(t,e,n){var r=v;if(n.length){var o=Sn(n,Mi(ns));r|=k}return Ci(t,r,e,n,o)})),rs=wo((function(t,e,n){var r=v|b;if(n.length){var o=Sn(n,Mi(rs));r|=k}return Ci(e,r,t,n,o)}));function os(t,e,n){var r,o,a,s,u,l,f=0,p=!1,d=!1,h=!0;if("function"!=typeof t)throw new oe(c);function m(e){var n=r,a=o;return r=o=i,f=e,s=t.apply(a,n)}function g(t){var n=t-l;return l===i||n>=e||n<0||d&&t-f>=a}function v(){var t=Qa();if(g(t))return b(t);u=oa(v,function(t){var n=e-(t-l);return d?Vn(n,a-(t-f)):n}(t))}function b(t){return u=i,h&&r?m(t):(r=o=i,s)}function _(){var t=Qa(),n=g(t);if(r=arguments,o=this,l=t,n){if(u===i)return function(t){return f=t,u=oa(v,e),p?m(t):s}(l);if(d)return Xo(u),u=oa(v,e),m(l)}return u===i&&(u=oa(v,e)),s}return e=qs(e)||0,Ts(n)&&(p=!!n.leading,a=(d="maxWait"in n)?Gn(qs(n.maxWait)||0,e):a,h="trailing"in n?!!n.trailing:h),_.cancel=function(){u!==i&&Xo(u),f=0,r=l=o=u=i},_.flush=function(){return u===i?s:b(Qa())},_}var is=wo((function(t,e){return jr(t,1,e)})),as=wo((function(t,e,n){return jr(t,qs(e)||0,n)}));function ss(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new oe(c);var n=function(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=t.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(ss.Cache||yr),n}function cs(t){if("function"!=typeof t)throw new oe(c);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}ss.Cache=yr;var us=Yo((function(t,e){var n=(e=1==e.length&&vs(e[0])?Qe(e[0],vn(Pi())):Qe(Hr(e,1),vn(Pi()))).length;return wo((function(r){for(var o=-1,i=Vn(r.length,n);++o=e})),gs=oo(function(){return arguments}())?oo:function(t){return Ss(t)&&le.call(t,"callee")&&!De.call(t,"callee")},vs=r.isArray,bs=Fe?vn(Fe):function(t){return Ss(t)&&Jr(t)==ct};function _s(t){return null!=t&&As(t.length)&&!ws(t)}function ys(t){return Ss(t)&&_s(t)}var Es=Bn||qc,ks=$e?vn($e):function(t){return Ss(t)&&Jr(t)==G};function xs(t){if(!Ss(t))return!1;var e=Jr(t);return e==W||e==V||"string"==typeof t.message&&"string"==typeof t.name&&!Ns(t)}function ws(t){if(!Ts(t))return!1;var e=Jr(t);return e==Y||e==K||e==q||e==tt}function Cs(t){return"number"==typeof t&&t==Bs(t)}function As(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=D}function Ts(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Ss(t){return null!=t&&"object"==typeof t}var Rs=Be?vn(Be):function(t){return Ss(t)&&zi(t)==X};function Os(t){return"number"==typeof t||Ss(t)&&Jr(t)==Z}function Ns(t){if(!Ss(t)||Jr(t)!=Q)return!1;var e=Ne(t);if(null===e)return!0;var n=le.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ue.call(n)==he}var Ls=ze?vn(ze):function(t){return Ss(t)&&Jr(t)==et};var Is=qe?vn(qe):function(t){return Ss(t)&&zi(t)==nt};function Ds(t){return"string"==typeof t||!vs(t)&&Ss(t)&&Jr(t)==rt}function Ms(t){return"symbol"==typeof t||Ss(t)&&Jr(t)==ot}var Ps=He?vn(He):function(t){return Ss(t)&&As(t.length)&&!!Ae[Jr(t)]};var js=yi(fo),Us=yi((function(t,e){return t<=e}));function Fs(t){if(!t)return[];if(_s(t))return Ds(t)?Ln(t):ri(t);if(Ue&&t[Ue])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Ue]());var e=zi(t);return(e==X?An:e==nt?Rn:dc)(t)}function $s(t){return t?(t=qs(t))===I||t===-I?(t<0?-1:1)*M:t==t?t:0:0===t?t:0}function Bs(t){var e=$s(t),n=e%1;return e==e?n?e-n:e:0}function zs(t){return t?Dr(Bs(t),0,j):0}function qs(t){if("number"==typeof t)return t;if(Ms(t))return P;if(Ts(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Ts(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Dt,"");var n=Gt.test(t);return n||Wt.test(t)?Oe(t.slice(2),n?2:8):Ht.test(t)?P:+t}function Hs(t){return oi(t,ic(t))}function Gs(t){return null==t?"":jo(t)}var Vs=ai((function(t,e){if(Zi(e)||_s(e))oi(e,oc(e),t);else for(var n in e)le.call(e,n)&&Sr(t,n,e[n])})),Ws=ai((function(t,e){oi(e,ic(e),t)})),Ys=ai((function(t,e,n,r){oi(e,ic(e),t,r)})),Ks=ai((function(t,e,n,r){oi(e,oc(e),t,r)})),Xs=Oi(Ir);var Zs=wo((function(t,e){t=ee(t);var n=-1,r=e.length,o=r>2?e[2]:i;for(o&&Wi(e[0],e[1],o)&&(r=1);++n1),e})),oi(t,Li(t),n),r&&(n=Mr(n,p|d|h,Si));for(var o=e.length;o--;)Fo(n,e[o]);return n}));var uc=Oi((function(t,e){return null==t?{}:function(t,e){return _o(t,e,(function(e,n){return tc(t,n)}))}(t,e)}));function lc(t,e){if(null==t)return{};var n=Qe(Li(t),(function(t){return[t]}));return e=Pi(e),_o(t,n,(function(t,n){return e(t,n[0])}))}var fc=wi(oc),pc=wi(ic);function dc(t){return null==t?[]:bn(t,oc(t))}var hc=li((function(t,e,n){return e=e.toLowerCase(),t+(n?mc(e):e)}));function mc(t){return xc(Gs(t).toLowerCase())}function gc(t){return(t=Gs(t))&&t.replace(Kt,kn).replace(_e,"")}var vc=li((function(t,e,n){return t+(n?"-":"")+e.toLowerCase()})),bc=li((function(t,e,n){return t+(n?" ":"")+e.toLowerCase()})),_c=ui("toLowerCase");var yc=li((function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}));var Ec=li((function(t,e,n){return t+(n?" ":"")+xc(e)}));var kc=li((function(t,e,n){return t+(n?" ":"")+e.toUpperCase()})),xc=ui("toUpperCase");function wc(t,e,n){return t=Gs(t),(e=n?i:e)===i?function(t){return xe.test(t)}(t)?function(t){return t.match(Ee)||[]}(t):function(t){return t.match($t)||[]}(t):t.match(e)||[]}var Cc=wo((function(t,e){try{return Ge(t,i,e)}catch(t){return xs(t)?t:new Jt(t)}})),Ac=Oi((function(t,e){return We(e,(function(e){e=la(e),Lr(t,e,ns(t[e],t))})),t}));function Tc(t){return function(){return t}}var Sc=di(),Rc=di(!0);function Oc(t){return t}function Nc(t){return co("function"==typeof t?t:Mr(t,p))}var Lc=wo((function(t,e){return function(n){return ro(n,t,e)}})),Ic=wo((function(t,e){return function(n){return ro(t,n,e)}}));function Dc(t,e,n){var r=oc(e),o=Kr(e,r);null!=n||Ts(e)&&(o.length||!r.length)||(n=e,e=t,t=this,o=Kr(e,oc(e)));var i=!(Ts(n)&&"chain"in n&&!n.chain),a=ws(t);return We(o,(function(n){var r=e[n];t[n]=r,a&&(t.prototype[n]=function(){var e=this.__chain__;if(i||e){var n=t(this.__wrapped__),o=n.__actions__=ri(this.__actions__);return o.push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,tn([this.value()],arguments))})})),t}function Mc(){}var Pc=vi(Qe),jc=vi(Ke),Uc=vi(rn);function Fc(t){return Yi(t)?pn(la(t)):function(t){return function(e){return Xr(e,t)}}(t)}var $c=_i(),Bc=_i(!0);function zc(){return[]}function qc(){return!1}var Hc=gi((function(t,e){return t+e}),0),Gc=ki("ceil"),Vc=gi((function(t,e){return t/e}),1),Wc=ki("floor");var Yc,Kc=gi((function(t,e){return t*e}),1),Xc=ki("round"),Zc=gi((function(t,e){return t-e}),0);return dr.after=function(t,e){if("function"!=typeof e)throw new oe(c);return t=Bs(t),function(){if(--t<1)return e.apply(this,arguments)}},dr.ary=ts,dr.assign=Vs,dr.assignIn=Ws,dr.assignInWith=Ys,dr.assignWith=Ks,dr.at=Xs,dr.before=es,dr.bind=ns,dr.bindAll=Ac,dr.bindKey=rs,dr.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return vs(t)?t:[t]},dr.chain=Fa,dr.chunk=function(t,e,n){e=(n?Wi(t,e,n):e===i)?1:Gn(Bs(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var a=0,s=0,c=r(Un(o/e));ao?0:o+n),(r=r===i||r>o?o:Bs(r))<0&&(r+=o),r=n>r?0:zs(r);n>>0)?(t=Gs(t))&&("string"==typeof e||null!=e&&!Ls(e))&&!(e=jo(e))&&Cn(t)?Ko(Ln(t),0,n):t.split(e,n):[]},dr.spread=function(t,e){if("function"!=typeof t)throw new oe(c);return e=null==e?0:Gn(Bs(e),0),wo((function(n){var r=n[e],o=Ko(n,0,e);return r&&tn(o,r),Ge(t,this,o)}))},dr.tail=function(t){var e=null==t?0:t.length;return e?No(t,1,e):[]},dr.take=function(t,e,n){return t&&t.length?No(t,0,(e=n||e===i?1:Bs(e))<0?0:e):[]},dr.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?No(t,(e=r-(e=n||e===i?1:Bs(e)))<0?0:e,r):[]},dr.takeRightWhile=function(t,e){return t&&t.length?Bo(t,Pi(e,3),!1,!0):[]},dr.takeWhile=function(t,e){return t&&t.length?Bo(t,Pi(e,3)):[]},dr.tap=function(t,e){return e(t),t},dr.throttle=function(t,e,n){var r=!0,o=!0;if("function"!=typeof t)throw new oe(c);return Ts(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),os(t,e,{leading:r,maxWait:e,trailing:o})},dr.thru=$a,dr.toArray=Fs,dr.toPairs=fc,dr.toPairsIn=pc,dr.toPath=function(t){return vs(t)?Qe(t,la):Ms(t)?[t]:ri(ua(Gs(t)))},dr.toPlainObject=Hs,dr.transform=function(t,e,n){var r=vs(t),o=r||Es(t)||Ps(t);if(e=Pi(e,4),null==n){var i=t&&t.constructor;n=o?r?new i:[]:Ts(t)&&ws(i)?hr(Ne(t)):{}}return(o?We:Wr)(t,(function(t,r,o){return e(n,t,r,o)})),n},dr.unary=function(t){return ts(t,1)},dr.union=Sa,dr.unionBy=Ra,dr.unionWith=Oa,dr.uniq=function(t){return t&&t.length?Uo(t):[]},dr.uniqBy=function(t,e){return t&&t.length?Uo(t,Pi(e,2)):[]},dr.uniqWith=function(t,e){return e="function"==typeof e?e:i,t&&t.length?Uo(t,i,e):[]},dr.unset=function(t,e){return null==t||Fo(t,e)},dr.unzip=Na,dr.unzipWith=La,dr.update=function(t,e,n){return null==t?t:$o(t,e,Vo(n))},dr.updateWith=function(t,e,n,r){return r="function"==typeof r?r:i,null==t?t:$o(t,e,Vo(n),r)},dr.values=dc,dr.valuesIn=function(t){return null==t?[]:bn(t,ic(t))},dr.without=Ia,dr.words=wc,dr.wrap=function(t,e){return ls(Vo(e),t)},dr.xor=Da,dr.xorBy=Ma,dr.xorWith=Pa,dr.zip=ja,dr.zipObject=function(t,e){return Ho(t||[],e||[],Sr)},dr.zipObjectDeep=function(t,e){return Ho(t||[],e||[],To)},dr.zipWith=Ua,dr.entries=fc,dr.entriesIn=pc,dr.extend=Ws,dr.extendWith=Ys,Dc(dr,dr),dr.add=Hc,dr.attempt=Cc,dr.camelCase=hc,dr.capitalize=mc,dr.ceil=Gc,dr.clamp=function(t,e,n){return n===i&&(n=e,e=i),n!==i&&(n=(n=qs(n))==n?n:0),e!==i&&(e=(e=qs(e))==e?e:0),Dr(qs(t),e,n)},dr.clone=function(t){return Mr(t,h)},dr.cloneDeep=function(t){return Mr(t,p|h)},dr.cloneDeepWith=function(t,e){return Mr(t,p|h,e="function"==typeof e?e:i)},dr.cloneWith=function(t,e){return Mr(t,h,e="function"==typeof e?e:i)},dr.conformsTo=function(t,e){return null==e||Pr(t,e,oc(e))},dr.deburr=gc,dr.defaultTo=function(t,e){return null==t||t!=t?e:t},dr.divide=Vc,dr.endsWith=function(t,e,n){t=Gs(t),e=jo(e);var r=t.length,o=n=n===i?r:Dr(Bs(n),0,r);return(n-=e.length)>=0&&t.slice(n,o)==e},dr.eq=ds,dr.escape=function(t){return(t=Gs(t))&&Ct.test(t)?t.replace(xt,xn):t},dr.escapeRegExp=function(t){return(t=Gs(t))&&It.test(t)?t.replace(Lt,"\\$&"):t},dr.every=function(t,e,n){var r=vs(t)?Ke:Br;return n&&Wi(t,e,n)&&(e=i),r(t,Pi(e,3))},dr.find=qa,dr.findIndex=ga,dr.findKey=function(t,e){return an(t,Pi(e,3),Wr)},dr.findLast=Ha,dr.findLastIndex=va,dr.findLastKey=function(t,e){return an(t,Pi(e,3),Yr)},dr.floor=Wc,dr.forEach=Ga,dr.forEachRight=Va,dr.forIn=function(t,e){return null==t?t:Gr(t,Pi(e,3),ic)},dr.forInRight=function(t,e){return null==t?t:Vr(t,Pi(e,3),ic)},dr.forOwn=function(t,e){return t&&Wr(t,Pi(e,3))},dr.forOwnRight=function(t,e){return t&&Yr(t,Pi(e,3))},dr.get=Qs,dr.gt=hs,dr.gte=ms,dr.has=function(t,e){return null!=t&&qi(t,e,to)},dr.hasIn=tc,dr.head=_a,dr.identity=Oc,dr.includes=function(t,e,n,r){t=_s(t)?t:dc(t),n=n&&!r?Bs(n):0;var o=t.length;return n<0&&(n=Gn(o+n,0)),Ds(t)?n<=o&&t.indexOf(e,n)>-1:!!o&&cn(t,e,n)>-1},dr.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=null==n?0:Bs(n);return o<0&&(o=Gn(r+o,0)),cn(t,e,o)},dr.inRange=function(t,e,n){return e=$s(e),n===i?(n=e,e=0):n=$s(n),function(t,e,n){return t>=Vn(e,n)&&t=-D&&t<=D},dr.isSet=Is,dr.isString=Ds,dr.isSymbol=Ms,dr.isTypedArray=Ps,dr.isUndefined=function(t){return t===i},dr.isWeakMap=function(t){return Ss(t)&&zi(t)==at},dr.isWeakSet=function(t){return Ss(t)&&Jr(t)==st},dr.join=function(t,e){return null==t?"":qn.call(t,e)},dr.kebabCase=vc,dr.last=xa,dr.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r;return n!==i&&(o=(o=Bs(n))<0?Gn(r+o,0):Vn(o,r-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,o):sn(t,ln,o,!0)},dr.lowerCase=bc,dr.lowerFirst=_c,dr.lt=js,dr.lte=Us,dr.max=function(t){return t&&t.length?zr(t,Oc,Qr):i},dr.maxBy=function(t,e){return t&&t.length?zr(t,Pi(e,2),Qr):i},dr.mean=function(t){return fn(t,Oc)},dr.meanBy=function(t,e){return fn(t,Pi(e,2))},dr.min=function(t){return t&&t.length?zr(t,Oc,fo):i},dr.minBy=function(t,e){return t&&t.length?zr(t,Pi(e,2),fo):i},dr.stubArray=zc,dr.stubFalse=qc,dr.stubObject=function(){return{}},dr.stubString=function(){return""},dr.stubTrue=function(){return!0},dr.multiply=Kc,dr.nth=function(t,e){return t&&t.length?vo(t,Bs(e)):i},dr.noConflict=function(){return Ie._===this&&(Ie._=me),this},dr.noop=Mc,dr.now=Qa,dr.pad=function(t,e,n){t=Gs(t);var r=(e=Bs(e))?Nn(t):0;if(!e||r>=e)return t;var o=(e-r)/2;return bi(Fn(o),n)+t+bi(Un(o),n)},dr.padEnd=function(t,e,n){t=Gs(t);var r=(e=Bs(e))?Nn(t):0;return e&&re){var r=t;t=e,e=r}if(n||t%1||e%1){var o=Kn();return Vn(t+o*(e-t+Re("1e-"+((o+"").length-1))),e)}return ko(t,e)},dr.reduce=function(t,e,n){var r=vs(t)?en:hn,o=arguments.length<3;return r(t,Pi(e,4),n,o,Fr)},dr.reduceRight=function(t,e,n){var r=vs(t)?nn:hn,o=arguments.length<3;return r(t,Pi(e,4),n,o,$r)},dr.repeat=function(t,e,n){return e=(n?Wi(t,e,n):e===i)?1:Bs(e),xo(Gs(t),e)},dr.replace=function(){var t=arguments,e=Gs(t[0]);return t.length<3?e:e.replace(t[1],t[2])},dr.result=function(t,e,n){var r=-1,o=(e=Wo(e,t)).length;for(o||(o=1,t=i);++rD)return[];var n=j,r=Vn(t,j);e=Pi(e),t-=j;for(var o=gn(r,e);++n=a)return t;var c=n-Nn(r);if(c<1)return r;var u=s?Ko(s,0,c).join(""):t.slice(0,c);if(o===i)return u+r;if(s&&(c+=u.length-c),Ls(o)){if(t.slice(c).search(o)){var l,f=u;for(o.global||(o=ne(o.source,Gs(qt.exec(o))+"g")),o.lastIndex=0;l=o.exec(f);)var p=l.index;u=u.slice(0,p===i?c:p)}}else if(t.indexOf(jo(o),c)!=c){var d=u.lastIndexOf(o);d>-1&&(u=u.slice(0,d))}return u+r},dr.unescape=function(t){return(t=Gs(t))&&wt.test(t)?t.replace(kt,In):t},dr.uniqueId=function(t){var e=++fe;return Gs(t)+e},dr.upperCase=kc,dr.upperFirst=xc,dr.each=Ga,dr.eachRight=Va,dr.first=_a,Dc(dr,(Yc={},Wr(dr,(function(t,e){le.call(dr.prototype,e)||(Yc[e]=t)})),Yc),{chain:!1}),dr.VERSION="4.17.15",We(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){dr[t].placeholder=dr})),We(["drop","take"],(function(t,e){vr.prototype[t]=function(n){n=n===i?1:Gn(Bs(n),0);var r=this.__filtered__&&!e?new vr(this):this.clone();return r.__filtered__?r.__takeCount__=Vn(n,r.__takeCount__):r.__views__.push({size:Vn(n,j),type:t+(r.__dir__<0?"Right":"")}),r},vr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),We(["filter","map","takeWhile"],(function(t,e){var n=e+1,r=n==N||3==n;vr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Pi(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}})),We(["head","last"],(function(t,e){var n="take"+(e?"Right":"");vr.prototype[t]=function(){return this[n](1).value()[0]}})),We(["initial","tail"],(function(t,e){var n="drop"+(e?"":"Right");vr.prototype[t]=function(){return this.__filtered__?new vr(this):this[n](1)}})),vr.prototype.compact=function(){return this.filter(Oc)},vr.prototype.find=function(t){return this.filter(t).head()},vr.prototype.findLast=function(t){return this.reverse().find(t)},vr.prototype.invokeMap=wo((function(t,e){return"function"==typeof t?new vr(this):this.map((function(n){return ro(n,t,e)}))})),vr.prototype.reject=function(t){return this.filter(cs(Pi(t)))},vr.prototype.slice=function(t,e){t=Bs(t);var n=this;return n.__filtered__&&(t>0||e<0)?new vr(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==i&&(n=(e=Bs(e))<0?n.dropRight(-e):n.take(e-t)),n)},vr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},vr.prototype.toArray=function(){return this.take(j)},Wr(vr.prototype,(function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=dr[r?"take"+("last"==e?"Right":""):e],a=r||/^find/.test(e);o&&(dr.prototype[e]=function(){var e=this.__wrapped__,s=r?[1]:arguments,c=e instanceof vr,u=s[0],l=c||vs(e),f=function(t){var e=o.apply(dr,tn([t],s));return r&&p?e[0]:e};l&&n&&"function"==typeof u&&1!=u.length&&(c=l=!1);var p=this.__chain__,d=!!this.__actions__.length,h=a&&!p,m=c&&!d;if(!a&&l){e=m?e:new vr(this);var g=t.apply(e,s);return g.__actions__.push({func:$a,args:[f],thisArg:i}),new gr(g,p)}return h&&m?t.apply(this,s):(g=this.thru(f),h?r?g.value()[0]:g.value():g)})})),We(["pop","push","shift","sort","splice","unshift"],(function(t){var e=ie[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);dr.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var o=this.value();return e.apply(vs(o)?o:[],t)}return this[n]((function(n){return e.apply(vs(n)?n:[],t)}))}})),Wr(vr.prototype,(function(t,e){var n=dr[e];if(n){var r=n.name+"";le.call(or,r)||(or[r]=[]),or[r].push({name:e,func:n})}})),or[hi(i,b).name]=[{name:"wrapper",func:i}],vr.prototype.clone=function(){var t=new vr(this.__wrapped__);return t.__actions__=ri(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=ri(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=ri(this.__views__),t},vr.prototype.reverse=function(){if(this.__filtered__){var t=new vr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},vr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=vs(t),r=e<0,o=n?t.length:0,i=function(t,e,n){var r=-1,o=n.length;for(;++r=this.__values__.length;return{done:t,value:t?i:this.__values__[this.__index__++]}},dr.prototype.plant=function(t){for(var e,n=this;n instanceof mr;){var r=pa(n);r.__index__=0,r.__values__=i,e?o.__wrapped__=r:e=r;var o=r;n=n.__wrapped__}return o.__wrapped__=t,e},dr.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof vr){var e=t;return this.__actions__.length&&(e=new vr(this)),(e=e.reverse()).__actions__.push({func:$a,args:[Ta],thisArg:i}),new gr(e,this.__chain__)}return this.thru(Ta)},dr.prototype.toJSON=dr.prototype.valueOf=dr.prototype.value=function(){return zo(this.__wrapped__,this.__actions__)},dr.prototype.first=dr.prototype.head,Ue&&(dr.prototype[Ue]=function(){return this}),dr}();Ie._=Dn,(o=function(){return Dn}.call(e,n,e,r))===i||(r.exports=o)}).call(this)}).call(this,n(11),n(21)(t))},function(t,e,n){var r,o,i;o=function(t){var e,n=[],r=Object.keys,o={},i={},a=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,c=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,u="",l={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function f(t){return t.replace(/&/g,"&").replace(//g,">")}function p(t){return t.nodeName.toLowerCase()}function d(t,e){var n=t&&t.exec(e);return n&&0===n.index}function h(t){return a.test(t)}function m(t){var e,n={},r=Array.prototype.slice.call(arguments,1);for(e in t)n[e]=t[e];return r.forEach((function(t){for(e in t)n[e]=t[e]})),n}function g(t){var e=[];return function t(n,r){for(var o=n.firstChild;o;o=o.nextSibling)3===o.nodeType?r+=o.nodeValue.length:1===o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),p(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function v(t){if(e&&!t.langApiRestored){for(var n in t.langApiRestored=!0,e)t[n]&&(t[e[n]]=t[n]);(t.contains||[]).concat(t.variants||[]).forEach(v)}}function b(t){function e(t){return t&&t.source||t}function n(n,r){return new RegExp(e(n),"m"+(t.case_insensitive?"i":"")+(r?"g":""))}!function o(i,a){if(!i.compiled){if(i.compiled=!0,i.keywords=i.keywords||i.beginKeywords,i.keywords){var s={},c=function(e,n){t.case_insensitive&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");s[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof i.keywords?c("keyword",i.keywords):r(i.keywords).forEach((function(t){c(t,i.keywords[t])})),i.keywords=s}i.lexemesRe=n(i.lexemes||/\w+/,!0),a&&(i.beginKeywords&&(i.begin="\\b("+i.beginKeywords.split(" ").join("|")+")\\b"),i.begin||(i.begin=/\B|\b/),i.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),i.end&&(i.endRe=n(i.end)),i.terminator_end=e(i.end)||"",i.endsWithParent&&a.terminator_end&&(i.terminator_end+=(i.end?"|":"")+a.terminator_end)),i.illegal&&(i.illegalRe=n(i.illegal)),null==i.relevance&&(i.relevance=1),i.contains||(i.contains=[]),i.contains=Array.prototype.concat.apply([],i.contains.map((function(t){return function(t){return t.variants&&!t.cached_variants&&(t.cached_variants=t.variants.map((function(e){return m(t,{variants:null},e)}))),t.cached_variants||t.endsWithParent&&[m(t)]||[t]}("self"===t?i:t)}))),i.contains.forEach((function(t){o(t,i)})),i.starts&&o(i.starts,a);var u=i.contains.map((function(t){return t.beginKeywords?"\\.?(?:"+t.begin+")\\.?":t.begin})).concat([i.terminator_end,i.illegal]).map(e).filter(Boolean);i.terminators=u.length?n(function(t,n){for(var r=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,o=0,i="",a=0;a0&&(i+=n);c.length>0;){var u=r.exec(c);if(null==u){i+=c;break}i+=c.substring(0,u.index),c=c.substring(u.index+u[0].length),"\\"==u[0][0]&&u[1]?i+="\\"+String(Number(u[1])+s):(i+=u[0],"("==u[0]&&o++)}}return i}(u,"|"),!0):{exec:function(){return null}}}}(t)}function _(t,e,n,r){function i(t){return new RegExp(t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function a(t,e){var n=m.case_insensitive?e[0].toLowerCase():e[0];return t.keywords.hasOwnProperty(n)&&t.keywords[n]}function s(t,e,n,r){var o='')+e+(n?"":u):e}function c(){k+=null!=v.subLanguage?function(){var t="string"==typeof v.subLanguage;if(t&&!o[v.subLanguage])return f(x);var e=t?_(v.subLanguage,x,!0,E[v.subLanguage]):y(x,v.subLanguage.length?v.subLanguage:void 0);return v.relevance>0&&(C+=e.relevance),t&&(E[v.subLanguage]=e.top),s(e.language,e.value,!1,!0)}():function(){var t,e,n,r;if(!v.keywords)return f(x);for(r="",e=0,v.lexemesRe.lastIndex=0,n=v.lexemesRe.exec(x);n;)r+=f(x.substring(e,n.index)),(t=a(v,n))?(C+=t[1],r+=s(t[0],f(n[0]))):r+=f(n[0]),e=v.lexemesRe.lastIndex,n=v.lexemesRe.exec(x);return r+f(x.substr(e))}(),x=""}function p(t){k+=t.className?s(t.className,"",!0):"",v=Object.create(t,{parent:{value:v}})}function h(t,e){if(x+=t,null==e)return c(),0;var r=function(t,e){var n,r;for(n=0,r=e.contains.length;n")+'"');return x+=e,e.length||1}var m=w(t);if(!m)throw new Error('Unknown language: "'+t+'"');b(m);var g,v=r||m,E={},k="";for(g=v;g!==m;g=g.parent)g.className&&(k=s(g.className,"",!0)+k);var x="",C=0;try{for(var A,T,S=0;v.terminators.lastIndex=S,A=v.terminators.exec(e);)T=h(e.substring(S,A.index),A[0]),S=A.index+T;for(h(e.substr(S)),g=v;g.parent;g=g.parent)g.className&&(k+=u);return{relevance:C,value:k,language:t,top:v}}catch(t){if(t.message&&-1!==t.message.indexOf("Illegal"))return{relevance:0,value:f(e)};throw t}}function y(t,e){e=e||l.languages||r(o);var n={relevance:0,value:f(t)},i=n;return e.filter(w).filter(C).forEach((function(e){var r=_(e,t,!1);r.language=e,r.relevance>i.relevance&&(i=r),r.relevance>n.relevance&&(i=n,n=r)})),i.language&&(n.second_best=i),n}function E(t){return l.tabReplace||l.useBR?t.replace(c,(function(t,e){return l.useBR&&"\n"===t?"
":l.tabReplace?e.replace(/\t/g,l.tabReplace):""})):t}function k(t){var e,r,o,a,c,u=function(t){var e,n,r,o,i=t.className+" ";if(i+=t.parentNode?t.parentNode.className:"",n=s.exec(i))return w(n[1])?n[1]:"no-highlight";for(e=0,r=(i=i.split(/\s+/)).length;e/g,"\n"):e=t,c=e.textContent,o=u?_(u,c,!0):y(c),(r=g(e)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=o.value,o.value=function(t,e,r){var o=0,i="",a=[];function s(){return t.length&&e.length?t[0].offset!==e[0].offset?t[0].offset"}function u(t){i+=""}function l(t){("start"===t.event?c:u)(t.node)}for(;t.length||e.length;){var d=s();if(i+=f(r.substring(o,d[0].offset)),o=d[0].offset,d===t){a.reverse().forEach(u);do{l(d.splice(0,1)[0]),d=s()}while(d===t&&d.length&&d[0].offset===o);a.reverse().forEach(c)}else"start"===d[0].event?a.push(d[0].node):a.pop(),l(d.splice(0,1)[0])}return i+f(r.substr(o))}(r,g(a),c)),o.value=E(o.value),t.innerHTML=o.value,t.className=function(t,e,n){var r=e?i[e]:n,o=[t.trim()];return t.match(/\bhljs\b/)||o.push("hljs"),-1===t.indexOf(r)&&o.push(r),o.join(" ").trim()}(t.className,u,o.language),t.result={language:o.language,re:o.relevance},o.second_best&&(t.second_best={language:o.second_best.language,re:o.second_best.relevance}))}function x(){if(!x.called){x.called=!0;var t=document.querySelectorAll("pre code");n.forEach.call(t,k)}}function w(t){return t=(t||"").toLowerCase(),o[t]||o[i[t]]}function C(t){var e=w(t);return e&&!e.disableAutodetect}return t.highlight=_,t.highlightAuto=y,t.fixMarkup=E,t.highlightBlock=k,t.configure=function(t){l=m(l,t)},t.initHighlighting=x,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",x,!1),addEventListener("load",x,!1)},t.registerLanguage=function(e,n){var r=o[e]=n(t);v(r),r.aliases&&r.aliases.forEach((function(t){i[t]=e}))},t.listLanguages=function(){return r(o)},t.getLanguage=w,t.autoDetection=C,t.inherit=m,t.IDENT_RE="[a-zA-Z]\\w*",t.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",t.NUMBER_RE="\\b\\d+(\\.\\d+)?",t.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BINARY_NUMBER_RE="\\b(0b[01]+)",t.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},t.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},t.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},t.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},t.COMMENT=function(e,n,r){var o=t.inherit({className:"comment",begin:e,end:n,contains:[]},r||{});return o.contains.push(t.PHRASAL_WORDS_MODE),o.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),o},t.C_LINE_COMMENT_MODE=t.COMMENT("//","$"),t.C_BLOCK_COMMENT_MODE=t.COMMENT("/\\*","\\*/"),t.HASH_COMMENT_MODE=t.COMMENT("#","$"),t.NUMBER_MODE={className:"number",begin:t.NUMBER_RE,relevance:0},t.C_NUMBER_MODE={className:"number",begin:t.C_NUMBER_RE,relevance:0},t.BINARY_NUMBER_MODE={className:"number",begin:t.BINARY_NUMBER_RE,relevance:0},t.CSS_NUMBER_MODE={className:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},t.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[t.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[t.BACKSLASH_ESCAPE]}]},t.TITLE_MODE={className:"title",begin:t.IDENT_RE,relevance:0},t.UNDERSCORE_TITLE_MODE={className:"title",begin:t.UNDERSCORE_IDENT_RE,relevance:0},t.METHOD_GUARD={begin:"\\.\\s*"+t.UNDERSCORE_IDENT_RE,relevance:0},t},i="object"==typeof window&&window||"object"==typeof self&&self,e.nodeType?i&&(i.hljs=o({}),void 0===(r=function(){return i.hljs}.apply(e,[]))||(t.exports=r)):o(e)},function(t,e,n){"use strict";t.exports=n(102)},function(t,e,n){"use strict";t.exports.encode=n(103),t.exports.decode=n(104),t.exports.format=n(105),t.exports.parse=n(106)},function(t,e){t.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(t,e){t.exports=/[\0-\x1F\x7F-\x9F]/},function(t,e){t.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},function(t,e,n){"use strict";var r="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",o="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",i=new RegExp("^(?:"+r+"|"+o+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?].*?[?]>|]*>|)"),a=new RegExp("^(?:"+r+"|"+o+")");t.exports.HTML_TAG_RE=i,t.exports.HTML_OPEN_CLOSE_TAG_RE=a},function(t,e,n){"use strict";t.exports.tokenize=function(t,e){var n,r,o,i,a=t.pos,s=t.src.charCodeAt(a);if(e)return!1;if(126!==s)return!1;if(o=(r=t.scanDelims(t.pos,!0)).length,i=String.fromCharCode(s),o<2)return!1;for(o%2&&(t.push("text","",0).content=i,o--),n=0;n=0;e--)95!==(n=s[e]).marker&&42!==n.marker||-1!==n.end&&(r=s[n.end],a=e>0&&s[e-1].end===n.end+1&&s[e-1].token===n.token-1&&s[n.end+1].token===r.token+1&&s[e-1].marker===n.marker,i=String.fromCharCode(n.marker),(o=t.tokens[n.token]).type=a?"strong_open":"em_open",o.tag=a?"strong":"em",o.nesting=1,o.markup=a?i+i:i,o.content="",(o=t.tokens[r.token]).type=a?"strong_close":"em_close",o.tag=a?"strong":"em",o.nesting=-1,o.markup=a?i+i:i,o.content="",a&&(t.tokens[s[e-1].token].content="",t.tokens[s[n.end+1].token].content="",e--))}},function(t,e,n){(function(t,r){var o;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(i){e&&e.nodeType,t&&t.nodeType;var a="object"==typeof r&&r;a.global!==a&&a.window!==a&&a.self;var s,c=2147483647,u=36,l=1,f=26,p=38,d=700,h=72,m=128,g="-",v=/^xn--/,b=/[^\x20-\x7E]/,_=/[\x2E\u3002\uFF0E\uFF61]/g,y={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},E=u-l,k=Math.floor,x=String.fromCharCode;function w(t){throw new RangeError(y[t])}function C(t,e){for(var n=t.length,r=[];n--;)r[n]=e(t[n]);return r}function A(t,e){var n=t.split("@"),r="";return n.length>1&&(r=n[0]+"@",t=n[1]),r+C((t=t.replace(_,".")).split("."),e).join(".")}function T(t){for(var e,n,r=[],o=0,i=t.length;o=55296&&e<=56319&&o65535&&(e+=x((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=x(t)})).join("")}function R(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function O(t,e,n){var r=0;for(t=n?k(t/d):t>>1,t+=k(t/e);t>E*f>>1;r+=u)t=k(t/E);return k(r+(E+1)*t/(t+p))}function N(t){var e,n,r,o,i,a,s,p,d,v,b,_=[],y=t.length,E=0,x=m,C=h;for((n=t.lastIndexOf(g))<0&&(n=0),r=0;r=128&&w("not-basic"),_.push(t.charCodeAt(r));for(o=n>0?n+1:0;o=y&&w("invalid-input"),((p=(b=t.charCodeAt(o++))-48<10?b-22:b-65<26?b-65:b-97<26?b-97:u)>=u||p>k((c-E)/a))&&w("overflow"),E+=p*a,!(p<(d=s<=C?l:s>=C+f?f:s-C));s+=u)a>k(c/(v=u-d))&&w("overflow"),a*=v;C=O(E-i,e=_.length+1,0==i),k(E/e)>c-x&&w("overflow"),x+=k(E/e),E%=e,_.splice(E++,0,x)}return S(_)}function L(t){var e,n,r,o,i,a,s,p,d,v,b,_,y,E,C,A=[];for(_=(t=T(t)).length,e=m,n=0,i=h,a=0;a<_;++a)(b=t[a])<128&&A.push(x(b));for(r=o=A.length,o&&A.push(g);r<_;){for(s=c,a=0;a<_;++a)(b=t[a])>=e&&bk((c-n)/(y=r+1))&&w("overflow"),n+=(s-e)*y,e=s,a=0;a<_;++a)if((b=t[a])c&&w("overflow"),b==e){for(p=n,d=u;!(p<(v=d<=i?l:d>=i+f?f:d-i));d+=u)C=p-v,E=u-v,A.push(x(R(v+C%E,0))),p=k(C/E);A.push(x(R(p,0))),i=O(n,y,r==o),n=0,++r}++n,++e}return A.join("")}s={version:"1.4.1",ucs2:{decode:T,encode:S},decode:N,encode:L,toASCII:function(t){return A(t,(function(t){return b.test(t)?"xn--"+L(t):t}))},toUnicode:function(t){return A(t,(function(t){return v.test(t)?N(t.slice(4).toLowerCase()):t}))}},void 0===(o=function(){return s}.call(e,n,e,t))||(t.exports=o)}()}).call(this,n(21)(t),n(11))},function(t,e,n){"use strict";t.exports=function(t,e){!0===e&&(e=0);var n=t.indexOf("://"),r=t.substring(0,n).split("+").filter(Boolean);return"number"==typeof e?r[e]:r}},function(t,e,n){"use strict";var r=n(64);t.exports=function t(e){if(Array.isArray(e))return-1!==e.indexOf("ssh")||-1!==e.indexOf("rsync");if("string"!=typeof e)return!1;var n=r(e);return e=e.substring(e.indexOf("://")+3),!!t(n)||e.indexOf("@")=o?t:r(t,e,n)}},function(t,e){var n=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");t.exports=function(t){return n.test(t)}},function(t,e,n){var r=n(173),o=n(68),i=n(174);t.exports=function(t){return o(t)?i(t):r(t)}},function(t,e,n){var r=n(22),o=n(175),i=n(9),a=n(23),s=1/0,c=r?r.prototype:void 0,u=c?c.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(i(e))return o(e,t)+"";if(a(e))return u?u.call(e):"";var n=e+"";return"0"==n&&1/e==-s?"-0":n}},function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n(11))},function(t,e,n){var r=n(182),o=n(183),i=n(184);t.exports=function(t,e,n){return e==e?i(t,e,n):r(t,o,n)}},function(t,e,n){var r=n(17),o=n(19),i="[object AsyncFunction]",a="[object Function]",s="[object GeneratorFunction]",c="[object Proxy]";t.exports=function(t){if(!o(t))return!1;var e=r(t);return e==a||e==s||e==i||e==c}},function(t,e,n){var r=n(75),o=n(196),i=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return o(t);var e=[];for(var n in Object(t))i.call(t,n)&&"constructor"!=n&&e.push(n);return e}},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},function(t,e,n){var r=n(198),o=n(44),i=n(203),a=n(78),s=n(204),c=n(17),u=n(77),l=u(r),f=u(o),p=u(i),d=u(a),h=u(s),m=c;(r&&"[object DataView]"!=m(new r(new ArrayBuffer(1)))||o&&"[object Map]"!=m(new o)||i&&"[object Promise]"!=m(i.resolve())||a&&"[object Set]"!=m(new a)||s&&"[object WeakMap]"!=m(new s))&&(m=function(t){var e=c(t),n="[object Object]"==e?t.constructor:void 0,r=n?u(n):"";if(r)switch(r){case l:return"[object DataView]";case f:return"[object Map]";case p:return"[object Promise]";case d:return"[object Set]";case h:return"[object WeakMap]"}return e}),t.exports=m},function(t,e){var n=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return n.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},function(t,e,n){var r=n(12)(n(8),"Set");t.exports=r},function(t,e,n){var r=n(48),o=n(233),i=n(234);function a(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new r;++ep))return!1;var h=l.get(t);if(h&&l.get(e))return h==e;var m=-1,g=!0,v=n&s?new r:void 0;for(l.set(t,e),l.set(e,t);++m>>24)|4278255360&(n[d]<<24|n[d]>>>8);n[c>>>5]|=128<>>9<<4)]=c;var h=s._ff,m=s._gg,g=s._hh,v=s._ii;for(d=0;d>>0,l=l+_>>>0,f=f+y>>>0,p=p+E>>>0}return r.endian([u,l,f,p])})._ff=function(t,e,n,r,o,i,a){var s=t+(e&n|~e&r)+(o>>>0)+a;return(s<>>32-i)+e},s._gg=function(t,e,n,r,o,i,a){var s=t+(e&r|n&~r)+(o>>>0)+a;return(s<>>32-i)+e},s._hh=function(t,e,n,r,o,i,a){var s=t+(e^n^r)+(o>>>0)+a;return(s<>>32-i)+e},s._ii=function(t,e,n,r,o,i,a){var s=t+(n^(e|~r))+(o>>>0)+a;return(s<>>32-i)+e},s._blocksize=16,s._digestsize=16,t.exports=function(t,e){if(null==t)throw new Error("Illegal argument "+t);var n=r.wordsToBytes(s(t,e));return e&&e.asBytes?n:e&&e.asString?a.bytesToString(n):r.bytesToHex(n)}},function(t,e,n){var r=n(94);"string"==typeof r&&(r=[[t.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(96)(r,o);r.locals&&(t.exports=r.locals)},function(t,e,n){(t.exports=n(95)(!1)).push([t.i,'@charset \'UTF-8\';\n\n/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type="button"],\n[type="reset"],\n[type="submit"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type="button"]::-moz-focus-inner,\n[type="reset"]::-moz-focus-inner,\n[type="submit"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type="button"]:-moz-focusring,\n[type="reset"]:-moz-focusring,\n[type="submit"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type="checkbox"],\n[type="radio"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type="number"]::-webkit-inner-spin-button,\n[type="number"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type="search"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type="search"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\n/*\n * Add the correct display in all browsers.\n */\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n\n/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * 1. Prevent padding and border from affecting element width\n * https://goo.gl/pYtbK7\n * 2. Change the default font family in all browsers (opinionated)\n */\n\nhtml {\n box-sizing: border-box; /* 1 */\n font-family: sans-serif; /* 2 */\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\n\ndl,\ndd,\nh2,\nh3,\nh5,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background: transparent;\n padding: 0;\n}\n\n/**\n * Work around a Firefox/IE bug where the transparent `button` background\n * results in a loss of the default `button` focus styles.\n */\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the system font stack as a sane default.\n * 2. Use Tailwind\'s default "normal" line-height so the user isn\'t forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n/**\n * Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it\'s border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n*::before,\n*::after {\n border-width: 0;\n border-style: solid;\n border-color: rgb(232, 229, 239);\n border-color: var(--gray-300);\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\ntextarea {\n resize: vertical;\n}\n\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n color: #a0aec0;\n}\n\ninput::-moz-placeholder,\ntextarea::-moz-placeholder {\n color: #a0aec0;\n}\n\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n color: #a0aec0;\n}\n\ninput::-ms-input-placeholder,\ntextarea::-ms-input-placeholder {\n color: #a0aec0;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n color: #a0aec0;\n}\n\nbutton,\n[role="button"] {\n cursor: pointer;\n}\n\n\nh2,\nh3,\nh5 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don\'t inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured \'mono\' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * \'mono\' font family.\n */\n\npre,\ncode {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n}\n\n/**\n * Make replaced elements `display: block` by default as that\'s\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\n\nsvg,\ncanvas {\n display: block;\n vertical-align: middle;\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their instrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\n:root {\n --white: rgb(255, 255, 255);\n --blue-400: rgb(122, 122, 255);\n --green-100: rgb(227, 255, 242);\n --green-300: rgb(148, 242, 200);\n --green-400: rgb(114, 224, 175);\n --green-500: rgb(34, 212, 146);\n --purple-100: rgb(251, 245, 255);\n --purple-200: rgb(236, 211, 253);\n --purple-300: rgb(214, 188, 250);\n --purple-400: rgb(183, 148, 244);\n --purple-500: rgb(121, 0, 245);\n --purple-600: rgb(113, 7, 220);\n --purple-800: rgb(79, 15, 143);\n --red-100: rgb(255, 235, 243);\n --red-300: rgb(250, 133, 162);\n --red-400: rgb(250, 78, 121);\n --yellow-100: rgb(255, 253, 235);\n --yellow-200: rgb(255, 248, 196);\n --yellow-300: rgb(255, 243, 148);\n --yellow-400: rgb(255, 234, 79);\n --tint-50: rgba(0, 0, 150, 0.015);\n --tint-100: rgba(0, 0, 150, 0.025);\n --tint-200: rgba(0, 0, 100, 0.07);\n --tint-300: rgba(25, 0, 100, 0.1);\n --tint-400: rgba(20, 0, 100, 0.2);\n --tint-500: rgba(30, 20, 90, 0.35);\n --tint-600: rgba(30, 20, 70, 0.5);\n --tint-700: rgba(15, 10, 60, 0.75);\n --gray-50: rgb(252, 252, 253);\n --gray-100: rgb(247, 247, 252);\n --gray-200: rgb(238, 238, 245);\n --gray-300: rgb(232, 229, 239);\n --gray-400: rgb(209, 204, 224);\n --gray-500: rgb(176, 173, 197);\n --gray-600: rgb(142, 137, 162);\n --gray-700: rgb(75, 71, 109);\n --gray-800: rgb(51, 47, 81);\n /* dark theme */\n --dark-white: rgb(38, 38, 50);\n --dark-blue-400: rgb(85, 0, 255);\n --dark-green-100: rgb(32, 97, 90);\n --dark-green-300: rgb(55, 111, 123);\n --dark-green-500: rgb(63, 152, 142);\n --dark-purple-100: rgb(60, 46, 96);\n --dark-purple-200: rgb(81, 50, 128);\n --dark-purple-300: rgb(104, 85, 147);\n --dark-purple-400: rgb(106, 87, 148);\n --dark-purple-500: rgb(126, 107, 167);\n --dark-purple-600: rgb(145, 127, 183);\n --dark-purple-800: rgb(158, 140, 194);\n --dark-red-100: rgb(255, 235, 243);\n --dark-red-300: rgb(250, 133, 162);\n --dark-red-400: rgb(250, 78, 121);\n --dark-yellow-100: rgb(61, 57, 49);\n --dark-yellow-200: rgb(90, 78, 53);\n --dark-yellow-300: rgb(119, 103, 70);\n --dark-yellow-400: rgb(145, 121, 90);\n --dark-tint-50: rgba(240, 240, 245, 0.05);\n --dark-tint-100: rgba(240, 240, 245, 0.075);\n --dark-tint-200: rgba(240, 240, 245, 0.1);\n --dark-tint-300: rgba(240, 240, 245, 0.125);\n --dark-tint-400: rgba(240, 240, 245, 0.25);\n --dark-tint-500: rgba(240, 240, 245, 0.45);\n --dark-tint-600: rgba(240, 240, 245, 0.55);\n --dark-tint-700: rgba(240, 240, 245, 0.65);\n --dark-gray-0: rgb(30, 30, 40);\n --dark-gray-50: rgb(38, 38, 50);\n --dark-gray-100: rgb(48, 48, 58);\n --dark-gray-200: rgb(51, 51, 65);\n --dark-gray-300: rgb(75, 75, 85);\n --dark-gray-400: rgb(142, 142, 160);\n --dark-gray-500: rgb(152, 152, 170);\n --dark-gray-600: rgb(165, 165, 175);\n --dark-gray-700: rgb(216, 216, 223);\n --dark-gray-800: rgb(230, 230, 235);\n --dark-shadow-sm: \'0 2px 0 var(--gray-0)\';\n --dark-shadow-default: \'0 2px 0 var(--gray-50), 2px 4px 0 var(--gray-0)\';\n --dark-shadow-lg: \'0 2px 0 var(--gray-100), 2px 4px 0 var(--gray-50), 4px 6px 0 var(--gray-0)\';\n --dark-shadow-input: \'inset 0 2px 0 var(--gray-100)\';\n}\n\nhtml {\n box-sizing: border-box;\n font-size: 14px;\n background-color: rgb(238, 238, 245);\n background-color: var(--gray-200);\n overflow-x: hidden;\n overflow-y: scroll;\n}\n\n@media (min-width: 1024px) {\n html {\n font-size: 16px;\n }\n}\n\n/* Exclude iframes like 1Password save modals */\n\n*:not(iframe),\n*:after,\n*:before {\n position: relative;\n}\n\n*:focus {\n outline: 0 !important;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n color: rgb(51, 47, 81);\n color: var(--gray-800);\n line-height: 1.5;\n width: 100%;\n}\n\n/* Dark theme */\n\n@media (prefers-color-scheme: dark) {\n html.theme-auto {\n --white: var(--dark-white);\n --blue-400: var(--dark-blue-400);\n --green-100: var(--dark-green-100);\n --green-300: var(--dark-green-300);\n --green-400: var(--dark-green-400);\n --green-500: var(--dark-green-500);\n --purple-100: var(--dark-purple-100);\n --purple-200: var(--dark-purple-200);\n --purple-300: var(--dark-purple-300);\n --purple-400: var(--dark-purple-400);\n --purple-500: var(--dark-purple-500);\n --purple-600: var(--dark-purple-600);\n --purple-800: var(--dark-purple-800);\n --red-100: var(--dark-red-100);\n --red-300: var(--dark-red-300);\n --red-400: var(--dark-red-400);\n --yellow-100: var(--dark-yellow-100);\n --yellow-200: var(--dark-yellow-200);\n --yellow-300: var(--dark-yellow-300);\n --yellow-400: var(--dark-yellow-400);\n --tint-50: var(--dark-tint-50);\n --tint-100: var(--dark-tint-100);\n --tint-200: var(--dark-tint-200);\n --tint-300: var(--dark-tint-300);\n --tint-400: var(--dark-tint-400);\n --tint-500: var(--dark-tint-500);\n --tint-600: var(--dark-tint-600);\n --tint-700: var(--dark-tint-700);\n --gray-0: var(--dark-gray-0);\n --gray-50: var(--dark-gray-50);\n --gray-100: var(--dark-gray-100);\n --gray-200: var(--dark-gray-200);\n --gray-300: var(--dark-gray-300);\n --gray-400: var(--dark-gray-400);\n --gray-500: var(--dark-gray-500);\n --gray-600: var(--dark-gray-600);\n --gray-700: var(--dark-gray-700);\n --gray-800: var(--dark-gray-800);\n --shadow-sm: \'0 2px 0 var(--gray-50)\';\n --shadow-default: \'0 2px 0 var(--gray-100), 2px 4px 0 var(--gray-50)\';\n --shadow-lg: \'0 2px 0 var(--gray-200), 2px 4px 0 var(--gray-100), 4px 6px 0 var(--gray-50)\';\n --shadow-input: \'inset 0 2px 0 var(--gray-100)\';\n }\n\n html.theme-auto {\n background-color: rgb(30, 30, 40);\n background-color: var(--dark-gray-0);\n }\n\n html.theme-auto .checkbox:before {\n background-color: rgb(51, 47, 81);\n background-color: var(--gray-800);\n }\n\n html.theme-auto .tab-nav,\n html.theme-auto .dropdown {\n background-color: rgb(209, 204, 224);\n background-color: var(--gray-400);\n }\n}\n\nhtml.theme-dark {\n --white: var(--dark-white);\n --blue-400: var(--dark-blue-400);\n --green-100: var(--dark-green-100);\n --green-300: var(--dark-green-300);\n --green-400: var(--dark-green-400);\n --green-500: var(--dark-green-500);\n --purple-100: var(--dark-purple-100);\n --purple-200: var(--dark-purple-200);\n --purple-300: var(--dark-purple-300);\n --purple-400: var(--dark-purple-400);\n --purple-500: var(--dark-purple-500);\n --purple-600: var(--dark-purple-600);\n --purple-800: var(--dark-purple-800);\n --red-100: var(--dark-red-100);\n --red-300: var(--dark-red-300);\n --red-400: var(--dark-red-400);\n --yellow-100: var(--dark-yellow-100);\n --yellow-200: var(--dark-yellow-200);\n --yellow-300: var(--dark-yellow-300);\n --yellow-400: var(--dark-yellow-400);\n --tint-50: var(--dark-tint-50);\n --tint-100: var(--dark-tint-100);\n --tint-200: var(--dark-tint-200);\n --tint-300: var(--dark-tint-300);\n --tint-400: var(--dark-tint-400);\n --tint-500: var(--dark-tint-500);\n --tint-600: var(--dark-tint-600);\n --tint-700: var(--dark-tint-700);\n --gray-0: var(--dark-gray-0);\n --gray-50: var(--dark-gray-50);\n --gray-100: var(--dark-gray-100);\n --gray-200: var(--dark-gray-200);\n --gray-300: var(--dark-gray-300);\n --gray-400: var(--dark-gray-400);\n --gray-500: var(--dark-gray-500);\n --gray-600: var(--dark-gray-600);\n --gray-700: var(--dark-gray-700);\n --gray-800: var(--dark-gray-800);\n --shadow-sm: \'0 2px 0 var(--gray-50)\';\n --shadow-default: \'0 2px 0 var(--gray-100), 2px 4px 0 var(--gray-50)\';\n --shadow-lg: \'0 2px 0 var(--gray-200), 2px 4px 0 var(--gray-100), 4px 6px 0 var(--gray-50)\';\n --shadow-input: \'inset 0 2px 0 var(--gray-100)\';\n}\n\nhtml.theme-dark {\n background-color: rgb(30, 30, 40);\n background-color: var(--dark-gray-0);\n}\n\nhtml.theme-dark .checkbox:before {\n background-color: rgb(51, 47, 81);\n background-color: var(--gray-800);\n}\n\nhtml.theme-dark .tab-nav,\nhtml.theme-dark .dropdown {\n background-color: rgb(209, 204, 224);\n background-color: var(--gray-400);\n}\n\n.alert {\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n border-width: 0;\n border-left-width: 2px;\n border-color: rgba(0, 0, 150, 0.025);\n border-color: var(--tint-100);\n}\n\n.alert-warning {\n background-color: rgb(255, 253, 235);\n background-color: var(--yellow-100);\n border-color: rgb(255, 234, 79);\n border-color: var(--yellow-400);\n}\n\n.alert-empty {\n color: rgba(30, 20, 90, 0.35);\n color: var(--tint-500);\n padding-top: 2rem;\n padding-bottom: 2rem;\n text-align: center;\n}\n\n.button {\n display: inline-flex;\n align-items: center;\n justify-items: center;\n align-content: center;\n justify-content: center;\n padding-left: 1rem;\n padding-right: 1rem;\n min-height: 2.5rem;\n border-width: 0;\n background-color: rgb(121, 0, 245);\n background-color: var(--purple-500);\n overflow: hidden;\n border-radius: 0.125rem;\n color: rgb(255, 255, 255);\n color: var(--white);\n line-height: 1;\n text-decoration: none;\n}\n\n.button:after {\n content: \'\';\n display: block;\n position: absolute;\n left: 100%;\n bottom: 0;\n width: 200%;\n height: 100vh;\n background-color: rgba(30, 20, 90, 0.35);\n background-color: var(--tint-500);\n transform: translateX(-1rem) skewX(-65deg);\n transform-origin: 0% 100%;\n transition: transform 0.75s ease-out;\n}\n\n.button:hover:after {\n transform: translateX(-1.5rem) skewX(-65deg);\n transition-duration: 0.3s;\n}\n\n.button:not(:disabled):active:after {\n transition-delay: 0.2s;\n transition-duration: 0.3s;\n transform: translateX(-100%) skewX(-65deg);\n}\n\n.button-secondary {\n display: inline-flex;\n align-items: center;\n justify-items: center;\n align-content: center;\n justify-content: center;\n padding-left: 1rem;\n padding-right: 1rem;\n min-height: 2.5rem;\n border-width: 0;\n background-color: rgb(121, 0, 245);\n background-color: var(--purple-500);\n overflow: hidden;\n border-radius: 0.125rem;\n color: rgb(255, 255, 255);\n color: var(--white);\n line-height: 1;\n text-decoration: none;\n background-color: rgba(0, 0, 100, 0.07);\n background-color: var(--tint-200);\n color: rgba(15, 10, 60, 0.75);\n color: var(--tint-700);\n}\n\n.button-secondary:hover {\n background-color: rgba(25, 0, 100, 0.1);\n background-color: var(--tint-300);\n}\n\n.button-secondary:not(:disabled):active {\n background-color: rgba(30, 20, 90, 0.35);\n background-color: var(--tint-500);\n opacity: 0.5;\n}\n\n.button:focus,\n.button-secondary:focus {\n outline: 0;\n}\n\n.button:disabled,\n.button-secondary:disabled {\n cursor: not-allowed;\n opacity: 0.25;\n}\n\n.button-sm {\n font-size: 0.875rem;\n}\n\n.button.button-sm,\n.button-secondary.button-sm {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n min-height: 1.5rem;\n border-radius: 0.125rem;\n}\n\n.button-lg {\n font-size: 1.125rem;\n}\n\n.button.button-lg,\n.button-secondary.button-lg {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n min-height: 3rem;\n}\n\n.button-lg.button:after {\n transform: translateX(-2rem) skewX(-65deg);\n}\n\n.button-lg.button:hover:after {\n transform: translateX(-3rem) skewX(-65deg);\n}\n\n.card {\n position: relative;\n display: grid;\n align-items: stretch;\n border-width: 1px;\n border-color: rgba(25, 0, 100, 0.1);\n border-color: var(--tint-300);\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n box-shadow: var(--shadow-sm);\n border-radius: 0.125rem;\n}\n\n.card-details {\n overflow: hidden;\n}\n\n.card-details-overflow {\n display: grid;\n grid-gap: 1rem;\n padding: 1.5rem;\n overflow-x: auto;\n}\n\n@media (min-width: 768px) {\n .card {\n grid-template-columns: 16rem 1fr;\n }\n\n .card-has-header {\n grid-template-rows: auto 1fr;\n }\n\n .card.card-no-props {\n display: block;\n }\n\n .card-header {\n grid-column-end: span 2;\n }\n\n .card-details-overflow {\n padding: 2rem;\n }\n}\n\n.checkbox-label {\n display: grid;\n justify-content: flex-start;\n grid-template-columns: auto;\n grid-auto-flow: column;\n grid-gap: 0.5rem;\n min-height: 0;\n cursor: pointer;\n color: rgb(51, 47, 81);\n color: var(--gray-800);\n}\n\n.checkbox {\n width: 1.5em;\n height: 1.5em;\n border-style: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.checkbox:before {\n position: absolute;\n width: 1.5em;\n height: 1.5em;\n border-width: 1px;\n border-color: rgba(0, 0, 100, 0.07);\n border-color: var(--tint-200);\n background-color: rgb(252, 252, 253);\n background-color: var(--gray-50);\n box-shadow: var(--shadow-default);\n border-radius: 0.125rem;\n overflow: hidden;\n content: \'\';\n}\n\n.checkbox:after {\n position: absolute;\n top: 50%;\n left: 50%;\n color: rgb(121, 0, 245);\n color: var(--purple-500);\n font-size: 1.2em;\n font-weight: 900;\n line-height: 1;\n content: \'✓\';\n transition: transform 0.1s;\n transform: translate(-50%, -50%) scale(0);\n}\n\n.checkbox:focus,\n.checkbox:hover {\n outline: 0;\n}\n\n.checkbox:focus:before {\n border-color: rgba(25, 0, 100, 0.1);\n border-color: var(--tint-300);\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n}\n\n.checkbox:hover:before {\n border-color: rgba(25, 0, 100, 0.1);\n border-color: var(--tint-300);\n}\n\n.checkbox:checked:after {\n transform: translate(-50%, -50%) scale(1);\n}\n\n.checkbox:disabled {\n opacity: 0.5;\n}\n\n.code {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n}\n\n.code-inline {\n display: inline-block;\n margin-top: -0.25rem;\n margin-bottom: -0.25rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n border-radius: 0.125rem;\n background-color: rgb(247, 247, 252);\n background-color: var(--gray-100);\n border-width: 1px;\n border-color: rgba(0, 0, 150, 0.025);\n border-color: var(--tint-100);\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n word-break: break-all;\n}\n\n.code-block {\n display: block;\n padding-left: 1rem;\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n border-radius: 0.125rem;\n background-color: rgb(247, 247, 252);\n background-color: var(--gray-100);\n border-width: 1px;\n border-color: rgba(0, 0, 150, 0.025);\n border-color: var(--tint-100);\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n}\n\n.code-inline pre,\n.code-block pre {\n white-space: pre-wrap;\n}\n\n.definition-list {\n display: grid;\n grid-column-gap: 1.5rem;\n grid-row-gap: 0.5rem;\n}\n\n.definition-list .definition-list {\n border-left-width: 2px;\n border-color: rgb(232, 229, 239);\n border-color: var(--gray-300);\n padding-left: 1rem;\n}\n\n@media (min-width: 640px) {\n .definition-list {\n grid-template-columns: 8rem 1fr;\n }\n\n .definition-list .definition-list {\n grid-template-columns: auto 1fr;\n }\n}\n\n@media (min-width: 1024px) {\n .definition-list {\n grid-template-columns: 14rem 1fr;\n }\n}\n\n.definition-list-title {\n font-weight: 600;\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 640px) {\n .definition-list-title {\n margin-left: 9.5rem;\n }\n}\n\n@media (min-width: 1024px) {\n .definition-list-title {\n margin-left: 15.5rem;\n }\n}\n\n.definition-label {\n color: rgba(30, 20, 70, 0.5);\n color: var(--tint-600);\n word-wrap: break-word;\n line-height: 1.25;\n}\n\n@media (min-width: 640px) {\n .definition-label {\n text-align: right;\n }\n}\n\n.definition-value {\n word-break: break-all;\n margin-bottom: 1rem;\n line-height: 1.25;\n}\n\n@media (min-width: 640px) {\n .definition-value {\n margin-bottom: 0;\n }\n}\n\n.definition-label:empty:after,\n.definition-value:empty:after {\n content: \'—\';\n color: rgb(232, 229, 239);\n color: var(--gray-300);\n}\n\n.definition-list-empty {\n color: rgb(232, 229, 239);\n color: var(--gray-300);\n}\n\n@media (min-width: 640px) {\n .definition-list-empty {\n grid-column-start: 2;\n }\n\n .definition-list .definition-list .definition-list-empty {\n grid-column-start: 1;\n }\n}\n\n.dropdown {\n position: absolute;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n overflow-y: auto;\n max-height: \'66vh\';\n border-width: 1px;\n border-top-width: 0;\n border-color: rgba(0, 0, 100, 0.07);\n border-color: var(--tint-200);\n color: rgb(255, 255, 255);\n color: var(--white);\n background-color: rgb(75, 71, 109);\n background-color: var(--gray-700);\n}\n\n.layout-col {\n max-width: 80rem;\n padding-left: 1rem;\n padding-right: 1rem;\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 640px) {\n .layout-col {\n padding-left: 2.5rem;\n padding-right: 2.5rem;\n }\n}\n\n.link {\n text-decoration: underline;\n -webkit-text-decoration-color: rgb(209, 204, 224);\n text-decoration-color: rgb(209, 204, 224);\n -webkit-text-decoration-color: var(--gray-400);\n text-decoration-color: var(--gray-400);\n}\n\n.link:hover {\n color: rgb(121, 0, 245);\n color: var(--purple-500);\n -webkit-text-decoration-color: rgb(214, 188, 250);\n text-decoration-color: rgb(214, 188, 250);\n -webkit-text-decoration-color: var(--purple-300);\n text-decoration-color: var(--purple-300);\n}\n\n.links a {\n text-decoration: underline;\n -webkit-text-decoration-color: rgb(209, 204, 224);\n text-decoration-color: rgb(209, 204, 224);\n -webkit-text-decoration-color: var(--gray-400);\n text-decoration-color: var(--gray-400);\n}\n\n.links a:hover {\n color: rgb(121, 0, 245);\n color: var(--purple-500);\n -webkit-text-decoration-color: rgb(214, 188, 250);\n text-decoration-color: rgb(214, 188, 250);\n -webkit-text-decoration-color: var(--purple-300);\n text-decoration-color: var(--purple-300);\n}\n\n.link-dimmed {\n font-weight: 400;\n text-decoration: underline;\n color: rgba(30, 20, 70, 0.5);\n color: var(--tint-600);\n -webkit-text-decoration-color: rgba(20, 0, 100, 0.2);\n text-decoration-color: rgba(20, 0, 100, 0.2);\n -webkit-text-decoration-color: var(--tint-400);\n text-decoration-color: var(--tint-400);\n}\n\n.link-dimmed:hover {\n color: rgba(15, 10, 60, 0.75);\n color: var(--tint-700);\n -webkit-text-decoration-color: rgba(30, 20, 90, 0.35);\n text-decoration-color: rgba(30, 20, 90, 0.35);\n -webkit-text-decoration-color: var(--tint-500);\n text-decoration-color: var(--tint-500);\n}\n\n.link-solution {\n text-decoration: underline;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n -webkit-text-decoration-color: rgba(20, 0, 100, 0.2);\n text-decoration-color: rgba(20, 0, 100, 0.2);\n -webkit-text-decoration-color: var(--tint-400);\n text-decoration-color: var(--tint-400);\n}\n\n.link-solution:hover {\n color: rgb(51, 47, 81);\n color: var(--gray-800);\n -webkit-text-decoration-color: rgba(30, 20, 90, 0.35);\n text-decoration-color: rgba(30, 20, 90, 0.35);\n -webkit-text-decoration-color: var(--tint-500);\n text-decoration-color: var(--tint-500);\n}\n\n.grid {\n display: grid;\n}\n\n.cols-2 {\n grid-template-columns: repeat(2, 1fr);\n}\n\n.cols-auto {\n grid-template-columns: auto;\n grid-auto-flow: column;\n}\n\n.cols-auto-1fr {\n grid-template-columns: auto 1fr;\n}\n\n.gap-1 {\n grid-gap: 0.25rem;\n}\n\n.gap-2 {\n grid-gap: 0.5rem;\n}\n\n.gapy-2 {\n grid-row-gap: 0.5rem;\n}\n\n.gap-4 {\n grid-gap: 1rem;\n}\n\n.gapx-4 {\n grid-column-gap: 1rem;\n}\n\n.gapx-6 {\n grid-column-gap: 1.5rem;\n}\n\n.span-2 {\n grid-column-end: span 2;\n}\n\n.place-center {\n align-items: center;\n justify-items: center;\n align-content: center;\n justify-content: center;\n}\n\n.icon {\n fill: currentColor;\n height: 1em;\n line-height: 1;\n width: 1em;\n display: inline-block;\n vertical-align: baseline;\n vertical-align: initial;\n}\n\n.scrollbar::-webkit-scrollbar,\n.scrollbar::-webkit-scrollbar-corner {\n width: 4px;\n height: 4px;\n}\n\n.scrollbar::-webkit-scrollbar-track {\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n}\n\n.scrollbar::-webkit-scrollbar-track:horizontal,\n.scrollbar-lg::-webkit-scrollbar-track:horizontal {\n border-top: solid 1px rgba(0, 0, 0, 0.1);\n}\n\n.scrollbar::-webkit-scrollbar-track:vertical,\n.scrollbar-lg::-webkit-scrollbar-track:vertical {\n border-left: solid 1px rgba(0, 0, 0, 0.1);\n}\n\n.scrollbar::-webkit-scrollbar-thumb {\n background-color: rgb(209, 204, 224);\n background-color: var(--gray-400);\n border-radius: 2px;\n}\n\n.scrollbar-lg::-webkit-scrollbar,\n.scrollbar-lg::-webkit-scrollbar-corner {\n width: 8px;\n height: 8px;\n}\n\n.scrollbar-lg::-webkit-scrollbar-track {\n background-color: rgb(252, 252, 253);\n background-color: var(--gray-50);\n}\n\n.scrollbar-lg::-webkit-scrollbar-thumb {\n background-color: rgb(142, 137, 162);\n background-color: var(--gray-600);\n border-radius: 4px;\n}\n\n:root {\n --stack-height: var(--tab-main-height);\n}\n\n.stack {\n display: grid;\n grid-template: calc(0.4 * calc(100vh - 3rem)) calc(0.6 * calc(100vh - 3rem)) / 1fr;\n grid-template: calc(0.4 * var(--stack-height)) calc(0.6 * var(--stack-height)) / 1fr;\n}\n\n@media (min-width: 640px) {\n .stack {\n align-items: stretch;\n grid-template: calc(100vh - 3rem) / 22rem 1fr;\n grid-template: var(--stack-height) / 22rem 1fr;\n }\n}\n\n.stack-nav {\n height: 100%;\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n border-bottom-width: 1px;\n border-color: rgb(232, 229, 239);\n border-color: var(--gray-300);\n font-size: 0.75rem;\n overflow: hidden;\n display: grid;\n grid-template: 1fr / 100%;\n}\n\n@media (min-width: 640px) {\n .stack-nav {\n display: grid;\n grid-template: auto 1fr / 100%;\n border-bottom-width: 0;\n border-right-width: 1px;\n }\n}\n\n.stack-nav-actions {\n display: none;\n}\n\n@media (min-width: 640px) {\n .stack-nav-actions {\n display: grid;\n align-items: center;\n justify-content: space-between;\n grid-template-columns: auto;\n grid-auto-flow: column;\n padding-top: 1rem;\n padding-bottom: 1rem;\n background-color: rgb(247, 247, 252);\n background-color: var(--gray-100);\n }\n}\n\n.stack-nav-arrows {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n justify-content: center;\n align-items: center;\n grid-gap: 0.25rem;\n width: 2.5rem;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n\n.stack-nav-arrow {\n color: rgb(176, 173, 197);\n color: var(--gray-500);\n font-size: 0.75rem;\n}\n\n.stack-nav-arrow:hover {\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n}\n\n.stack-frames {\n overflow: hidden;\n border-top-width: 1px;\n border-color: rgb(238, 238, 245);\n border-color: var(--gray-200);\n}\n\n.stack-frames-scroll {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.stack-frame-group {\n border-bottom-width: 1px;\n border-color: rgb(232, 229, 239);\n border-color: var(--gray-300);\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n}\n\n.stack-frame {\n display: grid;\n align-items: flex-end;\n grid-template-columns: 2rem auto auto;\n}\n\n@media (min-width: 640px) {\n .stack-frame {\n grid-template-columns: 3rem 1fr auto;\n }\n}\n\n.stack-frame:not(:first-child) {\n margin-top: -0.5rem;\n}\n\n.stack-frame-selected,\n.stack-frame-selected .stack-frame-header {\n background-color: rgb(251, 245, 255);\n background-color: var(--purple-100);\n z-index: 10;\n}\n\n.stack-frame-group-vendor .stack-frame-selected,\n.stack-frame-group-vendor .stack-frame-selected .stack-frame-header {\n /* @apply bg-gray-100; */\n}\n\n.stack-frame-number {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 1rem;\n padding-bottom: 1rem;\n color: rgb(121, 0, 245);\n color: var(--purple-500);\n font-feature-settings: "tnum";\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n.stack-frame-group-vendor .stack-frame-number {\n color: rgba(30, 20, 90, 0.35);\n color: var(--tint-500);\n}\n\n.stack-frame-header {\n margin-right: -2.5rem;\n width: 100%;\n}\n\n.stack-frame-text {\n display: grid;\n align-items: center;\n grid-gap: 0.5rem;\n border-left-width: 2px;\n padding-left: 0.75rem;\n padding-top: 1rem;\n padding-bottom: 1rem;\n border-color: rgb(214, 188, 250);\n border-color: var(--purple-300);\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n}\n\n.stack-frame-group-vendor .stack-frame-text {\n border-color: rgb(232, 229, 239);\n border-color: var(--gray-300);\n}\n\n.stack-frame-selected .stack-frame-text {\n border-color: rgb(121, 0, 245);\n border-color: var(--purple-500);\n}\n\n.stack-frame-group-vendor .stack-frame-selected .stack-frame-text {\n border-color: rgb(176, 173, 197);\n border-color: var(--gray-500);\n}\n\n.stack-frame-line {\n padding-left: 0.5rem;\n padding-right: 0.25rem;\n padding-top: 1rem;\n padding-bottom: 1rem;\n text-align: right;\n line-height: 1.25;\n}\n\n.stack-main {\n display: grid;\n height: 100%;\n overflow: hidden;\n background-color: rgb(247, 247, 252);\n background-color: var(--gray-100);\n grid-template: auto 1fr / 100%;\n}\n\n.stack-main-header {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom-width: 1px;\n border-color: rgb(238, 238, 245);\n border-color: var(--gray-200);\n font-size: 0.75rem;\n}\n\n@media (min-width: 640px) {\n .stack-main-header {\n padding-top: 1rem;\n padding-bottom: 1rem;\n font-size: 1rem;\n }\n}\n\n.stack-main-content {\n overflow: hidden;\n}\n\n.stack-viewer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n overflow: auto;\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n font-size: 0.75rem;\n}\n\n.stack-ruler {\n position: -webkit-sticky;\n position: sticky;\n flex: none;\n left: 0;\n z-index: 20;\n}\n\n.stack-lines {\n min-height: 100%;\n border-right-width: 1px;\n border-color: rgb(238, 238, 245);\n border-color: var(--gray-200);\n background-color: rgb(247, 247, 252);\n background-color: var(--gray-100);\n padding-top: 1rem;\n padding-bottom: 1rem;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.stack-line {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n color: rgba(30, 20, 70, 0.5);\n color: var(--tint-600);\n line-height: 2;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.stack-line-highlight {\n background-color: rgb(236, 211, 253);\n background-color: var(--purple-200);\n}\n\n.stack-line-selected {\n background-color: rgb(255, 248, 196);\n background-color: var(--yellow-200);\n}\n\n.stack-line-highlight.stack-line-selected {\n background-color: rgb(255, 243, 148);\n background-color: var(--yellow-300);\n}\n\n.stack-code {\n flex-grow: 1;\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n\n.stack-code-line {\n padding-left: 1.5rem;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n line-height: 2;\n}\n\n.stack-code-line:hover {\n background-color: rgb(251, 245, 255);\n background-color: var(--purple-100);\n}\n\n.stack-code-line .editor-link {\n display: inline-block;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n opacity: 0;\n color: rgb(183, 148, 244);\n color: var(--purple-400);\n}\n\n.stack-code-line .editor-link:hover {\n color: rgb(121, 0, 245);\n color: var(--purple-500);\n}\n\n.stack-code-line:hover .editor-link {\n opacity: 1;\n}\n\n.stack-code-line-highlight {\n background-color: rgb(251, 245, 255);\n background-color: var(--purple-100);\n}\n\n.stack-code-line-selected {\n background-color: rgb(255, 253, 235);\n background-color: var(--yellow-100);\n}\n\n.stack-code-line-highlight.stack-code-line-selected {\n background-color: rgb(255, 248, 196);\n background-color: var(--yellow-200);\n}\n\n.solution-hiding {\n pointer-events: none;\n}\n\n.solution-hidden {\n height: 0;\n overflow: hidden;\n}\n\n.solution-hidden .solution-main,\n.solution-hiding .solution-main {\n transform: translateY(-25px) scaleY(0.95);\n opacity: 0;\n}\n\n.solution-main {\n z-index: 1;\n color: rgb(51, 47, 81);\n color: var(--gray-800);\n opacity: 1;\n transition: all 0.1s;\n}\n\n.solution-toggle {\n position: absolute;\n z-index: 10;\n top: 0.5rem;\n right: 10px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n font-size: 0.75rem;\n line-height: 1;\n cursor: pointer;\n}\n\n.solution-toggle-show {\n top: 0;\n background-color: rgb(148, 242, 200);\n background-color: var(--green-300);\n box-shadow: var(--shadow-sm);\n border-bottom-right-radius: 0.125rem;\n border-bottom-left-radius: 0.125rem;\n z-index: 0;\n clip-path: polygon(0 0, 100% 0, 100% 100%, 9px 100%, 0 calc(100% - 5px));\n -webkit-clip-path: polygon(0 0, 100% 0, 100% 100%, 9px 100%, 0 calc(100% - 5px));\n}\n\n.solution-toggle-show a {\n text-decoration: none;\n}\n\n.solution-background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n top: -6px;\n margin: 0 10px;\n background-color: rgb(148, 242, 200);\n background-color: var(--green-300);\n box-shadow: var(--shadow-default);\n border-width: 1px;\n border-color: rgba(25, 0, 100, 0.1);\n border-color: var(--tint-300);\n overflow: hidden;\n border-bottom-right-radius: 0.125rem;\n border-bottom-left-radius: 0.125rem;\n}\n\n.solution-title {\n font-weight: 600;\n font-size: 1.5rem;\n line-height: 1.25;\n margin-bottom: 1rem;\n}\n\n.solution-content {\n max-width: 56rem;\n}\n\n@media (min-width: 768px) {\n .solution-content {\n margin-left: 15rem;\n }\n}\n\n.solution code {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n display: inline-block;\n margin-top: -0.25rem;\n margin-bottom: -0.25rem;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n border-radius: 0.125rem;\n background-color: rgba(0, 0, 150, 0.025);\n background-color: var(--tint-100);\n border-width: 1px;\n border-color: rgba(0, 0, 150, 0.025);\n border-color: var(--tint-100);\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;\n color: rgb(75, 71, 109);\n color: var(--gray-700);\n word-break: break-all;\n line-height: 1.25;\n}\n\n:root {\n --tab-main-height: calc(100vh - 3rem);\n}\n\n.tabs {\n z-index: 10;\n}\n\n.tab-main {\n z-index: 1;\n border-left-width: 1px;\n border-right-width: 1px;\n border-bottom-width: 1px;\n border-color: rgba(25, 0, 100, 0.1);\n border-color: var(--tint-300);\n min-height: calc(100vh - 3rem);\n min-height: var(--tab-main-height);\n}\n\n.tab-content {\n background-color: rgb(255, 255, 255);\n background-color: var(--white);\n font-size: 0.875rem;\n min-height: calc(100vh - 3rem);\n min-height: var(--tab-main-height);\n}\n\n.tab-content-section {\n padding-top: 2rem;\n padding-bottom: 2rem;\n border-top-width: 2px;\n border-color: rgba(0, 0, 100, 0.07);\n border-color: var(--tint-200);\n}\n\n.tab-content-section:first-child {\n border-top-width: 0;\n}\n\n.tab-nav {\n position: sticky;\n position: -webkit-sticky;\n display: grid;\n justify-content: center;\n grid-template-columns: auto;\n grid-auto-flow: column;\n grid-gap: 0.5rem;\n top: 0;\n width: 100%;\n z-index: 10;\n background-color: rgb(75, 71, 109);\n background-color: var(--gray-700);\n padding: 0.25rem;\n box-shadow: var(--shadow-default);\n border-top-left-radius: 0.125rem;\n border-top-right-radius: 0.125rem;\n font-size: 0.75rem;\n}\n\n.tab-bar {\n display: grid;\n grid-template-columns: auto;\n grid-auto-flow: column;\n justify-content: flex-start;\n grid-gap: 0.25rem;\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n.tab-bar::-webkit-scrollbar {\n height: 2px;\n}\n\n@media (min-width: 640px) {\n .tab-bar {\n justify-content: center;\n }\n}\n\n.tab {\n padding-left: 1rem;\n padding-right: 1rem;\n color: rgb(232, 229, 239);\n color: var(--gray-300);\n white-space: nowrap;\n border-radius: 0.125rem;\n height: 2.5rem;\n font-size: 0.875rem;\n}\n\n.tab-delimiter {\n border-left-width: 1px;\n border-color: rgb(142, 137, 162);\n border-color: var(--gray-600);\n}\n\n.tab:hover {\n background-color: rgba(20, 0, 100, 0.2);\n background-color: var(--tint-400);\n color: rgb(255, 255, 255);\n color: var(--white);\n}\n\n.tab-active,\n.tab-active:hover {\n background-color: rgba(30, 20, 70, 0.5);\n background-color: var(--tint-600);\n color: rgb(255, 255, 255);\n color: var(--white);\n}\n\n.ui-url {\n display: inline-block;\n line-height: 1.25;\n font-size: 0.875rem;\n font-weight: 400;\n text-decoration: underline;\n color: rgba(30, 20, 70, 0.5);\n color: var(--tint-600);\n -webkit-text-decoration-color: rgba(20, 0, 100, 0.2);\n text-decoration-color: rgba(20, 0, 100, 0.2);\n -webkit-text-decoration-color: var(--tint-400);\n text-decoration-color: var(--tint-400);\n}\n\n.ui-url:hover {\n color: rgba(15, 10, 60, 0.75);\n color: var(--tint-700);\n -webkit-text-decoration-color: rgba(30, 20, 90, 0.35);\n text-decoration-color: rgba(30, 20, 90, 0.35);\n -webkit-text-decoration-color: var(--tint-500);\n text-decoration-color: var(--tint-500);\n}\n\n.ui-path {\n display: inline-block;\n line-height: 1.25;\n}\n\n.ui-exception-message {\n font-weight: 600;\n line-height: 1.25;\n word-wrap: break-word;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 5;\n overflow: hidden;\n}\n\n.ui-exception-message-full {\n -webkit-line-clamp: unset;\n}\n\n.ui-exception-class {\n display: inline-block;\n line-height: 1.25;\n color: rgba(30, 20, 70, 0.5);\n color: var(--tint-600);\n}\n\n.ui-line-number {\n display: inline-block;\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n border-radius: 0.125rem;\n background-color: rgba(0, 0, 150, 0.015);\n background-color: var(--tint-50);\n color: rgba(30, 20, 70, 0.5);\n color: var(--tint-600);\n font-size: 0.75rem;\n line-height: 1.25;\n}\n\n.dark .hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #abb2bf;\n background: #282c34;\n}\n\n.dark .hljs-comment,\n.dark .hljs-quote {\n color: #5c6370;\n font-style: italic;\n}\n\n.dark .hljs-doctag,\n.dark .hljs-keyword,\n.dark .hljs-formula {\n color: #c678dd;\n}\n\n.dark .hljs-section,\n.dark .hljs-name,\n.dark .hljs-selector-tag,\n.dark .hljs-deletion,\n.dark .hljs-subst {\n color: #e06c75;\n}\n\n.dark .hljs-literal {\n color: #56b6c2;\n}\n\n.dark .hljs-string,\n.dark .hljs-regexp,\n.dark .hljs-addition,\n.dark .hljs-attribute,\n.dark .hljs-meta-string {\n color: #98c379;\n}\n\n.dark .hljs-built_in,\n.dark .hljs-class .dark .hljs-title {\n color: #e6c07b;\n}\n\n.dark .hljs-attr,\n.dark .hljs-variable,\n.dark .hljs-template-variable,\n.dark .hljs-type,\n.dark .hljs-selector-class,\n.dark .hljs-selector-attr,\n.dark .hljs-selector-pseudo,\n.dark .hljs-number {\n color: #d19a66;\n}\n\n.dark .hljs-symbol,\n.dark .hljs-bullet,\n.dark .hljs-link,\n.dark .hljs-meta,\n.dark .hljs-selector-id,\n.dark .hljs-title {\n color: #61aeee;\n}\n\n.dark .hljs-emphasis {\n font-style: italic;\n}\n\n.dark .hljs-strong {\n font-weight: bold;\n}\n\n.dark .hljs-link {\n text-decoration: underline;\n}\n\n.light .hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #383a42;\n background: #fafafa;\n}\n\n.light .hljs-comment,\n.light .hljs-quote {\n color: #a0a1a7;\n font-style: italic;\n}\n\n.light .hljs-doctag,\n.light .hljs-keyword,\n.light .hljs-formula {\n color: #a626a4;\n}\n\n.light .hljs-section,\n.light .hljs-name,\n.light .hljs-selector-tag,\n.light .hljs-deletion,\n.light .hljs-subst {\n color: #e45649;\n}\n\n.light .hljs-literal {\n color: #0184bb;\n}\n\n.light .hljs-string,\n.light .hljs-regexp,\n.light .hljs-addition,\n.light .hljs-attribute,\n.light .hljs-meta-string {\n color: #50a14f;\n}\n\n.light .hljs-built_in,\n.light .hljs-class .light .hljs-title {\n color: #c18401;\n}\n\n.light .hljs-attr,\n.light .hljs-variable,\n.light .hljs-template-variable,\n.light .hljs-type,\n.light .hljs-selector-class,\n.light .hljs-selector-attr,\n.light .hljs-selector-pseudo,\n.light .hljs-number {\n color: #986801;\n}\n\n.light .hljs-symbol,\n.light .hljs-bullet,\n.light .hljs-link,\n.light .hljs-meta,\n.light .hljs-selector-id,\n.light .hljs-title {\n color: #4078f2;\n}\n\n.light .hljs-emphasis {\n font-style: italic;\n}\n\n.light .hljs-strong {\n font-weight: bold;\n}\n\n.light .hljs-link {\n text-decoration: underline;\n}\n\n/* \n Dumps are hidden asap in errorPage.blade \n What follows is !important\n*/\n\n.tabs pre.sf-dump {\n display: block !important;\n}\n\n.sf-dump-public.sf-dump-highlight,\n.sf-dump-protected.sf-dump-highlight,\n.sf-dump-private.sf-dump-highlight,\n.sf-dump-str.sf-dump-highlight,\n.sf-dump-key.sf-dump-highlight {\n background-color: rgb(251, 245, 255) !important;\n background-color: var(--purple-100) !important;\n border-color: rgb(236, 211, 253) !important;\n border-color: var(--purple-200) !important;\n}\n\n.sf-dump-public.sf-dump-highlight-active,\n.sf-dump-protected.sf-dump-highlight-active,\n.sf-dump-private.sf-dump-highlight-active,\n.sf-dump-str.sf-dump-highlight-active,\n.sf-dump-key.sf-dump-highlight-active {\n background-color: rgb(255, 253, 235) !important;\n background-color: var(--yellow-100) !important;\n border-color: rgb(255, 248, 196) !important;\n border-color: var(--yellow-200) !important;\n}\n\npre.sf-dump .sf-dump-search-wrapper > * {\n border-color: rgb(232, 229, 239) !important;\n border-color: var(--gray-300) !important;\n}\n\npre.sf-dump .sf-dump-search-wrapper > input.sf-dump-search-input {\n font-size: 0.75rem !important;\n background-color: rgb(51, 47, 81) !important;\n background-color: var(--gray-800) !important;\n}\n\npre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next,\npre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous {\n background-color: rgba(0, 0, 150, 0.025) !important;\n background-color: var(--tint-100) !important;\n}\n\npre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-count {\n font-size: 0.875rem !important;\n}\n\npre.sf-dump,\npre.sf-dump .sf-dump-default {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;\n background-color: rgb(247, 247, 252) !important;\n background-color: var(--gray-100) !important;\n color: rgb(51, 47, 81) !important;\n color: var(--gray-800) !important;\n}\n\npre.sf-dump .sf-dump-num {\n color: rgb(250, 133, 162) !important;\n color: var(--red-300) !important;\n}\n\npre.sf-dump .sf-dump-const {\n font-weight: 400 !important;\n}\n\npre.sf-dump .sf-dump-str {\n font-weight: 400 !important;\n color: rgb(142, 137, 162) !important;\n color: var(--gray-600) !important;\n}\n\npre.sf-dump .sf-dump-note {\n color: rgb(122, 122, 255) !important;\n color: var(--blue-400) !important;\n}\n\npre.sf-dump .sf-dump-ref {\n color: rgb(142, 137, 162) !important;\n color: var(--gray-600) !important;\n}\n\npre.sf-dump .sf-dump-public,\npre.sf-dump .sf-dump-protected,\npre.sf-dump .sf-dump-private {\n color: rgb(121, 0, 245) !important;\n color: var(--purple-500) !important;\n}\n\npre.sf-dump .sf-dump-meta {\n color: rgb(121, 0, 245) !important;\n color: var(--purple-500) !important;\n}\n\npre.sf-dump .sf-dump-key {\n color: rgb(113, 7, 220) !important;\n color: var(--purple-600) !important;\n}\n\npre.sf-dump .sf-dump-index {\n color: rgb(122, 122, 255) !important;\n color: var(--blue-400) !important;\n}\n\npre.sf-dump .sf-dump-ellipsis {\n color: rgb(113, 7, 220) !important;\n color: var(--purple-600) !important;\n}\n\n.bg-gray-100{\n background-color: rgb(247, 247, 252) !important;\n background-color: var(--gray-100) !important;\n}\n\n.bg-tint-200{\n background-color: rgba(0, 0, 100, 0.07) !important;\n background-color: var(--tint-200) !important;\n}\n\n.bg-tint-300{\n background-color: rgba(25, 0, 100, 0.1) !important;\n background-color: var(--tint-300) !important;\n}\n\n.bg-tint-600{\n background-color: rgba(30, 20, 70, 0.5) !important;\n background-color: var(--tint-600) !important;\n}\n\n.hover\\:bg-tint-100:hover{\n background-color: rgba(0, 0, 150, 0.025) !important;\n background-color: var(--tint-100) !important;\n}\n\n.hover\\:bg-tint-400:hover{\n background-color: rgba(20, 0, 100, 0.2) !important;\n background-color: var(--tint-400) !important;\n}\n\n.hover\\:bg-tint-700:hover{\n background-color: rgba(15, 10, 60, 0.75) !important;\n background-color: var(--tint-700) !important;\n}\n\n.border-gray-700{\n border-color: rgb(75, 71, 109) !important;\n border-color: var(--gray-700) !important;\n}\n\n.border-tint-200{\n border-color: rgba(0, 0, 100, 0.07) !important;\n border-color: var(--tint-200) !important;\n}\n\n.border-tint-300{\n border-color: rgba(25, 0, 100, 0.1) !important;\n border-color: var(--tint-300) !important;\n}\n\n.rounded-full{\n border-radius: 9999px !important;\n}\n\n.rounded-t{\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.border-none{\n border-style: none !important;\n}\n\n.border-t-2{\n border-top-width: 2px !important;\n}\n\n.border-b{\n border-bottom-width: 1px !important;\n}\n\n.cursor-pointer{\n cursor: pointer !important;\n}\n\n.inline-block{\n display: inline-block !important;\n}\n\n.flex{\n display: flex !important;\n}\n\n.inline-flex{\n display: inline-flex !important;\n}\n\n.hidden{\n display: none !important;\n}\n\n.items-center{\n align-items: center !important;\n}\n\n.items-baseline{\n align-items: baseline !important;\n}\n\n.justify-start{\n justify-content: flex-start !important;\n}\n\n.justify-end{\n justify-content: flex-end !important;\n}\n\n.justify-center{\n justify-content: center !important;\n}\n\n.font-mono{\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;\n}\n\n.font-normal{\n font-weight: 400 !important;\n}\n\n.font-medium{\n font-weight: 500 !important;\n}\n\n.font-semibold{\n font-weight: 600 !important;\n}\n\n.h-5{\n height: 1.25rem !important;\n}\n\n.h-8{\n height: 2rem !important;\n}\n\n.h-full{\n height: 100% !important;\n}\n\n.mx-0{\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.ml-0{\n margin-left: 0 !important;\n}\n\n.mt-1{\n margin-top: 0.25rem !important;\n}\n\n.mr-1{\n margin-right: 0.25rem !important;\n}\n\n.mb-1{\n margin-bottom: 0.25rem !important;\n}\n\n.mt-2{\n margin-top: 0.5rem !important;\n}\n\n.mr-2{\n margin-right: 0.5rem !important;\n}\n\n.mb-2{\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2{\n margin-left: 0.5rem !important;\n}\n\n.mb-3{\n margin-bottom: 0.75rem !important;\n}\n\n.mt-4{\n margin-top: 1rem !important;\n}\n\n.mr-4{\n margin-right: 1rem !important;\n}\n\n.mb-4{\n margin-bottom: 1rem !important;\n}\n\n.ml-6{\n margin-left: 1.5rem !important;\n}\n\n.mt-8{\n margin-top: 2rem !important;\n}\n\n.mt-12{\n margin-top: 3rem !important;\n}\n\n.ml-auto{\n margin-left: auto !important;\n}\n\n.min-h-0{\n min-height: 0 !important;\n}\n\n.min-w-8{\n min-width: 2rem !important;\n}\n\n.opacity-25{\n opacity: 0.25 !important;\n}\n\n.opacity-50{\n opacity: 0.5 !important;\n}\n\n.opacity-75{\n opacity: 0.75 !important;\n}\n\n.overflow-visible{\n overflow: visible !important;\n}\n\n.p-4{\n padding: 1rem !important;\n}\n\n.p-12{\n padding: 3rem !important;\n}\n\n.py-2{\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.px-2{\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n}\n\n.py-4{\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.px-4{\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n}\n\n.px-6{\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n}\n\n.pt-2{\n padding-top: 0.5rem !important;\n}\n\n.pt-10{\n padding-top: 2.5rem !important;\n}\n\n.pointer-events-none{\n pointer-events: none !important;\n}\n\n.static{\n position: static !important;\n}\n\n.absolute{\n position: absolute !important;\n}\n\n.relative{\n position: relative !important;\n}\n\n.sticky{\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.inset-0{\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n}\n\n.top-0{\n top: 0 !important;\n}\n\n.right-0{\n right: 0 !important;\n}\n\n.bottom-0{\n bottom: 0 !important;\n}\n\n.left-0{\n left: 0 !important;\n}\n\n.top-full{\n top: 100% !important;\n}\n\n.left-full{\n left: 100% !important;\n}\n\n.text-left{\n text-align: left !important;\n}\n\n.text-white{\n color: rgb(255, 255, 255) !important;\n color: var(--white) !important;\n}\n\n.text-green-300{\n color: rgb(148, 242, 200) !important;\n color: var(--green-300) !important;\n}\n\n.text-purple-400{\n color: rgb(183, 148, 244) !important;\n color: var(--purple-400) !important;\n}\n\n.text-purple-800{\n color: rgb(79, 15, 143) !important;\n color: var(--purple-800) !important;\n}\n\n.text-gray-200{\n color: rgb(238, 238, 245) !important;\n color: var(--gray-200) !important;\n}\n\n.text-gray-300{\n color: rgb(232, 229, 239) !important;\n color: var(--gray-300) !important;\n}\n\n.text-gray-400{\n color: rgb(209, 204, 224) !important;\n color: var(--gray-400) !important;\n}\n\n.text-gray-500{\n color: rgb(176, 173, 197) !important;\n color: var(--gray-500) !important;\n}\n\n.text-gray-800{\n color: rgb(51, 47, 81) !important;\n color: var(--gray-800) !important;\n}\n\n.text-tint-600{\n color: rgba(30, 20, 70, 0.5) !important;\n color: var(--tint-600) !important;\n}\n\n.hover\\:text-white:hover{\n color: rgb(255, 255, 255) !important;\n color: var(--white) !important;\n}\n\n.hover\\:text-purple-500:hover{\n color: rgb(121, 0, 245) !important;\n color: var(--purple-500) !important;\n}\n\n.text-xs{\n font-size: 0.75rem !important;\n}\n\n.text-sm{\n font-size: 0.875rem !important;\n}\n\n.text-2xl{\n font-size: 1.5rem !important;\n}\n\n.italic{\n font-style: italic !important;\n}\n\n.uppercase{\n text-transform: uppercase !important;\n}\n\n.underline{\n text-decoration: underline !important;\n}\n\n.no-underline{\n text-decoration: none !important;\n}\n\n.tracking-wider{\n letter-spacing: 0.05em !important;\n}\n\n.align-middle{\n vertical-align: middle !important;\n}\n\n.whitespace-no-wrap{\n white-space: nowrap !important;\n}\n\n.w-4{\n width: 1rem !important;\n}\n\n.w-full{\n width: 100% !important;\n}\n\n.z-1{\n z-index: 1 !important;\n}\n\n.z-10{\n z-index: 10 !important;\n}\n\n@media (min-width: 640px){\n\n .sm\\:start-2 {\n grid-column-start: 2;\n }\n\n .sm\\:block{\n display: block !important;\n }\n\n .sm\\:ml-6{\n margin-left: 1.5rem !important;\n }\n}\n\n@media (min-width: 768px){\n\n .md\\:block{\n display: block !important;\n }\n}\n',""])},function(t,e,n){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=function(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var o=(a=r,s=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),c="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s),"/*# ".concat(c," */")),i=r.sources.map((function(t){return"/*# sourceURL=".concat(r.sourceRoot).concat(t," */")}));return[n].concat(i).concat([o]).join("\n")}var a,s,c;return[n].join("\n")}(e,t);return e[2]?"@media ".concat(e[2],"{").concat(n,"}"):n})).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},o=0;o=0&&f.splice(e,1)}function v(t){var e=document.createElement("style");if(void 0===t.attrs.type&&(t.attrs.type="text/css"),void 0===t.attrs.nonce){var r=function(){0;return n.nc}();r&&(t.attrs.nonce=r)}return b(e,t.attrs),m(t,e),e}function b(t,e){Object.keys(e).forEach((function(n){t.setAttribute(n,e[n])}))}function _(t,e){var n,r,o,i;if(e.transform&&t.css){if(!(i="function"==typeof e.transform?e.transform(t.css):e.transform.default(t.css)))return function(){};t.css=i}if(e.singleton){var a=l++;n=u||(u=v(e)),r=k.bind(null,n,a,!1),o=k.bind(null,n,a,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(t){var e=document.createElement("link");return void 0===t.attrs.type&&(t.attrs.type="text/css"),t.attrs.rel="stylesheet",b(e,t.attrs),m(t,e),e}(e),r=w.bind(null,n,e),o=function(){g(n),n.href&&URL.revokeObjectURL(n.href)}):(n=v(e),r=x.bind(null,n),o=function(){g(n)});return r(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;r(t=e)}else o()}}t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(e=e||{}).attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||"boolean"==typeof e.singleton||(e.singleton=a()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=h(t,e);return d(n,e),function(t){for(var r=[],o=0;om.maxDepth)&&a(y)}else if(/\bsf-dump-ref\b/.test(g.className)&&(y=g.getAttribute("href"))&&(y=y.substr(1),g.className+=" "+y,/[\[{]$/.test(g.previousSibling.nodeValue))){y=y!=g.nextSibling.id&&t.getElementById(y);try{p=y.nextSibling,g.appendChild(y),p.parentNode.insertBefore(y,p),/^[@#]/.test(g.innerHTML)?g.innerHTML+=" ▶":(g.innerHTML="▶",g.className="sf-dump-ref"),g.className+=" sf-dump-toggle"}catch(t){"&"==g.innerHTML.charAt(0)&&(g.innerHTML="…",g.className="sf-dump-ref")}}if(t.evaluate&&Array.from&&l.children.length>1){var C=function(t){var e,n,r=t.current();r&&(!function(t){for(var e,n=[];(t=t.parentNode||{})&&(e=t.previousSibling)&&"A"===e.tagName;)n.push(e);0!==n.length&&n.forEach((function(t){s(t)}))}(r),function(t,e,n){u(t),Array.from(n||[]).forEach((function(t){/\bsf-dump-highlight\b/.test(t.className)||(t.className=t.className+" sf-dump-highlight")})),/\bsf-dump-highlight-active\b/.test(e.className)||(e.className=e.className+" sf-dump-highlight-active")}(l,r,t.nodes),"scrollIntoView"in r&&(r.scrollIntoView(!0),e=r.getBoundingClientRect(),n=A.getBoundingClientRect(),e.top0?this.idx-1:this.nodes.length-1,this.current())},isEmpty:function(){return 0===this.count()},current:function(){return this.isEmpty()?null:this.nodes[this.idx]},reset:function(){this.nodes=[],this.idx=0},count:function(){return this.nodes.length}};var A=t.createElement("div");A.className="sf-dump-search-wrapper sf-dump-search-hidden",A.innerHTML='\n \n 0 of 0\n \n \n ',l.insertBefore(A,l.firstChild);var T=new SearchState,S=A.querySelector(".sf-dump-search-input"),R=A.querySelector(".sf-dump-search-count"),O=0,N="";i(S,"keyup",(function(e){var n=e.target.value;n!==N&&(N=n,clearTimeout(O),O=setTimeout((function(){if(T.reset(),c(l),u(l),""!==n){for(var e=["sf-dump-str","sf-dump-key","sf-dump-public","sf-dump-protected","sf-dump-private"].map(x).join(" or "),r=t.evaluate(".//span["+e+"][contains(translate(child::text(), "+k(n.toUpperCase())+", "+k(n.toLowerCase())+"), "+k(n.toLowerCase())+")]",l,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);node=r.iterateNext();)T.nodes.push(node);C(T)}else R.textContent="0 of 0"}),400))})),Array.from(A.querySelectorAll(".sf-dump-search-input-next, .sf-dump-search-input-previous")).forEach((function(t){i(t,"click",(function(t){t.preventDefault(),-1!==t.target.className.indexOf("next")?T.next():T.previous(),S.focus(),c(l),C(T)}))})),i(l,"keydown",(function(t){var e=!/\bsf-dump-search-hidden\b/.test(A.className);if(114===t.keyCode&&!e||E(t)&&70===t.keyCode){if(70===t.keyCode&&document.activeElement===S)return;t.preventDefault(),A.className=A.className.replace(/\bsf-dump-search-hidden\b/,""),S.focus()}else e&&(27===t.keyCode?(A.className+=" sf-dump-search-hidden",t.preventDefault(),u(l),S.value=""):(E(t)&&71===t.keyCode||13===t.keyCode||114===t.keyCode)&&(t.preventDefault(),t.shiftKey?T.previous():T.next(),c(l),C(T)))}))}if(!(0>=m.maxStringLength))try{for(v=(g=l.querySelectorAll(".sf-dump-str")).length,b=0,_=[];b ◀
'+g.innerHTML+' â–¶')}catch(t){}}}(document)},function(t,e,n){var r=function(t){"use strict";var e,n=Object.prototype,r=n.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function c(t,e,n,r){var o=e&&e.prototype instanceof m?e:m,i=Object.create(o.prototype),a=new T(r||[]);return i._invoke=function(t,e,n){var r=l;return function(o,i){if(r===p)throw new Error("Generator is already running");if(r===d){if("throw"===o)throw i;return R()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var s=w(a,n);if(s){if(s===h)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(r===l)throw r=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r=p;var c=u(t,e,n);if("normal"===c.type){if(r=n.done?d:f,c.arg===h)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r=d,n.method="throw",n.arg=c.arg)}}}(t,n,a),i}function u(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var l="suspendedStart",f="suspendedYield",p="executing",d="completed",h={};function m(){}function g(){}function v(){}var b={};b[i]=function(){return this};var _=Object.getPrototypeOf,y=_&&_(_(S([])));y&&y!==n&&r.call(y,i)&&(b=y);var E=v.prototype=m.prototype=Object.create(b);function k(t){["next","throw","return"].forEach((function(e){t[e]=function(t){return this._invoke(e,t)}}))}function x(t){var e;this._invoke=function(n,o){function i(){return new Promise((function(e,i){!function e(n,o,i,a){var s=u(t[n],t,o);if("throw"!==s.type){var c=s.arg,l=c.value;return l&&"object"==typeof l&&r.call(l,"__await")?Promise.resolve(l.__await).then((function(t){e("next",t,i,a)}),(function(t){e("throw",t,i,a)})):Promise.resolve(l).then((function(t){c.value=t,i(c)}),(function(t){return e("throw",t,i,a)}))}a(s.arg)}(n,o,e,i)}))}return e=e?e.then(i,i):i()}}function w(t,n){var r=t.iterator[n.method];if(r===e){if(n.delegate=null,"throw"===n.method){if(t.iterator.return&&(n.method="return",n.arg=e,w(t,n),"throw"===n.method))return h;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var o=u(r,t.iterator,n.arg);if("throw"===o.type)return n.method="throw",n.arg=o.arg,n.delegate=null,h;var i=o.arg;return i?i.done?(n[t.resultName]=i.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,h):i:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,h)}function C(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function A(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(C,this),this.reset(!0)}function S(t){if(t){var n=t[i];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function n(){for(;++o=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=r.call(a,"catchLoc"),u=r.call(a,"finallyLoc");if(c&&u){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),A(n),h}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;A(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:S(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),h}},t}(t.exports);try{regeneratorRuntime=r}catch(t){Function("r","regeneratorRuntime = r")(r)}},function(t,e,n){"use strict";t.exports=n(101)},function(t,e,n){"use strict";var r=n(1),o=n(109),i=n(113),a=n(114),s=n(122),c=n(136),u=n(149),l=n(56),f=n(63),p={default:n(151),zero:n(152),commonmark:n(153)},d=/^(vbscript|javascript|file|data):/,h=/^data:image\/(gif|png|jpeg|webp);/;function m(t){var e=t.trim().toLowerCase();return!d.test(e)||!!h.test(e)}var g=["http:","https:","mailto:"];function v(t){var e=l.parse(t,!0);if(e.hostname&&(!e.protocol||g.indexOf(e.protocol)>=0))try{e.hostname=f.toASCII(e.hostname)}catch(t){}return l.encode(l.format(e))}function b(t){var e=l.parse(t,!0);if(e.hostname&&(!e.protocol||g.indexOf(e.protocol)>=0))try{e.hostname=f.toUnicode(e.hostname)}catch(t){}return l.decode(l.format(e))}function _(t,e){if(!(this instanceof _))return new _(t,e);e||r.isString(t)||(e=t||{},t="default"),this.inline=new c,this.block=new s,this.core=new a,this.renderer=new i,this.linkify=new u,this.validateLink=m,this.normalizeLink=v,this.normalizeLinkText=b,this.utils=r,this.helpers=r.assign({},o),this.options={},this.configure(t),e&&this.set(e)}_.prototype.set=function(t){return r.assign(this.options,t),this},_.prototype.configure=function(t){var e,n=this;if(r.isString(t)&&!(t=p[e=t]))throw new Error('Wrong `markdown-it` preset "'+e+'", check name');if(!t)throw new Error("Wrong `markdown-it` preset, can't be empty");return t.options&&n.set(t.options),t.components&&Object.keys(t.components).forEach((function(e){t.components[e].rules&&n[e].ruler.enableOnly(t.components[e].rules),t.components[e].rules2&&n[e].ruler2.enableOnly(t.components[e].rules2)})),this},_.prototype.enable=function(t,e){var n=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){n=n.concat(this[e].ruler.enable(t,!0))}),this),n=n.concat(this.inline.ruler2.enable(t,!0));var r=t.filter((function(t){return n.indexOf(t)<0}));if(r.length&&!e)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this},_.prototype.disable=function(t,e){var n=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){n=n.concat(this[e].ruler.disable(t,!0))}),this),n=n.concat(this.inline.ruler2.disable(t,!0));var r=t.filter((function(t){return n.indexOf(t)<0}));if(r.length&&!e)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this},_.prototype.use=function(t){var e=[this].concat(Array.prototype.slice.call(arguments,1));return t.apply(t,e),this},_.prototype.parse=function(t,e){if("string"!=typeof t)throw new Error("Input data should be a String");var n=new this.core.State(t,this,e);return this.core.process(n),n.tokens},_.prototype.render=function(t,e){return e=e||{},this.renderer.render(this.parse(t,e),this.options,e)},_.prototype.parseInline=function(t,e){var n=new this.core.State(t,this,e);return n.inlineMode=!0,this.core.process(n),n.tokens},_.prototype.renderInline=function(t,e){return e=e||{},this.renderer.render(this.parseInline(t,e),this.options,e)},t.exports=_},function(t){t.exports=JSON.parse('{"Aacute":"Ã","aacute":"á","Abreve":"Ä‚","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"Ð","acy":"а","AElig":"Æ","aelig":"æ","af":"â¡","Afr":"ð”„","afr":"ð”ž","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ä€","amacr":"Ä","amalg":"⨿","amp":"&","AMP":"&","andand":"â©•","And":"â©“","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"â¦","angsph":"∢","angst":"Ã…","angzarr":"â¼","Aogon":"Ä„","aogon":"Ä…","Aopf":"ð”¸","aopf":"ð•’","apacir":"⩯","ap":"≈","apE":"â©°","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"â¡","approx":"≈","approxeq":"≊","Aring":"Ã…","aring":"Ã¥","Ascr":"ð’œ","ascr":"ð’¶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"â‰","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"â‹","Backslash":"∖","Barv":"â«§","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Î’","beta":"β","beth":"â„¶","between":"≬","Bfr":"ð”…","bfr":"ð”Ÿ","bigcap":"â‹‚","bigcirc":"â—¯","bigcup":"⋃","bigodot":"⨀","bigoplus":"â¨","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"â–½","bigtriangleup":"â–³","biguplus":"⨄","bigvee":"â‹","bigwedge":"â‹€","bkarow":"â¤","blacklozenge":"â§«","blacksquare":"â–ª","blacktriangle":"â–´","blacktriangledown":"â–¾","blacktriangleleft":"â—‚","blacktriangleright":"â–¸","blank":"â£","blk12":"â–’","blk14":"â–‘","blk34":"â–“","block":"â–ˆ","bne":"=⃥","bnequiv":"≡⃥","bNot":"â«­","bnot":"âŒ","Bopf":"ð”¹","bopf":"ð•“","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"â”","boxdL":"â••","boxDl":"â•–","boxDL":"â•—","boxdr":"┌","boxdR":"â•’","boxDr":"â•“","boxDR":"â•”","boxh":"─","boxH":"â•","boxhd":"┬","boxHd":"╤","boxhD":"â•¥","boxHD":"╦","boxhu":"â”´","boxHu":"â•§","boxhU":"╨","boxHU":"â•©","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"â•›","boxUl":"╜","boxUL":"â•","boxur":"â””","boxuR":"╘","boxUr":"â•™","boxUR":"╚","boxv":"│","boxV":"â•‘","boxvh":"┼","boxvH":"╪","boxVh":"â•«","boxVH":"╬","boxvl":"┤","boxvL":"â•¡","boxVl":"â•¢","boxVL":"â•£","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"â• ","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"ð’·","Bscr":"ℬ","bsemi":"â","bsim":"∽","bsime":"â‹","bsolb":"â§…","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"â‰","Bumpeq":"≎","bumpeq":"â‰","Cacute":"Ć","cacute":"ć","capand":"â©„","capbrcup":"⩉","capcap":"â©‹","cap":"∩","Cap":"â‹’","capcup":"⩇","capdot":"â©€","CapitalDifferentialD":"â……","caps":"∩︀","caret":"â","caron":"ˇ","Cayleys":"â„­","ccaps":"â©","Ccaron":"ÄŒ","ccaron":"Ä","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"â©","Cdot":"ÄŠ","cdot":"Ä‹","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"ð” ","Cfr":"â„­","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"âŠ","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"â—‹","cirE":"⧃","cire":"≗","cirfnint":"â¨","cirmid":"⫯","cirscir":"â§‚","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"â€","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"â©´","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"âˆ","compfn":"∘","complement":"âˆ","complexes":"â„‚","cong":"≅","congdot":"â©­","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"ð•”","Copf":"â„‚","coprod":"âˆ","Coproduct":"âˆ","copy":"©","COPY":"©","copysr":"â„—","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"ð’ž","cscr":"ð’¸","csub":"â«","csube":"â«‘","csup":"â«","csupe":"â«’","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"â‰","cup":"∪","Cup":"â‹“","cupcup":"⩊","cupdot":"âŠ","cupor":"â©…","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"â‹","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"â‹","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"â€","Dashv":"⫤","dashv":"⊣","dbkarow":"â¤","dblac":"Ë","Dcaron":"ÄŽ","dcaron":"Ä","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"â……","dd":"â…†","DDotrahd":"⤑","ddotseq":"â©·","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"ð”‡","dfr":"ð”¡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"Ë™","DiacriticalDoubleAcute":"Ë","DiacriticalGrave":"`","DiacriticalTilde":"Ëœ","diam":"â‹„","diamond":"â‹„","Diamond":"â‹„","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"â…†","digamma":"Ï","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"Ñ’","dlcorn":"⌞","dlcrop":"âŒ","dollar":"$","Dopf":"ð”»","dopf":"ð••","Dot":"¨","dot":"Ë™","DotDot":"⃜","doteq":"â‰","doteqdot":"≑","DotEqual":"â‰","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"â‡","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"Ì‘","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"â¥","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"â‡","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"â¤","drcorn":"⌟","drcrop":"⌌","Dscr":"ð’Ÿ","dscr":"ð’¹","DScy":"Ð…","dscy":"Ñ•","dsol":"â§¶","Dstrok":"Ä","dstrok":"Ä‘","dtdot":"⋱","dtri":"â–¿","dtrif":"â–¾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Ð","dzcy":"ÑŸ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"â©®","Ecaron":"Äš","ecaron":"Ä›","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"Ñ","eDDot":"â©·","Edot":"Ä–","edot":"Ä—","eDot":"≑","ee":"â…‡","efDot":"≒","Efr":"ð”ˆ","efr":"ð”¢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"â§","ell":"â„“","els":"⪕","elsdot":"⪗","Emacr":"Ä’","emacr":"Ä“","empty":"∅","emptyset":"∅","EmptySmallSquare":"â—»","emptyv":"∅","EmptyVerySmallSquare":"â–«","emsp13":" ","emsp14":" ","emsp":" ","ENG":"ÅŠ","eng":"Å‹","ensp":" ","Eogon":"Ę","eogon":"Ä™","Eopf":"ð”¼","eopf":"ð•–","epar":"â‹•","eparsl":"â§£","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"â§¥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"â„°","esdot":"â‰","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ã","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"â„°","exponentiale":"â…‡","ExponentialE":"â…‡","fallingdotseq":"≒","Fcy":"Ф","fcy":"Ñ„","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"ð”‰","ffr":"ð”£","filig":"ï¬","FilledSmallSquare":"â—¼","FilledVerySmallSquare":"â–ª","fjlig":"fj","flat":"â™­","fllig":"fl","fltns":"â–±","fnof":"Æ’","Fopf":"ð”½","fopf":"ð•—","forall":"∀","ForAll":"∀","fork":"â‹”","forkv":"â«™","Fouriertrf":"ℱ","fpartint":"â¨","frac12":"½","frac13":"â…“","frac14":"¼","frac15":"â…•","frac16":"â…™","frac18":"â…›","frac23":"â…”","frac25":"â…–","frac34":"¾","frac35":"â…—","frac38":"â…œ","frac45":"â…˜","frac56":"â…š","frac58":"â…","frac78":"â…ž","frasl":"â„","frown":"⌢","fscr":"ð’»","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ïœ","gammad":"Ï","gap":"⪆","Gbreve":"Äž","gbreve":"ÄŸ","Gcedil":"Ä¢","Gcirc":"Äœ","gcirc":"Ä","Gcy":"Г","gcy":"г","Gdot":"Ä ","gdot":"Ä¡","ge":"≥","gE":"≧","gEl":"⪌","gel":"â‹›","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"ð”Š","gfr":"ð”¤","gg":"≫","Gg":"â‹™","ggg":"â‹™","gimel":"â„·","GJcy":"Ѓ","gjcy":"Ñ“","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"â‹§","Gopf":"ð”¾","gopf":"ð•˜","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"â‹›","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"ð’¢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"âª","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"â‹—","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"â‹—","gtreqless":"â‹›","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"â„‹","HARDcy":"Ъ","hardcy":"ÑŠ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"â„","Hcirc":"Ĥ","hcirc":"Ä¥","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"ð”¥","Hfr":"ℌ","HilbertSpace":"â„‹","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"ð•™","Hopf":"â„","horbar":"―","HorizontalLine":"─","hscr":"ð’½","Hscr":"â„‹","hslash":"â„","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"â‰","hybull":"âƒ","hyphen":"â€","Iacute":"Ã","iacute":"í","ic":"â£","Icirc":"ÃŽ","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"ð”¦","Ifr":"â„‘","Igrave":"ÃŒ","igrave":"ì","ii":"â…ˆ","iiiint":"⨌","iiint":"∭","iinfin":"â§œ","iiota":"â„©","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"Ä«","image":"â„‘","ImaginaryI":"â…ˆ","imagline":"â„","imagpart":"â„‘","imath":"ı","Im":"â„‘","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"â„…","in":"∈","infin":"∞","infintie":"â§","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"â‹‚","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"â£","InvisibleTimes":"â¢","IOcy":"Ð","iocy":"Ñ‘","Iogon":"Ä®","iogon":"į","Iopf":"ð•€","iopf":"ð•š","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"ð’¾","Iscr":"â„","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"â‹´","isinsv":"⋳","isinv":"∈","it":"â¢","Itilde":"Ĩ","itilde":"Ä©","Iukcy":"І","iukcy":"Ñ–","Iuml":"Ã","iuml":"ï","Jcirc":"Ä´","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"ð”","jfr":"ð”§","jmath":"È·","Jopf":"ð•","jopf":"ð•›","Jscr":"ð’¥","jscr":"ð’¿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"Ñ”","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"Ä·","Kcy":"К","kcy":"к","Kfr":"ð”Ž","kfr":"ð”¨","kgreen":"ĸ","KHcy":"Ð¥","khcy":"Ñ…","KJcy":"ÐŒ","kjcy":"Ñœ","Kopf":"ð•‚","kopf":"ð•œ","Kscr":"ð’¦","kscr":"ð“€","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"â„’","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"â„’","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"â†","Larr":"↞","lArr":"â‡","larrfs":"â¤","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"â²","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"â¦","lbrkslu":"â¦","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ä»","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"â†","LeftArrow":"â†","Leftarrow":"â‡","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"â‹‹","LeftTriangleBar":"â§","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"â©¿","lesdoto":"âª","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"â‹–","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"ð”","lfr":"ð”©","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"â–„","LJcy":"Љ","ljcy":"Ñ™","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"â—º","Lmidot":"Ä¿","lmidot":"Å€","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"ð•ƒ","lopf":"ð•","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"â—Š","lozenge":"â—Š","lozf":"â§«","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"ð“","Lscr":"â„’","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"âª","lsimg":"âª","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Å","lstrok":"Å‚","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"â‹–","lthree":"â‹‹","ltimes":"⋉","ltlarr":"⥶","ltquest":"â©»","ltri":"â—ƒ","ltrie":"⊴","ltrif":"â—‚","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"â–®","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":"âŸ","Mellintrf":"ℳ","Mfr":"ð”","mfr":"ð”ª","mho":"â„§","micro":"µ","midast":"*","midcir":"â«°","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"â«›","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"ð•„","mopf":"ð•ž","mp":"∓","mscr":"ð“‚","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"Å„","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"â™®","naturals":"â„•","natur":"â™®","nbsp":" ","nbump":"≎̸","nbumpe":"â‰Ì¸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Å…","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"â©‚","Ncy":"Ð","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"â‰Ì¸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"ð”‘","nfr":"ð”«","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"Ñš","nlarr":"↚","nlArr":"â‡","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"â‡","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"â ","NonBreakingSpace":" ","nopf":"ð•Ÿ","Nopf":"â„•","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"â‰Ì¸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"â‹·","notinvc":"â‹¶","NotLeftTriangleBar":"â§Ì¸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"â‹ ","NotReverseElement":"∌","NotRightTriangleBar":"â§Ì¸","NotRightTriangle":"â‹«","NotRightTriangleEqual":"â‹­","NotSquareSubset":"âŠÌ¸","NotSquareSubsetEqual":"â‹¢","NotSquareSuperset":"âŠÌ¸","NotSquareSupersetEqual":"â‹£","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"âŠ","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"â‹¡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"â‰","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"â‹ ","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"â‡","nrarrw":"â†Ì¸","nrightarrow":"↛","nRightarrow":"â‡","nrtri":"â‹«","nrtrie":"â‹­","nsc":"âŠ","nsccue":"â‹¡","nsce":"⪰̸","Nscr":"ð’©","nscr":"ð“ƒ","nshortmid":"∤","nshortparallel":"∦","nsim":"â‰","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"â‹¢","nsqsupe":"â‹£","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"âŠ","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"â‹«","ntrianglerighteq":"â‹­","Nu":"Î","nu":"ν","num":"#","numero":"â„–","numsp":" ","nvap":"â‰âƒ’","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"â§ž","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"âŠ","Odblac":"Å","odblac":"Å‘","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Å’","oelig":"Å“","ofcir":"⦿","Ofr":"ð”’","ofr":"ð”¬","ogon":"Ë›","Ograve":"Ã’","ograve":"ò","ogt":"â§","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"â§€","Omacr":"ÅŒ","omacr":"Å","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"ð•†","oopf":"ð• ","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"â©”","or":"∨","ord":"â©","order":"â„´","orderof":"â„´","ordf":"ª","ordm":"º","origof":"⊶","oror":"â©–","orslope":"â©—","orv":"â©›","oS":"Ⓢ","Oscr":"ð’ª","oscr":"â„´","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"âž","OverBracket":"⎴","OverParenthesis":"âœ","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"ð”“","pfr":"ð”­","Phi":"Φ","phi":"φ","phiv":"Ï•","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"Ï€","pitchfork":"â‹”","piv":"Ï–","planck":"â„","planckh":"ℎ","plankv":"â„","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"ð•¡","Popf":"â„™","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"â„™","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"âˆ","Product":"âˆ","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"âˆ","Proportional":"âˆ","Proportion":"∷","propto":"âˆ","prsim":"≾","prurel":"⊰","Pscr":"ð’«","pscr":"ð“…","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"ð””","qfr":"ð”®","qint":"⨌","qopf":"ð•¢","Qopf":"ℚ","qprime":"â—","Qscr":"ð’¬","qscr":"ð“†","quaternions":"â„","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Å”","racute":"Å•","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"â†","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"â¤","rBarr":"â¤","RBarr":"â¤","rbbrk":"â³","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"â¦","Rcaron":"Ř","rcaron":"Å™","Rcedil":"Å–","rcedil":"Å—","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"Ñ€","rdca":"⤷","rdldhar":"⥩","rdquo":"â€","rdquor":"â€","rdsh":"↳","real":"ℜ","realine":"â„›","realpart":"ℜ","reals":"â„","Re":"ℜ","rect":"â–­","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"ð”¯","Rfr":"ℜ","rHar":"⥤","rhard":"â‡","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"Ï","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"â¥","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"â‡","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"â†","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"â§","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"â¥","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"Ëš","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"â€","rmoustache":"⎱","rmoust":"⎱","rnmid":"â«®","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"ð•£","Ropf":"â„","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"ð“‡","Rscr":"â„›","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"â–¹","rtrie":"⊵","rtrif":"â–¸","rtriltri":"â§Ž","RuleDelayed":"â§´","ruluhar":"⥨","rx":"℞","Sacute":"Åš","sacute":"Å›","sbquo":"‚","scap":"⪸","Scaron":"Å ","scaron":"Å¡","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Åž","scedil":"ÅŸ","Scirc":"Åœ","scirc":"Å","scnap":"⪺","scnE":"⪶","scnsim":"â‹©","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"Ñ","sdotb":"⊡","sdot":"â‹…","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"ð”–","sfr":"ð”°","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"â†","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"Ï‚","sigmav":"Ï‚","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"âª","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"â†","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ÑŒ","solbar":"⌿","solb":"â§„","sol":"/","Sopf":"ð•Š","sopf":"ð•¤","spades":"â™ ","spadesuit":"â™ ","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"âŠ","sqsube":"⊑","sqsubset":"âŠ","sqsubseteq":"⊑","sqsup":"âŠ","sqsupe":"⊒","sqsupset":"âŠ","sqsupseteq":"⊒","square":"â–¡","Square":"â–¡","SquareIntersection":"⊓","SquareSubset":"âŠ","SquareSubsetEqual":"⊑","SquareSuperset":"âŠ","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"â–ª","squ":"â–¡","squf":"â–ª","srarr":"→","Sscr":"ð’®","sscr":"ð“ˆ","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"Ï•","strns":"¯","sub":"⊂","Sub":"â‹","subdot":"⪽","subE":"â«…","sube":"⊆","subedot":"⫃","submult":"â«","subnE":"â«‹","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"â‹","subseteq":"⊆","subseteqq":"â«…","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"â«‹","subsim":"⫇","subsub":"â«•","subsup":"â«“","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"â‹©","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"â‹‘","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"â«„","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"â«—","suplarr":"⥻","supmult":"â«‚","supnE":"⫌","supne":"⊋","supplus":"â«€","supset":"⊃","Supset":"â‹‘","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"â«”","supsup":"â«–","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"Ï„","tbrk":"⎴","Tcaron":"Ť","tcaron":"Å¥","Tcedil":"Å¢","tcedil":"Å£","Tcy":"Т","tcy":"Ñ‚","tdot":"⃛","telrec":"⌕","Tfr":"ð”—","tfr":"ð”±","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"Ï‘","thetav":"Ï‘","thickapprox":"≈","thicksim":"∼","ThickSpace":"âŸâ€Š","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"Ëœ","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"ð•‹","topf":"ð•¥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"â„¢","TRADE":"â„¢","triangle":"â–µ","triangledown":"â–¿","triangleleft":"â—ƒ","trianglelefteq":"⊴","triangleq":"≜","triangleright":"â–¹","trianglerighteq":"⊵","tridot":"â—¬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"â§","tritime":"⨻","trpezium":"â¢","Tscr":"ð’¯","tscr":"ð“‰","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"Ñ›","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"ÐŽ","ubrcy":"Ñž","Ubreve":"Ŭ","ubreve":"Å­","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"ð”˜","ufr":"ð”²","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"â–€","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"âŒ","ultri":"â—¸","Umacr":"Ū","umacr":"Å«","uml":"¨","UnderBar":"_","UnderBrace":"âŸ","UnderBracket":"⎵","UnderParenthesis":"â","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"ð•Œ","uopf":"ð•¦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"Ï…","Upsi":"Ï’","upsih":"Ï’","Upsilon":"Î¥","upsilon":"Ï…","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"âŒ","urcorner":"âŒ","urcrop":"⌎","Uring":"Å®","uring":"ů","urtri":"â—¹","Uscr":"ð’°","uscr":"ð“Š","utdot":"â‹°","Utilde":"Ũ","utilde":"Å©","utri":"â–µ","utrif":"â–´","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"Ï•","varpi":"Ï–","varpropto":"âˆ","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"Ï‚","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"Ï‘","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"â««","vBarv":"â«©","Vcy":"Ð’","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"â‹","veeeq":"≚","vellip":"â‹®","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"â˜","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"ð”™","vfr":"ð”³","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"ð•","vopf":"ð•§","vprop":"âˆ","vrtri":"⊳","Vscr":"ð’±","vscr":"ð“‹","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Å´","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"â‹€","wedgeq":"≙","weierp":"℘","Wfr":"ð”š","wfr":"ð”´","Wopf":"ð•Ž","wopf":"ð•¨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"ð’²","wscr":"ð“Œ","xcap":"â‹‚","xcirc":"â—¯","xcup":"⋃","xdtri":"â–½","Xfr":"ð”›","xfr":"ð”µ","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"â‹»","xodot":"⨀","Xopf":"ð•","xopf":"ð•©","xoplus":"â¨","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"ð’³","xscr":"ð“","xsqcup":"⨆","xuplus":"⨄","xutri":"â–³","xvee":"â‹","xwedge":"â‹€","Yacute":"Ã","yacute":"ý","YAcy":"Я","yacy":"Ñ","Ycirc":"Ŷ","ycirc":"Å·","Ycy":"Ы","ycy":"Ñ‹","yen":"Â¥","Yfr":"ð”œ","yfr":"ð”¶","YIcy":"Ї","yicy":"Ñ—","Yopf":"ð•","yopf":"ð•ª","Yscr":"ð’´","yscr":"ð“Ž","YUcy":"Ю","yucy":"ÑŽ","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Å»","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"ð”·","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"â‡","zopf":"ð•«","Zopf":"ℤ","Zscr":"ð’µ","zscr":"ð“","zwj":"â€","zwnj":"‌"}')},function(t,e,n){"use strict";var r={};function o(t,e,n){var i,a,s,c,u,l="";for("string"!=typeof e&&(n=e,e=o.defaultChars),void 0===n&&(n=!0),u=function(t){var e,n,o=r[t];if(o)return o;for(o=r[t]=[],e=0;e<128;e++)n=String.fromCharCode(e),/^[0-9a-z]$/i.test(n)?o.push(n):o.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2));for(e=0;e=55296&&s<=57343){if(s>=55296&&s<=56319&&i+1=56320&&c<=57343){l+=encodeURIComponent(t[i]+t[i+1]),i++;continue}l+="%EF%BF%BD"}else l+=encodeURIComponent(t[i]);return l}o.defaultChars=";/?:@&=+$,-_.!~*'()#",o.componentChars="-_.!~*'()",t.exports=o},function(t,e,n){"use strict";var r={};function o(t,e){var n;return"string"!=typeof e&&(e=o.defaultChars),n=function(t){var e,n,o=r[t];if(o)return o;for(o=r[t]=[],e=0;e<128;e++)n=String.fromCharCode(e),o.push(n);for(e=0;e=55296&&c<=57343?"���":String.fromCharCode(c),e+=6):240==(248&o)&&e+91114111?u+="����":(c-=65536,u+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),e+=9):u+="�";return u}))}o.defaultChars=";/?:@&=+$,#",o.componentChars="",t.exports=o},function(t,e,n){"use strict";t.exports=function(t){var e="";return e+=t.protocol||"",e+=t.slashes?"//":"",e+=t.auth?t.auth+"@":"",t.hostname&&-1!==t.hostname.indexOf(":")?e+="["+t.hostname+"]":e+=t.hostname||"",e+=t.port?":"+t.port:"",e+=t.pathname||"",e+=t.search||"",e+=t.hash||""}},function(t,e,n){"use strict";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,a=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,s=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(s),u=["%","/","?",";","#"].concat(c),l=["/","?","#"],f=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,d={javascript:!0,"javascript:":!0},h={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};r.prototype.parse=function(t,e){var n,r,i,s,c,m=t;if(m=m.trim(),!e&&1===t.split("#").length){var g=a.exec(m);if(g)return this.pathname=g[1],g[2]&&(this.search=g[2]),this}var v=o.exec(m);if(v&&(i=(v=v[0]).toLowerCase(),this.protocol=v,m=m.substr(v.length)),(e||v||m.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(c="//"===m.substr(0,2))||v&&d[v]||(m=m.substr(2),this.slashes=!0)),!d[v]&&(c||v&&!h[v])){var b,_,y=-1;for(n=0;n127?C+="x":C+=w[A];if(!C.match(f)){var S=x.slice(0,n),R=x.slice(n+1),O=w.match(p);O&&(S.push(O[1]),R.unshift(O[2])),R.length&&(m=R.join(".")+m),this.hostname=S.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),k&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var N=m.indexOf("#");-1!==N&&(this.hash=m.substr(N),m=m.slice(0,N));var L=m.indexOf("?");return-1!==L&&(this.search=m.substr(L),m=m.slice(0,L)),m&&(this.pathname=m),h[i]&&this.hostname&&!this.pathname&&(this.pathname=""),this},r.prototype.parseHost=function(t){var e=i.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)},t.exports=function(t,e){if(t&&t instanceof r)return t;var n=new r;return n.parse(t,e),n}},function(t,e,n){"use strict";e.Any=n(57),e.Cc=n(58),e.Cf=n(108),e.P=n(36),e.Z=n(59)},function(t,e){t.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(t,e,n){"use strict";e.parseLinkLabel=n(110),e.parseLinkDestination=n(111),e.parseLinkTitle=n(112)},function(t,e,n){"use strict";t.exports=function(t,e,n){var r,o,i,a,s=-1,c=t.posMax,u=t.pos;for(t.pos=e+1,r=1;t.pos=n)return c;if(34!==(i=t.charCodeAt(e))&&39!==i&&40!==i)return c;for(e++,40===i&&(i=41);e"+i(t[e].content)+""},a.code_block=function(t,e,n,r,o){var a=t[e];return""+i(t[e].content)+"\n"},a.fence=function(t,e,n,r,a){var s,c,u,l,f=t[e],p=f.info?o(f.info).trim():"",d="";return p&&(d=p.split(/\s+/g)[0]),0===(s=n.highlight&&n.highlight(f.content,d)||i(f.content)).indexOf(""+s+"\n"):"
"+s+"
\n"},a.image=function(t,e,n,r,o){var i=t[e];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,n,r),o.renderToken(t,e,n)},a.hardbreak=function(t,e,n){return n.xhtmlOut?"
\n":"
\n"},a.softbreak=function(t,e,n){return n.breaks?n.xhtmlOut?"
\n":"
\n":"\n"},a.text=function(t,e){return i(t[e].content)},a.html_block=function(t,e){return t[e].content},a.html_inline=function(t,e){return t[e].content},s.prototype.renderAttrs=function(t){var e,n,r;if(!t.attrs)return"";for(r="",e=0,n=t.attrs.length;e\n":">")},s.prototype.renderInline=function(t,e,n){for(var r,o="",i=this.rules,a=0,s=t.length;a/i.test(t)}t.exports=function(t){var e,n,i,a,s,c,u,l,f,p,d,h,m,g,v,b,_,y,E=t.tokens;if(t.md.options.linkify)for(n=0,i=E.length;n=0;e--)if("link_close"!==(c=a[e]).type){if("html_inline"===c.type&&(y=c.content,/^\s]/i.test(y)&&m>0&&m--,o(c.content)&&m++),!(m>0)&&"text"===c.type&&t.md.linkify.test(c.content)){for(f=c.content,_=t.md.linkify.match(f),u=[],h=c.level,d=0,l=0;l<_.length;l++)g=_[l].url,v=t.md.normalizeLink(g),t.md.validateLink(v)&&(b=_[l].text,b=_[l].schema?"mailto:"!==_[l].schema||/^mailto:/i.test(b)?t.md.normalizeLinkText(b):t.md.normalizeLinkText("mailto:"+b).replace(/^mailto:/,""):t.md.normalizeLinkText("http://"+b).replace(/^http:\/\//,""),(p=_[l].index)>d&&((s=new t.Token("text","",0)).content=f.slice(d,p),s.level=h,u.push(s)),(s=new t.Token("link_open","a",1)).attrs=[["href",v]],s.level=h++,s.markup="linkify",s.info="auto",u.push(s),(s=new t.Token("text","",0)).content=b,s.level=h,u.push(s),(s=new t.Token("link_close","a",-1)).level=--h,s.markup="linkify",s.info="auto",u.push(s),d=_[l].lastIndex);d=0;e--)"text"!==(n=t[e]).type||r||(n.content=n.content.replace(i,s)),"link_open"===n.type&&"auto"===n.info&&r--,"link_close"===n.type&&"auto"===n.info&&r++}function u(t){var e,n,o=0;for(e=t.length-1;e>=0;e--)"text"!==(n=t[e]).type||o||r.test(n.content)&&(n.content=n.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),"link_open"===n.type&&"auto"===n.info&&o--,"link_close"===n.type&&"auto"===n.info&&o++}t.exports=function(t){var e;if(t.md.options.typographer)for(e=t.tokens.length-1;e>=0;e--)"inline"===t.tokens[e].type&&(o.test(t.tokens[e].content)&&c(t.tokens[e].children),r.test(t.tokens[e].content)&&u(t.tokens[e].children))}},function(t,e,n){"use strict";var r=n(1).isWhiteSpace,o=n(1).isPunctChar,i=n(1).isMdAsciiPunct,a=/['"]/,s=/['"]/g,c="’";function u(t,e,n){return t.substr(0,e)+n+t.substr(e+1)}function l(t,e){var n,a,l,f,p,d,h,m,g,v,b,_,y,E,k,x,w,C,A,T,S;for(A=[],n=0;n=0&&!(A[w].level<=h);w--);if(A.length=w+1,"text"===a.type){p=0,d=(l=a.content).length;t:for(;p=0)g=l.charCodeAt(f.index-1);else for(w=n-1;w>=0&&("softbreak"!==t[w].type&&"hardbreak"!==t[w].type);w--)if("text"===t[w].type){g=t[w].content.charCodeAt(t[w].content.length-1);break}if(v=32,p=48&&g<=57&&(x=k=!1),k&&x&&(k=!1,x=_),k||x){if(x)for(w=A.length-1;w>=0&&(m=A[w],!(A[w].level=0;e--)"inline"===t.tokens[e].type&&a.test(t.tokens[e].content)&&l(t.tokens[e].children,t)}},function(t,e,n){"use strict";var r=n(38);function o(t,e,n){this.src=t,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=e}o.prototype.Token=r,t.exports=o},function(t,e,n){"use strict";var r=n(37),o=[["table",n(123),["paragraph","reference"]],["code",n(124)],["fence",n(125),["paragraph","reference","blockquote","list"]],["blockquote",n(126),["paragraph","reference","blockquote","list"]],["hr",n(127),["paragraph","reference","blockquote","list"]],["list",n(128),["paragraph","reference","blockquote"]],["reference",n(129)],["heading",n(130),["paragraph","reference","blockquote"]],["lheading",n(131)],["html_block",n(132),["paragraph","reference","blockquote"]],["paragraph",n(134)]];function i(){this.ruler=new r;for(var t=0;t=n))&&!(t.sCount[a]=c){t.line=n;break}for(r=0;rn)return!1;if(f=e+1,t.sCount[f]=4)return!1;if((u=t.bMarks[f]+t.tShift[f])>=t.eMarks[f])return!1;if(124!==(s=t.src.charCodeAt(u++))&&45!==s&&58!==s)return!1;for(;u=4)return!1;if((d=(p=i(c.replace(/^\||\|$/g,""))).length)>m.length)return!1;if(a)return!0;for((h=t.push("table_open","table",1)).map=v=[e,0],(h=t.push("thead_open","thead",1)).map=[e,e+1],(h=t.push("tr_open","tr",1)).map=[e,e+1],l=0;l=4);f++){for(p=i(c.replace(/^\||\|$/g,"")),h=t.push("tr_open","tr",1),l=0;l=4))break;o=++r}return t.line=o,(i=t.push("code_block","code",0)).content=t.getLines(e,o,4+t.blkIndent,!0),i.map=[e,t.line],!0}},function(t,e,n){"use strict";t.exports=function(t,e,n,r){var o,i,a,s,c,u,l,f=!1,p=t.bMarks[e]+t.tShift[e],d=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(p+3>d)return!1;if(126!==(o=t.src.charCodeAt(p))&&96!==o)return!1;if(c=p,(i=(p=t.skipChars(p,o))-c)<3)return!1;if(l=t.src.slice(c,p),a=t.src.slice(p,d),96===o&&a.indexOf(String.fromCharCode(o))>=0)return!1;if(r)return!0;for(s=e;!(++s>=n)&&!((p=c=t.bMarks[s]+t.tShift[s])<(d=t.eMarks[s])&&t.sCount[s]=4||(p=t.skipChars(p,o))-c=4)return!1;if(62!==t.src.charCodeAt(A++))return!1;if(o)return!0;for(c=d=t.sCount[e]+A-(t.bMarks[e]+t.tShift[e]),32===t.src.charCodeAt(A)?(A++,c++,d++,i=!1,y=!0):9===t.src.charCodeAt(A)?(y=!0,(t.bsCount[e]+d)%4==3?(A++,c++,d++,i=!1):i=!0):y=!1,h=[t.bMarks[e]],t.bMarks[e]=A;A=T,b=[t.sCount[e]],t.sCount[e]=d-c,_=[t.tShift[e]],t.tShift[e]=A-t.bMarks[e],k=t.md.block.ruler.getRules("blockquote"),v=t.parentType,t.parentType="blockquote",w=!1,p=e+1;p=(T=t.eMarks[p])));p++)if(62!==t.src.charCodeAt(A++)||w){if(l)break;for(E=!1,s=0,u=k.length;s=T,m.push(t.bsCount[p]),t.bsCount[p]=t.sCount[p]+1+(y?1:0),b.push(t.sCount[p]),t.sCount[p]=d-c,_.push(t.tShift[p]),t.tShift[p]=A-t.bMarks[p]}for(g=t.blkIndent,t.blkIndent=0,(x=t.push("blockquote_open","blockquote",1)).markup=">",x.map=f=[e,0],t.md.block.tokenize(t,e,p),(x=t.push("blockquote_close","blockquote",-1)).markup=">",t.lineMax=C,t.parentType=v,f[1]=t.line,s=0;s<_.length;s++)t.bMarks[s+e]=h[s],t.tShift[s+e]=_[s],t.sCount[s+e]=b[s],t.bsCount[s+e]=m[s];return t.blkIndent=g,!0}},function(t,e,n){"use strict";var r=n(1).isSpace;t.exports=function(t,e,n,o){var i,a,s,c,u=t.bMarks[e]+t.tShift[e],l=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(42!==(i=t.src.charCodeAt(u++))&&45!==i&&95!==i)return!1;for(a=1;u=a)return-1;if((n=t.src.charCodeAt(i++))<48||n>57)return-1;for(;;){if(i>=a)return-1;if(!((n=t.src.charCodeAt(i++))>=48&&n<=57)){if(41===n||46===n)break;return-1}if(i-o>=10)return-1}return i=4)return!1;if(t.listIndent>=0&&t.sCount[e]-t.listIndent>=4&&t.sCount[e]=t.blkIndent&&(D=!0),(S=i(t,e))>=0){if(p=!0,O=t.bMarks[e]+t.tShift[e],b=Number(t.src.substr(O,S-O-1)),D&&1!==b)return!1}else{if(!((S=o(t,e))>=0))return!1;p=!1}if(D&&t.skipSpaces(S)>=t.eMarks[e])return!1;if(v=t.src.charCodeAt(S-1),r)return!0;for(g=t.tokens.length,p?(I=t.push("ordered_list_open","ol",1),1!==b&&(I.attrs=[["start",b]])):I=t.push("bullet_list_open","ul",1),I.map=m=[e,0],I.markup=String.fromCharCode(v),y=e,R=!1,L=t.md.block.ruler.getRules("list"),x=t.parentType,t.parentType="list";y=_?1:E-f)>4&&(l=1),u=f+l,(I=t.push("list_item_open","li",1)).markup=String.fromCharCode(v),I.map=d=[e,0],A=t.tight,C=t.tShift[e],w=t.sCount[e],k=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=u,t.tight=!0,t.tShift[e]=s-t.bMarks[e],t.sCount[e]=E,s>=_&&t.isEmpty(e+1)?t.line=Math.min(t.line+2,n):t.md.block.tokenize(t,e,n,!0),t.tight&&!R||(M=!1),R=t.line-e>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=k,t.tShift[e]=C,t.sCount[e]=w,t.tight=A,(I=t.push("list_item_close","li",-1)).markup=String.fromCharCode(v),y=e=t.line,d[1]=y,s=t.bMarks[e],y>=n)break;if(t.sCount[y]=4)break;for(N=!1,c=0,h=L.length;c=4)return!1;if(91!==t.src.charCodeAt(x))return!1;for(;++x3||t.sCount[C]<0)){for(_=!1,f=0,p=y.length;f=4)return!1;if(35!==(i=t.src.charCodeAt(u))||u>=l)return!1;for(a=1,i=t.src.charCodeAt(++u);35===i&&u6||uu&&r(t.src.charCodeAt(s-1))&&(l=s),t.line=e+1,(c=t.push("heading_open","h"+String(a),1)).markup="########".slice(0,a),c.map=[e,t.line],(c=t.push("inline","",0)).content=t.src.slice(u,l).trim(),c.map=[e,t.line],c.children=[],(c=t.push("heading_close","h"+String(a),-1)).markup="########".slice(0,a),!0))}},function(t,e,n){"use strict";t.exports=function(t,e,n){var r,o,i,a,s,c,u,l,f,p,d=e+1,h=t.md.block.ruler.getRules("paragraph");if(t.sCount[e]-t.blkIndent>=4)return!1;for(p=t.parentType,t.parentType="paragraph";d3)){if(t.sCount[d]>=t.blkIndent&&(c=t.bMarks[d]+t.tShift[d])<(u=t.eMarks[d])&&(45===(f=t.src.charCodeAt(c))||61===f)&&(c=t.skipChars(c,f),(c=t.skipSpaces(c))>=u)){l=61===f?1:2;break}if(!(t.sCount[d]<0)){for(o=!1,i=0,a=h.length;i|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(o.source+"\\s*$"),/^$/,!1]];t.exports=function(t,e,n,r){var o,a,s,c,u=t.bMarks[e]+t.tShift[e],l=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(!t.md.options.html)return!1;if(60!==t.src.charCodeAt(u))return!1;for(c=t.src.slice(u,l),o=0;o3||t.sCount[c]<0)){for(r=!1,o=0,i=u.length;o0&&this.level++,this.tokens.push(o),o},i.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]},i.prototype.skipEmptyLines=function(t){for(var e=this.lineMax;te;)if(!o(this.src.charCodeAt(--t)))return t+1;return t},i.prototype.skipChars=function(t,e){for(var n=this.src.length;tn;)if(e!==this.src.charCodeAt(--t))return t+1;return t},i.prototype.getLines=function(t,e,n,r){var i,a,s,c,u,l,f,p=t;if(t>=e)return"";for(l=new Array(e-t),i=0;pn?new Array(a-n+1).join(" ")+this.src.slice(c,u):this.src.slice(c,u)}return l.join("")},i.prototype.Token=r,t.exports=i},function(t,e,n){"use strict";var r=n(37),o=[["text",n(137)],["newline",n(138)],["escape",n(139)],["backticks",n(140)],["strikethrough",n(61).tokenize],["emphasis",n(62).tokenize],["link",n(141)],["image",n(142)],["autolink",n(143)],["html_inline",n(144)],["entity",n(145)]],i=[["balance_pairs",n(146)],["strikethrough",n(61).postProcess],["emphasis",n(62).postProcess],["text_collapse",n(147)]];function a(){var t;for(this.ruler=new r,t=0;t=i)break}else t.pending+=t.src[t.pos++]}t.pending&&t.pushPending()},a.prototype.parse=function(t,e,n,r){var o,i,a,s=new this.State(t,e,n,r);for(this.tokenize(s),a=(i=this.ruler2.getRules("")).length,o=0;o=0&&32===t.pending.charCodeAt(n)?n>=1&&32===t.pending.charCodeAt(n-1)?(t.pending=t.pending.replace(/ +$/,""),t.push("hardbreak","br",0)):(t.pending=t.pending.slice(0,-1),t.push("softbreak","br",0)):t.push("softbreak","br",0)),i++;i?@[]^_`{|}~-".split("").forEach((function(t){o[t.charCodeAt(0)]=1})),t.exports=function(t,e){var n,i=t.pos,a=t.posMax;if(92!==t.src.charCodeAt(i))return!1;if(++i=m)return!1;for(g=u,(l=t.md.helpers.parseLinkDestination(t.src,u,t.posMax)).ok&&(d=t.md.normalizeLink(l.str),t.md.validateLink(d)?u=l.pos:d=""),g=u;u=m||41!==t.src.charCodeAt(u))&&(v=!0),u++}if(v){if(void 0===t.env.references)return!1;if(u=0?a=t.src.slice(g,u++):u=s+1):u=s+1,a||(a=t.src.slice(c,s)),!(f=t.env.references[r(a)]))return t.pos=h,!1;d=f.href,p=f.title}return e||(t.pos=c,t.posMax=s,t.push("link_open","a",1).attrs=n=[["href",d]],p&&n.push(["title",p]),t.md.inline.tokenize(t),t.push("link_close","a",-1)),t.pos=u,t.posMax=m,!0}},function(t,e,n){"use strict";var r=n(1).normalizeReference,o=n(1).isSpace;t.exports=function(t,e){var n,i,a,s,c,u,l,f,p,d,h,m,g,v="",b=t.pos,_=t.posMax;if(33!==t.src.charCodeAt(t.pos))return!1;if(91!==t.src.charCodeAt(t.pos+1))return!1;if(u=t.pos+2,(c=t.md.helpers.parseLinkLabel(t,t.pos+1,!1))<0)return!1;if((l=c+1)<_&&40===t.src.charCodeAt(l)){for(l++;l<_&&(i=t.src.charCodeAt(l),o(i)||10===i);l++);if(l>=_)return!1;for(g=l,(p=t.md.helpers.parseLinkDestination(t.src,l,t.posMax)).ok&&(v=t.md.normalizeLink(p.str),t.md.validateLink(v)?l=p.pos:v=""),g=l;l<_&&(i=t.src.charCodeAt(l),o(i)||10===i);l++);if(p=t.md.helpers.parseLinkTitle(t.src,l,t.posMax),l<_&&g!==l&&p.ok)for(d=p.str,l=p.pos;l<_&&(i=t.src.charCodeAt(l),o(i)||10===i);l++);else d="";if(l>=_||41!==t.src.charCodeAt(l))return t.pos=b,!1;l++}else{if(void 0===t.env.references)return!1;if(l<_&&91===t.src.charCodeAt(l)?(g=l+1,(l=t.md.helpers.parseLinkLabel(t,l))>=0?s=t.src.slice(g,l++):l=c+1):l=c+1,s||(s=t.src.slice(u,c)),!(f=t.env.references[r(s)]))return t.pos=b,!1;v=f.href,d=f.title}return e||(a=t.src.slice(u,c),t.md.inline.parse(a,t.md,t.env,m=[]),(h=t.push("image","img",0)).attrs=n=[["src",v],["alt",""]],h.children=m,h.content=a,d&&n.push(["title",d])),t.pos=l,t.posMax=_,!0}},function(t,e,n){"use strict";var r=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,o=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;t.exports=function(t,e){var n,i,a,s,c,u,l=t.pos;return 60===t.src.charCodeAt(l)&&(!((n=t.src.slice(l)).indexOf(">")<0)&&(o.test(n)?(s=(i=n.match(o))[0].slice(1,-1),c=t.md.normalizeLink(s),!!t.md.validateLink(c)&&(e||((u=t.push("link_open","a",1)).attrs=[["href",c]],u.markup="autolink",u.info="auto",(u=t.push("text","",0)).content=t.md.normalizeLinkText(s),(u=t.push("link_close","a",-1)).markup="autolink",u.info="auto"),t.pos+=i[0].length,!0)):!!r.test(n)&&(s=(a=n.match(r))[0].slice(1,-1),c=t.md.normalizeLink("mailto:"+s),!!t.md.validateLink(c)&&(e||((u=t.push("link_open","a",1)).attrs=[["href",c]],u.markup="autolink",u.info="auto",(u=t.push("text","",0)).content=t.md.normalizeLinkText(s),(u=t.push("link_close","a",-1)).markup="autolink",u.info="auto"),t.pos+=a[0].length,!0))))}},function(t,e,n){"use strict";var r=n(60).HTML_TAG_RE;t.exports=function(t,e){var n,o,i,a=t.pos;return!!t.md.options.html&&(i=t.posMax,!(60!==t.src.charCodeAt(a)||a+2>=i)&&(!(33!==(n=t.src.charCodeAt(a+1))&&63!==n&&47!==n&&!function(t){var e=32|t;return e>=97&&e<=122}(n))&&(!!(o=t.src.slice(a).match(r))&&(e||(t.push("html_inline","",0).content=t.src.slice(a,a+o[0].length)),t.pos+=o[0].length,!0))))}},function(t,e,n){"use strict";var r=n(55),o=n(1).has,i=n(1).isValidEntityCode,a=n(1).fromCodePoint,s=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;t.exports=function(t,e){var n,u,l=t.pos,f=t.posMax;if(38!==t.src.charCodeAt(l))return!1;if(l+1=0;){if((o=i[n]).open&&o.marker===r.marker&&o.end<0&&o.level===r.level){var s=!1;if((o.close||r.open)&&void 0!==o.length&&void 0!==r.length&&(o.length+r.length)%3==0&&(o.length%3==0&&r.length%3==0||(s=!0)),!s){r.jump=e-n,r.open=!1,o.end=e,o.jump=0;break}}n-=o.jump+1}}},function(t,e,n){"use strict";t.exports=function(t){var e,n,r=0,o=t.tokens,i=t.tokens.length;for(e=n=0;e0&&r++,"text"===o[e].type&&e+10&&this.level++,this.pendingLevel=this.level,this.tokens.push(o),o},s.prototype.scanDelims=function(t,e){var n,r,s,c,u,l,f,p,d,h=t,m=!0,g=!0,v=this.posMax,b=this.src.charCodeAt(t);for(n=t>0?this.src.charCodeAt(t-1):32;h=3&&":"===t[e-3]?0:e>=3&&"/"===t[e-3]?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(t,e,n){var r=t.slice(e);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},u="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",l="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function f(t){var e=t.re=n(150)(t.__opts__),r=t.__tlds__.slice();function s(t){return t.replace("%TLDS%",e.src_tlds)}t.onCompile(),t.__tlds_replaced__||r.push(u),r.push(e.src_xn),e.src_tlds=r.join("|"),e.email_fuzzy=RegExp(s(e.tpl_email_fuzzy),"i"),e.link_fuzzy=RegExp(s(e.tpl_link_fuzzy),"i"),e.link_no_ip_fuzzy=RegExp(s(e.tpl_link_no_ip_fuzzy),"i"),e.host_fuzzy_test=RegExp(s(e.tpl_host_fuzzy_test),"i");var c=[];function l(t,e){throw new Error('(LinkifyIt) Invalid schema "'+t+'": '+e)}t.__compiled__={},Object.keys(t.__schemas__).forEach((function(e){var n=t.__schemas__[e];if(null!==n){var r={validate:null,link:null};if(t.__compiled__[e]=r,"[object Object]"===o(n))return!function(t){return"[object RegExp]"===o(t)}(n.validate)?i(n.validate)?r.validate=n.validate:l(e,n):r.validate=function(t){return function(e,n){var r=e.slice(n);return t.test(r)?r.match(t)[0].length:0}}(n.validate),void(i(n.normalize)?r.normalize=n.normalize:n.normalize?l(e,n):r.normalize=function(t,e){e.normalize(t)});!function(t){return"[object String]"===o(t)}(n)?l(e,n):c.push(e)}})),c.forEach((function(e){t.__compiled__[t.__schemas__[e]]&&(t.__compiled__[e].validate=t.__compiled__[t.__schemas__[e]].validate,t.__compiled__[e].normalize=t.__compiled__[t.__schemas__[e]].normalize)})),t.__compiled__[""]={validate:null,normalize:function(t,e){e.normalize(t)}};var f=Object.keys(t.__compiled__).filter((function(e){return e.length>0&&t.__compiled__[e]})).map(a).join("|");t.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+f+")","i"),t.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+f+")","ig"),t.re.pretest=RegExp("("+t.re.schema_test.source+")|("+t.re.host_fuzzy_test.source+")|@","i"),function(t){t.__index__=-1,t.__text_cache__=""}(t)}function p(t,e){var n=t.__index__,r=t.__last_index__,o=t.__text_cache__.slice(n,r);this.schema=t.__schema__.toLowerCase(),this.index=n+e,this.lastIndex=r+e,this.raw=o,this.text=o,this.url=o}function d(t,e){var n=new p(t,e);return t.__compiled__[n.schema].normalize(n,t),n}function h(t,e){if(!(this instanceof h))return new h(t,e);var n;e||(n=t,Object.keys(n||{}).reduce((function(t,e){return t||s.hasOwnProperty(e)}),!1)&&(e=t,t={})),this.__opts__=r({},s,e),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=r({},c,t),this.__compiled__={},this.__tlds__=l,this.__tlds_replaced__=!1,this.re={},f(this)}h.prototype.add=function(t,e){return this.__schemas__[t]=e,f(this),this},h.prototype.set=function(t){return this.__opts__=r(this.__opts__,t),this},h.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var e,n,r,o,i,a,s,c;if(this.re.schema_test.test(t))for((s=this.re.schema_search).lastIndex=0;null!==(e=s.exec(t));)if(o=this.testSchemaAt(t,e[2],s.lastIndex)){this.__schema__=e[2],this.__index__=e.index+e[1].length,this.__last_index__=e.index+e[0].length+o;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(r=t.match(this.re.email_fuzzy))&&(i=r.index+r[1].length,a=r.index+r[0].length,(this.__index__<0||ithis.__last_index__)&&(this.__schema__="mailto:",this.__index__=i,this.__last_index__=a)),this.__index__>=0},h.prototype.pretest=function(t){return this.re.pretest.test(t)},h.prototype.testSchemaAt=function(t,e,n){return this.__compiled__[e.toLowerCase()]?this.__compiled__[e.toLowerCase()].validate(t,n,this):0},h.prototype.match=function(t){var e=0,n=[];this.__index__>=0&&this.__text_cache__===t&&(n.push(d(this,e)),e=this.__last_index__);for(var r=e?t.slice(e):t;this.test(r);)n.push(d(this,e)),r=r.slice(this.__last_index__),e+=this.__last_index__;return n.length?n:null},h.prototype.tlds=function(t,e){return t=Array.isArray(t)?t:[t],e?(this.__tlds__=this.__tlds__.concat(t).sort().filter((function(t,e,n){return t!==n[e-1]})).reverse(),f(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,f(this),this)},h.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),"mailto:"!==t.schema||/^mailto:/i.test(t.url)||(t.url="mailto:"+t.url)},h.prototype.onCompile=function(){},t.exports=h},function(t,e,n){"use strict";t.exports=function(t){var e={};e.src_Any=n(57).source,e.src_Cc=n(58).source,e.src_Z=n(59).source,e.src_P=n(36).source,e.src_ZPCc=[e.src_Z,e.src_P,e.src_Cc].join("|"),e.src_ZCc=[e.src_Z,e.src_Cc].join("|");return e.src_pseudo_letter="(?:(?![><|]|"+e.src_ZPCc+")"+e.src_Any+")",e.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",e.src_auth="(?:(?:(?!"+e.src_ZCc+"|[@/\\[\\]()]).)+@)?",e.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",e.src_host_terminator="(?=$|[><|]|"+e.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+e.src_ZPCc+"))",e.src_path="(?:[/?#](?:(?!"+e.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+e.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+e.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+e.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+e.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+e.src_ZCc+"|[']).)+\\'|\\'(?="+e.src_pseudo_letter+"|[-]).|\\.{2,4}[a-zA-Z0-9%/]|\\.(?!"+e.src_ZCc+"|[.]).|"+(t&&t["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+e.src_ZCc+").|\\!(?!"+e.src_ZCc+"|[!]).|\\?(?!"+e.src_ZCc+"|[?]).)+|\\/)?",e.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',e.src_xn="xn--[a-z0-9\\-]{1,59}",e.src_domain_root="(?:"+e.src_xn+"|"+e.src_pseudo_letter+"{1,63})",e.src_domain="(?:"+e.src_xn+"|(?:"+e.src_pseudo_letter+")|(?:"+e.src_pseudo_letter+"(?:-|"+e.src_pseudo_letter+"){0,61}"+e.src_pseudo_letter+"))",e.src_host="(?:(?:(?:(?:"+e.src_domain+")\\.)*"+e.src_domain+"))",e.tpl_host_fuzzy="(?:"+e.src_ip4+"|(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%)))",e.tpl_host_no_ip_fuzzy="(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%))",e.src_host_strict=e.src_host+e.src_host_terminator,e.tpl_host_fuzzy_strict=e.tpl_host_fuzzy+e.src_host_terminator,e.src_host_port_strict=e.src_host+e.src_port+e.src_host_terminator,e.tpl_host_port_fuzzy_strict=e.tpl_host_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_port_no_ip_fuzzy_strict=e.tpl_host_no_ip_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+e.src_ZPCc+"|>|$))",e.tpl_email_fuzzy='(^|[><|]|"|\\(|'+e.src_ZCc+")("+e.src_email_name+"@"+e.tpl_host_fuzzy_strict+")",e.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_fuzzy_strict+e.src_path+")",e.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_no_ip_fuzzy_strict+e.src_path+")",e}},function(t,e,n){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“â€â€˜â€™",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(t,e,n){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“â€â€˜â€™",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(t,e,n){"use strict";t.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“â€â€˜â€™",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},function(t,e,n){(function(t){var r=void 0!==t&&t||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function i(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new i(o.call(setTimeout,r,arguments),clearTimeout)},e.setInterval=function(){return new i(o.call(setInterval,r,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(r,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout((function(){t._onTimeout&&t._onTimeout()}),e))},n(155),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,n(11))},function(t,e,n){(function(t,e){!function(t,n){"use strict";if(!t.setImmediate){var r,o,i,a,s,c=1,u={},l=!1,f=t.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(t);p=p&&p.setTimeout?p:t,"[object process]"==={}.toString.call(t.process)?r=function(t){e.nextTick((function(){h(t)}))}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=n,e}}()?t.MessageChannel?((i=new MessageChannel).port1.onmessage=function(t){h(t.data)},r=function(t){i.port2.postMessage(t)}):f&&"onreadystatechange"in f.createElement("script")?(o=f.documentElement,r=function(t){var e=f.createElement("script");e.onreadystatechange=function(){h(t),e.onreadystatechange=null,o.removeChild(e),e=null},o.appendChild(e)}):r=function(t){setTimeout(h,0,t)}:(a="setImmediate$"+Math.random()+"$",s=function(e){e.source===t&&"string"==typeof e.data&&0===e.data.indexOf(a)&&h(+e.data.slice(a.length))},t.addEventListener?t.addEventListener("message",s,!1):t.attachEvent("onmessage",s),r=function(e){t.postMessage(a+e,"*")}),p.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),n=0;n1)for(var n=1;n1&&void 0!==arguments[1]&&arguments[1];if("string"!=typeof t||!t.trim())throw new Error("Invalid url.");return e&&("object"!==(void 0===e?"undefined":r(e))&&(e={stripFragment:!1}),t=i(t,e)),o(t)}},function(t,e,n){"use strict";var r=n(64),o=n(65),i=n(66);t.exports=function(t){t=(t||"").trim();var e={protocols:r(t),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:t,query:Object.create(null)},n=t.indexOf("://"),a=null,s=null;t.startsWith(".")&&(t.startsWith("./")&&(t=t.substring(2)),e.pathname=t,e.protocol="file");var c=t.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(o(t)?e.protocol="ssh":"/"===c||"~"===c?(t=t.substring(2),e.protocol="file"):e.protocol="file")),-1!==n&&(t=t.substring(n+3)),s=t.split("/"),"file"!==e.protocol?e.resource=s.shift():e.resource="",2===(a=e.resource.split("@")).length&&(e.user=a[0],e.resource=a[1]),2===(a=e.resource.split(":")).length&&(e.resource=a[0],a[1]?(e.port=Number(a[1]),isNaN(e.port)&&(e.port=null,s.unshift(a[1]))):e.port=null),s=s.filter(Boolean),"file"===e.protocol?e.pathname=e.href:e.pathname=e.pathname||("file"!==e.protocol||"/"===e.href[0]?"/":"")+s.join("/"),2===(a=e.pathname.split("#")).length&&(e.pathname=a[0],e.hash=a[1]),2===(a=e.pathname.split("?")).length&&(e.pathname=a[0],e.search=a[1]),e.query=i.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}},function(t,e,n){"use strict";function r(t,e){return Object.prototype.hasOwnProperty.call(t,e)}t.exports=function(t,e,n,i){e=e||"&",n=n||"=";var a={};if("string"!=typeof t||0===t.length)return a;var s=/\+/g;t=t.split(e);var c=1e3;i&&"number"==typeof i.maxKeys&&(c=i.maxKeys);var u=t.length;c>0&&u>c&&(u=c);for(var l=0;l=0?(f=m.substr(0,g),p=m.substr(g+1)):(f=m,p=""),d=decodeURIComponent(f),h=decodeURIComponent(p),r(a,d)?o(a[d])?a[d].push(h):a[d]=[a[d],h]:a[d]=h}return a};var o=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)}},function(t,e,n){"use strict";var r=function(t){switch(typeof t){case"string":return t;case"boolean":return t?"true":"false";case"number":return isFinite(t)?t:"";default:return""}};t.exports=function(t,e,n,s){return e=e||"&",n=n||"=",null===t&&(t=void 0),"object"==typeof t?i(a(t),(function(a){var s=encodeURIComponent(r(a))+n;return o(t[a])?i(t[a],(function(t){return s+encodeURIComponent(r(t))})).join(e):s+encodeURIComponent(r(t[a]))})).join(e):s?encodeURIComponent(r(s))+n+encodeURIComponent(r(t)):""};var o=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function i(t,e){if(t.map)return t.map(e);for(var n=[],r=0;re.some(e=>e instanceof RegExp?e.test(t):e===t);t.exports=(t,e)=>{e=Object.assign({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripHash:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps")&&(e.forceHttp=e.normalizeHttps),Reflect.has(e,"normalizeHttp")&&(e.forceHttps=e.normalizeHttp),Reflect.has(e,"stripFragment")&&(e.stripHash=e.stripFragment);const n=(t=t.trim()).startsWith("//");!n&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));const i=new r(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&"https:"===i.protocol&&(i.protocol="http:"),e.forceHttps&&"http:"===i.protocol&&(i.protocol="https:"),e.stripHash&&(i.hash=""),i.pathname&&(i.pathname=i.pathname.replace(/((?![https?:]).)\/{2,}/g,(t,e)=>/^(?!\/)/g.test(e)?`${e}/`:"/")),i.pathname&&(i.pathname=decodeURI(i.pathname)),!0===e.removeDirectoryIndex&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let t=i.pathname.split("/");const n=t[t.length-1];o(n,e.removeDirectoryIndex)&&(t=t.slice(0,t.length-1),i.pathname=t.slice(1).join("/")+"/")}if(i.hostname&&(i.hostname=i.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z\.]{2,5})$/.test(i.hostname)&&(i.hostname=i.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(const t of[...i.searchParams.keys()])o(t,e.removeQueryParameters)&&i.searchParams.delete(t);return e.sortQueryParameters&&i.searchParams.sort(),t=i.toString(),(e.removeTrailingSlash||"/"===i.pathname)&&(t=t.replace(/\/$/,"")),n&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),t}},function(t,e,n){"use strict";var r=n(63),o=n(170);function i(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}e.parse=_,e.resolve=function(t,e){return _(t,!1,!0).resolve(e)},e.resolveObject=function(t,e){return t?_(t,!1,!0).resolveObject(e):e},e.format=function(t){o.isString(t)&&(t=_(t));return t instanceof i?t.format():i.prototype.format.call(t)},e.Url=i;var a=/^([a-z0-9.+-]+:)/i,s=/:[0-9]*$/,c=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,u=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),l=["'"].concat(u),f=["%","/","?",";","#"].concat(l),p=["/","?","#"],d=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,"javascript:":!0},g={javascript:!0,"javascript:":!0},v={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},b=n(66);function _(t,e,n){if(t&&o.isObject(t)&&t instanceof i)return t;var r=new i;return r.parse(t,e,n),r}i.prototype.parse=function(t,e,n){if(!o.isString(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var i=t.indexOf("?"),s=-1!==i&&i127?I+="x":I+=L[D];if(!I.match(d)){var P=O.slice(0,T),j=O.slice(T+1),U=L.match(h);U&&(P.push(U[1]),j.unshift(U[2])),j.length&&(_="/"+j.join(".")+_),this.hostname=P.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),R||(this.hostname=r.toASCII(this.hostname));var F=this.port?":"+this.port:"",$=this.hostname||"";this.host=$+F,this.href+=this.host,R&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==_[0]&&(_="/"+_))}if(!m[k])for(T=0,N=l.length;T0)&&n.host.split("@"))&&(n.auth=R.shift(),n.host=n.hostname=R.shift());return n.search=t.search,n.query=t.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!x.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var C=x.slice(-1)[0],A=(n.host||t.host||x.length>1)&&("."===C||".."===C)||""===C,T=0,S=x.length;S>=0;S--)"."===(C=x[S])?x.splice(S,1):".."===C?(x.splice(S,1),T++):T&&(x.splice(S,1),T--);if(!E&&!k)for(;T--;T)x.unshift("..");!E||""===x[0]||x[0]&&"/"===x[0].charAt(0)||x.unshift(""),A&&"/"!==x.join("/").substr(-1)&&x.push("");var R,O=""===x[0]||x[0]&&"/"===x[0].charAt(0);w&&(n.hostname=n.host=O?"":x.length?x.shift():"",(R=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=R.shift(),n.host=n.hostname=R.shift()));return(E=E||n.host&&x.length)&&!O&&x.unshift(""),x.length?n.pathname=x.join("/"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=t.auth||n.auth,n.slashes=n.slashes||t.slashes,n.href=n.format(),n},i.prototype.parseHost=function(){var t=this.host,e=s.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)}},function(t,e,n){"use strict";t.exports={isString:function(t){return"string"==typeof t},isObject:function(t){return"object"==typeof t&&null!==t},isNull:function(t){return null===t},isNullOrUndefined:function(t){return null==t}}},function(t,e,n){var r=n(67),o=n(68),i=n(69),a=n(16);t.exports=function(t){return function(e){e=a(e);var n=o(e)?i(e):void 0,s=n?n[0]:e.charAt(0),c=n?r(n,1).join(""):e.slice(1);return s[t]()+c}}},function(t,e){t.exports=function(t,e,n){var r=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var i=Array(o);++r-1;);return n}},function(t,e){t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i0;){if("top-level"!==this.indentTypes.pop())break}},t}();e.default=a,t.exports=e.default},function(t,e,n){var r=n(187),o=n(188),i=n(189),a=n(16);t.exports=function(t,e,n){return e=(n?o(t,e,n):void 0===e)?1:i(e),r(a(t),e)}},function(t,e){var n=9007199254740991,r=Math.floor;t.exports=function(t,e){var o="";if(!t||e<1||e>n)return o;do{e%2&&(o+=t),(e=r(e/2))&&(t+=t)}while(e);return o}},function(t,e,n){var r=n(40),o=n(41),i=n(43),a=n(19);t.exports=function(t,e,n){if(!a(n))return!1;var s=typeof e;return!!("number"==s?o(n)&&i(e,n.length):"string"==s&&e in n)&&r(n[e],t)}},function(t,e,n){var r=n(190);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},function(t,e,n){var r=n(191),o=1/0,i=17976931348623157e292;t.exports=function(t){return t?(t=r(t))===o||t===-o?(t<0?-1:1)*i:t==t?t:0:0===t?t:0}},function(t,e,n){var r=n(19),o=n(23),i=NaN,a=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,u=/^0o[0-7]+$/i,l=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(o(t))return i;if(r(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=r(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(a,"");var n=c.test(t);return n||u.test(t)?l(t.slice(2),n?2:8):s.test(t)?i:+t}},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){"use strict";e.__esModule=!0;var r,o=n(39),i=(r=o)&&r.__esModule?r:{default:r};var a=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.level=0}return t.prototype.beginIfPossible=function(t,e){0===this.level&&this.isInlineBlock(t,e)?this.level=1:this.level>0?this.level++:this.level=0},t.prototype.end=function(){this.level--},t.prototype.isActive=function(){return this.level>0},t.prototype.isInlineBlock=function(t,e){for(var n=0,r=0,o=e;o50)return!1;if(a.type===i.default.OPEN_PAREN)r++;else if(a.type===i.default.CLOSE_PAREN&&0===--r)return!0;if(this.isForbiddenToken(a))return!1}return!1},t.prototype.isForbiddenToken=function(t){var e=t.type,n=t.value;return e===i.default.RESERVED_TOPLEVEL||e===i.default.RESERVED_NEWLINE||e===i.default.COMMENT||e===i.default.BLOCK_COMMENT||";"===n},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.params=e,this.index=0}return t.prototype.get=function(t){var e=t.key,n=t.value;return this.params?e?this.params[e]:this.params[this.index++]:n},t}();e.default=r,t.exports=e.default},function(t,e,n){var r=n(74),o=n(76),i=n(45),a=n(9),s=n(41),c=n(46),u=n(75),l=n(47),f="[object Map]",p="[object Set]",d=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||c(t)||l(t)||i(t)))return!t.length;var e=o(t);if(e==f||e==p)return!t.size;if(u(t))return!r(t).length;for(var n in t)if(d.call(t,n))return!1;return!0}},function(t,e,n){var r=n(197)(Object.keys,Object);t.exports=r},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){var r=n(12)(n(8),"DataView");t.exports=r},function(t,e,n){var r=n(73),o=n(200),i=n(19),a=n(77),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,f=u.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(201),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(8)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(12)(n(8),"Promise");t.exports=r},function(t,e,n){var r=n(12)(n(8),"WeakMap");t.exports=r},function(t,e,n){var r=n(17),o=n(18),i="[object Arguments]";t.exports=function(t){return o(t)&&r(t)==i}},function(t,e){t.exports=function(){return!1}},function(t,e,n){var r=n(17),o=n(42),i=n(18),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[r(t)]}},function(t,e){t.exports=function(t){return function(e){return t(e)}}},function(t,e,n){(function(t){var r=n(71),o=e&&!e.nodeType&&e,i=o&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===o&&r.process,s=function(){try{var t=i&&i.require&&i.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(t){}}();t.exports=s}).call(this,n(21)(t))},function(t,e,n){var r=n(16),o=/[\\^$.*+?()[\]{}|]/g,i=RegExp(o.source);t.exports=function(t){return(t=r(t))&&i.test(t)?t.replace(o,"\\$&"):t}},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(24)),o=i(n(25));function i(t){return t&&t.__esModule?t:{default:t}}var a=["ALL","ALTER","ANALYZE","AND","ANY","ARRAY","AS","ASC","BEGIN","BETWEEN","BINARY","BOOLEAN","BREAK","BUCKET","BUILD","BY","CALL","CASE","CAST","CLUSTER","COLLATE","COLLECTION","COMMIT","CONNECT","CONTINUE","CORRELATE","COVER","CREATE","DATABASE","DATASET","DATASTORE","DECLARE","DECREMENT","DELETE","DERIVED","DESC","DESCRIBE","DISTINCT","DO","DROP","EACH","ELEMENT","ELSE","END","EVERY","EXCEPT","EXCLUDE","EXECUTE","EXISTS","EXPLAIN","FALSE","FETCH","FIRST","FLATTEN","FOR","FORCE","FROM","FUNCTION","GRANT","GROUP","GSI","HAVING","IF","IGNORE","ILIKE","IN","INCLUDE","INCREMENT","INDEX","INFER","INLINE","INNER","INSERT","INTERSECT","INTO","IS","JOIN","KEY","KEYS","KEYSPACE","KNOWN","LAST","LEFT","LET","LETTING","LIKE","LIMIT","LSM","MAP","MAPPING","MATCHED","MATERIALIZED","MERGE","MINUS","MISSING","NAMESPACE","NEST","NOT","NULL","NUMBER","OBJECT","OFFSET","ON","OPTION","OR","ORDER","OUTER","OVER","PARSE","PARTITION","PASSWORD","PATH","POOL","PREPARE","PRIMARY","PRIVATE","PRIVILEGE","PROCEDURE","PUBLIC","RAW","REALM","REDUCE","RENAME","RETURN","RETURNING","REVOKE","RIGHT","ROLE","ROLLBACK","SATISFIES","SCHEMA","SELECT","SELF","SEMI","SET","SHOW","SOME","START","STATISTICS","STRING","SYSTEM","THEN","TO","TRANSACTION","TRIGGER","TRUE","TRUNCATE","UNDER","UNION","UNIQUE","UNKNOWN","UNNEST","UNSET","UPDATE","UPSERT","USE","USER","USING","VALIDATE","VALUE","VALUED","VALUES","VIA","VIEW","WHEN","WHERE","WHILE","WITH","WITHIN","WORK","XOR"],s=["DELETE FROM","EXCEPT ALL","EXCEPT","EXPLAIN DELETE FROM","EXPLAIN UPDATE","EXPLAIN UPSERT","FROM","GROUP BY","HAVING","INFER","INSERT INTO","INTERSECT ALL","INTERSECT","LET","LIMIT","MERGE","NEST","ORDER BY","PREPARE","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNION ALL","UNION","UNNEST","UPDATE","UPSERT","USE KEYS","VALUES","WHERE"],c=["AND","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"''","``"],openParens:["(","[","{"],closeParens:[")","]","}"],namedPlaceholderTypes:["$"],lineCommentTypes:["#","--"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(24)),o=i(n(25));function i(t){return t&&t.__esModule?t:{default:t}}var a=["A","ACCESSIBLE","AGENT","AGGREGATE","ALL","ALTER","ANY","ARRAY","AS","ASC","AT","ATTRIBUTE","AUTHID","AVG","BETWEEN","BFILE_BASE","BINARY_INTEGER","BINARY","BLOB_BASE","BLOCK","BODY","BOOLEAN","BOTH","BOUND","BULK","BY","BYTE","C","CALL","CALLING","CASCADE","CASE","CHAR_BASE","CHAR","CHARACTER","CHARSET","CHARSETFORM","CHARSETID","CHECK","CLOB_BASE","CLONE","CLOSE","CLUSTER","CLUSTERS","COALESCE","COLAUTH","COLLECT","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPILED","COMPRESS","CONNECT","CONSTANT","CONSTRUCTOR","CONTEXT","CONTINUE","CONVERT","COUNT","CRASH","CREATE","CREDENTIAL","CURRENT","CURRVAL","CURSOR","CUSTOMDATUM","DANGLING","DATA","DATE_BASE","DATE","DAY","DECIMAL","DEFAULT","DEFINE","DELETE","DESC","DETERMINISTIC","DIRECTORY","DISTINCT","DO","DOUBLE","DROP","DURATION","ELEMENT","ELSIF","EMPTY","ESCAPE","EXCEPTIONS","EXCLUSIVE","EXECUTE","EXISTS","EXIT","EXTENDS","EXTERNAL","EXTRACT","FALSE","FETCH","FINAL","FIRST","FIXED","FLOAT","FOR","FORALL","FORCE","FROM","FUNCTION","GENERAL","GOTO","GRANT","GROUP","HASH","HEAP","HIDDEN","HOUR","IDENTIFIED","IF","IMMEDIATE","IN","INCLUDING","INDEX","INDEXES","INDICATOR","INDICES","INFINITE","INSTANTIABLE","INT","INTEGER","INTERFACE","INTERVAL","INTO","INVALIDATE","IS","ISOLATION","JAVA","LANGUAGE","LARGE","LEADING","LENGTH","LEVEL","LIBRARY","LIKE","LIKE2","LIKE4","LIKEC","LIMITED","LOCAL","LOCK","LONG","MAP","MAX","MAXLEN","MEMBER","MERGE","MIN","MINUS","MINUTE","MLSLABEL","MOD","MODE","MONTH","MULTISET","NAME","NAN","NATIONAL","NATIVE","NATURAL","NATURALN","NCHAR","NEW","NEXTVAL","NOCOMPRESS","NOCOPY","NOT","NOWAIT","NULL","NULLIF","NUMBER_BASE","NUMBER","OBJECT","OCICOLL","OCIDATE","OCIDATETIME","OCIDURATION","OCIINTERVAL","OCILOBLOCATOR","OCINUMBER","OCIRAW","OCIREF","OCIREFCURSOR","OCIROWID","OCISTRING","OCITYPE","OF","OLD","ON","ONLY","OPAQUE","OPEN","OPERATOR","OPTION","ORACLE","ORADATA","ORDER","ORGANIZATION","ORLANY","ORLVARY","OTHERS","OUT","OVERLAPS","OVERRIDING","PACKAGE","PARALLEL_ENABLE","PARAMETER","PARAMETERS","PARENT","PARTITION","PASCAL","PCTFREE","PIPE","PIPELINED","PLS_INTEGER","PLUGGABLE","POSITIVE","POSITIVEN","PRAGMA","PRECISION","PRIOR","PRIVATE","PROCEDURE","PUBLIC","RAISE","RANGE","RAW","READ","REAL","RECORD","REF","REFERENCE","RELEASE","RELIES_ON","REM","REMAINDER","RENAME","RESOURCE","RESULT_CACHE","RESULT","RETURN","RETURNING","REVERSE","REVOKE","ROLLBACK","ROW","ROWID","ROWNUM","ROWTYPE","SAMPLE","SAVE","SAVEPOINT","SB1","SB2","SB4","SECOND","SEGMENT","SELF","SEPARATE","SEQUENCE","SERIALIZABLE","SHARE","SHORT","SIZE_T","SIZE","SMALLINT","SOME","SPACE","SPARSE","SQL","SQLCODE","SQLDATA","SQLERRM","SQLNAME","SQLSTATE","STANDARD","START","STATIC","STDDEV","STORED","STRING","STRUCT","STYLE","SUBMULTISET","SUBPARTITION","SUBSTITUTABLE","SUBTYPE","SUCCESSFUL","SUM","SYNONYM","SYSDATE","TABAUTH","TABLE","TDO","THE","THEN","TIME","TIMESTAMP","TIMEZONE_ABBR","TIMEZONE_HOUR","TIMEZONE_MINUTE","TIMEZONE_REGION","TO","TRAILING","TRANSACTION","TRANSACTIONAL","TRIGGER","TRUE","TRUSTED","TYPE","UB1","UB2","UB4","UID","UNDER","UNIQUE","UNPLUG","UNSIGNED","UNTRUSTED","USE","USER","USING","VALIDATE","VALIST","VALUE","VARCHAR","VARCHAR2","VARIABLE","VARIANCE","VARRAY","VARYING","VIEW","VIEWS","VOID","WHENEVER","WHILE","WITH","WORK","WRAPPED","WRITE","YEAR","ZONE"],s=["ADD","ALTER COLUMN","ALTER TABLE","BEGIN","CONNECT BY","DECLARE","DELETE FROM","DELETE","END","EXCEPT","EXCEPTION","FETCH FIRST","FROM","GROUP BY","HAVING","INSERT INTO","INSERT","INTERSECT","LIMIT","LOOP","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","START WITH","UNION ALL","UNION","UPDATE","VALUES","WHERE"],c=["AND","CROSS APPLY","CROSS JOIN","ELSE","END","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"N''","''","``"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:[":"],lineCommentTypes:["--"],specialWordChars:["_","$","#",".","@"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";e.__esModule=!0;var r=i(n(24)),o=i(n(25));function i(t){return t&&t.__esModule?t:{default:t}}var a=["ACCESSIBLE","ACTION","AGAINST","AGGREGATE","ALGORITHM","ALL","ALTER","ANALYSE","ANALYZE","AS","ASC","AUTOCOMMIT","AUTO_INCREMENT","BACKUP","BEGIN","BETWEEN","BINLOG","BOTH","CASCADE","CASE","CHANGE","CHANGED","CHARACTER SET","CHARSET","CHECK","CHECKSUM","COLLATE","COLLATION","COLUMN","COLUMNS","COMMENT","COMMIT","COMMITTED","COMPRESSED","CONCURRENT","CONSTRAINT","CONTAINS","CONVERT","CREATE","CROSS","CURRENT_TIMESTAMP","DATABASE","DATABASES","DAY","DAY_HOUR","DAY_MINUTE","DAY_SECOND","DEFAULT","DEFINER","DELAYED","DELETE","DESC","DESCRIBE","DETERMINISTIC","DISTINCT","DISTINCTROW","DIV","DO","DROP","DUMPFILE","DUPLICATE","DYNAMIC","ELSE","ENCLOSED","END","ENGINE","ENGINES","ENGINE_TYPE","ESCAPE","ESCAPED","EVENTS","EXEC","EXECUTE","EXISTS","EXPLAIN","EXTENDED","FAST","FETCH","FIELDS","FILE","FIRST","FIXED","FLUSH","FOR","FORCE","FOREIGN","FULL","FULLTEXT","FUNCTION","GLOBAL","GRANT","GRANTS","GROUP_CONCAT","HEAP","HIGH_PRIORITY","HOSTS","HOUR","HOUR_MINUTE","HOUR_SECOND","IDENTIFIED","IF","IFNULL","IGNORE","IN","INDEX","INDEXES","INFILE","INSERT","INSERT_ID","INSERT_METHOD","INTERVAL","INTO","INVOKER","IS","ISOLATION","KEY","KEYS","KILL","LAST_INSERT_ID","LEADING","LEVEL","LIKE","LINEAR","LINES","LOAD","LOCAL","LOCK","LOCKS","LOGS","LOW_PRIORITY","MARIA","MASTER","MASTER_CONNECT_RETRY","MASTER_HOST","MASTER_LOG_FILE","MATCH","MAX_CONNECTIONS_PER_HOUR","MAX_QUERIES_PER_HOUR","MAX_ROWS","MAX_UPDATES_PER_HOUR","MAX_USER_CONNECTIONS","MEDIUM","MERGE","MINUTE","MINUTE_SECOND","MIN_ROWS","MODE","MODIFY","MONTH","MRG_MYISAM","MYISAM","NAMES","NATURAL","NOT","NOW()","NULL","OFFSET","ON DELETE","ON UPDATE","ON","ONLY","OPEN","OPTIMIZE","OPTION","OPTIONALLY","OUTFILE","PACK_KEYS","PAGE","PARTIAL","PARTITION","PARTITIONS","PASSWORD","PRIMARY","PRIVILEGES","PROCEDURE","PROCESS","PROCESSLIST","PURGE","QUICK","RAID0","RAID_CHUNKS","RAID_CHUNKSIZE","RAID_TYPE","RANGE","READ","READ_ONLY","READ_WRITE","REFERENCES","REGEXP","RELOAD","RENAME","REPAIR","REPEATABLE","REPLACE","REPLICATION","RESET","RESTORE","RESTRICT","RETURN","RETURNS","REVOKE","RLIKE","ROLLBACK","ROW","ROWS","ROW_FORMAT","SECOND","SECURITY","SEPARATOR","SERIALIZABLE","SESSION","SHARE","SHOW","SHUTDOWN","SLAVE","SONAME","SOUNDS","SQL","SQL_AUTO_IS_NULL","SQL_BIG_RESULT","SQL_BIG_SELECTS","SQL_BIG_TABLES","SQL_BUFFER_RESULT","SQL_CACHE","SQL_CALC_FOUND_ROWS","SQL_LOG_BIN","SQL_LOG_OFF","SQL_LOG_UPDATE","SQL_LOW_PRIORITY_UPDATES","SQL_MAX_JOIN_SIZE","SQL_NO_CACHE","SQL_QUOTE_SHOW_CREATE","SQL_SAFE_UPDATES","SQL_SELECT_LIMIT","SQL_SLAVE_SKIP_COUNTER","SQL_SMALL_RESULT","SQL_WARNINGS","START","STARTING","STATUS","STOP","STORAGE","STRAIGHT_JOIN","STRING","STRIPED","SUPER","TABLE","TABLES","TEMPORARY","TERMINATED","THEN","TO","TRAILING","TRANSACTIONAL","TRUE","TRUNCATE","TYPE","TYPES","UNCOMMITTED","UNIQUE","UNLOCK","UNSIGNED","USAGE","USE","USING","VARIABLES","VIEW","WHEN","WITH","WORK","WRITE","YEAR_MONTH"],s=["ADD","AFTER","ALTER COLUMN","ALTER TABLE","DELETE FROM","EXCEPT","FETCH FIRST","FROM","GROUP BY","GO","HAVING","INSERT INTO","INSERT","INTERSECT","LIMIT","MODIFY","ORDER BY","SELECT","SET CURRENT SCHEMA","SET SCHEMA","SET","UNION ALL","UNION","UPDATE","VALUES","WHERE"],c=["AND","CROSS APPLY","CROSS JOIN","ELSE","INNER JOIN","JOIN","LEFT JOIN","LEFT OUTER JOIN","OR","OUTER APPLY","OUTER JOIN","RIGHT JOIN","RIGHT OUTER JOIN","WHEN","XOR"],u=void 0,l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.cfg=e}return t.prototype.format=function(t){return u||(u=new o.default({reservedWords:a,reservedToplevelWords:s,reservedNewlineWords:c,stringTypes:['""',"N''","''","``","[]"],openParens:["(","CASE"],closeParens:[")","END"],indexedPlaceholderTypes:["?"],namedPlaceholderTypes:["@",":"],lineCommentTypes:["#","--"]})),new r.default(this.cfg,u).format(t)},t}();e.default=l,t.exports=e.default},function(t,e){t.exports=function(t){var e={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},n={className:"meta",begin:/<\?(php)?|\?>/},r={className:"string",contains:[t.BACKSLASH_ESCAPE,n],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},t.inherit(t.APOS_STRING_MODE,{illegal:null}),t.inherit(t.QUOTE_STRING_MODE,{illegal:null})]},o={variants:[t.BINARY_NUMBER_MODE,t.C_NUMBER_MODE]};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",contains:[t.HASH_COMMENT_MODE,t.COMMENT("//","$",{contains:[n]}),t.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),t.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler",lexemes:t.UNDERSCORE_IDENT_RE}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[t.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},n,{className:"keyword",begin:/\$this\b/},e,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[t.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:["self",e,t.C_BLOCK_COMMENT_MODE,r,o]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[t.UNDERSCORE_TITLE_MODE]},{begin:"=>"},r,o]}}},function(t,e,n){var r=n(79),o=n(235),i=n(236),a=n(80),s=n(237),c=n(49),u=200;t.exports=function(t,e,n){var l=-1,f=o,p=t.length,d=!0,h=[],m=h;if(n)d=!1,f=i;else if(p>=u){var g=e?null:s(t);if(g)return c(g);d=!1,f=a,m=new r}else m=e?[]:h;t:for(;++l-1}},function(t,e,n){var r=n(28);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(29);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(29);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(29);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(29);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},function(t,e){var n="__lodash_hash_undefined__";t.exports=function(t){return this.__data__.set(t,n),this}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(72);t.exports=function(t,e){return!!(null==t?0:t.length)&&r(t,e,0)>-1}},function(t,e){t.exports=function(t,e,n){for(var r=-1,o=null==t?0:t.length;++r>>32-e},rotr:function(t,e){return t<<32-e|t>>>e},endian:function(t){if(t.constructor==Number)return 16711935&r.rotl(t,8)|4278255360&r.rotl(t,24);for(var e=0;e0;t--)e.push(Math.floor(256*Math.random()));return e},bytesToWords:function(t){for(var e=[],n=0,r=0;n>>5]|=t[n]<<24-r%32;return e},wordsToBytes:function(t){for(var e=[],n=0;n<32*t.length;n+=8)e.push(t[n>>>5]>>>24-n%32&255);return e},bytesToHex:function(t){for(var e=[],n=0;n>>4).toString(16)),e.push((15&t[n]).toString(16));return e.join("")},hexToBytes:function(t){for(var e=[],n=0;n>>6*(3-i)&63)):e.push("=");return e.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/gi,"");for(var e=[],r=0,o=0;r>>6-2*o);return e}},t.exports=r},function(t,e){function n(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)} +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ +t.exports=function(t){return null!=t&&(n(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&n(t.slice(0,0))}(t)||!!t._isBuffer)}},function(t,e,n){"use strict";n.r(e);n(93);var r,o,i,a=n(6),s=n.n(a),c=n(31),u=n.n(c),l=n(32),f=n.n(l),p=n(7),d=n(0),h=Object(d.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("svg",{staticStyle:{display:"none"},attrs:{xmlns:"http://www.w3.org/2000/svg"}},[e("symbol",{attrs:{id:"arrow-down-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[e("path",{attrs:{d:"M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z"}})]),this._v(" "),e("symbol",{attrs:{id:"arrow-up-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[e("path",{attrs:{d:"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z"}})]),this._v(" "),e("symbol",{attrs:{id:"clipboard-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512"}},[e("path",{attrs:{d:"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z"}})]),this._v(" "),e("symbol",{attrs:{id:"lightbulb-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 352 512"}},[e("path",{attrs:{d:"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z"}})]),this._v(" "),e("symbol",{attrs:{id:"pencil-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"}})]),this._v(" "),e("symbol",{attrs:{id:"plus-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z"}})]),this._v(" "),e("symbol",{attrs:{id:"share-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"}},[e("path",{attrs:{d:"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z"}})])])}),[],!1,null,null,null).exports,m=n(5),g=n(13),v={props:{name:{required:!0}},data:function(){return{fullException:!1}},methods:{removeClamp:function(){this.fullException||(this.fullException=!0)}}},b=Object(d.a)(v,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"ui-exception-message",class:this.fullException?"ui-exception-message-full":"",on:{mousedown:this.removeClamp}},[this._v("\n "+this._s(this.name)+"\n")])}),[],!1,null,null,null).exports,_={components:{ExceptionClass:n(14).a,ExceptionMessage:b,LineNumber:g.a,FilePath:m.a},inject:["report"],computed:{firstFrame:function(){return this.report.stacktrace[0]}}},y={inject:["report","telescopeUrl","config"],components:{OccurrenceDetails:Object(d.a)(_,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"card-details-overflow scrollbar p-12 pt-10"},[n("div",{staticClass:"text-2xl"},[n("ExceptionClass",{attrs:{name:t.report.exception_class}}),t._v(" "),n("ExceptionMessage",{attrs:{name:t.report.message}})],1),t._v(" "),n("div",[n("a",{staticClass:"ui-url",attrs:{href:t.report.context.request.url,target:"_blank"}},[t._v("\n "+t._s(t.report.context.request.url)+"\n ")])])])}),[],!1,null,null,null).exports,FilePath:m.a}},E=Object(d.a)(y,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"mt-12 card card-has-header card-no-props"},[n("div",{staticClass:"card-header"},[n("div",{staticClass:"grid items-center rounded-t border-b border-tint-300 text-xs text-tint-600 ",staticStyle:{"grid-template-columns":"1fr 1fr"}},[n("div",{staticClass:"grid cols-auto justify-start gap-2 px-4 py-2"},[n("div",{staticClass:"flex items-center"},[n("a",{attrs:{href:"http://flareapp.io/docs/ignition-for-laravel/introduction",target:"_blank",title:"Ignition docs"}},[n("svg",{staticClass:"w-4 h-5 mr-4",attrs:{viewBox:"0 0 428 988"}},[n("polygon",{staticStyle:{fill:"#FA4E79"},attrs:{points:"428,247.1 428,494.1 214,617.5 214,369.3 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#FFF082"},attrs:{points:"0,988 0,741 214,617.5 214,864.1 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#E6003A"},attrs:{points:"214,123.9 214,617.5 0,494.1 0,0 \t\t"}}),t._v(" "),n("polygon",{staticStyle:{fill:"#FFE100"},attrs:{points:"214,864.1 214,617.5 428,741 428,988 \t\t"}})])]),t._v(" "),n("FilePath",{attrs:{pathClass:"font-normal",file:t.report.application_path+t.config.directorySeparator,relative:!1}})],1)]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-end gap-4 px-4 py-2"},[t.telescopeUrl?n("div",[n("a",{staticClass:"link-dimmed sm:ml-6",attrs:{href:t.telescopeUrl,target:"_blank"}},[t._v("Telescope")])]):t._e()])])]),t._v(" "),n("div"),t._v(" "),n("div",{staticClass:"card-details"},[n("OccurrenceDetails")],1)])}),[],!1,null,null,null).exports,k=n(10),x=n.n(k),w=n(20),C=n.n(w),A=n(100)(),T=null,S={inject:["config"],props:{solution:{required:!0}},data:function(){return{isHidingSolutions:this.hasHideSolutionsCookie(),canExecuteSolutions:null,runningSolution:!1,executionSuccessful:null}},computed:{healthCheckEndpoint:function(){return this.solution.execute_endpoint.replace("execute-solution","health-check")}},created:function(){this.configureRunnableSolutions()},mounted:function(){this.isHidingSolutions&&this.$refs.solutionCard.classList.add("solution-hidden")},methods:{configureRunnableSolutions:function(){this.config.enableRunnableSolutions?this.checkExecutionEndpoint():this.canExecuteSolutions=!1},markdown:function(t){return A.render(t)},checkExecutionEndpoint:(o=C()(x.a.mark((function t(){var e;return x.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,fetch(this.healthCheckEndpoint);case 3:return t.next=5,t.sent.json();case 5:e=t.sent,this.canExecuteSolutions=e.can_execute_commands,t.next=12;break;case 9:t.prev=9,t.t0=t.catch(0),this.canExecuteSolutions=!1;case 12:case"end":return t.stop()}}),t,this,[[0,9]])}))),function(){return o.apply(this,arguments)}),execute:(r=C()(x.a.mark((function t(){var e;return x.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this.runningSolution){t.next=2;break}return t.abrupt("return");case 2:return t.prev=2,this.runningSolution=!0,t.next=6,fetch(this.solution.execute_endpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({solution:this.solution.class,parameters:this.solution.run_parameters})});case 6:e=t.sent,this.executionSuccessful=200===e.status,t.next=14;break;case 10:t.prev=10,t.t0=t.catch(2),console.error(t.t0),this.executionSuccessful=!1;case 14:return t.prev=14,this.runningSolution=!1,t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[2,10,14,17]])}))),function(){return r.apply(this,arguments)}),refresh:function(){location.reload()},getUrlLabel:function(t){var e=document.createElement("a");return e.href=t,e.hostname},toggleSolutions:function(){var t=this;this.isHidingSolutions?(window.clearTimeout(T),this.toggleHidingSolutions()):(this.$refs.solutionCard.classList.add("solution-hiding"),T=window.setTimeout((function(){t.$refs.solutionCard.classList.remove("solution-hiding"),t.toggleHidingSolutions()}),100))},toggleHidingSolutions:function(){if(this.isHidingSolutions)return document.cookie="".concat("hide_solutions","=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;"),void(this.isHidingSolutions=!1);var t=new Date;t.setTime(t.getTime()+31536e6),document.cookie="".concat("hide_solutions","=true;expires=").concat(t.toUTCString(),";path=/;"),this.isHidingSolutions=!0},hasHideSolutionsCookie:function(){return document.cookie.includes("hide_solutions")}}},R={components:{SolutionCard:Object(d.a)(S,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"solution-toggle",class:{"solution-toggle-show":t.isHidingSolutions},on:{click:t.toggleSolutions}},[t.isHidingSolutions?n("a",{staticClass:"link-solution",attrs:{target:"_blank"}},[n("Icon",{staticClass:"text-xs mr-1",attrs:{name:"lightbulb"}}),t._v(" Show solutions")],1):n("a",{staticClass:"link-solution",attrs:{target:"_blank"}},[t._v("Hide solutions")])]),t._v(" "),n("div",{ref:"solutionCard",staticClass:"solution",class:{"solution-hidden":t.isHidingSolutions}},[n("div",{staticClass:"solution-main"},[n("div",{staticClass:"solution-background mx-0"},[n("svg",{staticClass:"hidden absolute right-0 h-full | md:block",attrs:{x:"0px",y:"0px",viewBox:"0 0 299 452"}},[n("g",{staticStyle:{opacity:"0.075"}},[n("polygon",{staticStyle:{fill:"rgb(63,63,63)"},attrs:{points:"298.1,451.9 150.9,451.9 21,226.9 298.1,227.1"}}),t._v(" "),n("polygon",{staticStyle:{fill:"rgb(151,151,151)"},attrs:{points:"298.1,227.1 21,226.9 150.9,1.9 298.1,1.9"}})])])]),t._v(" "),n("div",{staticClass:"p-12"},[n("div",{staticClass:"solution-content ml-0"},[n("h2",{staticClass:"solution-title"},[t._v(t._s(t.solution.title))]),t._v(" "),t.solution.description?n("div",{domProps:{innerHTML:t._s(t.markdown(t.solution.description))}}):t._e(),t._v(" "),t.solution.is_runnable?n("div",[n("p",{domProps:{innerHTML:t._s(t.markdown(t.solution.action_description))}}),t._v(" "),null===t.canExecuteSolutions?n("p",{staticClass:"py-4 text-sm italic"},[t._v("\n Loading...\n ")]):t._e(),t._v(" "),n("div",{staticClass:"mt-4"},[t.solution.is_runnable&&!0===t.canExecuteSolutions&&null===t.executionSuccessful?n("button",{staticClass:"button-secondary button-lg bg-tint-300 hover:bg-tint-400",attrs:{disabled:t.runningSolution},on:{click:t.execute}},[t.runningSolution?n("span",[t._v("Running...")]):t._e(),t._v(" "),t.runningSolution?t._e():n("span",[t._v(t._s(t.solution.run_button_text))])]):t._e(),t._v(" "),t.executionSuccessful?n("p",[n("strong",{staticClass:"font-semibold"},[t._v("The solution was executed succesfully.")]),t._v(" "),n("a",{staticClass:"link-solution",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.refresh(e)}}},[t._v("Refresh now.")])]):t._e(),t._v(" "),!1===t.executionSuccessful?n("p",[t._v("\n Something went wrong when executing the solution. Please try\n refresh the page and try again.\n ")]):t._e()])]):t._e(),t._v(" "),Object.entries(t.solution.links).length>0?n("div",{staticClass:"mt-8 grid justify-start"},[n("div",{staticClass:"border-t-2 border-gray-700 opacity-25 "}),t._v(" "),n("div",{staticClass:"pt-2 grid cols-auto-1fr gapx-4 gapy-2 text-sm"},[n("label",{staticClass:"font-semibold uppercase tracking-wider"},[t._v("Read more")]),t._v(" "),n("ul",t._l(t.solution.links,(function(e,r){return n("li",{key:r},[n("a",{staticClass:"link-solution",attrs:{href:e,target:"_blank"}},[t._v(t._s(r))])])})),0)])]):t._e()])])])])])}),[],!1,null,null,null).exports,ErrorCard:E,FilePath:m.a},inject:["report","solutions"],data:function(){return{activeSolutionKey:0}},computed:{firstFrame:function(){return this.report.stacktrace[0]},solution:function(){return this.solutions[this.activeSolutionKey]}}},O=Object(d.a)(R,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"layout-col z-10"},[n("ErrorCard")],1),t._v(" "),t.solutions.length>0?n("div",{staticClass:"layout-col z-1"},[n("SolutionCard",t._b({},"SolutionCard",{solution:t.solution},!1)),t._v(" "),t.solutions.length>1?n("div",{staticClass:"absolute left-0 bottom-0 w-full h-8 mb-2 px-4 text-sm z-10"},[n("ul",{staticClass:"grid cols-auto place-center gap-1"},t._l(t.solutions,(function(e,r){return n("li",{key:e.class,on:{click:function(e){t.activeSolutionKey=r}}},[n("a",{staticClass:"grid place-center h-8 min-w-8 px-2 rounded-full",class:{"bg-tint-200 font-semibold":t.activeSolutionKey===r,"hover:bg-tint-100 cursor-pointer":t.activeSolutionKey!==r}},[t._v("\n "+t._s(r+1)+"\n ")])])})),0)]):t._e()],1):t._e()])}),[],!1,null,null,null).exports,N={components:{CheckboxField:n(35).a},props:["error"],computed:{selectedTabs:function(){return this.tabs.filter((function(t){return t.checked})).map((function(t){return t.name}))}},data:function(){return{tabs:[{label:"Stack trace",name:"stackTraceTab",checked:!0},{label:"Request",name:"requestTab",checked:!0},{label:"App",name:"appTab",checked:!0},{label:"User",name:"userTab",checked:!0},{label:"Context",name:"contextTab",checked:!0},{label:"Debug",name:"debugTab",checked:!0}]}},methods:{shareError:function(){this.$emit("share",this.selectedTabs)}}},L=Object(d.a)(N,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"grid cols-2 justify-start gapx-6 gapy-2"},t._l(t.tabs,(function(e){return n("CheckboxField",{key:e.name,staticClass:"text-gray-200 hover:text-white",attrs:{label:e.label,name:e.name},on:{change:function(t){e.checked=!e.checked}},model:{value:e.checked,callback:function(n){t.$set(e,"checked",n)},expression:"tab.checked"}})})),1),t._v(" "),n("div",{staticClass:"mt-4"},[t.error?n("div",{staticClass:"mb-3"},[t._v("\n We were unable to share your error."),n("br"),t._v("\n Please try again later.\n ")]):t._e(),t._v(" "),n("button",{staticClass:"button-secondary button-sm bg-tint-600 text-white",on:{click:t.shareError}},[t._v("\n Share\n ")])])])}),[],!1,null,null,null).exports,I={props:{text:{required:!0}},data:function(){return{copied:!1,timeout:!1}},methods:{copy:function(t){var e=this;this.timeout&&window.clearTimeout(this.timeout);var n=document.createElement("textarea");n.value=t,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),this.copied=!0,this.timeout=window.setTimeout((function(){return e.copied=!1}),3e3)}}},D={components:{CopyButton:Object(d.a)(I,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("button",{attrs:{title:"Copy to clipboard"},on:{click:function(e){return t.copy(t.text)}}},[n("Icon",{class:t.copied?"fill-green-300":"fill-gray-200 hover:fill-white",attrs:{name:"clipboard"}}),t._v(" "),t.copied?n("div",{staticClass:"ml-2 absolute top-0 left-full text-green-300"},[t._v("\n Copied!\n ")]):t._e()],1)}),[],!1,null,null,null).exports},props:{publicUrl:{required:!0},ownerUrl:{required:!0}}},M={components:{ShareLinks:Object(d.a)(D,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"text-left"},[n("p",{staticClass:"mt-2 text-gray-300"},[t._v("Share your error with others:")]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-start gap-2 mt-2"},[n("a",{staticClass:"button-secondary button-sm bg-tint-600 hover:bg-tint-700 text-white",attrs:{href:t.publicUrl,target:"_blank"}},[t._v("Open public share")]),t._v(" "),n("CopyButton",{attrs:{text:t.publicUrl}})],1),t._v(" "),n("p",{staticClass:"mt-4 text-gray-300"},[t._v("Administer your shared error here:")]),t._v(" "),n("div",{staticClass:"grid cols-auto items-center justify-start gap-2 mt-2"},[n("a",{staticClass:"button-secondary button-sm bg-tint-600 hover:bg-tint-700 text-white",attrs:{href:t.ownerUrl,target:"_blank"}},[t._v("Open share admin")]),t._v(" "),n("CopyButton",{attrs:{text:t.ownerUrl}})],1)])}),[],!1,null,null,null).exports,ShareForm:L},inject:["report","shareEndpoint"],data:function(){return{shareHadError:!1,sharedErrorUrls:null,menuVisible:!1}},watch:{menuVisible:function(t){t?window.addEventListener("click",this.toggleMenu):window.removeEventListener("click",this.toggleMenu)}},methods:{toggleMenu:function(){this.menuVisible=!this.menuVisible},shareError:(i=C()(x.a.mark((function t(e){var n,r;return x.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,fetch(this.shareEndpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({report:JSON.stringify(this.report),tabs:e,lineSelection:window.location.hash})});case 3:return n=t.sent,t.next=6,n.json();case 6:r=t.sent,n.ok?this.sharedErrorUrls=r:this.shareHadError=!0,t.next=13;break;case 10:t.prev=10,t.t0=t.catch(0),this.shareHadError=!0;case 13:case"end":return t.stop()}}),t,this,[[0,10]])}))),function(t){return i.apply(this,arguments)})}},P={inject:["config"],components:{ShareButton:Object(d.a)(M,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{on:{click:function(t){t.stopPropagation()}}},[n("button",{staticClass:"tab",class:t.menuVisible?"tab-active":"",on:{click:t.toggleMenu}},[t._v("\n Share\n "),n("Icon",{staticClass:"ml-2",attrs:{name:"share"}})],1),t._v(" "),n("div",{staticClass:"dropdown z-10 right-0 top-full p-4 overflow-visible",class:{hidden:!t.menuVisible},staticStyle:{"min-width":"18rem","margin-right":"-1px"},on:{click:function(t){t.stopPropagation()}}},[n("div",{staticClass:"flex items-center mb-4"},[n("svg",{staticClass:"w-4 h-5 mr-2",attrs:{viewBox:"0 0 682 1024"}},[n("polygon",{staticStyle:{fill:"#51DB9E"},attrs:{points:"235.3,510.5 21.5,387 21.5,140.2 236.5,264.1 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#7900F5"},attrs:{points:"235.3,1004.8 21.5,881.4 21.5,634.5 234.8,757.9 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#94F2C8"},attrs:{points:"448.9,386.9 21.5,140.2 235.3,16.7 663.2,263.4 "}}),t._v(" "),n("polygon",{staticStyle:{fill:"#A475F4"},attrs:{points:"234.8,757.9 21.5,634.5 235.3,511 449.1,634.5 "}})]),t._v(" "),n("h5",{staticClass:"text-left font-semibold uppercase tracking-wider whitespace-no-wrap"},[t._v("\n "+t._s(t.sharedErrorUrls?"Shared":"Share")+" on Flare\n ")]),t._v(" "),n("a",{staticClass:"ml-auto underline",attrs:{target:"_blank",href:"https://flareapp.io/docs/ignition-for-laravel/sharing-errors",title:"Flare documentation"}},[t._v("Docs\n ")])]),t._v(" "),t.sharedErrorUrls?n("div",[n("ShareLinks",{attrs:{publicUrl:t.sharedErrorUrls.public_url,ownerUrl:t.sharedErrorUrls.owner_url}})],1):n("ShareForm",{attrs:{error:t.shareHadError},on:{share:t.shareError}})],1)])}),[],!1,null,null,null).exports},props:{value:{required:!0},customTabs:{required:!0}},data:function(){return{defaultTabs:[{component:"StackTab",title:"Stack trace"},{component:"RequestTab",title:"Request"},{component:"AppTab",title:"App"},{component:"UserTab",title:"User"},{component:"ContextTab",title:"Context"},{component:"DebugTab",title:"Debug"}],shareButtonEnabled:this.config.enableShareButton}},mounted:function(){this.applyDefaultTabProps(),this.$emit("input",this.tabs[this.currentTabIndex])},computed:{currentTabIndex:function(){var t=this;return this.tabs.findIndex((function(e){return e.component===t.value.component}))},nextTab:function(){return this.tabs[this.currentTabIndex+1]||this.tabs[0]},previousTab:function(){return this.tabs[this.currentTabIndex-1]||this.tabs[this.tabs.length-1]},tabs:function(){var t={};return this.defaultTabs.forEach((function(e){t[e.component]=e})),this.customTabs.forEach((function(e){t[e.component]=e})),Object.values(t)}},methods:{applyDefaultTabProps:function(){var t=this;this.defaultTabs.map((function(e){return e.component===t.value.component&&(e.props=t.value.props||{}),e}))}}},j={props:{tab:{required:!0}},render:function(t){return t(this.tab.component,{props:this.tab.props||{}})}},U={props:{report:{required:!0},config:{required:!0},solutions:{required:!0},telescopeUrl:{required:!0},shareEndpoint:{required:!0},defaultTab:{required:!0},defaultTabProps:{required:!1}},data:function(){return{customTabs:window.tabs,tab:{component:this.defaultTab,props:this.defaultTabProps||{}}}},provide:function(){return{config:this.config,report:this.report,solutions:this.solutions,telescopeUrl:this.telescopeUrl,shareEndpoint:this.shareEndpoint,setTab:this.setTab}},components:{Summary:O,Tabs:Object(d.a)(P,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("nav",{staticClass:"tab-nav"},[n("ul",{staticClass:"tab-bar"},t._l(t.tabs,(function(e){return n("li",{key:e.component},[n("button",{staticClass:"tab",class:t.value.component===e.component?"tab-active":"",on:{click:function(n){return n.preventDefault(),t.$emit("input",e)}}},[t._v("\n "+t._s(e.title)+"\n ")])])})),0),t._v(" "),t.shareButtonEnabled?[n("div",{staticClass:"tab-delimiter"}),t._v(" "),n("ShareButton")]:t._e()],2)}),[],!1,null,null,null).exports,Details:Object(d.a)(j,void 0,void 0,!1,null,null,null).exports,IconSymbols:h},methods:{setTab:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.tab={component:t,props:e}}},created:function(){}},F=Object(d.a)(U,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("IconSymbols"),t._v(" "),n("Summary"),t._v(" "),n("div",{staticClass:"layout-col mt-12"},[n("div",{staticClass:"tabs"},[n("Tabs",t._b({model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},"Tabs",{customTabs:t.customTabs},!1)),t._v(" "),n("div",{staticClass:"tab-main"},[n("Details",t._b({},"Details",{tab:t.tab},!1))],1)],1)])],1)}),[],!1,null,null,null).exports;function $(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function B(t){for(var e=1;e=this.selectedRange[0]&&t<=this.selectedRange[1])},editorUrl:function(t){return Object(c.a)(this.config,this.selectedFrame.file,t)},highlightedCode:function(t){var e=o.a.highlight("php",t||"",!0,this.highlightState);return this.highlightState=e.top,e.value||" "}}},l=n(0),f=Object(l.a)(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"stack-main"},[n("div",{staticClass:"stack-main-header"},[n("div",{staticClass:"grid cols-auto gap-2 justify-start items-center"},[n("ExceptionClass",{attrs:{name:t.selectedFrame.class||"",method:t.selectedFrame.method||""}})],1),t._v(" "),t.selectedFrame.file?n("FilePath",{staticClass:"mt-1",attrs:{"line-number":t.selectedFrame.line_number,file:t.selectedFrame.file,editable:!0}}):t._e()],1),t._v(" "),n("div",{staticClass:"stack-main-content"},[n("div",{staticClass:"stack-viewer scrollbar"},[n("div",{staticClass:"stack-ruler"},[n("div",{staticClass:"stack-lines"},t._l(t.selectedFrame.code_snippet,(function(e,r){return n("p",{key:r,staticClass:"stack-line cursor-pointer",class:{"stack-line-selected":t.withinSelectedRange(parseInt(r)),"stack-line-highlight":parseInt(r)===t.selectedFrame.line_number},on:{click:function(e){t.handleLineNumberClick(e,parseInt(r))}}},[t._v("\n "+t._s(r)+"\n ")])})),0)]),t._v(" "),n("pre",{ref:"codeContainer",staticClass:"stack-code",class:t.highlightTheme},[t._l(t.selectedFrame.code_snippet,(function(e,r){return n("p",{key:r,staticClass:"stack-code-line",class:{"stack-code-line-highlight":parseInt(r)===t.selectedFrame.line_number,"stack-code-line-selected":t.withinSelectedRange(parseInt(r))}},[n("span",{domProps:{innerHTML:t._s(t.highlightedCode(e))}}),n("a",{staticClass:"editor-link",attrs:{href:t.editorUrl(r)}},[n("Icon",{attrs:{name:"pencil"}})],1)])})),t._v("\n ")],2)])])])}),[],!1,null,null,null).exports,p={props:{frameGroup:{required:!0}},components:{ExceptionClass:i.a,FilePath:a.a,LineNumber:s.a}},d=Object(l.a)(p,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.frameGroup.expanded||"vendor"!==t.frameGroup.type?"unknown"===t.frameGroup.type?n("li",{staticClass:"stack-frame-group stack-frame-group-unknown"},[n("div",{staticClass:"stack-frame"},[n("button",{staticClass:"stack-frame-number"}),t._v(" "),n("div",{staticClass:"span-2 stack-frame-text"},[n("span",{staticClass:"text-left text-gray-500"},[t._v("\n "+t._s(t.frameGroup.frames.length>1?t.frameGroup.frames.length+" unknown frames":"1 unknown frame")+"\n ")])])])]):n("li",[n("ul",{staticClass:"stack-frame-group",class:"vendor"===t.frameGroup.type?"stack-frame-group-vendor":""},t._l(t.frameGroup.frames,(function(e,r){return n("li",{key:r,staticClass:"stack-frame | cursor-pointer",class:e.selected?"stack-frame-selected":"",on:{click:function(n){return t.$emit("select",e.frame_number)}}},[n("div",{staticClass:"stack-frame-number"},[t._v(t._s(e.frame_number))]),t._v(" "),n("div",{staticClass:"stack-frame-text"},[0===r?n("header",{staticClass:"stack-frame-header",class:e.class?"mb-1":""},[n("FilePath",{staticClass:"stack-frame-path",attrs:{pathClass:"vendor"===t.frameGroup.type?"text-gray-800":"text-purple-800",file:e.relative_file}})],1):t._e(),t._v(" "),e.class?n("span",{staticClass:"stack-frame-exception-class"},[n("ExceptionClass",{staticClass:"stack-frame-exception-class",attrs:{name:e.class}})],1):t._e()]),t._v(" "),n("div",{staticClass:"stack-frame-line"},[n("LineNumber",{attrs:{lineNumber:e.line_number}})],1)])})),0)]):n("li",{staticClass:"stack-frame-group stack-frame-group-vendor",on:{click:function(e){return t.$emit("expand")}}},[n("div",{staticClass:"stack-frame | cursor-pointer"},[n("button",{staticClass:"stack-frame-number"},[n("Icon",{staticClass:"align-middle text-gray-500",attrs:{name:"plus"}})],1),t._v(" "),n("div",{staticClass:"span-2 stack-frame-text"},[n("button",{staticClass:"text-left text-gray-500"},[t._v("\n "+t._s(t.frameGroup.frames.length>1?t.frameGroup.frames.length+" vendor frames…":"1 vendor frame…")+"\n ")])])])])}),[],!1,null,null,null).exports,h=n(6),m=n.n(h),g=n(4),v=n.n(g),b=n(15),_=n.n(b);function y(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function E(t){return t.map((function(e,n){return function(t){for(var e=1;e
'.PHP_EOL; + flush(); + } else { + echo '
'.PHP_EOL; + echo 'FAIL '.$address.PHP_EOL; + echo '
'.PHP_EOL; + flush(); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php new file mode 100644 index 0000000..595c0f6 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php @@ -0,0 +1,24 @@ +rate = $rate; + $this->mode = $mode; + $this->sleeper = $sleeper; + $this->timer = $timer; + } + + /** + * Invoked immediately before the Message is sent. + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $time = $this->getTimestamp(); + if (!isset($this->start)) { + $this->start = $time; + } + $duration = $time - $this->start; + + switch ($this->mode) { + case self::BYTES_PER_MINUTE: + $sleep = $this->throttleBytesPerMinute($duration); + break; + case self::MESSAGES_PER_SECOND: + $sleep = $this->throttleMessagesPerSecond($duration); + break; + case self::MESSAGES_PER_MINUTE: + $sleep = $this->throttleMessagesPerMinute($duration); + break; + default: + $sleep = 0; + break; + } + + if ($sleep > 0) { + $this->sleep($sleep); + } + } + + /** + * Invoked when a Message is sent. + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + parent::sendPerformed($evt); + ++$this->messages; + } + + /** + * Sleep for $seconds. + * + * @param int $seconds + */ + public function sleep($seconds) + { + if (isset($this->sleeper)) { + $this->sleeper->sleep($seconds); + } else { + sleep($seconds); + } + } + + /** + * Get the current UNIX timestamp. + * + * @return int + */ + public function getTimestamp() + { + if (isset($this->timer)) { + return $this->timer->getTimestamp(); + } + + return time(); + } + + /** + * Get a number of seconds to sleep for. + * + * @param int $timePassed + * + * @return int + */ + private function throttleBytesPerMinute($timePassed) + { + $expectedDuration = $this->getBytesOut() / ($this->rate / 60); + + return (int) ceil($expectedDuration - $timePassed); + } + + /** + * Get a number of seconds to sleep for. + * + * @param int $timePassed + * + * @return int + */ + private function throttleMessagesPerSecond($timePassed) + { + $expectedDuration = $this->messages / $this->rate; + + return (int) ceil($expectedDuration - $timePassed); + } + + /** + * Get a number of seconds to sleep for. + * + * @param int $timePassed + * + * @return int + */ + private function throttleMessagesPerMinute($timePassed) + { + $expectedDuration = $this->messages / ($this->rate / 60); + + return (int) ceil($expectedDuration - $timePassed); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Timer.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Timer.php new file mode 100644 index 0000000..9c8deb3 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Timer.php @@ -0,0 +1,24 @@ +register('properties.charset')->asValue($charset); + + return $this; + } + + /** + * Set the directory where temporary files can be saved. + * + * @param string $dir + * + * @return $this + */ + public function setTempDir($dir) + { + Swift_DependencyContainer::getInstance()->register('tempdir')->asValue($dir); + + return $this; + } + + /** + * Set the type of cache to use (i.e. "disk" or "array"). + * + * @param string $type + * + * @return $this + */ + public function setCacheType($type) + { + Swift_DependencyContainer::getInstance()->register('cache')->asAliasOf(sprintf('cache.%s', $type)); + + return $this; + } + + /** + * Set the QuotedPrintable dot escaper preference. + * + * @param bool $dotEscape + * + * @return $this + */ + public function setQPDotEscape($dotEscape) + { + $dotEscape = !empty($dotEscape); + Swift_DependencyContainer::getInstance() + ->register('mime.qpcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoder') + ->withDependencies(['mime.charstream', 'mime.bytecanonicalizer']) + ->addConstructorValue($dotEscape); + + return $this; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ReplacementFilterFactory.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ReplacementFilterFactory.php new file mode 100644 index 0000000..2897474 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ReplacementFilterFactory.php @@ -0,0 +1,27 @@ +createDependenciesFor('transport.sendmail') + ); + + $this->setCommand($command); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signer.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signer.php new file mode 100644 index 0000000..26c5e28 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signer.php @@ -0,0 +1,19 @@ + + */ +interface Swift_Signer +{ + public function reset(); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/BodySigner.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/BodySigner.php new file mode 100644 index 0000000..8e66e18 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/BodySigner.php @@ -0,0 +1,33 @@ + + */ +interface Swift_Signers_BodySigner extends Swift_Signer +{ + /** + * Change the Swift_Signed_Message to apply the singing. + * + * @param Swift_Message $message + * + * @return self + */ + public function signMessage(Swift_Message $message); + + /** + * Return the list of header a signer might tamper. + * + * @return array + */ + public function getAlteredHeaders(); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php new file mode 100644 index 0000000..7f1bf4a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php @@ -0,0 +1,682 @@ + + */ +class Swift_Signers_DKIMSigner implements Swift_Signers_HeaderSigner +{ + /** + * PrivateKey. + * + * @var string + */ + protected $privateKey; + + /** + * DomainName. + * + * @var string + */ + protected $domainName; + + /** + * Selector. + * + * @var string + */ + protected $selector; + + private $passphrase = ''; + + /** + * Hash algorithm used. + * + * @see RFC6376 3.3: Signers MUST implement and SHOULD sign using rsa-sha256. + * + * @var string + */ + protected $hashAlgorithm = 'rsa-sha256'; + + /** + * Body canon method. + * + * @var string + */ + protected $bodyCanon = 'simple'; + + /** + * Header canon method. + * + * @var string + */ + protected $headerCanon = 'simple'; + + /** + * Headers not being signed. + * + * @var array + */ + protected $ignoredHeaders = ['return-path' => true]; + + /** + * Signer identity. + * + * @var string + */ + protected $signerIdentity; + + /** + * BodyLength. + * + * @var int + */ + protected $bodyLen = 0; + + /** + * Maximum signedLen. + * + * @var int + */ + protected $maxLen = PHP_INT_MAX; + + /** + * Embbed bodyLen in signature. + * + * @var bool + */ + protected $showLen = false; + + /** + * When the signature has been applied (true means time()), false means not embedded. + * + * @var mixed + */ + protected $signatureTimestamp = true; + + /** + * When will the signature expires false means not embedded, if sigTimestamp is auto + * Expiration is relative, otherwise it's absolute. + * + * @var int + */ + protected $signatureExpiration = false; + + /** + * Must we embed signed headers? + * + * @var bool + */ + protected $debugHeaders = false; + + // work variables + /** + * Headers used to generate hash. + * + * @var array + */ + protected $signedHeaders = []; + + /** + * If debugHeaders is set store debugData here. + * + * @var string[] + */ + private $debugHeadersData = []; + + /** + * Stores the bodyHash. + * + * @var string + */ + private $bodyHash = ''; + + /** + * Stores the signature header. + * + * @var Swift_Mime_Headers_ParameterizedHeader + */ + protected $dkimHeader; + + private $bodyHashHandler; + + private $headerHash; + + private $headerCanonData = ''; + + private $bodyCanonEmptyCounter = 0; + + private $bodyCanonIgnoreStart = 2; + + private $bodyCanonSpace = false; + + private $bodyCanonLastChar = null; + + private $bodyCanonLine = ''; + + private $bound = []; + + /** + * Constructor. + * + * @param string $privateKey + * @param string $domainName + * @param string $selector + * @param string $passphrase + */ + public function __construct($privateKey, $domainName, $selector, $passphrase = '') + { + $this->privateKey = $privateKey; + $this->domainName = $domainName; + $this->signerIdentity = '@'.$domainName; + $this->selector = $selector; + $this->passphrase = $passphrase; + } + + /** + * Reset the Signer. + * + * @see Swift_Signer::reset() + */ + public function reset() + { + $this->headerHash = null; + $this->signedHeaders = []; + $this->bodyHash = null; + $this->bodyHashHandler = null; + $this->bodyCanonIgnoreStart = 2; + $this->bodyCanonEmptyCounter = 0; + $this->bodyCanonLastChar = null; + $this->bodyCanonSpace = false; + } + + /** + * Writes $bytes to the end of the stream. + * + * Writing may not happen immediately if the stream chooses to buffer. If + * you want to write these bytes with immediate effect, call {@link commit()} + * after calling write(). + * + * This method returns the sequence ID of the write (i.e. 1 for first, 2 for + * second, etc etc). + * + * @param string $bytes + * + * @return int + * + * @throws Swift_IoException + */ + // TODO fix return + public function write($bytes) + { + $this->canonicalizeBody($bytes); + foreach ($this->bound as $is) { + $is->write($bytes); + } + } + + /** + * For any bytes that are currently buffered inside the stream, force them + * off the buffer. + */ + public function commit() + { + // Nothing to do + return; + } + + /** + * Attach $is to this stream. + * + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + */ + public function bind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + $this->bound[] = $is; + + return; + } + + /** + * Remove an already bound stream. + * + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + */ + public function unbind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + foreach ($this->bound as $k => $stream) { + if ($stream === $is) { + unset($this->bound[$k]); + + return; + } + } + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + * + * @throws Swift_IoException + */ + public function flushBuffers() + { + $this->reset(); + } + + /** + * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1. + * + * @param string $hash 'rsa-sha1' or 'rsa-sha256' + * + * @throws Swift_SwiftException + * + * @return $this + */ + public function setHashAlgorithm($hash) + { + switch ($hash) { + case 'rsa-sha1': + $this->hashAlgorithm = 'rsa-sha1'; + break; + case 'rsa-sha256': + $this->hashAlgorithm = 'rsa-sha256'; + if (!defined('OPENSSL_ALGO_SHA256')) { + throw new Swift_SwiftException('Unable to set sha256 as it is not supported by OpenSSL.'); + } + break; + default: + throw new Swift_SwiftException('Unable to set the hash algorithm, must be one of rsa-sha1 or rsa-sha256 (%s given).', $hash); + } + + return $this; + } + + /** + * Set the body canonicalization algorithm. + * + * @param string $canon + * + * @return $this + */ + public function setBodyCanon($canon) + { + if ('relaxed' == $canon) { + $this->bodyCanon = 'relaxed'; + } else { + $this->bodyCanon = 'simple'; + } + + return $this; + } + + /** + * Set the header canonicalization algorithm. + * + * @param string $canon + * + * @return $this + */ + public function setHeaderCanon($canon) + { + if ('relaxed' == $canon) { + $this->headerCanon = 'relaxed'; + } else { + $this->headerCanon = 'simple'; + } + + return $this; + } + + /** + * Set the signer identity. + * + * @param string $identity + * + * @return $this + */ + public function setSignerIdentity($identity) + { + $this->signerIdentity = $identity; + + return $this; + } + + /** + * Set the length of the body to sign. + * + * @param mixed $len (bool or int) + * + * @return $this + */ + public function setBodySignedLen($len) + { + if (true === $len) { + $this->showLen = true; + $this->maxLen = PHP_INT_MAX; + } elseif (false === $len) { + $this->showLen = false; + $this->maxLen = PHP_INT_MAX; + } else { + $this->showLen = true; + $this->maxLen = (int) $len; + } + + return $this; + } + + /** + * Set the signature timestamp. + * + * @param int $time A timestamp + * + * @return $this + */ + public function setSignatureTimestamp($time) + { + $this->signatureTimestamp = $time; + + return $this; + } + + /** + * Set the signature expiration timestamp. + * + * @param int $time A timestamp + * + * @return $this + */ + public function setSignatureExpiration($time) + { + $this->signatureExpiration = $time; + + return $this; + } + + /** + * Enable / disable the DebugHeaders. + * + * @param bool $debug + * + * @return Swift_Signers_DKIMSigner + */ + public function setDebugHeaders($debug) + { + $this->debugHeaders = (bool) $debug; + + return $this; + } + + /** + * Start Body. + */ + public function startBody() + { + // Init + switch ($this->hashAlgorithm) { + case 'rsa-sha256': + $this->bodyHashHandler = hash_init('sha256'); + break; + case 'rsa-sha1': + $this->bodyHashHandler = hash_init('sha1'); + break; + } + $this->bodyCanonLine = ''; + } + + /** + * End Body. + */ + public function endBody() + { + $this->endOfBody(); + } + + /** + * Returns the list of Headers Tampered by this plugin. + * + * @return array + */ + public function getAlteredHeaders() + { + if ($this->debugHeaders) { + return ['DKIM-Signature', 'X-DebugHash']; + } else { + return ['DKIM-Signature']; + } + } + + /** + * Adds an ignored Header. + * + * @param string $header_name + * + * @return Swift_Signers_DKIMSigner + */ + public function ignoreHeader($header_name) + { + $this->ignoredHeaders[strtolower($header_name)] = true; + + return $this; + } + + /** + * Set the headers to sign. + * + * @return Swift_Signers_DKIMSigner + */ + public function setHeaders(Swift_Mime_SimpleHeaderSet $headers) + { + $this->headerCanonData = ''; + // Loop through Headers + $listHeaders = $headers->listAll(); + foreach ($listHeaders as $hName) { + // Check if we need to ignore Header + if (!isset($this->ignoredHeaders[strtolower($hName)])) { + if ($headers->has($hName)) { + $tmp = $headers->getAll($hName); + foreach ($tmp as $header) { + if ('' != $header->getFieldBody()) { + $this->addHeader($header->toString()); + $this->signedHeaders[] = $header->getFieldName(); + } + } + } + } + } + + return $this; + } + + /** + * Add the signature to the given Headers. + * + * @return Swift_Signers_DKIMSigner + */ + public function addSignature(Swift_Mime_SimpleHeaderSet $headers) + { + // Prepare the DKIM-Signature + $params = ['v' => '1', 'a' => $this->hashAlgorithm, 'bh' => base64_encode($this->bodyHash), 'd' => $this->domainName, 'h' => implode(': ', $this->signedHeaders), 'i' => $this->signerIdentity, 's' => $this->selector]; + if ('simple' != $this->bodyCanon) { + $params['c'] = $this->headerCanon.'/'.$this->bodyCanon; + } elseif ('simple' != $this->headerCanon) { + $params['c'] = $this->headerCanon; + } + if ($this->showLen) { + $params['l'] = $this->bodyLen; + } + if (true === $this->signatureTimestamp) { + $params['t'] = time(); + if (false !== $this->signatureExpiration) { + $params['x'] = $params['t'] + $this->signatureExpiration; + } + } else { + if (false !== $this->signatureTimestamp) { + $params['t'] = $this->signatureTimestamp; + } + if (false !== $this->signatureExpiration) { + $params['x'] = $this->signatureExpiration; + } + } + if ($this->debugHeaders) { + $params['z'] = implode('|', $this->debugHeadersData); + } + $string = ''; + foreach ($params as $k => $v) { + $string .= $k.'='.$v.'; '; + } + $string = trim($string); + $headers->addTextHeader('DKIM-Signature', $string); + // Add the last DKIM-Signature + $tmp = $headers->getAll('DKIM-Signature'); + $this->dkimHeader = end($tmp); + $this->addHeader(trim($this->dkimHeader->toString())."\r\n b=", true); + if ($this->debugHeaders) { + $headers->addTextHeader('X-DebugHash', base64_encode($this->headerHash)); + } + $this->dkimHeader->setValue($string.' b='.trim(chunk_split(base64_encode($this->getEncryptedHash()), 73, ' '))); + + return $this; + } + + /* Private helpers */ + + protected function addHeader($header, $is_sig = false) + { + switch ($this->headerCanon) { + case 'relaxed': + // Prepare Header and cascade + $exploded = explode(':', $header, 2); + $name = strtolower(trim($exploded[0])); + $value = str_replace("\r\n", '', $exploded[1]); + $value = preg_replace("/[ \t][ \t]+/", ' ', $value); + $header = $name.':'.trim($value).($is_sig ? '' : "\r\n"); + // no break + case 'simple': + // Nothing to do + } + $this->addToHeaderHash($header); + } + + protected function canonicalizeBody($string) + { + $len = strlen($string); + $canon = ''; + $method = ('relaxed' == $this->bodyCanon); + for ($i = 0; $i < $len; ++$i) { + if ($this->bodyCanonIgnoreStart > 0) { + --$this->bodyCanonIgnoreStart; + continue; + } + switch ($string[$i]) { + case "\r": + $this->bodyCanonLastChar = "\r"; + break; + case "\n": + if ("\r" == $this->bodyCanonLastChar) { + if ($method) { + $this->bodyCanonSpace = false; + } + if ('' == $this->bodyCanonLine) { + ++$this->bodyCanonEmptyCounter; + } else { + $this->bodyCanonLine = ''; + $canon .= "\r\n"; + } + } else { + // Wooops Error + // todo handle it but should never happen + } + break; + case ' ': + case "\t": + if ($method) { + $this->bodyCanonSpace = true; + break; + } + // no break + default: + if ($this->bodyCanonEmptyCounter > 0) { + $canon .= str_repeat("\r\n", $this->bodyCanonEmptyCounter); + $this->bodyCanonEmptyCounter = 0; + } + if ($this->bodyCanonSpace) { + $this->bodyCanonLine .= ' '; + $canon .= ' '; + $this->bodyCanonSpace = false; + } + $this->bodyCanonLine .= $string[$i]; + $canon .= $string[$i]; + } + } + $this->addToBodyHash($canon); + } + + protected function endOfBody() + { + // Add trailing Line return if last line is non empty + if (strlen($this->bodyCanonLine) > 0) { + $this->addToBodyHash("\r\n"); + } + $this->bodyHash = hash_final($this->bodyHashHandler, true); + } + + private function addToBodyHash($string) + { + $len = strlen($string); + if ($len > ($new_len = ($this->maxLen - $this->bodyLen))) { + $string = substr($string, 0, $new_len); + $len = $new_len; + } + hash_update($this->bodyHashHandler, $string); + $this->bodyLen += $len; + } + + private function addToHeaderHash($header) + { + if ($this->debugHeaders) { + $this->debugHeadersData[] = trim($header); + } + $this->headerCanonData .= $header; + } + + /** + * @throws Swift_SwiftException + * + * @return string + */ + private function getEncryptedHash() + { + $signature = ''; + switch ($this->hashAlgorithm) { + case 'rsa-sha1': + $algorithm = OPENSSL_ALGO_SHA1; + break; + case 'rsa-sha256': + $algorithm = OPENSSL_ALGO_SHA256; + break; + } + $pkeyId = openssl_get_privatekey($this->privateKey, $this->passphrase); + if (!$pkeyId) { + throw new Swift_SwiftException('Unable to load DKIM Private Key ['.openssl_error_string().']'); + } + if (openssl_sign($this->headerCanonData, $signature, $pkeyId, $algorithm)) { + return $signature; + } + throw new Swift_SwiftException('Unable to sign DKIM Hash ['.openssl_error_string().']'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php new file mode 100644 index 0000000..a24d203 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php @@ -0,0 +1,504 @@ + + */ +class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner +{ + /** + * PrivateKey. + * + * @var string + */ + protected $privateKey; + + /** + * DomainName. + * + * @var string + */ + protected $domainName; + + /** + * Selector. + * + * @var string + */ + protected $selector; + + /** + * Hash algorithm used. + * + * @var string + */ + protected $hashAlgorithm = 'rsa-sha1'; + + /** + * Canonisation method. + * + * @var string + */ + protected $canon = 'simple'; + + /** + * Headers not being signed. + * + * @var array + */ + protected $ignoredHeaders = []; + + /** + * Signer identity. + * + * @var string + */ + protected $signerIdentity; + + /** + * Must we embed signed headers? + * + * @var bool + */ + protected $debugHeaders = false; + + // work variables + /** + * Headers used to generate hash. + * + * @var array + */ + private $signedHeaders = []; + + /** + * Stores the signature header. + * + * @var Swift_Mime_Headers_ParameterizedHeader + */ + protected $domainKeyHeader; + + /** + * Hash Handler. + * + * @var resource|null + */ + private $hashHandler; + + private $canonData = ''; + + private $bodyCanonEmptyCounter = 0; + + private $bodyCanonIgnoreStart = 2; + + private $bodyCanonSpace = false; + + private $bodyCanonLastChar = null; + + private $bodyCanonLine = ''; + + private $bound = []; + + /** + * Constructor. + * + * @param string $privateKey + * @param string $domainName + * @param string $selector + */ + public function __construct($privateKey, $domainName, $selector) + { + $this->privateKey = $privateKey; + $this->domainName = $domainName; + $this->signerIdentity = '@'.$domainName; + $this->selector = $selector; + } + + /** + * Resets internal states. + * + * @return $this + */ + public function reset() + { + $this->hashHandler = null; + $this->bodyCanonIgnoreStart = 2; + $this->bodyCanonEmptyCounter = 0; + $this->bodyCanonLastChar = null; + $this->bodyCanonSpace = false; + + return $this; + } + + /** + * Writes $bytes to the end of the stream. + * + * Writing may not happen immediately if the stream chooses to buffer. If + * you want to write these bytes with immediate effect, call {@link commit()} + * after calling write(). + * + * This method returns the sequence ID of the write (i.e. 1 for first, 2 for + * second, etc etc). + * + * @param string $bytes + * + * @return int + * + * @throws Swift_IoException + * + * @return $this + */ + public function write($bytes) + { + $this->canonicalizeBody($bytes); + foreach ($this->bound as $is) { + $is->write($bytes); + } + + return $this; + } + + /** + * For any bytes that are currently buffered inside the stream, force them + * off the buffer. + * + * @throws Swift_IoException + * + * @return $this + */ + public function commit() + { + // Nothing to do + return $this; + } + + /** + * Attach $is to this stream. + * + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + * + * @return $this + */ + public function bind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + $this->bound[] = $is; + + return $this; + } + + /** + * Remove an already bound stream. + * + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + * + * @return $this + */ + public function unbind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + foreach ($this->bound as $k => $stream) { + if ($stream === $is) { + unset($this->bound[$k]); + + break; + } + } + + return $this; + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + * + * @throws Swift_IoException + * + * @return $this + */ + public function flushBuffers() + { + $this->reset(); + + return $this; + } + + /** + * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1 defaults to rsa-sha256. + * + * @param string $hash + * + * @return $this + */ + public function setHashAlgorithm($hash) + { + $this->hashAlgorithm = 'rsa-sha1'; + + return $this; + } + + /** + * Set the canonicalization algorithm. + * + * @param string $canon simple | nofws defaults to simple + * + * @return $this + */ + public function setCanon($canon) + { + if ('nofws' == $canon) { + $this->canon = 'nofws'; + } else { + $this->canon = 'simple'; + } + + return $this; + } + + /** + * Set the signer identity. + * + * @param string $identity + * + * @return $this + */ + public function setSignerIdentity($identity) + { + $this->signerIdentity = $identity; + + return $this; + } + + /** + * Enable / disable the DebugHeaders. + * + * @param bool $debug + * + * @return $this + */ + public function setDebugHeaders($debug) + { + $this->debugHeaders = (bool) $debug; + + return $this; + } + + /** + * Start Body. + */ + public function startBody() + { + } + + /** + * End Body. + */ + public function endBody() + { + $this->endOfBody(); + } + + /** + * Returns the list of Headers Tampered by this plugin. + * + * @return array + */ + public function getAlteredHeaders() + { + if ($this->debugHeaders) { + return ['DomainKey-Signature', 'X-DebugHash']; + } + + return ['DomainKey-Signature']; + } + + /** + * Adds an ignored Header. + * + * @param string $header_name + * + * @return $this + */ + public function ignoreHeader($header_name) + { + $this->ignoredHeaders[strtolower($header_name)] = true; + + return $this; + } + + /** + * Set the headers to sign. + * + * @return $this + */ + public function setHeaders(Swift_Mime_SimpleHeaderSet $headers) + { + $this->startHash(); + $this->canonData = ''; + // Loop through Headers + $listHeaders = $headers->listAll(); + foreach ($listHeaders as $hName) { + // Check if we need to ignore Header + if (!isset($this->ignoredHeaders[strtolower($hName)])) { + if ($headers->has($hName)) { + $tmp = $headers->getAll($hName); + foreach ($tmp as $header) { + if ('' != $header->getFieldBody()) { + $this->addHeader($header->toString()); + $this->signedHeaders[] = $header->getFieldName(); + } + } + } + } + } + $this->endOfHeaders(); + + return $this; + } + + /** + * Add the signature to the given Headers. + * + * @return $this + */ + public function addSignature(Swift_Mime_SimpleHeaderSet $headers) + { + // Prepare the DomainKey-Signature Header + $params = ['a' => $this->hashAlgorithm, 'b' => chunk_split(base64_encode($this->getEncryptedHash()), 73, ' '), 'c' => $this->canon, 'd' => $this->domainName, 'h' => implode(': ', $this->signedHeaders), 'q' => 'dns', 's' => $this->selector]; + $string = ''; + foreach ($params as $k => $v) { + $string .= $k.'='.$v.'; '; + } + $string = trim($string); + $headers->addTextHeader('DomainKey-Signature', $string); + + return $this; + } + + /* Private helpers */ + + protected function addHeader($header) + { + switch ($this->canon) { + case 'nofws': + // Prepare Header and cascade + $exploded = explode(':', $header, 2); + $name = strtolower(trim($exploded[0])); + $value = str_replace("\r\n", '', $exploded[1]); + $value = preg_replace("/[ \t][ \t]+/", ' ', $value); + $header = $name.':'.trim($value)."\r\n"; + // no break + case 'simple': + // Nothing to do + } + $this->addToHash($header); + } + + protected function endOfHeaders() + { + $this->bodyCanonEmptyCounter = 1; + } + + protected function canonicalizeBody($string) + { + $len = strlen($string); + $canon = ''; + $nofws = ('nofws' == $this->canon); + for ($i = 0; $i < $len; ++$i) { + if ($this->bodyCanonIgnoreStart > 0) { + --$this->bodyCanonIgnoreStart; + continue; + } + switch ($string[$i]) { + case "\r": + $this->bodyCanonLastChar = "\r"; + break; + case "\n": + if ("\r" == $this->bodyCanonLastChar) { + if ($nofws) { + $this->bodyCanonSpace = false; + } + if ('' == $this->bodyCanonLine) { + ++$this->bodyCanonEmptyCounter; + } else { + $this->bodyCanonLine = ''; + $canon .= "\r\n"; + } + } else { + // Wooops Error + throw new Swift_SwiftException('Invalid new line sequence in mail found \n without preceding \r'); + } + break; + case ' ': + case "\t": + case "\x09": //HTAB + if ($nofws) { + $this->bodyCanonSpace = true; + break; + } + // no break + default: + if ($this->bodyCanonEmptyCounter > 0) { + $canon .= str_repeat("\r\n", $this->bodyCanonEmptyCounter); + $this->bodyCanonEmptyCounter = 0; + } + $this->bodyCanonLine .= $string[$i]; + $canon .= $string[$i]; + } + } + $this->addToHash($canon); + } + + protected function endOfBody() + { + if (strlen($this->bodyCanonLine) > 0) { + $this->addToHash("\r\n"); + } + } + + private function addToHash($string) + { + $this->canonData .= $string; + hash_update($this->hashHandler, $string); + } + + private function startHash() + { + // Init + switch ($this->hashAlgorithm) { + case 'rsa-sha1': + $this->hashHandler = hash_init('sha1'); + break; + } + $this->bodyCanonLine = ''; + } + + /** + * @throws Swift_SwiftException + * + * @return string + */ + private function getEncryptedHash() + { + $signature = ''; + $pkeyId = openssl_get_privatekey($this->privateKey); + if (!$pkeyId) { + throw new Swift_SwiftException('Unable to load DomainKey Private Key ['.openssl_error_string().']'); + } + if (openssl_sign($this->canonData, $signature, $pkeyId, OPENSSL_ALGO_SHA1)) { + return $signature; + } + throw new Swift_SwiftException('Unable to sign DomainKey Hash ['.openssl_error_string().']'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php new file mode 100644 index 0000000..6104e34 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php @@ -0,0 +1,65 @@ + + */ +interface Swift_Signers_HeaderSigner extends Swift_Signer, Swift_InputByteStream +{ + /** + * Exclude an header from the signed headers. + * + * @param string $header_name + * + * @return self + */ + public function ignoreHeader($header_name); + + /** + * Prepare the Signer to get a new Body. + * + * @return self + */ + public function startBody(); + + /** + * Give the signal that the body has finished streaming. + * + * @return self + */ + public function endBody(); + + /** + * Give the headers already given. + * + * @param Swift_Mime_SimpleHeaderSet $headers + * + * @return self + */ + public function setHeaders(Swift_Mime_SimpleHeaderSet $headers); + + /** + * Add the header(s) to the headerSet. + * + * @param Swift_Mime_SimpleHeaderSet $headers + * + * @return self + */ + public function addSignature(Swift_Mime_SimpleHeaderSet $headers); + + /** + * Return the list of header a signer might tamper. + * + * @return array + */ + public function getAlteredHeaders(); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php new file mode 100644 index 0000000..7b50c51 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php @@ -0,0 +1,183 @@ + + * + * @deprecated since SwiftMailer 6.1.0; use Swift_Signers_DKIMSigner instead. + */ +class Swift_Signers_OpenDKIMSigner extends Swift_Signers_DKIMSigner +{ + private $peclLoaded = false; + + private $dkimHandler = null; + + private $dropFirstLF = true; + + const CANON_RELAXED = 1; + const CANON_SIMPLE = 2; + const SIG_RSA_SHA1 = 3; + const SIG_RSA_SHA256 = 4; + + public function __construct($privateKey, $domainName, $selector) + { + if (!extension_loaded('opendkim')) { + throw new Swift_SwiftException('php-opendkim extension not found'); + } + + $this->peclLoaded = true; + + parent::__construct($privateKey, $domainName, $selector); + } + + public function addSignature(Swift_Mime_SimpleHeaderSet $headers) + { + $header = new Swift_Mime_Headers_OpenDKIMHeader('DKIM-Signature'); + $headerVal = $this->dkimHandler->getSignatureHeader(); + if (false === $headerVal || is_int($headerVal)) { + throw new Swift_SwiftException('OpenDKIM Error: '.$this->dkimHandler->getError()); + } + $header->setValue($headerVal); + $headers->set($header); + + return $this; + } + + public function setHeaders(Swift_Mime_SimpleHeaderSet $headers) + { + $hash = 'rsa-sha1' == $this->hashAlgorithm ? OpenDKIMSign::ALG_RSASHA1 : OpenDKIMSign::ALG_RSASHA256; + $bodyCanon = 'simple' == $this->bodyCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED; + $headerCanon = 'simple' == $this->headerCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED; + $this->dkimHandler = new OpenDKIMSign($this->privateKey, $this->selector, $this->domainName, $headerCanon, $bodyCanon, $hash, -1); + // Hardcode signature Margin for now + $this->dkimHandler->setMargin(78); + + if (!is_numeric($this->signatureTimestamp)) { + OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, time()); + } else { + if (!OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, $this->signatureTimestamp)) { + throw new Swift_SwiftException('Unable to force signature timestamp ['.openssl_error_string().']'); + } + } + if (isset($this->signerIdentity)) { + $this->dkimHandler->setSigner($this->signerIdentity); + } + $listHeaders = $headers->listAll(); + foreach ($listHeaders as $hName) { + // Check if we need to ignore Header + if (!isset($this->ignoredHeaders[strtolower($hName)])) { + $tmp = $headers->getAll($hName); + if ($headers->has($hName)) { + foreach ($tmp as $header) { + if ('' != $header->getFieldBody()) { + $htosign = $header->toString(); + $this->dkimHandler->header($htosign); + $this->signedHeaders[] = $header->getFieldName(); + } + } + } + } + } + + return $this; + } + + public function startBody() + { + if (!$this->peclLoaded) { + return parent::startBody(); + } + $this->dropFirstLF = true; + $this->dkimHandler->eoh(); + + return $this; + } + + public function endBody() + { + if (!$this->peclLoaded) { + return parent::endBody(); + } + $this->dkimHandler->eom(); + + return $this; + } + + public function reset() + { + $this->dkimHandler = null; + parent::reset(); + + return $this; + } + + /** + * Set the signature timestamp. + * + * @param int $time + * + * @return $this + */ + public function setSignatureTimestamp($time) + { + $this->signatureTimestamp = $time; + + return $this; + } + + /** + * Set the signature expiration timestamp. + * + * @param int $time + * + * @return $this + */ + public function setSignatureExpiration($time) + { + $this->signatureExpiration = $time; + + return $this; + } + + /** + * Enable / disable the DebugHeaders. + * + * @param bool $debug + * + * @return $this + */ + public function setDebugHeaders($debug) + { + $this->debugHeaders = (bool) $debug; + + return $this; + } + + // Protected + + protected function canonicalizeBody($string) + { + if (!$this->peclLoaded) { + return parent::canonicalizeBody($string); + } + if (true === $this->dropFirstLF) { + if ("\r" == $string[0] && "\n" == $string[1]) { + $string = substr($string, 2); + } + } + $this->dropFirstLF = false; + if (strlen($string)) { + $this->dkimHandler->body($string); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php new file mode 100644 index 0000000..84c53ed --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php @@ -0,0 +1,542 @@ + + * @author Jan Flora + */ +class Swift_Signers_SMimeSigner implements Swift_Signers_BodySigner +{ + protected $signCertificate; + protected $signPrivateKey; + protected $encryptCert; + protected $signThenEncrypt = true; + protected $signLevel; + protected $encryptLevel; + protected $signOptions; + protected $encryptOptions; + protected $encryptCipher; + protected $extraCerts = null; + protected $wrapFullMessage = false; + + /** + * @var Swift_StreamFilters_StringReplacementFilterFactory + */ + protected $replacementFactory; + + /** + * @var Swift_Mime_SimpleHeaderFactory + */ + protected $headerFactory; + + /** + * Constructor. + * + * @param string|null $signCertificate + * @param string|null $signPrivateKey + * @param string|null $encryptCertificate + */ + public function __construct($signCertificate = null, $signPrivateKey = null, $encryptCertificate = null) + { + if (null !== $signPrivateKey) { + $this->setSignCertificate($signCertificate, $signPrivateKey); + } + + if (null !== $encryptCertificate) { + $this->setEncryptCertificate($encryptCertificate); + } + + $this->replacementFactory = Swift_DependencyContainer::getInstance() + ->lookup('transport.replacementfactory'); + + $this->signOptions = PKCS7_DETACHED; + $this->encryptCipher = OPENSSL_CIPHER_AES_128_CBC; + } + + /** + * Set the certificate location to use for signing. + * + * @see https://secure.php.net/manual/en/openssl.pkcs7.flags.php + * + * @param string $certificate + * @param string|array $privateKey If the key needs an passphrase use array('file-location', 'passphrase') instead + * @param int $signOptions Bitwise operator options for openssl_pkcs7_sign() + * @param string $extraCerts A file containing intermediate certificates needed by the signing certificate + * + * @return $this + */ + public function setSignCertificate($certificate, $privateKey = null, $signOptions = PKCS7_DETACHED, $extraCerts = null) + { + $this->signCertificate = 'file://'.str_replace('\\', '/', realpath($certificate)); + + if (null !== $privateKey) { + if (is_array($privateKey)) { + $this->signPrivateKey = $privateKey; + $this->signPrivateKey[0] = 'file://'.str_replace('\\', '/', realpath($privateKey[0])); + } else { + $this->signPrivateKey = 'file://'.str_replace('\\', '/', realpath($privateKey)); + } + } + + $this->signOptions = $signOptions; + $this->extraCerts = $extraCerts ? realpath($extraCerts) : null; + + return $this; + } + + /** + * Set the certificate location to use for encryption. + * + * @see https://secure.php.net/manual/en/openssl.pkcs7.flags.php + * @see https://secure.php.net/manual/en/openssl.ciphers.php + * + * @param string|array $recipientCerts Either an single X.509 certificate, or an assoc array of X.509 certificates. + * @param int $cipher + * + * @return $this + */ + public function setEncryptCertificate($recipientCerts, $cipher = null) + { + if (is_array($recipientCerts)) { + $this->encryptCert = []; + + foreach ($recipientCerts as $cert) { + $this->encryptCert[] = 'file://'.str_replace('\\', '/', realpath($cert)); + } + } else { + $this->encryptCert = 'file://'.str_replace('\\', '/', realpath($recipientCerts)); + } + + if (null !== $cipher) { + $this->encryptCipher = $cipher; + } + + return $this; + } + + /** + * @return string + */ + public function getSignCertificate() + { + return $this->signCertificate; + } + + /** + * @return string + */ + public function getSignPrivateKey() + { + return $this->signPrivateKey; + } + + /** + * Set perform signing before encryption. + * + * The default is to first sign the message and then encrypt. + * But some older mail clients, namely Microsoft Outlook 2000 will work when the message first encrypted. + * As this goes against the official specs, its recommended to only use 'encryption -> signing' when specifically targeting these 'broken' clients. + * + * @param bool $signThenEncrypt + * + * @return $this + */ + public function setSignThenEncrypt($signThenEncrypt = true) + { + $this->signThenEncrypt = $signThenEncrypt; + + return $this; + } + + /** + * @return bool + */ + public function isSignThenEncrypt() + { + return $this->signThenEncrypt; + } + + /** + * Resets internal states. + * + * @return $this + */ + public function reset() + { + return $this; + } + + /** + * Specify whether to wrap the entire MIME message in the S/MIME message. + * + * According to RFC5751 section 3.1: + * In order to protect outer, non-content-related message header fields + * (for instance, the "Subject", "To", "From", and "Cc" fields), the + * sending client MAY wrap a full MIME message in a message/rfc822 + * wrapper in order to apply S/MIME security services to these header + * fields. It is up to the receiving client to decide how to present + * this "inner" header along with the unprotected "outer" header. + * + * @param bool $wrap + * + * @return $this + */ + public function setWrapFullMessage($wrap) + { + $this->wrapFullMessage = $wrap; + } + + /** + * Change the Swift_Message to apply the signing. + * + * @return $this + */ + public function signMessage(Swift_Message $message) + { + if (null === $this->signCertificate && null === $this->encryptCert) { + return $this; + } + + if ($this->signThenEncrypt) { + $this->smimeSignMessage($message); + $this->smimeEncryptMessage($message); + } else { + $this->smimeEncryptMessage($message); + $this->smimeSignMessage($message); + } + } + + /** + * Return the list of header a signer might tamper. + * + * @return array + */ + public function getAlteredHeaders() + { + return ['Content-Type', 'Content-Transfer-Encoding', 'Content-Disposition']; + } + + /** + * Sign a Swift message. + */ + protected function smimeSignMessage(Swift_Message $message) + { + // If we don't have a certificate we can't sign the message + if (null === $this->signCertificate) { + return; + } + + // Work on a clone of the original message + $signMessage = clone $message; + $signMessage->clearSigners(); + + if ($this->wrapFullMessage) { + // The original message essentially becomes the body of the new + // wrapped message + $signMessage = $this->wrapMimeMessage($signMessage); + } else { + // Only keep header needed to parse the body correctly + $this->clearAllHeaders($signMessage); + $this->copyHeaders( + $message, + $signMessage, + [ + 'Content-Type', + 'Content-Transfer-Encoding', + 'Content-Disposition', + ] + ); + } + + // Copy the cloned message into a temporary file stream + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $signMessage->toByteStream($messageStream); + $messageStream->commit(); + $signedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + // Sign the message using openssl + if (!openssl_pkcs7_sign( + $messageStream->getPath(), + $signedMessageStream->getPath(), + $this->signCertificate, + $this->signPrivateKey, + [], + $this->signOptions, + $this->extraCerts + ) + ) { + throw new Swift_IoException(sprintf('Failed to sign S/Mime message. Error: "%s".', openssl_error_string())); + } + + // Parse the resulting signed message content back into the Swift message + // preserving the original headers + $this->parseSSLOutput($signedMessageStream, $message); + } + + /** + * Encrypt a Swift message. + */ + protected function smimeEncryptMessage(Swift_Message $message) + { + // If we don't have a certificate we can't encrypt the message + if (null === $this->encryptCert) { + return; + } + + // Work on a clone of the original message + $encryptMessage = clone $message; + $encryptMessage->clearSigners(); + + if ($this->wrapFullMessage) { + // The original message essentially becomes the body of the new + // wrapped message + $encryptMessage = $this->wrapMimeMessage($encryptMessage); + } else { + // Only keep header needed to parse the body correctly + $this->clearAllHeaders($encryptMessage); + $this->copyHeaders( + $message, + $encryptMessage, + [ + 'Content-Type', + 'Content-Transfer-Encoding', + 'Content-Disposition', + ] + ); + } + + // Convert the message content (including headers) to a string + // and place it in a temporary file + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $encryptMessage->toByteStream($messageStream); + $messageStream->commit(); + $encryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + // Encrypt the message + if (!openssl_pkcs7_encrypt( + $messageStream->getPath(), + $encryptedMessageStream->getPath(), + $this->encryptCert, + [], + 0, + $this->encryptCipher + ) + ) { + throw new Swift_IoException(sprintf('Failed to encrypt S/Mime message. Error: "%s".', openssl_error_string())); + } + + // Parse the resulting signed message content back into the Swift message + // preserving the original headers + $this->parseSSLOutput($encryptedMessageStream, $message); + } + + /** + * Copy named headers from one Swift message to another. + */ + protected function copyHeaders( + Swift_Message $fromMessage, + Swift_Message $toMessage, + array $headers = [] + ) { + foreach ($headers as $header) { + $this->copyHeader($fromMessage, $toMessage, $header); + } + } + + /** + * Copy a single header from one Swift message to another. + * + * @param string $headerName + */ + protected function copyHeader(Swift_Message $fromMessage, Swift_Message $toMessage, $headerName) + { + $header = $fromMessage->getHeaders()->get($headerName); + if (!$header) { + return; + } + $headers = $toMessage->getHeaders(); + switch ($header->getFieldType()) { + case Swift_Mime_Header::TYPE_TEXT: + $headers->addTextHeader($header->getFieldName(), $header->getValue()); + break; + case Swift_Mime_Header::TYPE_PARAMETERIZED: + $headers->addParameterizedHeader( + $header->getFieldName(), + $header->getValue(), + $header->getParameters() + ); + break; + } + } + + /** + * Remove all headers from a Swift message. + */ + protected function clearAllHeaders(Swift_Message $message) + { + $headers = $message->getHeaders(); + foreach ($headers->listAll() as $header) { + $headers->removeAll($header); + } + } + + /** + * Wraps a Swift_Message in a message/rfc822 MIME part. + * + * @return Swift_MimePart + */ + protected function wrapMimeMessage(Swift_Message $message) + { + // Start by copying the original message into a message stream + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + // Create a new MIME part that wraps the original stream + $wrappedMessage = new Swift_MimePart($messageStream, 'message/rfc822'); + $wrappedMessage->setEncoder(new Swift_Mime_ContentEncoder_PlainContentEncoder('7bit')); + + return $wrappedMessage; + } + + protected function parseSSLOutput(Swift_InputByteStream $inputStream, Swift_Message $message) + { + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $this->copyFromOpenSSLOutput($inputStream, $messageStream); + + $this->streamToMime($messageStream, $message); + } + + /** + * Merges an OutputByteStream from OpenSSL to a Swift_Message. + */ + protected function streamToMime(Swift_OutputByteStream $fromStream, Swift_Message $message) + { + // Parse the stream into headers and body + list($headers, $messageStream) = $this->parseStream($fromStream); + + // Get the original message headers + $messageHeaders = $message->getHeaders(); + + // Let the stream determine the headers describing the body content, + // since the body of the original message is overwritten by the body + // coming from the stream. + // These are all content-* headers. + + // Default transfer encoding is 7bit if not set + $encoding = ''; + // Remove all existing transfer encoding headers + $messageHeaders->removeAll('Content-Transfer-Encoding'); + // See whether the stream sets the transfer encoding + if (isset($headers['content-transfer-encoding'])) { + $encoding = $headers['content-transfer-encoding']; + } + + // We use the null content encoder, since the body is already encoded + // according to the transfer encoding specified in the stream + $message->setEncoder(new Swift_Mime_ContentEncoder_NullContentEncoder($encoding)); + + // Set the disposition, if present + if (isset($headers['content-disposition'])) { + $messageHeaders->addTextHeader('Content-Disposition', $headers['content-disposition']); + } + + // Copy over the body from the stream using the content type dictated + // by the stream content + $message->setChildren([]); + $message->setBody($messageStream, $headers['content-type']); + } + + /** + * This message will parse the headers of a MIME email byte stream + * and return an array that contains the headers as an associative + * array and the email body as a string. + * + * @return array + */ + protected function parseStream(Swift_OutputByteStream $emailStream) + { + $bufferLength = 78; + $headerData = ''; + $headerBodySeparator = "\r\n\r\n"; + + $emailStream->setReadPointer(0); + + // Read out the headers section from the stream to a string + while (false !== ($buffer = $emailStream->read($bufferLength))) { + $headerData .= $buffer; + + $headersPosEnd = strpos($headerData, $headerBodySeparator); + + // Stop reading if we found the end of the headers + if (false !== $headersPosEnd) { + break; + } + } + + // Split the header data into lines + $headerData = trim(substr($headerData, 0, $headersPosEnd)); + $headerLines = explode("\r\n", $headerData); + unset($headerData); + + $headers = []; + $currentHeaderName = ''; + + // Transform header lines into an associative array + foreach ($headerLines as $headerLine) { + // Handle headers that span multiple lines + if (false === strpos($headerLine, ':')) { + $headers[$currentHeaderName] .= ' '.trim($headerLine); + continue; + } + + $header = explode(':', $headerLine, 2); + $currentHeaderName = strtolower($header[0]); + $headers[$currentHeaderName] = trim($header[1]); + } + + // Read the entire email body into a byte stream + $bodyStream = new Swift_ByteStream_TemporaryFileByteStream(); + + // Skip the header and separator and point to the body + $emailStream->setReadPointer($headersPosEnd + strlen($headerBodySeparator)); + + while (false !== ($buffer = $emailStream->read($bufferLength))) { + $bodyStream->write($buffer); + } + + $bodyStream->commit(); + + return [$headers, $bodyStream]; + } + + protected function copyFromOpenSSLOutput(Swift_OutputByteStream $fromStream, Swift_InputByteStream $toStream) + { + $bufferLength = 4096; + $filteredStream = new Swift_ByteStream_TemporaryFileByteStream(); + $filteredStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF'); + $filteredStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF'); + + while (false !== ($buffer = $fromStream->read($bufferLength))) { + $filteredStream->write($buffer); + } + + $filteredStream->flushBuffers(); + + while (false !== ($buffer = $filteredStream->read($bufferLength))) { + $toStream->write($buffer); + } + + $toStream->commit(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php new file mode 100644 index 0000000..e241e67 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php @@ -0,0 +1,42 @@ +createDependenciesFor('transport.smtp') + ); + + $this->setHost($host); + $this->setPort($port); + $this->setEncryption($encryption); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Spool.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Spool.php new file mode 100644 index 0000000..9d0e8fe --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Spool.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Interface for spools. + * + * @author Fabien Potencier + */ +interface Swift_Spool +{ + /** + * Starts this Spool mechanism. + */ + public function start(); + + /** + * Stops this Spool mechanism. + */ + public function stop(); + + /** + * Tests if this Spool mechanism has started. + * + * @return bool + */ + public function isStarted(); + + /** + * Queues a message. + * + * @param Swift_Mime_SimpleMessage $message The message to store + * + * @return bool Whether the operation has succeeded + */ + public function queueMessage(Swift_Mime_SimpleMessage $message); + + /** + * Sends messages using the given transport instance. + * + * @param Swift_Transport $transport A transport instance + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent emails + */ + public function flushQueue(Swift_Transport $transport, &$failedRecipients = null); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SpoolTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SpoolTransport.php new file mode 100644 index 0000000..4b30f04 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SpoolTransport.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Stores Messages in a queue. + * + * @author Fabien Potencier + */ +class Swift_SpoolTransport extends Swift_Transport_SpoolTransport +{ + /** + * Create a new SpoolTransport. + */ + public function __construct(Swift_Spool $spool) + { + $arguments = Swift_DependencyContainer::getInstance() + ->createDependenciesFor('transport.spool'); + + $arguments[] = $spool; + + call_user_func_array( + [$this, 'Swift_Transport_SpoolTransport::__construct'], + $arguments + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilter.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilter.php new file mode 100644 index 0000000..362be2e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilter.php @@ -0,0 +1,35 @@ +index = []; + $this->tree = []; + $this->replace = []; + $this->repSize = []; + + $tree = null; + $i = null; + $last_size = $size = 0; + foreach ($search as $i => $search_element) { + if (null !== $tree) { + $tree[-1] = min(count($replace) - 1, $i - 1); + $tree[-2] = $last_size; + } + $tree = &$this->tree; + if (is_array($search_element)) { + foreach ($search_element as $k => $char) { + $this->index[$char] = true; + if (!isset($tree[$char])) { + $tree[$char] = []; + } + $tree = &$tree[$char]; + } + $last_size = $k + 1; + $size = max($size, $last_size); + } else { + $last_size = 1; + if (!isset($tree[$search_element])) { + $tree[$search_element] = []; + } + $tree = &$tree[$search_element]; + $size = max($last_size, $size); + $this->index[$search_element] = true; + } + } + if (null !== $i) { + $tree[-1] = min(count($replace) - 1, $i); + $tree[-2] = $last_size; + $this->treeMaxLen = $size; + } + foreach ($replace as $rep) { + if (!is_array($rep)) { + $rep = [$rep]; + } + $this->replace[] = $rep; + } + for ($i = count($this->replace) - 1; $i >= 0; --$i) { + $this->replace[$i] = $rep = $this->filter($this->replace[$i], $i); + $this->repSize[$i] = count($rep); + } + } + + /** + * Returns true if based on the buffer passed more bytes should be buffered. + * + * @param array $buffer + * + * @return bool + */ + public function shouldBuffer($buffer) + { + $endOfBuffer = end($buffer); + + return isset($this->index[$endOfBuffer]); + } + + /** + * Perform the actual replacements on $buffer and return the result. + * + * @param array $buffer + * @param int $minReplaces + * + * @return array + */ + public function filter($buffer, $minReplaces = -1) + { + if (0 == $this->treeMaxLen) { + return $buffer; + } + + $newBuffer = []; + $buf_size = count($buffer); + $last_size = 0; + for ($i = 0; $i < $buf_size; ++$i) { + $search_pos = $this->tree; + $last_found = PHP_INT_MAX; + // We try to find if the next byte is part of a search pattern + for ($j = 0; $j <= $this->treeMaxLen; ++$j) { + // We have a new byte for a search pattern + if (isset($buffer[$p = $i + $j]) && isset($search_pos[$buffer[$p]])) { + $search_pos = $search_pos[$buffer[$p]]; + // We have a complete pattern, save, in case we don't find a better match later + if (isset($search_pos[-1]) && $search_pos[-1] < $last_found + && $search_pos[-1] > $minReplaces) { + $last_found = $search_pos[-1]; + $last_size = $search_pos[-2]; + } + } + // We got a complete pattern + elseif (PHP_INT_MAX !== $last_found) { + // Adding replacement datas to output buffer + $rep_size = $this->repSize[$last_found]; + for ($j = 0; $j < $rep_size; ++$j) { + $newBuffer[] = $this->replace[$last_found][$j]; + } + // We Move cursor forward + $i += $last_size - 1; + // Edge Case, last position in buffer + if ($i >= $buf_size) { + $newBuffer[] = $buffer[$i]; + } + + // We start the next loop + continue 2; + } else { + // this byte is not in a pattern and we haven't found another pattern + break; + } + } + // Normal byte, move it to output buffer + $newBuffer[] = $buffer[$i]; + } + + return $newBuffer; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilter.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilter.php new file mode 100644 index 0000000..50a63f1 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilter.php @@ -0,0 +1,70 @@ +search = $search; + $this->replace = $replace; + } + + /** + * Returns true if based on the buffer passed more bytes should be buffered. + * + * @param string $buffer + * + * @return bool + */ + public function shouldBuffer($buffer) + { + if ('' === $buffer) { + return false; + } + + $endOfBuffer = substr($buffer, -1); + foreach ((array) $this->search as $needle) { + if (false !== strpos($needle, $endOfBuffer)) { + return true; + } + } + + return false; + } + + /** + * Perform the actual replacements on $buffer and return the result. + * + * @param string $buffer + * + * @return string + */ + public function filter($buffer) + { + return str_replace($this->search, $this->replace, $buffer); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilterFactory.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilterFactory.php new file mode 100644 index 0000000..783b889 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilterFactory.php @@ -0,0 +1,45 @@ +filters[$search][$replace])) { + if (!isset($this->filters[$search])) { + $this->filters[$search] = []; + } + + if (!isset($this->filters[$search][$replace])) { + $this->filters[$search][$replace] = []; + } + + $this->filters[$search][$replace] = new Swift_StreamFilters_StringReplacementFilter($search, $replace); + } + + return $this->filters[$search][$replace]; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SwiftException.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SwiftException.php new file mode 100644 index 0000000..15e68b1 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SwiftException.php @@ -0,0 +1,28 @@ +ping()) { + * $transport->stop(); + * $transport->start(); + * } + * + * The Transport mechanism will be started, if it is not already. + * + * It is undefined if the Transport mechanism attempts to restart as long as + * the return value reflects whether the mechanism is now functional. + * + * @return bool TRUE if the transport is alive + */ + public function ping(); + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * This is the responsibility of the send method to start the transport if needed. + * + * @param Swift_Mime_SimpleMessage $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null); + + /** + * Register a plugin in the Transport. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php new file mode 100644 index 0000000..18c8d9b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php @@ -0,0 +1,543 @@ +buffer = $buf; + $this->eventDispatcher = $dispatcher; + $this->addressEncoder = $addressEncoder ?? new Swift_AddressEncoder_IdnAddressEncoder(); + $this->setLocalDomain($localDomain); + } + + /** + * Set the name of the local domain which Swift will identify itself as. + * + * This should be a fully-qualified domain name and should be truly the domain + * you're using. + * + * If your server does not have a domain name, use the IP address. This will + * automatically be wrapped in square brackets as described in RFC 5321, + * section 4.1.3. + * + * @param string $domain + * + * @return $this + */ + public function setLocalDomain($domain) + { + if ('[' !== substr($domain, 0, 1)) { + if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + $domain = '['.$domain.']'; + } elseif (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + $domain = '[IPv6:'.$domain.']'; + } + } + + $this->domain = $domain; + + return $this; + } + + /** + * Get the name of the domain Swift will identify as. + * + * If an IP address was specified, this will be returned wrapped in square + * brackets as described in RFC 5321, section 4.1.3. + * + * @return string + */ + public function getLocalDomain() + { + return $this->domain; + } + + /** + * Sets the source IP. + * + * @param string $source + */ + public function setSourceIp($source) + { + $this->sourceIp = $source; + } + + /** + * Returns the IP used to connect to the destination. + * + * @return string + */ + public function getSourceIp() + { + return $this->sourceIp; + } + + public function setAddressEncoder(Swift_AddressEncoder $addressEncoder) + { + $this->addressEncoder = $addressEncoder; + } + + public function getAddressEncoder() + { + return $this->addressEncoder; + } + + /** + * Start the SMTP connection. + */ + public function start() + { + if (!$this->started) { + if ($evt = $this->eventDispatcher->createTransportChangeEvent($this)) { + $this->eventDispatcher->dispatchEvent($evt, 'beforeTransportStarted'); + if ($evt->bubbleCancelled()) { + return; + } + } + + try { + $this->buffer->initialize($this->getBufferParams()); + } catch (Swift_TransportException $e) { + $this->throwException($e); + } + $this->readGreeting(); + $this->doHeloCommand(); + + if ($evt) { + $this->eventDispatcher->dispatchEvent($evt, 'transportStarted'); + } + + $this->started = true; + } + } + + /** + * Test if an SMTP connection has been established. + * + * @return bool + */ + public function isStarted() + { + return $this->started; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) + { + if (!$this->isStarted()) { + $this->start(); + } + + $sent = 0; + $failedRecipients = (array) $failedRecipients; + + if ($evt = $this->eventDispatcher->createSendEvent($this, $message)) { + $this->eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + if (!$reversePath = $this->getReversePath($message)) { + $this->throwException(new Swift_TransportException('Cannot send message without a sender address')); + } + + $to = (array) $message->getTo(); + $cc = (array) $message->getCc(); + $tos = array_merge($to, $cc); + $bcc = (array) $message->getBcc(); + + $message->setBcc([]); + + try { + $sent += $this->sendTo($message, $reversePath, $tos, $failedRecipients); + $sent += $this->sendBcc($message, $reversePath, $bcc, $failedRecipients); + } finally { + $message->setBcc($bcc); + } + + if ($evt) { + if ($sent == count($to) + count($cc) + count($bcc)) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + } elseif ($sent > 0) { + $evt->setResult(Swift_Events_SendEvent::RESULT_TENTATIVE); + } else { + $evt->setResult(Swift_Events_SendEvent::RESULT_FAILED); + } + $evt->setFailedRecipients($failedRecipients); + $this->eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $message->generateId(); //Make sure a new Message ID is used + + return $sent; + } + + /** + * Stop the SMTP connection. + */ + public function stop() + { + if ($this->started) { + if ($evt = $this->eventDispatcher->createTransportChangeEvent($this)) { + $this->eventDispatcher->dispatchEvent($evt, 'beforeTransportStopped'); + if ($evt->bubbleCancelled()) { + return; + } + } + + try { + $this->executeCommand("QUIT\r\n", [221]); + } catch (Swift_TransportException $e) { + } + + try { + $this->buffer->terminate(); + + if ($evt) { + $this->eventDispatcher->dispatchEvent($evt, 'transportStopped'); + } + } catch (Swift_TransportException $e) { + $this->throwException($e); + } + } + $this->started = false; + } + + /** + * {@inheritdoc} + */ + public function ping() + { + try { + if (!$this->isStarted()) { + $this->start(); + } + + $this->executeCommand("NOOP\r\n", [250]); + } catch (Swift_TransportException $e) { + try { + $this->stop(); + } catch (Swift_TransportException $e) { + } + + return false; + } + + return true; + } + + /** + * Register a plugin. + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->eventDispatcher->bindEventListener($plugin); + } + + /** + * Reset the current mail transaction. + */ + public function reset() + { + $this->executeCommand("RSET\r\n", [250], $failures, true); + } + + /** + * Get the IoBuffer where read/writes are occurring. + * + * @return Swift_Transport_IoBuffer + */ + public function getBuffer() + { + return $this->buffer; + } + + /** + * Run a command against the buffer, expecting the given response codes. + * + * If no response codes are given, the response will not be validated. + * If codes are given, an exception will be thrown on an invalid response. + * If the command is RCPT TO, and the pipeline is non-empty, no exception + * will be thrown; instead the failing address is added to $failures. + * + * @param string $command + * @param int[] $codes + * @param string[] $failures An array of failures by-reference + * @param bool $pipeline Do not wait for response + * @param string $address The address, if command is RCPT TO. + * + * @return string|null The server response, or null if pipelining is enabled + */ + public function executeCommand($command, $codes = [], &$failures = null, $pipeline = false, $address = null) + { + $failures = (array) $failures; + $seq = $this->buffer->write($command); + if ($evt = $this->eventDispatcher->createCommandEvent($this, $command, $codes)) { + $this->eventDispatcher->dispatchEvent($evt, 'commandSent'); + } + + $this->pipeline[] = [$command, $seq, $codes, $address]; + if ($pipeline && $this->pipelining) { + $response = null; + } else { + while ($this->pipeline) { + list($command, $seq, $codes, $address) = array_shift($this->pipeline); + $response = $this->getFullResponse($seq); + try { + $this->assertResponseCode($response, $codes); + } catch (Swift_TransportException $e) { + if ($this->pipeline && $address) { + $failures[] = $address; + } else { + $this->throwException($e); + } + } + } + } + + return $response; + } + + /** Read the opening SMTP greeting */ + protected function readGreeting() + { + $this->assertResponseCode($this->getFullResponse(0), [220]); + } + + /** Send the HELO welcome */ + protected function doHeloCommand() + { + $this->executeCommand( + sprintf("HELO %s\r\n", $this->domain), [250] + ); + } + + /** Send the MAIL FROM command */ + protected function doMailFromCommand($address) + { + $address = $this->addressEncoder->encodeString($address); + $this->executeCommand( + sprintf("MAIL FROM:<%s>\r\n", $address), [250], $failures, true + ); + } + + /** Send the RCPT TO command */ + protected function doRcptToCommand($address) + { + $address = $this->addressEncoder->encodeString($address); + $this->executeCommand( + sprintf("RCPT TO:<%s>\r\n", $address), [250, 251, 252], $failures, true, $address + ); + } + + /** Send the DATA command */ + protected function doDataCommand(&$failedRecipients) + { + $this->executeCommand("DATA\r\n", [354], $failedRecipients); + } + + /** Stream the contents of the message over the buffer */ + protected function streamMessage(Swift_Mime_SimpleMessage $message) + { + $this->buffer->setWriteTranslations(["\r\n." => "\r\n.."]); + try { + $message->toByteStream($this->buffer); + $this->buffer->flushBuffers(); + } catch (Swift_TransportException $e) { + $this->throwException($e); + } + $this->buffer->setWriteTranslations([]); + $this->executeCommand("\r\n.\r\n", [250]); + } + + /** Determine the best-use reverse path for this message */ + protected function getReversePath(Swift_Mime_SimpleMessage $message) + { + $return = $message->getReturnPath(); + $sender = $message->getSender(); + $from = $message->getFrom(); + $path = null; + if (!empty($return)) { + $path = $return; + } elseif (!empty($sender)) { + // Don't use array_keys + reset($sender); // Reset Pointer to first pos + $path = key($sender); // Get key + } elseif (!empty($from)) { + reset($from); // Reset Pointer to first pos + $path = key($from); // Get key + } + + return $path; + } + + /** Throw a TransportException, first sending it to any listeners */ + protected function throwException(Swift_TransportException $e) + { + if ($evt = $this->eventDispatcher->createTransportExceptionEvent($this, $e)) { + $this->eventDispatcher->dispatchEvent($evt, 'exceptionThrown'); + if (!$evt->bubbleCancelled()) { + throw $e; + } + } else { + throw $e; + } + } + + /** Throws an Exception if a response code is incorrect */ + protected function assertResponseCode($response, $wanted) + { + if (!$response) { + $this->throwException(new Swift_TransportException('Expected response code '.implode('/', $wanted).' but got an empty response')); + } + + list($code) = sscanf($response, '%3d'); + $valid = (empty($wanted) || in_array($code, $wanted)); + + if ($evt = $this->eventDispatcher->createResponseEvent($this, $response, + $valid)) { + $this->eventDispatcher->dispatchEvent($evt, 'responseReceived'); + } + + if (!$valid) { + $this->throwException(new Swift_TransportException('Expected response code '.implode('/', $wanted).' but got code "'.$code.'", with message "'.$response.'"', $code)); + } + } + + /** Get an entire multi-line response using its sequence number */ + protected function getFullResponse($seq) + { + $response = ''; + try { + do { + $line = $this->buffer->readLine($seq); + $response .= $line; + } while (null !== $line && false !== $line && ' ' != $line[3]); + } catch (Swift_TransportException $e) { + $this->throwException($e); + } catch (Swift_IoException $e) { + $this->throwException(new Swift_TransportException($e->getMessage(), 0, $e)); + } + + return $response; + } + + /** Send an email to the given recipients from the given reverse path */ + private function doMailTransaction($message, $reversePath, array $recipients, array &$failedRecipients) + { + $sent = 0; + $this->doMailFromCommand($reversePath); + foreach ($recipients as $forwardPath) { + try { + $this->doRcptToCommand($forwardPath); + ++$sent; + } catch (Swift_TransportException $e) { + $failedRecipients[] = $forwardPath; + } catch (Swift_AddressEncoderException $e) { + $failedRecipients[] = $forwardPath; + } + } + + if (0 != $sent) { + $sent += count($failedRecipients); + $this->doDataCommand($failedRecipients); + $sent -= count($failedRecipients); + + $this->streamMessage($message); + } else { + $this->reset(); + } + + return $sent; + } + + /** Send a message to the given To: recipients */ + private function sendTo(Swift_Mime_SimpleMessage $message, $reversePath, array $to, array &$failedRecipients) + { + if (empty($to)) { + return 0; + } + + return $this->doMailTransaction($message, $reversePath, array_keys($to), + $failedRecipients); + } + + /** Send a message to all Bcc: recipients */ + private function sendBcc(Swift_Mime_SimpleMessage $message, $reversePath, array $bcc, array &$failedRecipients) + { + $sent = 0; + foreach ($bcc as $forwardPath => $name) { + $message->setBcc([$forwardPath => $name]); + $sent += $this->doMailTransaction( + $message, $reversePath, [$forwardPath], $failedRecipients + ); + } + + return $sent; + } + + /** + * Destructor. + */ + public function __destruct() + { + try { + $this->stop(); + } catch (Exception $e) { + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php new file mode 100644 index 0000000..51dc7f5 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php @@ -0,0 +1,75 @@ +executeCommand("AUTH CRAM-MD5\r\n", [334]); + $challenge = base64_decode(substr($challenge, 4)); + $message = base64_encode( + $username.' '.$this->getResponse($password, $challenge) + ); + $agent->executeCommand(sprintf("%s\r\n", $message), [235]); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", [250]); + + throw $e; + } + } + + /** + * Generate a CRAM-MD5 response from a server challenge. + * + * @param string $secret + * @param string $challenge + * + * @return string + */ + private function getResponse($secret, $challenge) + { + if (strlen($secret) > 64) { + $secret = pack('H32', md5($secret)); + } + + if (strlen($secret) < 64) { + $secret = str_pad($secret, 64, chr(0)); + } + + $k_ipad = substr($secret, 0, 64) ^ str_repeat(chr(0x36), 64); + $k_opad = substr($secret, 0, 64) ^ str_repeat(chr(0x5C), 64); + + $inner = pack('H32', md5($k_ipad.$challenge)); + $digest = md5($k_opad.$inner); + + return $digest; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php new file mode 100644 index 0000000..458c038 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php @@ -0,0 +1,45 @@ +executeCommand("AUTH LOGIN\r\n", [334]); + $agent->executeCommand(sprintf("%s\r\n", base64_encode($username)), [334]); + $agent->executeCommand(sprintf("%s\r\n", base64_encode($password)), [235]); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", [250]); + + throw $e; + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php new file mode 100644 index 0000000..90081f8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php @@ -0,0 +1,681 @@ + + */ +class Swift_Transport_Esmtp_Auth_NTLMAuthenticator implements Swift_Transport_Esmtp_Authenticator +{ + const NTLMSIG = "NTLMSSP\x00"; + const DESCONST = 'KGS!@#$%'; + + /** + * Get the name of the AUTH mechanism this Authenticator handles. + * + * @return string + */ + public function getAuthKeyword() + { + return 'NTLM'; + } + + /** + * {@inheritdoc} + * + * @throws \LogicException + */ + public function authenticate(Swift_Transport_SmtpAgent $agent, $username, $password) + { + if (!function_exists('openssl_encrypt')) { + throw new LogicException('The OpenSSL extension must be enabled to use the NTLM authenticator.'); + } + + if (!function_exists('bcmul')) { + throw new LogicException('The BCMath functions must be enabled to use the NTLM authenticator.'); + } + + try { + // execute AUTH command and filter out the code at the beginning + // AUTH NTLM xxxx + $response = base64_decode(substr(trim($this->sendMessage1($agent)), 4)); + + // extra parameters for our unit cases + $timestamp = func_num_args() > 3 ? func_get_arg(3) : $this->getCorrectTimestamp(bcmul(microtime(true), '1000')); + $client = func_num_args() > 4 ? func_get_arg(4) : random_bytes(8); + + // Message 3 response + $this->sendMessage3($response, $username, $password, $timestamp, $client, $agent); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", [250]); + + throw $e; + } + } + + protected function si2bin($si, $bits = 32) + { + $bin = null; + if ($si >= -pow(2, $bits - 1) && ($si <= pow(2, $bits - 1))) { + // positive or zero + if ($si >= 0) { + $bin = base_convert($si, 10, 2); + // pad to $bits bit + $bin_length = strlen($bin); + if ($bin_length < $bits) { + $bin = str_repeat('0', $bits - $bin_length).$bin; + } + } else { + // negative + $si = -$si - pow(2, $bits); + $bin = base_convert($si, 10, 2); + $bin_length = strlen($bin); + if ($bin_length > $bits) { + $bin = str_repeat('1', $bits - $bin_length).$bin; + } + } + } + + return $bin; + } + + /** + * Send our auth message and returns the response. + * + * @return string SMTP Response + */ + protected function sendMessage1(Swift_Transport_SmtpAgent $agent) + { + $message = $this->createMessage1(); + + return $agent->executeCommand(sprintf("AUTH %s %s\r\n", $this->getAuthKeyword(), base64_encode($message)), [334]); + } + + /** + * Fetch all details of our response (message 2). + * + * @param string $response + * + * @return array our response parsed + */ + protected function parseMessage2($response) + { + $responseHex = bin2hex($response); + $length = floor(hexdec(substr($responseHex, 28, 4)) / 256) * 2; + $offset = floor(hexdec(substr($responseHex, 32, 4)) / 256) * 2; + $challenge = hex2bin(substr($responseHex, 48, 16)); + $context = hex2bin(substr($responseHex, 64, 16)); + $targetInfoH = hex2bin(substr($responseHex, 80, 16)); + $targetName = hex2bin(substr($responseHex, $offset, $length)); + $offset = floor(hexdec(substr($responseHex, 88, 4)) / 256) * 2; + $targetInfoBlock = substr($responseHex, $offset); + list($domainName, $serverName, $DNSDomainName, $DNSServerName, $terminatorByte) = $this->readSubBlock($targetInfoBlock); + + return [ + $challenge, + $context, + $targetInfoH, + $targetName, + $domainName, + $serverName, + $DNSDomainName, + $DNSServerName, + hex2bin($targetInfoBlock), + $terminatorByte, + ]; + } + + /** + * Read the blob information in from message2. + * + * @return array + */ + protected function readSubBlock($block) + { + // remove terminatorByte cause it's always the same + $block = substr($block, 0, -8); + + $length = strlen($block); + $offset = 0; + $data = []; + while ($offset < $length) { + $blockLength = hexdec(substr(substr($block, $offset, 8), -4)) / 256; + $offset += 8; + $data[] = hex2bin(substr($block, $offset, $blockLength * 2)); + $offset += $blockLength * 2; + } + + if (3 == count($data)) { + $data[] = $data[2]; + $data[2] = ''; + } + + $data[] = $this->createByte('00'); + + return $data; + } + + /** + * Send our final message with all our data. + * + * @param string $response Message 1 response (message 2) + * @param string $username + * @param string $password + * @param string $timestamp + * @param string $client + * @param bool $v2 Use version2 of the protocol + * + * @return string + */ + protected function sendMessage3($response, $username, $password, $timestamp, $client, Swift_Transport_SmtpAgent $agent, $v2 = true) + { + list($domain, $username) = $this->getDomainAndUsername($username); + //$challenge, $context, $targetInfoH, $targetName, $domainName, $workstation, $DNSDomainName, $DNSServerName, $blob, $ter + list($challenge, , , , , $workstation, , , $blob) = $this->parseMessage2($response); + + if (!$v2) { + // LMv1 + $lmResponse = $this->createLMPassword($password, $challenge); + // NTLMv1 + $ntlmResponse = $this->createNTLMPassword($password, $challenge); + } else { + // LMv2 + $lmResponse = $this->createLMv2Password($password, $username, $domain, $challenge, $client); + // NTLMv2 + $ntlmResponse = $this->createNTLMv2Hash($password, $username, $domain, $challenge, $blob, $timestamp, $client); + } + + $message = $this->createMessage3($domain, $username, $workstation, $lmResponse, $ntlmResponse); + + return $agent->executeCommand(sprintf("%s\r\n", base64_encode($message)), [235]); + } + + /** + * Create our message 1. + * + * @return string + */ + protected function createMessage1() + { + return self::NTLMSIG + .$this->createByte('01') // Message 1 +.$this->createByte('0702'); // Flags + } + + /** + * Create our message 3. + * + * @param string $domain + * @param string $username + * @param string $workstation + * @param string $lmResponse + * @param string $ntlmResponse + * + * @return string + */ + protected function createMessage3($domain, $username, $workstation, $lmResponse, $ntlmResponse) + { + // Create security buffers + $domainSec = $this->createSecurityBuffer($domain, 64); + $domainInfo = $this->readSecurityBuffer(bin2hex($domainSec)); + $userSec = $this->createSecurityBuffer($username, ($domainInfo[0] + $domainInfo[1]) / 2); + $userInfo = $this->readSecurityBuffer(bin2hex($userSec)); + $workSec = $this->createSecurityBuffer($workstation, ($userInfo[0] + $userInfo[1]) / 2); + $workInfo = $this->readSecurityBuffer(bin2hex($workSec)); + $lmSec = $this->createSecurityBuffer($lmResponse, ($workInfo[0] + $workInfo[1]) / 2, true); + $lmInfo = $this->readSecurityBuffer(bin2hex($lmSec)); + $ntlmSec = $this->createSecurityBuffer($ntlmResponse, ($lmInfo[0] + $lmInfo[1]) / 2, true); + + return self::NTLMSIG + .$this->createByte('03') // TYPE 3 message +.$lmSec // LM response header +.$ntlmSec // NTLM response header +.$domainSec // Domain header +.$userSec // User header +.$workSec // Workstation header +.$this->createByte('000000009a', 8) // session key header (empty) +.$this->createByte('01020000') // FLAGS +.$this->convertTo16bit($domain) // domain name +.$this->convertTo16bit($username) // username +.$this->convertTo16bit($workstation) // workstation +.$lmResponse + .$ntlmResponse; + } + + /** + * @param string $timestamp Epoch timestamp in microseconds + * @param string $client Random bytes + * @param string $targetInfo + * + * @return string + */ + protected function createBlob($timestamp, $client, $targetInfo) + { + return $this->createByte('0101') + .$this->createByte('00') + .$timestamp + .$client + .$this->createByte('00') + .$targetInfo + .$this->createByte('00'); + } + + /** + * Get domain and username from our username. + * + * @example DOMAIN\username + * + * @param string $name + * + * @return array + */ + protected function getDomainAndUsername($name) + { + if (false !== strpos($name, '\\')) { + return explode('\\', $name); + } + + if (false !== strpos($name, '@')) { + list($user, $domain) = explode('@', $name); + + return [$domain, $user]; + } + + // no domain passed + return ['', $name]; + } + + /** + * Create LMv1 response. + * + * @param string $password + * @param string $challenge + * + * @return string + */ + protected function createLMPassword($password, $challenge) + { + // FIRST PART + $password = $this->createByte(strtoupper($password), 14, false); + list($key1, $key2) = str_split($password, 7); + + $desKey1 = $this->createDesKey($key1); + $desKey2 = $this->createDesKey($key2); + + $constantDecrypt = $this->createByte($this->desEncrypt(self::DESCONST, $desKey1).$this->desEncrypt(self::DESCONST, $desKey2), 21, false); + + // SECOND PART + list($key1, $key2, $key3) = str_split($constantDecrypt, 7); + + $desKey1 = $this->createDesKey($key1); + $desKey2 = $this->createDesKey($key2); + $desKey3 = $this->createDesKey($key3); + + return $this->desEncrypt($challenge, $desKey1).$this->desEncrypt($challenge, $desKey2).$this->desEncrypt($challenge, $desKey3); + } + + /** + * Create NTLMv1 response. + * + * @param string $password + * @param string $challenge + * + * @return string + */ + protected function createNTLMPassword($password, $challenge) + { + // FIRST PART + $ntlmHash = $this->createByte($this->md4Encrypt($password), 21, false); + list($key1, $key2, $key3) = str_split($ntlmHash, 7); + + $desKey1 = $this->createDesKey($key1); + $desKey2 = $this->createDesKey($key2); + $desKey3 = $this->createDesKey($key3); + + return $this->desEncrypt($challenge, $desKey1).$this->desEncrypt($challenge, $desKey2).$this->desEncrypt($challenge, $desKey3); + } + + /** + * Convert a normal timestamp to a tenth of a microtime epoch time. + * + * @param string $time + * + * @return string + */ + protected function getCorrectTimestamp($time) + { + // Get our timestamp (tricky!) + $time = number_format($time, 0, '.', ''); // save microtime to string + $time = bcadd($time, '11644473600000', 0); // add epoch time + $time = bcmul($time, 10000, 0); // tenths of a microsecond. + + $binary = $this->si2bin($time, 64); // create 64 bit binary string + $timestamp = ''; + for ($i = 0; $i < 8; ++$i) { + $timestamp .= chr(bindec(substr($binary, -(($i + 1) * 8), 8))); + } + + return $timestamp; + } + + /** + * Create LMv2 response. + * + * @param string $password + * @param string $username + * @param string $domain + * @param string $challenge NTLM Challenge + * @param string $client Random string + * + * @return string + */ + protected function createLMv2Password($password, $username, $domain, $challenge, $client) + { + $lmPass = '00'; // by default 00 + // if $password > 15 than we can't use this method + if (strlen($password) <= 15) { + $ntlmHash = $this->md4Encrypt($password); + $ntml2Hash = $this->md5Encrypt($ntlmHash, $this->convertTo16bit(strtoupper($username).$domain)); + + $lmPass = bin2hex($this->md5Encrypt($ntml2Hash, $challenge.$client).$client); + } + + return $this->createByte($lmPass, 24); + } + + /** + * Create NTLMv2 response. + * + * @param string $password + * @param string $username + * @param string $domain + * @param string $challenge Hex values + * @param string $targetInfo Hex values + * @param string $timestamp + * @param string $client Random bytes + * + * @return string + * + * @see http://davenport.sourceforge.net/ntlm.html#theNtlmResponse + */ + protected function createNTLMv2Hash($password, $username, $domain, $challenge, $targetInfo, $timestamp, $client) + { + $ntlmHash = $this->md4Encrypt($password); + $ntml2Hash = $this->md5Encrypt($ntlmHash, $this->convertTo16bit(strtoupper($username).$domain)); + + // create blob + $blob = $this->createBlob($timestamp, $client, $targetInfo); + + $ntlmv2Response = $this->md5Encrypt($ntml2Hash, $challenge.$blob); + + return $ntlmv2Response.$blob; + } + + protected function createDesKey($key) + { + $material = [bin2hex($key[0])]; + $len = strlen($key); + for ($i = 1; $i < $len; ++$i) { + list($high, $low) = str_split(bin2hex($key[$i])); + $v = $this->castToByte(ord($key[$i - 1]) << (7 + 1 - $i) | $this->uRShift(hexdec(dechex(hexdec($high) & 0xf).dechex(hexdec($low) & 0xf)), $i)); + $material[] = str_pad(substr(dechex($v), -2), 2, '0', STR_PAD_LEFT); // cast to byte + } + $material[] = str_pad(substr(dechex($this->castToByte(ord($key[6]) << 1)), -2), 2, '0'); + + // odd parity + foreach ($material as $k => $v) { + $b = $this->castToByte(hexdec($v)); + $needsParity = 0 == (($this->uRShift($b, 7) ^ $this->uRShift($b, 6) ^ $this->uRShift($b, 5) + ^ $this->uRShift($b, 4) ^ $this->uRShift($b, 3) ^ $this->uRShift($b, 2) + ^ $this->uRShift($b, 1)) & 0x01); + + list($high, $low) = str_split($v); + if ($needsParity) { + $material[$k] = dechex(hexdec($high) | 0x0).dechex(hexdec($low) | 0x1); + } else { + $material[$k] = dechex(hexdec($high) & 0xf).dechex(hexdec($low) & 0xe); + } + } + + return hex2bin(implode('', $material)); + } + + /** HELPER FUNCTIONS */ + + /** + * Create our security buffer depending on length and offset. + * + * @param string $value Value we want to put in + * @param int $offset start of value + * @param bool $is16 Do we 16bit string or not? + * + * @return string + */ + protected function createSecurityBuffer($value, $offset, $is16 = false) + { + $length = strlen(bin2hex($value)); + $length = $is16 ? $length / 2 : $length; + $length = $this->createByte(str_pad(dechex($length), 2, '0', STR_PAD_LEFT), 2); + + return $length.$length.$this->createByte(dechex($offset), 4); + } + + /** + * Read our security buffer to fetch length and offset of our value. + * + * @param string $value Securitybuffer in hex + * + * @return array array with length and offset + */ + protected function readSecurityBuffer($value) + { + $length = floor(hexdec(substr($value, 0, 4)) / 256) * 2; + $offset = floor(hexdec(substr($value, 8, 4)) / 256) * 2; + + return [$length, $offset]; + } + + /** + * Cast to byte java equivalent to (byte). + * + * @param int $v + * + * @return int + */ + protected function castToByte($v) + { + return (($v + 128) % 256) - 128; + } + + /** + * Java unsigned right bitwise + * $a >>> $b. + * + * @param int $a + * @param int $b + * + * @return int + */ + protected function uRShift($a, $b) + { + if (0 == $b) { + return $a; + } + + return ($a >> $b) & ~(1 << (8 * PHP_INT_SIZE - 1) >> ($b - 1)); + } + + /** + * Right padding with 0 to certain length. + * + * @param string $input + * @param int $bytes Length of bytes + * @param bool $isHex Did we provided hex value + * + * @return string + */ + protected function createByte($input, $bytes = 4, $isHex = true) + { + if ($isHex) { + $byte = hex2bin(str_pad($input, $bytes * 2, '00')); + } else { + $byte = str_pad($input, $bytes, "\x00"); + } + + return $byte; + } + + /** ENCRYPTION ALGORITHMS */ + + /** + * DES Encryption. + * + * @param string $value An 8-byte string + * @param string $key + * + * @return string + */ + protected function desEncrypt($value, $key) + { + return substr(openssl_encrypt($value, 'DES-ECB', $key, \OPENSSL_RAW_DATA), 0, 8); + } + + /** + * MD5 Encryption. + * + * @param string $key Encryption key + * @param string $msg Message to encrypt + * + * @return string + */ + protected function md5Encrypt($key, $msg) + { + $blocksize = 64; + if (strlen($key) > $blocksize) { + $key = pack('H*', md5($key)); + } + + $key = str_pad($key, $blocksize, "\0"); + $ipadk = $key ^ str_repeat("\x36", $blocksize); + $opadk = $key ^ str_repeat("\x5c", $blocksize); + + return pack('H*', md5($opadk.pack('H*', md5($ipadk.$msg)))); + } + + /** + * MD4 Encryption. + * + * @param string $input + * + * @return string + * + * @see https://secure.php.net/manual/en/ref.hash.php + */ + protected function md4Encrypt($input) + { + $input = $this->convertTo16bit($input); + + return function_exists('hash') ? hex2bin(hash('md4', $input)) : mhash(MHASH_MD4, $input); + } + + /** + * Convert UTF-8 to UTF-16. + * + * @param string $input + * + * @return string + */ + protected function convertTo16bit($input) + { + return iconv('UTF-8', 'UTF-16LE', $input); + } + + /** + * @param string $message + */ + protected function debug($message) + { + $message = bin2hex($message); + $messageId = substr($message, 16, 8); + echo substr($message, 0, 16)." NTLMSSP Signature
\n"; + echo $messageId." Type Indicator
\n"; + + if ('02000000' == $messageId) { + $map = [ + 'Challenge', + 'Context', + 'Target Information Security Buffer', + 'Target Name Data', + 'NetBIOS Domain Name', + 'NetBIOS Server Name', + 'DNS Domain Name', + 'DNS Server Name', + 'BLOB', + 'Target Information Terminator', + ]; + + $data = $this->parseMessage2(hex2bin($message)); + + foreach ($map as $key => $value) { + echo bin2hex($data[$key]).' - '.$data[$key].' ||| '.$value."
\n"; + } + } elseif ('03000000' == $messageId) { + $i = 0; + $data[$i++] = substr($message, 24, 16); + list($lmLength, $lmOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 40, 16); + list($ntmlLength, $ntmlOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 56, 16); + list($targetLength, $targetOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 72, 16); + list($userLength, $userOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 88, 16); + list($workLength, $workOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 104, 16); + $data[$i++] = substr($message, 120, 8); + $data[$i++] = substr($message, $targetOffset, $targetLength); + $data[$i++] = substr($message, $userOffset, $userLength); + $data[$i++] = substr($message, $workOffset, $workLength); + $data[$i++] = substr($message, $lmOffset, $lmLength); + $data[$i] = substr($message, $ntmlOffset, $ntmlLength); + + $map = [ + 'LM Response Security Buffer', + 'NTLM Response Security Buffer', + 'Target Name Security Buffer', + 'User Name Security Buffer', + 'Workstation Name Security Buffer', + 'Session Key Security Buffer', + 'Flags', + 'Target Name Data', + 'User Name Data', + 'Workstation Name Data', + 'LM Response Data', + 'NTLM Response Data', + ]; + + foreach ($map as $key => $value) { + echo $data[$key].' - '.hex2bin($data[$key]).' ||| '.$value."
\n"; + } + } + + echo '

'; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php new file mode 100644 index 0000000..1ff961c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php @@ -0,0 +1,44 @@ +executeCommand(sprintf("AUTH PLAIN %s\r\n", $message), [235]); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", [250]); + + throw $e; + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php new file mode 100644 index 0000000..859f22f --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php @@ -0,0 +1,64 @@ + + * $transport = (new Swift_SmtpTransport('smtp.gmail.com', 587, 'tls')) + * ->setAuthMode('XOAUTH2') + * ->setUsername('YOUR_EMAIL_ADDRESS') + * ->setPassword('YOUR_ACCESS_TOKEN'); + * + * + * @author xu.li + * + * @see https://developers.google.com/google-apps/gmail/xoauth2_protocol + */ +class Swift_Transport_Esmtp_Auth_XOAuth2Authenticator implements Swift_Transport_Esmtp_Authenticator +{ + /** + * Get the name of the AUTH mechanism this Authenticator handles. + * + * @return string + */ + public function getAuthKeyword() + { + return 'XOAUTH2'; + } + + /** + * {@inheritdoc} + */ + public function authenticate(Swift_Transport_SmtpAgent $agent, $email, $token) + { + try { + $param = $this->constructXOAuth2Params($email, $token); + $agent->executeCommand('AUTH XOAUTH2 '.$param."\r\n", [235]); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", [250]); + + throw $e; + } + } + + /** + * Construct the auth parameter. + * + * @see https://developers.google.com/google-apps/gmail/xoauth2_protocol#the_sasl_xoauth2_mechanism + */ + protected function constructXOAuth2Params($email, $token) + { + return base64_encode("user=$email\1auth=Bearer $token\1\1"); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/AuthHandler.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/AuthHandler.php new file mode 100644 index 0000000..3733420 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/AuthHandler.php @@ -0,0 +1,268 @@ +setAuthenticators($authenticators); + } + + /** + * Set the Authenticators which can process a login request. + * + * @param Swift_Transport_Esmtp_Authenticator[] $authenticators + */ + public function setAuthenticators(array $authenticators) + { + $this->authenticators = $authenticators; + } + + /** + * Get the Authenticators which can process a login request. + * + * @return Swift_Transport_Esmtp_Authenticator[] + */ + public function getAuthenticators() + { + return $this->authenticators; + } + + /** + * Set the username to authenticate with. + * + * @param string $username + */ + public function setUsername($username) + { + $this->username = $username; + } + + /** + * Get the username to authenticate with. + * + * @return string + */ + public function getUsername() + { + return $this->username; + } + + /** + * Set the password to authenticate with. + * + * @param string $password + */ + public function setPassword($password) + { + $this->password = $password; + } + + /** + * Get the password to authenticate with. + * + * @return string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set the auth mode to use to authenticate. + * + * @param string $mode + */ + public function setAuthMode($mode) + { + $this->auth_mode = $mode; + } + + /** + * Get the auth mode to use to authenticate. + * + * @return string + */ + public function getAuthMode() + { + return $this->auth_mode; + } + + /** + * Get the name of the ESMTP extension this handles. + * + * @return string + */ + public function getHandledKeyword() + { + return 'AUTH'; + } + + /** + * Set the parameters which the EHLO greeting indicated. + * + * @param string[] $parameters + */ + public function setKeywordParams(array $parameters) + { + $this->esmtpParams = $parameters; + } + + /** + * Runs immediately after a EHLO has been issued. + * + * @param Swift_Transport_SmtpAgent $agent to read/write + */ + public function afterEhlo(Swift_Transport_SmtpAgent $agent) + { + if ($this->username) { + $count = 0; + $errors = []; + foreach ($this->getAuthenticatorsForAgent() as $authenticator) { + if (in_array(strtolower($authenticator->getAuthKeyword()), array_map('strtolower', $this->esmtpParams))) { + ++$count; + try { + if ($authenticator->authenticate($agent, $this->username, $this->password)) { + return; + } + } catch (Swift_TransportException $e) { + // keep the error message, but tries the other authenticators + $errors[] = [$authenticator->getAuthKeyword(), $e->getMessage()]; + } + } + } + + $message = 'Failed to authenticate on SMTP server with username "'.$this->username.'" using '.$count.' possible authenticators.'; + foreach ($errors as $error) { + $message .= ' Authenticator '.$error[0].' returned '.$error[1].'.'; + } + throw new Swift_TransportException($message); + } + } + + /** + * Not used. + */ + public function getMailParams() + { + return []; + } + + /** + * Not used. + */ + public function getRcptParams() + { + return []; + } + + /** + * Not used. + */ + public function onCommand(Swift_Transport_SmtpAgent $agent, $command, $codes = [], &$failedRecipients = null, &$stop = false) + { + } + + /** + * Returns +1, -1 or 0 according to the rules for usort(). + * + * This method is called to ensure extensions can be execute in an appropriate order. + * + * @param string $esmtpKeyword to compare with + * + * @return int + */ + public function getPriorityOver($esmtpKeyword) + { + return 0; + } + + /** + * Returns an array of method names which are exposed to the Esmtp class. + * + * @return string[] + */ + public function exposeMixinMethods() + { + return ['setUsername', 'getUsername', 'setPassword', 'getPassword', 'setAuthMode', 'getAuthMode']; + } + + /** + * Not used. + */ + public function resetState() + { + } + + /** + * Returns the authenticator list for the given agent. + * + * @return array + */ + protected function getAuthenticatorsForAgent() + { + if (!$mode = strtolower($this->auth_mode)) { + return $this->authenticators; + } + + foreach ($this->authenticators as $authenticator) { + if (strtolower($authenticator->getAuthKeyword()) == $mode) { + return [$authenticator]; + } + } + + throw new Swift_TransportException('Auth mode '.$mode.' is invalid'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Authenticator.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Authenticator.php new file mode 100644 index 0000000..cadfdc6 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Authenticator.php @@ -0,0 +1,37 @@ +encoding = $encoding; + } + + /** + * Get the name of the ESMTP extension this handles. + * + * @return string + */ + public function getHandledKeyword() + { + return '8BITMIME'; + } + + /** + * Not used. + */ + public function setKeywordParams(array $parameters) + { + } + + /** + * Not used. + */ + public function afterEhlo(Swift_Transport_SmtpAgent $agent) + { + } + + /** + * Get params which are appended to MAIL FROM:<>. + * + * @return string[] + */ + public function getMailParams() + { + return ['BODY='.$this->encoding]; + } + + /** + * Not used. + */ + public function getRcptParams() + { + return []; + } + + /** + * Not used. + */ + public function onCommand(Swift_Transport_SmtpAgent $agent, $command, $codes = [], &$failedRecipients = null, &$stop = false) + { + } + + /** + * Returns +1, -1 or 0 according to the rules for usort(). + * + * This method is called to ensure extensions can be execute in an appropriate order. + * + * @param string $esmtpKeyword to compare with + * + * @return int + */ + public function getPriorityOver($esmtpKeyword) + { + return 0; + } + + /** + * Not used. + */ + public function exposeMixinMethods() + { + return []; + } + + /** + * Not used. + */ + public function resetState() + { + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/SmtpUtf8Handler.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/SmtpUtf8Handler.php new file mode 100644 index 0000000..7d0252a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/SmtpUtf8Handler.php @@ -0,0 +1,107 @@ +. + * + * @return string[] + */ + public function getMailParams() + { + return ['SMTPUTF8']; + } + + /** + * Not used. + */ + public function getRcptParams() + { + return []; + } + + /** + * Not used. + */ + public function onCommand(Swift_Transport_SmtpAgent $agent, $command, $codes = [], &$failedRecipients = null, &$stop = false) + { + } + + /** + * Returns +1, -1 or 0 according to the rules for usort(). + * + * This method is called to ensure extensions can be execute in an appropriate order. + * + * @param string $esmtpKeyword to compare with + * + * @return int + */ + public function getPriorityOver($esmtpKeyword) + { + return 0; + } + + /** + * Not used. + */ + public function exposeMixinMethods() + { + return []; + } + + /** + * Not used. + */ + public function resetState() + { + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpHandler.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpHandler.php new file mode 100644 index 0000000..b8ea36e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpHandler.php @@ -0,0 +1,86 @@ +. + * + * @return string[] + */ + public function getMailParams(); + + /** + * Get params which are appended to RCPT TO:<>. + * + * @return string[] + */ + public function getRcptParams(); + + /** + * Runs when a command is due to be sent. + * + * @param Swift_Transport_SmtpAgent $agent to read/write + * @param string $command to send + * @param int[] $codes expected in response + * @param string[] $failedRecipients to collect failures + * @param bool $stop to be set true by-reference if the command is now sent + */ + public function onCommand(Swift_Transport_SmtpAgent $agent, $command, $codes = [], &$failedRecipients = null, &$stop = false); + + /** + * Returns +1, -1 or 0 according to the rules for usort(). + * + * This method is called to ensure extensions can be execute in an appropriate order. + * + * @param string $esmtpKeyword to compare with + * + * @return int + */ + public function getPriorityOver($esmtpKeyword); + + /** + * Returns an array of method names which are exposed to the Esmtp class. + * + * @return string[] + */ + public function exposeMixinMethods(); + + /** + * Tells this handler to clear any buffers and reset its state. + */ + public function resetState(); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php new file mode 100644 index 0000000..d1f1c2c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php @@ -0,0 +1,446 @@ + 'tcp', + 'host' => 'localhost', + 'port' => 25, + 'timeout' => 30, + 'blocking' => 1, + 'tls' => false, + 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET, + 'stream_context_options' => [], + ]; + + /** + * Creates a new EsmtpTransport using the given I/O buffer. + * + * @param Swift_Transport_EsmtpHandler[] $extensionHandlers + * @param string $localDomain + */ + public function __construct(Swift_Transport_IoBuffer $buf, array $extensionHandlers, Swift_Events_EventDispatcher $dispatcher, $localDomain = '127.0.0.1', Swift_AddressEncoder $addressEncoder = null) + { + parent::__construct($buf, $dispatcher, $localDomain, $addressEncoder); + $this->setExtensionHandlers($extensionHandlers); + } + + /** + * Set the host to connect to. + * + * Literal IPv6 addresses should be wrapped in square brackets. + * + * @param string $host + * + * @return $this + */ + public function setHost($host) + { + $this->params['host'] = $host; + + return $this; + } + + /** + * Get the host to connect to. + * + * @return string + */ + public function getHost() + { + return $this->params['host']; + } + + /** + * Set the port to connect to. + * + * @param int $port + * + * @return $this + */ + public function setPort($port) + { + $this->params['port'] = (int) $port; + + return $this; + } + + /** + * Get the port to connect to. + * + * @return int + */ + public function getPort() + { + return $this->params['port']; + } + + /** + * Set the connection timeout. + * + * @param int $timeout seconds + * + * @return $this + */ + public function setTimeout($timeout) + { + $this->params['timeout'] = (int) $timeout; + $this->buffer->setParam('timeout', (int) $timeout); + + return $this; + } + + /** + * Get the connection timeout. + * + * @return int + */ + public function getTimeout() + { + return $this->params['timeout']; + } + + /** + * Set the encryption type (tls or ssl). + * + * @param string $encryption + * + * @return $this + */ + public function setEncryption($encryption) + { + $encryption = strtolower($encryption); + if ('tls' == $encryption) { + $this->params['protocol'] = 'tcp'; + $this->params['tls'] = true; + } else { + $this->params['protocol'] = $encryption; + $this->params['tls'] = false; + } + + return $this; + } + + /** + * Get the encryption type. + * + * @return string + */ + public function getEncryption() + { + return $this->params['tls'] ? 'tls' : $this->params['protocol']; + } + + /** + * Sets the stream context options. + * + * @param array $options + * + * @return $this + */ + public function setStreamOptions($options) + { + $this->params['stream_context_options'] = $options; + + return $this; + } + + /** + * Returns the stream context options. + * + * @return array + */ + public function getStreamOptions() + { + return $this->params['stream_context_options']; + } + + /** + * Sets the source IP. + * + * IPv6 addresses should be wrapped in square brackets. + * + * @param string $source + * + * @return $this + */ + public function setSourceIp($source) + { + $this->params['sourceIp'] = $source; + + return $this; + } + + /** + * Returns the IP used to connect to the destination. + * + * @return string + */ + public function getSourceIp() + { + return $this->params['sourceIp'] ?? null; + } + + /** + * Sets whether SMTP pipelining is enabled. + * + * By default, support is auto-detected using the PIPELINING SMTP extension. + * Use this function to override that in the unlikely event of compatibility + * issues. + * + * @param bool $enabled + * + * @return $this + */ + public function setPipelining($enabled) + { + $this->pipelining = $enabled; + + return $this; + } + + /** + * Returns whether SMTP pipelining is enabled. + * + * @return bool|null a boolean if pipelining is explicitly enabled or disabled, + * or null if support is auto-detected. + */ + public function getPipelining() + { + return $this->pipelining; + } + + /** + * Set ESMTP extension handlers. + * + * @param Swift_Transport_EsmtpHandler[] $handlers + * + * @return $this + */ + public function setExtensionHandlers(array $handlers) + { + $assoc = []; + foreach ($handlers as $handler) { + $assoc[$handler->getHandledKeyword()] = $handler; + } + uasort($assoc, function ($a, $b) { + return $a->getPriorityOver($b->getHandledKeyword()); + }); + $this->handlers = $assoc; + $this->setHandlerParams(); + + return $this; + } + + /** + * Get ESMTP extension handlers. + * + * @return Swift_Transport_EsmtpHandler[] + */ + public function getExtensionHandlers() + { + return array_values($this->handlers); + } + + /** + * Run a command against the buffer, expecting the given response codes. + * + * If no response codes are given, the response will not be validated. + * If codes are given, an exception will be thrown on an invalid response. + * + * @param string $command + * @param int[] $codes + * @param string[] $failures An array of failures by-reference + * @param bool $pipeline Do not wait for response + * @param string $address The address, if command is RCPT TO. + * + * @return string|null The server response, or null if pipelining is enabled + */ + public function executeCommand($command, $codes = [], &$failures = null, $pipeline = false, $address = null) + { + $failures = (array) $failures; + $stopSignal = false; + $response = null; + foreach ($this->getActiveHandlers() as $handler) { + $response = $handler->onCommand( + $this, $command, $codes, $failures, $stopSignal + ); + if ($stopSignal) { + return $response; + } + } + + return parent::executeCommand($command, $codes, $failures, $pipeline, $address); + } + + /** Mixin handling method for ESMTP handlers */ + public function __call($method, $args) + { + foreach ($this->handlers as $handler) { + if (in_array(strtolower($method), + array_map('strtolower', (array) $handler->exposeMixinMethods()) + )) { + $return = call_user_func_array([$handler, $method], $args); + // Allow fluid method calls + if (null === $return && 'set' == substr($method, 0, 3)) { + return $this; + } else { + return $return; + } + } + } + trigger_error('Call to undefined method '.$method, E_USER_ERROR); + } + + /** Get the params to initialize the buffer */ + protected function getBufferParams() + { + return $this->params; + } + + /** Overridden to perform EHLO instead */ + protected function doHeloCommand() + { + try { + $response = $this->executeCommand( + sprintf("EHLO %s\r\n", $this->domain), [250] + ); + } catch (Swift_TransportException $e) { + return parent::doHeloCommand(); + } + + if ($this->params['tls']) { + try { + $this->executeCommand("STARTTLS\r\n", [220]); + + if (!$this->buffer->startTLS()) { + throw new Swift_TransportException('Unable to connect with TLS encryption'); + } + + try { + $response = $this->executeCommand( + sprintf("EHLO %s\r\n", $this->domain), [250] + ); + } catch (Swift_TransportException $e) { + return parent::doHeloCommand(); + } + } catch (Swift_TransportException $e) { + $this->throwException($e); + } + } + + $this->capabilities = $this->getCapabilities($response); + if (!isset($this->pipelining)) { + $this->pipelining = isset($this->capabilities['PIPELINING']); + } + + $this->setHandlerParams(); + foreach ($this->getActiveHandlers() as $handler) { + $handler->afterEhlo($this); + } + } + + /** Overridden to add Extension support */ + protected function doMailFromCommand($address) + { + $address = $this->addressEncoder->encodeString($address); + $handlers = $this->getActiveHandlers(); + $params = []; + foreach ($handlers as $handler) { + $params = array_merge($params, (array) $handler->getMailParams()); + } + $paramStr = !empty($params) ? ' '.implode(' ', $params) : ''; + $this->executeCommand( + sprintf("MAIL FROM:<%s>%s\r\n", $address, $paramStr), [250], $failures, true + ); + } + + /** Overridden to add Extension support */ + protected function doRcptToCommand($address) + { + $address = $this->addressEncoder->encodeString($address); + $handlers = $this->getActiveHandlers(); + $params = []; + foreach ($handlers as $handler) { + $params = array_merge($params, (array) $handler->getRcptParams()); + } + $paramStr = !empty($params) ? ' '.implode(' ', $params) : ''; + $this->executeCommand( + sprintf("RCPT TO:<%s>%s\r\n", $address, $paramStr), [250, 251, 252], $failures, true, $address + ); + } + + /** Determine ESMTP capabilities by function group */ + private function getCapabilities($ehloResponse) + { + $capabilities = []; + $ehloResponse = trim($ehloResponse); + $lines = explode("\r\n", $ehloResponse); + array_shift($lines); + foreach ($lines as $line) { + if (preg_match('/^[0-9]{3}[ -]([A-Z0-9-]+)((?:[ =].*)?)$/Di', $line, $matches)) { + $keyword = strtoupper($matches[1]); + $paramStr = strtoupper(ltrim($matches[2], ' =')); + $params = !empty($paramStr) ? explode(' ', $paramStr) : []; + $capabilities[$keyword] = $params; + } + } + + return $capabilities; + } + + /** Set parameters which are used by each extension handler */ + private function setHandlerParams() + { + foreach ($this->handlers as $keyword => $handler) { + if (array_key_exists($keyword, $this->capabilities)) { + $handler->setKeywordParams($this->capabilities[$keyword]); + } + } + } + + /** Get ESMTP handlers which are currently ok to use */ + private function getActiveHandlers() + { + $handlers = []; + foreach ($this->handlers as $keyword => $handler) { + if (array_key_exists($keyword, $this->capabilities)) { + $handlers[] = $handler; + } + } + + return $handlers; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/FailoverTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/FailoverTransport.php new file mode 100644 index 0000000..21bce4b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/FailoverTransport.php @@ -0,0 +1,105 @@ +transports); + for ($i = 0; $i < $maxTransports + && $transport = $this->getNextTransport(); ++$i) { + if ($transport->ping()) { + return true; + } else { + $this->killCurrentTransport(); + } + } + + return count($this->transports) > 0; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) + { + $maxTransports = count($this->transports); + $sent = 0; + $this->lastUsedTransport = null; + + for ($i = 0; $i < $maxTransports + && $transport = $this->getNextTransport(); ++$i) { + try { + if (!$transport->isStarted()) { + $transport->start(); + } + + if ($sent = $transport->send($message, $failedRecipients)) { + $this->lastUsedTransport = $transport; + + return $sent; + } + } catch (Swift_TransportException $e) { + $this->killCurrentTransport(); + } + } + + if (0 == count($this->transports)) { + throw new Swift_TransportException( + 'All Transports in FailoverTransport failed, or no Transports available' + ); + } + + return $sent; + } + + protected function getNextTransport() + { + if (!isset($this->currentTransport)) { + $this->currentTransport = parent::getNextTransport(); + } + + return $this->currentTransport; + } + + protected function killCurrentTransport() + { + $this->currentTransport = null; + parent::killCurrentTransport(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/IoBuffer.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/IoBuffer.php new file mode 100644 index 0000000..af97adf --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/IoBuffer.php @@ -0,0 +1,67 @@ +transports = $transports; + $this->deadTransports = []; + } + + /** + * Get $transports to delegate to. + * + * @return Swift_Transport[] + */ + public function getTransports() + { + return array_merge($this->transports, $this->deadTransports); + } + + /** + * Get the Transport used in the last successful send operation. + * + * @return Swift_Transport + */ + public function getLastUsedTransport() + { + return $this->lastUsedTransport; + } + + /** + * Test if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return count($this->transports) > 0; + } + + /** + * Start this Transport mechanism. + */ + public function start() + { + $this->transports = array_merge($this->transports, $this->deadTransports); + } + + /** + * Stop this Transport mechanism. + */ + public function stop() + { + foreach ($this->transports as $transport) { + $transport->stop(); + } + } + + /** + * {@inheritdoc} + */ + public function ping() + { + foreach ($this->transports as $transport) { + if (!$transport->ping()) { + $this->killCurrentTransport(); + } + } + + return count($this->transports) > 0; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) + { + $maxTransports = count($this->transports); + $sent = 0; + $this->lastUsedTransport = null; + + for ($i = 0; $i < $maxTransports + && $transport = $this->getNextTransport(); ++$i) { + try { + if (!$transport->isStarted()) { + $transport->start(); + } + if ($sent = $transport->send($message, $failedRecipients)) { + $this->lastUsedTransport = $transport; + break; + } + } catch (Swift_TransportException $e) { + $this->killCurrentTransport(); + } + } + + if (0 == count($this->transports)) { + throw new Swift_TransportException( + 'All Transports in LoadBalancedTransport failed, or no Transports available' + ); + } + + return $sent; + } + + /** + * Register a plugin. + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + foreach ($this->transports as $transport) { + $transport->registerPlugin($plugin); + } + } + + /** + * Rotates the transport list around and returns the first instance. + * + * @return Swift_Transport + */ + protected function getNextTransport() + { + if ($next = array_shift($this->transports)) { + $this->transports[] = $next; + } + + return $next; + } + + /** + * Tag the currently used (top of stack) transport as dead/useless. + */ + protected function killCurrentTransport() + { + if ($transport = array_pop($this->transports)) { + try { + $transport->stop(); + } catch (Exception $e) { + } + $this->deadTransports[] = $transport; + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/NullTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/NullTransport.php new file mode 100644 index 0000000..5934ca9 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/NullTransport.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Pretends messages have been sent, but just ignores them. + * + * @author Fabien Potencier + */ +class Swift_Transport_NullTransport implements Swift_Transport +{ + /** The event dispatcher from the plugin API */ + private $eventDispatcher; + + /** + * Constructor. + */ + public function __construct(Swift_Events_EventDispatcher $eventDispatcher) + { + $this->eventDispatcher = $eventDispatcher; + } + + /** + * Tests if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Transport mechanism. + */ + public function start() + { + } + + /** + * Stops this Transport mechanism. + */ + public function stop() + { + } + + /** + * {@inheritdoc} + */ + public function ping() + { + return true; + } + + /** + * Sends the given message. + * + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent emails + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) + { + if ($evt = $this->eventDispatcher->createSendEvent($this, $message)) { + $this->eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + if ($evt) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + $this->eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $count = ( + count((array) $message->getTo()) + + count((array) $message->getCc()) + + count((array) $message->getBcc()) + ); + + return $count; + } + + /** + * Register a plugin. + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->eventDispatcher->bindEventListener($plugin); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php new file mode 100644 index 0000000..7f0476a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php @@ -0,0 +1,158 @@ + 30, + 'blocking' => 1, + 'command' => '/usr/sbin/sendmail -bs', + 'type' => Swift_Transport_IoBuffer::TYPE_PROCESS, + ]; + + /** + * Create a new SendmailTransport with $buf for I/O. + * + * @param string $localDomain + */ + public function __construct(Swift_Transport_IoBuffer $buf, Swift_Events_EventDispatcher $dispatcher, $localDomain = '127.0.0.1', Swift_AddressEncoder $addressEncoder = null) + { + parent::__construct($buf, $dispatcher, $localDomain, $addressEncoder); + } + + /** + * Start the standalone SMTP session if running in -bs mode. + */ + public function start() + { + if (false !== strpos($this->getCommand(), ' -bs')) { + parent::start(); + } + } + + /** + * Set the command to invoke. + * + * If using -t mode you are strongly advised to include -oi or -i in the flags. + * For example: /usr/sbin/sendmail -oi -t + * Swift will append a -f flag if one is not present. + * + * The recommended mode is "-bs" since it is interactive and failure notifications + * are hence possible. + * + * @param string $command + * + * @return $this + */ + public function setCommand($command) + { + $this->params['command'] = $command; + + return $this; + } + + /** + * Get the sendmail command which will be invoked. + * + * @return string + */ + public function getCommand() + { + return $this->params['command']; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * + * The return value is the number of recipients who were accepted for delivery. + * NOTE: If using 'sendmail -t' you will not be aware of any failures until + * they bounce (i.e. send() will always return 100% success). + * + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) + { + $failedRecipients = (array) $failedRecipients; + $command = $this->getCommand(); + $buffer = $this->getBuffer(); + $count = 0; + + if (false !== strpos($command, ' -t')) { + if ($evt = $this->eventDispatcher->createSendEvent($this, $message)) { + $this->eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + if (false === strpos($command, ' -f')) { + $command .= ' -f'.escapeshellarg($this->getReversePath($message)); + } + + $buffer->initialize(array_merge($this->params, ['command' => $command])); + + if (false === strpos($command, ' -i') && false === strpos($command, ' -oi')) { + $buffer->setWriteTranslations(["\r\n" => "\n", "\n." => "\n.."]); + } else { + $buffer->setWriteTranslations(["\r\n" => "\n"]); + } + + $count = count((array) $message->getTo()) + + count((array) $message->getCc()) + + count((array) $message->getBcc()) + ; + $message->toByteStream($buffer); + $buffer->flushBuffers(); + $buffer->setWriteTranslations([]); + $buffer->terminate(); + + if ($evt) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + $evt->setFailedRecipients($failedRecipients); + $this->eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $message->generateId(); + } elseif (false !== strpos($command, ' -bs')) { + $count = parent::send($message, $failedRecipients); + } else { + $this->throwException(new Swift_TransportException( + 'Unsupported sendmail command flags ['.$command.']. '. + 'Must be one of "-bs" or "-t" but can include additional flags.' + )); + } + + return $count; + } + + /** Get the params to initialize the buffer */ + protected function getBufferParams() + { + return $this->params; + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SmtpAgent.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SmtpAgent.php new file mode 100644 index 0000000..e8ce65c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SmtpAgent.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Stores Messages in a queue. + * + * @author Fabien Potencier + */ +class Swift_Transport_SpoolTransport implements Swift_Transport +{ + /** The spool instance */ + private $spool; + + /** The event dispatcher from the plugin API */ + private $eventDispatcher; + + /** + * Constructor. + */ + public function __construct(Swift_Events_EventDispatcher $eventDispatcher, Swift_Spool $spool = null) + { + $this->eventDispatcher = $eventDispatcher; + $this->spool = $spool; + } + + /** + * Sets the spool object. + * + * @return $this + */ + public function setSpool(Swift_Spool $spool) + { + $this->spool = $spool; + + return $this; + } + + /** + * Get the spool object. + * + * @return Swift_Spool + */ + public function getSpool() + { + return $this->spool; + } + + /** + * Tests if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Transport mechanism. + */ + public function start() + { + } + + /** + * Stops this Transport mechanism. + */ + public function stop() + { + } + + /** + * {@inheritdoc} + */ + public function ping() + { + return true; + } + + /** + * Sends the given message. + * + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent e-mail's + */ + public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) + { + if ($evt = $this->eventDispatcher->createSendEvent($this, $message)) { + $this->eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + $success = $this->spool->queueMessage($message); + + if ($evt) { + $evt->setResult($success ? Swift_Events_SendEvent::RESULT_SPOOLED : Swift_Events_SendEvent::RESULT_FAILED); + $this->eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + return 1; + } + + /** + * Register a plugin. + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->eventDispatcher->bindEventListener($plugin); + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php new file mode 100644 index 0000000..5f7b8ac --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php @@ -0,0 +1,329 @@ +replacementFactory = $replacementFactory; + } + + /** + * Perform any initialization needed, using the given $params. + * + * Parameters will vary depending upon the type of IoBuffer used. + */ + public function initialize(array $params) + { + $this->params = $params; + switch ($params['type']) { + case self::TYPE_PROCESS: + $this->establishProcessConnection(); + break; + case self::TYPE_SOCKET: + default: + $this->establishSocketConnection(); + break; + } + } + + /** + * Set an individual param on the buffer (e.g. switching to SSL). + * + * @param string $param + * @param mixed $value + */ + public function setParam($param, $value) + { + if (isset($this->stream)) { + switch ($param) { + case 'timeout': + if ($this->stream) { + stream_set_timeout($this->stream, $value); + } + break; + + case 'blocking': + if ($this->stream) { + stream_set_blocking($this->stream, 1); + } + } + } + $this->params[$param] = $value; + } + + public function startTLS() + { + // STREAM_CRYPTO_METHOD_TLS_CLIENT only allow tls1.0 connections (some php versions) + // To support modern tls we allow explicit tls1.0, tls1.1, tls1.2 + // Ssl3 and older are not allowed because they are vulnerable + // @TODO make tls arguments configurable + return stream_socket_enable_crypto($this->stream, true, STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT); + } + + /** + * Perform any shutdown logic needed. + */ + public function terminate() + { + if (isset($this->stream)) { + switch ($this->params['type']) { + case self::TYPE_PROCESS: + fclose($this->in); + fclose($this->out); + proc_close($this->stream); + break; + case self::TYPE_SOCKET: + default: + fclose($this->stream); + break; + } + } + $this->stream = null; + $this->out = null; + $this->in = null; + } + + /** + * Set an array of string replacements which should be made on data written + * to the buffer. + * + * This could replace LF with CRLF for example. + * + * @param string[] $replacements + */ + public function setWriteTranslations(array $replacements) + { + foreach ($this->translations as $search => $replace) { + if (!isset($replacements[$search])) { + $this->removeFilter($search); + unset($this->translations[$search]); + } + } + + foreach ($replacements as $search => $replace) { + if (!isset($this->translations[$search])) { + $this->addFilter( + $this->replacementFactory->createFilter($search, $replace), $search + ); + $this->translations[$search] = true; + } + } + } + + /** + * Get a line of output (including any CRLF). + * + * The $sequence number comes from any writes and may or may not be used + * depending upon the implementation. + * + * @param int $sequence of last write to scan from + * + * @return string + * + * @throws Swift_IoException + */ + public function readLine($sequence) + { + if (isset($this->out) && !feof($this->out)) { + $line = fgets($this->out); + if (0 == strlen($line)) { + $metas = stream_get_meta_data($this->out); + if ($metas['timed_out']) { + throw new Swift_IoException( + 'Connection to '. + $this->getReadConnectionDescription(). + ' Timed Out' + ); + } + } + + return $line; + } + } + + /** + * Reads $length bytes from the stream into a string and moves the pointer + * through the stream by $length. + * + * If less bytes exist than are requested the remaining bytes are given instead. + * If no bytes are remaining at all, boolean false is returned. + * + * @param int $length + * + * @return string|bool + * + * @throws Swift_IoException + */ + public function read($length) + { + if (isset($this->out) && !feof($this->out)) { + $ret = fread($this->out, $length); + if (0 == strlen($ret)) { + $metas = stream_get_meta_data($this->out); + if ($metas['timed_out']) { + throw new Swift_IoException( + 'Connection to '. + $this->getReadConnectionDescription(). + ' Timed Out' + ); + } + } + + return $ret; + } + } + + /** Not implemented */ + public function setReadPointer($byteOffset) + { + } + + /** Flush the stream contents */ + protected function flush() + { + if (isset($this->in)) { + fflush($this->in); + } + } + + /** Write this bytes to the stream */ + protected function doCommit($bytes) + { + if (isset($this->in)) { + $bytesToWrite = strlen($bytes); + $totalBytesWritten = 0; + + while ($totalBytesWritten < $bytesToWrite) { + $bytesWritten = fwrite($this->in, substr($bytes, $totalBytesWritten)); + if (false === $bytesWritten || 0 === $bytesWritten) { + break; + } + + $totalBytesWritten += $bytesWritten; + } + + if ($totalBytesWritten > 0) { + return ++$this->sequence; + } + } + } + + /** + * Establishes a connection to a remote server. + */ + private function establishSocketConnection() + { + $host = $this->params['host']; + if (!empty($this->params['protocol'])) { + $host = $this->params['protocol'].'://'.$host; + } + $timeout = 15; + if (!empty($this->params['timeout'])) { + $timeout = $this->params['timeout']; + } + $options = []; + if (!empty($this->params['sourceIp'])) { + $options['socket']['bindto'] = $this->params['sourceIp'].':0'; + } + + if (isset($this->params['stream_context_options'])) { + $options = array_merge($options, $this->params['stream_context_options']); + } + $streamContext = stream_context_create($options); + + set_error_handler(function ($type, $msg) { + throw new Swift_TransportException('Connection could not be established with host '.$this->params['host'].' :'.$msg); + }); + try { + $this->stream = stream_socket_client($host.':'.$this->params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext); + } finally { + restore_error_handler(); + } + + if (!empty($this->params['blocking'])) { + stream_set_blocking($this->stream, 1); + } else { + stream_set_blocking($this->stream, 0); + } + stream_set_timeout($this->stream, $timeout); + $this->in = &$this->stream; + $this->out = &$this->stream; + } + + /** + * Opens a process for input/output. + */ + private function establishProcessConnection() + { + $command = $this->params['command']; + $descriptorSpec = [ + 0 => ['pipe', 'r'], + 1 => ['pipe', 'w'], + 2 => ['pipe', 'w'], + ]; + $pipes = []; + $this->stream = proc_open($command, $descriptorSpec, $pipes); + stream_set_blocking($pipes[2], 0); + if ($err = stream_get_contents($pipes[2])) { + throw new Swift_TransportException( + 'Process could not be started ['.$err.']' + ); + } + $this->in = &$pipes[0]; + $this->out = &$pipes[1]; + } + + private function getReadConnectionDescription() + { + switch ($this->params['type']) { + case self::TYPE_PROCESS: + return 'Process '.$this->params['command']; + break; + + case self::TYPE_SOCKET: + default: + $host = $this->params['host']; + if (!empty($this->params['protocol'])) { + $host = $this->params['protocol'].'://'.$host; + } + $host .= ':'.$this->params['port']; + + return $host; + break; + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php new file mode 100644 index 0000000..c741745 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php @@ -0,0 +1,28 @@ +register('cache') + ->asAliasOf('cache.array') + + ->register('tempdir') + ->asValue('/tmp') + + ->register('cache.null') + ->asSharedInstanceOf('Swift_KeyCache_NullKeyCache') + + ->register('cache.array') + ->asSharedInstanceOf('Swift_KeyCache_ArrayKeyCache') + ->withDependencies(['cache.inputstream']) + + ->register('cache.disk') + ->asSharedInstanceOf('Swift_KeyCache_DiskKeyCache') + ->withDependencies(['cache.inputstream', 'tempdir']) + + ->register('cache.inputstream') + ->asNewInstanceOf('Swift_KeyCache_SimpleKeyCacheInputStream') +; diff --git a/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php b/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php new file mode 100644 index 0000000..64d69d2 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php @@ -0,0 +1,9 @@ +register('message.message') + ->asNewInstanceOf('Swift_Message') + + ->register('message.mimepart') + ->asNewInstanceOf('Swift_MimePart') +; diff --git a/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php b/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php new file mode 100644 index 0000000..307756c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php @@ -0,0 +1,134 @@ +register('properties.charset') + ->asValue('utf-8') + + ->register('email.validator') + ->asSharedInstanceOf('Egulias\EmailValidator\EmailValidator') + + ->register('mime.idgenerator.idright') + // As SERVER_NAME can come from the user in certain configurations, check that + // it does not contain forbidden characters (see RFC 952 and RFC 2181). Use + // preg_replace() instead of preg_match() to prevent DoS attacks with long host names. + ->asValue(!empty($_SERVER['SERVER_NAME']) && '' === preg_replace('/(?:^\[)?[a-zA-Z0-9-:\]_]+\.?/', '', $_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'swift.generated') + + ->register('mime.idgenerator') + ->asSharedInstanceOf('Swift_Mime_IdGenerator') + ->withDependencies([ + 'mime.idgenerator.idright', + ]) + + ->register('mime.message') + ->asNewInstanceOf('Swift_Mime_SimpleMessage') + ->withDependencies([ + 'mime.headerset', + 'mime.textcontentencoder', + 'cache', + 'mime.idgenerator', + 'properties.charset', + ]) + + ->register('mime.part') + ->asNewInstanceOf('Swift_Mime_MimePart') + ->withDependencies([ + 'mime.headerset', + 'mime.textcontentencoder', + 'cache', + 'mime.idgenerator', + 'properties.charset', + ]) + + ->register('mime.attachment') + ->asNewInstanceOf('Swift_Mime_Attachment') + ->withDependencies([ + 'mime.headerset', + 'mime.base64contentencoder', + 'cache', + 'mime.idgenerator', + ]) + ->addConstructorValue($swift_mime_types) + + ->register('mime.embeddedfile') + ->asNewInstanceOf('Swift_Mime_EmbeddedFile') + ->withDependencies([ + 'mime.headerset', + 'mime.base64contentencoder', + 'cache', + 'mime.idgenerator', + ]) + ->addConstructorValue($swift_mime_types) + + ->register('mime.headerfactory') + ->asNewInstanceOf('Swift_Mime_SimpleHeaderFactory') + ->withDependencies([ + 'mime.qpheaderencoder', + 'mime.rfc2231encoder', + 'email.validator', + 'properties.charset', + 'address.idnaddressencoder', + ]) + + ->register('mime.headerset') + ->asNewInstanceOf('Swift_Mime_SimpleHeaderSet') + ->withDependencies(['mime.headerfactory', 'properties.charset']) + + ->register('mime.qpheaderencoder') + ->asNewInstanceOf('Swift_Mime_HeaderEncoder_QpHeaderEncoder') + ->withDependencies(['mime.charstream']) + + ->register('mime.base64headerencoder') + ->asNewInstanceOf('Swift_Mime_HeaderEncoder_Base64HeaderEncoder') + ->withDependencies(['mime.charstream']) + + ->register('mime.charstream') + ->asNewInstanceOf('Swift_CharacterStream_NgCharacterStream') + ->withDependencies(['mime.characterreaderfactory', 'properties.charset']) + + ->register('mime.bytecanonicalizer') + ->asSharedInstanceOf('Swift_StreamFilters_ByteArrayReplacementFilter') + ->addConstructorValue([[0x0D, 0x0A], [0x0D], [0x0A]]) + ->addConstructorValue([[0x0A], [0x0A], [0x0D, 0x0A]]) + + ->register('mime.characterreaderfactory') + ->asSharedInstanceOf('Swift_CharacterReaderFactory_SimpleCharacterReaderFactory') + + ->register('mime.textcontentencoder') + ->asAliasOf('mime.qpcontentencoder') + + ->register('mime.safeqpcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoder') + ->withDependencies(['mime.charstream', 'mime.bytecanonicalizer']) + + ->register('mime.rawcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_RawContentEncoder') + + ->register('mime.nativeqpcontentencoder') + ->withDependencies(['properties.charset']) + ->asNewInstanceOf('Swift_Mime_ContentEncoder_NativeQpContentEncoder') + + ->register('mime.qpcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoderProxy') + ->withDependencies(['mime.safeqpcontentencoder', 'mime.nativeqpcontentencoder', 'properties.charset']) + + ->register('mime.7bitcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_PlainContentEncoder') + ->addConstructorValue('7bit') + ->addConstructorValue(true) + + ->register('mime.8bitcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_PlainContentEncoder') + ->addConstructorValue('8bit') + ->addConstructorValue(true) + + ->register('mime.base64contentencoder') + ->asSharedInstanceOf('Swift_Mime_ContentEncoder_Base64ContentEncoder') + + ->register('mime.rfc2231encoder') + ->asNewInstanceOf('Swift_Encoder_Rfc2231Encoder') + ->withDependencies(['mime.charstream']) +; + +unset($swift_mime_types); diff --git a/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php b/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php new file mode 100644 index 0000000..34a63c7 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php @@ -0,0 +1,97 @@ +register('transport.localdomain') + // As SERVER_NAME can come from the user in certain configurations, check that + // it does not contain forbidden characters (see RFC 952 and RFC 2181). Use + // preg_replace() instead of preg_match() to prevent DoS attacks with long host names. + ->asValue(!empty($_SERVER['SERVER_NAME']) && '' === preg_replace('/(?:^\[)?[a-zA-Z0-9-:\]_]+\.?/', '', $_SERVER['SERVER_NAME']) ? trim($_SERVER['SERVER_NAME'], '[]') : '127.0.0.1') + + ->register('transport.smtp') + ->asNewInstanceOf('Swift_Transport_EsmtpTransport') + ->withDependencies([ + 'transport.buffer', + 'transport.smtphandlers', + 'transport.eventdispatcher', + 'transport.localdomain', + 'address.idnaddressencoder', + ]) + + ->register('transport.sendmail') + ->asNewInstanceOf('Swift_Transport_SendmailTransport') + ->withDependencies([ + 'transport.buffer', + 'transport.eventdispatcher', + 'transport.localdomain', + ]) + + ->register('transport.loadbalanced') + ->asNewInstanceOf('Swift_Transport_LoadBalancedTransport') + + ->register('transport.failover') + ->asNewInstanceOf('Swift_Transport_FailoverTransport') + + ->register('transport.spool') + ->asNewInstanceOf('Swift_Transport_SpoolTransport') + ->withDependencies(['transport.eventdispatcher']) + + ->register('transport.null') + ->asNewInstanceOf('Swift_Transport_NullTransport') + ->withDependencies(['transport.eventdispatcher']) + + ->register('transport.buffer') + ->asNewInstanceOf('Swift_Transport_StreamBuffer') + ->withDependencies(['transport.replacementfactory']) + + ->register('transport.smtphandlers') + ->asArray() + ->withDependencies(['transport.authhandler']) + + ->register('transport.authhandler') + ->asNewInstanceOf('Swift_Transport_Esmtp_AuthHandler') + ->withDependencies(['transport.authhandlers']) + + ->register('transport.authhandlers') + ->asArray() + ->withDependencies([ + 'transport.crammd5auth', + 'transport.loginauth', + 'transport.plainauth', + 'transport.ntlmauth', + 'transport.xoauth2auth', + ]) + + ->register('transport.smtputf8handler') + ->asNewInstanceOf('Swift_Transport_Esmtp_SmtpUtf8Handler') + + ->register('transport.8bitmimehandler') + ->asNewInstanceOf('Swift_Transport_Esmtp_EightBitMimeHandler') + ->addConstructorValue('8BITMIME') + + ->register('transport.crammd5auth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_CramMd5Authenticator') + + ->register('transport.loginauth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_LoginAuthenticator') + + ->register('transport.plainauth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_PlainAuthenticator') + + ->register('transport.xoauth2auth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_XOAuth2Authenticator') + + ->register('transport.ntlmauth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_NTLMAuthenticator') + + ->register('transport.eventdispatcher') + ->asNewInstanceOf('Swift_Events_SimpleEventDispatcher') + + ->register('transport.replacementfactory') + ->asSharedInstanceOf('Swift_StreamFilters_StringReplacementFilterFactory') + + ->register('address.idnaddressencoder') + ->asNewInstanceOf('Swift_AddressEncoder_IdnAddressEncoder') + + ->register('address.utf8addressencoder') + ->asNewInstanceOf('Swift_AddressEncoder_Utf8AddressEncoder') +; diff --git a/vendor/swiftmailer/swiftmailer/lib/mime_types.php b/vendor/swiftmailer/swiftmailer/lib/mime_types.php new file mode 100644 index 0000000..72c6fd2 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/mime_types.php @@ -0,0 +1,1007 @@ + 'text/vnd.in3d.3dml', + '3ds' => 'image/x-3ds', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'appcache' => 'text/cache-manifest', + 'apr' => 'application/vnd.lotus-approach', + 'aps' => 'application/postscript', + 'arc' => 'application/x-freearc', + 'asc' => 'application/pgp-signature', + 'asf' => 'video/x-ms-asf', + 'asm' => 'text/x-asm', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'blb' => 'application/x-blorb', + 'blorb' => 'application/x-blorb', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'caf' => 'audio/x-caf', + 'cap' => 'application/vnd.tcpdump.pcap', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cb7' => 'application/x-cbr', + 'cba' => 'application/x-cbr', + 'cbr' => 'application/x-cbr', + 'cbt' => 'application/x-cbr', + 'cbz' => 'application/x-cbr', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfs' => 'application/x-cfs-compressed', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dart' => 'application/vnd.dart', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dbk' => 'application/docbook+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dgc' => 'application/x-dgc-compressed', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/x-apple-diskimage', + 'dmp' => 'application/vnd.tcpdump.pcap', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvb' => 'video/vnd.dvb.file', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'emf' => 'application/x-msmetafile', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'emz' => 'application/x-msmetafile', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esa' => 'application/vnd.osgi.subsystem', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'eva' => 'application/x-eva', + 'evy' => 'application/x-envoy', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'flac' => 'audio/x-flac', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gam' => 'application/x-tads', + 'gbr' => 'application/rpki-ghostbusters', + 'gca' => 'application/x-gca-compressed', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gml' => 'application/gml+xml', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gpx' => 'application/gpx+xml', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gramps' => 'application/x-gramps-xml', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxf' => 'application/gxf', + 'gxt' => 'application/vnd.geonext', + 'gz' => 'application/x-gzip', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ink' => 'application/inkml+xml', + 'inkml' => 'application/inkml+xml', + 'install' => 'application/x-install-instructions', + 'iota' => 'application/vnd.astraea-software.iota', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/x-iso9660-image', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'application/javascript', + 'json' => 'application/json', + 'jsonml' => 'application/jsonml+json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'kpxx' => 'application/vnd.ds-keypoint', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/x-lzh-compressed', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'lnk' => 'application/x-ms-shortcut', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/x-lzh-compressed', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/x-m4v', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mar' => 'application/octet-stream', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'metalink' => 'application/metalink+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mft' => 'application/rpki-manifest', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mie' => 'application/x-mie', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mk3d' => 'video/x-matroska', + 'mka' => 'audio/x-matroska', + 'mks' => 'video/x-matroska', + 'mkv' => 'video/x-matroska', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mng' => 'video/x-mng', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'nfo' => 'text/x-nfo', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nitf' => 'application/vnd.nitf', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsc' => 'application/x-conference', + 'nsf' => 'application/vnd.lotus-notes', + 'ntf' => 'application/vnd.nitf', + 'nzb' => 'application/x-nzb', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'obj' => 'application/x-tgif', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'omdoc' => 'application/omdoc+xml', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'opml' => 'text/x-opml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxps' => 'application/oxps', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcap' => 'application/vnd.tcpdump.pcap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'application/x-php', + 'php3' => 'application/x-php', + 'php4' => 'application/x-php', + 'php5' => 'application/x-php', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'ris' => 'application/x-research-info-systems', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rmvb' => 'application/vnd.rn-realmedia-vbr', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roa' => 'application/rpki-roa', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 's3m' => 'audio/s3m', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sfv' => 'text/x-sfv', + 'sgi' => 'image/sgi', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sid' => 'image/x-mrsid-image', + 'sig' => 'application/pgp-signature', + 'sil' => 'audio/silk', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'smv' => 'video/x-smv', + 'smzip' => 'application/vnd.stepmania.package', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'sql' => 'application/x-sql', + 'src' => 'application/x-wais-source', + 'srt' => 'application/x-subrip', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'ssdl' => 'application/ssdl+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'text/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 't3' => 'application/x-t3vm-image', + 'taglet' => 'application/vnd.mynfc', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'tga' => 'image/x-tga', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'ulx' => 'application/x-glulx', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvvz' => 'application/vnd.dece.zip', + 'uvx' => 'application/vnd.dece.unspecified', + 'uvz' => 'application/vnd.dece.zip', + 'vcard' => 'text/vcard', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vob' => 'video/x-ms-vob', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'wdp' => 'image/vnd.ms-photo', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-msmetafile', + 'woff' => 'application/font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'model/x3d+xml', + 'x3db' => 'model/x3d+binary', + 'x3dbz' => 'model/x3d+binary', + 'x3dv' => 'model/x3d+vrml', + 'x3dvz' => 'model/x3d+vrml', + 'x3dz' => 'model/x3d+xml', + 'xaml' => 'application/xaml+xml', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlf' => 'application/x-xliff+xml', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xm' => 'audio/xm', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpl' => 'application/xproc+xml', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'xz' => 'application/x-xz', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'z1' => 'application/x-zmachine', + 'z2' => 'application/x-zmachine', + 'z3' => 'application/x-zmachine', + 'z4' => 'application/x-zmachine', + 'z5' => 'application/x-zmachine', + 'z6' => 'application/x-zmachine', + 'z7' => 'application/x-zmachine', + 'z8' => 'application/x-zmachine', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml', + '123' => 'application/vnd.lotus-1-2-3', +]; diff --git a/vendor/swiftmailer/swiftmailer/lib/preferences.php b/vendor/swiftmailer/swiftmailer/lib/preferences.php new file mode 100644 index 0000000..27b7065 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/preferences.php @@ -0,0 +1,19 @@ +setCharset('utf-8'); + +// Without these lines the default caching mechanism is "array" but this uses a lot of memory. +// If possible, use a disk cache to enable attaching large attachments etc. +// You can override the default temporary directory by setting the TMPDIR environment variable. +if (@is_writable($tmpDir = sys_get_temp_dir())) { + $preferences->setTempDir($tmpDir)->setCacheType('disk'); +} diff --git a/vendor/swiftmailer/swiftmailer/lib/swift_required.php b/vendor/swiftmailer/swiftmailer/lib/swift_required.php new file mode 100644 index 0000000..d696056 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/lib/swift_required.php @@ -0,0 +1,22 @@ + 'application/x-php', + 'php3' => 'application/x-php', + 'php4' => 'application/x-php', + 'php5' => 'application/x-php', + 'zip' => 'application/zip', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'css' => 'text/css', + 'js' => 'text/javascript', + 'txt' => 'text/plain', + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'avi' => 'video/avi', + 'bmp' => 'image/bmp', + 'bz2' => 'application/x-bz2', + 'csv' => 'text/csv', + 'dmg' => 'application/x-apple-diskimage', + 'doc' => 'application/msword', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'eml' => 'message/rfc822', + 'aps' => 'application/postscript', + 'exe' => 'application/x-ms-dos-executable', + 'flv' => 'video/x-flv', + 'gz' => 'application/x-gzip', + 'hqx' => 'application/stuffit', + 'htm' => 'text/html', + 'html' => 'text/html', + 'jar' => 'application/x-java-archive', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'm3u' => 'audio/x-mpegurl', + 'm4a' => 'audio/mp4', + 'mdb' => 'application/x-msaccess', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mov' => 'video/quicktime', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'odg' => 'vnd.oasis.opendocument.graphics', + 'odp' => 'vnd.oasis.opendocument.presentation', + 'odt' => 'vnd.oasis.opendocument.text', + 'ods' => 'vnd.oasis.opendocument.spreadsheet', + 'ogg' => 'audio/ogg', + 'pdf' => 'application/pdf', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'ps' => 'application/postscript', + 'rar' => 'application/x-rar-compressed', + 'rtf' => 'application/rtf', + 'tar' => 'application/x-tar', + 'sit' => 'application/x-stuffit', + 'svg' => 'image/svg+xml', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'ttf' => 'application/x-font-truetype', + 'vcf' => 'text/x-vcard', + 'wav' => 'audio/wav', + 'wma' => 'audio/x-ms-wma', + 'wmv' => 'audio/x-ms-wmv', + 'xls' => 'application/vnd.ms-excel', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xml' => 'application/xml', + ]; + + // wrap array for generating file + foreach ($valid_mime_types_preset as $extension => $mime_type) { + // generate array for mimetype to extension resolver (only first match) + $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'"; + } + + // all extensions from second match + foreach ($matches[2] as $i => $extensions) { + // explode multiple extensions from string + $extensions = explode(' ', strtolower($extensions)); + + // force array for foreach + if (!is_array($extensions)) { + $extensions = [$extensions]; + } + + foreach ($extensions as $extension) { + // get mime type + $mime_type = $matches[1][$i]; + + // check if string length lower than 10 + if (strlen($extension) < 10) { + if (!isset($valid_mime_types[$mime_type])) { + // generate array for mimetype to extension resolver (only first match) + $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'"; + } + } + } + } + } + + $xml = simplexml_load_string($mime_xml); + + foreach ($xml as $node) { + // check if there is no pattern + if (!isset($node->glob['pattern'])) { + continue; + } + + // get all matching extensions from match + foreach ((array) $node->glob['pattern'] as $extension) { + // skip none glob extensions + if (false === strpos($extension, '.')) { + continue; + } + + // remove get only last part + $extension = explode('.', strtolower($extension)); + $extension = end($extension); + } + + if (isset($node->glob['pattern'][0])) { + // mime type + $mime_type = strtolower((string) $node['type']); + + // get first extension + $extension = strtolower(trim($node->glob['ddpattern'][0], '*.')); + + // skip none glob extensions and check if string length between 1 and 10 + if (false !== strpos($extension, '.') || strlen($extension) < 1 || strlen($extension) > 9) { + continue; + } + + // check if string length lower than 10 + if (!isset($valid_mime_types[$mime_type])) { + // generate array for mimetype to extension resolver (only first match) + $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'"; + } + } + } + + // full list of valid extensions only + $valid_mime_types = array_unique($valid_mime_types); + ksort($valid_mime_types); + + // combine mime types and extensions array + $output = "$preamble\$swift_mime_types = array(\n ".implode(",\n ", $valid_mime_types)."\n);"; + + // write mime_types.php config file + @file_put_contents('./mime_types.php', $output); +} + +generateUpToDateMimeArray(); diff --git a/vendor/swiftmailer/swiftmailer/phpunit.xml.dist b/vendor/swiftmailer/swiftmailer/phpunit.xml.dist new file mode 100644 index 0000000..9ec0c49 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/phpunit.xml.dist @@ -0,0 +1,38 @@ + + + + + + + + + + + + tests/unit + + + tests/acceptance + + + tests/bug + + + tests/smoke + + + + + + + diff --git a/vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php b/vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php new file mode 100644 index 0000000..0a4a6da --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php @@ -0,0 +1,62 @@ +value = $value; + } + + /** + * Evaluates the constraint for parameter $other. Returns TRUE if the + * constraint is met, FALSE otherwise. + * + * @param mixed $other Value or object to evaluate. + * + * @return bool + */ + public function matches($other) + { + $aHex = $this->asHexString($this->value); + $bHex = $this->asHexString($other); + + return $aHex === $bHex; + } + + /** + * Returns a string representation of the constraint. + * + * @return string + */ + public function toString() + { + return 'identical binary'; + } + + /** + * Get the given string of bytes as a stirng of Hexadecimal sequences. + * + * @param string $binary + * + * @return string + */ + private function asHexString($binary) + { + $hex = ''; + + $bytes = unpack('H*', $binary); + + foreach ($bytes as &$byte) { + $byte = strtoupper($byte); + } + + return implode('', $bytes); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/StreamCollector.php b/vendor/swiftmailer/swiftmailer/tests/StreamCollector.php new file mode 100644 index 0000000..7f079d9 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/StreamCollector.php @@ -0,0 +1,11 @@ +content .= $arg; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php new file mode 100644 index 0000000..13bd240 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php @@ -0,0 +1,46 @@ +markTestSkipped( + 'Smoke tests are skipped if tests/smoke.conf.php is not edited' + ); + } + } + + protected function getMailer() + { + switch (SWIFT_SMOKE_TRANSPORT_TYPE) { + case 'smtp': + $transport = Swift_DependencyContainer::getInstance()->lookup('transport.smtp') + ->setHost(SWIFT_SMOKE_SMTP_HOST) + ->setPort(SWIFT_SMOKE_SMTP_PORT) + ->setUsername(SWIFT_SMOKE_SMTP_USER) + ->setPassword(SWIFT_SMOKE_SMTP_PASS) + ->setEncryption(SWIFT_SMOKE_SMTP_ENCRYPTION) + ; + break; + case 'sendmail': + $transport = Swift_DependencyContainer::getInstance()->lookup('transport.sendmail') + ->setCommand(SWIFT_SMOKE_SENDMAIL_COMMAND) + ; + break; + case 'mail': + case 'nativemail': + $transport = Swift_DependencyContainer::getInstance()->lookup('transport.mail'); + break; + default: + throw new Exception('Undefined transport ['.SWIFT_SMOKE_TRANSPORT_TYPE.']'); + } + + return new Swift_Mailer($transport); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php new file mode 100644 index 0000000..fe2c62b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png b/vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png new file mode 100644 index 0000000000000000000000000000000000000000..1b95f619af1fcbed1fca382d22022bdf329849cf GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip b/vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip new file mode 100644 index 0000000000000000000000000000000000000000..5a580ecbf81ff98445bc5c6d0fce7a9a301f0e39 GIT binary patch literal 202 zcmWIWW@h1HU}9ikII%0tqR&rhgC39#!aNM33?-=*C25&Csd^<9C7~gl49w;G_PK*_ zXax(ySH`c5AsLy)3P4nlSX82rpQezg5L}*_R-)jW2-H=iP-db~oSUDWs!)testFile = sys_get_temp_dir().'/swift-test-file'.__CLASS__; + file_put_contents($this->testFile, 'abcdefghijklm'); + } + + protected function tearDown() + { + unlink($this->testFile); + } + + public function testFileDataCanBeRead() + { + $file = $this->createFileStream($this->testFile); + $str = ''; + while (false !== $bytes = $file->read(8192)) { + $str .= $bytes; + } + $this->assertEquals('abcdefghijklm', $str); + } + + public function testFileDataCanBeReadSequentially() + { + $file = $this->createFileStream($this->testFile); + $this->assertEquals('abcde', $file->read(5)); + $this->assertEquals('fghijklm', $file->read(8)); + $this->assertFalse($file->read(1)); + } + + public function testFilenameIsReturned() + { + $file = $this->createFileStream($this->testFile); + $this->assertEquals($this->testFile, $file->getPath()); + } + + public function testFileCanBeWrittenTo() + { + $file = $this->createFileStream($this->testFile, true); + $file->write('foobar'); + $this->assertEquals('foobar', $file->read(8192)); + } + + public function testReadingFromThenWritingToFile() + { + $file = $this->createFileStream($this->testFile, true); + $file->write('foobar'); + $this->assertEquals('foobar', $file->read(8192)); + $file->write('zipbutton'); + $this->assertEquals('zipbutton', $file->read(8192)); + } + + public function testWritingToFileWithCanonicalization() + { + $file = $this->createFileStream($this->testFile, true); + $file->addFilter($this->createFilter(["\r\n", "\r"], "\n"), 'allToLF'); + $file->write("foo\r\nbar\r"); + $file->write("\nzip\r\ntest\r"); + $file->flushBuffers(); + $this->assertEquals("foo\nbar\nzip\ntest\n", file_get_contents($this->testFile)); + } + + public function testWritingWithFulleMessageLengthOfAMultipleOf8192() + { + $file = $this->createFileStream($this->testFile, true); + $file->addFilter($this->createFilter(["\r\n", "\r"], "\n"), 'allToLF'); + $file->write(''); + $file->flushBuffers(); + $this->assertEquals('', file_get_contents($this->testFile)); + } + + public function testBindingOtherStreamsMirrorsWriteOperations() + { + $file = $this->createFileStream($this->testFile, true); + $is1 = $this->createMockInputStream(); + $is2 = $this->createMockInputStream(); + + $is1->expects($this->at(0)) + ->method('write') + ->with('x'); + $is1->expects($this->at(1)) + ->method('write') + ->with('y'); + $is2->expects($this->at(0)) + ->method('write') + ->with('x'); + $is2->expects($this->at(1)) + ->method('write') + ->with('y'); + + $file->bind($is1); + $file->bind($is2); + + $file->write('x'); + $file->write('y'); + } + + public function testBindingOtherStreamsMirrorsFlushOperations() + { + $file = $this->createFileStream( + $this->testFile, true + ); + $is1 = $this->createMockInputStream(); + $is2 = $this->createMockInputStream(); + + $is1->expects($this->once()) + ->method('flushBuffers'); + $is2->expects($this->once()) + ->method('flushBuffers'); + + $file->bind($is1); + $file->bind($is2); + + $file->flushBuffers(); + } + + public function testUnbindingStreamPreventsFurtherWrites() + { + $file = $this->createFileStream($this->testFile, true); + $is1 = $this->createMockInputStream(); + $is2 = $this->createMockInputStream(); + + $is1->expects($this->at(0)) + ->method('write') + ->with('x'); + $is1->expects($this->at(1)) + ->method('write') + ->with('y'); + $is2->expects($this->once()) + ->method('write') + ->with('x'); + + $file->bind($is1); + $file->bind($is2); + + $file->write('x'); + + $file->unbind($is2); + + $file->write('y'); + } + + private function createFilter($search, $replace) + { + return new Swift_StreamFilters_StringReplacementFilter($search, $replace); + } + + private function createMockInputStream() + { + return $this->getMockBuilder('Swift_InputByteStream')->getMock(); + } + + private function createFileStream($file, $writable = false) + { + return new Swift_ByteStream_FileByteStream($file, $writable); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php new file mode 100644 index 0000000..fcc7ad4 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php @@ -0,0 +1,179 @@ +factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + } + + public function testCreatingUtf8Reader() + { + foreach (['utf8', 'utf-8', 'UTF-8', 'UTF8'] as $utf8) { + $reader = $this->factory->getReaderFor($utf8); + $this->assertInstanceOf($this->prefix.'Utf8Reader', $reader); + } + } + + public function testCreatingIso8859XReaders() + { + $charsets = []; + foreach (range(1, 16) as $number) { + foreach (['iso', 'iec'] as $body) { + $charsets[] = $body.'-8859-'.$number; + $charsets[] = $body.'8859-'.$number; + $charsets[] = strtoupper($body).'-8859-'.$number; + $charsets[] = strtoupper($body).'8859-'.$number; + } + } + + foreach ($charsets as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingWindows125XReaders() + { + $charsets = []; + foreach (range(0, 8) as $number) { + $charsets[] = 'windows-125'.$number; + $charsets[] = 'windows125'.$number; + $charsets[] = 'WINDOWS-125'.$number; + $charsets[] = 'WINDOWS125'.$number; + } + + foreach ($charsets as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingCodePageReaders() + { + $charsets = []; + foreach (range(0, 8) as $number) { + $charsets[] = 'cp-125'.$number; + $charsets[] = 'cp125'.$number; + $charsets[] = 'CP-125'.$number; + $charsets[] = 'CP125'.$number; + } + + foreach ([437, 737, 850, 855, 857, 858, 860, + 861, 863, 865, 866, 869, ] as $number) { + $charsets[] = 'cp-'.$number; + $charsets[] = 'cp'.$number; + $charsets[] = 'CP-'.$number; + $charsets[] = 'CP'.$number; + } + + foreach ($charsets as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingAnsiReader() + { + foreach (['ansi', 'ANSI'] as $ansi) { + $reader = $this->factory->getReaderFor($ansi); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingMacintoshReader() + { + foreach (['macintosh', 'MACINTOSH'] as $mac) { + $reader = $this->factory->getReaderFor($mac); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingKOIReaders() + { + $charsets = []; + foreach (['7', '8-r', '8-u', '8u', '8r'] as $end) { + $charsets[] = 'koi-'.$end; + $charsets[] = 'koi'.$end; + $charsets[] = 'KOI-'.$end; + $charsets[] = 'KOI'.$end; + } + + foreach ($charsets as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingIsciiReaders() + { + foreach (['iscii', 'ISCII', 'viscii', 'VISCII'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingMIKReader() + { + foreach (['mik', 'MIK'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingCorkReader() + { + foreach (['cork', 'CORK', 't1', 'T1'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(1, $reader->getInitialByteSize()); + } + } + + public function testCreatingUcs2Reader() + { + foreach (['ucs-2', 'UCS-2', 'ucs2', 'UCS2'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(2, $reader->getInitialByteSize()); + } + } + + public function testCreatingUtf16Reader() + { + foreach (['utf-16', 'UTF-16', 'utf16', 'UTF16'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(2, $reader->getInitialByteSize()); + } + } + + public function testCreatingUcs4Reader() + { + foreach (['ucs-4', 'UCS-4', 'ucs4', 'UCS4'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(4, $reader->getInitialByteSize()); + } + } + + public function testCreatingUtf32Reader() + { + foreach (['utf-32', 'UTF-32', 'utf32', 'UTF32'] as $charset) { + $reader = $this->factory->getReaderFor($charset); + $this->assertInstanceOf($this->prefix.'GenericFixedWidthReader', $reader); + $this->assertEquals(4, $reader->getInitialByteSize()); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php new file mode 100644 index 0000000..3c1b515 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php @@ -0,0 +1,22 @@ +listItems() as $itemName) { + try { + $di->lookup($itemName); + } catch (Swift_DependencyException $e) { + $this->fail($e->getMessage()); + } + } + // previous loop would fail if there is an issue + $this->addToAssertionCount(1); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php new file mode 100644 index 0000000..a172e97 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php @@ -0,0 +1,12 @@ +samplesDir = realpath(__DIR__.'/../../../_samples/charsets'); + $this->encoder = new Swift_Encoder_Base64Encoder(); + } + + public function testEncodingAndDecodingSamples() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + $encodedText = $this->encoder->encodeString($text); + + $this->assertEquals( + base64_decode($encodedText), $text, + '%s: Encoded string should decode back to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php new file mode 100644 index 0000000..5bbf067 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php @@ -0,0 +1,54 @@ +samplesDir = realpath(__DIR__.'/../../../_samples/charsets'); + $this->factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + } + + public function testEncodingAndDecodingSamples() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $encoding = $encodingDir; + $charStream = new Swift_CharacterStream_ArrayCharacterStream( + $this->factory, $encoding); + $encoder = new Swift_Encoder_QpEncoder($charStream); + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + $encodedText = $encoder->encodeString($text); + + foreach (explode("\r\n", $encodedText) as $line) { + $this->assertLessThanOrEqual(76, strlen($line)); + } + + $this->assertEquals( + quoted_printable_decode($encodedText), $text, + '%s: Encoded string should decode back to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php new file mode 100644 index 0000000..20c68d5 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php @@ -0,0 +1,50 @@ +samplesDir = realpath(__DIR__.'/../../../_samples/charsets'); + $this->factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + } + + public function testEncodingAndDecodingSamples() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $encoding = $encodingDir; + $charStream = new Swift_CharacterStream_ArrayCharacterStream( + $this->factory, $encoding); + $encoder = new Swift_Encoder_Rfc2231Encoder($charStream); + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + $encodedText = $encoder->encodeString($text); + + $this->assertEquals( + urldecode(implode('', explode("\r\n", $encodedText))), $text, + '%s: Encoded string should decode back to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php new file mode 100644 index 0000000..c54986b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php @@ -0,0 +1,173 @@ +cache = new Swift_KeyCache_ArrayKeyCache( + new Swift_KeyCache_SimpleKeyCacheInputStream() + ); + } + + public function testStringDataCanBeSetAndFetched() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $this->cache->getString($this->key1, 'foo')); + } + + public function testStringDataCanBeOverwritten() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'foo', 'whatever', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('whatever', $this->cache->getString($this->key1, 'foo')); + } + + public function testStringDataCanBeAppended() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'foo', 'ing', Swift_KeyCache::MODE_APPEND + ); + $this->assertEquals('testing', $this->cache->getString($this->key1, 'foo')); + } + + public function testHasKeyReturnValue() + { + $this->assertFalse($this->cache->hasKey($this->key1, 'foo')); + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($this->cache->hasKey($this->key1, 'foo')); + } + + public function testNsKeyIsWellPartitioned() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key2, 'foo', 'ing', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $this->cache->getString($this->key1, 'foo')); + $this->assertEquals('ing', $this->cache->getString($this->key2, 'foo')); + } + + public function testItemKeyIsWellPartitioned() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'bar', 'ing', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $this->cache->getString($this->key1, 'foo')); + $this->assertEquals('ing', $this->cache->getString($this->key1, 'bar')); + } + + public function testByteStreamCanBeImported() + { + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write('abcdef'); + + $this->cache->importFromByteStream( + $this->key1, 'foo', $os, Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('abcdef', $this->cache->getString($this->key1, 'foo')); + } + + public function testByteStreamCanBeAppended() + { + $os1 = new Swift_ByteStream_ArrayByteStream(); + $os1->write('abcdef'); + + $os2 = new Swift_ByteStream_ArrayByteStream(); + $os2->write('xyzuvw'); + + $this->cache->importFromByteStream( + $this->key1, 'foo', $os1, Swift_KeyCache::MODE_APPEND + ); + $this->cache->importFromByteStream( + $this->key1, 'foo', $os2, Swift_KeyCache::MODE_APPEND + ); + + $this->assertEquals('abcdefxyzuvw', $this->cache->getString($this->key1, 'foo')); + } + + public function testByteStreamAndStringCanBeAppended() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_APPEND + ); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write('abcdef'); + + $this->cache->importFromByteStream( + $this->key1, 'foo', $os, Swift_KeyCache::MODE_APPEND + ); + $this->assertEquals('testabcdef', $this->cache->getString($this->key1, 'foo')); + } + + public function testDataCanBeExportedToByteStream() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + + $is = new Swift_ByteStream_ArrayByteStream(); + + $this->cache->exportToByteStream($this->key1, 'foo', $is); + + $string = ''; + while (false !== $bytes = $is->read(8192)) { + $string .= $bytes; + } + + $this->assertEquals('test', $string); + } + + public function testKeyCanBeCleared() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($this->cache->hasKey($this->key1, 'foo')); + $this->cache->clearKey($this->key1, 'foo'); + $this->assertFalse($this->cache->hasKey($this->key1, 'foo')); + } + + public function testNsKeyCanBeCleared() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'bar', 'xyz', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($this->cache->hasKey($this->key1, 'foo')); + $this->assertTrue($this->cache->hasKey($this->key1, 'bar')); + $this->cache->clearAll($this->key1); + $this->assertFalse($this->cache->hasKey($this->key1, 'foo')); + $this->assertFalse($this->cache->hasKey($this->key1, 'bar')); + } + + public function testKeyCacheInputStream() + { + $is = $this->cache->getInputByteStream($this->key1, 'foo'); + $is->write('abc'); + $is->write('xyz'); + $this->assertEquals('abcxyz', $this->cache->getString($this->key1, 'foo')); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php new file mode 100644 index 0000000..9764742 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php @@ -0,0 +1,173 @@ +key1 = uniqid(microtime(true), true); + $this->key2 = uniqid(microtime(true), true); + $this->cache = new Swift_KeyCache_DiskKeyCache(new Swift_KeyCache_SimpleKeyCacheInputStream(), sys_get_temp_dir()); + } + + public function testStringDataCanBeSetAndFetched() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $this->cache->getString($this->key1, 'foo')); + } + + public function testStringDataCanBeOverwritten() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'foo', 'whatever', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('whatever', $this->cache->getString($this->key1, 'foo')); + } + + public function testStringDataCanBeAppended() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'foo', 'ing', Swift_KeyCache::MODE_APPEND + ); + $this->assertEquals('testing', $this->cache->getString($this->key1, 'foo')); + } + + public function testHasKeyReturnValue() + { + $this->assertFalse($this->cache->hasKey($this->key1, 'foo')); + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($this->cache->hasKey($this->key1, 'foo')); + } + + public function testNsKeyIsWellPartitioned() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key2, 'foo', 'ing', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $this->cache->getString($this->key1, 'foo')); + $this->assertEquals('ing', $this->cache->getString($this->key2, 'foo')); + } + + public function testItemKeyIsWellPartitioned() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'bar', 'ing', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $this->cache->getString($this->key1, 'foo')); + $this->assertEquals('ing', $this->cache->getString($this->key1, 'bar')); + } + + public function testByteStreamCanBeImported() + { + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write('abcdef'); + + $this->cache->importFromByteStream( + $this->key1, 'foo', $os, Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('abcdef', $this->cache->getString($this->key1, 'foo')); + } + + public function testByteStreamCanBeAppended() + { + $os1 = new Swift_ByteStream_ArrayByteStream(); + $os1->write('abcdef'); + + $os2 = new Swift_ByteStream_ArrayByteStream(); + $os2->write('xyzuvw'); + + $this->cache->importFromByteStream( + $this->key1, 'foo', $os1, Swift_KeyCache::MODE_APPEND + ); + $this->cache->importFromByteStream( + $this->key1, 'foo', $os2, Swift_KeyCache::MODE_APPEND + ); + + $this->assertEquals('abcdefxyzuvw', $this->cache->getString($this->key1, 'foo')); + } + + public function testByteStreamAndStringCanBeAppended() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_APPEND + ); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write('abcdef'); + + $this->cache->importFromByteStream( + $this->key1, 'foo', $os, Swift_KeyCache::MODE_APPEND + ); + $this->assertEquals('testabcdef', $this->cache->getString($this->key1, 'foo')); + } + + public function testDataCanBeExportedToByteStream() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + + $is = new Swift_ByteStream_ArrayByteStream(); + + $this->cache->exportToByteStream($this->key1, 'foo', $is); + + $string = ''; + while (false !== $bytes = $is->read(8192)) { + $string .= $bytes; + } + + $this->assertEquals('test', $string); + } + + public function testKeyCanBeCleared() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($this->cache->hasKey($this->key1, 'foo')); + $this->cache->clearKey($this->key1, 'foo'); + $this->assertFalse($this->cache->hasKey($this->key1, 'foo')); + } + + public function testNsKeyCanBeCleared() + { + $this->cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->cache->setString( + $this->key1, 'bar', 'xyz', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($this->cache->hasKey($this->key1, 'foo')); + $this->assertTrue($this->cache->hasKey($this->key1, 'bar')); + $this->cache->clearAll($this->key1); + $this->assertFalse($this->cache->hasKey($this->key1, 'foo')); + $this->assertFalse($this->cache->hasKey($this->key1, 'bar')); + } + + public function testKeyCacheInputStream() + { + $is = $this->cache->getInputByteStream($this->key1, 'foo'); + $is->write('abc'); + $is->write('xyz'); + $this->assertEquals('abcxyz', $this->cache->getString($this->key1, 'foo')); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php new file mode 100644 index 0000000..16adb23 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php @@ -0,0 +1,55 @@ +createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = $message->getDate(); + $boundary = $message->getBoundary(); + + $message->addPart('foo', 'text/plain', 'iso-8859-1'); + $message->addPart('test foo', 'text/html', 'iso-8859-1'); + + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'test foo'. + "\r\n\r\n". + '--'.$boundary.'--'."\r\n", + $message->toString() + ); + } + + protected function createMessage() + { + Swift_DependencyContainer::getInstance() + ->register('properties.charset')->asValue(null); + + return new Swift_Message(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php new file mode 100644 index 0000000..920faed --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php @@ -0,0 +1,126 @@ +cache = new Swift_KeyCache_ArrayKeyCache( + new Swift_KeyCache_SimpleKeyCacheInputStream() + ); + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $this->contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + + $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8') + ); + $paramEncoder = new Swift_Encoder_Rfc2231Encoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8') + ); + $this->emailValidator = new EmailValidator(); + $this->idGenerator = new Swift_Mime_IdGenerator('example.com'); + $this->headers = new Swift_Mime_SimpleHeaderSet( + new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $this->emailValidator) + ); + } + + public function testDispositionIsSetInHeader() + { + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setDisposition('inline'); + $this->assertEquals( + 'Content-Type: application/pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: inline'."\r\n", + $attachment->toString() + ); + } + + public function testDispositionIsAttachmentByDefault() + { + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $this->assertEquals( + 'Content-Type: application/pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment'."\r\n", + $attachment->toString() + ); + } + + public function testFilenameIsSetInHeader() + { + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $this->assertEquals( + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf'."\r\n", + $attachment->toString() + ); + } + + public function testSizeIsSetInHeader() + { + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setSize(12340); + $this->assertEquals( + 'Content-Type: application/pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; size=12340'."\r\n", + $attachment->toString() + ); + } + + public function testMultipleParametersInHeader() + { + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setSize(12340); + $this->assertEquals( + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf; size=12340'."\r\n", + $attachment->toString() + ); + } + + public function testEndToEnd() + { + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setSize(12340); + $attachment->setBody('abcd'); + $this->assertEquals( + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf; size=12340'."\r\n". + "\r\n". + base64_encode('abcd'), + $attachment->toString() + ); + } + + protected function createAttachment() + { + $entity = new Swift_Mime_Attachment( + $this->headers, + $this->contentEncoder, + $this->cache, + $this->idGenerator + ); + + return $entity; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php new file mode 100644 index 0000000..a87b30e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php @@ -0,0 +1,56 @@ +samplesDir = realpath(__DIR__.'/../../../../_samples/charsets'); + $this->encoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + } + + public function testEncodingAndDecodingSamples() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write($text); + + $is = new Swift_ByteStream_ArrayByteStream(); + + $this->encoder->encodeByteStream($os, $is); + + $encoded = ''; + while (false !== $bytes = $is->read(8192)) { + $encoded .= $bytes; + } + + $this->assertEquals( + base64_decode($encoded), $text, + '%s: Encoded string should decode back to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php new file mode 100644 index 0000000..bf0a04e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php @@ -0,0 +1,88 @@ +samplesDir = realpath(__DIR__.'/../../../../_samples/charsets'); + $this->encoder = new Swift_Mime_ContentEncoder_NativeQpContentEncoder(); + } + + public function testEncodingAndDecodingSamples() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write($text); + + $is = new Swift_ByteStream_ArrayByteStream(); + $this->encoder->encodeByteStream($os, $is); + + $encoded = ''; + while (false !== $bytes = $is->read(8192)) { + $encoded .= $bytes; + } + + $this->assertEquals( + quoted_printable_decode($encoded), + // CR and LF are converted to CRLF + preg_replace('~\r(?!\n)|(?createEncoderFromContainer(); + $this->assertSame('=C3=A4=C3=B6=C3=BC=C3=9F', $encoder->encodeString('äöüß')); + } + + /** + * @expectedException \RuntimeException + */ + public function testCharsetChangeNotImplemented() + { + $this->encoder->charsetChanged('utf-8'); + $this->encoder->charsetChanged('charset'); + $this->encoder->encodeString('foo'); + } + + public function testGetName() + { + $this->assertSame('quoted-printable', $this->encoder->getName()); + } + + private function createEncoderFromContainer() + { + return Swift_DependencyContainer::getInstance() + ->lookup('mime.nativeqpcontentencoder') + ; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php new file mode 100644 index 0000000..544873a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php @@ -0,0 +1,88 @@ +samplesDir = realpath(__DIR__.'/../../../../_samples/charsets'); + $this->encoder = new Swift_Mime_ContentEncoder_PlainContentEncoder('8bit'); + } + + public function testEncodingAndDecodingSamplesString() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + $encodedText = $this->encoder->encodeString($text); + + $this->assertEquals( + $encodedText, $text, + '%s: Encoded string should be identical to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } + + public function testEncodingAndDecodingSamplesByteStream() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write($text); + + $is = new Swift_ByteStream_ArrayByteStream(); + + $this->encoder->encodeByteStream($os, $is); + + $encoded = ''; + while (false !== $bytes = $is->read(8192)) { + $encoded .= $bytes; + } + + $this->assertEquals( + $encoded, $text, + '%s: Encoded string should be identical to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php new file mode 100644 index 0000000..26d1a9b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php @@ -0,0 +1,160 @@ +samplesDir = realpath(__DIR__.'/../../../../_samples/charsets'); + $this->factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + } + + protected function tearDown() + { + Swift_Preferences::getInstance()->setQPDotEscape(false); + } + + public function testEncodingAndDecodingSamples() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $encoding = $encodingDir; + $charStream = new Swift_CharacterStream_NgCharacterStream( + $this->factory, $encoding); + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write($text); + + $is = new Swift_ByteStream_ArrayByteStream(); + $encoder->encodeByteStream($os, $is); + + $encoded = ''; + while (false !== $bytes = $is->read(8192)) { + $encoded .= $bytes; + } + + $this->assertEquals( + quoted_printable_decode($encoded), $text, + '%s: Encoded string should decode back to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } + + public function testEncodingAndDecodingSamplesFromDiConfiguredInstance() + { + $sampleFp = opendir($this->samplesDir); + while (false !== $encodingDir = readdir($sampleFp)) { + if ('.' == substr($encodingDir, 0, 1)) { + continue; + } + + $encoding = $encodingDir; + $encoder = $this->createEncoderFromContainer(); + + $sampleDir = $this->samplesDir.'/'.$encodingDir; + + if (is_dir($sampleDir)) { + $fileFp = opendir($sampleDir); + while (false !== $sampleFile = readdir($fileFp)) { + if ('.' == substr($sampleFile, 0, 1)) { + continue; + } + + $text = file_get_contents($sampleDir.'/'.$sampleFile); + + $os = new Swift_ByteStream_ArrayByteStream(); + $os->write($text); + + $is = new Swift_ByteStream_ArrayByteStream(); + $encoder->encodeByteStream($os, $is); + + $encoded = ''; + while (false !== $bytes = $is->read(8192)) { + $encoded .= $bytes; + } + + $this->assertEquals( + str_replace("\r\n", "\n", quoted_printable_decode($encoded)), str_replace("\r\n", "\n", $text), + '%s: Encoded string should decode back to original string for sample '. + $sampleDir.'/'.$sampleFile + ); + } + closedir($fileFp); + } + } + closedir($sampleFp); + } + + public function testEncodingLFTextWithDiConfiguredInstance() + { + $encoder = $this->createEncoderFromContainer(); + $this->assertEquals("a\r\nb\r\nc", $encoder->encodeString("a\nb\nc")); + } + + public function testEncodingCRTextWithDiConfiguredInstance() + { + $encoder = $this->createEncoderFromContainer(); + $this->assertEquals("a\r\nb\r\nc", $encoder->encodeString("a\rb\rc")); + } + + public function testEncodingLFCRTextWithDiConfiguredInstance() + { + $encoder = $this->createEncoderFromContainer(); + $this->assertEquals("a\r\n\r\nb\r\n\r\nc", $encoder->encodeString("a\n\rb\n\rc")); + } + + public function testEncodingCRLFTextWithDiConfiguredInstance() + { + $encoder = $this->createEncoderFromContainer(); + $this->assertEquals("a\r\nb\r\nc", $encoder->encodeString("a\r\nb\r\nc")); + } + + public function testEncodingDotStuffingWithDiConfiguredInstance() + { + // Enable DotEscaping + Swift_Preferences::getInstance()->setQPDotEscape(true); + $encoder = $this->createEncoderFromContainer(); + $this->assertEquals("a=2E\r\n=2E\r\n=2Eb\r\nc", $encoder->encodeString("a.\r\n.\r\n.b\r\nc")); + // Return to default + Swift_Preferences::getInstance()->setQPDotEscape(false); + $encoder = $this->createEncoderFromContainer(); + $this->assertEquals("a.\r\n.\r\n.b\r\nc", $encoder->encodeString("a.\r\n.\r\n.b\r\nc")); + } + + public function testDotStuffingEncodingAndDecodingSamplesFromDiConfiguredInstance() + { + // Enable DotEscaping + Swift_Preferences::getInstance()->setQPDotEscape(true); + $this->testEncodingAndDecodingSamplesFromDiConfiguredInstance(); + } + + private function createEncoderFromContainer() + { + return Swift_DependencyContainer::getInstance() + ->lookup('mime.qpcontentencoder') + ; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php new file mode 100644 index 0000000..5603a67 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php @@ -0,0 +1,139 @@ +cache = new Swift_KeyCache_ArrayKeyCache( + new Swift_KeyCache_SimpleKeyCacheInputStream() + ); + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $this->contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + + $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8') + ); + $paramEncoder = new Swift_Encoder_Rfc2231Encoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8') + ); + $this->emailValidator = new EmailValidator(); + $this->idGenerator = new Swift_Mime_IdGenerator('example.com'); + $this->headers = new Swift_Mime_SimpleHeaderSet( + new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $this->emailValidator) + ); + } + + public function testContentIdIsSetInHeader() + { + $file = $this->createEmbeddedFile(); + $file->setContentType('application/pdf'); + $file->setId('foo@bar'); + $this->assertEquals( + 'Content-Type: application/pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: '."\r\n". + 'Content-Disposition: inline'."\r\n", + $file->toString() + ); + } + + public function testDispositionIsSetInHeader() + { + $file = $this->createEmbeddedFile(); + $id = $file->getId(); + $file->setContentType('application/pdf'); + $file->setDisposition('attachment'); + $this->assertEquals( + 'Content-Type: application/pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$id.'>'."\r\n". + 'Content-Disposition: attachment'."\r\n", + $file->toString() + ); + } + + public function testFilenameIsSetInHeader() + { + $file = $this->createEmbeddedFile(); + $id = $file->getId(); + $file->setContentType('application/pdf'); + $file->setFilename('foo.pdf'); + $this->assertEquals( + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$id.'>'."\r\n". + 'Content-Disposition: inline; filename=foo.pdf'."\r\n", + $file->toString() + ); + } + + public function testSizeIsSetInHeader() + { + $file = $this->createEmbeddedFile(); + $id = $file->getId(); + $file->setContentType('application/pdf'); + $file->setSize(12340); + $this->assertEquals( + 'Content-Type: application/pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$id.'>'."\r\n". + 'Content-Disposition: inline; size=12340'."\r\n", + $file->toString() + ); + } + + public function testMultipleParametersInHeader() + { + $file = $this->createEmbeddedFile(); + $id = $file->getId(); + $file->setContentType('application/pdf'); + $file->setFilename('foo.pdf'); + $file->setSize(12340); + + $this->assertEquals( + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$id.'>'."\r\n". + 'Content-Disposition: inline; filename=foo.pdf; size=12340'."\r\n", + $file->toString() + ); + } + + public function testEndToEnd() + { + $file = $this->createEmbeddedFile(); + $id = $file->getId(); + $file->setContentType('application/pdf'); + $file->setFilename('foo.pdf'); + $file->setSize(12340); + $file->setBody('abcd'); + $this->assertEquals( + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$id.'>'."\r\n". + 'Content-Disposition: inline; filename=foo.pdf; size=12340'."\r\n". + "\r\n". + base64_encode('abcd'), + $file->toString() + ); + } + + protected function createEmbeddedFile() + { + $entity = new Swift_Mime_EmbeddedFile( + $this->headers, + $this->contentEncoder, + $this->cache, + $this->idGenerator + ); + + return $entity; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php new file mode 100644 index 0000000..1379513 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php @@ -0,0 +1,32 @@ +encoder = new Swift_Mime_HeaderEncoder_Base64HeaderEncoder(); + } + + public function testEncodingJIS() + { + if (function_exists('mb_convert_encoding')) { + // base64_encode and split cannot handle long JIS text to fold + $subject = 'é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„é•·ã„ä»¶å'; + + $encodedWrapperLength = strlen('=?iso-2022-jp?'.$this->encoder->getName().'??='); + + $old = mb_internal_encoding(); + mb_internal_encoding('utf-8'); + $newstring = mb_encode_mimeheader($subject, 'iso-2022-jp', 'B', "\r\n"); + mb_internal_encoding($old); + + $encoded = $this->encoder->encodeString($subject, 0, 75 - $encodedWrapperLength, 'iso-2022-jp'); + $this->assertEquals( + $encoded, $newstring, + 'Encoded string should decode back to original string for sample ' + ); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php new file mode 100644 index 0000000..5a12daa --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php @@ -0,0 +1,130 @@ +cache = new Swift_KeyCache_ArrayKeyCache( + new Swift_KeyCache_SimpleKeyCacheInputStream() + ); + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $this->contentEncoder = new Swift_Mime_ContentEncoder_QpContentEncoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'), + new Swift_StreamFilters_ByteArrayReplacementFilter( + [[0x0D, 0x0A], [0x0D], [0x0A]], + [[0x0A], [0x0A], [0x0D, 0x0A]] + ) + ); + + $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8') + ); + $paramEncoder = new Swift_Encoder_Rfc2231Encoder( + new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8') + ); + $this->emailValidator = new EmailValidator(); + $this->idGenerator = new Swift_Mime_IdGenerator('example.com'); + $this->headers = new Swift_Mime_SimpleHeaderSet( + new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $this->emailValidator) + ); + } + + public function testCharsetIsSetInHeader() + { + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setCharset('utf-8'); + $part->setBody('foobar'); + $this->assertEquals( + 'Content-Type: text/plain; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foobar', + $part->toString() + ); + } + + public function testFormatIsSetInHeaders() + { + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setFormat('flowed'); + $part->setBody('> foobar'); + $this->assertEquals( + 'Content-Type: text/plain; format=flowed'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + '> foobar', + $part->toString() + ); + } + + public function testDelSpIsSetInHeaders() + { + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setDelSp(true); + $part->setBody('foobar'); + $this->assertEquals( + 'Content-Type: text/plain; delsp=yes'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foobar', + $part->toString() + ); + } + + public function testAll3ParamsInHeaders() + { + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setCharset('utf-8'); + $part->setFormat('fixed'); + $part->setDelSp(true); + $part->setBody('foobar'); + $this->assertEquals( + 'Content-Type: text/plain; charset=utf-8; format=fixed; delsp=yes'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foobar', + $part->toString() + ); + } + + public function testBodyIsCanonicalized() + { + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setCharset('utf-8'); + $part->setBody("foobar\r\rtest\ning\r"); + $this->assertEquals( + 'Content-Type: text/plain; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + "foobar\r\n". + "\r\n". + "test\r\n". + "ing\r\n", + $part->toString() + ); + } + + protected function createMimePart() + { + $entity = new Swift_Mime_MimePart( + $this->headers, + $this->contentEncoder, + $this->cache, + $this->idGenerator + ); + + return $entity; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php new file mode 100644 index 0000000..1d981e7 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php @@ -0,0 +1,1250 @@ +setCharset(null); //TODO: Test with the charset defined + } + + public function testBasicHeaders() + { + /* -- RFC 2822, 3.6. + */ + + $message = $this->createMessage(); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString(), + '%s: Only required headers, and non-empty headers should be displayed' + ); + } + + public function testSubjectIsDisplayedIfSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testDateCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $id = $message->getId(); + $date = new DateTimeImmutable(); + $message->setDate($date); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testMessageIdCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setId('foo@bar'); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: '."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testContentTypeCanBeChanged() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setContentType('text/html'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/html'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testCharsetCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setContentType('text/html'); + $message->setCharset('iso-8859-1'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/html; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testFormatCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFormat('flowed'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain; format=flowed'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testEncoderCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setContentType('text/html'); + $message->setEncoder( + new Swift_Mime_ContentEncoder_PlainContentEncoder('7bit') + ); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/html'."\r\n". + 'Content-Transfer-Encoding: 7bit'."\r\n", + $message->toString() + ); + } + + public function testFromAddressCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom('chris.corbyn@swiftmailer.org'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: chris.corbyn@swiftmailer.org'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testFromAddressCanBeSetWithName() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris Corbyn']); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testMultipleFromAddressesCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org', + ]); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn , mark@swiftmailer.org'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testReturnPathAddressCanBeSet() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testEmptyReturnPathHeaderCanBeUsed() + { + $message = $this->createMessage(); + $message->setReturnPath(''); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Return-Path: <>'."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testSenderCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setSender('chris.corbyn@swiftmailer.org'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Sender: chris.corbyn@swiftmailer.org'."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testSenderCanBeSetWithName() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setSender(['chris.corbyn@swiftmailer.org' => 'Chris']); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Sender: Chris '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testReplyToCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo(['chris@w3style.co.uk' => 'Myself']); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testMultipleReplyAddressCanBeUsed() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testToAddressCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $message->setTo('mark@swiftmailer.org'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'To: mark@swiftmailer.org'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testMultipleToAddressesCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $message->setTo([ + 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn', + ]); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'To: mark@swiftmailer.org, Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testCcAddressCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $message->setTo([ + 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn', + ]); + $message->setCc('john@some-site.com'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'To: mark@swiftmailer.org, Chris Corbyn '."\r\n". + 'Cc: john@some-site.com'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testMultipleCcAddressesCanBeSet() + { + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $message->setTo([ + 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn', + ]); + $message->setCc([ + 'john@some-site.com' => 'John West', + 'fred@another-site.co.uk' => 'Big Fred', + ]); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'To: mark@swiftmailer.org, Chris Corbyn '."\r\n". + 'Cc: John West , Big Fred '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testBccAddressCanBeSet() + { + //Obviously Transports need to setBcc(array()) and send to each Bcc recipient + // separately in accordance with RFC 2822/2821 + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $message->setTo([ + 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn', + ]); + $message->setCc([ + 'john@some-site.com' => 'John West', + 'fred@another-site.co.uk' => 'Big Fred', + ]); + $message->setBcc('x@alphabet.tld'); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'To: mark@swiftmailer.org, Chris Corbyn '."\r\n". + 'Cc: John West , Big Fred '."\r\n". + 'Bcc: x@alphabet.tld'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testMultipleBccAddressesCanBeSet() + { + //Obviously Transports need to setBcc(array()) and send to each Bcc recipient + // separately in accordance with RFC 2822/2821 + $message = $this->createMessage(); + $message->setSubject('just a test subject'); + $message->setFrom(['chris.corbyn@swiftmailer.org' => 'Chris']); + $message->setReplyTo([ + 'chris@w3style.co.uk' => 'Myself', + 'my.other@address.com' => 'Me', + ]); + $message->setTo([ + 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn', + ]); + $message->setCc([ + 'john@some-site.com' => 'John West', + 'fred@another-site.co.uk' => 'Big Fred', + ]); + $message->setBcc(['x@alphabet.tld', 'a@alphabet.tld' => 'A']); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris '."\r\n". + 'Reply-To: Myself , Me '."\r\n". + 'To: mark@swiftmailer.org, Chris Corbyn '."\r\n". + 'Cc: John West , Big Fred '."\r\n". + 'Bcc: x@alphabet.tld, A '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString() + ); + } + + public function testStringBodyIsAppended() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $message->setBody( + 'just a test body'."\r\n". + 'with a new line' + ); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'just a test body'."\r\n". + 'with a new line', + $message->toString() + ); + } + + public function testStringBodyIsEncoded() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $message->setBody( + 'Just s'.pack('C*', 0xC2, 0x01, 0x01).'me multi-'."\r\n". + 'line message!' + ); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'Just s=C2=01=01me multi-'."\r\n". + 'line message!', + $message->toString() + ); + } + + public function testChildrenCanBeAttached() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = $message->getDate(); + $boundary = $message->getBoundary(); + + $part1 = $this->createMimePart(); + $part1->setContentType('text/plain'); + $part1->setCharset('iso-8859-1'); + $part1->setBody('foo'); + + $message->attach($part1); + + $part2 = $this->createMimePart(); + $part2->setContentType('text/html'); + $part2->setCharset('iso-8859-1'); + $part2->setBody('test foo'); + + $message->attach($part2); + + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'test foo'. + "\r\n\r\n". + '--'.$boundary.'--'."\r\n", + $message->toString() + ); + } + + public function testAttachmentsBeingAttached() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setCharset('iso-8859-1'); + $part->setBody('foo'); + + $message->attach($part); + + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setBody(''); + + $message->attach($attachment); + + $this->assertRegExp( + '~^'. + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/mixed;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: text/plain; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--\\1--'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $message->toString() + ); + } + + public function testAttachmentsAndEmbeddedFilesBeingAttached() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setCharset('iso-8859-1'); + $part->setBody('foo'); + + $message->attach($part); + + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setBody(''); + + $message->attach($attachment); + + $file = $this->createEmbeddedFile(); + $file->setContentType('image/jpeg'); + $file->setFilename('myimage.jpg'); + $file->setBody(''); + + $message->attach($file); + + $cid = $file->getId(); + + $this->assertRegExp( + '~^'. + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/mixed;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: text/plain; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: multipart/related;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\2'."\r\n". + 'Content-Type: image/jpeg; name=myimage.jpg'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$cid.'>'."\r\n". + 'Content-Disposition: inline; filename=myimage.jpg'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--\\2--'."\r\n". + "\r\n\r\n". + '--\\1--'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $message->toString() + ); + } + + public function testComplexEmbeddingOfContent() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setBody(''); + + $message->attach($attachment); + + $file = $this->createEmbeddedFile(); + $file->setContentType('image/jpeg'); + $file->setFilename('myimage.jpg'); + $file->setBody(''); + + $part = $this->createMimePart(); + $part->setContentType('text/html'); + $part->setCharset('iso-8859-1'); + $part->setBody('foo '); + + $message->attach($part); + + $cid = $file->getId(); + + $this->assertRegExp( + '~^'. + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/mixed;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: multipart/related;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: text/html; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo './/=3D is just = in QP + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: image/jpeg; name=myimage.jpg'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$cid.'>'."\r\n". + 'Content-Disposition: inline; filename=myimage.jpg'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--\\1--'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $message->toString() + ); + } + + public function testAttachingAndDetachingContent() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + + $part = $this->createMimePart(); + $part->setContentType('text/plain'); + $part->setCharset('iso-8859-1'); + $part->setBody('foo'); + + $message->attach($part); + + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setBody(''); + + $message->attach($attachment); + + $file = $this->createEmbeddedFile(); + $file->setContentType('image/jpeg'); + $file->setFilename('myimage.jpg'); + $file->setBody(''); + + $message->attach($file); + + $cid = $file->getId(); + + $message->detach($attachment); + + $this->assertRegExp( + '~^'. + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: multipart/related;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: image/jpeg; name=myimage.jpg'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$cid.'>'."\r\n". + 'Content-Disposition: inline; filename=myimage.jpg'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--\\1--'."\r\n". + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $message->toString(), + '%s: Attachment should have been detached' + ); + } + + public function testBoundaryDoesNotAppearAfterAllPartsAreDetached() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = $message->getDate(); + $boundary = $message->getBoundary(); + + $part1 = $this->createMimePart(); + $part1->setContentType('text/plain'); + $part1->setCharset('iso-8859-1'); + $part1->setBody('foo'); + + $message->attach($part1); + + $part2 = $this->createMimePart(); + $part2->setContentType('text/html'); + $part2->setCharset('iso-8859-1'); + $part2->setBody('test foo'); + + $message->attach($part2); + + $message->detach($part1); + $message->detach($part2); + + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n", + $message->toString(), + '%s: Message should be restored to orignal state after parts are detached' + ); + } + + public function testCharsetFormatOrDelSpAreNotShownWhenBoundaryIsSet() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $message->setCharset('utf-8'); + $message->setFormat('flowed'); + $message->setDelSp(true); + + $id = $message->getId(); + $date = $message->getDate(); + $boundary = $message->getBoundary(); + + $part1 = $this->createMimePart(); + $part1->setContentType('text/plain'); + $part1->setCharset('iso-8859-1'); + $part1->setBody('foo'); + + $message->attach($part1); + + $part2 = $this->createMimePart(); + $part2->setContentType('text/html'); + $part2->setCharset('iso-8859-1'); + $part2->setBody('test foo'); + + $message->attach($part2); + + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'test foo'. + "\r\n\r\n". + '--'.$boundary.'--'."\r\n", + $message->toString() + ); + } + + public function testBodyCanBeSetWithAttachments() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $message->setContentType('text/html'); + $message->setCharset('iso-8859-1'); + $message->setBody('foo'); + + $id = $message->getId(); + $date = $message->getDate()->format('r'); + $boundary = $message->getBoundary(); + + $attachment = $this->createAttachment(); + $attachment->setContentType('application/pdf'); + $attachment->setFilename('foo.pdf'); + $attachment->setBody(''); + + $message->attach($attachment); + + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/mixed;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=iso-8859-1'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: application/pdf; name=foo.pdf'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=foo.pdf'."\r\n". + "\r\n". + base64_encode(''). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n", + $message->toString() + ); + } + + public function testHtmlPartAlwaysAppearsLast() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + + $id = $message->getId(); + $date = $message->getDate()->format('r'); + $boundary = $message->getBoundary(); + + $part1 = $this->createMimePart(); + $part1->setContentType('text/html'); + $part1->setBody('foo'); + + $part2 = $this->createMimePart(); + $part2->setContentType('text/plain'); + $part2->setBody('bar'); + + $message->attach($part1); + $message->attach($part2); + + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'bar'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary.'--'."\r\n", + $message->toString() + ); + } + + public function testBodyBecomesPartIfOtherPartsAttached() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $message->setContentType('text/html'); + $message->setBody('foo'); + + $id = $message->getId(); + $date = $message->getDate()->format('r'); + $boundary = $message->getBoundary(); + + $part2 = $this->createMimePart(); + $part2->setContentType('text/plain'); + $part2->setBody('bar'); + + $message->attach($part2); + + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'bar'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'foo'. + "\r\n\r\n". + '--'.$boundary.'--'."\r\n", + $message->toString() + ); + } + + public function testBodyIsCanonicalized() + { + $message = $this->createMessage(); + $message->setReturnPath('chris@w3style.co.uk'); + $message->setSubject('just a test subject'); + $message->setFrom([ + 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ]); + $message->setBody( + 'just a test body'."\n". + 'with a new line' + ); + $id = $message->getId(); + $date = $message->getDate(); + $this->assertEquals( + 'Return-Path: '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date->format('r')."\r\n". + 'Subject: just a test subject'."\r\n". + 'From: Chris Corbyn '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: text/plain'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'just a test body'."\r\n". + 'with a new line', + $message->toString() + ); + } + + protected function createMessage() + { + return new Swift_Message(); + } + + protected function createMimePart() + { + return new Swift_MimePart(); + } + + protected function createAttachment() + { + return new Swift_Attachment(); + } + + protected function createEmbeddedFile() + { + return new Swift_EmbeddedFile(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php new file mode 100644 index 0000000..581afc7 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php @@ -0,0 +1,15 @@ +register('properties.charset')->asValue(null); + + return new Swift_MimePart(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php new file mode 100644 index 0000000..9bc09f8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php @@ -0,0 +1,131 @@ +markTestSkipped( + 'Will fail on travis-ci if not skipped due to travis blocking '. + 'socket mailing tcp connections.' + ); + } + + $this->buffer = new Swift_Transport_StreamBuffer( + $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock() + ); + } + + public function testReadLine() + { + $this->initializeBuffer(); + + $line = $this->buffer->readLine(0); + $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line); + $seq = $this->buffer->write("QUIT\r\n"); + $this->assertTrue((bool) $seq); + $line = $this->buffer->readLine($seq); + $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line); + $this->buffer->terminate(); + } + + public function testWrite() + { + $this->initializeBuffer(); + + $line = $this->buffer->readLine(0); + $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line); + + $seq = $this->buffer->write("HELO foo\r\n"); + $this->assertTrue((bool) $seq); + $line = $this->buffer->readLine($seq); + $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line); + + $seq = $this->buffer->write("QUIT\r\n"); + $this->assertTrue((bool) $seq); + $line = $this->buffer->readLine($seq); + $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line); + $this->buffer->terminate(); + } + + public function testBindingOtherStreamsMirrorsWriteOperations() + { + $this->initializeBuffer(); + + $is1 = $this->createMockInputStream(); + $is2 = $this->createMockInputStream(); + + $is1->expects($this->at(0)) + ->method('write') + ->with('x'); + $is1->expects($this->at(1)) + ->method('write') + ->with('y'); + $is2->expects($this->at(0)) + ->method('write') + ->with('x'); + $is2->expects($this->at(1)) + ->method('write') + ->with('y'); + + $this->buffer->bind($is1); + $this->buffer->bind($is2); + + $this->buffer->write('x'); + $this->buffer->write('y'); + } + + public function testBindingOtherStreamsMirrorsFlushOperations() + { + $this->initializeBuffer(); + + $is1 = $this->createMockInputStream(); + $is2 = $this->createMockInputStream(); + + $is1->expects($this->once()) + ->method('flushBuffers'); + $is2->expects($this->once()) + ->method('flushBuffers'); + + $this->buffer->bind($is1); + $this->buffer->bind($is2); + + $this->buffer->flushBuffers(); + } + + public function testUnbindingStreamPreventsFurtherWrites() + { + $this->initializeBuffer(); + + $is1 = $this->createMockInputStream(); + $is2 = $this->createMockInputStream(); + + $is1->expects($this->at(0)) + ->method('write') + ->with('x'); + $is1->expects($this->at(1)) + ->method('write') + ->with('y'); + $is2->expects($this->once()) + ->method('write') + ->with('x'); + + $this->buffer->bind($is1); + $this->buffer->bind($is2); + + $this->buffer->write('x'); + + $this->buffer->unbind($is2); + + $this->buffer->write('y'); + } + + private function createMockInputStream() + { + return $this->getMockBuilder('Swift_InputByteStream')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php new file mode 100644 index 0000000..739a7ec --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php @@ -0,0 +1,33 @@ +markTestSkipped( + 'Cannot run test without an SMTP host to connect to (define '. + 'SWIFT_SMTP_HOST in tests/acceptance.conf.php if you wish to run this test)' + ); + } + parent::setUp(); + } + + protected function initializeBuffer() + { + $parts = explode(':', SWIFT_SMTP_HOST); + $host = $parts[0]; + $port = $parts[1] ?? 25; + + $this->buffer->initialize([ + 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET, + 'host' => $host, + 'port' => $port, + 'protocol' => 'tcp', + 'blocking' => 1, + 'timeout' => 15, + ]); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php new file mode 100644 index 0000000..34ef3cb --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php @@ -0,0 +1,26 @@ +markTestSkipped( + 'Cannot run test without a path to sendmail (define '. + 'SWIFT_SENDMAIL_PATH in tests/acceptance.conf.php if you wish to run this test)' + ); + } + + parent::setUp(); + } + + protected function initializeBuffer() + { + $this->buffer->initialize([ + 'type' => Swift_Transport_IoBuffer::TYPE_PROCESS, + 'command' => SWIFT_SENDMAIL_PATH.' -bs', + ]); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php new file mode 100644 index 0000000..67073f8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php @@ -0,0 +1,65 @@ +markTestSkipped( + 'Cannot run test without an SMTP host to connect to (define '. + 'SWIFT_SMTP_HOST in tests/acceptance.conf.php if you wish to run this test)' + ); + } + + $serverStarted = false; + for ($i = 0; $i < 5; ++$i) { + $this->randomHighPort = random_int(50000, 65000); + $this->server = stream_socket_server('tcp://127.0.0.1:'.$this->randomHighPort); + if ($this->server) { + $serverStarted = true; + } + } + + $this->buffer = new Swift_Transport_StreamBuffer( + $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock() + ); + } + + protected function initializeBuffer() + { + $host = '127.0.0.1'; + $port = $this->randomHighPort; + + $this->buffer->initialize([ + 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET, + 'host' => $host, + 'port' => $port, + 'protocol' => 'tcp', + 'blocking' => 1, + 'timeout' => 1, + ]); + } + + public function testTimeoutException() + { + $this->initializeBuffer(); + $e = null; + try { + $line = $this->buffer->readLine(0); + } catch (Exception $e) { + } + $this->assertInstanceOf('Swift_IoException', $e, 'IO Exception Not Thrown On Connection Timeout'); + $this->assertRegExp('/Connection to .* Timed Out/', $e->getMessage()); + } + + protected function tearDown() + { + if ($this->server) { + stream_socket_shutdown($this->server, STREAM_SHUT_RDWR); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php new file mode 100644 index 0000000..e3bee2c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php @@ -0,0 +1,40 @@ +markTestSkipped( + 'SSL is not configured for your system. It is not possible to run this test' + ); + } + if (!defined('SWIFT_SSL_HOST')) { + $this->markTestSkipped( + 'Cannot run test without an SSL enabled SMTP host to connect to (define '. + 'SWIFT_SSL_HOST in tests/acceptance.conf.php if you wish to run this test)' + ); + } + + parent::setUp(); + } + + protected function initializeBuffer() + { + $parts = explode(':', SWIFT_SSL_HOST); + $host = $parts[0]; + $port = $parts[1] ?? 25; + + $this->buffer->initialize([ + 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET, + 'host' => $host, + 'port' => $port, + 'protocol' => 'ssl', + 'blocking' => 1, + 'timeout' => 15, + ]); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php new file mode 100644 index 0000000..a5092a2 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php @@ -0,0 +1,39 @@ +markTestSkipped( + 'TLS is not configured for your system. It is not possible to run this test' + ); + } + if (!defined('SWIFT_TLS_HOST')) { + $this->markTestSkipped( + 'Cannot run test without a TLS enabled SMTP host to connect to (define '. + 'SWIFT_TLS_HOST in tests/acceptance.conf.php if you wish to run this test)' + ); + } + parent::setUp(); + } + + protected function initializeBuffer() + { + $parts = explode(':', SWIFT_TLS_HOST); + $host = $parts[0]; + $port = $parts[1] ?? 25; + + $this->buffer->initialize([ + 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET, + 'host' => $host, + 'port' => $port, + 'protocol' => 'tls', + 'blocking' => 1, + 'timeout' => 15, + ]); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bootstrap.php b/vendor/swiftmailer/swiftmailer/tests/bootstrap.php new file mode 100644 index 0000000..27091a2 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bootstrap.php @@ -0,0 +1,21 @@ +allowMockingNonExistentMethods(true); + +if (is_file(__DIR__.'/acceptance.conf.php')) { + require_once __DIR__.'/acceptance.conf.php'; +} +if (is_file(__DIR__.'/smoke.conf.php')) { + require_once __DIR__.'/smoke.conf.php'; +} +require_once __DIR__.'/StreamCollector.php'; +require_once __DIR__.'/IdenticalBinaryConstraint.php'; +require_once __DIR__.'/SwiftMailerTestCase.php'; +require_once __DIR__.'/SwiftMailerSmokeTestCase.php'; diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php new file mode 100644 index 0000000..e9085a9 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php @@ -0,0 +1,42 @@ + [ + 'email1@example.com', + 'email2@example.com', + 'email3@example.com', + 'email4@example.com', + 'email5@example.com', + ], + 'sub' => [ + '-name-' => [ + 'email1', + '"email2"', + 'email3\\', + 'email4', + 'email5', + ], + '-url-' => [ + 'http://google.com', + 'http://yahoo.com', + 'http://hotmail.com', + 'http://aol.com', + 'http://facebook.com', + ], + ], + ]; + $json = json_encode($complicated_header); + + $message = new Swift_Message(); + $headers = $message->getHeaders(); + $headers->addTextHeader('X-SMTPAPI', $json); + $header = $headers->get('X-SMTPAPI'); + + $this->assertEquals('Swift_Mime_Headers_UnstructuredHeader', get_class($header)); + $this->assertEquals($json, $header->getFieldBody()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php new file mode 100644 index 0000000..34aa136 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php @@ -0,0 +1,20 @@ +message = new Swift_Message(); + } + + public function testCallingGenerateIdChangesTheMessageId() + { + $currentId = $this->message->getId(); + $this->message->generateId(); + $newId = $this->message->getId(); + + $this->assertNotEquals($currentId, $newId); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php new file mode 100644 index 0000000..67c9551 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php @@ -0,0 +1,40 @@ +factory = new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $emailValidator); + } + + public function testMailboxHeaderEncoding() + { + $this->doTestHeaderIsFullyEncoded('email@example.org', 'Family Name, Name', ' "Family Name, Name" '); + $this->doTestHeaderIsFullyEncoded('email@example.org', 'Family Namé, Name', ' Family =?utf-8?Q?Nam=C3=A9=2C?= Name'); + $this->doTestHeaderIsFullyEncoded('email@example.org', 'Family Namé , Name', ' Family =?utf-8?Q?Nam=C3=A9_=2C?= Name'); + $this->doTestHeaderIsFullyEncoded('email@example.org', 'Family Namé ;Name', ' Family =?utf-8?Q?Nam=C3=A9_=3BName?= '); + } + + private function doTestHeaderIsFullyEncoded($email, $name, $expected) + { + $mailboxHeader = $this->factory->createMailboxHeader('To', [ + $email => $name, + ]); + + $headerBody = substr($mailboxHeader->toString(), 3, strlen($expected)); + + $this->assertEquals($expected, $headerBody); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php new file mode 100644 index 0000000..ddf6ca1 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php @@ -0,0 +1,25 @@ +attach(Swift_Attachment::fromPath('')); + } + + public function testNonEmptyFileNameAsAttachment() + { + $message = new Swift_Message(); + try { + $message->attach(Swift_Attachment::fromPath(__FILE__)); + } catch (Exception $e) { + $this->fail('Path should not be empty'); + } + $this->addToAssertionCount(1); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php new file mode 100644 index 0000000..0c8dd17 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php @@ -0,0 +1,75 @@ +setCharset('utf-8'); + } + + public function testEmbeddedFilesWithMultipartDataCreateMultipartRelatedContentAsAnAlternative() + { + $message = new Swift_Message(); + $message->setCharset('utf-8'); + $message->setSubject('test subject'); + $message->addPart('plain part', 'text/plain'); + + $image = new Swift_Image('', 'image.gif', 'image/gif'); + $cid = $message->embed($image); + + $message->setBody('', 'text/html'); + + $message->setTo(['user@domain.tld' => 'User']); + + $message->setFrom(['other@domain.tld' => 'Other']); + $message->setSender(['other@domain.tld' => 'Other']); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + $cidVal = $image->getId(); + + $this->assertRegExp( + '~^'. + 'Sender: Other '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: test subject'."\r\n". + 'From: Other '."\r\n". + 'To: User '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/plain; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'plain part'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: multipart/related;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: text/html; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + ''. + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: image/gif; name=image.gif'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.$cidVal.'>'."\r\n". + 'Content-Disposition: inline; filename=image.gif'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--\\1--'."\r\n". + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $message->toString() + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php new file mode 100644 index 0000000..66644e9 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php @@ -0,0 +1,73 @@ +setCharset('utf-8'); + } + + public function testHTMLPartAppearsLastEvenWhenAttachmentsAdded() + { + $message = new Swift_Message(); + $message->setCharset('utf-8'); + $message->setSubject('test subject'); + $message->addPart('plain part', 'text/plain'); + + $attachment = new Swift_Attachment('', 'image.gif', 'image/gif'); + $message->attach($attachment); + + $message->setBody('HTML part', 'text/html'); + + $message->setTo(['user@domain.tld' => 'User']); + + $message->setFrom(['other@domain.tld' => 'Other']); + $message->setSender(['other@domain.tld' => 'Other']); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + + $this->assertRegExp( + '~^'. + 'Sender: Other '."\r\n". + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: test subject'."\r\n". + 'From: Other '."\r\n". + 'To: User '."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/mixed;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: multipart/alternative;'."\r\n". + ' boundary="(.*?)"'."\r\n". + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: text/plain; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'plain part'. + "\r\n\r\n". + '--\\1'."\r\n". + 'Content-Type: text/html; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'HTML part'. + "\r\n\r\n". + '--\\1--'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: image/gif; name=image.gif'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename=image.gif'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $message->toString() + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php new file mode 100644 index 0000000..472c805 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php @@ -0,0 +1,192 @@ +attFileName = 'data.txt'; + $this->attFileType = 'text/plain'; + $this->attFile = __DIR__.'/../../_samples/files/data.txt'; + Swift_Preferences::getInstance()->setCharset('utf-8'); + } + + public function testWritingMessageToByteStreamProducesCorrectStructure() + { + $message = new Swift_Message(); + $message->setSubject('test subject'); + $message->setTo('user@domain.tld'); + $message->setCc('other@domain.tld'); + $message->setFrom('user@domain.tld'); + + $image = new Swift_Image('', 'image.gif', 'image/gif'); + + $cid = $message->embed($image); + $message->setBody('HTML part', 'text/html'); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + $imgId = $image->getId(); + + $stream = new Swift_ByteStream_ArrayByteStream(); + + $message->toByteStream($stream); + + $this->assertPatternInStream( + '~^'. + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: test subject'."\r\n". + 'From: user@domain.tld'."\r\n". + 'To: user@domain.tld'."\r\n". + 'Cc: other@domain.tld'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/related;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'HTML part'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: image/gif; name=image.gif'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.preg_quote($imgId, '~').'>'."\r\n". + 'Content-Disposition: inline; filename=image.gif'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D', + $stream + ); + } + + public function testWritingMessageToByteStreamTwiceProducesCorrectStructure() + { + $message = new Swift_Message(); + $message->setSubject('test subject'); + $message->setTo('user@domain.tld'); + $message->setCc('other@domain.tld'); + $message->setFrom('user@domain.tld'); + + $image = new Swift_Image('', 'image.gif', 'image/gif'); + + $cid = $message->embed($image); + $message->setBody('HTML part', 'text/html'); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + $imgId = $image->getId(); + + $pattern = '~^'. + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: test subject'."\r\n". + 'From: user@domain.tld'."\r\n". + 'To: user@domain.tld'."\r\n". + 'Cc: other@domain.tld'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/related;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'HTML part'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: image/gif; name=image.gif'."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-ID: <'.preg_quote($imgId, '~').'>'."\r\n". + 'Content-Disposition: inline; filename=image.gif'."\r\n". + "\r\n". + preg_quote(base64_encode(''), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D' + ; + + $streamA = new Swift_ByteStream_ArrayByteStream(); + $streamB = new Swift_ByteStream_ArrayByteStream(); + + $message->toByteStream($streamA); + $message->toByteStream($streamB); + + $this->assertPatternInStream($pattern, $streamA); + $this->assertPatternInStream($pattern, $streamB); + } + + public function testWritingMessageToByteStreamTwiceUsingAFileAttachment() + { + $message = new Swift_Message(); + $message->setSubject('test subject'); + $message->setTo('user@domain.tld'); + $message->setCc('other@domain.tld'); + $message->setFrom('user@domain.tld'); + + $attachment = Swift_Attachment::fromPath($this->attFile); + + $message->attach($attachment); + + $message->setBody('HTML part', 'text/html'); + + $id = $message->getId(); + $date = preg_quote($message->getDate()->format('r'), '~'); + $boundary = $message->getBoundary(); + + $streamA = new Swift_ByteStream_ArrayByteStream(); + $streamB = new Swift_ByteStream_ArrayByteStream(); + + $pattern = '~^'. + 'Message-ID: <'.$id.'>'."\r\n". + 'Date: '.$date."\r\n". + 'Subject: test subject'."\r\n". + 'From: user@domain.tld'."\r\n". + 'To: user@domain.tld'."\r\n". + 'Cc: other@domain.tld'."\r\n". + 'MIME-Version: 1.0'."\r\n". + 'Content-Type: multipart/mixed;'."\r\n". + ' boundary="'.$boundary.'"'."\r\n". + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: text/html; charset=utf-8'."\r\n". + 'Content-Transfer-Encoding: quoted-printable'."\r\n". + "\r\n". + 'HTML part'. + "\r\n\r\n". + '--'.$boundary."\r\n". + 'Content-Type: '.$this->attFileType.'; name='.$this->attFileName."\r\n". + 'Content-Transfer-Encoding: base64'."\r\n". + 'Content-Disposition: attachment; filename='.$this->attFileName."\r\n". + "\r\n". + preg_quote(base64_encode(file_get_contents($this->attFile)), '~'). + "\r\n\r\n". + '--'.$boundary.'--'."\r\n". + '$~D' + ; + + $message->toByteStream($streamA); + $message->toByteStream($streamB); + + $this->assertPatternInStream($pattern, $streamA); + $this->assertPatternInStream($pattern, $streamB); + } + + public function assertPatternInStream($pattern, $stream, $message = '%s') + { + $string = ''; + while (false !== $bytes = $stream->read(8192)) { + $string .= $bytes; + } + $this->assertRegExp($pattern, $string, $message); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php new file mode 100644 index 0000000..e4d1d7c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php @@ -0,0 +1,38 @@ +setTo('foo@bar.com'); + + $that = $this; + $messageValidation = function ($m) use ($that) { + //the getTo should return the same value as we put in + $that->assertEquals('foo@bar.com', key($m->getTo()), 'The message has changed after it was put to the memory queue'); + + return true; + }; + + $transport = m::mock('Swift_Transport'); + $transport->shouldReceive('isStarted')->andReturn(true); + $transport->shouldReceive('send') + ->with(m::on($messageValidation), $failedRecipients) + ->andReturn(1); + + $memorySpool = new Swift_MemorySpool(); + $memorySpool->queueMessage($message); + + /* + * The message is queued in memory. + * Lets change the message + */ + $message->setTo('other@value.com'); + + $memorySpool->flushQueue($transport, $failedRecipients); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php new file mode 100644 index 0000000..fdeb89b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php @@ -0,0 +1,110 @@ +attachmentFile = sys_get_temp_dir().'/attach.rand.bin'; + file_put_contents($this->attachmentFile, ''); + + $this->outputFile = sys_get_temp_dir().'/attach.out.bin'; + file_put_contents($this->outputFile, ''); + } + + protected function tearDown() + { + unlink($this->attachmentFile); + unlink($this->outputFile); + } + + public function testAttachmentsDoNotGetTruncatedUsingToByteStream() + { + //Run 100 times with 10KB attachments + for ($i = 0; $i < 10; ++$i) { + $message = $this->createMessageWithRandomAttachment( + 10000, $this->attachmentFile + ); + + file_put_contents($this->outputFile, ''); + $message->toByteStream( + new Swift_ByteStream_FileByteStream($this->outputFile, true) + ); + + $emailSource = file_get_contents($this->outputFile); + + $this->assertAttachmentFromSourceMatches( + file_get_contents($this->attachmentFile), + $emailSource + ); + } + } + + public function testAttachmentsDoNotGetTruncatedUsingToString() + { + //Run 100 times with 10KB attachments + for ($i = 0; $i < 10; ++$i) { + $message = $this->createMessageWithRandomAttachment( + 10000, $this->attachmentFile + ); + + $emailSource = $message->toString(); + + $this->assertAttachmentFromSourceMatches( + file_get_contents($this->attachmentFile), + $emailSource + ); + } + } + + public function assertAttachmentFromSourceMatches($attachmentData, $source) + { + $encHeader = 'Content-Transfer-Encoding: base64'; + $base64declaration = strpos($source, $encHeader); + + $attachmentDataStart = strpos($source, "\r\n\r\n", $base64declaration); + $attachmentDataEnd = strpos($source, "\r\n--", $attachmentDataStart); + + if (false === $attachmentDataEnd) { + $attachmentBase64 = trim(substr($source, $attachmentDataStart)); + } else { + $attachmentBase64 = trim(substr( + $source, $attachmentDataStart, + $attachmentDataEnd - $attachmentDataStart + )); + } + + $this->assertIdenticalBinary($attachmentData, base64_decode($attachmentBase64)); + } + + private function fillFileWithRandomBytes($byteCount, $file) + { + // I was going to use dd with if=/dev/random but this way seems more + // cross platform even if a hella expensive!! + + file_put_contents($file, ''); + $fp = fopen($file, 'wb'); + for ($i = 0; $i < $byteCount; ++$i) { + $byteVal = random_int(0, 255); + fwrite($fp, pack('i', $byteVal)); + } + fclose($fp); + } + + private function createMessageWithRandomAttachment($size, $attachmentPath) + { + $this->fillFileWithRandomBytes($size, $attachmentPath); + + $message = (new Swift_Message()) + ->setSubject('test') + ->setBody('test') + ->setFrom('a@b.c') + ->setTo('d@e.f') + ->attach(Swift_Attachment::fromPath($attachmentPath)) + ; + + return $message; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php new file mode 100644 index 0000000..6b224f1 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php @@ -0,0 +1,38 @@ +setFrom('from@example.com') + ->setTo('to@example.com') + ->setSubject('test') + ; + $cid = $message->embed(Swift_Image::fromPath(__DIR__.'/../../_samples/files/swiftmailer.png')); + $message->setBody('', 'text/html'); + + $that = $this; + $messageValidation = function (Swift_Mime_SimpleMessage $message) use ($that) { + preg_match('/cid:(.*)"/', $message->toString(), $matches); + $cid = $matches[1]; + preg_match('/Content-ID: <(.*)>/', $message->toString(), $matches); + $contentId = $matches[1]; + $that->assertEquals($cid, $contentId, 'cid in body and mime part Content-ID differ'); + + return true; + }; + + $failedRecipients = []; + + $transport = m::mock('Swift_Transport'); + $transport->shouldReceive('isStarted')->andReturn(true); + $transport->shouldReceive('send')->with(m::on($messageValidation), $failedRecipients)->andReturn(1); + + $memorySpool = new Swift_MemorySpool(); + $memorySpool->queueMessage($message); + $memorySpool->flushQueue($transport, $failedRecipients); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php new file mode 100644 index 0000000..31036c6 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php @@ -0,0 +1,38 @@ +setCharset('utf-8'); + + $header->setNameAddresses([ + 'test@example.com' => $name, + ]); + + $this->assertSame('To: '.$expectedEncodedName." \r\n", $header->toString()); + } + + public function encodingDataProvider() + { + return [ + ['this is " a test ö', 'this is =?utf-8?Q?=22?= a test =?utf-8?Q?=C3=B6?='], + [': this is a test ö', '=?utf-8?Q?=3A?= this is a test =?utf-8?Q?=C3=B6?='], + ['( test ö', '=?utf-8?Q?=28?= test =?utf-8?Q?=C3=B6?='], + ['[ test ö', '=?utf-8?Q?=5B?= test =?utf-8?Q?=C3=B6?='], + ['@ test ö)', '=?utf-8?Q?=40?= test =?utf-8?Q?=C3=B6=29?='], + ]; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php new file mode 100644 index 0000000..3075f67 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php @@ -0,0 +1,20 @@ +message = new Swift_Message('test'); + } + + public function testCallingToStringAfterSettingNewBodyReflectsChanges() + { + $this->message->setBody('BODY1'); + $this->assertRegExp('/BODY1/', $this->message->toString()); + + $this->message->setBody('BODY2'); + $this->assertRegExp('/BODY2/', $this->message->toString()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php new file mode 100644 index 0000000..1db2035 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php @@ -0,0 +1,71 @@ +inputFile = sys_get_temp_dir().'/in.bin'; + file_put_contents($this->inputFile, ''); + + $this->outputFile = sys_get_temp_dir().'/out.bin'; + file_put_contents($this->outputFile, ''); + + $this->encoder = $this->createEncoder(); + } + + protected function tearDown() + { + unlink($this->inputFile); + unlink($this->outputFile); + } + + public function testBase64EncodedLineLengthNeverExceeds76CharactersEvenIfArgsDo() + { + $this->fillFileWithRandomBytes(1000, $this->inputFile); + + $os = $this->createStream($this->inputFile); + $is = $this->createStream($this->outputFile); + + $this->encoder->encodeByteStream($os, $is, 0, 80); //Exceeds 76 + + $this->assertMaxLineLength(76, $this->outputFile, + '%s: Line length should not exceed 76 characters' + ); + } + + public function assertMaxLineLength($length, $filePath, $message = '%s') + { + $lines = file($filePath); + foreach ($lines as $line) { + $this->assertTrue((strlen(trim($line)) <= 76), $message); + } + } + + private function fillFileWithRandomBytes($byteCount, $file) + { + // I was going to use dd with if=/dev/random but this way seems more + // cross platform even if a hella expensive!! + + file_put_contents($file, ''); + $fp = fopen($file, 'wb'); + for ($i = 0; $i < $byteCount; ++$i) { + $byteVal = random_int(0, 255); + fwrite($fp, pack('i', $byteVal)); + } + fclose($fp); + } + + private function createEncoder() + { + return new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + } + + private function createStream($file) + { + return new Swift_ByteStream_FileByteStream($file, true); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php new file mode 100644 index 0000000..eb58071 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php @@ -0,0 +1,18 @@ +read(100); + } catch (\Swift_IoException $exc) { + $fbs->read(100); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php b/vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php new file mode 100644 index 0000000..8a66039 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php @@ -0,0 +1,67 @@ +level = $level; + $this->string = $string; + $this->contentType = $contentType; + } + + public function getNestingLevel() + { + return $this->level; + } + + public function toString() + { + return $this->string; + } + + public function getContentType() + { + return $this->contentType; + } + + // These methods are here to account for the implemented interfaces + public function getId() + { + } + + public function getHeaders() + { + } + + public function getBody() + { + } + + public function setBody($body, $contentType = null) + { + } + + public function toByteStream(Swift_InputByteStream $is) + { + } + + public function charsetChanged($charset) + { + } + + public function encoderChanged(Swift_Mime_ContentEncoder $encoder) + { + } + + public function getChildren() + { + } + + public function setChildren(array $children, $compoundLevel = null) + { + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default b/vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default new file mode 100644 index 0000000..604d6de --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default @@ -0,0 +1,63 @@ +attFile = __DIR__.'/../../../_samples/files/textfile.zip'; + } + + public function testAttachmentSending() + { + $mailer = $this->getMailer(); + $message = (new Swift_Message()) + ->setSubject('[Swift Mailer] AttachmentSmokeTest') + ->setFrom([SWIFT_SMOKE_EMAIL_ADDRESS => 'Swift Mailer']) + ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS) + ->setBody('This message should contain an attached ZIP file (named "textfile.zip").'.PHP_EOL. + 'When unzipped, the archive should produce a text file which reads:'.PHP_EOL. + '"This is part of a Swift Mailer smoke test."' + ) + ->attach(Swift_Attachment::fromPath($this->attFile)) + ; + $this->assertEquals(1, $mailer->send($message), + '%s: The smoke test should send a single message' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php new file mode 100644 index 0000000..79915b3 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php @@ -0,0 +1,23 @@ +getMailer(); + $message = (new Swift_Message()) + ->setSubject('[Swift Mailer] BasicSmokeTest') + ->setFrom([SWIFT_SMOKE_EMAIL_ADDRESS => 'Swift Mailer']) + ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS) + ->setBody('One, two, three, four, five...'.PHP_EOL. + 'six, seven, eight...' + ) + ; + $this->assertEquals(1, $mailer->send($message), + '%s: The smoke test should send a single message' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php new file mode 100644 index 0000000..5ed6c33 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php @@ -0,0 +1,33 @@ +attFile = __DIR__.'/../../../_samples/files/textfile.zip'; + } + + public function testAttachmentSending() + { + $mailer = $this->getMailer(); + $message = (new Swift_Message('[Swift Mailer] HtmlWithAttachmentSmokeTest')) + ->setFrom([SWIFT_SMOKE_EMAIL_ADDRESS => 'Swift Mailer']) + ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS) + ->attach(Swift_Attachment::fromPath($this->attFile)) + ->setBody('

This HTML-formatted message should contain an attached ZIP file (named "textfile.zip").'.PHP_EOL. + 'When unzipped, the archive should produce a text file which reads:

'.PHP_EOL. + '

This is part of a Swift Mailer smoke test.

', 'text/html' + ) + ; + $this->assertEquals(1, $mailer->send($message), + '%s: The smoke test should send a single message' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php new file mode 100644 index 0000000..6dc715e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php @@ -0,0 +1,40 @@ +attFile = __DIR__.'/../../../_samples/files/textfile.zip'; + } + + public function testAttachmentSending() + { + $mailer = $this->getMailer(); + $message = (new Swift_Message()) + ->setCharset('utf-8') + ->setSubject('[Swift Mailer] InternationalSmokeTest (διεθνής)') + ->setFrom([SWIFT_SMOKE_EMAIL_ADDRESS => 'ΧÏιστοφοÏου (Swift Mailer)']) + ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS) + ->setBody('This message should contain an attached ZIP file (named "κείμενο, εδάφιο, θέμα.zip").'.PHP_EOL. + 'When unzipped, the archive should produce a text file which reads:'.PHP_EOL. + '"This is part of a Swift Mailer smoke test."'.PHP_EOL. + PHP_EOL. + 'Following is some arbitrary Greek text:'.PHP_EOL. + 'Δεν βÏέθηκαν λέξεις.' + ) + ->attach(Swift_Attachment::fromPath($this->attFile) + ->setContentType('application/zip') + ->setFilename('κείμενο, εδάφιο, θέμα.zip') + ) + ; + $this->assertEquals(1, $mailer->send($message), + '%s: The smoke test should send a single message' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php new file mode 100644 index 0000000..29fe390 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php @@ -0,0 +1,202 @@ +createArrayStream($input); + $output = []; + while (false !== $bytes = $bs->read(1)) { + $output[] = $bytes; + } + $this->assertEquals($input, $output, + '%s: Bytes read from stream should be the same as bytes in constructor' + ); + } + + public function testReadingMultipleBytesFromBaseInput() + { + $input = ['a', 'b', 'c', 'd']; + $bs = $this->createArrayStream($input); + $output = []; + while (false !== $bytes = $bs->read(2)) { + $output[] = $bytes; + } + $this->assertEquals(['ab', 'cd'], $output, + '%s: Bytes read from stream should be in pairs' + ); + } + + public function testReadingOddOffsetOnLastByte() + { + $input = ['a', 'b', 'c', 'd', 'e']; + $bs = $this->createArrayStream($input); + $output = []; + while (false !== $bytes = $bs->read(2)) { + $output[] = $bytes; + } + $this->assertEquals(['ab', 'cd', 'e'], $output, + '%s: Bytes read from stream should be in pairs except final read' + ); + } + + public function testSettingPointerPartway() + { + $input = ['a', 'b', 'c']; + $bs = $this->createArrayStream($input); + $bs->setReadPointer(1); + $this->assertEquals('b', $bs->read(1), + '%s: Byte should be second byte since pointer as at offset 1' + ); + } + + public function testResettingPointerAfterExhaustion() + { + $input = ['a', 'b', 'c']; + + $bs = $this->createArrayStream($input); + while (false !== $bs->read(1)); + + $bs->setReadPointer(0); + $this->assertEquals('a', $bs->read(1), + '%s: Byte should be first byte since pointer as at offset 0' + ); + } + + public function testPointerNeverSetsBelowZero() + { + $input = ['a', 'b', 'c']; + $bs = $this->createArrayStream($input); + + $bs->setReadPointer(-1); + $this->assertEquals('a', $bs->read(1), + '%s: Byte should be first byte since pointer should be at offset 0' + ); + } + + public function testPointerNeverSetsAboveStackSize() + { + $input = ['a', 'b', 'c']; + $bs = $this->createArrayStream($input); + + $bs->setReadPointer(3); + $this->assertFalse($bs->read(1), + '%s: Stream should be at end and thus return false' + ); + } + + public function testBytesCanBeWrittenToStream() + { + $input = ['a', 'b', 'c']; + $bs = $this->createArrayStream($input); + + $bs->write('de'); + + $output = []; + while (false !== $bytes = $bs->read(1)) { + $output[] = $bytes; + } + $this->assertEquals(['a', 'b', 'c', 'd', 'e'], $output, + '%s: Bytes read from stream should be from initial stack + written' + ); + } + + public function testContentsCanBeFlushed() + { + $input = ['a', 'b', 'c']; + $bs = $this->createArrayStream($input); + + $bs->flushBuffers(); + + $this->assertFalse($bs->read(1), + '%s: Contents have been flushed so read() should return false' + ); + } + + public function testConstructorCanTakeStringArgument() + { + $bs = $this->createArrayStream('abc'); + $output = []; + while (false !== $bytes = $bs->read(1)) { + $output[] = $bytes; + } + $this->assertEquals(['a', 'b', 'c'], $output, + '%s: Bytes read from stream should be the same as bytes in constructor' + ); + } + + public function testBindingOtherStreamsMirrorsWriteOperations() + { + $bs = $this->createArrayStream(''); + $is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); + $is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); + + $is1->expects($this->at(0)) + ->method('write') + ->with('x'); + $is1->expects($this->at(1)) + ->method('write') + ->with('y'); + $is2->expects($this->at(0)) + ->method('write') + ->with('x'); + $is2->expects($this->at(1)) + ->method('write') + ->with('y'); + + $bs->bind($is1); + $bs->bind($is2); + + $bs->write('x'); + $bs->write('y'); + } + + public function testBindingOtherStreamsMirrorsFlushOperations() + { + $bs = $this->createArrayStream(''); + $is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); + $is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); + + $is1->expects($this->once()) + ->method('flushBuffers'); + $is2->expects($this->once()) + ->method('flushBuffers'); + + $bs->bind($is1); + $bs->bind($is2); + + $bs->flushBuffers(); + } + + public function testUnbindingStreamPreventsFurtherWrites() + { + $bs = $this->createArrayStream(''); + $is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); + $is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); + + $is1->expects($this->at(0)) + ->method('write') + ->with('x'); + $is1->expects($this->at(1)) + ->method('write') + ->with('y'); + $is2->expects($this->once()) + ->method('write') + ->with('x'); + + $bs->bind($is1); + $bs->bind($is2); + + $bs->write('x'); + + $bs->unbind($is2); + + $bs->write('y'); + } + + private function createArrayStream($input) + { + return new Swift_ByteStream_ArrayByteStream($input); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php new file mode 100644 index 0000000..1ba5e78 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php @@ -0,0 +1,43 @@ +assertSame(1, $reader->getInitialByteSize()); + + $reader = new Swift_CharacterReader_GenericFixedWidthReader(4); + $this->assertSame(4, $reader->getInitialByteSize()); + } + + public function testValidationValueIsBasedOnOctetCount() + { + $reader = new Swift_CharacterReader_GenericFixedWidthReader(4); + + $this->assertSame( + 1, $reader->validateByteSequence([0x01, 0x02, 0x03], 3) + ); //3 octets + + $this->assertSame( + 2, $reader->validateByteSequence([0x01, 0x0A], 2) + ); //2 octets + + $this->assertSame( + 3, $reader->validateByteSequence([0xFE], 1) + ); //1 octet + + $this->assertSame( + 0, $reader->validateByteSequence([0xFE, 0x03, 0x67, 0x9A], 4) + ); //All 4 octets + } + + public function testValidationFailsIfTooManyOctets() + { + $reader = new Swift_CharacterReader_GenericFixedWidthReader(6); + + $this->assertSame(-1, $reader->validateByteSequence( + [0xFE, 0x03, 0x67, 0x9A, 0x10, 0x09, 0x85], 7 + )); //7 octets + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php new file mode 100644 index 0000000..b85b0ab --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php @@ -0,0 +1,52 @@ +read($size); ) { + $c .= $bytes; + $size = $v->validateCharacter($c); + if (-1 == $size) { + throw new Exception( ... invalid char .. ); + } elseif (0 == $size) { + return $c; //next character in $os + } + } + + */ + + private $reader; + + protected function setUp() + { + $this->reader = new Swift_CharacterReader_UsAsciiReader(); + } + + public function testAllValidAsciiCharactersReturnZero() + { + for ($ordinal = 0x00; $ordinal <= 0x7F; ++$ordinal) { + $this->assertSame( + 0, $this->reader->validateByteSequence([$ordinal], 1) + ); + } + } + + public function testMultipleBytesAreInvalid() + { + for ($ordinal = 0x00; $ordinal <= 0x7F; $ordinal += 2) { + $this->assertSame( + -1, $this->reader->validateByteSequence([$ordinal, $ordinal + 1], 2) + ); + } + } + + public function testBytesAboveAsciiRangeAreInvalid() + { + for ($ordinal = 0x80; $ordinal <= 0xFF; ++$ordinal) { + $this->assertSame( + -1, $this->reader->validateByteSequence([$ordinal], 1) + ); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php new file mode 100644 index 0000000..0637911 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php @@ -0,0 +1,65 @@ +reader = new Swift_CharacterReader_Utf8Reader(); + } + + public function testLeading7BitOctetCausesReturnZero() + { + for ($ordinal = 0x00; $ordinal <= 0x7F; ++$ordinal) { + $this->assertSame( + 0, $this->reader->validateByteSequence([$ordinal], 1) + ); + } + } + + public function testLeadingByteOf2OctetCharCausesReturn1() + { + for ($octet = 0xC0; $octet <= 0xDF; ++$octet) { + $this->assertSame( + 1, $this->reader->validateByteSequence([$octet], 1) + ); + } + } + + public function testLeadingByteOf3OctetCharCausesReturn2() + { + for ($octet = 0xE0; $octet <= 0xEF; ++$octet) { + $this->assertSame( + 2, $this->reader->validateByteSequence([$octet], 1) + ); + } + } + + public function testLeadingByteOf4OctetCharCausesReturn3() + { + for ($octet = 0xF0; $octet <= 0xF7; ++$octet) { + $this->assertSame( + 3, $this->reader->validateByteSequence([$octet], 1) + ); + } + } + + public function testLeadingByteOf5OctetCharCausesReturn4() + { + for ($octet = 0xF8; $octet <= 0xFB; ++$octet) { + $this->assertSame( + 4, $this->reader->validateByteSequence([$octet], 1) + ); + } + } + + public function testLeadingByteOf6OctetCharCausesReturn5() + { + for ($octet = 0xFC; $octet <= 0xFD; ++$octet) { + $this->assertSame( + 5, $this->reader->validateByteSequence([$octet], 1) + ); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php new file mode 100644 index 0000000..d0158a2 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php @@ -0,0 +1,358 @@ +getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importString(pack('C*', + 0xD0, 0x94, + 0xD0, 0xB6, + 0xD0, 0xBE, + 0xD1, 0x8D, + 0xD0, 0xBB, + 0xD0, 0xB0 + ) + ); + } + + public function testCharactersWrittenUseValidator() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $stream->write(pack('C*', + 0xD0, 0xBB, + 0xD1, 0x8E, + 0xD0, 0xB1, + 0xD1, 0x8B, + 0xD1, 0x85 + ) + ); + } + + public function testReadCharactersAreInTact() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + //String + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + //Stream + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $stream->write(pack('C*', + 0xD0, 0xBB, + 0xD1, 0x8E, + 0xD0, 0xB1, + 0xD1, 0x8B, + 0xD1, 0x85 + ) + ); + + $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1)); + $this->assertIdenticalBinary( + pack('C*', 0xD0, 0xB6, 0xD0, 0xBE), $stream->read(2) + ); + $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBB), $stream->read(1)); + $this->assertIdenticalBinary( + pack('C*', 0xD1, 0x8E, 0xD0, 0xB1, 0xD1, 0x8B), $stream->read(3) + ); + $this->assertIdenticalBinary(pack('C*', 0xD1, 0x85), $stream->read(1)); + + $this->assertFalse($stream->read(1)); + } + + public function testCharactersCanBeReadAsByteArrays() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + //String + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + //Stream + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $stream->write(pack('C*', + 0xD0, 0xBB, + 0xD1, 0x8E, + 0xD0, 0xB1, + 0xD1, 0x8B, + 0xD1, 0x85 + ) + ); + + $this->assertEquals([0xD0, 0x94], $stream->readBytes(1)); + $this->assertEquals([0xD0, 0xB6, 0xD0, 0xBE], $stream->readBytes(2)); + $this->assertEquals([0xD0, 0xBB], $stream->readBytes(1)); + $this->assertEquals( + [0xD1, 0x8E, 0xD0, 0xB1, 0xD1, 0x8B], $stream->readBytes(3) + ); + $this->assertEquals([0xD1, 0x85], $stream->readBytes(1)); + + $this->assertFalse($stream->readBytes(1)); + } + + public function testRequestingLargeCharCountPastEndOfStream() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE), + $stream->read(100) + ); + + $this->assertFalse($stream->read(1)); + } + + public function testRequestingByteArrayCountPastEndOfStream() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $this->assertEquals([0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE], + $stream->readBytes(100) + ); + + $this->assertFalse($stream->readBytes(1)); + } + + public function testPointerOffsetCanBeSet() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1)); + + $stream->setPointer(0); + + $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1)); + + $stream->setPointer(2); + + $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBE), $stream->read(1)); + } + + public function testContentsCanBeFlushed() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE)); + + $stream->flushContents(); + + $this->assertFalse($stream->read(1)); + } + + public function testByteStreamCanBeImportingUsesValidator() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + $os = $this->getByteStream(); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $os->shouldReceive('setReadPointer') + ->between(0, 1) + ->with(0); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0x94)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xB6)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xBE)); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importByteStream($os); + } + + public function testImportingStreamProducesCorrectCharArray() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + $os = $this->getByteStream(); + + $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'); + + $os->shouldReceive('setReadPointer') + ->between(0, 1) + ->with(0); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0x94)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xB6)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0)); + $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xBE)); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0], 1)->andReturn(1); + + $stream->importByteStream($os); + + $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1)); + $this->assertIdenticalBinary(pack('C*', 0xD0, 0xB6), $stream->read(1)); + $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBE), $stream->read(1)); + + $this->assertFalse($stream->read(1)); + } + + public function testAlgorithmWithFixedWidthCharsets() + { + $reader = $this->getReader(); + $factory = $this->getFactory($reader); + + $reader->shouldReceive('getInitialByteSize') + ->zeroOrMoreTimes() + ->andReturn(2); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD1, 0x8D], 2); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0, 0xBB], 2); + $reader->shouldReceive('validateByteSequence')->once()->with([0xD0, 0xB0], 2); + + $stream = new Swift_CharacterStream_ArrayCharacterStream( + $factory, 'utf-8' + ); + $stream->importString(pack('C*', 0xD1, 0x8D, 0xD0, 0xBB, 0xD0, 0xB0)); + + $this->assertIdenticalBinary(pack('C*', 0xD1, 0x8D), $stream->read(1)); + $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBB), $stream->read(1)); + $this->assertIdenticalBinary(pack('C*', 0xD0, 0xB0), $stream->read(1)); + + $this->assertFalse($stream->read(1)); + } + + private function getReader() + { + return $this->getMockery('Swift_CharacterReader'); + } + + private function getFactory($reader) + { + $factory = $this->getMockery('Swift_CharacterReaderFactory'); + $factory->shouldReceive('getReaderFor') + ->zeroOrMoreTimes() + ->with('utf-8') + ->andReturn($reader); + + return $factory; + } + + private function getByteStream() + { + return $this->getMockery('Swift_OutputByteStream'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php new file mode 100644 index 0000000..286f832 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php @@ -0,0 +1,191 @@ +arg1 = $arg1; + $this->arg2 = $arg2; + } +} + +class Swift_DependencyContainerTest extends \PHPUnit\Framework\TestCase +{ + private $container; + + protected function setUp() + { + $this->container = new Swift_DependencyContainer(); + } + + public function testRegisterAndLookupValue() + { + $this->container->register('foo')->asValue('bar'); + $this->assertEquals('bar', $this->container->lookup('foo')); + } + + public function testHasReturnsTrueForRegisteredValue() + { + $this->container->register('foo')->asValue('bar'); + $this->assertTrue($this->container->has('foo')); + } + + public function testHasReturnsFalseForUnregisteredValue() + { + $this->assertFalse($this->container->has('foo')); + } + + public function testRegisterAndLookupNewInstance() + { + $this->container->register('one')->asNewInstanceOf('One'); + $this->assertInstanceOf('One', $this->container->lookup('one')); + } + + public function testHasReturnsTrueForRegisteredInstance() + { + $this->container->register('one')->asNewInstanceOf('One'); + $this->assertTrue($this->container->has('one')); + } + + public function testNewInstanceIsAlwaysNew() + { + $this->container->register('one')->asNewInstanceOf('One'); + $a = $this->container->lookup('one'); + $b = $this->container->lookup('one'); + $this->assertEquals($a, $b); + } + + public function testRegisterAndLookupSharedInstance() + { + $this->container->register('one')->asSharedInstanceOf('One'); + $this->assertInstanceOf('One', $this->container->lookup('one')); + } + + public function testHasReturnsTrueForSharedInstance() + { + $this->container->register('one')->asSharedInstanceOf('One'); + $this->assertTrue($this->container->has('one')); + } + + public function testMultipleSharedInstancesAreSameInstance() + { + $this->container->register('one')->asSharedInstanceOf('One'); + $a = $this->container->lookup('one'); + $b = $this->container->lookup('one'); + $this->assertEquals($a, $b); + } + + public function testRegisterAndLookupArray() + { + $this->container->register('One')->asArray(); + $this->assertSame([], $this->container->lookup('One')); + } + + public function testNewInstanceWithDependencies() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('one')->asNewInstanceOf('One') + ->withDependencies(['foo']); + $obj = $this->container->lookup('one'); + $this->assertSame('FOO', $obj->arg1); + } + + public function testNewInstanceWithMultipleDependencies() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('bar')->asValue(42); + $this->container->register('one')->asNewInstanceOf('One') + ->withDependencies(['foo', 'bar']); + $obj = $this->container->lookup('one'); + $this->assertSame('FOO', $obj->arg1); + $this->assertSame(42, $obj->arg2); + } + + public function testNewInstanceWithInjectedObjects() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('one')->asNewInstanceOf('One'); + $this->container->register('two')->asNewInstanceOf('One') + ->withDependencies(['one', 'foo']); + $obj = $this->container->lookup('two'); + $this->assertEquals($this->container->lookup('one'), $obj->arg1); + $this->assertSame('FOO', $obj->arg2); + } + + public function testNewInstanceWithAddConstructorValue() + { + $this->container->register('one')->asNewInstanceOf('One') + ->addConstructorValue('x') + ->addConstructorValue(99); + $obj = $this->container->lookup('one'); + $this->assertSame('x', $obj->arg1); + $this->assertSame(99, $obj->arg2); + } + + public function testNewInstanceWithAddConstructorLookup() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('bar')->asValue(42); + $this->container->register('one')->asNewInstanceOf('One') + ->addConstructorLookup('foo') + ->addConstructorLookup('bar'); + + $obj = $this->container->lookup('one'); + $this->assertSame('FOO', $obj->arg1); + $this->assertSame(42, $obj->arg2); + } + + public function testResolvedDependenciesCanBeLookedUp() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('one')->asNewInstanceOf('One'); + $this->container->register('two')->asNewInstanceOf('One') + ->withDependencies(['one', 'foo']); + $deps = $this->container->createDependenciesFor('two'); + $this->assertEquals( + [$this->container->lookup('one'), 'FOO'], $deps + ); + } + + public function testArrayOfDependenciesCanBeSpecified() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('one')->asNewInstanceOf('One'); + $this->container->register('two')->asNewInstanceOf('One') + ->withDependencies([['one', 'foo'], 'foo']); + + $obj = $this->container->lookup('two'); + $this->assertEquals([$this->container->lookup('one'), 'FOO'], $obj->arg1); + $this->assertSame('FOO', $obj->arg2); + } + + public function testArrayWithDependencies() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('bar')->asValue(42); + $this->container->register('one')->asArray('One') + ->withDependencies(['foo', 'bar']); + $this->assertSame(['FOO', 42], $this->container->lookup('one')); + } + + public function testAliasCanBeSet() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('bar')->asAliasOf('foo'); + + $this->assertSame('FOO', $this->container->lookup('bar')); + } + + public function testAliasOfAliasCanBeSet() + { + $this->container->register('foo')->asValue('FOO'); + $this->container->register('bar')->asAliasOf('foo'); + $this->container->register('zip')->asAliasOf('bar'); + $this->container->register('button')->asAliasOf('zip'); + + $this->assertSame('FOO', $this->container->lookup('button')); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php new file mode 100644 index 0000000..6387bad --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php @@ -0,0 +1,173 @@ +encoder = new Swift_Encoder_Base64Encoder(); + } + + /* + There's really no point in testing the entire base64 encoding to the + level QP encoding has been tested. base64_encode() has been in PHP for + years. + */ + + public function testInputOutputRatioIs3to4Bytes() + { + /* + RFC 2045, 6.8 + + The encoding process represents 24-bit groups of input bits as output + strings of 4 encoded characters. Proceeding from left to right, a + 24-bit input group is formed by concatenating 3 8bit input groups. + These 24 bits are then treated as 4 concatenated 6-bit groups, each + of which is translated into a single digit in the base64 alphabet. + */ + + $this->assertEquals( + 'MTIz', $this->encoder->encodeString('123'), + '%s: 3 bytes of input should yield 4 bytes of output' + ); + $this->assertEquals( + 'MTIzNDU2', $this->encoder->encodeString('123456'), + '%s: 6 bytes in input should yield 8 bytes of output' + ); + $this->assertEquals( + 'MTIzNDU2Nzg5', $this->encoder->encodeString('123456789'), + '%s: 9 bytes in input should yield 12 bytes of output' + ); + } + + public function testPadLength() + { + /* + RFC 2045, 6.8 + + Special processing is performed if fewer than 24 bits are available + at the end of the data being encoded. A full encoding quantum is + always completed at the end of a body. When fewer than 24 input bits + are available in an input group, zero bits are added (on the right) + to form an integral number of 6-bit groups. Padding at the end of + the data is performed using the "=" character. Since all base64 + input is an integral number of octets, only the following cases can + arise: (1) the final quantum of encoding input is an integral + multiple of 24 bits; here, the final unit of encoded output will be + an integral multiple of 4 characters with no "=" padding, (2) the + final quantum of encoding input is exactly 8 bits; here, the final + unit of encoded output will be two characters followed by two "=" + padding characters, or (3) the final quantum of encoding input is + exactly 16 bits; here, the final unit of encoded output will be three + characters followed by one "=" padding character. + */ + + for ($i = 0; $i < 30; ++$i) { + $input = pack('C', random_int(0, 255)); + $this->assertRegExp( + '~^[a-zA-Z0-9/\+]{2}==$~', $this->encoder->encodeString($input), + '%s: A single byte should have 2 bytes of padding' + ); + } + + for ($i = 0; $i < 30; ++$i) { + $input = pack('C*', random_int(0, 255), random_int(0, 255)); + $this->assertRegExp( + '~^[a-zA-Z0-9/\+]{3}=$~', $this->encoder->encodeString($input), + '%s: Two bytes should have 1 byte of padding' + ); + } + + for ($i = 0; $i < 30; ++$i) { + $input = pack('C*', random_int(0, 255), random_int(0, 255), random_int(0, 255)); + $this->assertRegExp( + '~^[a-zA-Z0-9/\+]{4}$~', $this->encoder->encodeString($input), + '%s: Three bytes should have no padding' + ); + } + } + + public function testMaximumLineLengthIs76Characters() + { + /* + The encoded output stream must be represented in lines of no more + than 76 characters each. All line breaks or other characters not + found in Table 1 must be ignored by decoding software. + */ + + $input = + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '1234567890'. + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '1234567890'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + + $output = + 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38 + 'NERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1'."\r\n".//76 * + 'Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3'.//38 + 'h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla'."\r\n".//76 * + 'MTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BRUl'.//38 + 'NUVVZXWFla'; //48 + + $this->assertEquals( + $output, $this->encoder->encodeString($input), + '%s: Lines should be no more than 76 characters' + ); + } + + public function testMaximumLineLengthCanBeSpecified() + { + $input = + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '1234567890'. + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '1234567890'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + + $output = + 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38 + 'NERUZHSElKS0'."\r\n".//50 * + 'xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBhYmNk'.//38 + 'ZWZnaGlqa2xt'."\r\n".//50 * + 'bm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1'.//38 + 'BRUlNUVVZXWF'."\r\n".//50 * + 'laMTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BR'.//38 + 'UlNUVVZXWFla'; //50 * + + $this->assertEquals( + $output, $this->encoder->encodeString($input, 0, 50), + '%s: Lines should be no more than 100 characters' + ); + } + + public function testFirstLineLengthCanBeDifferent() + { + $input = + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '1234567890'. + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '1234567890'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + + $output = + 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38 + 'NERUZHSElKS0xNTk9QU'."\r\n".//57 * + 'VJTVFVWV1hZWjEyMzQ1Njc4OTBhYmNkZWZnaGl'.//38 + 'qa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLT'."\r\n".//76 * + 'E1OT1BRUlNUVVZXWFlaMTIzNDU2Nzg5MEFCQ0R'.//38 + 'FRkdISUpLTE1OT1BRUlNUVVZXWFla'; //67 + + $this->assertEquals( + $output, $this->encoder->encodeString($input, 19), + '%s: First line offset is 19 so first line should be 57 chars long' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php new file mode 100644 index 0000000..10e5e1d --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php @@ -0,0 +1,400 @@ +createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($char); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$ordinal]); + $charStream->shouldReceive('readBytes') + ->atLeast()->times(1) + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + + $this->assertIdenticalBinary($char, $encoder->encodeString($char)); + } + } + + public function testWhiteSpaceAtLineEndingIsEncoded() + { + /* -- RFC 2045, 6.7 -- + (3) (White Space) Octets with values of 9 and 32 MAY be + represented as US-ASCII TAB (HT) and SPACE characters, + respectively, but MUST NOT be so represented at the end + of an encoded line. Any TAB (HT) or SPACE characters + on an encoded line MUST thus be followed on that line + by a printable character. In particular, an "=" at the + end of an encoded line, indicating a soft line break + (see rule #5) may follow one or more TAB (HT) or SPACE + characters. It follows that an octet with decimal + value 9 or 32 appearing at the end of an encoded line + must be represented according to Rule #1. This rule is + necessary because some MTAs (Message Transport Agents, + programs which transport messages from one user to + another, or perform a portion of such transfers) are + known to pad lines of text with SPACEs, and others are + known to remove "white space" characters from the end + of a line. Therefore, when decoding a Quoted-Printable + body, any trailing white space on a line must be + deleted, as it will necessarily have been added by + intermediate transport agents. + */ + + $HT = chr(0x09); //9 + $SPACE = chr(0x20); //32 + + //HT + $string = 'a'.$HT.$HT."\r\n".'b'; + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x09]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x09]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0D]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0A]); + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes')->once()->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + $this->assertEquals( + 'a'.$HT.'=09'."\r\n".'b', + $encoder->encodeString($string) + ); + + //SPACE + $string = 'a'.$SPACE.$SPACE."\r\n".'b'; + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x20]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x20]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0D]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0A]); + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes')->once()->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + $this->assertEquals( + 'a'.$SPACE.'=20'."\r\n".'b', + $encoder->encodeString($string) + ); + } + + public function testCRLFIsLeftAlone() + { + /* + (4) (Line Breaks) A line break in a text body, represented + as a CRLF sequence in the text canonical form, must be + represented by a (RFC 822) line break, which is also a + CRLF sequence, in the Quoted-Printable encoding. Since + the canonical representation of media types other than + text do not generally include the representation of + line breaks as CRLF sequences, no hard line breaks + (i.e. line breaks that are intended to be meaningful + and to be displayed to the user) can occur in the + quoted-printable encoding of such types. Sequences + like "=0D", "=0A", "=0A=0D" and "=0D=0A" will routinely + appear in non-text data represented in quoted- + printable, of course. + + Note that many implementations may elect to encode the + local representation of various content types directly + rather than converting to canonical form first, + encoding, and then converting back to local + representation. In particular, this may apply to plain + text material on systems that use newline conventions + other than a CRLF terminator sequence. Such an + implementation optimization is permissible, but only + when the combined canonicalization-encoding step is + equivalent to performing the three steps separately. + */ + + $string = 'a'."\r\n".'b'."\r\n".'c'."\r\n"; + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0D]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0A]); + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0D]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0A]); + $charStream->shouldReceive('readBytes')->once()->andReturn([ord('c')]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0D]); + $charStream->shouldReceive('readBytes')->once()->andReturn([0x0A]); + $charStream->shouldReceive('readBytes')->once()->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + $this->assertEquals($string, $encoder->encodeString($string)); + } + + public function testLinesLongerThan76CharactersAreSoftBroken() + { + /* + (5) (Soft Line Breaks) The Quoted-Printable encoding + REQUIRES that encoded lines be no more than 76 + characters long. If longer lines are to be encoded + with the Quoted-Printable encoding, "soft" line breaks + must be used. An equal sign as the last character on a + encoded line indicates such a non-significant ("soft") + line break in the encoded text. + */ + + $input = str_repeat('a', 140); + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($input); + + $output = ''; + for ($i = 0; $i < 140; ++$i) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + + if (75 == $i) { + $output .= "=\r\n"; + } + $output .= 'a'; + } + + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + $this->assertEquals($output, $encoder->encodeString($input)); + } + + public function testMaxLineLengthCanBeSpecified() + { + $input = str_repeat('a', 100); + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($input); + + $output = ''; + for ($i = 0; $i < 100; ++$i) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + + if (53 == $i) { + $output .= "=\r\n"; + } + $output .= 'a'; + } + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + $this->assertEquals($output, $encoder->encodeString($input, 0, 54)); + } + + public function testBytesBelowPermittedRangeAreEncoded() + { + /* + According to Rule (1 & 2) + */ + + foreach (range(0, 32) as $ordinal) { + $char = chr($ordinal); + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($char); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$ordinal]); + $charStream->shouldReceive('readBytes') + ->atLeast()->times(1) + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + + $this->assertEquals( + sprintf('=%02X', $ordinal), $encoder->encodeString($char) + ); + } + } + + public function testDecimalByte61IsEncoded() + { + /* + According to Rule (1 & 2) + */ + + $char = '='; + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($char); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([61]); + $charStream->shouldReceive('readBytes') + ->atLeast()->times(1) + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + + $this->assertEquals('=3D', $encoder->encodeString('=')); + } + + public function testBytesAbovePermittedRangeAreEncoded() + { + /* + According to Rule (1 & 2) + */ + + foreach (range(127, 255) as $ordinal) { + $char = chr($ordinal); + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($char); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$ordinal]); + $charStream->shouldReceive('readBytes') + ->atLeast()->times(1) + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + + $this->assertEquals( + sprintf('=%02X', $ordinal), $encoder->encodeString($char) + ); + } + } + + public function testFirstLineLengthCanBeDifferent() + { + $input = str_repeat('a', 140); + + $charStream = $this->createCharStream(); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($input); + + $output = ''; + for ($i = 0; $i < 140; ++$i) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + + if (53 == $i || 53 + 75 == $i) { + $output .= "=\r\n"; + } + $output .= 'a'; + } + + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn(false); + + $encoder = new Swift_Encoder_QpEncoder($charStream); + $this->assertEquals( + $output, $encoder->encodeString($input, 22), + '%s: First line should start at offset 22 so can only have max length 54' + ); + } + + public function testTextIsPreWrapped() + { + $encoder = $this->createEncoder(); + + $input = str_repeat('a', 70)."\r\n". + str_repeat('a', 70)."\r\n". + str_repeat('a', 70); + + $this->assertEquals( + $input, $encoder->encodeString($input) + ); + } + + private function createCharStream() + { + return $this->getMockery('Swift_CharacterStream')->shouldIgnoreMissing(); + } + + private function createEncoder() + { + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $charStream = new Swift_CharacterStream_NgCharacterStream($factory, 'utf-8'); + + return new Swift_Encoder_QpEncoder($charStream); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php new file mode 100644 index 0000000..0ab8aa4 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php @@ -0,0 +1,141 @@ +getMockery('Swift_CharacterStream'); + + $string = ''; + foreach (range(0x00, 0x7F) as $octet) { + $char = pack('C', $octet); + $string .= $char; + $charStream->shouldReceive('read') + ->once() + ->andReturn($char); + } + + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + $charStream->shouldReceive('read') + ->atLeast()->times(1) + ->andReturn(false); + + $encoder = new Swift_Encoder_Rfc2231Encoder($charStream); + $encoded = $encoder->encodeString($string); + + foreach (explode("\r\n", $encoded) as $line) { + $this->assertRegExp($this->rfc2045Token, $line, + '%s: Encoder should always return a valid RFC 2045 token.'); + } + } + + public function testEncodingNonAsciiCharactersProducesValidToken() + { + $charStream = $this->getMockery('Swift_CharacterStream'); + + $string = ''; + foreach (range(0x80, 0xFF) as $octet) { + $char = pack('C', $octet); + $string .= $char; + $charStream->shouldReceive('read') + ->once() + ->andReturn($char); + } + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + $charStream->shouldReceive('read') + ->atLeast()->times(1) + ->andReturn(false); + $encoder = new Swift_Encoder_Rfc2231Encoder($charStream); + + $encoded = $encoder->encodeString($string); + + foreach (explode("\r\n", $encoded) as $line) { + $this->assertRegExp($this->rfc2045Token, $line, + '%s: Encoder should always return a valid RFC 2045 token.'); + } + } + + public function testMaximumLineLengthCanBeSet() + { + $charStream = $this->getMockery('Swift_CharacterStream'); + + $string = ''; + for ($x = 0; $x < 200; ++$x) { + $char = 'a'; + $string .= $char; + $charStream->shouldReceive('read') + ->once() + ->andReturn($char); + } + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + $charStream->shouldReceive('read') + ->atLeast()->times(1) + ->andReturn(false); + $encoder = new Swift_Encoder_Rfc2231Encoder($charStream); + + $encoded = $encoder->encodeString($string, 0, 75); + + $this->assertEquals( + str_repeat('a', 75)."\r\n". + str_repeat('a', 75)."\r\n". + str_repeat('a', 50), + $encoded, + '%s: Lines should be wrapped at each 75 characters' + ); + } + + public function testFirstLineCanHaveShorterLength() + { + $charStream = $this->getMockery('Swift_CharacterStream'); + + $string = ''; + for ($x = 0; $x < 200; ++$x) { + $char = 'a'; + $string .= $char; + $charStream->shouldReceive('read') + ->once() + ->andReturn($char); + } + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importString') + ->once() + ->with($string); + $charStream->shouldReceive('read') + ->atLeast()->times(1) + ->andReturn(false); + $encoder = new Swift_Encoder_Rfc2231Encoder($charStream); + $encoded = $encoder->encodeString($string, 25, 75); + + $this->assertEquals( + str_repeat('a', 50)."\r\n". + str_repeat('a', 75)."\r\n". + str_repeat('a', 75), + $encoded, + '%s: First line should be 25 bytes shorter than the others.' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php new file mode 100644 index 0000000..2915870 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php @@ -0,0 +1,34 @@ +createEvent($this->createTransport(), "FOO\r\n"); + $this->assertEquals("FOO\r\n", $evt->getCommand()); + } + + public function testSuccessCodesCanBeFetchedViaGetter() + { + $evt = $this->createEvent($this->createTransport(), "FOO\r\n", [250]); + $this->assertEquals([250], $evt->getSuccessCodes()); + } + + public function testSourceIsBuffer() + { + $transport = $this->createTransport(); + $evt = $this->createEvent($transport, "FOO\r\n"); + $ref = $evt->getSource(); + $this->assertEquals($transport, $ref); + } + + private function createEvent(Swift_Transport $source, $command, $successCodes = []) + { + return new Swift_Events_CommandEvent($source, $command, $successCodes); + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php new file mode 100644 index 0000000..b67461f --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php @@ -0,0 +1,32 @@ +createEvent($source); + $ref = $evt->getSource(); + $this->assertEquals($source, $ref); + } + + public function testEventDoesNotHaveCancelledBubbleWhenNew() + { + $source = new stdClass(); + $evt = $this->createEvent($source); + $this->assertFalse($evt->bubbleCancelled()); + } + + public function testBubbleCanBeCancelledInEvent() + { + $source = new stdClass(); + $evt = $this->createEvent($source); + $evt->cancelBubble(); + $this->assertTrue($evt->bubbleCancelled()); + } + + private function createEvent($source) + { + return new Swift_Events_EventObject($source); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php new file mode 100644 index 0000000..ba5c191 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php @@ -0,0 +1,38 @@ +createEvent($this->createTransport(), "250 Ok\r\n", true); + $this->assertEquals("250 Ok\r\n", $evt->getResponse(), + '%s: Response should be available via getResponse()' + ); + } + + public function testResultCanBeFetchedViaGetter() + { + $evt = $this->createEvent($this->createTransport(), "250 Ok\r\n", false); + $this->assertFalse($evt->isValid(), + '%s: Result should be checkable via isValid()' + ); + } + + public function testSourceIsBuffer() + { + $transport = $this->createTransport(); + $evt = $this->createEvent($transport, "250 Ok\r\n", true); + $ref = $evt->getSource(); + $this->assertEquals($transport, $ref); + } + + private function createEvent(Swift_Transport $source, $response, $result) + { + return new Swift_Events_ResponseEvent($source, $response, $result); + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php new file mode 100644 index 0000000..9f55589 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php @@ -0,0 +1,96 @@ +createMessage(); + $transport = $this->createTransport(); + + $evt = $this->createEvent($transport, $message); + + $ref = $evt->getMessage(); + $this->assertEquals($message, $ref, + '%s: Message should be returned from getMessage()' + ); + } + + public function testTransportCanBeFetchViaGetter() + { + $message = $this->createMessage(); + $transport = $this->createTransport(); + + $evt = $this->createEvent($transport, $message); + + $ref = $evt->getTransport(); + $this->assertEquals($transport, $ref, + '%s: Transport should be returned from getTransport()' + ); + } + + public function testTransportCanBeFetchViaGetSource() + { + $message = $this->createMessage(); + $transport = $this->createTransport(); + + $evt = $this->createEvent($transport, $message); + + $ref = $evt->getSource(); + $this->assertEquals($transport, $ref, + '%s: Transport should be returned from getSource()' + ); + } + + public function testResultCanBeSetAndGet() + { + $message = $this->createMessage(); + $transport = $this->createTransport(); + + $evt = $this->createEvent($transport, $message); + + $evt->setResult( + Swift_Events_SendEvent::RESULT_SUCCESS | Swift_Events_SendEvent::RESULT_TENTATIVE + ); + + $this->assertTrue((bool) ($evt->getResult() & Swift_Events_SendEvent::RESULT_SUCCESS)); + $this->assertTrue((bool) ($evt->getResult() & Swift_Events_SendEvent::RESULT_TENTATIVE)); + } + + public function testFailedRecipientsCanBeSetAndGet() + { + $message = $this->createMessage(); + $transport = $this->createTransport(); + + $evt = $this->createEvent($transport, $message); + + $evt->setFailedRecipients(['foo@bar', 'zip@button']); + + $this->assertEquals(['foo@bar', 'zip@button'], $evt->getFailedRecipients(), + '%s: FailedRecipients should be returned from getter' + ); + } + + public function testFailedRecipientsGetsPickedUpCorrectly() + { + $message = $this->createMessage(); + $transport = $this->createTransport(); + + $evt = $this->createEvent($transport, $message); + $this->assertEquals([], $evt->getFailedRecipients()); + } + + private function createEvent(Swift_Transport $source, Swift_Mime_SimpleMessage $message) + { + return new Swift_Events_SendEvent($source, $message); + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } + + private function createMessage() + { + return $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php new file mode 100644 index 0000000..d5dce2b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php @@ -0,0 +1,142 @@ +dispatcher = new Swift_Events_SimpleEventDispatcher(); + } + + public function testSendEventCanBeCreated() + { + $transport = $this->getMockBuilder('Swift_Transport')->getMock(); + $message = $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + $evt = $this->dispatcher->createSendEvent($transport, $message); + $this->assertInstanceOf('Swift_Events_SendEvent', $evt); + $this->assertSame($message, $evt->getMessage()); + $this->assertSame($transport, $evt->getTransport()); + } + + public function testCommandEventCanBeCreated() + { + $buf = $this->getMockBuilder('Swift_Transport')->getMock(); + $evt = $this->dispatcher->createCommandEvent($buf, "FOO\r\n", [250]); + $this->assertInstanceOf('Swift_Events_CommandEvent', $evt); + $this->assertSame($buf, $evt->getSource()); + $this->assertEquals("FOO\r\n", $evt->getCommand()); + $this->assertEquals([250], $evt->getSuccessCodes()); + } + + public function testResponseEventCanBeCreated() + { + $buf = $this->getMockBuilder('Swift_Transport')->getMock(); + $evt = $this->dispatcher->createResponseEvent($buf, "250 Ok\r\n", true); + $this->assertInstanceOf('Swift_Events_ResponseEvent', $evt); + $this->assertSame($buf, $evt->getSource()); + $this->assertEquals("250 Ok\r\n", $evt->getResponse()); + $this->assertTrue($evt->isValid()); + } + + public function testTransportChangeEventCanBeCreated() + { + $transport = $this->getMockBuilder('Swift_Transport')->getMock(); + $evt = $this->dispatcher->createTransportChangeEvent($transport); + $this->assertInstanceOf('Swift_Events_TransportChangeEvent', $evt); + $this->assertSame($transport, $evt->getSource()); + } + + public function testTransportExceptionEventCanBeCreated() + { + $transport = $this->getMockBuilder('Swift_Transport')->getMock(); + $ex = new Swift_TransportException(''); + $evt = $this->dispatcher->createTransportExceptionEvent($transport, $ex); + $this->assertInstanceOf('Swift_Events_TransportExceptionEvent', $evt); + $this->assertSame($transport, $evt->getSource()); + $this->assertSame($ex, $evt->getException()); + } + + public function testListenersAreNotifiedOfDispatchedEvent() + { + $transport = $this->getMockBuilder('Swift_Transport')->getMock(); + + $evt = $this->dispatcher->createTransportChangeEvent($transport); + + $listenerA = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock(); + $listenerB = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock(); + + $this->dispatcher->bindEventListener($listenerA); + $this->dispatcher->bindEventListener($listenerB); + + $listenerA->expects($this->once()) + ->method('transportStarted') + ->with($evt); + $listenerB->expects($this->once()) + ->method('transportStarted') + ->with($evt); + + $this->dispatcher->dispatchEvent($evt, 'transportStarted'); + } + + public function testListenersAreOnlyCalledIfImplementingCorrectInterface() + { + $transport = $this->getMockBuilder('Swift_Transport')->getMock(); + $message = $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + + $evt = $this->dispatcher->createSendEvent($transport, $message); + + $targetListener = $this->getMockBuilder('Swift_Events_SendListener')->getMock(); + $otherListener = $this->getMockBuilder('DummyListener')->getMock(); + + $this->dispatcher->bindEventListener($targetListener); + $this->dispatcher->bindEventListener($otherListener); + + $targetListener->expects($this->once()) + ->method('sendPerformed') + ->with($evt); + $otherListener->expects($this->never()) + ->method('sendPerformed'); + + $this->dispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + public function testListenersCanCancelBubblingOfEvent() + { + $transport = $this->getMockBuilder('Swift_Transport')->getMock(); + $message = $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + + $evt = $this->dispatcher->createSendEvent($transport, $message); + + $listenerA = $this->getMockBuilder('Swift_Events_SendListener')->getMock(); + $listenerB = $this->getMockBuilder('Swift_Events_SendListener')->getMock(); + + $this->dispatcher->bindEventListener($listenerA); + $this->dispatcher->bindEventListener($listenerB); + + $listenerA->expects($this->once()) + ->method('sendPerformed') + ->with($evt) + ->will($this->returnCallback(function ($object) { + $object->cancelBubble(true); + })); + $listenerB->expects($this->never()) + ->method('sendPerformed'); + + $this->dispatcher->dispatchEvent($evt, 'sendPerformed'); + + $this->assertTrue($evt->bubbleCancelled()); + } + + private function createDispatcher(array $map) + { + return new Swift_Events_SimpleEventDispatcher($map); + } +} + +class DummyListener implements Swift_Events_EventListener +{ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php new file mode 100644 index 0000000..625b96c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php @@ -0,0 +1,30 @@ +createTransport(); + $evt = $this->createEvent($transport); + $ref = $evt->getTransport(); + $this->assertEquals($transport, $ref); + } + + public function testSourceIsTransport() + { + $transport = $this->createTransport(); + $evt = $this->createEvent($transport); + $ref = $evt->getSource(); + $this->assertEquals($transport, $ref); + } + + private function createEvent(Swift_Transport $source) + { + return new Swift_Events_TransportChangeEvent($source); + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php new file mode 100644 index 0000000..033b0e5 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php @@ -0,0 +1,41 @@ +createException(); + $transport = $this->createTransport(); + $evt = $this->createEvent($transport, $ex); + $ref = $evt->getException(); + $this->assertEquals($ex, $ref, + '%s: Exception should be available via getException()' + ); + } + + public function testSourceIsTransport() + { + $ex = $this->createException(); + $transport = $this->createTransport(); + $evt = $this->createEvent($transport, $ex); + $ref = $evt->getSource(); + $this->assertEquals($transport, $ref, + '%s: Transport should be available via getSource()' + ); + } + + private function createEvent(Swift_Transport $transport, Swift_TransportException $ex) + { + return new Swift_Events_TransportExceptionEvent($transport, $ex); + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } + + private function createException() + { + return new Swift_TransportException(''); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php new file mode 100644 index 0000000..129c99e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php @@ -0,0 +1,240 @@ +createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('test', $cache->getString($this->key1, 'foo')); + } + + public function testStringDataCanBeOverwritten() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $cache->setString( + $this->key1, 'foo', 'whatever', Swift_KeyCache::MODE_WRITE + ); + + $this->assertEquals('whatever', $cache->getString($this->key1, 'foo')); + } + + public function testStringDataCanBeAppended() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $cache->setString( + $this->key1, 'foo', 'ing', Swift_KeyCache::MODE_APPEND + ); + + $this->assertEquals('testing', $cache->getString($this->key1, 'foo')); + } + + public function testHasKeyReturnValue() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + + $this->assertTrue($cache->hasKey($this->key1, 'foo')); + } + + public function testNsKeyIsWellPartitioned() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $cache->setString( + $this->key2, 'foo', 'ing', Swift_KeyCache::MODE_WRITE + ); + + $this->assertEquals('test', $cache->getString($this->key1, 'foo')); + $this->assertEquals('ing', $cache->getString($this->key2, 'foo')); + } + + public function testItemKeyIsWellPartitioned() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $cache->setString( + $this->key1, 'bar', 'ing', Swift_KeyCache::MODE_WRITE + ); + + $this->assertEquals('test', $cache->getString($this->key1, 'foo')); + $this->assertEquals('ing', $cache->getString($this->key1, 'bar')); + } + + public function testByteStreamCanBeImported() + { + $os = $this->createOutputStream(); + $os->expects($this->at(0)) + ->method('read') + ->will($this->returnValue('abc')); + $os->expects($this->at(1)) + ->method('read') + ->will($this->returnValue('def')); + $os->expects($this->at(2)) + ->method('read') + ->will($this->returnValue(false)); + + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + $cache->importFromByteStream( + $this->key1, 'foo', $os, Swift_KeyCache::MODE_WRITE + ); + $this->assertEquals('abcdef', $cache->getString($this->key1, 'foo')); + } + + public function testByteStreamCanBeAppended() + { + $os1 = $this->createOutputStream(); + $os1->expects($this->at(0)) + ->method('read') + ->will($this->returnValue('abc')); + $os1->expects($this->at(1)) + ->method('read') + ->will($this->returnValue('def')); + $os1->expects($this->at(2)) + ->method('read') + ->will($this->returnValue(false)); + + $os2 = $this->createOutputStream(); + $os2->expects($this->at(0)) + ->method('read') + ->will($this->returnValue('xyz')); + $os2->expects($this->at(1)) + ->method('read') + ->will($this->returnValue('uvw')); + $os2->expects($this->at(2)) + ->method('read') + ->will($this->returnValue(false)); + + $is = $this->createKeyCacheInputStream(true); + + $cache = $this->createCache($is); + + $cache->importFromByteStream( + $this->key1, 'foo', $os1, Swift_KeyCache::MODE_APPEND + ); + $cache->importFromByteStream( + $this->key1, 'foo', $os2, Swift_KeyCache::MODE_APPEND + ); + + $this->assertEquals('abcdefxyzuvw', $cache->getString($this->key1, 'foo')); + } + + public function testByteStreamAndStringCanBeAppended() + { + $os = $this->createOutputStream(); + $os->expects($this->at(0)) + ->method('read') + ->will($this->returnValue('abc')); + $os->expects($this->at(1)) + ->method('read') + ->will($this->returnValue('def')); + $os->expects($this->at(2)) + ->method('read') + ->will($this->returnValue(false)); + + $is = $this->createKeyCacheInputStream(true); + + $cache = $this->createCache($is); + + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_APPEND + ); + $cache->importFromByteStream( + $this->key1, 'foo', $os, Swift_KeyCache::MODE_APPEND + ); + $this->assertEquals('testabcdef', $cache->getString($this->key1, 'foo')); + } + + public function testDataCanBeExportedToByteStream() + { + //See acceptance test for more detail + $is = $this->createInputStream(); + $is->expects($this->atLeastOnce()) + ->method('write'); + + $kcis = $this->createKeyCacheInputStream(true); + + $cache = $this->createCache($kcis); + + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + + $cache->exportToByteStream($this->key1, 'foo', $is); + } + + public function testKeyCanBeCleared() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($cache->hasKey($this->key1, 'foo')); + $cache->clearKey($this->key1, 'foo'); + $this->assertFalse($cache->hasKey($this->key1, 'foo')); + } + + public function testNsKeyCanBeCleared() + { + $is = $this->createKeyCacheInputStream(); + $cache = $this->createCache($is); + + $cache->setString( + $this->key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE + ); + $cache->setString( + $this->key1, 'bar', 'xyz', Swift_KeyCache::MODE_WRITE + ); + $this->assertTrue($cache->hasKey($this->key1, 'foo')); + $this->assertTrue($cache->hasKey($this->key1, 'bar')); + $cache->clearAll($this->key1); + $this->assertFalse($cache->hasKey($this->key1, 'foo')); + $this->assertFalse($cache->hasKey($this->key1, 'bar')); + } + + private function createCache($is) + { + return new Swift_KeyCache_ArrayKeyCache($is); + } + + private function createKeyCacheInputStream() + { + return $this->getMockBuilder('Swift_KeyCache_KeyCacheInputStream')->getMock(); + } + + private function createOutputStream() + { + return $this->getMockBuilder('Swift_OutputByteStream')->getMock(); + } + + private function createInputStream() + { + return $this->getMockBuilder('Swift_InputByteStream')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php new file mode 100644 index 0000000..4274aaf --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php @@ -0,0 +1,73 @@ +getMockBuilder('Swift_KeyCache')->getMock(); + $cache->expects($this->at(0)) + ->method('setString') + ->with($this->nsKey, 'foo', 'a', Swift_KeyCache::MODE_APPEND); + $cache->expects($this->at(1)) + ->method('setString') + ->with($this->nsKey, 'foo', 'b', Swift_KeyCache::MODE_APPEND); + $cache->expects($this->at(2)) + ->method('setString') + ->with($this->nsKey, 'foo', 'c', Swift_KeyCache::MODE_APPEND); + + $stream = new Swift_KeyCache_SimpleKeyCacheInputStream(); + $stream->setKeyCache($cache); + $stream->setNsKey($this->nsKey); + $stream->setItemKey('foo'); + + $stream->write('a'); + $stream->write('b'); + $stream->write('c'); + } + + public function testFlushContentClearsKey() + { + $cache = $this->getMockBuilder('Swift_KeyCache')->getMock(); + $cache->expects($this->once()) + ->method('clearKey') + ->with($this->nsKey, 'foo'); + + $stream = new Swift_KeyCache_SimpleKeyCacheInputStream(); + $stream->setKeyCache($cache); + $stream->setNsKey($this->nsKey); + $stream->setItemKey('foo'); + + $stream->flushBuffers(); + } + + public function testClonedStreamStillReferencesSameCache() + { + $cache = $this->getMockBuilder('Swift_KeyCache')->getMock(); + $cache->expects($this->at(0)) + ->method('setString') + ->with($this->nsKey, 'foo', 'a', Swift_KeyCache::MODE_APPEND); + $cache->expects($this->at(1)) + ->method('setString') + ->with($this->nsKey, 'foo', 'b', Swift_KeyCache::MODE_APPEND); + $cache->expects($this->at(2)) + ->method('setString') + ->with('test', 'bar', 'x', Swift_KeyCache::MODE_APPEND); + + $stream = new Swift_KeyCache_SimpleKeyCacheInputStream(); + $stream->setKeyCache($cache); + $stream->setNsKey($this->nsKey); + $stream->setItemKey('foo'); + + $stream->write('a'); + $stream->write('b'); + + $newStream = clone $stream; + $newStream->setKeyCache($cache); + $newStream->setNsKey('test'); + $newStream->setItemKey('bar'); + + $newStream->write('x'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php new file mode 100644 index 0000000..12506dd --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php @@ -0,0 +1,42 @@ +assertFalse($it->hasNext()); + } + + public function testHasNextReturnsTrueIfItemsLeft() + { + $it = new Swift_Mailer_ArrayRecipientIterator(['foo@bar' => 'Foo']); + $this->assertTrue($it->hasNext()); + } + + public function testReadingToEndOfListCausesHasNextToReturnFalse() + { + $it = new Swift_Mailer_ArrayRecipientIterator(['foo@bar' => 'Foo']); + $this->assertTrue($it->hasNext()); + $it->nextRecipient(); + $this->assertFalse($it->hasNext()); + } + + public function testReturnedValueHasPreservedKeyValuePair() + { + $it = new Swift_Mailer_ArrayRecipientIterator(['foo@bar' => 'Foo']); + $this->assertEquals(['foo@bar' => 'Foo'], $it->nextRecipient()); + } + + public function testIteratorMovesNextAfterEachIteration() + { + $it = new Swift_Mailer_ArrayRecipientIterator([ + 'foo@bar' => 'Foo', + 'zip@button' => 'Zip thing', + 'test@test' => null, + ]); + $this->assertEquals(['foo@bar' => 'Foo'], $it->nextRecipient()); + $this->assertEquals(['zip@button' => 'Zip thing'], $it->nextRecipient()); + $this->assertEquals(['test@test' => null], $it->nextRecipient()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php new file mode 100644 index 0000000..a2a96d0 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php @@ -0,0 +1,145 @@ +createTransport(); + $message = $this->createMessage(); + + $started = false; + $transport->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$started) { + return $started; + }); + $transport->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$started) { + $started = true; + + return; + }); + + $mailer = $this->createMailer($transport); + $mailer->send($message); + } + + public function testTransportIsOnlyStartedOnce() + { + $transport = $this->createTransport(); + $message = $this->createMessage(); + + $started = false; + $transport->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$started) { + return $started; + }); + $transport->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$started) { + $started = true; + + return; + }); + + $mailer = $this->createMailer($transport); + for ($i = 0; $i < 10; ++$i) { + $mailer->send($message); + } + } + + public function testMessageIsPassedToTransport() + { + $transport = $this->createTransport(); + $message = $this->createMessage(); + $transport->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()); + + $mailer = $this->createMailer($transport); + $mailer->send($message); + } + + public function testSendReturnsCountFromTransport() + { + $transport = $this->createTransport(); + $message = $this->createMessage(); + $transport->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturn(57); + + $mailer = $this->createMailer($transport); + $this->assertEquals(57, $mailer->send($message)); + } + + public function testFailedRecipientReferenceIsPassedToTransport() + { + $failures = []; + + $transport = $this->createTransport(); + $message = $this->createMessage(); + $transport->shouldReceive('send') + ->once() + ->with($message, $failures) + ->andReturn(57); + + $mailer = $this->createMailer($transport); + $mailer->send($message, $failures); + } + + public function testSendRecordsRfcComplianceExceptionAsEntireSendFailure() + { + $failures = []; + + $rfcException = new Swift_RfcComplianceException('test'); + $transport = $this->createTransport(); + $message = $this->createMessage(); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo&invalid' => 'Foo', 'bar@valid.tld' => 'Bar']); + $transport->shouldReceive('send') + ->once() + ->with($message, $failures) + ->andThrow($rfcException); + + $mailer = $this->createMailer($transport); + $this->assertEquals(0, $mailer->send($message, $failures), '%s: Should return 0'); + $this->assertEquals(['foo&invalid', 'bar@valid.tld'], $failures, '%s: Failures should contain all addresses since the entire message failed to compile'); + } + + public function testRegisterPluginDelegatesToTransport() + { + $plugin = $this->createPlugin(); + $transport = $this->createTransport(); + $mailer = $this->createMailer($transport); + + $transport->shouldReceive('registerPlugin') + ->once() + ->with($plugin); + + $mailer->registerPlugin($plugin); + } + + private function createPlugin() + { + return $this->getMockery('Swift_Events_EventListener')->shouldIgnoreMissing(); + } + + private function createTransport() + { + return $this->getMockery('Swift_Transport')->shouldIgnoreMissing(); + } + + private function createMessage() + { + return $this->getMockery('Swift_Mime_SimpleMessage')->shouldIgnoreMissing(); + } + + private function createMailer(Swift_Transport $transport) + { + return new Swift_Mailer($transport); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php new file mode 100644 index 0000000..3ebbd7e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php @@ -0,0 +1,133 @@ +recursiveObjectCloningCheck($message1, $message2, $message1_clone); + // the test above will fail if the two messages are not identical + $this->addToAssertionCount(1); + } + + public function testCloningWithSigners() + { + $message1 = new Swift_Message('subj', 'body', 'ctype'); + $signer = new Swift_Signers_DKIMSigner(dirname(dirname(__DIR__)).'/_samples/dkim/dkim.test.priv', 'test.example', 'example'); + $message1->attachSigner($signer); + $message2 = new Swift_Message('subj', 'body', 'ctype'); + $signer = new Swift_Signers_DKIMSigner(dirname(dirname(__DIR__)).'/_samples/dkim/dkim.test.priv', 'test.example', 'example'); + $message2->attachSigner($signer); + $message1_clone = clone $message1; + + $this->recursiveObjectCloningCheck($message1, $message2, $message1_clone); + // the test above will fail if the two messages are not identical + $this->addToAssertionCount(1); + } + + public function testBodySwap() + { + $message1 = new Swift_Message('Test'); + $html = new Swift_MimePart('', 'text/html'); + $html->getHeaders()->addTextHeader('X-Test-Remove', 'Test-Value'); + $html->getHeaders()->addTextHeader('X-Test-Alter', 'Test-Value'); + $message1->attach($html); + $source = $message1->toString(); + $message2 = clone $message1; + $message2->setSubject('Message2'); + foreach ($message2->getChildren() as $child) { + $child->setBody('Test'); + $child->getHeaders()->removeAll('X-Test-Remove'); + $child->getHeaders()->get('X-Test-Alter')->setValue('Altered'); + } + $final = $message1->toString(); + if ($source != $final) { + $this->fail("Difference although object cloned \n [".$source."]\n[".$final."]\n"); + } + $final = $message2->toString(); + if ($final == $source) { + $this->fail('Two body matches although they should differ'."\n [".$source."]\n[".$final."]\n"); + } + $id_1 = $message1->getId(); + $id_2 = $message2->getId(); + $this->assertEquals($id_1, $id_2, 'Message Ids differ'); + $id_2 = $message2->generateId(); + $this->assertNotEquals($id_1, $id_2, 'Message Ids are the same'); + } + + protected function recursiveObjectCloningCheck($obj1, $obj2, $obj1_clone) + { + $obj1_properties = (array) $obj1; + $obj2_properties = (array) $obj2; + $obj1_clone_properties = (array) $obj1_clone; + + foreach ($obj1_properties as $property => $value) { + if (is_object($value)) { + $obj1_value = $obj1_properties[$property]; + $obj2_value = $obj2_properties[$property]; + $obj1_clone_value = $obj1_clone_properties[$property]; + + if ($obj1_value !== $obj2_value) { + // two separetely instanciated objects property not referencing same object + $this->assertFalse( + // but object's clone does - not everything copied + $obj1_value === $obj1_clone_value, + "Property `$property` cloning error: source and cloned objects property is referencing same object" + ); + } else { + // two separetely instanciated objects have same reference + $this->assertFalse( + // but object's clone doesn't - overdone making copies + $obj1_value !== $obj1_clone_value, + "Property `$property` not properly cloned: it should reference same object as cloning source (overdone copping)" + ); + } + // recurse + $this->recursiveObjectCloningCheck($obj1_value, $obj2_value, $obj1_clone_value); + } elseif (is_array($value)) { + $obj1_value = $obj1_properties[$property]; + $obj2_value = $obj2_properties[$property]; + $obj1_clone_value = $obj1_clone_properties[$property]; + + return $this->recursiveArrayCloningCheck($obj1_value, $obj2_value, $obj1_clone_value); + } + } + } + + protected function recursiveArrayCloningCheck($array1, $array2, $array1_clone) + { + foreach ($array1 as $key => $value) { + if (is_object($value)) { + $arr1_value = $array1[$key]; + $arr2_value = $array2[$key]; + $arr1_clone_value = $array1_clone[$key]; + if ($arr1_value !== $arr2_value) { + // two separetely instanciated objects property not referencing same object + $this->assertFalse( + // but object's clone does - not everything copied + $arr1_value === $arr1_clone_value, + "Key `$key` cloning error: source and cloned objects property is referencing same object" + ); + } else { + // two separetely instanciated objects have same reference + $this->assertFalse( + // but object's clone doesn't - overdone making copies + $arr1_value !== $arr1_clone_value, + "Key `$key` not properly cloned: it should reference same object as cloning source (overdone copping)" + ); + } + // recurse + $this->recursiveObjectCloningCheck($arr1_value, $arr2_value, $arr1_clone_value); + } elseif (is_array($value)) { + $arr1_value = $array1[$key]; + $arr2_value = $array2[$key]; + $arr1_clone_value = $array1_clone[$key]; + + return $this->recursiveArrayCloningCheck($arr1_value, $arr2_value, $arr1_clone_value); + } + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php new file mode 100644 index 0000000..c7c2c03 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php @@ -0,0 +1,1092 @@ +createHeaderSet(); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $this->assertSame($headers, $entity->getHeaders()); + } + + public function testContentTypeIsReturnedFromHeader() + { + $ctype = $this->createHeader('Content-Type', 'image/jpeg-test'); + $headers = $this->createHeaderSet(['Content-Type' => $ctype]); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $this->assertEquals('image/jpeg-test', $entity->getContentType()); + } + + public function testContentTypeIsSetInHeader() + { + $ctype = $this->createHeader('Content-Type', 'text/plain', [], false); + $headers = $this->createHeaderSet(['Content-Type' => $ctype]); + + $ctype->shouldReceive('setFieldBodyModel') + ->once() + ->with('image/jpeg'); + $ctype->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes() + ->with(\Mockery::not('image/jpeg')); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setContentType('image/jpeg'); + } + + public function testContentTypeHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addParameterizedHeader') + ->once() + ->with('Content-Type', 'image/jpeg'); + $headers->shouldReceive('addParameterizedHeader') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setContentType('image/jpeg'); + } + + public function testContentTypeCanBeSetViaSetBody() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addParameterizedHeader') + ->once() + ->with('Content-Type', 'text/html'); + $headers->shouldReceive('addParameterizedHeader') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBody('foo', 'text/html'); + } + + public function testGetEncoderFromConstructor() + { + $encoder = $this->createEncoder('base64'); + $entity = $this->createEntity($this->createHeaderSet(), $encoder, + $this->createCache() + ); + $this->assertSame($encoder, $entity->getEncoder()); + } + + public function testSetAndGetEncoder() + { + $encoder = $this->createEncoder('base64'); + $headers = $this->createHeaderSet(); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setEncoder($encoder); + $this->assertSame($encoder, $entity->getEncoder()); + } + + public function testSettingEncoderUpdatesTransferEncoding() + { + $encoder = $this->createEncoder('base64'); + $encoding = $this->createHeader( + 'Content-Transfer-Encoding', '8bit', [], false + ); + $headers = $this->createHeaderSet([ + 'Content-Transfer-Encoding' => $encoding, + ]); + $encoding->shouldReceive('setFieldBodyModel') + ->once() + ->with('base64'); + $encoding->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setEncoder($encoder); + } + + public function testSettingEncoderAddsEncodingHeaderIfNonePresent() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addTextHeader') + ->once() + ->with('Content-Transfer-Encoding', 'something'); + $headers->shouldReceive('addTextHeader') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setEncoder($this->createEncoder('something')); + } + + public function testIdIsReturnedFromHeader() + { + /* -- RFC 2045, 7. + In constructing a high-level user agent, it may be desirable to allow + one body to make reference to another. Accordingly, bodies may be + labelled using the "Content-ID" header field, which is syntactically + identical to the "Message-ID" header field + */ + + $cid = $this->createHeader('Content-ID', 'zip@button'); + $headers = $this->createHeaderSet(['Content-ID' => $cid]); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $this->assertEquals('zip@button', $entity->getId()); + } + + public function testIdIsSetInHeader() + { + $cid = $this->createHeader('Content-ID', 'zip@button', [], false); + $headers = $this->createHeaderSet(['Content-ID' => $cid]); + + $cid->shouldReceive('setFieldBodyModel') + ->once() + ->with('foo@bar'); + $cid->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setId('foo@bar'); + } + + public function testIdIsAutoGenerated() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertRegExp('/^.*?@.*?$/D', $entity->getId()); + } + + public function testGenerateIdCreatesNewId() + { + $headers = $this->createHeaderSet(); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $id1 = $entity->generateId(); + $id2 = $entity->generateId(); + $this->assertNotEquals($id1, $id2); + } + + public function testGenerateIdSetsNewId() + { + $headers = $this->createHeaderSet(); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $id = $entity->generateId(); + $this->assertEquals($id, $entity->getId()); + } + + public function testDescriptionIsReadFromHeader() + { + /* -- RFC 2045, 8. + The ability to associate some descriptive information with a given + body is often desirable. For example, it may be useful to mark an + "image" body as "a picture of the Space Shuttle Endeavor." Such text + may be placed in the Content-Description header field. This header + field is always optional. + */ + + $desc = $this->createHeader('Content-Description', 'something'); + $headers = $this->createHeaderSet(['Content-Description' => $desc]); + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $this->assertEquals('something', $entity->getDescription()); + } + + public function testDescriptionIsSetInHeader() + { + $desc = $this->createHeader('Content-Description', '', [], false); + $desc->shouldReceive('setFieldBodyModel')->once()->with('whatever'); + + $headers = $this->createHeaderSet(['Content-Description' => $desc]); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setDescription('whatever'); + } + + public function testDescriptionHeaderIsAddedIfNotPresent() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addTextHeader') + ->once() + ->with('Content-Description', 'whatever'); + $headers->shouldReceive('addTextHeader') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setDescription('whatever'); + } + + public function testSetAndGetMaxLineLength() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setMaxLineLength(60); + $this->assertEquals(60, $entity->getMaxLineLength()); + } + + public function testEncoderIsUsedForStringGeneration() + { + $encoder = $this->createEncoder('base64', false); + $encoder->expects($this->once()) + ->method('encodeString') + ->with('blah'); + + $entity = $this->createEntity($this->createHeaderSet(), + $encoder, $this->createCache() + ); + $entity->setBody('blah'); + $entity->toString(); + } + + public function testMaxLineLengthIsProvidedWhenEncoding() + { + $encoder = $this->createEncoder('base64', false); + $encoder->expects($this->once()) + ->method('encodeString') + ->with('blah', 0, 65); + + $entity = $this->createEntity($this->createHeaderSet(), + $encoder, $this->createCache() + ); + $entity->setBody('blah'); + $entity->setMaxLineLength(65); + $entity->toString(); + } + + public function testHeadersAppearInString() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->once() + ->andReturn( + "Content-Type: text/plain; charset=utf-8\r\n". + "X-MyHeader: foobar\r\n" + ); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $this->assertEquals( + "Content-Type: text/plain; charset=utf-8\r\n". + "X-MyHeader: foobar\r\n", + $entity->toString() + ); + } + + public function testSetAndGetBody() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setBody("blah\r\nblah!"); + $this->assertEquals("blah\r\nblah!", $entity->getBody()); + } + + public function testBodyIsAppended() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->once() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBody("blah\r\nblah!"); + $this->assertEquals( + "Content-Type: text/plain; charset=utf-8\r\n". + "\r\n". + "blah\r\nblah!", + $entity->toString() + ); + } + + public function testGetBodyReturnsStringFromByteStream() + { + $os = $this->createOutputStream('byte stream string'); + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setBody($os); + $this->assertEquals('byte stream string', $entity->getBody()); + } + + public function testByteStreamBodyIsAppended() + { + $headers = $this->createHeaderSet([], false); + $os = $this->createOutputStream('streamed'); + $headers->shouldReceive('toString') + ->once() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBody($os); + $this->assertEquals( + "Content-Type: text/plain; charset=utf-8\r\n". + "\r\n". + 'streamed', + $entity->toString() + ); + } + + public function testBoundaryCanBeRetrieved() + { + /* -- RFC 2046, 5.1.1. + boundary := 0*69 bcharsnospace + + bchars := bcharsnospace / " " + + bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / + "+" / "_" / "," / "-" / "." / + "/" / ":" / "=" / "?" + */ + + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertRegExp( + '/^[a-zA-Z0-9\'\(\)\+_\-,\.\/:=\?\ ]{0,69}[a-zA-Z0-9\'\(\)\+_\-,\.\/:=\?]$/D', + $entity->getBoundary() + ); + } + + public function testBoundaryNeverChanges() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $firstBoundary = $entity->getBoundary(); + for ($i = 0; $i < 10; ++$i) { + $this->assertEquals($firstBoundary, $entity->getBoundary()); + } + } + + public function testBoundaryCanBeSet() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setBoundary('foobar'); + $this->assertEquals('foobar', $entity->getBoundary()); + } + + public function testAddingChildrenGeneratesBoundaryInHeaders() + { + $child = $this->createChild(); + $cType = $this->createHeader('Content-Type', 'text/plain', [], false); + $cType->shouldReceive('setParameter') + ->once() + ->with('boundary', \Mockery::any()); + $cType->shouldReceive('setParameter') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($this->createHeaderSet([ + 'Content-Type' => $cType, + ]), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + } + + public function testChildrenOfLevelAttachmentAndLessCauseMultipartMixed() + { + for ($level = Swift_Mime_SimpleMimeEntity::LEVEL_MIXED; + $level > Swift_Mime_SimpleMimeEntity::LEVEL_TOP; $level /= 2) { + $child = $this->createChild($level); + $cType = $this->createHeader( + 'Content-Type', 'text/plain', [], false + ); + $cType->shouldReceive('setFieldBodyModel') + ->once() + ->with('multipart/mixed'); + $cType->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + } + } + + public function testChildrenOfLevelAlternativeAndLessCauseMultipartAlternative() + { + for ($level = Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE; + $level > Swift_Mime_SimpleMimeEntity::LEVEL_MIXED; $level /= 2) { + $child = $this->createChild($level); + $cType = $this->createHeader( + 'Content-Type', 'text/plain', [], false + ); + $cType->shouldReceive('setFieldBodyModel') + ->once() + ->with('multipart/alternative'); + $cType->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + } + } + + public function testChildrenOfLevelRelatedAndLessCauseMultipartRelated() + { + for ($level = Swift_Mime_SimpleMimeEntity::LEVEL_RELATED; + $level > Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE; $level /= 2) { + $child = $this->createChild($level); + $cType = $this->createHeader( + 'Content-Type', 'text/plain', [], false + ); + $cType->shouldReceive('setFieldBodyModel') + ->once() + ->with('multipart/related'); + $cType->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $entity = $this->createEntity($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + } + } + + public function testHighestLevelChildDeterminesContentType() + { + $combinations = [ + ['levels' => [Swift_Mime_SimpleMimeEntity::LEVEL_MIXED, + Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + Swift_Mime_SimpleMimeEntity::LEVEL_RELATED, + ], + 'type' => 'multipart/mixed', + ], + ['levels' => [Swift_Mime_SimpleMimeEntity::LEVEL_MIXED, + Swift_Mime_SimpleMimeEntity::LEVEL_RELATED, + ], + 'type' => 'multipart/mixed', + ], + ['levels' => [Swift_Mime_SimpleMimeEntity::LEVEL_MIXED, + Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + ], + 'type' => 'multipart/mixed', + ], + ['levels' => [Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + Swift_Mime_SimpleMimeEntity::LEVEL_RELATED, + ], + 'type' => 'multipart/alternative', + ], + ]; + + foreach ($combinations as $combination) { + $children = []; + foreach ($combination['levels'] as $level) { + $children[] = $this->createChild($level); + } + + $cType = $this->createHeader( + 'Content-Type', 'text/plain', [], false + ); + $cType->shouldReceive('setFieldBodyModel') + ->once() + ->with($combination['type']); + + $headerSet = $this->createHeaderSet(['Content-Type' => $cType]); + $headerSet->shouldReceive('newInstance') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use ($headerSet) { + return $headerSet; + }); + $entity = $this->createEntity($headerSet, + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren($children); + } + } + + public function testChildrenAppearNestedInString() + { + /* -- RFC 2046, 5.1.1. + (excerpt too verbose to paste here) + */ + + $headers = $this->createHeaderSet([], false); + + $child1 = new MimeEntityFixture(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/plain\r\n". + "\r\n". + 'foobar', 'text/plain' + ); + + $child2 = new MimeEntityFixture(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/html\r\n". + "\r\n". + 'foobar', 'text/html' + ); + + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: multipart/alternative; boundary=\"xxx\"\r\n"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBoundary('xxx'); + $entity->setChildren([$child1, $child2]); + + $this->assertEquals( + "Content-Type: multipart/alternative; boundary=\"xxx\"\r\n". + "\r\n". + "\r\n--xxx\r\n". + "Content-Type: text/plain\r\n". + "\r\n". + "foobar\r\n". + "\r\n--xxx\r\n". + "Content-Type: text/html\r\n". + "\r\n". + "foobar\r\n". + "\r\n--xxx--\r\n", + $entity->toString() + ); + } + + public function testMixingLevelsIsHierarchical() + { + $headers = $this->createHeaderSet([], false); + $newHeaders = $this->createHeaderSet([], false); + + $part = $this->createChild(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/plain\r\n". + "\r\n". + 'foobar' + ); + + $attachment = $this->createChild(Swift_Mime_SimpleMimeEntity::LEVEL_MIXED, + "Content-Type: application/octet-stream\r\n". + "\r\n". + 'data' + ); + + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: multipart/mixed; boundary=\"xxx\"\r\n"); + $headers->shouldReceive('newInstance') + ->zeroOrMoreTimes() + ->andReturn($newHeaders); + $newHeaders->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: multipart/alternative; boundary=\"yyy\"\r\n"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBoundary('xxx'); + $entity->setChildren([$part, $attachment]); + + $this->assertRegExp( + '~^'. + "Content-Type: multipart/mixed; boundary=\"xxx\"\r\n". + "\r\n\r\n--xxx\r\n". + "Content-Type: multipart/alternative; boundary=\"yyy\"\r\n". + "\r\n\r\n--(.*?)\r\n". + "Content-Type: text/plain\r\n". + "\r\n". + 'foobar'. + "\r\n\r\n--\\1--\r\n". + "\r\n\r\n--xxx\r\n". + "Content-Type: application/octet-stream\r\n". + "\r\n". + 'data'. + "\r\n\r\n--xxx--\r\n". + '$~', + $entity->toString() + ); + } + + public function testSettingEncoderNotifiesChildren() + { + $child = $this->createChild(0, '', false); + $encoder = $this->createEncoder('base64'); + + $child->shouldReceive('encoderChanged') + ->once() + ->with($encoder); + + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + $entity->setEncoder($encoder); + } + + public function testReceiptOfEncoderChangeNotifiesChildren() + { + $child = $this->createChild(0, '', false); + $encoder = $this->createEncoder('base64'); + + $child->shouldReceive('encoderChanged') + ->once() + ->with($encoder); + + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + $entity->encoderChanged($encoder); + } + + public function testReceiptOfCharsetChangeNotifiesChildren() + { + $child = $this->createChild(0, '', false); + $child->shouldReceive('charsetChanged') + ->once() + ->with('windows-874'); + + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $entity->setChildren([$child]); + $entity->charsetChanged('windows-874'); + } + + public function testEntityIsWrittenToByteStream() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $is = $this->createInputStream(false); + $is->expects($this->atLeastOnce()) + ->method('write'); + + $entity->toByteStream($is); + } + + public function testEntityHeadersAreComittedToByteStream() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $is = $this->createInputStream(false); + $is->expects($this->atLeastOnce()) + ->method('write'); + $is->expects($this->atLeastOnce()) + ->method('commit'); + + $entity->toByteStream($is); + } + + public function testOrderingTextBeforeHtml() + { + $htmlChild = new MimeEntityFixture(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/html\r\n". + "\r\n". + 'HTML PART', + 'text/html' + ); + $textChild = new MimeEntityFixture(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/plain\r\n". + "\r\n". + 'TEXT PART', + 'text/plain' + ); + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: multipart/alternative; boundary=\"xxx\"\r\n"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBoundary('xxx'); + $entity->setChildren([$htmlChild, $textChild]); + + $this->assertEquals( + "Content-Type: multipart/alternative; boundary=\"xxx\"\r\n". + "\r\n\r\n--xxx\r\n". + "Content-Type: text/plain\r\n". + "\r\n". + 'TEXT PART'. + "\r\n\r\n--xxx\r\n". + "Content-Type: text/html\r\n". + "\r\n". + 'HTML PART'. + "\r\n\r\n--xxx--\r\n", + $entity->toString() + ); + } + + public function testOrderingEqualContentTypesMaintainsOriginalOrdering() + { + $firstChild = new MimeEntityFixture(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/plain\r\n". + "\r\n". + 'PART 1', + 'text/plain' + ); + $secondChild = new MimeEntityFixture(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, + "Content-Type: text/plain\r\n". + "\r\n". + 'PART 2', + 'text/plain' + ); + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: multipart/alternative; boundary=\"xxx\"\r\n"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $this->createCache() + ); + $entity->setBoundary('xxx'); + $entity->setChildren([$firstChild, $secondChild]); + + $this->assertEquals( + "Content-Type: multipart/alternative; boundary=\"xxx\"\r\n". + "\r\n\r\n--xxx\r\n". + "Content-Type: text/plain\r\n". + "\r\n". + 'PART 1'. + "\r\n\r\n--xxx\r\n". + "Content-Type: text/plain\r\n". + "\r\n". + 'PART 2'. + "\r\n\r\n--xxx--\r\n", + $entity->toString() + ); + } + + public function testUnsettingChildrenRestoresContentType() + { + $cType = $this->createHeader('Content-Type', 'text/plain', [], false); + $child = $this->createChild(Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE); + + $cType->shouldReceive('setFieldBodyModel') + ->twice() + ->with('image/jpeg'); + $cType->shouldReceive('setFieldBodyModel') + ->once() + ->with('multipart/alternative'); + $cType->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes() + ->with(\Mockery::not('multipart/alternative', 'image/jpeg')); + + $entity = $this->createEntity($this->createHeaderSet([ + 'Content-Type' => $cType, + ]), + $this->createEncoder(), $this->createCache() + ); + + $entity->setContentType('image/jpeg'); + $entity->setChildren([$child]); + $entity->setChildren([]); + } + + public function testBodyIsReadFromCacheWhenUsingToStringIfPresent() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $cache = $this->createCache(false); + $cache->shouldReceive('hasKey') + ->once() + ->with(\Mockery::any(), 'body') + ->andReturn(true); + $cache->shouldReceive('getString') + ->once() + ->with(\Mockery::any(), 'body') + ->andReturn("\r\ncache\r\ncache!"); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $cache + ); + + $entity->setBody("blah\r\nblah!"); + $this->assertEquals( + "Content-Type: text/plain; charset=utf-8\r\n". + "\r\n". + "cache\r\ncache!", + $entity->toString() + ); + } + + public function testBodyIsAddedToCacheWhenUsingToString() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $cache = $this->createCache(false); + $cache->shouldReceive('hasKey') + ->once() + ->with(\Mockery::any(), 'body') + ->andReturn(false); + $cache->shouldReceive('setString') + ->once() + ->with(\Mockery::any(), 'body', "\r\nblah\r\nblah!", Swift_KeyCache::MODE_WRITE); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $cache + ); + + $entity->setBody("blah\r\nblah!"); + $entity->toString(); + } + + public function testBodyIsClearedFromCacheIfNewBodySet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $cache = $this->createCache(false); + $entity = $this->createEntity($headers, $this->createEncoder(), + $cache + ); + + $entity->setBody("blah\r\nblah!"); + $entity->toString(); + + // We set the expectation at this point because we only care what happens when calling setBody() + $cache->shouldReceive('clearKey') + ->once() + ->with(\Mockery::any(), 'body'); + + $entity->setBody("new\r\nnew!"); + } + + public function testBodyIsNotClearedFromCacheIfSameBodySet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $cache = $this->createCache(false); + $entity = $this->createEntity($headers, $this->createEncoder(), + $cache + ); + + $entity->setBody("blah\r\nblah!"); + $entity->toString(); + + // We set the expectation at this point because we only care what happens when calling setBody() + $cache->shouldReceive('clearKey') + ->never(); + + $entity->setBody("blah\r\nblah!"); + } + + public function testBodyIsClearedFromCacheIfNewEncoderSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $cache = $this->createCache(false); + $otherEncoder = $this->createEncoder(); + $entity = $this->createEntity($headers, $this->createEncoder(), + $cache + ); + + $entity->setBody("blah\r\nblah!"); + $entity->toString(); + + // We set the expectation at this point because we only care what happens when calling setEncoder() + $cache->shouldReceive('clearKey') + ->once() + ->with(\Mockery::any(), 'body'); + + $entity->setEncoder($otherEncoder); + } + + public function testBodyIsReadFromCacheWhenUsingToByteStreamIfPresent() + { + $is = $this->createInputStream(); + $cache = $this->createCache(false); + $cache->shouldReceive('hasKey') + ->once() + ->with(\Mockery::any(), 'body') + ->andReturn(true); + $cache->shouldReceive('exportToByteStream') + ->once() + ->with(\Mockery::any(), 'body', $is); + + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $cache + ); + $entity->setBody('foo'); + + $entity->toByteStream($is); + } + + public function testBodyIsAddedToCacheWhenUsingToByteStream() + { + $is = $this->createInputStream(); + $cache = $this->createCache(false); + $cache->shouldReceive('hasKey') + ->once() + ->with(\Mockery::any(), 'body') + ->andReturn(false); + $cache->shouldReceive('getInputByteStream') + ->once() + ->with(\Mockery::any(), 'body'); + + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $cache + ); + $entity->setBody('foo'); + + $entity->toByteStream($is); + } + + public function testFluidInterface() + { + $entity = $this->createEntity($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + + $this->assertSame($entity, + $entity + ->setContentType('text/plain') + ->setEncoder($this->createEncoder()) + ->setId('foo@bar') + ->setDescription('my description') + ->setMaxLineLength(998) + ->setBody('xx') + ->setBoundary('xyz') + ->setChildren([]) + ); + } + + abstract protected function createEntity($headers, $encoder, $cache); + + protected function createChild($level = null, $string = '', $stub = true) + { + $child = $this->getMockery('Swift_Mime_SimpleMimeEntity')->shouldIgnoreMissing(); + if (isset($level)) { + $child->shouldReceive('getNestingLevel') + ->zeroOrMoreTimes() + ->andReturn($level); + } + $child->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn($string); + + return $child; + } + + protected function createEncoder($name = 'quoted-printable', $stub = true) + { + $encoder = $this->getMockBuilder('Swift_Mime_ContentEncoder')->getMock(); + $encoder->expects($this->any()) + ->method('getName') + ->will($this->returnValue($name)); + $encoder->expects($this->any()) + ->method('encodeString') + ->will($this->returnCallback(function () { + $args = func_get_args(); + + return array_shift($args); + })); + + return $encoder; + } + + protected function createCache($stub = true) + { + return $this->getMockery('Swift_KeyCache')->shouldIgnoreMissing(); + } + + protected function createHeaderSet($headers = [], $stub = true) + { + $set = $this->getMockery('Swift_Mime_SimpleHeaderSet')->shouldIgnoreMissing(); + $set->shouldReceive('get') + ->zeroOrMoreTimes() + ->andReturnUsing(function ($key) use ($headers) { + return $headers[$key]; + }); + $set->shouldReceive('has') + ->zeroOrMoreTimes() + ->andReturnUsing(function ($key) use ($headers) { + return array_key_exists($key, $headers); + }); + + return $set; + } + + protected function createHeader($name, $model = null, $params = [], $stub = true) + { + $header = $this->getMockery('Swift_Mime_Headers_ParameterizedHeader')->shouldIgnoreMissing(); + $header->shouldReceive('getFieldName') + ->zeroOrMoreTimes() + ->andReturn($name); + $header->shouldReceive('getFieldBodyModel') + ->zeroOrMoreTimes() + ->andReturn($model); + $header->shouldReceive('getParameter') + ->zeroOrMoreTimes() + ->andReturnUsing(function ($key) use ($params) { + return $params[$key]; + }); + + return $header; + } + + protected function createOutputStream($data = null, $stub = true) + { + $os = $this->getMockery('Swift_OutputByteStream'); + if (isset($data)) { + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use ($data) { + static $first = true; + if (!$first) { + return false; + } + + $first = false; + + return $data; + }); + $os->shouldReceive('setReadPointer') + ->zeroOrMoreTimes(); + } + + return $os; + } + + protected function createInputStream($stub = true) + { + return $this->getMockBuilder('Swift_InputByteStream')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php new file mode 100644 index 0000000..912d529 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php @@ -0,0 +1,321 @@ +createAttachment($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals( + Swift_Mime_SimpleMimeEntity::LEVEL_MIXED, $attachment->getNestingLevel() + ); + } + + public function testDispositionIsReturnedFromHeader() + { + /* -- RFC 2183, 2.1, 2.2. + */ + + $disposition = $this->createHeader('Content-Disposition', 'attachment'); + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('attachment', $attachment->getDisposition()); + } + + public function testDispositionIsSetInHeader() + { + $disposition = $this->createHeader('Content-Disposition', 'attachment', + [], false + ); + $disposition->shouldReceive('setFieldBodyModel') + ->once() + ->with('inline'); + $disposition->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $attachment->setDisposition('inline'); + } + + public function testDispositionIsAddedIfNonePresent() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addParameterizedHeader') + ->once() + ->with('Content-Disposition', 'inline'); + $headers->shouldReceive('addParameterizedHeader') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($headers, $this->createEncoder(), + $this->createCache() + ); + $attachment->setDisposition('inline'); + } + + public function testDispositionIsAutoDefaultedToAttachment() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addParameterizedHeader') + ->once() + ->with('Content-Disposition', 'attachment'); + $headers->shouldReceive('addParameterizedHeader') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($headers, $this->createEncoder(), + $this->createCache() + ); + } + + public function testDefaultContentTypeInitializedToOctetStream() + { + $cType = $this->createHeader('Content-Type', '', + [], false + ); + $cType->shouldReceive('setFieldBodyModel') + ->once() + ->with('application/octet-stream'); + $cType->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + } + + public function testFilenameIsReturnedFromHeader() + { + /* -- RFC 2183, 2.3. + */ + + $disposition = $this->createHeader('Content-Disposition', 'attachment', + ['filename' => 'foo.txt'] + ); + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('foo.txt', $attachment->getFilename()); + } + + public function testFilenameIsSetInHeader() + { + $disposition = $this->createHeader('Content-Disposition', 'attachment', + ['filename' => 'foo.txt'], false + ); + $disposition->shouldReceive('setParameter') + ->once() + ->with('filename', 'bar.txt'); + $disposition->shouldReceive('setParameter') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $attachment->setFilename('bar.txt'); + } + + public function testSettingFilenameSetsNameInContentType() + { + /* + This is a legacy requirement which isn't covered by up-to-date RFCs. + */ + + $cType = $this->createHeader('Content-Type', 'text/plain', + [], false + ); + $cType->shouldReceive('setParameter') + ->once() + ->with('name', 'bar.txt'); + $cType->shouldReceive('setParameter') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $attachment->setFilename('bar.txt'); + } + + public function testSizeIsReturnedFromHeader() + { + /* -- RFC 2183, 2.7. + */ + + $disposition = $this->createHeader('Content-Disposition', 'attachment', + ['size' => 1234] + ); + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(1234, $attachment->getSize()); + } + + public function testSizeIsSetInHeader() + { + $disposition = $this->createHeader('Content-Disposition', 'attachment', + [], false + ); + $disposition->shouldReceive('setParameter') + ->once() + ->with('size', 12345); + $disposition->shouldReceive('setParameter') + ->zeroOrMoreTimes(); + + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $attachment->setSize(12345); + } + + public function testFilnameCanBeReadFromFileStream() + { + $file = $this->createFileStream('/bar/file.ext', ''); + $disposition = $this->createHeader('Content-Disposition', 'attachment', + ['filename' => 'foo.txt'], false + ); + $disposition->shouldReceive('setParameter') + ->once() + ->with('filename', 'file.ext'); + + $attachment = $this->createAttachment($this->createHeaderSet([ + 'Content-Disposition' => $disposition, ]), + $this->createEncoder(), $this->createCache() + ); + $attachment->setFile($file); + } + + public function testContentTypeCanBeSetViaSetFile() + { + $file = $this->createFileStream('/bar/file.ext', ''); + $disposition = $this->createHeader('Content-Disposition', 'attachment', + ['filename' => 'foo.txt'], false + ); + $disposition->shouldReceive('setParameter') + ->once() + ->with('filename', 'file.ext'); + + $ctype = $this->createHeader('Content-Type', 'text/plain', [], false); + $ctype->shouldReceive('setFieldBodyModel') + ->once() + ->with('text/html'); + $ctype->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $headers = $this->createHeaderSet([ + 'Content-Disposition' => $disposition, + 'Content-Type' => $ctype, + ]); + + $attachment = $this->createAttachment($headers, $this->createEncoder(), + $this->createCache() + ); + $attachment->setFile($file, 'text/html'); + } + + public function XtestContentTypeCanBeLookedUpFromCommonListIfNotProvided() + { + $file = $this->createFileStream('/bar/file.zip', ''); + $disposition = $this->createHeader('Content-Disposition', 'attachment', + ['filename' => 'foo.zip'], false + ); + $disposition->shouldReceive('setParameter') + ->once() + ->with('filename', 'file.zip'); + + $ctype = $this->createHeader('Content-Type', 'text/plain', [], false); + $ctype->shouldReceive('setFieldBodyModel') + ->once() + ->with('application/zip'); + $ctype->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $headers = $this->createHeaderSet([ + 'Content-Disposition' => $disposition, + 'Content-Type' => $ctype, + ]); + + $attachment = $this->createAttachment($headers, $this->createEncoder(), + $this->createCache(), ['zip' => 'application/zip', 'txt' => 'text/plain'] + ); + $attachment->setFile($file); + } + + public function testDataCanBeReadFromFile() + { + $file = $this->createFileStream('/foo/file.ext', ''); + $attachment = $this->createAttachment($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $attachment->setFile($file); + $this->assertEquals('', $attachment->getBody()); + } + + public function testFluidInterface() + { + $attachment = $this->createAttachment($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertSame($attachment, + $attachment + ->setContentType('application/pdf') + ->setEncoder($this->createEncoder()) + ->setId('foo@bar') + ->setDescription('my pdf') + ->setMaxLineLength(998) + ->setBody('xx') + ->setBoundary('xyz') + ->setChildren([]) + ->setDisposition('inline') + ->setFilename('afile.txt') + ->setSize(123) + ->setFile($this->createFileStream('foo.txt', '')) + ); + } + + protected function createEntity($headers, $encoder, $cache) + { + return $this->createAttachment($headers, $encoder, $cache); + } + + protected function createAttachment($headers, $encoder, $cache, $mimeTypes = []) + { + $idGenerator = new Swift_Mime_IdGenerator('example.com'); + + return new Swift_Mime_Attachment($headers, $encoder, $cache, $idGenerator, $mimeTypes); + } + + protected function createFileStream($path, $data, $stub = true) + { + $file = $this->getMockery('Swift_FileStream'); + $file->shouldReceive('getPath') + ->zeroOrMoreTimes() + ->andReturn($path); + $file->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use ($data) { + static $first = true; + if (!$first) { + return false; + } + + $first = false; + + return $data; + }); + $file->shouldReceive('setReadPointer') + ->zeroOrMoreTimes(); + + return $file; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php new file mode 100644 index 0000000..a05c68a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php @@ -0,0 +1,323 @@ +encoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + } + + public function testNameIsBase64() + { + $this->assertEquals('base64', $this->encoder->getName()); + } + + /* + There's really no point in testing the entire base64 encoding to the + level QP encoding has been tested. base64_encode() has been in PHP for + years. + */ + + public function testInputOutputRatioIs3to4Bytes() + { + /* + RFC 2045, 6.8 + + The encoding process represents 24-bit groups of input bits as output + strings of 4 encoded characters. Proceeding from left to right, a + 24-bit input group is formed by concatenating 3 8bit input groups. + These 24 bits are then treated as 4 concatenated 6-bit groups, each + of which is translated into a single digit in the base64 alphabet. + */ + + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn('123'); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is); + $this->assertEquals('MTIz', $collection->content); + } + + public function testPadLength() + { + /* + RFC 2045, 6.8 + + Special processing is performed if fewer than 24 bits are available + at the end of the data being encoded. A full encoding quantum is + always completed at the end of a body. When fewer than 24 input bits + are available in an input group, zero bits are added (on the right) + to form an integral number of 6-bit groups. Padding at the end of + the data is performed using the "=" character. Since all base64 + input is an integral number of octets, only the following cases can + arise: (1) the final quantum of encoding input is an integral + multiple of 24 bits; here, the final unit of encoded output will be + an integral multiple of 4 characters with no "=" padding, (2) the + final quantum of encoding input is exactly 8 bits; here, the final + unit of encoded output will be two characters followed by two "=" + padding characters, or (3) the final quantum of encoding input is + exactly 16 bits; here, the final unit of encoded output will be three + characters followed by one "=" padding character. + */ + + for ($i = 0; $i < 30; ++$i) { + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn(pack('C', random_int(0, 255))); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is); + $this->assertRegExp('~^[a-zA-Z0-9/\+]{2}==$~', $collection->content, + '%s: A single byte should have 2 bytes of padding' + ); + } + + for ($i = 0; $i < 30; ++$i) { + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn(pack('C*', random_int(0, 255), random_int(0, 255))); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is); + $this->assertRegExp('~^[a-zA-Z0-9/\+]{3}=$~', $collection->content, + '%s: Two bytes should have 1 byte of padding' + ); + } + + for ($i = 0; $i < 30; ++$i) { + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn(pack('C*', random_int(0, 255), random_int(0, 255), random_int(0, 255))); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is); + $this->assertRegExp('~^[a-zA-Z0-9/\+]{4}$~', $collection->content, + '%s: Three bytes should have no padding' + ); + } + } + + public function testMaximumLineLengthIs76Characters() + { + /* + The encoded output stream must be represented in lines of no more + than 76 characters each. All line breaks or other characters not + found in Table 1 must be ignored by decoding software. + */ + + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //12 + $os->shouldReceive('read') + ->once() + ->andReturn('mnopqrstuvwx'); //24 + $os->shouldReceive('read') + ->once() + ->andReturn('yzabc1234567'); //36 + $os->shouldReceive('read') + ->once() + ->andReturn('890ABCDEFGHI'); //48 + $os->shouldReceive('read') + ->once() + ->andReturn('JKLMNOPQRSTU'); //60 + $os->shouldReceive('read') + ->once() + ->andReturn('VWXYZ1234567'); //72 + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //84 + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is); + $this->assertEquals( + "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3ODkwQUJDREVGR0hJSktMTU5PUFFS\r\n". + 'U1RVVldYWVoxMjM0NTY3YWJjZGVmZ2hpamts', + $collection->content + ); + } + + public function testMaximumLineLengthCanBeDifferent() + { + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //12 + $os->shouldReceive('read') + ->once() + ->andReturn('mnopqrstuvwx'); //24 + $os->shouldReceive('read') + ->once() + ->andReturn('yzabc1234567'); //36 + $os->shouldReceive('read') + ->once() + ->andReturn('890ABCDEFGHI'); //48 + $os->shouldReceive('read') + ->once() + ->andReturn('JKLMNOPQRSTU'); //60 + $os->shouldReceive('read') + ->once() + ->andReturn('VWXYZ1234567'); //72 + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //84 + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is, 0, 50); + $this->assertEquals( + "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3OD\r\n". + "kwQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3YWJj\r\n". + 'ZGVmZ2hpamts', + $collection->content + ); + } + + public function testMaximumLineLengthIsNeverMoreThan76Chars() + { + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //12 + $os->shouldReceive('read') + ->once() + ->andReturn('mnopqrstuvwx'); //24 + $os->shouldReceive('read') + ->once() + ->andReturn('yzabc1234567'); //36 + $os->shouldReceive('read') + ->once() + ->andReturn('890ABCDEFGHI'); //48 + $os->shouldReceive('read') + ->once() + ->andReturn('JKLMNOPQRSTU'); //60 + $os->shouldReceive('read') + ->once() + ->andReturn('VWXYZ1234567'); //72 + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //84 + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is, 0, 100); + $this->assertEquals( + "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3ODkwQUJDREVGR0hJSktMTU5PUFFS\r\n". + 'U1RVVldYWVoxMjM0NTY3YWJjZGVmZ2hpamts', + $collection->content + ); + } + + public function testFirstLineLengthCanBeDifferent() + { + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //12 + $os->shouldReceive('read') + ->once() + ->andReturn('mnopqrstuvwx'); //24 + $os->shouldReceive('read') + ->once() + ->andReturn('yzabc1234567'); //36 + $os->shouldReceive('read') + ->once() + ->andReturn('890ABCDEFGHI'); //48 + $os->shouldReceive('read') + ->once() + ->andReturn('JKLMNOPQRSTU'); //60 + $os->shouldReceive('read') + ->once() + ->andReturn('VWXYZ1234567'); //72 + $os->shouldReceive('read') + ->once() + ->andReturn('abcdefghijkl'); //84 + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->encoder->encodeByteStream($os, $is, 19); + $this->assertEquals( + "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3ODkwQUJDR\r\n". + 'EVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3YWJjZGVmZ2hpamts', + $collection->content + ); + } + + private function createOutputByteStream($stub = false) + { + return $this->getMockery('Swift_OutputByteStream')->shouldIgnoreMissing(); + } + + private function createInputByteStream($stub = false) + { + return $this->getMockery('Swift_InputByteStream')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php new file mode 100644 index 0000000..270d02c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php @@ -0,0 +1,171 @@ +getEncoder('7bit'); + $this->assertEquals('7bit', $encoder->getName()); + + $encoder = $this->getEncoder('8bit'); + $this->assertEquals('8bit', $encoder->getName()); + } + + public function testNoOctetsAreModifiedInString() + { + $encoder = $this->getEncoder('7bit'); + foreach (range(0x00, 0xFF) as $octet) { + $byte = pack('C', $octet); + $this->assertIdenticalBinary($byte, $encoder->encodeString($byte)); + } + } + + public function testNoOctetsAreModifiedInByteStream() + { + $encoder = $this->getEncoder('7bit'); + foreach (range(0x00, 0xFF) as $octet) { + $byte = pack('C', $octet); + + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn($byte); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder->encodeByteStream($os, $is); + $this->assertIdenticalBinary($byte, $collection->content); + } + } + + public function testLineLengthCanBeSpecified() + { + $encoder = $this->getEncoder('7bit'); + + $chars = []; + for ($i = 0; $i < 50; ++$i) { + $chars[] = 'a'; + } + $input = implode(' ', $chars); //99 chars long + + $this->assertEquals( + 'a a a a a a a a a a a a a a a a a a a a a a a a a '."\r\n".//50 * + 'a a a a a a a a a a a a a a a a a a a a a a a a a', //99 + $encoder->encodeString($input, 0, 50), + '%s: Lines should be wrapped at 50 chars' + ); + } + + public function testLineLengthCanBeSpecifiedInByteStream() + { + $encoder = $this->getEncoder('7bit'); + + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + + for ($i = 0; $i < 50; ++$i) { + $os->shouldReceive('read') + ->once() + ->andReturn('a '); + } + + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder->encodeByteStream($os, $is, 0, 50); + $this->assertEquals( + str_repeat('a ', 25)."\r\n".str_repeat('a ', 25), + $collection->content + ); + } + + public function testencodeStringGeneratesCorrectCrlf() + { + $encoder = $this->getEncoder('7bit', true); + $this->assertEquals("a\r\nb", $encoder->encodeString("a\rb"), + '%s: Line endings should be standardized' + ); + $this->assertEquals("a\r\nb", $encoder->encodeString("a\nb"), + '%s: Line endings should be standardized' + ); + $this->assertEquals("a\r\n\r\nb", $encoder->encodeString("a\n\rb"), + '%s: Line endings should be standardized' + ); + $this->assertEquals("a\r\n\r\nb", $encoder->encodeString("a\r\rb"), + '%s: Line endings should be standardized' + ); + $this->assertEquals("a\r\n\r\nb", $encoder->encodeString("a\n\nb"), + '%s: Line endings should be standardized' + ); + } + + public function crlfProvider() + { + return [ + ["\r", "a\r\nb"], + ["\n", "a\r\nb"], + ["\n\r", "a\r\n\r\nb"], + ["\n\n", "a\r\n\r\nb"], + ["\r\r", "a\r\n\r\nb"], + ]; + } + + /** + * @dataProvider crlfProvider + */ + public function testCanonicEncodeByteStreamGeneratesCorrectCrlf($test, $expected) + { + $encoder = $this->getEncoder('7bit', true); + + $os = $this->createOutputByteStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $os->shouldReceive('read') + ->once() + ->andReturn('a'); + $os->shouldReceive('read') + ->once() + ->andReturn($test); + $os->shouldReceive('read') + ->once() + ->andReturn('b'); + $os->shouldReceive('read') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder->encodeByteStream($os, $is); + $this->assertEquals($expected, $collection->content); + } + + private function getEncoder($name, $canonical = false) + { + return new Swift_Mime_ContentEncoder_PlainContentEncoder($name, $canonical); + } + + private function createOutputByteStream($stub = false) + { + return $this->getMockery('Swift_OutputByteStream')->shouldIgnoreMissing(); + } + + private function createInputByteStream($stub = false) + { + return $this->getMockery('Swift_InputByteStream')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php new file mode 100644 index 0000000..4e050a1 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php @@ -0,0 +1,516 @@ +createCharacterStream(true) + ); + $this->assertEquals('quoted-printable', $encoder->getName()); + } + + /* -- RFC 2045, 6.7 -- + (1) (General 8bit representation) Any octet, except a CR or + LF that is part of a CRLF line break of the canonical + (standard) form of the data being encoded, may be + represented by an "=" followed by a two digit + hexadecimal representation of the octet's value. The + digits of the hexadecimal alphabet, for this purpose, + are "0123456789ABCDEF". Uppercase letters must be + used; lowercase letters are not allowed. Thus, for + example, the decimal value 12 (US-ASCII form feed) can + be represented by "=0C", and the decimal value 61 (US- + ASCII EQUAL SIGN) can be represented by "=3D". This + rule must be followed except when the following rules + allow an alternative encoding. + */ + + public function testPermittedCharactersAreNotEncoded() + { + /* -- RFC 2045, 6.7 -- + (2) (Literal representation) Octets with decimal values of + 33 through 60 inclusive, and 62 through 126, inclusive, + MAY be represented as the US-ASCII characters which + correspond to those octets (EXCLAMATION POINT through + LESS THAN, and GREATER THAN through TILDE, + respectively). + */ + + foreach (array_merge(range(33, 60), range(62, 126)) as $ordinal) { + $char = chr($ordinal); + + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$ordinal]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + $this->assertIdenticalBinary($char, $collection->content); + } + } + + public function testLinearWhiteSpaceAtLineEndingIsEncoded() + { + /* -- RFC 2045, 6.7 -- + (3) (White Space) Octets with values of 9 and 32 MAY be + represented as US-ASCII TAB (HT) and SPACE characters, + respectively, but MUST NOT be so represented at the end + of an encoded line. Any TAB (HT) or SPACE characters + on an encoded line MUST thus be followed on that line + by a printable character. In particular, an "=" at the + end of an encoded line, indicating a soft line break + (see rule #5) may follow one or more TAB (HT) or SPACE + characters. It follows that an octet with decimal + value 9 or 32 appearing at the end of an encoded line + must be represented according to Rule #1. This rule is + necessary because some MTAs (Message Transport Agents, + programs which transport messages from one user to + another, or perform a portion of such transfers) are + known to pad lines of text with SPACEs, and others are + known to remove "white space" characters from the end + of a line. Therefore, when decoding a Quoted-Printable + body, any trailing white space on a line must be + deleted, as it will necessarily have been added by + intermediate transport agents. + */ + + $HT = chr(0x09); //9 + $SPACE = chr(0x20); //32 + + //HT + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x09]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x09]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0D]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0A]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + + $this->assertEquals("a\t=09\r\nb", $collection->content); + + //SPACE + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x20]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x20]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0D]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0A]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + + $this->assertEquals("a =20\r\nb", $collection->content); + } + + public function testCRLFIsLeftAlone() + { + /* + (4) (Line Breaks) A line break in a text body, represented + as a CRLF sequence in the text canonical form, must be + represented by a (RFC 822) line break, which is also a + CRLF sequence, in the Quoted-Printable encoding. Since + the canonical representation of media types other than + text do not generally include the representation of + line breaks as CRLF sequences, no hard line breaks + (i.e. line breaks that are intended to be meaningful + and to be displayed to the user) can occur in the + quoted-printable encoding of such types. Sequences + like "=0D", "=0A", "=0A=0D" and "=0D=0A" will routinely + appear in non-text data represented in quoted- + printable, of course. + + Note that many implementations may elect to encode the + local representation of various content types directly + rather than converting to canonical form first, + encoding, and then converting back to local + representation. In particular, this may apply to plain + text material on systems that use newline conventions + other than a CRLF terminator sequence. Such an + implementation optimization is permissible, but only + when the combined canonicalization-encoding step is + equivalent to performing the three steps separately. + */ + + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0D]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0A]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0D]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0A]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('c')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0D]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x0A]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + $this->assertEquals("a\r\nb\r\nc\r\n", $collection->content); + } + + public function testLinesLongerThan76CharactersAreSoftBroken() + { + /* + (5) (Soft Line Breaks) The Quoted-Printable encoding + REQUIRES that encoded lines be no more than 76 + characters long. If longer lines are to be encoded + with the Quoted-Printable encoding, "soft" line breaks + must be used. An equal sign as the last character on a + encoded line indicates such a non-significant ("soft") + line break in the encoded text. + */ + + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + + for ($seq = 0; $seq <= 140; ++$seq) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + } + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + $this->assertEquals(str_repeat('a', 75)."=\r\n".str_repeat('a', 66), $collection->content); + } + + public function testMaxLineLengthCanBeSpecified() + { + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + + for ($seq = 0; $seq <= 100; ++$seq) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + } + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is, 0, 54); + $this->assertEquals(str_repeat('a', 53)."=\r\n".str_repeat('a', 48), $collection->content); + } + + public function testBytesBelowPermittedRangeAreEncoded() + { + /* + According to Rule (1 & 2) + */ + + foreach (range(0, 32) as $ordinal) { + $char = chr($ordinal); + + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$ordinal]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + $this->assertEquals(sprintf('=%02X', $ordinal), $collection->content); + } + } + + public function testDecimalByte61IsEncoded() + { + /* + According to Rule (1 & 2) + */ + + $char = chr(61); + + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([61]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + $this->assertEquals(sprintf('=%02X', 61), $collection->content); + } + + public function testBytesAbovePermittedRangeAreEncoded() + { + /* + According to Rule (1 & 2) + */ + + foreach (range(127, 255) as $ordinal) { + $char = chr($ordinal); + + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$ordinal]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is); + $this->assertEquals(sprintf('=%02X', $ordinal), $collection->content); + } + } + + public function testFirstLineLengthCanBeDifferent() + { + $os = $this->createOutputByteStream(true); + $charStream = $this->createCharacterStream(); + $is = $this->createInputByteStream(); + $collection = new Swift_StreamCollector(); + + $is->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturnUsing($collection); + $charStream->shouldReceive('flushContents') + ->once(); + $charStream->shouldReceive('importByteStream') + ->once() + ->with($os); + + for ($seq = 0; $seq <= 140; ++$seq) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + } + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + $encoder->encodeByteStream($os, $is, 22); + $this->assertEquals( + str_repeat('a', 53)."=\r\n".str_repeat('a', 75)."=\r\n".str_repeat('a', 13), + $collection->content + ); + } + + public function testObserverInterfaceCanChangeCharset() + { + $stream = $this->createCharacterStream(); + $stream->shouldReceive('setCharacterSet') + ->once() + ->with('windows-1252'); + + $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($stream); + $encoder->charsetChanged('windows-1252'); + } + + public function testTextIsPreWrapped() + { + $encoder = $this->createEncoder(); + + $input = str_repeat('a', 70)."\r\n". + str_repeat('a', 70)."\r\n". + str_repeat('a', 70); + + $os = new Swift_ByteStream_ArrayByteStream(); + $is = new Swift_ByteStream_ArrayByteStream(); + $is->write($input); + + $encoder->encodeByteStream($is, $os); + + $this->assertEquals( + $input, $os->read(PHP_INT_MAX) + ); + } + + private function createCharacterStream($stub = false) + { + return $this->getMockery('Swift_CharacterStream')->shouldIgnoreMissing(); + } + + private function createEncoder() + { + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $charStream = new Swift_CharacterStream_NgCharacterStream($factory, 'utf-8'); + + return new Swift_Mime_ContentEncoder_QpContentEncoder($charStream); + } + + private function createOutputByteStream($stub = false) + { + return $this->getMockery('Swift_OutputByteStream')->shouldIgnoreMissing(); + } + + private function createInputByteStream($stub = false) + { + return $this->getMockery('Swift_InputByteStream')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php new file mode 100644 index 0000000..74f2acc --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php @@ -0,0 +1,59 @@ +addToAssertionCount(1); + } + + public function testNestingLevelIsEmbedded() + { + $file = $this->createEmbeddedFile($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals( + Swift_Mime_SimpleMimeEntity::LEVEL_RELATED, $file->getNestingLevel() + ); + } + + public function testIdIsAutoGenerated() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addIdHeader') + ->once() + ->with('Content-ID', '/^.*?@.*?$/D'); + + $file = $this->createEmbeddedFile($headers, $this->createEncoder(), + $this->createCache() + ); + } + + public function testDefaultDispositionIsInline() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addParameterizedHeader') + ->once() + ->with('Content-Disposition', 'inline'); + $headers->shouldReceive('addParameterizedHeader') + ->zeroOrMoreTimes(); + + $file = $this->createEmbeddedFile($headers, $this->createEncoder(), + $this->createCache() + ); + } + + protected function createAttachment($headers, $encoder, $cache, $mimeTypes = []) + { + return $this->createEmbeddedFile($headers, $encoder, $cache, $mimeTypes); + } + + private function createEmbeddedFile($headers, $encoder, $cache) + { + $idGenerator = new Swift_Mime_IdGenerator('example.com'); + + return new Swift_Mime_EmbeddedFile($headers, $encoder, $cache, $idGenerator); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php new file mode 100644 index 0000000..0db5407 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php @@ -0,0 +1,13 @@ +assertEquals('B', $encoder->getName()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php new file mode 100644 index 0000000..1b42300 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php @@ -0,0 +1,221 @@ +createEncoder( + $this->createCharacterStream(true) + ); + $this->assertEquals('Q', $encoder->getName()); + } + + public function testSpaceAndTabNeverAppear() + { + /* -- RFC 2047, 4. + Only a subset of the printable ASCII characters may be used in + 'encoded-text'. Space and tab characters are not allowed, so that + the beginning and end of an 'encoded-word' are obvious. + */ + + $charStream = $this->createCharacterStream(); + $charStream->shouldReceive('readBytes') + ->atLeast()->times(6) + ->andReturn([ord('a')], [0x20], [0x09], [0x20], [ord('b')], false); + + $encoder = $this->createEncoder($charStream); + $this->assertNotRegExp('~[ \t]~', $encoder->encodeString("a \t b"), + '%s: encoded-words in headers cannot contain LWSP as per RFC 2047.' + ); + } + + public function testSpaceIsRepresentedByUnderscore() + { + /* -- RFC 2047, 4.2. + (2) The 8-bit hexadecimal value 20 (e.g., ISO-8859-1 SPACE) may be + represented as "_" (underscore, ASCII 95.). (This character may + not pass through some internetwork mail gateways, but its use + will greatly enhance readability of "Q" encoded data with mail + readers that do not support this encoding.) Note that the "_" + always represents hexadecimal 20, even if the SPACE character + occupies a different code position in the character set in use. + */ + $charStream = $this->createCharacterStream(); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([0x20]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('b')]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = $this->createEncoder($charStream); + $this->assertEquals('a_b', $encoder->encodeString('a b'), + '%s: Spaces can be represented by more readable underscores as per RFC 2047.' + ); + } + + public function testEqualsAndQuestionAndUnderscoreAreEncoded() + { + /* -- RFC 2047, 4.2. + (3) 8-bit values which correspond to printable ASCII characters other + than "=", "?", and "_" (underscore), MAY be represented as those + characters. (But see section 5 for restrictions.) In + particular, SPACE and TAB MUST NOT be represented as themselves + within encoded words. + */ + $charStream = $this->createCharacterStream(); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('=')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('?')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('_')]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = $this->createEncoder($charStream); + $this->assertEquals('=3D=3F=5F', $encoder->encodeString('=?_'), + '%s: Chars =, ? and _ (underscore) may not appear as per RFC 2047.' + ); + } + + public function testParensAndQuotesAreEncoded() + { + /* -- RFC 2047, 5 (2). + A "Q"-encoded 'encoded-word' which appears in a 'comment' MUST NOT + contain the characters "(", ")" or " + */ + + $charStream = $this->createCharacterStream(); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('(')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('"')]); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord(')')]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = $this->createEncoder($charStream); + $this->assertEquals('=28=22=29', $encoder->encodeString('(")'), + '%s: Chars (, " (DQUOTE) and ) may not appear as per RFC 2047.' + ); + } + + public function testOnlyCharactersAllowedInPhrasesAreUsed() + { + /* -- RFC 2047, 5. + (3) As a replacement for a 'word' entity within a 'phrase', for example, + one that precedes an address in a From, To, or Cc header. The ABNF + definition for 'phrase' from RFC 822 thus becomes: + + phrase = 1*( encoded-word / word ) + + In this case the set of characters that may be used in a "Q"-encoded + 'encoded-word' is restricted to: . An 'encoded-word' that appears within a + 'phrase' MUST be separated from any adjacent 'word', 'text' or + 'special' by 'linear-white-space'. + */ + + $allowedBytes = array_merge( + range(ord('a'), ord('z')), range(ord('A'), ord('Z')), + range(ord('0'), ord('9')), + [ord('!'), ord('*'), ord('+'), ord('-'), ord('/')] + ); + + foreach (range(0x00, 0xFF) as $byte) { + $char = pack('C', $byte); + + $charStream = $this->createCharacterStream(); + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([$byte]); + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = $this->createEncoder($charStream); + $encodedChar = $encoder->encodeString($char); + + if (in_array($byte, $allowedBytes)) { + $this->assertEquals($char, $encodedChar, + '%s: Character '.$char.' should not be encoded.' + ); + } elseif (0x20 == $byte) { + //Special case + $this->assertEquals('_', $encodedChar, + '%s: Space character should be replaced.' + ); + } else { + $this->assertEquals(sprintf('=%02X', $byte), $encodedChar, + '%s: Byte '.$byte.' should be encoded.' + ); + } + } + } + + public function testEqualsNeverAppearsAtEndOfLine() + { + /* -- RFC 2047, 5 (3). + The 'encoded-text' in an 'encoded-word' must be self-contained; + 'encoded-text' MUST NOT be continued from one 'encoded-word' to + another. This implies that the 'encoded-text' portion of a "B" + 'encoded-word' will be a multiple of 4 characters long; for a "Q" + 'encoded-word', any "=" character that appears in the 'encoded-text' + portion will be followed by two hexadecimal characters. + */ + + $input = str_repeat('a', 140); + + $charStream = $this->createCharacterStream(); + + $output = ''; + $seq = 0; + for (; $seq < 140; ++$seq) { + $charStream->shouldReceive('readBytes') + ->once() + ->andReturn([ord('a')]); + + if (75 == $seq) { + $output .= "\r\n"; // =\r\n + } + $output .= 'a'; + } + + $charStream->shouldReceive('readBytes') + ->zeroOrMoreTimes() + ->andReturn(false); + + $encoder = $this->createEncoder($charStream); + $this->assertEquals($output, $encoder->encodeString($input)); + } + + private function createEncoder($charStream) + { + return new Swift_Mime_HeaderEncoder_QpHeaderEncoder($charStream); + } + + private function createCharacterStream($stub = false) + { + return $this->getMockery('Swift_CharacterStream')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php new file mode 100644 index 0000000..e419306 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php @@ -0,0 +1,90 @@ +getHeader('Date'); + $this->assertEquals(Swift_Mime_Header::TYPE_DATE, $header->getFieldType()); + } + + public function testGetDateTime() + { + $dateTime = new DateTimeImmutable(); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + $this->assertSame($dateTime, $header->getDateTime()); + } + + public function testDateTimeCanBeSetBySetter() + { + $dateTime = new DateTimeImmutable(); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + $this->assertSame($dateTime, $header->getDateTime()); + } + + public function testDateTimeIsConvertedToImmutable() + { + $dateTime = new DateTime(); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + $this->assertInstanceOf('DateTimeImmutable', $header->getDateTime()); + $this->assertEquals($dateTime->getTimestamp(), $header->getDateTime()->getTimestamp()); + $this->assertEquals($dateTime->getTimezone(), $header->getDateTime()->getTimezone()); + } + + public function testDateTimeIsImmutable() + { + $dateTime = new DateTime('2000-01-01 12:00:00 Europe/Berlin'); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + + $dateTime->setDate(2002, 2, 2); + $this->assertEquals('Sat, 01 Jan 2000 12:00:00 +0100', $header->getDateTime()->format('r')); + $this->assertEquals('Sat, 01 Jan 2000 12:00:00 +0100', $header->getFieldBody()); + } + + public function testDateTimeIsConvertedToRfc2822Date() + { + $dateTime = new DateTimeImmutable('2000-01-01 12:00:00 Europe/Berlin'); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + $this->assertEquals('Sat, 01 Jan 2000 12:00:00 +0100', $header->getFieldBody()); + } + + public function testSetBodyModel() + { + $dateTime = new DateTimeImmutable(); + $header = $this->getHeader('Date'); + $header->setFieldBodyModel($dateTime); + $this->assertEquals($dateTime->format('r'), $header->getFieldBody()); + } + + public function testGetBodyModel() + { + $dateTime = new DateTimeImmutable(); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + $this->assertEquals($dateTime, $header->getFieldBodyModel()); + } + + public function testToString() + { + $dateTime = new DateTimeImmutable('2000-01-01 12:00:00 Europe/Berlin'); + $header = $this->getHeader('Date'); + $header->setDateTime($dateTime); + $this->assertEquals("Date: Sat, 01 Jan 2000 12:00:00 +0100\r\n", + $header->toString() + ); + } + + private function getHeader($name) + { + return new Swift_Mime_Headers_DateHeader($name); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php new file mode 100644 index 0000000..0d2edb7 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php @@ -0,0 +1,192 @@ +getHeader('Message-ID'); + $this->assertEquals(Swift_Mime_Header::TYPE_ID, $header->getFieldType()); + } + + public function testValueMatchesMsgIdSpec() + { + /* -- RFC 2822, 3.6.4. + message-id = "Message-ID:" msg-id CRLF + + in-reply-to = "In-Reply-To:" 1*msg-id CRLF + + references = "References:" 1*msg-id CRLF + + msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS] + + id-left = dot-atom-text / no-fold-quote / obs-id-left + + id-right = dot-atom-text / no-fold-literal / obs-id-right + + no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE + + no-fold-literal = "[" *(dtext / quoted-pair) "]" + */ + + $header = $this->getHeader('Message-ID'); + $header->setId('id-left@id-right'); + $this->assertEquals('', $header->getFieldBody()); + } + + public function testIdCanBeRetrievedVerbatim() + { + $header = $this->getHeader('Message-ID'); + $header->setId('id-left@id-right'); + $this->assertEquals('id-left@id-right', $header->getId()); + } + + public function testMultipleIdsCanBeSet() + { + $header = $this->getHeader('References'); + $header->setIds(['a@b', 'x@y']); + $this->assertEquals(['a@b', 'x@y'], $header->getIds()); + } + + public function testSettingMultipleIdsProducesAListValue() + { + /* -- RFC 2822, 3.6.4. + The "References:" and "In-Reply-To:" field each contain one or more + unique message identifiers, optionally separated by CFWS. + + .. SNIP .. + + in-reply-to = "In-Reply-To:" 1*msg-id CRLF + + references = "References:" 1*msg-id CRLF + */ + + $header = $this->getHeader('References'); + $header->setIds(['a@b', 'x@y']); + $this->assertEquals(' ', $header->getFieldBody()); + } + + public function testIdLeftCanBeQuoted() + { + /* -- RFC 2822, 3.6.4. + id-left = dot-atom-text / no-fold-quote / obs-id-left + */ + + $header = $this->getHeader('References'); + $header->setId('"ab"@c'); + $this->assertEquals('"ab"@c', $header->getId()); + $this->assertEquals('<"ab"@c>', $header->getFieldBody()); + } + + public function testIdLeftCanContainAnglesAsQuotedPairs() + { + /* -- RFC 2822, 3.6.4. + no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE + */ + + $header = $this->getHeader('References'); + $header->setId('"a\\<\\>b"@c'); + $this->assertEquals('"a\\<\\>b"@c', $header->getId()); + $this->assertEquals('<"a\\<\\>b"@c>', $header->getFieldBody()); + } + + public function testIdLeftCanBeDotAtom() + { + $header = $this->getHeader('References'); + $header->setId('a.b+&%$.c@d'); + $this->assertEquals('a.b+&%$.c@d', $header->getId()); + $this->assertEquals('', $header->getFieldBody()); + } + + /** + * @expectedException \Exception + * @expectedMessageException "a b c" is not valid id-left + */ + public function testInvalidIdLeftThrowsException() + { + $header = $this->getHeader('References'); + $header->setId('a b c@d'); + } + + public function testIdRightCanBeDotAtom() + { + /* -- RFC 2822, 3.6.4. + id-right = dot-atom-text / no-fold-literal / obs-id-right + */ + + $header = $this->getHeader('References'); + $header->setId('a@b.c+&%$.d'); + $this->assertEquals('a@b.c+&%$.d', $header->getId()); + $this->assertEquals('', $header->getFieldBody()); + } + + public function testIdRightCanBeLiteral() + { + /* -- RFC 2822, 3.6.4. + no-fold-literal = "[" *(dtext / quoted-pair) "]" + */ + + $header = $this->getHeader('References'); + $header->setId('a@[1.2.3.4]'); + $this->assertEquals('a@[1.2.3.4]', $header->getId()); + $this->assertEquals('', $header->getFieldBody()); + } + + public function testIdRigthIsIdnEncoded() + { + $header = $this->getHeader('References'); + $header->setId('a@ä'); + $this->assertEquals('a@ä', $header->getId()); + $this->assertEquals('', $header->getFieldBody()); + } + + /** + * @expectedException \Exception + * @expectedMessageException "b c d" is not valid id-right + */ + public function testInvalidIdRightThrowsException() + { + $header = $this->getHeader('References'); + $header->setId('a@b c d'); + } + + /** + * @expectedException \Exception + * @expectedMessageException "abc" is does not contain @ + */ + public function testMissingAtSignThrowsException() + { + /* -- RFC 2822, 3.6.4. + msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS] + */ + $header = $this->getHeader('References'); + $header->setId('abc'); + } + + public function testSetBodyModel() + { + $header = $this->getHeader('Message-ID'); + $header->setFieldBodyModel('a@b'); + $this->assertEquals(['a@b'], $header->getIds()); + } + + public function testGetBodyModel() + { + $header = $this->getHeader('Message-ID'); + $header->setId('a@b'); + $this->assertEquals(['a@b'], $header->getFieldBodyModel()); + } + + public function testStringValue() + { + $header = $this->getHeader('References'); + $header->setIds(['a@b', 'x@y']); + $this->assertEquals('References: '."\r\n", $header->toString()); + } + + private function getHeader($name) + { + return new Swift_Mime_Headers_IdentificationHeader($name, new EmailValidator(), new Swift_AddressEncoder_IdnAddressEncoder()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php new file mode 100644 index 0000000..f64f5db --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php @@ -0,0 +1,367 @@ +getHeader('To'); + $this->assertEquals(Swift_Mime_Header::TYPE_MAILBOX, $header->getFieldType()); + } + + public function testMailboxIsSetForAddress() + { + $header = $this->getHeader('From'); + $header->setAddresses('chris@swiftmailer.org'); + $this->assertEquals(['chris@swiftmailer.org'], + $header->getNameAddressStrings() + ); + } + + public function testMailboxIsRenderedForNameAddress() + { + $header = $this->getHeader('From'); + $header->setNameAddresses(['chris@swiftmailer.org' => 'Chris Corbyn']); + $this->assertEquals( + ['Chris Corbyn '], $header->getNameAddressStrings() + ); + } + + public function testAddressCanBeReturnedForAddress() + { + $header = $this->getHeader('From'); + $header->setAddresses('chris@swiftmailer.org'); + $this->assertEquals(['chris@swiftmailer.org'], $header->getAddresses()); + } + + public function testAddressCanBeReturnedForNameAddress() + { + $header = $this->getHeader('From'); + $header->setNameAddresses(['chris@swiftmailer.org' => 'Chris Corbyn']); + $this->assertEquals(['chris@swiftmailer.org'], $header->getAddresses()); + } + + public function testQuotesInNameAreQuoted() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn, "DHE"', + ]); + $this->assertEquals( + ['"Chris Corbyn, \"DHE\"" '], + $header->getNameAddressStrings() + ); + } + + public function testEscapeCharsInNameAreQuoted() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn, \\escaped\\', + ]); + $this->assertEquals( + ['"Chris Corbyn, \\\\escaped\\\\" '], + $header->getNameAddressStrings() + ); + } + + public function testUtf8CharsInDomainAreIdnEncoded() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swïftmailer.org' => 'Chris Corbyn', + ]); + $this->assertEquals( + ['Chris Corbyn '], + $header->getNameAddressStrings() + ); + } + + /** + * @expectedException \Swift_AddressEncoderException + */ + public function testUtf8CharsInLocalPartThrows() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chrïs@swiftmailer.org' => 'Chris Corbyn', + ]); + $header->getNameAddressStrings(); + } + + public function testUtf8CharsInEmail() + { + $header = $this->getHeader('From', null, new Swift_AddressEncoder_Utf8AddressEncoder()); + $header->setNameAddresses([ + 'chrïs@swïftmailer.org' => 'Chris Corbyn', + ]); + $this->assertEquals( + ['Chris Corbyn '], + $header->getNameAddressStrings() + ); + } + + public function testGetMailboxesReturnsNameValuePairs() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn, DHE', + ]); + $this->assertEquals( + ['chris@swiftmailer.org' => 'Chris Corbyn, DHE'], $header->getNameAddresses() + ); + } + + public function testMultipleAddressesCanBeSetAndFetched() + { + $header = $this->getHeader('From'); + $header->setAddresses([ + 'chris@swiftmailer.org', 'mark@swiftmailer.org', + ]); + $this->assertEquals( + ['chris@swiftmailer.org', 'mark@swiftmailer.org'], + $header->getAddresses() + ); + } + + public function testMultipleAddressesAsMailboxes() + { + $header = $this->getHeader('From'); + $header->setAddresses([ + 'chris@swiftmailer.org', 'mark@swiftmailer.org', + ]); + $this->assertEquals( + ['chris@swiftmailer.org' => null, 'mark@swiftmailer.org' => null], + $header->getNameAddresses() + ); + } + + public function testMultipleAddressesAsMailboxStrings() + { + $header = $this->getHeader('From'); + $header->setAddresses([ + 'chris@swiftmailer.org', 'mark@swiftmailer.org', + ]); + $this->assertEquals( + ['chris@swiftmailer.org', 'mark@swiftmailer.org'], + $header->getNameAddressStrings() + ); + } + + public function testMultipleNamedMailboxesReturnsMultipleAddresses() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $this->assertEquals( + ['chris@swiftmailer.org', 'mark@swiftmailer.org'], + $header->getAddresses() + ); + } + + public function testMultipleNamedMailboxesReturnsMultipleMailboxes() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $this->assertEquals([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ], + $header->getNameAddresses() + ); + } + + public function testMultipleMailboxesProducesMultipleMailboxStrings() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $this->assertEquals([ + 'Chris Corbyn ', + 'Mark Corbyn ', + ], + $header->getNameAddressStrings() + ); + } + + public function testSetAddressesOverwritesAnyMailboxes() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $this->assertEquals( + ['chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', ], + $header->getNameAddresses() + ); + $this->assertEquals( + ['chris@swiftmailer.org', 'mark@swiftmailer.org'], + $header->getAddresses() + ); + + $header->setAddresses(['chris@swiftmailer.org', 'mark@swiftmailer.org']); + + $this->assertEquals( + ['chris@swiftmailer.org' => null, 'mark@swiftmailer.org' => null], + $header->getNameAddresses() + ); + $this->assertEquals( + ['chris@swiftmailer.org', 'mark@swiftmailer.org'], + $header->getAddresses() + ); + } + + public function testNameIsEncodedIfNonAscii() + { + $name = 'C'.pack('C', 0x8F).'rbyn'; + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($name, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('C=8Frbyn'); + + $header = $this->getHeader('From', $encoder); + $header->setNameAddresses(['chris@swiftmailer.org' => 'Chris '.$name]); + + $addresses = $header->getNameAddressStrings(); + $this->assertEquals( + 'Chris =?'.$this->charset.'?Q?C=8Frbyn?= ', + array_shift($addresses) + ); + } + + public function testEncodingLineLengthCalculations() + { + /* -- RFC 2047, 2. + An 'encoded-word' may not be more than 75 characters long, including + 'charset', 'encoding', 'encoded-text', and delimiters. + */ + + $name = 'C'.pack('C', 0x8F).'rbyn'; + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($name, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('C=8Frbyn'); + + $header = $this->getHeader('From', $encoder); + $header->setNameAddresses(['chris@swiftmailer.org' => 'Chris '.$name]); + + $header->getNameAddressStrings(); + } + + public function testGetValueReturnsMailboxStringValue() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + ]); + $this->assertEquals( + 'Chris Corbyn ', $header->getFieldBody() + ); + } + + public function testGetValueReturnsMailboxStringValueForMultipleMailboxes() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $this->assertEquals( + 'Chris Corbyn , Mark Corbyn ', + $header->getFieldBody() + ); + } + + public function testRemoveAddressesWithSingleValue() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $header->removeAddresses('chris@swiftmailer.org'); + $this->assertEquals(['mark@swiftmailer.org'], + $header->getAddresses() + ); + } + + public function testRemoveAddressesWithList() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $header->removeAddresses( + ['chris@swiftmailer.org', 'mark@swiftmailer.org'] + ); + $this->assertEquals([], $header->getAddresses()); + } + + public function testSetBodyModel() + { + $header = $this->getHeader('From'); + $header->setFieldBodyModel('chris@swiftmailer.org'); + $this->assertEquals(['chris@swiftmailer.org' => null], $header->getNameAddresses()); + } + + public function testGetBodyModel() + { + $header = $this->getHeader('From'); + $header->setAddresses(['chris@swiftmailer.org']); + $this->assertEquals(['chris@swiftmailer.org' => null], $header->getFieldBodyModel()); + } + + public function testToString() + { + $header = $this->getHeader('From'); + $header->setNameAddresses([ + 'chris@swiftmailer.org' => 'Chris Corbyn', + 'mark@swiftmailer.org' => 'Mark Corbyn', + ]); + $this->assertEquals( + 'From: Chris Corbyn , '. + 'Mark Corbyn '."\r\n", + $header->toString() + ); + } + + private function getHeader($name, $encoder = null, $addressEncoder = null) + { + $encoder = $encoder ?? $this->getEncoder('Q', true); + $addressEncoder = $addressEncoder ?? new Swift_AddressEncoder_IdnAddressEncoder(); + $header = new Swift_Mime_Headers_MailboxHeader($name, $encoder, new EmailValidator(), $addressEncoder); + $header->setCharset($this->charset); + + return $header; + } + + private function getEncoder($type) + { + $encoder = $this->getMockery('Swift_Mime_HeaderEncoder')->shouldIgnoreMissing(); + $encoder->shouldReceive('getName') + ->zeroOrMoreTimes() + ->andReturn($type); + + return $encoder; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php new file mode 100644 index 0000000..c90b05b --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php @@ -0,0 +1,396 @@ +getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $this->assertEquals(Swift_Mime_Header::TYPE_PARAMETERIZED, $header->getFieldType()); + } + + public function testValueIsReturnedVerbatim() + { + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setValue('text/plain'); + $this->assertEquals('text/plain', $header->getValue()); + } + + public function testParametersAreAppended() + { + /* -- RFC 2045, 5.1 + parameter := attribute "=" value + + attribute := token + ; Matching of attributes + ; is ALWAYS case-insensitive. + + value := token / quoted-string + + token := 1* + + tspecials := "(" / ")" / "<" / ">" / "@" / + "," / ";" / ":" / "\" / <"> + "/" / "[" / "]" / "?" / "=" + ; Must be in quoted-string, + ; to use within parameter values + */ + + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setValue('text/plain'); + $header->setParameters(['charset' => 'utf-8']); + $this->assertEquals('text/plain; charset=utf-8', $header->getFieldBody()); + } + + public function testSpaceInParamResultsInQuotedString() + { + $header = $this->getHeader('Content-Disposition', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setValue('attachment'); + $header->setParameters(['filename' => 'my file.txt']); + $this->assertEquals('attachment; filename="my file.txt"', + $header->getFieldBody() + ); + } + + public function testLongParamsAreBrokenIntoMultipleAttributeStrings() + { + /* -- RFC 2231, 3. + The asterisk character ("*") followed + by a decimal count is employed to indicate that multiple parameters + are being used to encapsulate a single parameter value. The count + starts at 0 and increments by 1 for each subsequent section of the + parameter value. Decimal values are used and neither leading zeroes + nor gaps in the sequence are allowed. + + The original parameter value is recovered by concatenating the + various sections of the parameter, in order. For example, the + content-type field + + Content-Type: message/external-body; access-type=URL; + URL*0="ftp://"; + URL*1="cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar" + + is semantically identical to + + Content-Type: message/external-body; access-type=URL; + URL="ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar" + + Note that quotes around parameter values are part of the value + syntax; they are NOT part of the value itself. Furthermore, it is + explicitly permitted to have a mixture of quoted and unquoted + continuation fields. + */ + + $value = str_repeat('a', 180); + + $encoder = $this->getParameterEncoder(); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), 63, \Mockery::any()) + ->andReturn(str_repeat('a', 63)."\r\n". + str_repeat('a', 63)."\r\n".str_repeat('a', 54)); + + $header = $this->getHeader('Content-Disposition', + $this->getHeaderEncoder('Q', true), $encoder + ); + $header->setValue('attachment'); + $header->setParameters(['filename' => $value]); + $header->setMaxLineLength(78); + $this->assertEquals( + 'attachment; '. + 'filename*0*=utf-8\'\''.str_repeat('a', 63).";\r\n ". + 'filename*1*='.str_repeat('a', 63).";\r\n ". + 'filename*2*='.str_repeat('a', 54), + $header->getFieldBody() + ); + } + + public function testEncodedParamDataIncludesCharsetAndLanguage() + { + /* -- RFC 2231, 4. + Asterisks ("*") are reused to provide the indicator that language and + character set information is present and encoding is being used. A + single quote ("'") is used to delimit the character set and language + information at the beginning of the parameter value. Percent signs + ("%") are used as the encoding flag, which agrees with RFC 2047. + + Specifically, an asterisk at the end of a parameter name acts as an + indicator that character set and language information may appear at + the beginning of the parameter value. A single quote is used to + separate the character set, language, and actual value information in + the parameter value string, and an percent sign is used to flag + octets encoded in hexadecimal. For example: + + Content-Type: application/x-stuff; + title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A + + Note that it is perfectly permissible to leave either the character + set or language field blank. Note also that the single quote + delimiters MUST be present even when one of the field values is + omitted. + */ + + $value = str_repeat('a', 20).pack('C', 0x8F).str_repeat('a', 10); + + $encoder = $this->getParameterEncoder(); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, 12, 62, \Mockery::any()) + ->andReturn(str_repeat('a', 20).'%8F'.str_repeat('a', 10)); + + $header = $this->getHeader('Content-Disposition', + $this->getHeaderEncoder('Q', true), $encoder + ); + $header->setValue('attachment'); + $header->setParameters(['filename' => $value]); + $header->setMaxLineLength(78); + $header->setLanguage($this->lang); + $this->assertEquals( + 'attachment; filename*='.$this->charset."'".$this->lang."'". + str_repeat('a', 20).'%8F'.str_repeat('a', 10), + $header->getFieldBody() + ); + } + + public function testMultipleEncodedParamLinesAreFormattedCorrectly() + { + /* -- RFC 2231, 4.1. + Character set and language information may be combined with the + parameter continuation mechanism. For example: + + Content-Type: application/x-stuff + title*0*=us-ascii'en'This%20is%20even%20more%20 + title*1*=%2A%2A%2Afun%2A%2A%2A%20 + title*2="isn't it!" + + Note that: + + (1) Language and character set information only appear at + the beginning of a given parameter value. + + (2) Continuations do not provide a facility for using more + than one character set or language in the same + parameter value. + + (3) A value presented using multiple continuations may + contain a mixture of encoded and unencoded segments. + + (4) The first segment of a continuation MUST be encoded if + language and character set information are given. + + (5) If the first segment of a continued parameter value is + encoded the language and character set field delimiters + MUST be present even when the fields are left blank. + */ + + $value = str_repeat('a', 20).pack('C', 0x8F).str_repeat('a', 60); + + $encoder = $this->getParameterEncoder(); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, 12, 62, \Mockery::any()) + ->andReturn(str_repeat('a', 20).'%8F'.str_repeat('a', 28)."\r\n". + str_repeat('a', 32)); + + $header = $this->getHeader('Content-Disposition', + $this->getHeaderEncoder('Q', true), $encoder + ); + $header->setValue('attachment'); + $header->setParameters(['filename' => $value]); + $header->setMaxLineLength(78); + $header->setLanguage($this->lang); + $this->assertEquals( + 'attachment; filename*0*='.$this->charset."'".$this->lang."'". + str_repeat('a', 20).'%8F'.str_repeat('a', 28).";\r\n ". + 'filename*1*='.str_repeat('a', 32), + $header->getFieldBody() + ); + } + + public function testToString() + { + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setValue('text/html'); + $header->setParameters(['charset' => 'utf-8']); + $this->assertEquals('Content-Type: text/html; charset=utf-8'."\r\n", + $header->toString() + ); + } + + public function testValueCanBeEncodedIfNonAscii() + { + $value = 'fo'.pack('C', 0x8F).'bar'; + + $encoder = $this->getHeaderEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo=8Fbar'); + + $header = $this->getHeader('X-Foo', $encoder, $this->getParameterEncoder(true)); + $header->setValue($value); + $header->setParameters(['lookslike' => 'foobar']); + $this->assertEquals('X-Foo: =?utf-8?Q?fo=8Fbar?=; lookslike=foobar'."\r\n", + $header->toString() + ); + } + + public function testValueAndParamCanBeEncodedIfNonAscii() + { + $value = 'fo'.pack('C', 0x8F).'bar'; + + $encoder = $this->getHeaderEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo=8Fbar'); + + $paramEncoder = $this->getParameterEncoder(); + $paramEncoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo%8Fbar'); + + $header = $this->getHeader('X-Foo', $encoder, $paramEncoder); + $header->setValue($value); + $header->setParameters(['says' => $value]); + $this->assertEquals("X-Foo: =?utf-8?Q?fo=8Fbar?=; says*=utf-8''fo%8Fbar\r\n", + $header->toString() + ); + } + + public function testParamsAreEncodedWithEncodedWordsIfNoParamEncoderSet() + { + $value = 'fo'.pack('C', 0x8F).'bar'; + + $encoder = $this->getHeaderEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo=8Fbar'); + + $header = $this->getHeader('X-Foo', $encoder, null); + $header->setValue('bar'); + $header->setParameters(['says' => $value]); + $this->assertEquals("X-Foo: bar; says=\"=?utf-8?Q?fo=8Fbar?=\"\r\n", + $header->toString() + ); + } + + public function testLanguageInformationAppearsInEncodedWords() + { + /* -- RFC 2231, 5. + 5. Language specification in Encoded Words + + RFC 2047 provides support for non-US-ASCII character sets in RFC 822 + message header comments, phrases, and any unstructured text field. + This is done by defining an encoded word construct which can appear + in any of these places. Given that these are fields intended for + display, it is sometimes necessary to associate language information + with encoded words as well as just the character set. This + specification extends the definition of an encoded word to allow the + inclusion of such information. This is simply done by suffixing the + character set specification with an asterisk followed by the language + tag. For example: + + From: =?US-ASCII*EN?Q?Keith_Moore?= + */ + + $value = 'fo'.pack('C', 0x8F).'bar'; + + $encoder = $this->getHeaderEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo=8Fbar'); + + $paramEncoder = $this->getParameterEncoder(); + $paramEncoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo%8Fbar'); + + $header = $this->getHeader('X-Foo', $encoder, $paramEncoder); + $header->setLanguage('en'); + $header->setValue($value); + $header->setParameters(['says' => $value]); + $this->assertEquals("X-Foo: =?utf-8*en?Q?fo=8Fbar?=; says*=utf-8'en'fo%8Fbar\r\n", + $header->toString() + ); + } + + public function testSetBodyModel() + { + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setFieldBodyModel('text/html'); + $this->assertEquals('text/html', $header->getValue()); + } + + public function testGetBodyModel() + { + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setValue('text/plain'); + $this->assertEquals('text/plain', $header->getFieldBodyModel()); + } + + public function testSetParameter() + { + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setParameters(['charset' => 'utf-8', 'delsp' => 'yes']); + $header->setParameter('delsp', 'no'); + $this->assertEquals(['charset' => 'utf-8', 'delsp' => 'no'], + $header->getParameters() + ); + } + + public function testGetParameter() + { + $header = $this->getHeader('Content-Type', + $this->getHeaderEncoder('Q', true), $this->getParameterEncoder(true) + ); + $header->setParameters(['charset' => 'utf-8', 'delsp' => 'yes']); + $this->assertEquals('utf-8', $header->getParameter('charset')); + } + + private function getHeader($name, $encoder, $paramEncoder) + { + $header = new Swift_Mime_Headers_ParameterizedHeader($name, $encoder, $paramEncoder); + $header->setCharset($this->charset); + + return $header; + } + + private function getHeaderEncoder($type, $stub = false) + { + $encoder = $this->getMockery('Swift_Mime_HeaderEncoder')->shouldIgnoreMissing(); + $encoder->shouldReceive('getName') + ->zeroOrMoreTimes() + ->andReturn($type); + + return $encoder; + } + + private function getParameterEncoder($stub = false) + { + return $this->getMockery('Swift_Encoder')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php new file mode 100644 index 0000000..045107e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php @@ -0,0 +1,95 @@ +getHeader('Return-Path'); + $this->assertEquals(Swift_Mime_Header::TYPE_PATH, $header->getFieldType()); + } + + public function testSingleAddressCanBeSetAndFetched() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress('chris@swiftmailer.org'); + $this->assertEquals('chris@swiftmailer.org', $header->getAddress()); + } + + /** + * @expectedException \Exception + */ + public function testAddressMustComplyWithRfc2822() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress('chr is@swiftmailer.org'); + } + + public function testValueIsAngleAddrWithValidAddress() + { + /* -- RFC 2822, 3.6.7. + + return = "Return-Path:" path CRLF + + path = ([CFWS] "<" ([CFWS] / addr-spec) ">" [CFWS]) / + obs-path + */ + + $header = $this->getHeader('Return-Path'); + $header->setAddress('chris@swiftmailer.org'); + $this->assertEquals('', $header->getFieldBody()); + } + + public function testAddressIsIdnEncoded() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress('chris@swïftmailer.org'); + $this->assertEquals('', $header->getFieldBody()); + } + + /** + * @expectedException \Swift_AddressEncoderException + */ + public function testAddressMustBeEncodable() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress('chrïs@swiftmailer.org'); + $header->getFieldBody(); + } + + public function testValueIsEmptyAngleBracketsIfEmptyAddressSet() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress(''); + $this->assertEquals('<>', $header->getFieldBody()); + } + + public function testSetBodyModel() + { + $header = $this->getHeader('Return-Path'); + $header->setFieldBodyModel('foo@bar.tld'); + $this->assertEquals('foo@bar.tld', $header->getAddress()); + } + + public function testGetBodyModel() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress('foo@bar.tld'); + $this->assertEquals('foo@bar.tld', $header->getFieldBodyModel()); + } + + public function testToString() + { + $header = $this->getHeader('Return-Path'); + $header->setAddress('chris@swiftmailer.org'); + $this->assertEquals('Return-Path: '."\r\n", + $header->toString() + ); + } + + private function getHeader($name) + { + return new Swift_Mime_Headers_PathHeader($name, new EmailValidator(), new Swift_AddressEncoder_IdnAddressEncoder()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php new file mode 100644 index 0000000..30ccb00 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php @@ -0,0 +1,353 @@ +getHeader('Subject', $this->getEncoder('Q', true)); + $this->assertEquals(Swift_Mime_Header::TYPE_TEXT, $header->getFieldType()); + } + + public function testGetNameReturnsNameVerbatim() + { + $header = $this->getHeader('Subject', $this->getEncoder('Q', true)); + $this->assertEquals('Subject', $header->getFieldName()); + } + + public function testGetValueReturnsValueVerbatim() + { + $header = $this->getHeader('Subject', $this->getEncoder('Q', true)); + $header->setValue('Test'); + $this->assertEquals('Test', $header->getValue()); + } + + public function testBasicStructureIsKeyValuePair() + { + /* -- RFC 2822, 2.2 + Header fields are lines composed of a field name, followed by a colon + (":"), followed by a field body, and terminated by CRLF. + */ + $header = $this->getHeader('Subject', $this->getEncoder('Q', true)); + $header->setValue('Test'); + $this->assertEquals('Subject: Test'."\r\n", $header->toString()); + } + + public function testLongHeadersAreFoldedAtWordBoundary() + { + /* -- RFC 2822, 2.2.3 + Each header field is logically a single line of characters comprising + the field name, the colon, and the field body. For convenience + however, and to deal with the 998/78 character limitations per line, + the field body portion of a header field can be split into a multiple + line representation; this is called "folding". The general rule is + that wherever this standard allows for folding white space (not + simply WSP characters), a CRLF may be inserted before any WSP. + */ + + $value = 'The quick brown fox jumped over the fence, he was a very very '. + 'scary brown fox with a bushy tail'; + $header = $this->getHeader('X-Custom-Header', + $this->getEncoder('Q', true) + ); + $header->setValue($value); + $header->setMaxLineLength(78); //A safe [RFC 2822, 2.2.3] default + /* + X-Custom-Header: The quick brown fox jumped over the fence, he was a very very + scary brown fox with a bushy tail + */ + $this->assertEquals( + 'X-Custom-Header: The quick brown fox jumped over the fence, he was a'. + ' very very'."\r\n".//Folding + ' scary brown fox with a bushy tail'."\r\n", + $header->toString(), '%s: The header should have been folded at 78th char' + ); + } + + public function testPrintableAsciiOnlyAppearsInHeaders() + { + /* -- RFC 2822, 2.2. + A field name MUST be composed of printable US-ASCII characters (i.e., + characters that have values between 33 and 126, inclusive), except + colon. A field body may be composed of any US-ASCII characters, + except for CR and LF. + */ + + $nonAsciiChar = pack('C', 0x8F); + $header = $this->getHeader('X-Test', $this->getEncoder('Q', true)); + $header->setValue($nonAsciiChar); + $this->assertRegExp( + '~^[^:\x00-\x20\x80-\xFF]+: [^\x80-\xFF\r\n]+\r\n$~s', + $header->toString() + ); + } + + public function testEncodedWordsFollowGeneralStructure() + { + /* -- RFC 2047, 1. + Generally, an "encoded-word" is a sequence of printable ASCII + characters that begins with "=?", ends with "?=", and has two "?"s in + between. + */ + + $nonAsciiChar = pack('C', 0x8F); + $header = $this->getHeader('X-Test', $this->getEncoder('Q', true)); + $header->setValue($nonAsciiChar); + $this->assertRegExp( + '~^X-Test: \=?.*?\?.*?\?.*?\?=\r\n$~s', + $header->toString() + ); + } + + public function testEncodedWordIncludesCharsetAndEncodingMethodAndText() + { + /* -- RFC 2047, 2. + An 'encoded-word' is defined by the following ABNF grammar. The + notation of RFC 822 is used, with the exception that white space + characters MUST NOT appear between components of an 'encoded-word'. + + encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" + */ + + $nonAsciiChar = pack('C', 0x8F); + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($nonAsciiChar, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('=8F'); + + $header = $this->getHeader('X-Test', $encoder); + $header->setValue($nonAsciiChar); + $this->assertEquals( + 'X-Test: =?'.$this->charset.'?Q?=8F?='."\r\n", + $header->toString() + ); + } + + public function testEncodedWordsAreUsedToEncodedNonPrintableAscii() + { + //SPACE and TAB permitted + $nonPrintableBytes = array_merge( + range(0x00, 0x08), range(0x10, 0x19), [0x7F] + ); + + foreach ($nonPrintableBytes as $byte) { + $char = pack('C', $byte); + $encodedChar = sprintf('=%02X', $byte); + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($char, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn($encodedChar); + + $header = $this->getHeader('X-A', $encoder); + $header->setValue($char); + + $this->assertEquals( + 'X-A: =?'.$this->charset.'?Q?'.$encodedChar.'?='."\r\n", + $header->toString(), '%s: Non-printable ascii should be encoded' + ); + } + } + + public function testEncodedWordsAreUsedToEncode8BitOctets() + { + foreach (range(0x80, 0xFF) as $byte) { + $char = pack('C', $byte); + $encodedChar = sprintf('=%02X', $byte); + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($char, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn($encodedChar); + + $header = $this->getHeader('X-A', $encoder); + $header->setValue($char); + + $this->assertEquals( + 'X-A: =?'.$this->charset.'?Q?'.$encodedChar.'?='."\r\n", + $header->toString(), '%s: 8-bit octets should be encoded' + ); + } + } + + public function testEncodedWordsAreNoMoreThan75CharsPerLine() + { + /* -- RFC 2047, 2. + An 'encoded-word' may not be more than 75 characters long, including + 'charset', 'encoding', 'encoded-text', and delimiters. + + ... SNIP ... + + While there is no limit to the length of a multiple-line header + field, each line of a header field that contains one or more + 'encoded-word's is limited to 76 characters. + */ + + $nonAsciiChar = pack('C', 0x8F); + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($nonAsciiChar, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('=8F'); + //Note that multi-line headers begin with LWSP which makes 75 + 1 = 76 + //Note also that =?utf-8?q??= is 12 chars which makes 75 - 12 = 63 + + //* X-Test: is 8 chars + $header = $this->getHeader('X-Test', $encoder); + $header->setValue($nonAsciiChar); + + $this->assertEquals( + 'X-Test: =?'.$this->charset.'?Q?=8F?='."\r\n", + $header->toString() + ); + } + + public function testFWSPIsUsedWhenEncoderReturnsMultipleLines() + { + /* --RFC 2047, 2. + If it is desirable to encode more text than will fit in an 'encoded-word' of + 75 characters, multiple 'encoded-word's (separated by CRLF SPACE) may + be used. + */ + + //Note the Mock does NOT return 8F encoded, the 8F merely triggers + // encoding for the sake of testing + $nonAsciiChar = pack('C', 0x8F); + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($nonAsciiChar, 8, 63, \Mockery::any()) + ->andReturn('line_one_here'."\r\n".'line_two_here'); + + //Note that multi-line headers begin with LWSP which makes 75 + 1 = 76 + //Note also that =?utf-8?q??= is 12 chars which makes 75 - 12 = 63 + + //* X-Test: is 8 chars + $header = $this->getHeader('X-Test', $encoder); + $header->setValue($nonAsciiChar); + + $this->assertEquals( + 'X-Test: =?'.$this->charset.'?Q?line_one_here?='."\r\n". + ' =?'.$this->charset.'?Q?line_two_here?='."\r\n", + $header->toString() + ); + } + + public function testAdjacentWordsAreEncodedTogether() + { + /* -- RFC 2047, 5 (1) + Ordinary ASCII text and 'encoded-word's may appear together in the + same header field. However, an 'encoded-word' that appears in a + header field defined as '*text' MUST be separated from any adjacent + 'encoded-word' or 'text' by 'linear-white-space'. + + -- RFC 2047, 2. + IMPORTANT: 'encoded-word's are designed to be recognized as 'atom's + by an RFC 822 parser. As a consequence, unencoded white space + characters (such as SPACE and HTAB) are FORBIDDEN within an + 'encoded-word'. + */ + + //It would be valid to encode all words needed, however it's probably + // easiest to encode the longest amount required at a time + + $word = 'w'.pack('C', 0x8F).'rd'; + $text = 'start '.$word.' '.$word.' then end '.$word; + // 'start', ' word word', ' and end', ' word' + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($word.' '.$word, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('w=8Frd_w=8Frd'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($word, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('w=8Frd'); + + $header = $this->getHeader('X-Test', $encoder); + $header->setValue($text); + + $headerString = $header->toString(); + + $this->assertEquals('X-Test: start =?'.$this->charset.'?Q?'. + 'w=8Frd_w=8Frd?= then end =?'.$this->charset.'?Q?'. + 'w=8Frd?='."\r\n", $headerString, + '%s: Adjacent encoded words should appear grouped with WSP encoded' + ); + } + + public function testLanguageInformationAppearsInEncodedWords() + { + /* -- RFC 2231, 5. + 5. Language specification in Encoded Words + + RFC 2047 provides support for non-US-ASCII character sets in RFC 822 + message header comments, phrases, and any unstructured text field. + This is done by defining an encoded word construct which can appear + in any of these places. Given that these are fields intended for + display, it is sometimes necessary to associate language information + with encoded words as well as just the character set. This + specification extends the definition of an encoded word to allow the + inclusion of such information. This is simply done by suffixing the + character set specification with an asterisk followed by the language + tag. For example: + + From: =?US-ASCII*EN?Q?Keith_Moore?= + */ + + $value = 'fo'.pack('C', 0x8F).'bar'; + + $encoder = $this->getEncoder('Q'); + $encoder->shouldReceive('encodeString') + ->once() + ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any()) + ->andReturn('fo=8Fbar'); + + $header = $this->getHeader('Subject', $encoder); + $header->setLanguage('en'); + $header->setValue($value); + $this->assertEquals("Subject: =?utf-8*en?Q?fo=8Fbar?=\r\n", + $header->toString() + ); + } + + public function testSetBodyModel() + { + $header = $this->getHeader('Subject', $this->getEncoder('Q', true)); + $header->setFieldBodyModel('test'); + $this->assertEquals('test', $header->getValue()); + } + + public function testGetBodyModel() + { + $header = $this->getHeader('Subject', $this->getEncoder('Q', true)); + $header->setValue('test'); + $this->assertEquals('test', $header->getFieldBodyModel()); + } + + private function getHeader($name, $encoder) + { + $header = new Swift_Mime_Headers_UnstructuredHeader($name, $encoder); + $header->setCharset($this->charset); + + return $header; + } + + private function getEncoder($type, $stub = false) + { + $encoder = $this->getMockery('Swift_Mime_HeaderEncoder')->shouldIgnoreMissing(); + $encoder->shouldReceive('getName') + ->zeroOrMoreTimes() + ->andReturn($type); + + return $encoder; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/IdGeneratorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/IdGeneratorTest.php new file mode 100644 index 0000000..dfea580 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/IdGeneratorTest.php @@ -0,0 +1,32 @@ +assertEquals('example.net', $idGenerator->getIdRight()); + + $idGenerator->setIdRight('example.com'); + $this->assertEquals('example.com', $idGenerator->getIdRight()); + } + + public function testIdGenerateId() + { + $idGenerator = new Swift_Mime_IdGenerator('example.net'); + $emailValidator = new EmailValidator(); + + $id = $idGenerator->generateId(); + $this->assertTrue($emailValidator->isValid($id, new RFCValidation())); + $this->assertRegExp('/^.{32}@example.net$/', $id); + + $anotherId = $idGenerator->generateId(); + $this->assertNotEquals($id, $anotherId); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php new file mode 100644 index 0000000..4575505 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php @@ -0,0 +1,234 @@ +createMimePart($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals( + Swift_Mime_SimpleMimeEntity::LEVEL_ALTERNATIVE, $part->getNestingLevel() + ); + } + + public function testCharsetIsReturnedFromHeader() + { + /* -- RFC 2046, 4.1.2. + A critical parameter that may be specified in the Content-Type field + for "text/plain" data is the character set. This is specified with a + "charset" parameter, as in: + + Content-type: text/plain; charset=iso-8859-1 + + Unlike some other parameter values, the values of the charset + parameter are NOT case sensitive. The default character set, which + must be assumed in the absence of a charset parameter, is US-ASCII. + */ + + $cType = $this->createHeader('Content-Type', 'text/plain', + ['charset' => 'iso-8859-1'] + ); + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('iso-8859-1', $part->getCharset()); + } + + public function testCharsetIsSetInHeader() + { + $cType = $this->createHeader('Content-Type', 'text/plain', + ['charset' => 'iso-8859-1'], false + ); + $cType->shouldReceive('setParameter')->once()->with('charset', 'utf-8'); + + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $part->setCharset('utf-8'); + } + + public function testCharsetIsSetInHeaderIfPassedToSetBody() + { + $cType = $this->createHeader('Content-Type', 'text/plain', + ['charset' => 'iso-8859-1'], false + ); + $cType->shouldReceive('setParameter')->once()->with('charset', 'utf-8'); + + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $part->setBody('', 'text/plian', 'utf-8'); + } + + public function testSettingCharsetNotifiesEncoder() + { + $encoder = $this->createEncoder('quoted-printable', false); + $encoder->expects($this->once()) + ->method('charsetChanged') + ->with('utf-8'); + + $part = $this->createMimePart($this->createHeaderSet(), + $encoder, $this->createCache() + ); + $part->setCharset('utf-8'); + } + + public function testSettingCharsetNotifiesHeaders() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('charsetChanged') + ->zeroOrMoreTimes() + ->with('utf-8'); + + $part = $this->createMimePart($headers, $this->createEncoder(), + $this->createCache() + ); + $part->setCharset('utf-8'); + } + + public function testSettingCharsetNotifiesChildren() + { + $child = $this->createChild(0, '', false); + $child->shouldReceive('charsetChanged') + ->once() + ->with('windows-874'); + + $part = $this->createMimePart($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $part->setChildren([$child]); + $part->setCharset('windows-874'); + } + + public function testCharsetChangeUpdatesCharset() + { + $cType = $this->createHeader('Content-Type', 'text/plain', + ['charset' => 'iso-8859-1'], false + ); + $cType->shouldReceive('setParameter')->once()->with('charset', 'utf-8'); + + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $part->charsetChanged('utf-8'); + } + + public function testSettingCharsetClearsCache() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('toString') + ->zeroOrMoreTimes() + ->andReturn("Content-Type: text/plain; charset=utf-8\r\n"); + + $cache = $this->createCache(false); + + $entity = $this->createEntity($headers, $this->createEncoder(), + $cache + ); + + $entity->setBody("blah\r\nblah!"); + $entity->toString(); + + // Initialize the expectation here because we only care about what happens in setCharset() + $cache->shouldReceive('clearKey') + ->once() + ->with(\Mockery::any(), 'body'); + + $entity->setCharset('iso-2022'); + } + + public function testFormatIsReturnedFromHeader() + { + /* -- RFC 3676. + */ + + $cType = $this->createHeader('Content-Type', 'text/plain', + ['format' => 'flowed'] + ); + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('flowed', $part->getFormat()); + } + + public function testFormatIsSetInHeader() + { + $cType = $this->createHeader('Content-Type', 'text/plain', [], false); + $cType->shouldReceive('setParameter')->once()->with('format', 'fixed'); + + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $part->setFormat('fixed'); + } + + public function testDelSpIsReturnedFromHeader() + { + /* -- RFC 3676. + */ + + $cType = $this->createHeader('Content-Type', 'text/plain', + ['delsp' => 'no'] + ); + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $this->assertFalse($part->getDelSp()); + } + + public function testDelSpIsSetInHeader() + { + $cType = $this->createHeader('Content-Type', 'text/plain', [], false); + $cType->shouldReceive('setParameter')->once()->with('delsp', 'yes'); + + $part = $this->createMimePart($this->createHeaderSet([ + 'Content-Type' => $cType, ]), + $this->createEncoder(), $this->createCache() + ); + $part->setDelSp(true); + } + + public function testFluidInterface() + { + $part = $this->createMimePart($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + + $this->assertSame($part, + $part + ->setContentType('text/plain') + ->setEncoder($this->createEncoder()) + ->setId('foo@bar') + ->setDescription('my description') + ->setMaxLineLength(998) + ->setBody('xx') + ->setBoundary('xyz') + ->setChildren([]) + ->setCharset('utf-8') + ->setFormat('flowed') + ->setDelSp(true) + ); + } + + //abstract + protected function createEntity($headers, $encoder, $cache) + { + return $this->createMimePart($headers, $encoder, $cache); + } + + protected function createMimePart($headers, $encoder, $cache) + { + $idGenerator = new Swift_Mime_IdGenerator('example.com'); + + return new Swift_Mime_MimePart($headers, $encoder, $cache, $idGenerator); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php new file mode 100644 index 0000000..6bc825e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php @@ -0,0 +1,169 @@ +factory = $this->createFactory(); + } + + public function testMailboxHeaderIsCorrectType() + { + $header = $this->factory->createMailboxHeader('X-Foo'); + $this->assertInstanceOf('Swift_Mime_Headers_MailboxHeader', $header); + } + + public function testMailboxHeaderHasCorrectName() + { + $header = $this->factory->createMailboxHeader('X-Foo'); + $this->assertEquals('X-Foo', $header->getFieldName()); + } + + public function testMailboxHeaderHasCorrectModel() + { + $header = $this->factory->createMailboxHeader('X-Foo', + ['foo@bar' => 'FooBar'] + ); + $this->assertEquals(['foo@bar' => 'FooBar'], $header->getFieldBodyModel()); + } + + public function testDateHeaderHasCorrectType() + { + $header = $this->factory->createDateHeader('X-Date'); + $this->assertInstanceOf('Swift_Mime_Headers_DateHeader', $header); + } + + public function testDateHeaderHasCorrectName() + { + $header = $this->factory->createDateHeader('X-Date'); + $this->assertEquals('X-Date', $header->getFieldName()); + } + + public function testDateHeaderHasCorrectModel() + { + $dateTime = new \DateTimeImmutable(); + $header = $this->factory->createDateHeader('X-Date', $dateTime); + $this->assertEquals($dateTime, $header->getFieldBodyModel()); + } + + public function testTextHeaderHasCorrectType() + { + $header = $this->factory->createTextHeader('X-Foo'); + $this->assertInstanceOf('Swift_Mime_Headers_UnstructuredHeader', $header); + } + + public function testTextHeaderHasCorrectName() + { + $header = $this->factory->createTextHeader('X-Foo'); + $this->assertEquals('X-Foo', $header->getFieldName()); + } + + public function testTextHeaderHasCorrectModel() + { + $header = $this->factory->createTextHeader('X-Foo', 'bar'); + $this->assertEquals('bar', $header->getFieldBodyModel()); + } + + public function testParameterizedHeaderHasCorrectType() + { + $header = $this->factory->createParameterizedHeader('X-Foo'); + $this->assertInstanceOf('Swift_Mime_Headers_ParameterizedHeader', $header); + } + + public function testParameterizedHeaderHasCorrectName() + { + $header = $this->factory->createParameterizedHeader('X-Foo'); + $this->assertEquals('X-Foo', $header->getFieldName()); + } + + public function testParameterizedHeaderHasCorrectModel() + { + $header = $this->factory->createParameterizedHeader('X-Foo', 'bar'); + $this->assertEquals('bar', $header->getFieldBodyModel()); + } + + public function testParameterizedHeaderHasCorrectParams() + { + $header = $this->factory->createParameterizedHeader('X-Foo', 'bar', + ['zip' => 'button'] + ); + $this->assertEquals(['zip' => 'button'], $header->getParameters()); + } + + public function testIdHeaderHasCorrectType() + { + $header = $this->factory->createIdHeader('X-ID'); + $this->assertInstanceOf('Swift_Mime_Headers_IdentificationHeader', $header); + } + + public function testIdHeaderHasCorrectName() + { + $header = $this->factory->createIdHeader('X-ID'); + $this->assertEquals('X-ID', $header->getFieldName()); + } + + public function testIdHeaderHasCorrectModel() + { + $header = $this->factory->createIdHeader('X-ID', 'xyz@abc'); + $this->assertEquals(['xyz@abc'], $header->getFieldBodyModel()); + } + + public function testPathHeaderHasCorrectType() + { + $header = $this->factory->createPathHeader('X-Path'); + $this->assertInstanceOf('Swift_Mime_Headers_PathHeader', $header); + } + + public function testPathHeaderHasCorrectName() + { + $header = $this->factory->createPathHeader('X-Path'); + $this->assertEquals('X-Path', $header->getFieldName()); + } + + public function testPathHeaderHasCorrectModel() + { + $header = $this->factory->createPathHeader('X-Path', 'foo@bar'); + $this->assertEquals('foo@bar', $header->getFieldBodyModel()); + } + + public function testCharsetChangeNotificationNotifiesEncoders() + { + $encoder = $this->createHeaderEncoder(); + $encoder->expects($this->once()) + ->method('charsetChanged') + ->with('utf-8'); + $paramEncoder = $this->createParamEncoder(); + $paramEncoder->expects($this->once()) + ->method('charsetChanged') + ->with('utf-8'); + + $factory = $this->createFactory($encoder, $paramEncoder); + + $factory->charsetChanged('utf-8'); + } + + private function createFactory($encoder = null, $paramEncoder = null) + { + return new Swift_Mime_SimpleHeaderFactory( + $encoder + ? $encoder : $this->createHeaderEncoder(), + $paramEncoder + ? $paramEncoder : $this->createParamEncoder(), + new EmailValidator() + ); + } + + private function createHeaderEncoder() + { + return $this->getMockBuilder('Swift_Mime_HeaderEncoder')->getMock(); + } + + private function createParamEncoder() + { + return $this->getMockBuilder('Swift_Encoder')->getMock(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php new file mode 100644 index 0000000..4ddbff7 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php @@ -0,0 +1,734 @@ +createFactory(); + $factory->expects($this->once()) + ->method('createMailboxHeader') + ->with('From', ['person@domain' => 'Person']) + ->will($this->returnValue($this->createHeader('From'))); + + $set = $this->createSet($factory); + $set->addMailboxHeader('From', ['person@domain' => 'Person']); + } + + public function testAddDateHeaderDelegatesToFactory() + { + $dateTime = new DateTimeImmutable(); + + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createDateHeader') + ->with('Date', $dateTime) + ->will($this->returnValue($this->createHeader('Date'))); + + $set = $this->createSet($factory); + $set->addDateHeader('Date', $dateTime); + } + + public function testAddTextHeaderDelegatesToFactory() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createTextHeader') + ->with('Subject', 'some text') + ->will($this->returnValue($this->createHeader('Subject'))); + + $set = $this->createSet($factory); + $set->addTextHeader('Subject', 'some text'); + } + + public function testAddParameterizedHeaderDelegatesToFactory() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createParameterizedHeader') + ->with('Content-Type', 'text/plain', ['charset' => 'utf-8']) + ->will($this->returnValue($this->createHeader('Content-Type'))); + + $set = $this->createSet($factory); + $set->addParameterizedHeader('Content-Type', 'text/plain', + ['charset' => 'utf-8'] + ); + } + + public function testAddIdHeaderDelegatesToFactory() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($this->createHeader('Message-ID'))); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + } + + public function testAddPathHeaderDelegatesToFactory() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createPathHeader') + ->with('Return-Path', 'some@path') + ->will($this->returnValue($this->createHeader('Return-Path'))); + + $set = $this->createSet($factory); + $set->addPathHeader('Return-Path', 'some@path'); + } + + public function testHasReturnsFalseWhenNoHeaders() + { + $set = $this->createSet($this->createFactory()); + $this->assertFalse($set->has('Some-Header')); + } + + public function testAddedMailboxHeaderIsSeenByHas() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createMailboxHeader') + ->with('From', ['person@domain' => 'Person']) + ->will($this->returnValue($this->createHeader('From'))); + + $set = $this->createSet($factory); + $set->addMailboxHeader('From', ['person@domain' => 'Person']); + $this->assertTrue($set->has('From')); + } + + public function testAddedDateHeaderIsSeenByHas() + { + $dateTime = new DateTimeImmutable(); + + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createDateHeader') + ->with('Date', $dateTime) + ->will($this->returnValue($this->createHeader('Date'))); + + $set = $this->createSet($factory); + $set->addDateHeader('Date', $dateTime); + $this->assertTrue($set->has('Date')); + } + + public function testAddedTextHeaderIsSeenByHas() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createTextHeader') + ->with('Subject', 'some text') + ->will($this->returnValue($this->createHeader('Subject'))); + + $set = $this->createSet($factory); + $set->addTextHeader('Subject', 'some text'); + $this->assertTrue($set->has('Subject')); + } + + public function testAddedParameterizedHeaderIsSeenByHas() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createParameterizedHeader') + ->with('Content-Type', 'text/plain', ['charset' => 'utf-8']) + ->will($this->returnValue($this->createHeader('Content-Type'))); + + $set = $this->createSet($factory); + $set->addParameterizedHeader('Content-Type', 'text/plain', + ['charset' => 'utf-8'] + ); + $this->assertTrue($set->has('Content-Type')); + } + + public function testAddedIdHeaderIsSeenByHas() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($this->createHeader('Message-ID'))); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertTrue($set->has('Message-ID')); + } + + public function testAddedPathHeaderIsSeenByHas() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createPathHeader') + ->with('Return-Path', 'some@path') + ->will($this->returnValue($this->createHeader('Return-Path'))); + + $set = $this->createSet($factory); + $set->addPathHeader('Return-Path', 'some@path'); + $this->assertTrue($set->has('Return-Path')); + } + + public function testNewlySetHeaderIsSeenByHas() + { + $factory = $this->createFactory(); + $header = $this->createHeader('X-Foo', 'bar'); + $set = $this->createSet($factory); + $set->set($header); + $this->assertTrue($set->has('X-Foo')); + } + + public function testHasCanAcceptOffset() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($this->createHeader('Message-ID'))); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertTrue($set->has('Message-ID', 0)); + } + + public function testHasWithIllegalOffsetReturnsFalse() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($this->createHeader('Message-ID'))); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertFalse($set->has('Message-ID', 1)); + } + + public function testHasCanDistinguishMultipleHeaders() + { + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($this->createHeader('Message-ID'))); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Message-ID', 'other@id') + ->will($this->returnValue($this->createHeader('Message-ID'))); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Message-ID', 'other@id'); + $this->assertTrue($set->has('Message-ID', 1)); + } + + public function testGetWithUnspecifiedOffset() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertSame($header, $set->get('Message-ID')); + } + + public function testGetWithSpeiciedOffset() + { + $header0 = $this->createHeader('Message-ID'); + $header1 = $this->createHeader('Message-ID'); + $header2 = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header0)); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Message-ID', 'other@id') + ->will($this->returnValue($header1)); + $factory->expects($this->at(2)) + ->method('createIdHeader') + ->with('Message-ID', 'more@id') + ->will($this->returnValue($header2)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Message-ID', 'other@id'); + $set->addIdHeader('Message-ID', 'more@id'); + $this->assertSame($header1, $set->get('Message-ID', 1)); + } + + public function testGetReturnsNullIfHeaderNotSet() + { + $set = $this->createSet($this->createFactory()); + $this->assertNull($set->get('Message-ID', 99)); + } + + public function testGetAllReturnsAllHeadersMatchingName() + { + $header0 = $this->createHeader('Message-ID'); + $header1 = $this->createHeader('Message-ID'); + $header2 = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header0)); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Message-ID', 'other@id') + ->will($this->returnValue($header1)); + $factory->expects($this->at(2)) + ->method('createIdHeader') + ->with('Message-ID', 'more@id') + ->will($this->returnValue($header2)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Message-ID', 'other@id'); + $set->addIdHeader('Message-ID', 'more@id'); + + $this->assertEquals([$header0, $header1, $header2], + $set->getAll('Message-ID') + ); + } + + public function testGetAllReturnsAllHeadersIfNoArguments() + { + $header0 = $this->createHeader('Message-ID'); + $header1 = $this->createHeader('Subject'); + $header2 = $this->createHeader('To'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header0)); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Subject', 'thing') + ->will($this->returnValue($header1)); + $factory->expects($this->at(2)) + ->method('createIdHeader') + ->with('To', 'person@example.org') + ->will($this->returnValue($header2)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Subject', 'thing'); + $set->addIdHeader('To', 'person@example.org'); + + $this->assertEquals([$header0, $header1, $header2], + $set->getAll() + ); + } + + public function testGetAllReturnsEmptyArrayIfNoneSet() + { + $set = $this->createSet($this->createFactory()); + $this->assertEquals([], $set->getAll('Received')); + } + + public function testRemoveWithUnspecifiedOffset() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->remove('Message-ID'); + $this->assertFalse($set->has('Message-ID')); + } + + public function testRemoveWithSpecifiedIndexRemovesHeader() + { + $header0 = $this->createHeader('Message-ID'); + $header1 = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header0)); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Message-ID', 'other@id') + ->will($this->returnValue($header1)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Message-ID', 'other@id'); + $set->remove('Message-ID', 0); + $this->assertFalse($set->has('Message-ID', 0)); + $this->assertTrue($set->has('Message-ID', 1)); + $this->assertTrue($set->has('Message-ID')); + $set->remove('Message-ID', 1); + $this->assertFalse($set->has('Message-ID', 1)); + $this->assertFalse($set->has('Message-ID')); + } + + public function testRemoveWithSpecifiedIndexLeavesOtherHeaders() + { + $header0 = $this->createHeader('Message-ID'); + $header1 = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header0)); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Message-ID', 'other@id') + ->will($this->returnValue($header1)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Message-ID', 'other@id'); + $set->remove('Message-ID', 1); + $this->assertTrue($set->has('Message-ID', 0)); + } + + public function testRemoveWithInvalidOffsetDoesNothing() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->remove('Message-ID', 50); + $this->assertTrue($set->has('Message-ID')); + } + + public function testRemoveAllRemovesAllHeadersWithName() + { + $header0 = $this->createHeader('Message-ID'); + $header1 = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header0)); + $factory->expects($this->at(1)) + ->method('createIdHeader') + ->with('Message-ID', 'other@id') + ->will($this->returnValue($header1)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->addIdHeader('Message-ID', 'other@id'); + $set->removeAll('Message-ID'); + $this->assertFalse($set->has('Message-ID', 0)); + $this->assertFalse($set->has('Message-ID', 1)); + } + + public function testHasIsNotCaseSensitive() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertTrue($set->has('message-id')); + } + + public function testGetIsNotCaseSensitive() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertSame($header, $set->get('message-id')); + } + + public function testGetAllIsNotCaseSensitive() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $this->assertEquals([$header], $set->getAll('message-id')); + } + + public function testRemoveIsNotCaseSensitive() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->remove('message-id'); + $this->assertFalse($set->has('Message-ID')); + } + + public function testRemoveAllIsNotCaseSensitive() + { + $header = $this->createHeader('Message-ID'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createIdHeader') + ->with('Message-ID', 'some@id') + ->will($this->returnValue($header)); + + $set = $this->createSet($factory); + $set->addIdHeader('Message-ID', 'some@id'); + $set->removeAll('message-id'); + $this->assertFalse($set->has('Message-ID')); + } + + public function testToStringJoinsHeadersTogether() + { + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Foo', 'bar') + ->will($this->returnValue($this->createHeader('Foo', 'bar'))); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('Zip', 'buttons') + ->will($this->returnValue($this->createHeader('Zip', 'buttons'))); + + $set = $this->createSet($factory); + $set->addTextHeader('Foo', 'bar'); + $set->addTextHeader('Zip', 'buttons'); + $this->assertEquals( + "Foo: bar\r\n". + "Zip: buttons\r\n", + $set->toString() + ); + } + + public function testHeadersWithoutBodiesAreNotDisplayed() + { + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Foo', 'bar') + ->will($this->returnValue($this->createHeader('Foo', 'bar'))); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('Zip', '') + ->will($this->returnValue($this->createHeader('Zip', ''))); + + $set = $this->createSet($factory); + $set->addTextHeader('Foo', 'bar'); + $set->addTextHeader('Zip', ''); + $this->assertEquals( + "Foo: bar\r\n", + $set->toString() + ); + } + + public function testHeadersWithoutBodiesCanBeForcedToDisplay() + { + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Foo', '') + ->will($this->returnValue($this->createHeader('Foo', ''))); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('Zip', '') + ->will($this->returnValue($this->createHeader('Zip', ''))); + + $set = $this->createSet($factory); + $set->addTextHeader('Foo', ''); + $set->addTextHeader('Zip', ''); + $set->setAlwaysDisplayed(['Foo', 'Zip']); + $this->assertEquals( + "Foo: \r\n". + "Zip: \r\n", + $set->toString() + ); + } + + public function testHeaderSequencesCanBeSpecified() + { + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Third', 'three') + ->will($this->returnValue($this->createHeader('Third', 'three'))); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('First', 'one') + ->will($this->returnValue($this->createHeader('First', 'one'))); + $factory->expects($this->at(2)) + ->method('createTextHeader') + ->with('Second', 'two') + ->will($this->returnValue($this->createHeader('Second', 'two'))); + + $set = $this->createSet($factory); + $set->addTextHeader('Third', 'three'); + $set->addTextHeader('First', 'one'); + $set->addTextHeader('Second', 'two'); + + $set->defineOrdering(['First', 'Second', 'Third']); + + $this->assertEquals( + "First: one\r\n". + "Second: two\r\n". + "Third: three\r\n", + $set->toString() + ); + } + + public function testUnsortedHeadersAppearAtEnd() + { + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Fourth', 'four') + ->will($this->returnValue($this->createHeader('Fourth', 'four'))); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('Fifth', 'five') + ->will($this->returnValue($this->createHeader('Fifth', 'five'))); + $factory->expects($this->at(2)) + ->method('createTextHeader') + ->with('Third', 'three') + ->will($this->returnValue($this->createHeader('Third', 'three'))); + $factory->expects($this->at(3)) + ->method('createTextHeader') + ->with('First', 'one') + ->will($this->returnValue($this->createHeader('First', 'one'))); + $factory->expects($this->at(4)) + ->method('createTextHeader') + ->with('Second', 'two') + ->will($this->returnValue($this->createHeader('Second', 'two'))); + + $set = $this->createSet($factory); + $set->addTextHeader('Fourth', 'four'); + $set->addTextHeader('Fifth', 'five'); + $set->addTextHeader('Third', 'three'); + $set->addTextHeader('First', 'one'); + $set->addTextHeader('Second', 'two'); + + $set->defineOrdering(['First', 'Second', 'Third']); + + $this->assertEquals( + "First: one\r\n". + "Second: two\r\n". + "Third: three\r\n". + "Fourth: four\r\n". + "Fifth: five\r\n", + $set->toString() + ); + } + + public function testSettingCharsetNotifiesAlreadyExistingHeaders() + { + $subject = $this->createHeader('Subject', 'some text'); + $xHeader = $this->createHeader('X-Header', 'some text'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Subject', 'some text') + ->will($this->returnValue($subject)); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('X-Header', 'some text') + ->will($this->returnValue($xHeader)); + $subject->expects($this->once()) + ->method('setCharset') + ->with('utf-8'); + $xHeader->expects($this->once()) + ->method('setCharset') + ->with('utf-8'); + + $set = $this->createSet($factory); + $set->addTextHeader('Subject', 'some text'); + $set->addTextHeader('X-Header', 'some text'); + + $set->setCharset('utf-8'); + } + + public function testCharsetChangeNotifiesAlreadyExistingHeaders() + { + $subject = $this->createHeader('Subject', 'some text'); + $xHeader = $this->createHeader('X-Header', 'some text'); + $factory = $this->createFactory(); + $factory->expects($this->at(0)) + ->method('createTextHeader') + ->with('Subject', 'some text') + ->will($this->returnValue($subject)); + $factory->expects($this->at(1)) + ->method('createTextHeader') + ->with('X-Header', 'some text') + ->will($this->returnValue($xHeader)); + $subject->expects($this->once()) + ->method('setCharset') + ->with('utf-8'); + $xHeader->expects($this->once()) + ->method('setCharset') + ->with('utf-8'); + + $set = $this->createSet($factory); + $set->addTextHeader('Subject', 'some text'); + $set->addTextHeader('X-Header', 'some text'); + + $set->charsetChanged('utf-8'); + } + + public function testCharsetChangeNotifiesFactory() + { + $factory = $this->createFactory(); + $factory->expects($this->once()) + ->method('charsetChanged') + ->with('utf-8'); + + $set = $this->createSet($factory); + + $set->setCharset('utf-8'); + } + + private function createSet($factory) + { + return new Swift_Mime_SimpleHeaderSet($factory); + } + + private function createFactory() + { + return $this->getMockBuilder('Swift_Mime_SimpleHeaderFactory')->disableOriginalConstructor()->getMock(); + } + + private function createHeader($name, $body = '') + { + $header = $this->getMockBuilder('Swift_Mime_Header')->getMock(); + $header->expects($this->any()) + ->method('getFieldName') + ->will($this->returnValue($name)); + $header->expects($this->any()) + ->method('toString') + ->will($this->returnValue(sprintf("%s: %s\r\n", $name, $body))); + $header->expects($this->any()) + ->method('getFieldBody') + ->will($this->returnValue($body)); + + return $header; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php new file mode 100644 index 0000000..c5662cb --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php @@ -0,0 +1,837 @@ +addToAssertionCount(1); + } + + public function testNestingLevelIsTop() + { + $message = $this->createMessage($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals( + Swift_Mime_SimpleMimeEntity::LEVEL_TOP, $message->getNestingLevel() + ); + } + + public function testDateIsReturnedFromHeader() + { + $dateTime = new DateTimeImmutable(); + + $date = $this->createHeader('Date', $dateTime); + $message = $this->createMessage( + $this->createHeaderSet(['Date' => $date]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals($dateTime, $message->getDate()); + } + + public function testDateIsSetInHeader() + { + $dateTime = new DateTimeImmutable(); + + $date = $this->createHeader('Date', new DateTimeImmutable(), [], false); + $date->shouldReceive('setFieldBodyModel') + ->once() + ->with($dateTime); + $date->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $message = $this->createMessage( + $this->createHeaderSet(['Date' => $date]), + $this->createEncoder(), $this->createCache() + ); + $message->setDate($dateTime); + } + + public function testDateHeaderIsCreatedIfNonePresent() + { + $dateTime = new DateTimeImmutable(); + + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addDateHeader') + ->once() + ->with('Date', $dateTime); + $headers->shouldReceive('addDateHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setDate($dateTime); + } + + public function testDateHeaderIsAddedDuringConstruction() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addDateHeader') + ->once() + ->with('Date', Mockery::type('DateTimeImmutable')); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + } + + public function testIdIsReturnedFromHeader() + { + /* -- RFC 2045, 7. + In constructing a high-level user agent, it may be desirable to allow + one body to make reference to another. Accordingly, bodies may be + labelled using the "Content-ID" header field, which is syntactically + identical to the "Message-ID" header field + */ + + $messageId = $this->createHeader('Message-ID', 'a@b'); + $message = $this->createMessage( + $this->createHeaderSet(['Message-ID' => $messageId]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('a@b', $message->getId()); + } + + public function testIdIsSetInHeader() + { + $messageId = $this->createHeader('Message-ID', 'a@b', [], false); + $messageId->shouldReceive('setFieldBodyModel') + ->once() + ->with('x@y'); + $messageId->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $message = $this->createMessage( + $this->createHeaderSet(['Message-ID' => $messageId]), + $this->createEncoder(), $this->createCache() + ); + $message->setId('x@y'); + } + + public function testIdIsAutoGenerated() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addIdHeader') + ->once() + ->with('Message-ID', '/^.*?@.*?$/D'); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + } + + public function testSubjectIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.5. + */ + + $subject = $this->createHeader('Subject', 'example subject'); + $message = $this->createMessage( + $this->createHeaderSet(['Subject' => $subject]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('example subject', $message->getSubject()); + } + + public function testSubjectIsSetInHeader() + { + $subject = $this->createHeader('Subject', '', [], false); + $subject->shouldReceive('setFieldBodyModel') + ->once() + ->with('foo'); + + $message = $this->createMessage( + $this->createHeaderSet(['Subject' => $subject]), + $this->createEncoder(), $this->createCache() + ); + $message->setSubject('foo'); + } + + public function testSubjectHeaderIsCreatedIfNotPresent() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addTextHeader') + ->once() + ->with('Subject', 'example subject'); + $headers->shouldReceive('addTextHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setSubject('example subject'); + } + + public function testReturnPathIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.7. + */ + + $path = $this->createHeader('Return-Path', 'bounces@domain'); + $message = $this->createMessage( + $this->createHeaderSet(['Return-Path' => $path]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals('bounces@domain', $message->getReturnPath()); + } + + public function testReturnPathIsSetInHeader() + { + $path = $this->createHeader('Return-Path', '', [], false); + $path->shouldReceive('setFieldBodyModel') + ->once() + ->with('bounces@domain'); + + $message = $this->createMessage( + $this->createHeaderSet(['Return-Path' => $path]), + $this->createEncoder(), $this->createCache() + ); + $message->setReturnPath('bounces@domain'); + } + + public function testReturnPathHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addPathHeader') + ->once() + ->with('Return-Path', 'bounces@domain'); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setReturnPath('bounces@domain'); + } + + public function testSenderIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.2. + */ + + $sender = $this->createHeader('Sender', ['sender@domain' => 'Name']); + $message = $this->createMessage( + $this->createHeaderSet(['Sender' => $sender]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['sender@domain' => 'Name'], $message->getSender()); + } + + public function testSenderIsSetInHeader() + { + $sender = $this->createHeader('Sender', ['sender@domain' => 'Name'], + [], false + ); + $sender->shouldReceive('setFieldBodyModel') + ->once() + ->with(['other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Sender' => $sender]), + $this->createEncoder(), $this->createCache() + ); + $message->setSender(['other@domain' => 'Other']); + } + + public function testSenderHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Sender', (array) 'sender@domain'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setSender('sender@domain'); + } + + public function testNameCanBeUsedInSenderHeader() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Sender', ['sender@domain' => 'Name']); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setSender('sender@domain', 'Name'); + } + + public function testFromIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.2. + */ + + $from = $this->createHeader('From', ['from@domain' => 'Name']); + $message = $this->createMessage( + $this->createHeaderSet(['From' => $from]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['from@domain' => 'Name'], $message->getFrom()); + } + + public function testFromIsSetInHeader() + { + $from = $this->createHeader('From', ['from@domain' => 'Name'], + [], false + ); + $from->shouldReceive('setFieldBodyModel') + ->once() + ->with(['other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['From' => $from]), + $this->createEncoder(), $this->createCache() + ); + $message->setFrom(['other@domain' => 'Other']); + } + + public function testFromIsAddedToHeadersDuringAddFrom() + { + $from = $this->createHeader('From', ['from@domain' => 'Name'], + [], false + ); + $from->shouldReceive('setFieldBodyModel') + ->once() + ->with(['from@domain' => 'Name', 'other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['From' => $from]), + $this->createEncoder(), $this->createCache() + ); + $message->addFrom('other@domain', 'Other'); + } + + public function testFromHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('From', (array) 'from@domain'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setFrom('from@domain'); + } + + public function testPersonalNameCanBeUsedInFromAddress() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('From', ['from@domain' => 'Name']); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setFrom('from@domain', 'Name'); + } + + public function testReplyToIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.2. + */ + + $reply = $this->createHeader('Reply-To', ['reply@domain' => 'Name']); + $message = $this->createMessage( + $this->createHeaderSet(['Reply-To' => $reply]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['reply@domain' => 'Name'], $message->getReplyTo()); + } + + public function testReplyToIsSetInHeader() + { + $reply = $this->createHeader('Reply-To', ['reply@domain' => 'Name'], + [], false + ); + $reply->shouldReceive('setFieldBodyModel') + ->once() + ->with(['other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Reply-To' => $reply]), + $this->createEncoder(), $this->createCache() + ); + $message->setReplyTo(['other@domain' => 'Other']); + } + + public function testReplyToIsAddedToHeadersDuringAddReplyTo() + { + $replyTo = $this->createHeader('Reply-To', ['from@domain' => 'Name'], + [], false + ); + $replyTo->shouldReceive('setFieldBodyModel') + ->once() + ->with(['from@domain' => 'Name', 'other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Reply-To' => $replyTo]), + $this->createEncoder(), $this->createCache() + ); + $message->addReplyTo('other@domain', 'Other'); + } + + public function testReplyToHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Reply-To', (array) 'reply@domain'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setReplyTo('reply@domain'); + } + + public function testNameCanBeUsedInReplyTo() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Reply-To', ['reply@domain' => 'Name']); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setReplyTo('reply@domain', 'Name'); + } + + public function testToIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.3. + */ + + $to = $this->createHeader('To', ['to@domain' => 'Name']); + $message = $this->createMessage( + $this->createHeaderSet(['To' => $to]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['to@domain' => 'Name'], $message->getTo()); + } + + public function testToIsSetInHeader() + { + $to = $this->createHeader('To', ['to@domain' => 'Name'], + [], false + ); + $to->shouldReceive('setFieldBodyModel') + ->once() + ->with(['other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['To' => $to]), + $this->createEncoder(), $this->createCache() + ); + $message->setTo(['other@domain' => 'Other']); + } + + public function testToIsAddedToHeadersDuringAddTo() + { + $to = $this->createHeader('To', ['from@domain' => 'Name'], + [], false + ); + $to->shouldReceive('setFieldBodyModel') + ->once() + ->with(['from@domain' => 'Name', 'other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['To' => $to]), + $this->createEncoder(), $this->createCache() + ); + $message->addTo('other@domain', 'Other'); + } + + public function testToHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('To', (array) 'to@domain'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setTo('to@domain'); + } + + public function testNameCanBeUsedInToHeader() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('To', ['to@domain' => 'Name']); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setTo('to@domain', 'Name'); + } + + public function testCcIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.3. + */ + + $cc = $this->createHeader('Cc', ['cc@domain' => 'Name']); + $message = $this->createMessage( + $this->createHeaderSet(['Cc' => $cc]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['cc@domain' => 'Name'], $message->getCc()); + } + + public function testCcIsSetInHeader() + { + $cc = $this->createHeader('Cc', ['cc@domain' => 'Name'], + [], false + ); + $cc->shouldReceive('setFieldBodyModel') + ->once() + ->with(['other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Cc' => $cc]), + $this->createEncoder(), $this->createCache() + ); + $message->setCc(['other@domain' => 'Other']); + } + + public function testCcIsAddedToHeadersDuringAddCc() + { + $cc = $this->createHeader('Cc', ['from@domain' => 'Name'], + [], false + ); + $cc->shouldReceive('setFieldBodyModel') + ->once() + ->with(['from@domain' => 'Name', 'other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Cc' => $cc]), + $this->createEncoder(), $this->createCache() + ); + $message->addCc('other@domain', 'Other'); + } + + public function testCcHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Cc', (array) 'cc@domain'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setCc('cc@domain'); + } + + public function testNameCanBeUsedInCcHeader() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Cc', ['cc@domain' => 'Name']); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setCc('cc@domain', 'Name'); + } + + public function testBccIsReturnedFromHeader() + { + /* -- RFC 2822, 3.6.3. + */ + + $bcc = $this->createHeader('Bcc', ['bcc@domain' => 'Name']); + $message = $this->createMessage( + $this->createHeaderSet(['Bcc' => $bcc]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['bcc@domain' => 'Name'], $message->getBcc()); + } + + public function testBccIsSetInHeader() + { + $bcc = $this->createHeader('Bcc', ['bcc@domain' => 'Name'], + [], false + ); + $bcc->shouldReceive('setFieldBodyModel') + ->once() + ->with(['other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Bcc' => $bcc]), + $this->createEncoder(), $this->createCache() + ); + $message->setBcc(['other@domain' => 'Other']); + } + + public function testBccIsAddedToHeadersDuringAddBcc() + { + $bcc = $this->createHeader('Bcc', ['from@domain' => 'Name'], + [], false + ); + $bcc->shouldReceive('setFieldBodyModel') + ->once() + ->with(['from@domain' => 'Name', 'other@domain' => 'Other']); + + $message = $this->createMessage( + $this->createHeaderSet(['Bcc' => $bcc]), + $this->createEncoder(), $this->createCache() + ); + $message->addBcc('other@domain', 'Other'); + } + + public function testBccHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Bcc', (array) 'bcc@domain'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setBcc('bcc@domain'); + } + + public function testNameCanBeUsedInBcc() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Bcc', ['bcc@domain' => 'Name']); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setBcc('bcc@domain', 'Name'); + } + + public function testPriorityIsReadFromHeader() + { + $prio = $this->createHeader('X-Priority', '2 (High)'); + $message = $this->createMessage( + $this->createHeaderSet(['X-Priority' => $prio]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(2, $message->getPriority()); + } + + public function testPriorityIsSetInHeader() + { + $prio = $this->createHeader('X-Priority', '2 (High)', [], false); + $prio->shouldReceive('setFieldBodyModel') + ->once() + ->with('5 (Lowest)'); + + $message = $this->createMessage( + $this->createHeaderSet(['X-Priority' => $prio]), + $this->createEncoder(), $this->createCache() + ); + $message->setPriority($message::PRIORITY_LOWEST); + } + + public function testPriorityHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addTextHeader') + ->once() + ->with('X-Priority', '4 (Low)'); + $headers->shouldReceive('addTextHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setPriority($message::PRIORITY_LOW); + } + + public function testReadReceiptAddressReadFromHeader() + { + $rcpt = $this->createHeader('Disposition-Notification-To', + ['chris@swiftmailer.org' => 'Chris'] + ); + $message = $this->createMessage( + $this->createHeaderSet(['Disposition-Notification-To' => $rcpt]), + $this->createEncoder(), $this->createCache() + ); + $this->assertEquals(['chris@swiftmailer.org' => 'Chris'], + $message->getReadReceiptTo() + ); + } + + public function testReadReceiptIsSetInHeader() + { + $rcpt = $this->createHeader('Disposition-Notification-To', [], [], false); + $rcpt->shouldReceive('setFieldBodyModel') + ->once() + ->with('mark@swiftmailer.org'); + + $message = $this->createMessage( + $this->createHeaderSet(['Disposition-Notification-To' => $rcpt]), + $this->createEncoder(), $this->createCache() + ); + $message->setReadReceiptTo('mark@swiftmailer.org'); + } + + public function testReadReceiptHeaderIsAddedIfNoneSet() + { + $headers = $this->createHeaderSet([], false); + $headers->shouldReceive('addMailboxHeader') + ->once() + ->with('Disposition-Notification-To', 'mark@swiftmailer.org'); + $headers->shouldReceive('addMailboxHeader') + ->zeroOrMoreTimes(); + + $message = $this->createMessage($headers, $this->createEncoder(), + $this->createCache() + ); + $message->setReadReceiptTo('mark@swiftmailer.org'); + } + + public function testChildrenCanBeAttached() + { + $child1 = $this->createChild(); + $child2 = $this->createChild(); + + $message = $this->createMessage($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + + $message->attach($child1); + $message->attach($child2); + + $this->assertEquals([$child1, $child2], $message->getChildren()); + } + + public function testChildrenCanBeDetached() + { + $child1 = $this->createChild(); + $child2 = $this->createChild(); + + $message = $this->createMessage($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + + $message->attach($child1); + $message->attach($child2); + + $message->detach($child1); + + $this->assertEquals([$child2], $message->getChildren()); + } + + public function testEmbedAttachesChild() + { + $child = $this->createChild(); + + $message = $this->createMessage($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + + $message->embed($child); + + $this->assertEquals([$child], $message->getChildren()); + } + + public function testEmbedReturnsValidCid() + { + $child = $this->createChild(Swift_Mime_SimpleMimeEntity::LEVEL_RELATED, '', + false + ); + $child->shouldReceive('getId') + ->zeroOrMoreTimes() + ->andReturn('foo@bar'); + + $message = $this->createMessage($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + + $this->assertEquals('cid:foo@bar', $message->embed($child)); + } + + public function testFluidInterface() + { + $child = $this->createChild(); + $message = $this->createMessage($this->createHeaderSet(), + $this->createEncoder(), $this->createCache() + ); + $this->assertSame($message, + $message + ->setContentType('text/plain') + ->setEncoder($this->createEncoder()) + ->setId('foo@bar') + ->setDescription('my description') + ->setMaxLineLength(998) + ->setBody('xx') + ->setBoundary('xyz') + ->setChildren([]) + ->setCharset('iso-8859-1') + ->setFormat('flowed') + ->setDelSp(false) + ->setSubject('subj') + ->setDate(new DateTimeImmutable()) + ->setReturnPath('foo@bar') + ->setSender('foo@bar') + ->setFrom(['x@y' => 'XY']) + ->setReplyTo(['ab@cd' => 'ABCD']) + ->setTo(['chris@site.tld', 'mark@site.tld']) + ->setCc('john@somewhere.tld') + ->setBcc(['one@site', 'two@site' => 'Two']) + ->setPriority($message::PRIORITY_LOW) + ->setReadReceiptTo('a@b') + ->attach($child) + ->detach($child) + ); + } + + //abstract + protected function createEntity($headers, $encoder, $cache) + { + return $this->createMessage($headers, $encoder, $cache); + } + + protected function createMimePart($headers, $encoder, $cache) + { + return $this->createMessage($headers, $encoder, $cache); + } + + private function createMessage($headers, $encoder, $cache) + { + $idGenerator = new Swift_Mime_IdGenerator('example.com'); + + return new Swift_Mime_SimpleMessage($headers, $encoder, $cache, $idGenerator); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php new file mode 100644 index 0000000..24578ed --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php @@ -0,0 +1,12 @@ +assertEquals(10, $plugin->getThreshold()); + $plugin->setThreshold(100); + $this->assertEquals(100, $plugin->getThreshold()); + } + + public function testSleepTimeCanBeSetAndFetched() + { + $plugin = new Swift_Plugins_AntiFloodPlugin(10, 5); + $this->assertEquals(5, $plugin->getSleepTime()); + $plugin->setSleepTime(1); + $this->assertEquals(1, $plugin->getSleepTime()); + } + + public function testPluginStopsConnectionAfterThreshold() + { + $transport = $this->createTransport(); + $transport->expects($this->once()) + ->method('start'); + $transport->expects($this->once()) + ->method('stop'); + + $evt = $this->createSendEvent($transport); + + $plugin = new Swift_Plugins_AntiFloodPlugin(10); + for ($i = 0; $i < 12; ++$i) { + $plugin->sendPerformed($evt); + } + } + + public function testPluginCanStopAndStartMultipleTimes() + { + $transport = $this->createTransport(); + $transport->expects($this->exactly(5)) + ->method('start'); + $transport->expects($this->exactly(5)) + ->method('stop'); + + $evt = $this->createSendEvent($transport); + + $plugin = new Swift_Plugins_AntiFloodPlugin(2); + for ($i = 0; $i < 11; ++$i) { + $plugin->sendPerformed($evt); + } + } + + public function testPluginCanSleepDuringRestart() + { + $sleeper = $this->getMockBuilder('Swift_Plugins_Sleeper')->getMock(); + $sleeper->expects($this->once()) + ->method('sleep') + ->with(10); + + $transport = $this->createTransport(); + $transport->expects($this->once()) + ->method('start'); + $transport->expects($this->once()) + ->method('stop'); + + $evt = $this->createSendEvent($transport); + + $plugin = new Swift_Plugins_AntiFloodPlugin(99, 10, $sleeper); + for ($i = 0; $i < 101; ++$i) { + $plugin->sendPerformed($evt); + } + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } + + private function createSendEvent($transport) + { + $evt = $this->getMockBuilder('Swift_Events_SendEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getSource') + ->will($this->returnValue($transport)); + $evt->expects($this->any()) + ->method('getTransport') + ->will($this->returnValue($transport)); + + return $evt; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php new file mode 100644 index 0000000..cbacfe2 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php @@ -0,0 +1,128 @@ +monitor = new Swift_Plugins_BandwidthMonitorPlugin(); + } + + public function testBytesOutIncreasesWhenCommandsSent() + { + $evt = $this->createCommandEvent("RCPT TO:\r\n"); + + $this->assertEquals(0, $this->monitor->getBytesOut()); + $this->monitor->commandSent($evt); + $this->assertEquals(23, $this->monitor->getBytesOut()); + $this->monitor->commandSent($evt); + $this->assertEquals(46, $this->monitor->getBytesOut()); + } + + public function testBytesInIncreasesWhenResponsesReceived() + { + $evt = $this->createResponseEvent("250 Ok\r\n"); + + $this->assertEquals(0, $this->monitor->getBytesIn()); + $this->monitor->responseReceived($evt); + $this->assertEquals(8, $this->monitor->getBytesIn()); + $this->monitor->responseReceived($evt); + $this->assertEquals(16, $this->monitor->getBytesIn()); + } + + public function testCountersCanBeReset() + { + $evt = $this->createResponseEvent("250 Ok\r\n"); + + $this->assertEquals(0, $this->monitor->getBytesIn()); + $this->monitor->responseReceived($evt); + $this->assertEquals(8, $this->monitor->getBytesIn()); + $this->monitor->responseReceived($evt); + $this->assertEquals(16, $this->monitor->getBytesIn()); + + $evt = $this->createCommandEvent("RCPT TO:\r\n"); + + $this->assertEquals(0, $this->monitor->getBytesOut()); + $this->monitor->commandSent($evt); + $this->assertEquals(23, $this->monitor->getBytesOut()); + $this->monitor->commandSent($evt); + $this->assertEquals(46, $this->monitor->getBytesOut()); + + $this->monitor->reset(); + + $this->assertEquals(0, $this->monitor->getBytesOut()); + $this->assertEquals(0, $this->monitor->getBytesIn()); + } + + public function testBytesOutIncreasesAccordingToMessageLength() + { + $message = $this->createMessageWithByteCount(6); + $evt = $this->createSendEvent($message); + + $this->assertEquals(0, $this->monitor->getBytesOut()); + $this->monitor->sendPerformed($evt); + $this->assertEquals(6, $this->monitor->getBytesOut()); + $this->monitor->sendPerformed($evt); + $this->assertEquals(12, $this->monitor->getBytesOut()); + } + + private function createSendEvent($message) + { + $evt = $this->getMockBuilder('Swift_Events_SendEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getMessage') + ->will($this->returnValue($message)); + + return $evt; + } + + private function createCommandEvent($command) + { + $evt = $this->getMockBuilder('Swift_Events_CommandEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getCommand') + ->will($this->returnValue($command)); + + return $evt; + } + + private function createResponseEvent($response) + { + $evt = $this->getMockBuilder('Swift_Events_ResponseEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getResponse') + ->will($this->returnValue($response)); + + return $evt; + } + + private function createMessageWithByteCount($bytes) + { + $this->bytes = $bytes; + $msg = $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + $msg->expects($this->any()) + ->method('toByteStream') + ->will($this->returnCallback([$this, 'write'])); + /* $this->checking(Expectations::create() + -> ignoring($msg)->toByteStream(any()) -> calls(array($this, 'write')) + ); */ + + return $msg; + } + + public function write($is) + { + for ($i = 0; $i < $this->bytes; ++$i) { + $is->write('x'); + } + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php new file mode 100644 index 0000000..97b1d95 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php @@ -0,0 +1,284 @@ +createMessage( + $this->createHeaders(), + ['zip@button.tld' => 'Zipathon'], + ['chris.corbyn@swiftmailer.org' => 'Chris'], + 'Subject', + 'Hello {name}, you are customer #{id}' + ); + $message->shouldReceive('setBody') + ->once() + ->with('Hello Zip, you are customer #456'); + $message->shouldReceive('setBody') + ->zeroOrMoreTimes(); + + $plugin = $this->createPlugin( + ['zip@button.tld' => ['{name}' => 'Zip', '{id}' => '456']] + ); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + + public function testReplacementsCanBeAppliedToSameMessageMultipleTimes() + { + $message = $this->createMessage( + $this->createHeaders(), + ['zip@button.tld' => 'Zipathon', 'foo@bar.tld' => 'Foo'], + ['chris.corbyn@swiftmailer.org' => 'Chris'], + 'Subject', + 'Hello {name}, you are customer #{id}' + ); + $message->shouldReceive('setBody') + ->once() + ->with('Hello Zip, you are customer #456'); + $message->shouldReceive('setBody') + ->once() + ->with('Hello {name}, you are customer #{id}'); + $message->shouldReceive('setBody') + ->once() + ->with('Hello Foo, you are customer #123'); + $message->shouldReceive('setBody') + ->zeroOrMoreTimes(); + + $plugin = $this->createPlugin( + [ + 'foo@bar.tld' => ['{name}' => 'Foo', '{id}' => '123'], + 'zip@button.tld' => ['{name}' => 'Zip', '{id}' => '456'], + ] + ); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + + public function testReplacementsCanBeMadeInHeaders() + { + $headers = $this->createHeaders([ + $returnPathHeader = $this->createHeader('Return-Path', 'foo-{id}@swiftmailer.org'), + $toHeader = $this->createHeader('Subject', 'A message for {name}!'), + ]); + + $message = $this->createMessage( + $headers, + ['zip@button.tld' => 'Zipathon'], + ['chris.corbyn@swiftmailer.org' => 'Chris'], + 'A message for {name}!', + 'Hello {name}, you are customer #{id}' + ); + + $message->shouldReceive('setBody') + ->once() + ->with('Hello Zip, you are customer #456'); + $toHeader->shouldReceive('setFieldBodyModel') + ->once() + ->with('A message for Zip!'); + $returnPathHeader->shouldReceive('setFieldBodyModel') + ->once() + ->with('foo-456@swiftmailer.org'); + $message->shouldReceive('setBody') + ->zeroOrMoreTimes(); + $toHeader->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + $returnPathHeader->shouldReceive('setFieldBodyModel') + ->zeroOrMoreTimes(); + + $plugin = $this->createPlugin( + ['zip@button.tld' => ['{name}' => 'Zip', '{id}' => '456']] + ); + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + + public function testReplacementsAreMadeOnSubparts() + { + $part1 = $this->createPart('text/plain', 'Your name is {name}?', '1@x'); + $part2 = $this->createPart('text/html', 'Your name is {name}?', '2@x'); + $message = $this->createMessage( + $this->createHeaders(), + ['zip@button.tld' => 'Zipathon'], + ['chris.corbyn@swiftmailer.org' => 'Chris'], + 'A message for {name}!', + 'Subject' + ); + $message->shouldReceive('getChildren') + ->zeroOrMoreTimes() + ->andReturn([$part1, $part2]); + $part1->shouldReceive('setBody') + ->once() + ->with('Your name is Zip?'); + $part2->shouldReceive('setBody') + ->once() + ->with('Your name is Zip?'); + $part1->shouldReceive('setBody') + ->zeroOrMoreTimes(); + $part2->shouldReceive('setBody') + ->zeroOrMoreTimes(); + + $plugin = $this->createPlugin( + ['zip@button.tld' => ['{name}' => 'Zip', '{id}' => '456']] + ); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + + public function testReplacementsCanBeTakenFromCustomReplacementsObject() + { + $message = $this->createMessage( + $this->createHeaders(), + ['foo@bar' => 'Foobar', 'zip@zap' => 'Zip zap'], + ['chris.corbyn@swiftmailer.org' => 'Chris'], + 'Subject', + 'Something {a}' + ); + + $replacements = $this->createReplacements(); + + $message->shouldReceive('setBody') + ->once() + ->with('Something b'); + $message->shouldReceive('setBody') + ->once() + ->with('Something c'); + $message->shouldReceive('setBody') + ->zeroOrMoreTimes(); + $replacements->shouldReceive('getReplacementsFor') + ->once() + ->with('foo@bar') + ->andReturn(['{a}' => 'b']); + $replacements->shouldReceive('getReplacementsFor') + ->once() + ->with('zip@zap') + ->andReturn(['{a}' => 'c']); + + $plugin = $this->createPlugin($replacements); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + + public function testReplacementsWithAMessageWithImmutableDate() + { + $message = (new Swift_Message('subject foo')) + ->setBody('body foo') + ->addTo('somebody@hostname.tld') + ->addFrom('somebody@hostname.tld'); + + $evt = $this->createSendEvent($message); + + $plugin = $this->createPlugin(['somebody@hostname.tld' => ['foo' => 'bar']]); + + $plugin->beforeSendPerformed($evt); + + $this->assertEquals('subject bar', $message->getSubject()); + $this->assertEquals('body bar', $message->getBody()); + } + + private function createMessage($headers, $to = [], $from = null, $subject = null, + $body = null) + { + $message = $this->getMockery('Swift_Mime_SimpleMessage')->shouldIgnoreMissing(); + foreach ($to as $addr => $name) { + $message->shouldReceive('getTo') + ->once() + ->andReturn([$addr => $name]); + } + $message->shouldReceive('getHeaders') + ->zeroOrMoreTimes() + ->andReturn($headers); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn($from); + $message->shouldReceive('getSubject') + ->zeroOrMoreTimes() + ->andReturn($subject); + $message->shouldReceive('getBody') + ->zeroOrMoreTimes() + ->andReturn($body); + + return $message; + } + + private function createPlugin($replacements) + { + return new Swift_Plugins_DecoratorPlugin($replacements); + } + + private function createReplacements() + { + return $this->getMockery('Swift_Plugins_Decorator_Replacements')->shouldIgnoreMissing(); + } + + private function createSendEvent(Swift_Mime_SimpleMessage $message) + { + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + $evt->shouldReceive('getMessage') + ->zeroOrMoreTimes() + ->andReturn($message); + + return $evt; + } + + private function createPart($type, $body, $id) + { + $part = $this->getMockery('Swift_Mime_SimpleMimeEntity')->shouldIgnoreMissing(); + $part->shouldReceive('getContentType') + ->zeroOrMoreTimes() + ->andReturn($type); + $part->shouldReceive('getBody') + ->zeroOrMoreTimes() + ->andReturn($body); + $part->shouldReceive('getId') + ->zeroOrMoreTimes() + ->andReturn($id); + + return $part; + } + + private function createHeaders($headers = []) + { + $set = $this->getMockery('Swift_Mime_SimpleHeaderSet')->shouldIgnoreMissing(); + $set->shouldReceive('getAll') + ->zeroOrMoreTimes() + ->andReturn($headers); + + foreach ($headers as $header) { + $set->set($header); + } + + return $set; + } + + private function createHeader($name, $body = '') + { + $header = $this->getMockery('Swift_Mime_Header')->shouldIgnoreMissing(); + $header->shouldReceive('getFieldName') + ->zeroOrMoreTimes() + ->andReturn($name); + $header->shouldReceive('getFieldBodyModel') + ->zeroOrMoreTimes() + ->andReturn($body); + + return $header; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php new file mode 100644 index 0000000..d66021c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php @@ -0,0 +1,188 @@ +createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with('foo'); + + $plugin = $this->createPlugin($logger); + $plugin->add('foo'); + } + + public function testLoggerDelegatesDumpingEntries() + { + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('dump') + ->will($this->returnValue('foobar')); + + $plugin = $this->createPlugin($logger); + $this->assertEquals('foobar', $plugin->dump()); + } + + public function testLoggerDelegatesClearingEntries() + { + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('clear'); + + $plugin = $this->createPlugin($logger); + $plugin->clear(); + } + + public function testCommandIsSentToLogger() + { + $evt = $this->createCommandEvent("foo\r\n"); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with(static::regExp('~foo\r\n~')); + + $plugin = $this->createPlugin($logger); + $plugin->commandSent($evt); + } + + public function testResponseIsSentToLogger() + { + $evt = $this->createResponseEvent("354 Go ahead\r\n"); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with(static::regExp('~354 Go ahead\r\n~')); + + $plugin = $this->createPlugin($logger); + $plugin->responseReceived($evt); + } + + public function testTransportBeforeStartChangeIsSentToLogger() + { + $evt = $this->createTransportChangeEvent(); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with($this->anything()); + + $plugin = $this->createPlugin($logger); + $plugin->beforeTransportStarted($evt); + } + + public function testTransportStartChangeIsSentToLogger() + { + $evt = $this->createTransportChangeEvent(); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with($this->anything()); + + $plugin = $this->createPlugin($logger); + $plugin->transportStarted($evt); + } + + public function testTransportStopChangeIsSentToLogger() + { + $evt = $this->createTransportChangeEvent(); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with($this->anything()); + + $plugin = $this->createPlugin($logger); + $plugin->transportStopped($evt); + } + + public function testTransportBeforeStopChangeIsSentToLogger() + { + $evt = $this->createTransportChangeEvent(); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with($this->anything()); + + $plugin = $this->createPlugin($logger); + $plugin->beforeTransportStopped($evt); + } + + public function testExceptionsArePassedToDelegateAndLeftToBubbleUp() + { + $transport = $this->createTransport(); + $evt = $this->createTransportExceptionEvent(); + $logger = $this->createLogger(); + $logger->expects($this->once()) + ->method('add') + ->with($this->anything()); + + $plugin = $this->createPlugin($logger); + try { + $plugin->exceptionThrown($evt); + $this->fail('Exception should bubble up.'); + } catch (Swift_TransportException $ex) { + } + } + + private function createLogger() + { + return $this->getMockBuilder('Swift_Plugins_Logger')->getMock(); + } + + private function createPlugin($logger) + { + return new Swift_Plugins_LoggerPlugin($logger); + } + + private function createCommandEvent($command) + { + $evt = $this->getMockBuilder('Swift_Events_CommandEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getCommand') + ->will($this->returnValue($command)); + + return $evt; + } + + private function createResponseEvent($response) + { + $evt = $this->getMockBuilder('Swift_Events_ResponseEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getResponse') + ->will($this->returnValue($response)); + + return $evt; + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } + + private function createTransportChangeEvent() + { + $evt = $this->getMockBuilder('Swift_Events_TransportChangeEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getSource') + ->will($this->returnValue($this->createTransport())); + + return $evt; + } + + public function createTransportExceptionEvent() + { + $evt = $this->getMockBuilder('Swift_Events_TransportExceptionEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getException') + ->will($this->returnValue(new Swift_TransportException(''))); + + return $evt; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php new file mode 100644 index 0000000..48c1b07 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php @@ -0,0 +1,65 @@ +add(">> Foo\r\n"); + $this->assertEquals(">> Foo\r\n", $logger->dump()); + } + + public function testAddingMultipleEntriesDumpsMultipleLines() + { + $logger = new Swift_Plugins_Loggers_ArrayLogger(); + $logger->add(">> FOO\r\n"); + $logger->add("<< 502 That makes no sense\r\n"); + $logger->add(">> RSET\r\n"); + $logger->add("<< 250 OK\r\n"); + + $this->assertEquals( + ">> FOO\r\n".PHP_EOL. + "<< 502 That makes no sense\r\n".PHP_EOL. + ">> RSET\r\n".PHP_EOL. + "<< 250 OK\r\n", + $logger->dump() + ); + } + + public function testLogCanBeCleared() + { + $logger = new Swift_Plugins_Loggers_ArrayLogger(); + $logger->add(">> FOO\r\n"); + $logger->add("<< 502 That makes no sense\r\n"); + $logger->add(">> RSET\r\n"); + $logger->add("<< 250 OK\r\n"); + + $this->assertEquals( + ">> FOO\r\n".PHP_EOL. + "<< 502 That makes no sense\r\n".PHP_EOL. + ">> RSET\r\n".PHP_EOL. + "<< 250 OK\r\n", + $logger->dump() + ); + + $logger->clear(); + + $this->assertEquals('', $logger->dump()); + } + + public function testLengthCanBeTruncated() + { + $logger = new Swift_Plugins_Loggers_ArrayLogger(2); + $logger->add(">> FOO\r\n"); + $logger->add("<< 502 That makes no sense\r\n"); + $logger->add(">> RSET\r\n"); + $logger->add("<< 250 OK\r\n"); + + $this->assertEquals( + ">> RSET\r\n".PHP_EOL. + "<< 250 OK\r\n", + $logger->dump(), + '%s: Log should be truncated to last 2 entries' + ); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php new file mode 100644 index 0000000..c43660d --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php @@ -0,0 +1,24 @@ +add('>> Foo'); + $data = ob_get_clean(); + + $this->assertEquals('>> Foo'.PHP_EOL, $data); + } + + public function testAddingEntryDumpsEscapedLineWithHtml() + { + $logger = new Swift_Plugins_Loggers_EchoLogger(true); + ob_start(); + $logger->add('>> Foo'); + $data = ob_get_clean(); + + $this->assertEquals('>> Foo
'.PHP_EOL, $data); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php new file mode 100644 index 0000000..cf88a4e --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php @@ -0,0 +1,101 @@ +createConnection(); + $connection->expects($this->once()) + ->method('connect'); + + $plugin = $this->createPlugin('pop.host.tld', 110); + $plugin->setConnection($connection); + + $transport = $this->createTransport(); + $evt = $this->createTransportChangeEvent($transport); + + $plugin->beforeTransportStarted($evt); + } + + public function testPluginDisconnectsFromPop3HostBeforeTransportStarts() + { + $connection = $this->createConnection(); + $connection->expects($this->once()) + ->method('disconnect'); + + $plugin = $this->createPlugin('pop.host.tld', 110); + $plugin->setConnection($connection); + + $transport = $this->createTransport(); + $evt = $this->createTransportChangeEvent($transport); + + $plugin->beforeTransportStarted($evt); + } + + public function testPluginDoesNotConnectToSmtpIfBoundToDifferentTransport() + { + $connection = $this->createConnection(); + $connection->expects($this->never()) + ->method('disconnect'); + $connection->expects($this->never()) + ->method('connect'); + + $smtp = $this->createTransport(); + + $plugin = $this->createPlugin('pop.host.tld', 110); + $plugin->setConnection($connection); + $plugin->bindSmtp($smtp); + + $transport = $this->createTransport(); + $evt = $this->createTransportChangeEvent($transport); + + $plugin->beforeTransportStarted($evt); + } + + public function testPluginCanBindToSpecificTransport() + { + $connection = $this->createConnection(); + $connection->expects($this->once()) + ->method('connect'); + + $smtp = $this->createTransport(); + + $plugin = $this->createPlugin('pop.host.tld', 110); + $plugin->setConnection($connection); + $plugin->bindSmtp($smtp); + + $evt = $this->createTransportChangeEvent($smtp); + + $plugin->beforeTransportStarted($evt); + } + + private function createTransport() + { + return $this->getMockBuilder('Swift_Transport')->getMock(); + } + + private function createTransportChangeEvent($transport) + { + $evt = $this->getMockBuilder('Swift_Events_TransportChangeEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getSource') + ->will($this->returnValue($transport)); + $evt->expects($this->any()) + ->method('getTransport') + ->will($this->returnValue($transport)); + + return $evt; + } + + public function createConnection() + { + return $this->getMockBuilder('Swift_Plugins_Pop_Pop3Connection')->getMock(); + } + + public function createPlugin($host, $port, $crypto = null) + { + return new Swift_Plugins_PopBeforeSmtpPlugin($host, $port, $crypto); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php new file mode 100644 index 0000000..0ad6386 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php @@ -0,0 +1,183 @@ +assertEquals('fabien@example.com', $plugin->getRecipient()); + $plugin->setRecipient('chris@example.com'); + $this->assertEquals('chris@example.com', $plugin->getRecipient()); + } + + public function testPluginChangesRecipients() + { + $message = (new Swift_Message()) + ->setSubject('...') + ->setFrom(['john@example.com' => 'John Doe']) + ->setTo($to = [ + 'fabien-to@example.com' => 'Fabien (To)', + 'chris-to@example.com' => 'Chris (To)', + ]) + ->setCc($cc = [ + 'fabien-cc@example.com' => 'Fabien (Cc)', + 'chris-cc@example.com' => 'Chris (Cc)', + ]) + ->setBcc($bcc = [ + 'fabien-bcc@example.com' => 'Fabien (Bcc)', + 'chris-bcc@example.com' => 'Chris (Bcc)', + ]) + ->setBody('...') + ; + + $plugin = new Swift_Plugins_RedirectingPlugin('god@example.com'); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + + $this->assertEquals($message->getTo(), ['god@example.com' => '']); + $this->assertEquals($message->getCc(), []); + $this->assertEquals($message->getBcc(), []); + + $plugin->sendPerformed($evt); + + $this->assertEquals($message->getTo(), $to); + $this->assertEquals($message->getCc(), $cc); + $this->assertEquals($message->getBcc(), $bcc); + } + + public function testPluginRespectsUnsetToList() + { + $message = (new Swift_Message()) + ->setSubject('...') + ->setFrom(['john@example.com' => 'John Doe']) + ->setCc($cc = [ + 'fabien-cc@example.com' => 'Fabien (Cc)', + 'chris-cc@example.com' => 'Chris (Cc)', + ]) + ->setBcc($bcc = [ + 'fabien-bcc@example.com' => 'Fabien (Bcc)', + 'chris-bcc@example.com' => 'Chris (Bcc)', + ]) + ->setBody('...') + ; + + $plugin = new Swift_Plugins_RedirectingPlugin('god@example.com'); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + + $this->assertEquals($message->getTo(), ['god@example.com' => '']); + $this->assertEquals($message->getCc(), []); + $this->assertEquals($message->getBcc(), []); + + $plugin->sendPerformed($evt); + + $this->assertEquals($message->getTo(), []); + $this->assertEquals($message->getCc(), $cc); + $this->assertEquals($message->getBcc(), $bcc); + } + + public function testPluginRespectsAWhitelistOfPatterns() + { + $message = (new Swift_Message()) + ->setSubject('...') + ->setFrom(['john@example.com' => 'John Doe']) + ->setTo($to = [ + 'fabien-to@example.com' => 'Fabien (To)', + 'chris-to@example.com' => 'Chris (To)', + 'lars-to@internal.com' => 'Lars (To)', + ]) + ->setCc($cc = [ + 'fabien-cc@example.com' => 'Fabien (Cc)', + 'chris-cc@example.com' => 'Chris (Cc)', + 'lars-cc@internal.org' => 'Lars (Cc)', + ]) + ->setBcc($bcc = [ + 'fabien-bcc@example.com' => 'Fabien (Bcc)', + 'chris-bcc@example.com' => 'Chris (Bcc)', + 'john-bcc@example.org' => 'John (Bcc)', + ]) + ->setBody('...') + ; + + $recipient = 'god@example.com'; + $patterns = ['/^.*@internal.[a-z]+$/', '/^john-.*$/']; + + $plugin = new Swift_Plugins_RedirectingPlugin($recipient, $patterns); + + $this->assertEquals($recipient, $plugin->getRecipient()); + $this->assertEquals($plugin->getWhitelist(), $patterns); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + + $this->assertEquals($message->getTo(), ['lars-to@internal.com' => 'Lars (To)', 'god@example.com' => null]); + $this->assertEquals($message->getCc(), ['lars-cc@internal.org' => 'Lars (Cc)']); + $this->assertEquals($message->getBcc(), ['john-bcc@example.org' => 'John (Bcc)']); + + $plugin->sendPerformed($evt); + + $this->assertEquals($message->getTo(), $to); + $this->assertEquals($message->getCc(), $cc); + $this->assertEquals($message->getBcc(), $bcc); + } + + public function testArrayOfRecipientsCanBeExplicitlyDefined() + { + $message = (new Swift_Message()) + ->setSubject('...') + ->setFrom(['john@example.com' => 'John Doe']) + ->setTo([ + 'fabien@example.com' => 'Fabien', + 'chris@example.com' => 'Chris (To)', + 'lars-to@internal.com' => 'Lars (To)', + ]) + ->setCc([ + 'fabien@example.com' => 'Fabien', + 'chris-cc@example.com' => 'Chris (Cc)', + 'lars-cc@internal.org' => 'Lars (Cc)', + ]) + ->setBcc([ + 'fabien@example.com' => 'Fabien', + 'chris-bcc@example.com' => 'Chris (Bcc)', + 'john-bcc@example.org' => 'John (Bcc)', + ]) + ->setBody('...') + ; + + $recipients = ['god@example.com', 'fabien@example.com']; + $patterns = ['/^.*@internal.[a-z]+$/']; + + $plugin = new Swift_Plugins_RedirectingPlugin($recipients, $patterns); + + $evt = $this->createSendEvent($message); + + $plugin->beforeSendPerformed($evt); + + $this->assertEquals( + $message->getTo(), + ['fabien@example.com' => 'Fabien', 'lars-to@internal.com' => 'Lars (To)', 'god@example.com' => null] + ); + $this->assertEquals( + $message->getCc(), + ['fabien@example.com' => 'Fabien', 'lars-cc@internal.org' => 'Lars (Cc)'] + ); + $this->assertEquals($message->getBcc(), ['fabien@example.com' => 'Fabien']); + } + + private function createSendEvent(Swift_Mime_SimpleMessage $message) + { + $evt = $this->getMockBuilder('Swift_Events_SendEvent') + ->disableOriginalConstructor() + ->getMock(); + $evt->expects($this->any()) + ->method('getMessage') + ->will($this->returnValue($message)); + + return $evt; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php new file mode 100644 index 0000000..19238f8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php @@ -0,0 +1,86 @@ +createMessage(); + $evt = $this->createSendEvent(); + $reporter = $this->createReporter(); + + $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(['foo@bar.tld' => 'Foo']); + $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message); + $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn([]); + $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS); + + $plugin = new Swift_Plugins_ReporterPlugin($reporter); + $plugin->sendPerformed($evt); + } + + public function testReportingFailedTo() + { + $message = $this->createMessage(); + $evt = $this->createSendEvent(); + $reporter = $this->createReporter(); + + $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(['foo@bar.tld' => 'Foo', 'zip@button' => 'Zip']); + $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message); + $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(['zip@button']); + $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS); + $reporter->shouldReceive('notify')->once()->with($message, 'zip@button', Swift_Plugins_Reporter::RESULT_FAIL); + + $plugin = new Swift_Plugins_ReporterPlugin($reporter); + $plugin->sendPerformed($evt); + } + + public function testReportingFailedCc() + { + $message = $this->createMessage(); + $evt = $this->createSendEvent(); + $reporter = $this->createReporter(); + + $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(['foo@bar.tld' => 'Foo']); + $message->shouldReceive('getCc')->zeroOrMoreTimes()->andReturn(['zip@button' => 'Zip', 'test@test.com' => 'Test']); + $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message); + $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(['zip@button']); + $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS); + $reporter->shouldReceive('notify')->once()->with($message, 'zip@button', Swift_Plugins_Reporter::RESULT_FAIL); + $reporter->shouldReceive('notify')->once()->with($message, 'test@test.com', Swift_Plugins_Reporter::RESULT_PASS); + + $plugin = new Swift_Plugins_ReporterPlugin($reporter); + $plugin->sendPerformed($evt); + } + + public function testReportingFailedBcc() + { + $message = $this->createMessage(); + $evt = $this->createSendEvent(); + $reporter = $this->createReporter(); + + $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(['foo@bar.tld' => 'Foo']); + $message->shouldReceive('getBcc')->zeroOrMoreTimes()->andReturn(['zip@button' => 'Zip', 'test@test.com' => 'Test']); + $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message); + $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(['zip@button']); + $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS); + $reporter->shouldReceive('notify')->once()->with($message, 'zip@button', Swift_Plugins_Reporter::RESULT_FAIL); + $reporter->shouldReceive('notify')->once()->with($message, 'test@test.com', Swift_Plugins_Reporter::RESULT_PASS); + + $plugin = new Swift_Plugins_ReporterPlugin($reporter); + $plugin->sendPerformed($evt); + } + + private function createMessage() + { + return $this->getMockery('Swift_Mime_SimpleMessage')->shouldIgnoreMissing(); + } + + private function createSendEvent() + { + return $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + } + + private function createReporter() + { + return $this->getMockery('Swift_Plugins_Reporter')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php new file mode 100644 index 0000000..d5a1c9c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php @@ -0,0 +1,64 @@ +hitReporter = new Swift_Plugins_Reporters_HitReporter(); + $this->message = $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + } + + public function testReportingFail() + { + $this->hitReporter->notify($this->message, 'foo@bar.tld', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $this->assertEquals(['foo@bar.tld'], + $this->hitReporter->getFailedRecipients() + ); + } + + public function testMultipleReports() + { + $this->hitReporter->notify($this->message, 'foo@bar.tld', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $this->hitReporter->notify($this->message, 'zip@button', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $this->assertEquals(['foo@bar.tld', 'zip@button'], + $this->hitReporter->getFailedRecipients() + ); + } + + public function testReportingPassIsIgnored() + { + $this->hitReporter->notify($this->message, 'foo@bar.tld', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $this->hitReporter->notify($this->message, 'zip@button', + Swift_Plugins_Reporter::RESULT_PASS + ); + $this->assertEquals(['foo@bar.tld'], + $this->hitReporter->getFailedRecipients() + ); + } + + public function testBufferCanBeCleared() + { + $this->hitReporter->notify($this->message, 'foo@bar.tld', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $this->hitReporter->notify($this->message, 'zip@button', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $this->assertEquals(['foo@bar.tld', 'zip@button'], + $this->hitReporter->getFailedRecipients() + ); + $this->hitReporter->clear(); + $this->assertEquals([], $this->hitReporter->getFailedRecipients()); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php new file mode 100644 index 0000000..6b86cfe --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php @@ -0,0 +1,54 @@ +html = new Swift_Plugins_Reporters_HtmlReporter(); + $this->message = $this->getMockBuilder('Swift_Mime_SimpleMessage')->disableOriginalConstructor()->getMock(); + } + + public function testReportingPass() + { + ob_start(); + $this->html->notify($this->message, 'foo@bar.tld', + Swift_Plugins_Reporter::RESULT_PASS + ); + $html = ob_get_clean(); + + $this->assertRegExp('~ok|pass~i', $html, '%s: Reporter should indicate pass'); + $this->assertRegExp('~foo@bar\.tld~', $html, '%s: Reporter should show address'); + } + + public function testReportingFail() + { + ob_start(); + $this->html->notify($this->message, 'zip@button', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $html = ob_get_clean(); + + $this->assertRegExp('~fail~i', $html, '%s: Reporter should indicate fail'); + $this->assertRegExp('~zip@button~', $html, '%s: Reporter should show address'); + } + + public function testMultipleReports() + { + ob_start(); + $this->html->notify($this->message, 'foo@bar.tld', + Swift_Plugins_Reporter::RESULT_PASS + ); + $this->html->notify($this->message, 'zip@button', + Swift_Plugins_Reporter::RESULT_FAIL + ); + $html = ob_get_clean(); + + $this->assertRegExp('~ok|pass~i', $html, '%s: Reporter should indicate pass'); + $this->assertRegExp('~foo@bar\.tld~', $html, '%s: Reporter should show address'); + $this->assertRegExp('~fail~i', $html, '%s: Reporter should indicate fail'); + $this->assertRegExp('~zip@button~', $html, '%s: Reporter should show address'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php new file mode 100644 index 0000000..e35dcc8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php @@ -0,0 +1,102 @@ +createSleeper(); + $timer = $this->createTimer(); + + //10MB/min + $plugin = new Swift_Plugins_ThrottlerPlugin( + 10000000, Swift_Plugins_ThrottlerPlugin::BYTES_PER_MINUTE, + $sleeper, $timer + ); + + $timer->shouldReceive('getTimestamp')->once()->andReturn(0); + $timer->shouldReceive('getTimestamp')->once()->andReturn(1); //expected 0.6 + $timer->shouldReceive('getTimestamp')->once()->andReturn(1); //expected 1.2 (sleep 1) + $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 1.8 + $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 2.4 (sleep 1) + $sleeper->shouldReceive('sleep')->twice()->with(1); + + //10,000,000 bytes per minute + //100,000 bytes per email + + // .: (10,000,000/100,000)/60 emails per second = 1.667 emais/sec + + $message = $this->createMessageWithByteCount(100000); //100KB + + $evt = $this->createSendEvent($message); + + for ($i = 0; $i < 5; ++$i) { + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + } + + public function testMessagesPerMinuteThrottling() + { + $sleeper = $this->createSleeper(); + $timer = $this->createTimer(); + + //60/min + $plugin = new Swift_Plugins_ThrottlerPlugin( + 60, Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE, + $sleeper, $timer + ); + + $timer->shouldReceive('getTimestamp')->once()->andReturn(0); + $timer->shouldReceive('getTimestamp')->once()->andReturn(0); //expected 1 (sleep 1) + $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 2 + $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 3 (sleep 1) + $timer->shouldReceive('getTimestamp')->once()->andReturn(4); //expected 4 + $sleeper->shouldReceive('sleep')->twice()->with(1); + + //60 messages per minute + //1 message per second + + $message = $this->createMessageWithByteCount(10); + + $evt = $this->createSendEvent($message); + + for ($i = 0; $i < 5; ++$i) { + $plugin->beforeSendPerformed($evt); + $plugin->sendPerformed($evt); + } + } + + private function createSleeper() + { + return $this->getMockery('Swift_Plugins_Sleeper'); + } + + private function createTimer() + { + return $this->getMockery('Swift_Plugins_Timer'); + } + + private function createMessageWithByteCount($bytes) + { + $msg = $this->getMockery('Swift_Mime_SimpleMessage'); + $msg->shouldReceive('toByteStream') + ->zeroOrMoreTimes() + ->andReturnUsing(function ($is) use ($bytes) { + for ($i = 0; $i < $bytes; ++$i) { + $is->write('x'); + } + }); + + return $msg; + } + + private function createSendEvent($message) + { + $evt = $this->getMockery('Swift_Events_SendEvent'); + $evt->shouldReceive('getMessage') + ->zeroOrMoreTimes() + ->andReturn($message); + + return $evt; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php new file mode 100644 index 0000000..1d5f957 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php @@ -0,0 +1,220 @@ +createHeaders(); + $messageContent = 'Hello World'; + $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector'); + /* @var $signer Swift_Signers_HeaderSigner */ + $altered = $signer->getAlteredHeaders(); + $signer->reset(); + // Headers + $signer->setHeaders($headers); + // Body + $signer->startBody(); + $signer->write($messageContent); + $signer->endBody(); + // Signing + $signer->addSignature($headers); + } + + // SHA1 Signing + public function testSigningSHA1() + { + $headerSet = $this->createHeaderSet(); + $messageContent = 'Hello World'; + $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector'); + $signer->setHashAlgorithm('rsa-sha1'); + $signer->setSignatureTimestamp('1299879181'); + $altered = $signer->getAlteredHeaders(); + $this->assertEquals(['DKIM-Signature'], $altered); + $signer->reset(); + $signer->setHeaders($headerSet); + $this->assertFalse($headerSet->has('DKIM-Signature')); + $signer->startBody(); + $signer->write($messageContent); + $signer->endBody(); + $signer->addSignature($headerSet); + $this->assertTrue($headerSet->has('DKIM-Signature')); + $dkim = $headerSet->getAll('DKIM-Signature'); + $sig = reset($dkim); + $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha1; bh=wlbYcY9O9OPInGJ4D0E/rGsvMLE=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; t=1299879181; b=RMSNelzM2O5MAAnMjT3G3/VF36S3DGJXoPCXR001F1WDReu0prGphWjuzK/m6V1pwqQL8cCNg Hi74mTx2bvyAvmkjvQtJf1VMUOCc9WHGcm1Yec66I3ZWoNMGSWZ1EKAm2CtTzyG0IFw4ml9DI wSkyAFxlgicckDD6FibhqwX4w='); + } + + // SHA256 Signing + public function testSigning256() + { + $headerSet = $this->createHeaderSet(); + $messageContent = 'Hello World'; + $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector'); + $signer->setHashAlgorithm('rsa-sha256'); + $signer->setSignatureTimestamp('1299879181'); + $altered = $signer->getAlteredHeaders(); + $this->assertEquals(['DKIM-Signature'], $altered); + $signer->reset(); + $signer->setHeaders($headerSet); + $this->assertFalse($headerSet->has('DKIM-Signature')); + $signer->startBody(); + $signer->write($messageContent); + $signer->endBody(); + $signer->addSignature($headerSet); + $this->assertTrue($headerSet->has('DKIM-Signature')); + $dkim = $headerSet->getAll('DKIM-Signature'); + $sig = reset($dkim); + $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; t=1299879181; b=jqPmieHzF5vR9F4mXCAkowuphpO4iJ8IAVuioh1BFZ3VITXZj5jlOFxULJMBiiApm2keJirnh u4mzogj444QkpT3lJg8/TBGAYQPdcvkG3KC0jdyN6QpSgpITBJG2BwWa+keXsv2bkQgLRAzNx qRhP45vpHCKun0Tg9LrwW/KCg='); + } + + // Relaxed/Relaxed Hash Signing + public function testSigningRelaxedRelaxed256() + { + $headerSet = $this->createHeaderSet(); + $messageContent = 'Hello World'; + $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector'); + $signer->setHashAlgorithm('rsa-sha256'); + $signer->setSignatureTimestamp('1299879181'); + $signer->setBodyCanon('relaxed'); + $signer->setHeaderCanon('relaxed'); + $altered = $signer->getAlteredHeaders(); + $this->assertEquals(['DKIM-Signature'], $altered); + $signer->reset(); + $signer->setHeaders($headerSet); + $this->assertFalse($headerSet->has('DKIM-Signature')); + $signer->startBody(); + $signer->write($messageContent); + $signer->endBody(); + $signer->addSignature($headerSet); + $this->assertTrue($headerSet->has('DKIM-Signature')); + $dkim = $headerSet->getAll('DKIM-Signature'); + $sig = reset($dkim); + $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; c=relaxed/relaxed; t=1299879181; b=gzOI+PX6HpZKQFzwwmxzcVJsyirdLXOS+4pgfCpVHQIdqYusKLrhlLeFBTNoz75HrhNvGH6T0 Rt3w5aTqkrWfUuAEYt0Ns14GowLM7JojaFN+pZ4eYnRB3CBBgW6fee4NEMD5WPca3uS09tr1E 10RYh9ILlRtl+84sovhx5id3Y='); + } + + // Relaxed/Simple Hash Signing + public function testSigningRelaxedSimple256() + { + $headerSet = $this->createHeaderSet(); + $messageContent = 'Hello World'; + $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector'); + $signer->setHashAlgorithm('rsa-sha256'); + $signer->setSignatureTimestamp('1299879181'); + $signer->setHeaderCanon('relaxed'); + $altered = $signer->getAlteredHeaders(); + $this->assertEquals(['DKIM-Signature'], $altered); + $signer->reset(); + $signer->setHeaders($headerSet); + $this->assertFalse($headerSet->has('DKIM-Signature')); + $signer->startBody(); + $signer->write($messageContent); + $signer->endBody(); + $signer->addSignature($headerSet); + $this->assertTrue($headerSet->has('DKIM-Signature')); + $dkim = $headerSet->getAll('DKIM-Signature'); + $sig = reset($dkim); + $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; c=relaxed; t=1299879181; b=dLPJNec5v81oelyzGOY0qPqTlGnQeNfUNBOrV/JKbStr3NqWGI9jH4JAe2YvO2V32lfPNoby1 4MMzZ6EPkaZkZDDSPa+53YbCPQAlqiD9QZZIUe2UNM33HN8yAMgiWEF5aP7MbQnxeVZMfVLEl 9S8qOImu+K5JZqhQQTL0dgLwA='); + } + + // Simple/Relaxed Hash Signing + public function testSigningSimpleRelaxed256() + { + $headerSet = $this->createHeaderSet(); + $messageContent = 'Hello World'; + $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector'); + $signer->setHashAlgorithm('rsa-sha256'); + $signer->setSignatureTimestamp('1299879181'); + $signer->setBodyCanon('relaxed'); + $altered = $signer->getAlteredHeaders(); + $this->assertEquals(['DKIM-Signature'], $altered); + $signer->reset(); + $signer->setHeaders($headerSet); + $this->assertFalse($headerSet->has('DKIM-Signature')); + $signer->startBody(); + $signer->write($messageContent); + $signer->endBody(); + $signer->addSignature($headerSet); + $this->assertTrue($headerSet->has('DKIM-Signature')); + $dkim = $headerSet->getAll('DKIM-Signature'); + $sig = reset($dkim); + $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; c=simple/relaxed; t=1299879181; b=M5eomH/zamyzix9kOes+6YLzQZxuJdBP4x3nP9zF2N26eMLG2/cBKbnNyqiOTDhJdYfWPbLIa 1CWnjST0j5p4CpeOkGYuiE+M4TWEZwhRmRWootlPO3Ii6XpbBJKFk1o9zviS7OmXblUUE4aqb yRSIMDhtLdCK5GlaCneFLN7RQ='); + } + + private function createHeaderSet() + { + $cache = new Swift_KeyCache_ArrayKeyCache(new Swift_KeyCache_SimpleKeyCacheInputStream()); + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + + $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')); + $paramEncoder = new Swift_Encoder_Rfc2231Encoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')); + $emailValidator = new EmailValidator(); + $headers = new Swift_Mime_SimpleHeaderSet(new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $emailValidator)); + + return $headers; + } + + /** + * @return Swift_Mime_Headers + */ + private function createHeaders() + { + $x = 0; + $cache = new Swift_KeyCache_ArrayKeyCache(new Swift_KeyCache_SimpleKeyCacheInputStream()); + $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory(); + $contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder(); + + $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')); + $paramEncoder = new Swift_Encoder_Rfc2231Encoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')); + $emailValidator = new EmailValidator(); + $headerFactory = new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $emailValidator); + $headers = $this->getMockery('Swift_Mime_SimpleHeaderSet'); + + $headers->shouldReceive('listAll') + ->zeroOrMoreTimes() + ->andReturn(['From', 'To', 'Date', 'Subject']); + $headers->shouldReceive('has') + ->zeroOrMoreTimes() + ->with('From') + ->andReturn(true); + $headers->shouldReceive('getAll') + ->zeroOrMoreTimes() + ->with('From') + ->andReturn([$headerFactory->createMailboxHeader('From', 'test@test.test')]); + $headers->shouldReceive('has') + ->zeroOrMoreTimes() + ->with('To') + ->andReturn(true); + $headers->shouldReceive('getAll') + ->zeroOrMoreTimes() + ->with('To') + ->andReturn([$headerFactory->createMailboxHeader('To', 'test@test.test')]); + $headers->shouldReceive('has') + ->zeroOrMoreTimes() + ->with('Date') + ->andReturn(true); + $headers->shouldReceive('getAll') + ->zeroOrMoreTimes() + ->with('Date') + ->andReturn([$headerFactory->createTextHeader('Date', 'Fri, 11 Mar 2011 20:56:12 +0000 (GMT)')]); + $headers->shouldReceive('has') + ->zeroOrMoreTimes() + ->with('Subject') + ->andReturn(true); + $headers->shouldReceive('getAll') + ->zeroOrMoreTimes() + ->with('Subject') + ->andReturn([$headerFactory->createTextHeader('Subject', 'Foo Bar Text Message')]); + $headers->shouldReceive('addTextHeader') + ->zeroOrMoreTimes() + ->with('DKIM-Signature', \Mockery::any()) + ->andReturn(true); + $headers->shouldReceive('getAll') + ->zeroOrMoreTimes() + ->with('DKIM-Signature') + ->andReturn([$headerFactory->createTextHeader('DKIM-Signature', 'Foo Bar Text Message')]); + + return $headers; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php new file mode 100644 index 0000000..ce99bc6 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php @@ -0,0 +1,45 @@ +markTestSkipped( + 'Need OpenDKIM extension run these tests.' + ); + } + } + + public function testBasicSigningHeaderManipulation() + { + } + + // Default Signing + public function testSigningDefaults() + { + } + + // SHA256 Signing + public function testSigning256() + { + } + + // Relaxed/Relaxed Hash Signing + public function testSigningRelaxedRelaxed256() + { + } + + // Relaxed/Simple Hash Signing + public function testSigningRelaxedSimple256() + { + } + + // Simple/Relaxed Hash Signing + public function testSigningSimpleRelaxed256() + { + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php new file mode 100644 index 0000000..932e486 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php @@ -0,0 +1,653 @@ +replacementFactory = Swift_DependencyContainer::getInstance() + ->lookup('transport.replacementfactory'); + + $this->samplesDir = str_replace('\\', '/', realpath(__DIR__.'/../../../_samples/')).'/'; + } + + public function testUnSignedMessage() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $this->assertEquals('Here is the message itself', $message->getBody()); + } + + public function testSignedMessage() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key'); + $message->attachSigner($signer); + + $messageStream = $this->newFilteredStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!($boundary = $this->getBoundary($headers['content-type']))) { + return false; + } + + $expectedBody = <<assertValidVerify($expectedBody, $messageStream); + unset($messageStream); + } + + public function testSignedMessageWithFullyWrappedMessage() + { + $message = (new Swift_Message('Middle-out compression secrets')) + ->setFrom(['richard@piedpiper.com' => 'Richard Hendricks']) + ->setTo(['jared@piedpiper.com' => 'Jared Dunn']) + ->setBody('Here goes the entire algorithm...'); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key'); + + // Tell the signer to wrap the full MIME message + $signer->setWrapFullMessage(true); + $message->attachSigner($signer); + + $messageStream = $this->newFilteredStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!($boundary = $this->getBoundary($headers['content-type']))) { + return false; + } + + $expectedBody = << +Date: .* +Subject: Middle-out compression secrets +From: Richard Hendricks +To: Jared Dunn +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Here goes the entire algorithm... +--$boundary +Content-Type: application/(x\-)?pkcs7-signature; name="smime\.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime\.p7s" + +(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2}) + +--$boundary-- +OEL; + $this->assertValidVerify($expectedBody, $messageStream); + unset($messageStream); + } + + public function testSignedMessageExtraCerts() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign2.crt', $this->samplesDir.'smime/sign2.key', PKCS7_DETACHED, $this->samplesDir.'smime/intermediate.crt'); + $message->attachSigner($signer); + + $messageStream = $this->newFilteredStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!($boundary = $this->getBoundary($headers['content-type']))) { + return false; + } + + $expectedBody = <<assertValidVerify($expectedBody, $messageStream); + unset($messageStream); + } + + public function testSignedMessageBinary() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key', PKCS7_BINARY); + $message->attachSigner($signer); + + $messageStream = $this->newFilteredStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=signed\-data;#', $headers['content-type'])) { + $this->fail('Content-type does not match.'); + + return false; + } + + $this->assertEquals($headers['content-transfer-encoding'], 'base64'); + $this->assertEquals($headers['content-disposition'], 'attachment; filename="smime.p7m"'); + + $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})'; + + $messageStreamClean = $this->newFilteredStream(); + + $this->assertValidVerify($expectedBody, $messageStream); + unset($messageStreamClean, $messageStream); + } + + public function testSignedMessageWithAttachments() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $message->attach(Swift_Attachment::fromPath($this->samplesDir.'/files/textfile.zip')); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key'); + $message->attachSigner($signer); + + $messageStream = $this->newFilteredStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!($boundary = $this->getBoundary($headers['content-type']))) { + return false; + } + + $expectedBody = <<assertValidVerify($expectedBody, $messageStream); + unset($messageStream); + } + + public function testEncryptedMessage() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $originalMessage = $this->cleanMessage($message->toString()); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt'); + $message->attachSigner($signer); + + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) { + $this->fail('Content-type does not match.'); + + return false; + } + + $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})'; + + $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', ['file://'.$this->samplesDir.'smime/encrypt.key', 'swift'])) { + $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string())); + } + + $this->assertEquals($originalMessage, $decryptedMessageStream->getContent()); + unset($decryptedMessageStream, $messageStream); + } + + public function testEncryptedMessageWithFullyWrappedMessage() + { + $message = (new Swift_Message('Middle-out compression secrets')) + ->setFrom(['richard@piedpiper.com' => 'Richard Hendricks']) + ->setTo(['jared@piedpiper.com' => 'Jared Dunn']) + ->setBody('Here goes the entire algorithm...'); + + $originalMessage = $message->toString(); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt'); + $signer->setWrapFullMessage(true); + $message->attachSigner($signer); + + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) { + $this->fail('Content-type does not match.'); + + return false; + } + + $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})'; + + $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', ['file://'.$this->samplesDir.'smime/encrypt.key', 'swift'])) { + $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string())); + } + + $decryptedMessage = $decryptedMessageStream->getContent(); + $decryptedHeaders = self::getHeadersOfMessage($decryptedMessage); + $this->assertEquals('message/rfc822; charset=utf-8', $decryptedHeaders['content-type']); + $this->assertEquals('7bit', $decryptedHeaders['content-transfer-encoding']); + + $decryptedMessageBody = self::getBodyOfMessage($decryptedMessage); + $this->assertEquals($originalMessage, $decryptedMessageBody); + unset($decryptedMessageStream, $messageStream); + } + + public function testEncryptedMessageWithMultipleCerts() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $originalMessage = $this->cleanMessage($message->toString()); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setEncryptCertificate([$this->samplesDir.'smime/encrypt.crt', $this->samplesDir.'smime/encrypt2.crt']); + $message->attachSigner($signer); + + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) { + $this->fail('Content-type does not match.'); + + return false; + } + + $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})'; + + $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', ['file://'.$this->samplesDir.'smime/encrypt.key', 'swift'])) { + $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string())); + } + + $this->assertEquals($originalMessage, $decryptedMessageStream->getContent()); + unset($decryptedMessageStream); + + $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt2.crt', ['file://'.$this->samplesDir.'smime/encrypt2.key', 'swift'])) { + $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string())); + } + + $this->assertEquals($originalMessage, $decryptedMessageStream->getContent()); + unset($decryptedMessageStream, $messageStream); + } + + public function testSignThenEncryptedMessage() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key'); + $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt'); + $message->attachSigner($signer); + + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) { + $this->fail('Content-type does not match.'); + + return false; + } + + $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})'; + + $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', ['file://'.$this->samplesDir.'smime/encrypt.key', 'swift'])) { + $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string())); + } + + $entityString = $decryptedMessageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!($boundary = $this->getBoundary($headers['content-type']))) { + return false; + } + + $expectedBody = <<assertValidVerify($expectedBody, $decryptedMessageStream)) { + return false; + } + + unset($decryptedMessageStream, $messageStream); + } + + public function testEncryptThenSignMessage() + { + $message = (new Swift_Message('Wonderful Subject')) + ->setFrom(['john@doe.com' => 'John Doe']) + ->setTo(['receiver@domain.org', 'other@domain.org' => 'A name']) + ->setBody('Here is the message itself'); + + $originalMessage = $message->toString(); + + $signer = new Swift_Signers_SMimeSigner(); + $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key'); + $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt'); + $signer->setSignThenEncrypt(false); + $message->attachSigner($signer); + + $messageStream = $this->newFilteredStream(); + $message->toByteStream($messageStream); + $messageStream->commit(); + + $entityString = $messageStream->getContent(); + $headers = self::getHeadersOfMessage($entityString); + + if (!($boundary = $this->getBoundary($headers['content-type']))) { + return false; + } + + $expectedBody = <<Content-Type: application/(x\-)?pkcs7-mime; smime-type=enveloped-data; + name="smime\.p7m"; charset=utf-8 +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime\.p7m" + +(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2}) + + +)--$boundary +Content-Type: application/(x\-)?pkcs7-signature; name="smime\.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime\.p7s" + +(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2}) + +--$boundary-- +OEL; + + if (!$this->assertValidVerify($expectedBody, $messageStream)) { + return false; + } + + $expectedBody = str_replace("\n", "\r\n", $expectedBody); + if (!preg_match('%'.$expectedBody.'*%m', $entityString, $entities)) { + $this->fail('Failed regex match.'); + + return false; + } + + $messageStreamClean = new Swift_ByteStream_TemporaryFileByteStream(); + $messageStreamClean->write($entities['encrypted_message']); + + $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_decrypt($messageStreamClean->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', ['file://'.$this->samplesDir.'smime/encrypt.key', 'swift'])) { + $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string())); + } + + $this->assertEquals($originalMessage, $decryptedMessageStream->getContent()); + unset($messageStreamClean, $messageStream, $decryptedMessageStream); + } + + protected function assertValidVerify($expected, Swift_ByteStream_TemporaryFileByteStream $messageStream) + { + $actual = $messageStream->getContent(); + + // File is UNIX encoded so convert them to correct line ending + $expected = str_replace("\n", "\r\n", $expected); + + $actual = self::getBodyOfMessage($actual); + if (!$this->assertRegExp('%^'.$expected.'$\s*%m', $actual)) { + return false; + } + + $opensslOutput = new Swift_ByteStream_TemporaryFileByteStream(); + $verify = openssl_pkcs7_verify($messageStream->getPath(), null, $opensslOutput->getPath(), [$this->samplesDir.'smime/ca.crt']); + + if (false === $verify) { + $this->fail('Verification of the message failed.'); + + return false; + } elseif (-1 === $verify) { + $this->fail(sprintf('Verification of the message failed. Internal error "%s".', openssl_error_string())); + + return false; + } + + return true; + } + + protected function getBoundary($contentType) + { + if (!preg_match('/boundary=("[^"]+"|(?:[^\s]+|$))/is', $contentType, $contentTypeData)) { + $this->fail('Failed to find Boundary parameter'); + + return false; + } + + return trim($contentTypeData[1], '"'); + } + + protected function newFilteredStream() + { + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $messageStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF'); + $messageStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF'); + + return $messageStream; + } + + protected static function getBodyOfMessage($message) + { + return trim(substr($message, strpos($message, "\r\n\r\n"))); + } + + /** + * Strips of the sender headers and Mime-Version. + */ + protected function cleanMessage($content) + { + $newContent = ''; + + $headers = self::getHeadersOfMessage($content); + foreach ($headers as $headerName => $value) { + if (!in_array($headerName, ['content-type', 'content-transfer-encoding', 'content-disposition'])) { + continue; + } + + $headerName = explode('-', $headerName); + $headerName = array_map('ucfirst', $headerName); + $headerName = implode('-', $headerName); + + if (strlen($value) > 62) { + $value = wordwrap($value, 62, "\n "); + } + + $newContent .= "$headerName: $value\r\n"; + } + + return $newContent."\r\n".self::getBodyOfMessage($content); + } + + /** + * Returns the headers of the message. + * + * Header-names are lowercase. + * + * @param string $message + * + * @return array + */ + protected static function getHeadersOfMessage($message) + { + $headersPosEnd = strpos($message, "\r\n\r\n"); + $headerData = trim(substr($message, 0, $headersPosEnd)); + $headerLines = explode("\r\n", $headerData); + $headers = []; + + if (false === $headerLines) { + return $headers; + } + + // Transform header lines into an associative array + $currentHeaderName = ''; + foreach ($headerLines as $headerLine) { + // Handle headers that span multiple lines + if (false === strpos($headerLine, ':')) { + $headers[$currentHeaderName] .= ' '.trim($headerLine); + continue; + } + + $header = explode(':', $headerLine, 2); + $currentHeaderName = strtolower($header[0]); + $headers[$currentHeaderName] = trim($header[1]); + } + + return $headers; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php new file mode 100644 index 0000000..3c81224 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php @@ -0,0 +1,129 @@ +createFilter([0x61, 0x62], [0x63, 0x64]); + $this->assertEquals( + [0x59, 0x60, 0x63, 0x64, 0x65], + $filter->filter([0x59, 0x60, 0x61, 0x62, 0x65]) + ); + } + + public function testShouldBufferReturnsTrueIfPartialMatchAtEndOfBuffer() + { + $filter = $this->createFilter([0x61, 0x62], [0x63, 0x64]); + $this->assertTrue($filter->shouldBuffer([0x59, 0x60, 0x61]), + '%s: Filter should buffer since 0x61 0x62 is the needle and the ending '. + '0x61 could be from 0x61 0x62' + ); + } + + public function testFilterCanMakeMultipleReplacements() + { + $filter = $this->createFilter([[0x61], [0x62]], [0x63]); + $this->assertEquals( + [0x60, 0x63, 0x60, 0x63, 0x60], + $filter->filter([0x60, 0x61, 0x60, 0x62, 0x60]) + ); + } + + public function testMultipleReplacementsCanBeDifferent() + { + $filter = $this->createFilter([[0x61], [0x62]], [[0x63], [0x64]]); + $this->assertEquals( + [0x60, 0x63, 0x60, 0x64, 0x60], + $filter->filter([0x60, 0x61, 0x60, 0x62, 0x60]) + ); + } + + public function testShouldBufferReturnsFalseIfPartialMatchNotAtEndOfString() + { + $filter = $this->createFilter([0x0D, 0x0A], [0x0A]); + $this->assertFalse($filter->shouldBuffer([0x61, 0x62, 0x0D, 0x0A, 0x63]), + '%s: Filter should not buffer since x0Dx0A is the needle and is not at EOF' + ); + } + + public function testShouldBufferReturnsTrueIfAnyOfMultipleMatchesAtEndOfString() + { + $filter = $this->createFilter([[0x61, 0x62], [0x63]], [0x64]); + $this->assertTrue($filter->shouldBuffer([0x59, 0x60, 0x61]), + '%s: Filter should buffer since 0x61 0x62 is a needle and the ending '. + '0x61 could be from 0x61 0x62' + ); + } + + public function testConvertingAllLineEndingsToCRLFWhenInputIsLF() + { + $filter = $this->createFilter( + [[0x0D, 0x0A], [0x0D], [0x0A]], + [[0x0A], [0x0A], [0x0D, 0x0A]] + ); + + $this->assertEquals( + [0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63], + $filter->filter([0x60, 0x0A, 0x61, 0x0A, 0x62, 0x0A, 0x63]) + ); + } + + public function testConvertingAllLineEndingsToCRLFWhenInputIsCR() + { + $filter = $this->createFilter( + [[0x0D, 0x0A], [0x0D], [0x0A]], + [[0x0A], [0x0A], [0x0D, 0x0A]] + ); + + $this->assertEquals( + [0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63], + $filter->filter([0x60, 0x0D, 0x61, 0x0D, 0x62, 0x0D, 0x63]) + ); + } + + public function testConvertingAllLineEndingsToCRLFWhenInputIsCRLF() + { + $filter = $this->createFilter( + [[0x0D, 0x0A], [0x0D], [0x0A]], + [[0x0A], [0x0A], [0x0D, 0x0A]] + ); + + $this->assertEquals( + [0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63], + $filter->filter([0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63]) + ); + } + + public function testConvertingAllLineEndingsToCRLFWhenInputIsLFCR() + { + $filter = $this->createFilter( + [[0x0D, 0x0A], [0x0D], [0x0A]], + [[0x0A], [0x0A], [0x0D, 0x0A]] + ); + + $this->assertEquals( + [0x60, 0x0D, 0x0A, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x0D, 0x0A, 0x63], + $filter->filter([0x60, 0x0A, 0x0D, 0x61, 0x0A, 0x0D, 0x62, 0x0A, 0x0D, 0x63]) + ); + } + + public function testConvertingAllLineEndingsToCRLFWhenInputContainsLFLF() + { + //Lighthouse Bug #23 + + $filter = $this->createFilter( + [[0x0D, 0x0A], [0x0D], [0x0A]], + [[0x0A], [0x0A], [0x0D, 0x0A]] + ); + + $this->assertEquals( + [0x60, 0x0D, 0x0A, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x0D, 0x0A, 0x63], + $filter->filter([0x60, 0x0A, 0x0A, 0x61, 0x0A, 0x0A, 0x62, 0x0A, 0x0A, 0x63]) + ); + } + + private function createFilter($search, $replace) + { + return new Swift_StreamFilters_ByteArrayReplacementFilter($search, $replace); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php new file mode 100644 index 0000000..514829f --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php @@ -0,0 +1,36 @@ +createFactory(); + $this->assertInstanceOf( + 'Swift_StreamFilters_StringReplacementFilter', + $factory->createFilter('a', 'b') + ); + } + + public function testSameInstancesAreCached() + { + $factory = $this->createFactory(); + $filter1 = $factory->createFilter('a', 'b'); + $filter2 = $factory->createFilter('a', 'b'); + $this->assertSame($filter1, $filter2, '%s: Instances should be cached'); + } + + public function testDifferingInstancesAreNotCached() + { + $factory = $this->createFactory(); + $filter1 = $factory->createFilter('a', 'b'); + $filter2 = $factory->createFilter('a', 'c'); + $this->assertNotEquals($filter1, $filter2, + '%s: Differing instances should not be cached' + ); + } + + private function createFactory() + { + return new Swift_StreamFilters_StringReplacementFilterFactory(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php new file mode 100644 index 0000000..1a5f4dc --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php @@ -0,0 +1,59 @@ +createFilter('foo', 'bar'); + $this->assertEquals('XbarYbarZ', $filter->filter('XfooYfooZ')); + } + + public function testShouldBufferReturnsTrueIfPartialMatchAtEndOfBuffer() + { + $filter = $this->createFilter('foo', 'bar'); + $this->assertTrue($filter->shouldBuffer('XfooYf'), + '%s: Filter should buffer since "foo" is the needle and the ending '. + '"f" could be from "foo"' + ); + } + + public function testFilterCanMakeMultipleReplacements() + { + $filter = $this->createFilter(['a', 'b'], 'foo'); + $this->assertEquals('XfooYfooZ', $filter->filter('XaYbZ')); + } + + public function testMultipleReplacementsCanBeDifferent() + { + $filter = $this->createFilter(['a', 'b'], ['foo', 'zip']); + $this->assertEquals('XfooYzipZ', $filter->filter('XaYbZ')); + } + + public function testShouldBufferReturnsFalseIfPartialMatchNotAtEndOfString() + { + $filter = $this->createFilter("\r\n", "\n"); + $this->assertFalse($filter->shouldBuffer("foo\r\nbar"), + '%s: Filter should not buffer since x0Dx0A is the needle and is not at EOF' + ); + } + + public function testShouldBufferReturnsTrueIfAnyOfMultipleMatchesAtEndOfString() + { + $filter = $this->createFilter(['foo', 'zip'], 'bar'); + $this->assertTrue($filter->shouldBuffer('XfooYzi'), + '%s: Filter should buffer since "zip" is a needle and the ending '. + '"zi" could be from "zip"' + ); + } + + public function testShouldBufferReturnsFalseOnEmptyBuffer() + { + $filter = $this->createFilter("\r\n", "\n"); + $this->assertFalse($filter->shouldBuffer('')); + } + + private function createFilter($search, $replace) + { + return new Swift_StreamFilters_StringReplacementFilter($search, $replace); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php new file mode 100644 index 0000000..896171d --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php @@ -0,0 +1,558 @@ +getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $listener = $this->getMockery('Swift_Events_EventListener'); + $smtp = $this->getTransport($buf, $dispatcher); + $dispatcher->shouldReceive('bindEventListener') + ->once() + ->with($listener); + + $smtp->registerPlugin($listener); + } + + public function testSendingDispatchesBeforeSendEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $message = $this->createMessage(); + $smtp = $this->getTransport($buf, $dispatcher); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['mark@swiftmailer.org' => 'Mark']); + $dispatcher->shouldReceive('createSendEvent') + ->once() + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'beforeSendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(1, $smtp->send($message)); + } + + public function testSendingDispatchesSendEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $message = $this->createMessage(); + $smtp = $this->getTransport($buf, $dispatcher); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['mark@swiftmailer.org' => 'Mark']); + $dispatcher->shouldReceive('createSendEvent') + ->once() + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'sendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturn(false); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(1, $smtp->send($message)); + } + + public function testSendEventCapturesFailures() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['mark@swiftmailer.org' => 'Mark']); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("500 Not now\r\n"); + $dispatcher->shouldReceive('createSendEvent') + ->zeroOrMoreTimes() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'sendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturn(false); + $evt->shouldReceive('setFailedRecipients') + ->once() + ->with(['mark@swiftmailer.org']); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(0, $smtp->send($message)); + } + + public function testSendEventHasResultFailedIfAllFailures() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['mark@swiftmailer.org' => 'Mark']); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("500 Not now\r\n"); + $dispatcher->shouldReceive('createSendEvent') + ->zeroOrMoreTimes() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'sendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturn(false); + $evt->shouldReceive('setResult') + ->once() + ->with(Swift_Events_SendEvent::RESULT_FAILED); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(0, $smtp->send($message)); + } + + public function testSendEventHasResultTentativeIfSomeFailures() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn([ + 'mark@swiftmailer.org' => 'Mark', + 'chris@site.tld' => 'Chris', + ]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("500 Not now\r\n"); + $dispatcher->shouldReceive('createSendEvent') + ->zeroOrMoreTimes() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'sendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturn(false); + $evt->shouldReceive('setResult') + ->once() + ->with(Swift_Events_SendEvent::RESULT_TENTATIVE); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(1, $smtp->send($message)); + } + + public function testSendEventHasResultSuccessIfNoFailures() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn([ + 'mark@swiftmailer.org' => 'Mark', + 'chris@site.tld' => 'Chris', + ]); + $dispatcher->shouldReceive('createSendEvent') + ->zeroOrMoreTimes() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'sendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturn(false); + $evt->shouldReceive('setResult') + ->once() + ->with(Swift_Events_SendEvent::RESULT_SUCCESS); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(2, $smtp->send($message)); + } + + public function testCancellingEventBubbleBeforeSendStopsEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['chris@swiftmailer.org' => null]); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['mark@swiftmailer.org' => 'Mark']); + $dispatcher->shouldReceive('createSendEvent') + ->zeroOrMoreTimes() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'beforeSendPerformed'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->atLeast()->once() + ->andReturn(true); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(0, $smtp->send($message)); + } + + public function testStartingTransportDispatchesTransportChangeEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportChangeEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createTransportChangeEvent') + ->atLeast()->once() + ->with($smtp) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'transportStarted'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->atLeast()->once() + ->andReturn(false); + + $this->finishBuffer($buf); + $smtp->start(); + } + + public function testStartingTransportDispatchesBeforeTransportChangeEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportChangeEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createTransportChangeEvent') + ->atLeast()->once() + ->with($smtp) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'beforeTransportStarted'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->atLeast()->once() + ->andReturn(false); + + $this->finishBuffer($buf); + $smtp->start(); + } + + public function testCancellingBubbleBeforeTransportStartStopsEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportChangeEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createTransportChangeEvent') + ->atLeast()->once() + ->with($smtp) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'beforeTransportStarted'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->atLeast()->once() + ->andReturn(true); + + $this->finishBuffer($buf); + $smtp->start(); + + $this->assertFalse($smtp->isStarted(), + '%s: Transport should not be started since event bubble was cancelled' + ); + } + + public function testStoppingTransportDispatchesTransportChangeEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportChangeEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createTransportChangeEvent') + ->atLeast()->once() + ->with($smtp) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'transportStopped'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->stop(); + } + + public function testStoppingTransportDispatchesBeforeTransportChangeEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportChangeEvent')->shouldIgnoreMissing(); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createTransportChangeEvent') + ->atLeast()->once() + ->with($smtp) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'beforeTransportStopped'); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->stop(); + } + + public function testCancellingBubbleBeforeTransportStoppedStopsEvent() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportChangeEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $hasRun = false; + $dispatcher->shouldReceive('createTransportChangeEvent') + ->atLeast()->once() + ->with($smtp) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'beforeTransportStopped') + ->andReturnUsing(function () use (&$hasRun) { + $hasRun = true; + }); + $dispatcher->shouldReceive('dispatchEvent') + ->zeroOrMoreTimes(); + $evt->shouldReceive('bubbleCancelled') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$hasRun) { + return $hasRun; + }); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->stop(); + + $this->assertTrue($smtp->isStarted(), + '%s: Transport should not be stopped since event bubble was cancelled' + ); + } + + public function testResponseEventsAreGenerated() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_ResponseEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createResponseEvent') + ->atLeast()->once() + ->with($smtp, \Mockery::any(), \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->atLeast()->once() + ->with($evt, 'responseReceived'); + + $this->finishBuffer($buf); + $smtp->start(); + } + + public function testCommandEventsAreGenerated() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_CommandEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $dispatcher->shouldReceive('createCommandEvent') + ->once() + ->with($smtp, \Mockery::any(), \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'commandSent'); + + $this->finishBuffer($buf); + $smtp->start(); + } + + public function testExceptionsCauseExceptionEvents() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportExceptionEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $buf->shouldReceive('readLine') + ->atLeast()->once() + ->andReturn("503 I'm sleepy, go away!\r\n"); + $dispatcher->shouldReceive('createTransportExceptionEvent') + ->zeroOrMoreTimes() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->once() + ->with($evt, 'exceptionThrown'); + $evt->shouldReceive('bubbleCancelled') + ->atLeast()->once() + ->andReturn(false); + + try { + $smtp->start(); + $this->fail('TransportException should be thrown on invalid response'); + } catch (Swift_TransportException $e) { + } + } + + public function testExceptionBubblesCanBeCancelled() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(false); + $evt = $this->getMockery('Swift_Events_TransportExceptionEvent'); + $smtp = $this->getTransport($buf, $dispatcher); + + $buf->shouldReceive('readLine') + ->atLeast()->once() + ->andReturn("503 I'm sleepy, go away!\r\n"); + $dispatcher->shouldReceive('createTransportExceptionEvent') + ->twice() + ->with($smtp, \Mockery::any()) + ->andReturn($evt); + $dispatcher->shouldReceive('dispatchEvent') + ->twice() + ->with($evt, 'exceptionThrown'); + $evt->shouldReceive('bubbleCancelled') + ->atLeast()->once() + ->andReturn(true); + + $this->finishBuffer($buf); + $smtp->start(); + } + + protected function createEventDispatcher($stub = true) + { + return $this->getMockery('Swift_Events_EventDispatcher')->shouldIgnoreMissing(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php new file mode 100644 index 0000000..4c837fa --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php @@ -0,0 +1,1400 @@ +getBuffer(); + $smtp = $this->getTransport($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + + $this->finishBuffer($buf); + try { + $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started'); + $smtp->start(); + $this->assertTrue($smtp->isStarted(), '%s: start() should have started connection'); + } catch (Exception $e) { + $this->fail('220 is a valid SMTP greeting and should be accepted'); + } + } + + public function testBadGreetingCausesException() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("554 I'm busy\r\n"); + $this->finishBuffer($buf); + try { + $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started'); + $smtp->start(); + $this->fail('554 greeting indicates an error and should cause an exception'); + } catch (Swift_TransportException $e) { + $this->assertFalse($smtp->isStarted(), '%s: start() should have failed'); + } + } + + public function testStartSendsHeloToInitiate() + { + /* -- RFC 2821, 3.2. + + 3.2 Client Initiation + + Once the server has sent the welcoming message and the client has + received it, the client normally sends the EHLO command to the + server, indicating the client's identity. In addition to opening the + session, use of EHLO indicates that the client is able to process + service extensions and requests that the server provide a list of the + extensions it supports. Older SMTP systems which are unable to + support service extensions and contemporary clients which do not + require service extensions in the mail session being initiated, MAY + use HELO instead of EHLO. Servers MUST NOT return the extended + EHLO-style response to a HELO command. For a particular connection + attempt, if the server returns a "command not recognized" response to + EHLO, the client SHOULD be able to fall back and send HELO. + + In the EHLO command the host sending the command identifies itself; + the command may be interpreted as saying "Hello, I am " (and, + in the case of EHLO, "and I support service extension requests"). + + -- RFC 2281, 4.1.1.1. + + ehlo = "EHLO" SP Domain CRLF + helo = "HELO" SP Domain CRLF + + -- RFC 2821, 4.3.2. + + EHLO or HELO + S: 250 + E: 504, 550 + + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^HELO example.org\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 ServerName'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + } catch (Exception $e) { + $this->fail('Starting SMTP should send HELO and accept 250 response'); + } + } + + public function testInvalidHeloResponseCausesException() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^HELO example.org\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('504 WTF'."\r\n"); + + $this->finishBuffer($buf); + try { + $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started'); + $smtp->start(); + $this->fail('Non 250 HELO response should raise Exception'); + } catch (Swift_TransportException $e) { + $this->assertFalse($smtp->isStarted(), '%s: SMTP start() should have failed'); + } + } + + public function testDomainNameIsPlacedInHelo() + { + /* -- RFC 2821, 4.1.4. + + The SMTP client MUST, if possible, ensure that the domain parameter + to the EHLO command is a valid principal host name (not a CNAME or MX + name) for its host. If this is not possible (e.g., when the client's + address is dynamically assigned and the client does not have an + obvious name), an address literal SHOULD be substituted for the + domain name and supplemental information provided that will assist in + identifying the client. + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("HELO mydomain.com\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 ServerName'."\r\n"); + + $this->finishBuffer($buf); + $smtp->setLocalDomain('mydomain.com'); + $smtp->start(); + } + + public function testSuccessfulMailCommand() + { + /* -- RFC 2821, 3.3. + + There are three steps to SMTP mail transactions. The transaction + starts with a MAIL command which gives the sender identification. + + ..... + + The first step in the procedure is the MAIL command. + + MAIL FROM: [SP ] + + -- RFC 2821, 4.1.1.2. + + Syntax: + + "MAIL FROM:" ("<>" / Reverse-Path) + [SP Mail-parameters] CRLF + -- RFC 2821, 4.1.2. + + Reverse-path = Path + Forward-path = Path + Path = "<" [ A-d-l ":" ] Mailbox ">" + A-d-l = At-domain *( "," A-d-l ) + ; Note that this form, the so-called "source route", + ; MUST BE accepted, SHOULD NOT be generated, and SHOULD be + ; ignored. + At-domain = "@" domain + + -- RFC 2821, 4.3.2. + + MAIL + S: 250 + E: 552, 451, 452, 550, 553, 503 + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + } catch (Exception $e) { + $this->fail('MAIL FROM should accept a 250 response'); + } + } + + public function testInvalidResponseCodeFromMailCausesException() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('553 Bad'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + $this->fail('MAIL FROM should accept a 250 response'); + } catch (Swift_TransportException $e) { + } + } + + public function testSenderIsPreferredOverFrom() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getSender') + ->once() + ->andReturn(['another@domain.com' => 'Someone']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testReturnPathIsPreferredOverSender() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getSender') + ->once() + ->andReturn(['another@domain.com' => 'Someone']); + $message->shouldReceive('getReturnPath') + ->once() + ->andReturn('more@domain.com'); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testSuccessfulRcptCommandWith250Response() + { + /* -- RFC 2821, 3.3. + + The second step in the procedure is the RCPT command. + + RCPT TO: [ SP ] + + The first or only argument to this command includes a forward-path + (normally a mailbox and domain, always surrounded by "<" and ">" + brackets) identifying one recipient. If accepted, the SMTP server + returns a 250 OK reply and stores the forward-path. If the recipient + is known not to be a deliverable address, the SMTP server returns a + 550 reply, typically with a string such as "no such user - " and the + mailbox name (other circumstances and reply codes are possible). + This step of the procedure can be repeated any number of times. + + -- RFC 2821, 4.1.1.3. + + This command is used to identify an individual recipient of the mail + data; multiple recipients are specified by multiple use of this + command. The argument field contains a forward-path and may contain + optional parameters. + + The forward-path normally consists of the required destination + mailbox. Sending systems SHOULD not generate the optional list of + hosts known as a source route. + + ....... + + "RCPT TO:" ("" / "" / Forward-Path) + [SP Rcpt-parameters] CRLF + + -- RFC 2821, 4.2.2. + + 250 Requested mail action okay, completed + 251 User not local; will forward to + (See section 3.4) + 252 Cannot VRFY user, but will accept message and attempt + delivery + + -- RFC 2821, 4.3.2. + + RCPT + S: 250, 251 (but see section 3.4 for discussion of 251 and 551) + E: 550, 551, 552, 553, 450, 451, 452, 503, 550 + */ + + //We'll treat 252 as accepted since it isn't really a failure + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + } catch (Exception $e) { + $this->fail('RCPT TO should accept a 250 response'); + } + } + + public function testUtf8AddressWithIdnEncoder() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@dömain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bär' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testUtf8AddressWithUtf8Encoder() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf, null, new Swift_AddressEncoder_Utf8AddressEncoder()); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['më@dömain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['föö@bär' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testNonEncodableSenderCausesException() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['më@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + $this->fail('më@domain.com cannot be encoded (not observed)'); + } catch (Swift_AddressEncoderException $e) { + $this->assertEquals('më@domain.com', $e->getAddress()); + } + } + + public function testMailFromCommandIsOnlySentOncePerMessage() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->never() + ->with("MAIL FROM:\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testMultipleRecipientsSendsMultipleRcpt() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn([ + 'foo@bar' => null, + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + 'tëst@domain' => 'Test user', + ]); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(3); + $buf->shouldReceive('readLine') + ->once() + ->with(3) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testCcRecipientsSendsMultipleRcpt() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('getCc') + ->once() + ->andReturn([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(3); + $buf->shouldReceive('readLine') + ->once() + ->with(3) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testSendReturnsNumberOfSuccessfulRecipients() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('getCc') + ->once() + ->andReturn([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('501 Nobody here'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(3); + $buf->shouldReceive('readLine') + ->once() + ->with(3) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(2, $smtp->send($message), + '%s: 1 of 3 recipients failed so 2 should be returned' + ); + } + + public function testRsetIsSentIfNoSuccessfulRecipients() + { + /* --RFC 2821, 4.1.1.5. + + This command specifies that the current mail transaction will be + aborted. Any stored sender, recipients, and mail data MUST be + discarded, and all buffers and state tables cleared. The receiver + MUST send a "250 OK" reply to a RSET command with no arguments. A + reset command may be issued by the client at any time. + + -- RFC 2821, 4.3.2. + + RSET + S: 250 + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('503 Bad'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RSET\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(0, $smtp->send($message), + '%s: 1 of 1 recipients failed so 0 should be returned' + ); + } + + public function testSuccessfulDataCommand() + { + /* -- RFC 2821, 3.3. + + The third step in the procedure is the DATA command (or some + alternative specified in a service extension). + + DATA + + If accepted, the SMTP server returns a 354 Intermediate reply and + considers all succeeding lines up to but not including the end of + mail data indicator to be the message text. + + -- RFC 2821, 4.1.1.4. + + The receiver normally sends a 354 response to DATA, and then treats + the lines (strings ending in sequences, as described in + section 2.3.7) following the command as mail data from the sender. + This command causes the mail data to be appended to the mail data + buffer. The mail data may contain any of the 128 ASCII character + codes, although experience has indicated that use of control + characters other than SP, HT, CR, and LF may cause problems and + SHOULD be avoided when possible. + + -- RFC 2821, 4.3.2. + + DATA + I: 354 -> data -> S: 250 + E: 552, 554, 451, 452 + E: 451, 554, 503 + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("DATA\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('354 Go ahead'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + } catch (Exception $e) { + $this->fail('354 is the expected response to DATA'); + } + } + + public function testBadDataResponseCausesException() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("DATA\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('451 Bad'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + $this->fail('354 is the expected response to DATA (not observed)'); + } catch (Swift_TransportException $e) { + } + } + + public function testMessageIsStreamedToBufferForData() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("DATA\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('354 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("\r\n.\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testBadResponseAfterDataTransmissionCausesException() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->once() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->once() + ->andReturn(['foo@bar' => null]); + $buf->shouldReceive('write') + ->once() + ->with("DATA\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('354 OK'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("\r\n.\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('554 Error'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + $smtp->send($message); + $this->fail('250 is the expected response after a DATA transmission (not observed)'); + } catch (Swift_TransportException $e) { + } + } + + public function testBccRecipientsAreRemovedFromHeaders() + { + /* -- RFC 2821, 7.2. + + Addresses that do not appear in the message headers may appear in the + RCPT commands to an SMTP server for a number of reasons. The two + most common involve the use of a mailing address as a "list exploder" + (a single address that resolves into multiple addresses) and the + appearance of "blind copies". Especially when more than one RCPT + command is present, and in order to avoid defeating some of the + purpose of these mechanisms, SMTP clients and servers SHOULD NOT copy + the full set of RCPT command arguments into the headers, either as + part of trace headers or as informational or private-extension + headers. Since this rule is often violated in practice, and cannot + be enforced, sending SMTP systems that are aware of "bcc" use MAY + find it helpful to send each blind copy as a separate message + transaction containing only a single RCPT command. + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('getBcc') + ->zeroOrMoreTimes() + ->andReturn([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $message->shouldReceive('setBcc') + ->once() + ->with([]); + $message->shouldReceive('setBcc') + ->zeroOrMoreTimes(); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testEachBccRecipientIsSentASeparateMessage() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('getBcc') + ->zeroOrMoreTimes() + ->andReturn([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $message->shouldReceive('setBcc') + ->atLeast()->once() + ->with([]); + $message->shouldReceive('setBcc') + ->once() + ->with(['zip@button' => 'Zip Button']); + $message->shouldReceive('setBcc') + ->once() + ->with(['test@domain' => 'Test user']); + $message->shouldReceive('setBcc') + ->atLeast()->once() + ->with([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + + $buf->shouldReceive('write')->once()->with("MAIL FROM:\r\n")->andReturn(1); + $buf->shouldReceive('readLine')->once()->with(1)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("RCPT TO:\r\n")->andReturn(2); + $buf->shouldReceive('readLine')->once()->with(2)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(3); + $buf->shouldReceive('readLine')->once()->with(3)->andReturn("354 OK\r\n"); + $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(4); + $buf->shouldReceive('readLine')->once()->with(4)->andReturn("250 OK\r\n"); + + $buf->shouldReceive('write')->once()->with("MAIL FROM:\r\n")->andReturn(5); + $buf->shouldReceive('readLine')->once()->with(5)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("RCPT TO:\r\n")->andReturn(6); + $buf->shouldReceive('readLine')->once()->with(6)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(7); + $buf->shouldReceive('readLine')->once()->with(7)->andReturn("354 OK\r\n"); + $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(8); + $buf->shouldReceive('readLine')->once()->with(8)->andReturn("250 OK\r\n"); + + $buf->shouldReceive('write')->once()->with("MAIL FROM:\r\n")->andReturn(9); + $buf->shouldReceive('readLine')->once()->with(9)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("RCPT TO:\r\n")->andReturn(10); + $buf->shouldReceive('readLine')->once()->with(10)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(11); + $buf->shouldReceive('readLine')->once()->with(11)->andReturn("354 OK\r\n"); + $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(12); + $buf->shouldReceive('readLine')->once()->with(12)->andReturn("250 OK\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(3, $smtp->send($message)); + } + + public function testMessageStateIsRestoredOnFailure() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('getBcc') + ->zeroOrMoreTimes() + ->andReturn([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $message->shouldReceive('setBcc') + ->once() + ->with([]); + $message->shouldReceive('setBcc') + ->once() + ->with([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("DATA\r\n") + ->andReturn(3); + $buf->shouldReceive('readLine') + ->once() + ->with(3) + ->andReturn("451 No\r\n"); + + $this->finishBuffer($buf); + + $smtp->start(); + try { + $smtp->send($message); + $this->fail('A bad response was given so exception is expected'); + } catch (Swift_TransportException $e) { + } + } + + public function testStopSendsQuitCommand() + { + /* -- RFC 2821, 4.1.1.10. + + This command specifies that the receiver MUST send an OK reply, and + then close the transmission channel. + + The receiver MUST NOT intentionally close the transmission channel + until it receives and replies to a QUIT command (even if there was an + error). The sender MUST NOT intentionally close the transmission + channel until it sends a QUIT command and SHOULD wait until it + receives the reply (even if there was an error response to a previous + command). If the connection is closed prematurely due to violations + of the above or system or network failure, the server MUST cancel any + pending transaction, but not undo any previously completed + transaction, and generally MUST act as if the command or transaction + in progress had received a temporary error (i.e., a 4yz response). + + The QUIT command may be issued at any time. + + Syntax: + "QUIT" CRLF + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('write') + ->once() + ->with("QUIT\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("221 Bye\r\n"); + $buf->shouldReceive('terminate') + ->once(); + + $this->finishBuffer($buf); + + $this->assertFalse($smtp->isStarted()); + $smtp->start(); + $this->assertTrue($smtp->isStarted()); + $smtp->stop(); + $this->assertFalse($smtp->isStarted()); + } + + public function testBufferCanBeFetched() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ref = $smtp->getBuffer(); + $this->assertEquals($buf, $ref); + } + + public function testBufferCanBeWrittenToUsingExecuteCommand() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with("FOO\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with(1) + ->andReturn("250 OK\r\n"); + + $res = $smtp->executeCommand("FOO\r\n"); + $this->assertEquals("250 OK\r\n", $res); + } + + public function testResponseCodesAreValidated() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with("FOO\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with(1) + ->andReturn("551 Not ok\r\n"); + + try { + $smtp->executeCommand("FOO\r\n", [250, 251]); + $this->fail('A 250 or 251 response was needed but 551 was returned.'); + } catch (Swift_TransportException $e) { + } + } + + public function testFailedRecipientsCanBeCollectedByReference() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('getBcc') + ->zeroOrMoreTimes() + ->andReturn([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + $message->shouldReceive('setBcc') + ->atLeast()->once() + ->with([]); + $message->shouldReceive('setBcc') + ->once() + ->with(['zip@button' => 'Zip Button']); + $message->shouldReceive('setBcc') + ->once() + ->with(['test@domain' => 'Test user']); + $message->shouldReceive('setBcc') + ->atLeast()->once() + ->with([ + 'zip@button' => 'Zip Button', + 'test@domain' => 'Test user', + ]); + + $buf->shouldReceive('write')->once()->with("MAIL FROM:\r\n")->andReturn(1); + $buf->shouldReceive('readLine')->once()->with(1)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("RCPT TO:\r\n")->andReturn(2); + $buf->shouldReceive('readLine')->once()->with(2)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(3); + $buf->shouldReceive('readLine')->once()->with(3)->andReturn("354 OK\r\n"); + $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(4); + $buf->shouldReceive('readLine')->once()->with(4)->andReturn("250 OK\r\n"); + + $buf->shouldReceive('write')->once()->with("MAIL FROM:\r\n")->andReturn(5); + $buf->shouldReceive('readLine')->once()->with(5)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("RCPT TO:\r\n")->andReturn(6); + $buf->shouldReceive('readLine')->once()->with(6)->andReturn("500 Bad\r\n"); + $buf->shouldReceive('write')->once()->with("RSET\r\n")->andReturn(7); + $buf->shouldReceive('readLine')->once()->with(7)->andReturn("250 OK\r\n"); + + $buf->shouldReceive('write')->once()->with("MAIL FROM:\r\n")->andReturn(9); + $buf->shouldReceive('readLine')->once()->with(9)->andReturn("250 OK\r\n"); + $buf->shouldReceive('write')->once()->with("RCPT TO:\r\n")->andReturn(10); + $buf->shouldReceive('readLine')->once()->with(10)->andReturn("500 Bad\r\n"); + $buf->shouldReceive('write')->once()->with("RSET\r\n")->andReturn(11); + $buf->shouldReceive('readLine')->once()->with(11)->andReturn("250 OK\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertEquals(1, $smtp->send($message, $failures)); + $this->assertEquals(['zip@button', 'test@domain'], $failures, + '%s: Failures should be caught in an array' + ); + } + + public function testSendingRegeneratesMessageId() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + $message->shouldReceive('generateId') + ->once(); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + } + + public function testPing() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^NOOP\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 OK'."\r\n"); + + $this->finishBuffer($buf); + $this->assertTrue($smtp->ping()); + } + + public function testPingOnDeadConnection() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^NOOP\r\n$~D') + ->andThrow('Swift_TransportException'); + + $this->finishBuffer($buf); + $smtp->start(); + $this->assertTrue($smtp->isStarted()); + $this->assertFalse($smtp->ping()); + $this->assertFalse($smtp->isStarted()); + } + + public function testSetLocalDomain() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $smtp->setLocalDomain('example.com'); + $this->assertEquals('example.com', $smtp->getLocalDomain()); + + $smtp->setLocalDomain('192.168.0.1'); + $this->assertEquals('[192.168.0.1]', $smtp->getLocalDomain()); + + $smtp->setLocalDomain('[192.168.0.1]'); + $this->assertEquals('[192.168.0.1]', $smtp->getLocalDomain()); + + $smtp->setLocalDomain('fd00::'); + $this->assertEquals('[IPv6:fd00::]', $smtp->getLocalDomain()); + + $smtp->setLocalDomain('[IPv6:fd00::]'); + $this->assertEquals('[IPv6:fd00::]', $smtp->getLocalDomain()); + } + + protected function getBuffer() + { + return $this->getMockery('Swift_Transport_IoBuffer')->shouldIgnoreMissing(); + } + + protected function createMessage() + { + return $this->getMockery('Swift_Mime_SimpleMessage')->shouldIgnoreMissing(); + } + + protected function finishBuffer($buf) + { + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with(0) + ->andReturn('220 server.com foo'."\r\n"); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with('~^(EH|HE)LO .*?\r\n$~D') + ->andReturn($x = uniqid('', true)); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with($x) + ->andReturn('250 ServerName'."\r\n"); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with('~^MAIL FROM:<.*?>\r\n$~D') + ->andReturn($x = uniqid('', true)); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with($x) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with('~^RCPT TO:<.*?>\r\n$~D') + ->andReturn($x = uniqid('', true)); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with($x) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with("DATA\r\n") + ->andReturn($x = uniqid('', true)); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with($x) + ->andReturn("354 OK\r\n"); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with("\r\n.\r\n") + ->andReturn($x = uniqid('', true)); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with($x) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->with("RSET\r\n") + ->andReturn($x = uniqid('', true)); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->with($x) + ->andReturn("250 OK\r\n"); + + $buf->shouldReceive('write') + ->zeroOrMoreTimes() + ->andReturn(false); + $buf->shouldReceive('readLine') + ->zeroOrMoreTimes() + ->andReturn(false); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php new file mode 100644 index 0000000..ba131e8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php @@ -0,0 +1,65 @@ +agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing(); + } + + public function testKeywordIsCramMd5() + { + /* -- RFC 2195, 2. + The authentication type associated with CRAM is "CRAM-MD5". + */ + + $cram = $this->getAuthenticator(); + $this->assertEquals('CRAM-MD5', $cram->getAuthKeyword()); + } + + public function testSuccessfulAuthentication() + { + $cram = $this->getAuthenticator(); + + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("AUTH CRAM-MD5\r\n", [334]) + ->andReturn('334 '.base64_encode('')."\r\n"); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with(\Mockery::any(), [235]); + + $this->assertTrue($cram->authenticate($this->agent, 'jack', 'pass'), + '%s: The buffer accepted all commands authentication should succeed' + ); + } + + /** + * @expectedException \Swift_TransportException + */ + public function testAuthenticationFailureSendRset() + { + $cram = $this->getAuthenticator(); + + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("AUTH CRAM-MD5\r\n", [334]) + ->andReturn('334 '.base64_encode('')."\r\n"); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with(\Mockery::any(), [235]) + ->andThrow(new Swift_TransportException('')); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("RSET\r\n", [250]); + + $cram->authenticate($this->agent, 'jack', 'pass'); + } + + private function getAuthenticator() + { + return new Swift_Transport_Esmtp_Auth_CramMd5Authenticator(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php new file mode 100644 index 0000000..499ceb7 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php @@ -0,0 +1,65 @@ +agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing(); + } + + public function testKeywordIsLogin() + { + $login = $this->getAuthenticator(); + $this->assertEquals('LOGIN', $login->getAuthKeyword()); + } + + public function testSuccessfulAuthentication() + { + $login = $this->getAuthenticator(); + + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("AUTH LOGIN\r\n", [334]); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with(base64_encode('jack')."\r\n", [334]); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with(base64_encode('pass')."\r\n", [235]); + + $this->assertTrue($login->authenticate($this->agent, 'jack', 'pass'), + '%s: The buffer accepted all commands authentication should succeed' + ); + } + + /** + * @expectedException \Swift_TransportException + */ + public function testAuthenticationFailureSendRset() + { + $login = $this->getAuthenticator(); + + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("AUTH LOGIN\r\n", [334]); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with(base64_encode('jack')."\r\n", [334]); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with(base64_encode('pass')."\r\n", [235]) + ->andThrow(new Swift_TransportException('')); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("RSET\r\n", [250]); + + $login->authenticate($this->agent, 'jack', 'pass'); + } + + private function getAuthenticator() + { + return new Swift_Transport_Esmtp_Auth_LoginAuthenticator(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php new file mode 100644 index 0000000..98e2e25 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php @@ -0,0 +1,204 @@ +markTestSkipped('One of the required functions is not available.'); + } + } + + public function testKeywordIsNtlm() + { + $login = $this->getAuthenticator(); + $this->assertEquals('NTLM', $login->getAuthKeyword()); + } + + public function testMessage1Generator() + { + $login = $this->getAuthenticator(); + $message1 = $this->invokePrivateMethod('createMessage1', $login); + + $this->assertEquals($this->message1, bin2hex($message1), '%s: We send the smallest ntlm message which should never fail.'); + } + + public function testLMv1Generator() + { + $password = 'test1234'; + $challenge = 'b019d38bad875c9d'; + $lmv1 = '1879f60127f8a877022132ec221bcbf3ca016a9f76095606'; + + $login = $this->getAuthenticator(); + $lmv1Result = $this->invokePrivateMethod('createLMPassword', $login, [$password, hex2bin($challenge)]); + + $this->assertEquals($lmv1, bin2hex($lmv1Result), '%s: The keys should be the same cause we use the same values to generate them.'); + } + + public function testLMv2Generator() + { + $username = 'user'; + $password = 'SecREt01'; + $domain = 'DOMAIN'; + $challenge = '0123456789abcdef'; + $lmv2 = 'd6e6152ea25d03b7c6ba6629c2d6aaf0ffffff0011223344'; + + $login = $this->getAuthenticator(); + $lmv2Result = $this->invokePrivateMethod('createLMv2Password', $login, [$password, $username, $domain, hex2bin($challenge), hex2bin('ffffff0011223344')]); + + $this->assertEquals($lmv2, bin2hex($lmv2Result), '%s: The keys should be the same cause we use the same values to generate them.'); + } + + public function testMessage3v1Generator() + { + $username = 'test'; + $domain = 'TESTNT'; + $workstation = 'MEMBER'; + $lmResponse = '1879f60127f8a877022132ec221bcbf3ca016a9f76095606'; + $ntlmResponse = 'e6285df3287c5d194f84df1a94817c7282d09754b6f9e02a'; + $message3T = '4e544c4d5353500003000000180018006000000018001800780000000c000c0040000000080008004c0000000c000c0054000000000000009a0000000102000054004500530054004e00540074006500730074004d0045004d004200450052001879f60127f8a877022132ec221bcbf3ca016a9f76095606e6285df3287c5d194f84df1a94817c7282d09754b6f9e02a'; + + $login = $this->getAuthenticator(); + $message3 = $this->invokePrivateMethod('createMessage3', $login, [$domain, $username, $workstation, hex2bin($lmResponse), hex2bin($ntlmResponse)]); + + $this->assertEquals($message3T, bin2hex($message3), '%s: We send the same information as the example is created with so this should be the same'); + } + + public function testMessage3v2Generator() + { + $username = 'test'; + $domain = 'TESTNT'; + $workstation = 'MEMBER'; + $lmResponse = 'bf2e015119f6bdb3f6fdb768aa12d478f5ce3d2401c8f6e9'; + $ntlmResponse = 'caa4da8f25d5e840974ed8976d3ada46010100000000000030fa7e3c677bc301f5ce3d2401c8f6e90000000002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d000000000000000000'; + + $login = $this->getAuthenticator(); + $message3 = $this->invokePrivateMethod('createMessage3', $login, [$domain, $username, $workstation, hex2bin($lmResponse), hex2bin($ntlmResponse)]); + + $this->assertEquals($this->message3, bin2hex($message3), '%s: We send the same information as the example is created with so this should be the same'); + } + + public function testGetDomainAndUsername() + { + $username = "DOMAIN\user"; + + $login = $this->getAuthenticator(); + list($domain, $user) = $this->invokePrivateMethod('getDomainAndUsername', $login, [$username]); + + $this->assertEquals('DOMAIN', $domain, '%s: the fetched domain did not match'); + $this->assertEquals('user', $user, '%s: the fetched user did not match'); + } + + public function testGetDomainAndUsernameWithExtension() + { + $username = "domain.com\user"; + + $login = $this->getAuthenticator(); + list($domain, $user) = $this->invokePrivateMethod('getDomainAndUsername', $login, [$username]); + + $this->assertEquals('domain.com', $domain, '%s: the fetched domain did not match'); + $this->assertEquals('user', $user, '%s: the fetched user did not match'); + } + + public function testGetDomainAndUsernameWithAtSymbol() + { + $username = 'user@DOMAIN'; + + $login = $this->getAuthenticator(); + list($domain, $user) = $this->invokePrivateMethod('getDomainAndUsername', $login, [$username]); + + $this->assertEquals('DOMAIN', $domain, '%s: the fetched domain did not match'); + $this->assertEquals('user', $user, '%s: the fetched user did not match'); + } + + public function testGetDomainAndUsernameWithAtSymbolAndExtension() + { + $username = 'user@domain.com'; + + $login = $this->getAuthenticator(); + list($domain, $user) = $this->invokePrivateMethod('getDomainAndUsername', $login, [$username]); + + $this->assertEquals('domain.com', $domain, '%s: the fetched domain did not match'); + $this->assertEquals('user', $user, '%s: the fetched user did not match'); + } + + public function testGetDomainAndUsernameWithoutDomain() + { + $username = 'user'; + + $login = $this->getAuthenticator(); + list($domain, $user) = $this->invokePrivateMethod('getDomainAndUsername', $login, [$username]); + + $this->assertEquals('', $domain, '%s: the fetched domain did not match'); + $this->assertEquals('user', $user, '%s: the fetched user did not match'); + } + + public function testSuccessfulAuthentication() + { + $domain = 'TESTNT'; + $username = 'test'; + $secret = 'test1234'; + + $ntlm = $this->getAuthenticator(); + $agent = $this->getAgent(); + $agent->shouldReceive('executeCommand') + ->once() + ->with('AUTH NTLM '.base64_encode( + $this->invokePrivateMethod('createMessage1', $ntlm) + )."\r\n", [334]) + ->andReturn('334 '.base64_encode(hex2bin('4e544c4d53535000020000000c000c003000000035828980514246973ea892c10000000000000000460046003c00000054004500530054004e00540002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d0000000000'))); + $agent->shouldReceive('executeCommand') + ->once() + ->with(base64_encode( + $this->invokePrivateMethod('createMessage3', $ntlm, [$domain, $username, hex2bin('4d0045004d00420045005200'), hex2bin('bf2e015119f6bdb3f6fdb768aa12d478f5ce3d2401c8f6e9'), hex2bin('caa4da8f25d5e840974ed8976d3ada46010100000000000030fa7e3c677bc301f5ce3d2401c8f6e90000000002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d000000000000000000')] + ))."\r\n", [235]); + + $this->assertTrue($ntlm->authenticate($agent, $username.'@'.$domain, $secret, hex2bin('30fa7e3c677bc301'), hex2bin('f5ce3d2401c8f6e9')), '%s: The buffer accepted all commands authentication should succeed'); + } + + /** + * @expectedException \Swift_TransportException + */ + public function testAuthenticationFailureSendRset() + { + $domain = 'TESTNT'; + $username = 'test'; + $secret = 'test1234'; + + $ntlm = $this->getAuthenticator(); + $agent = $this->getAgent(); + $agent->shouldReceive('executeCommand') + ->once() + ->with('AUTH NTLM '.base64_encode( + $this->invokePrivateMethod('createMessage1', $ntlm) + )."\r\n", [334]) + ->andThrow(new Swift_TransportException('')); + $agent->shouldReceive('executeCommand') + ->once() + ->with("RSET\r\n", [250]); + + $ntlm->authenticate($agent, $username.'@'.$domain, $secret, hex2bin('30fa7e3c677bc301'), hex2bin('f5ce3d2401c8f6e9')); + } + + private function getAuthenticator() + { + return new Swift_Transport_Esmtp_Auth_NTLMAuthenticator(); + } + + private function getAgent() + { + return $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing(); + } + + private function invokePrivateMethod($method, $instance, array $args = []) + { + $methodC = new ReflectionMethod($instance, trim($method)); + $methodC->setAccessible(true); + + return $methodC->invokeArgs($instance, $args); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php new file mode 100644 index 0000000..1bb2c99 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php @@ -0,0 +1,68 @@ +agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing(); + } + + public function testKeywordIsPlain() + { + /* -- RFC 4616, 1. + The name associated with this mechanism is "PLAIN". + */ + + $login = $this->getAuthenticator(); + $this->assertEquals('PLAIN', $login->getAuthKeyword()); + } + + public function testSuccessfulAuthentication() + { + /* -- RFC 4616, 2. + The client presents the authorization identity (identity to act as), + followed by a NUL (U+0000) character, followed by the authentication + identity (identity whose password will be used), followed by a NUL + (U+0000) character, followed by the clear-text password. + */ + + $plain = $this->getAuthenticator(); + + $this->agent->shouldReceive('executeCommand') + ->once() + ->with('AUTH PLAIN '.base64_encode( + 'jack'.chr(0).'jack'.chr(0).'pass' + )."\r\n", [235]); + + $this->assertTrue($plain->authenticate($this->agent, 'jack', 'pass'), + '%s: The buffer accepted all commands authentication should succeed' + ); + } + + /** + * @expectedException \Swift_TransportException + */ + public function testAuthenticationFailureSendRset() + { + $plain = $this->getAuthenticator(); + + $this->agent->shouldReceive('executeCommand') + ->once() + ->with('AUTH PLAIN '.base64_encode( + 'jack'.chr(0).'jack'.chr(0).'pass' + )."\r\n", [235]) + ->andThrow(new Swift_TransportException('')); + $this->agent->shouldReceive('executeCommand') + ->once() + ->with("RSET\r\n", [250]); + + $plain->authenticate($this->agent, 'jack', 'pass'); + } + + private function getAuthenticator() + { + return new Swift_Transport_Esmtp_Auth_PlainAuthenticator(); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php new file mode 100644 index 0000000..36a4cf8 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php @@ -0,0 +1,165 @@ +agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing(); + } + + public function testKeywordIsAuth() + { + $auth = $this->createHandler([]); + $this->assertEquals('AUTH', $auth->getHandledKeyword()); + } + + public function testUsernameCanBeSetAndFetched() + { + $auth = $this->createHandler([]); + $auth->setUsername('jack'); + $this->assertEquals('jack', $auth->getUsername()); + } + + public function testPasswordCanBeSetAndFetched() + { + $auth = $this->createHandler([]); + $auth->setPassword('pass'); + $this->assertEquals('pass', $auth->getPassword()); + } + + public function testAuthModeCanBeSetAndFetched() + { + $auth = $this->createHandler([]); + $auth->setAuthMode('PLAIN'); + $this->assertEquals('PLAIN', $auth->getAuthMode()); + } + + public function testMixinMethods() + { + $auth = $this->createHandler([]); + $mixins = $auth->exposeMixinMethods(); + $this->assertTrue(in_array('getUsername', $mixins), + '%s: getUsername() should be accessible via mixin' + ); + $this->assertTrue(in_array('setUsername', $mixins), + '%s: setUsername() should be accessible via mixin' + ); + $this->assertTrue(in_array('getPassword', $mixins), + '%s: getPassword() should be accessible via mixin' + ); + $this->assertTrue(in_array('setPassword', $mixins), + '%s: setPassword() should be accessible via mixin' + ); + $this->assertTrue(in_array('setAuthMode', $mixins), + '%s: setAuthMode() should be accessible via mixin' + ); + $this->assertTrue(in_array('getAuthMode', $mixins), + '%s: getAuthMode() should be accessible via mixin' + ); + } + + public function testAuthenticatorsAreCalledAccordingToParamsAfterEhlo() + { + $a1 = $this->createMockAuthenticator('PLAIN'); + $a2 = $this->createMockAuthenticator('LOGIN'); + + $a1->shouldReceive('authenticate') + ->never() + ->with($this->agent, 'jack', 'pass'); + $a2->shouldReceive('authenticate') + ->once() + ->with($this->agent, 'jack', 'pass') + ->andReturn(true); + + $auth = $this->createHandler([$a1, $a2]); + $auth->setUsername('jack'); + $auth->setPassword('pass'); + + $auth->setKeywordParams(['CRAM-MD5', 'LOGIN']); + $auth->afterEhlo($this->agent); + } + + public function testAuthenticatorsAreNotUsedIfNoUsernameSet() + { + $a1 = $this->createMockAuthenticator('PLAIN'); + $a2 = $this->createMockAuthenticator('LOGIN'); + + $a1->shouldReceive('authenticate') + ->never() + ->with($this->agent, 'jack', 'pass'); + $a2->shouldReceive('authenticate') + ->never() + ->with($this->agent, 'jack', 'pass') + ->andReturn(true); + + $auth = $this->createHandler([$a1, $a2]); + + $auth->setKeywordParams(['CRAM-MD5', 'LOGIN']); + $auth->afterEhlo($this->agent); + } + + public function testSeveralAuthenticatorsAreTriedIfNeeded() + { + $a1 = $this->createMockAuthenticator('PLAIN'); + $a2 = $this->createMockAuthenticator('LOGIN'); + + $a1->shouldReceive('authenticate') + ->once() + ->with($this->agent, 'jack', 'pass') + ->andReturn(false); + $a2->shouldReceive('authenticate') + ->once() + ->with($this->agent, 'jack', 'pass') + ->andReturn(true); + + $auth = $this->createHandler([$a1, $a2]); + $auth->setUsername('jack'); + $auth->setPassword('pass'); + + $auth->setKeywordParams(['PLAIN', 'LOGIN']); + $auth->afterEhlo($this->agent); + } + + public function testFirstAuthenticatorToPassBreaksChain() + { + $a1 = $this->createMockAuthenticator('PLAIN'); + $a2 = $this->createMockAuthenticator('LOGIN'); + $a3 = $this->createMockAuthenticator('CRAM-MD5'); + + $a1->shouldReceive('authenticate') + ->once() + ->with($this->agent, 'jack', 'pass') + ->andReturn(false); + $a2->shouldReceive('authenticate') + ->once() + ->with($this->agent, 'jack', 'pass') + ->andReturn(true); + $a3->shouldReceive('authenticate') + ->never() + ->with($this->agent, 'jack', 'pass'); + + $auth = $this->createHandler([$a1, $a2]); + $auth->setUsername('jack'); + $auth->setPassword('pass'); + + $auth->setKeywordParams(['PLAIN', 'LOGIN', 'CRAM-MD5']); + $auth->afterEhlo($this->agent); + } + + private function createHandler($authenticators) + { + return new Swift_Transport_Esmtp_AuthHandler($authenticators); + } + + private function createMockAuthenticator($type) + { + $authenticator = $this->getMockery('Swift_Transport_Esmtp_Authenticator')->shouldIgnoreMissing(); + $authenticator->shouldReceive('getAuthKeyword') + ->zeroOrMoreTimes() + ->andReturn($type); + + return $authenticator; + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php new file mode 100644 index 0000000..d9e363a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php @@ -0,0 +1,561 @@ +getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('STARTTLS') + ->andReturn(1); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $ext2->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('AUTH') + ->andReturn(-1); + $this->finishBuffer($buf); + + $smtp->setExtensionHandlers([$ext1, $ext2]); + $this->assertEquals([$ext2, $ext1], $smtp->getExtensionHandlers()); + } + + public function testHandlersAreNotifiedOfParams() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 server.com foo\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .*?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-ServerName.tld\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-AUTH PLAIN LOGIN\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 SIZE=123456\r\n"); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('setKeywordParams') + ->once() + ->with(['PLAIN', 'LOGIN']); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('SIZE'); + $ext2->shouldReceive('setKeywordParams') + ->zeroOrMoreTimes() + ->with(['123456']); + $this->finishBuffer($buf); + + $smtp->setExtensionHandlers([$ext1, $ext2]); + $smtp->start(); + } + + public function testSupportedExtensionHandlersAreRunAfterEhlo() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 server.com foo\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .*?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-ServerName.tld\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-AUTH PLAIN LOGIN\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 SIZE=123456\r\n"); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('afterEhlo') + ->once() + ->with($smtp); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('SIZE'); + $ext2->shouldReceive('afterEhlo') + ->zeroOrMoreTimes() + ->with($smtp); + $ext3->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $ext3->shouldReceive('afterEhlo') + ->never() + ->with($smtp); + $this->finishBuffer($buf); + + $smtp->setExtensionHandlers([$ext1, $ext2, $ext3]); + $smtp->start(); + } + + public function testExtensionsCanModifyMailFromParams() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(); + $smtp = new Swift_Transport_EsmtpTransport($buf, [], $dispatcher, 'example.org'); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 server.com foo\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .*?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-ServerName.tld\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-AUTH PLAIN LOGIN\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 SIZE=123456\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM: FOO ZIP\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(3); + $buf->shouldReceive('readLine') + ->once() + ->with(3) + ->andReturn("250 OK\r\n"); + $this->finishBuffer($buf); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('getMailParams') + ->once() + ->andReturn('FOO'); + $ext1->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('STARTTLS') + ->andReturn(1); + $ext1->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('SIZE') + ->andReturn(-1); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('SIZE'); + $ext2->shouldReceive('getMailParams') + ->once() + ->andReturn('ZIP'); + $ext2->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('AUTH') + ->andReturn(1); + $ext2->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('STARTTLS') + ->andReturn(1); + $ext3->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $ext3->shouldReceive('getMailParams') + ->never(); + $ext3->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('AUTH') + ->andReturn(-1); + $ext3->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('SIZE') + ->andReturn(-1); + + $smtp->setExtensionHandlers([$ext1, $ext2, $ext3]); + $smtp->start(); + $smtp->send($message); + } + + public function testExtensionsCanModifyRcptParams() + { + $buf = $this->getBuffer(); + $dispatcher = $this->createEventDispatcher(); + $smtp = new Swift_Transport_EsmtpTransport($buf, [], $dispatcher, 'example.org'); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $message = $this->createMessage(); + + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 server.com foo\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-ServerName.tld\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-AUTH PLAIN LOGIN\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 SIZE=123456\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("RCPT TO: FOO ZIP\r\n") + ->andReturn(3); + $buf->shouldReceive('readLine') + ->once() + ->with(3) + ->andReturn("250 OK\r\n"); + $this->finishBuffer($buf); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('getRcptParams') + ->once() + ->andReturn('FOO'); + $ext1->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('STARTTLS') + ->andReturn(1); + $ext1->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('SIZE') + ->andReturn(-1); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('SIZE'); + $ext2->shouldReceive('getRcptParams') + ->once() + ->andReturn('ZIP'); + $ext2->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('STARTTLS') + ->andReturn(1); + $ext2->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('AUTH') + ->andReturn(1); + $ext3->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $ext3->shouldReceive('getRcptParams') + ->never(); + $ext3->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('AUTH') + ->andReturn(-1); + $ext3->shouldReceive('getPriorityOver') + ->zeroOrMoreTimes() + ->with('SIZE') + ->andReturn(-1); + + $smtp->setExtensionHandlers([$ext1, $ext2, $ext3]); + $smtp->start(); + $smtp->send($message); + } + + public function testExtensionsAreNotifiedOnCommand() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 server.com foo\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-ServerName.tld\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-AUTH PLAIN LOGIN\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 SIZE=123456\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("FOO\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn("250 Cool\r\n"); + $this->finishBuffer($buf); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('onCommand') + ->once() + ->with($smtp, "FOO\r\n", [250, 251], \Mockery::any(), \Mockery::any()); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('SIZE'); + $ext2->shouldReceive('onCommand') + ->once() + ->with($smtp, "FOO\r\n", [250, 251], \Mockery::any(), \Mockery::any()); + $ext3->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $ext3->shouldReceive('onCommand') + ->never() + ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any()); + + $smtp->setExtensionHandlers([$ext1, $ext2, $ext3]); + $smtp->start(); + $smtp->executeCommand("FOO\r\n", [250, 251]); + } + + public function testChainOfCommandAlgorithmWhenNotifyingExtensions() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 server.com foo\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-ServerName.tld\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250-AUTH PLAIN LOGIN\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn("250 SIZE=123456\r\n"); + $buf->shouldReceive('write') + ->never() + ->with("FOO\r\n"); + $this->finishBuffer($buf); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('onCommand') + ->once() + ->with($smtp, "FOO\r\n", [250, 251], \Mockery::any(), \Mockery::any()) + ->andReturnUsing(function ($a, $b, $c, $d, &$e) { + $e = true; + + return '250 ok'; + }); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('SIZE'); + $ext2->shouldReceive('onCommand') + ->never() + ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any()); + + $ext3->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $ext3->shouldReceive('onCommand') + ->never() + ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any()); + + $smtp->setExtensionHandlers([$ext1, $ext2, $ext3]); + $smtp->start(); + $smtp->executeCommand("FOO\r\n", [250, 251]); + } + + public function testExtensionsCanExposeMixinMethods() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandlerMixin')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('exposeMixinMethods') + ->zeroOrMoreTimes() + ->andReturn(['setUsername', 'setPassword']); + $ext1->shouldReceive('setUsername') + ->once() + ->with('mick'); + $ext1->shouldReceive('setPassword') + ->once() + ->with('pass'); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $this->finishBuffer($buf); + + $smtp->setExtensionHandlers([$ext1, $ext2]); + $smtp->setUsername('mick'); + $smtp->setPassword('pass'); + } + + public function testMixinMethodsBeginningWithSetAndNullReturnAreFluid() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandlerMixin')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('exposeMixinMethods') + ->zeroOrMoreTimes() + ->andReturn(['setUsername', 'setPassword']); + $ext1->shouldReceive('setUsername') + ->once() + ->with('mick') + ->andReturn(null); + $ext1->shouldReceive('setPassword') + ->once() + ->with('pass') + ->andReturn(null); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $this->finishBuffer($buf); + + $smtp->setExtensionHandlers([$ext1, $ext2]); + $ret = $smtp->setUsername('mick'); + $this->assertEquals($smtp, $ret); + $ret = $smtp->setPassword('pass'); + $this->assertEquals($smtp, $ret); + } + + public function testMixinSetterWhichReturnValuesAreNotFluid() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $ext1 = $this->getMockery('Swift_Transport_EsmtpHandlerMixin')->shouldIgnoreMissing(); + $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing(); + + $ext1->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('AUTH'); + $ext1->shouldReceive('exposeMixinMethods') + ->zeroOrMoreTimes() + ->andReturn(['setUsername', 'setPassword']); + $ext1->shouldReceive('setUsername') + ->once() + ->with('mick') + ->andReturn('x'); + $ext1->shouldReceive('setPassword') + ->once() + ->with('pass') + ->andReturn('x'); + $ext2->shouldReceive('getHandledKeyword') + ->zeroOrMoreTimes() + ->andReturn('STARTTLS'); + $this->finishBuffer($buf); + + $smtp->setExtensionHandlers([$ext1, $ext2]); + $this->assertEquals('x', $smtp->setUsername('mick')); + $this->assertEquals('x', $smtp->setPassword('pass')); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php new file mode 100644 index 0000000..db1edce --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php @@ -0,0 +1,651 @@ +createEventDispatcher(); + $addressEncoder = $addressEncoder ?? new Swift_AddressEncoder_IdnAddressEncoder(); + + return new Swift_Transport_EsmtpTransport($buf, [], $dispatcher, 'example.org', $addressEncoder); + } + + public function testHostCanBeSetAndFetched() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $smtp->setHost('foo'); + $this->assertEquals('foo', $smtp->getHost(), '%s: Host should be returned'); + } + + public function testPortCanBeSetAndFetched() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $smtp->setPort(25); + $this->assertEquals(25, $smtp->getPort(), '%s: Port should be returned'); + } + + public function testTimeoutCanBeSetAndFetched() + { + $buf = $this->getBuffer(); + $buf->shouldReceive('setParam') + ->once() + ->with('timeout', 10); + + $smtp = $this->getTransport($buf); + $smtp->setTimeout(10); + $this->assertEquals(10, $smtp->getTimeout(), '%s: Timeout should be returned'); + } + + public function testEncryptionCanBeSetAndFetched() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $smtp->setEncryption('tls'); + $this->assertEquals('tls', $smtp->getEncryption(), '%s: Crypto should be returned'); + } + + public function testStartSendsHeloToInitiate() + { + // previous loop would fail if there is an issue + $this->addToAssertionCount(1); + } + + public function testStartSendsEhloToInitiate() + { + /* -- RFC 2821, 3.2. + + 3.2 Client Initiation + + Once the server has sent the welcoming message and the client has + received it, the client normally sends the EHLO command to the + server, indicating the client's identity. In addition to opening the + session, use of EHLO indicates that the client is able to process + service extensions and requests that the server provide a list of the + extensions it supports. Older SMTP systems which are unable to + support service extensions and contemporary clients which do not + require service extensions in the mail session being initiated, MAY + use HELO instead of EHLO. Servers MUST NOT return the extended + EHLO-style response to a HELO command. For a particular connection + attempt, if the server returns a "command not recognized" response to + EHLO, the client SHOULD be able to fall back and send HELO. + + In the EHLO command the host sending the command identifies itself; + the command may be interpreted as saying "Hello, I am " (and, + in the case of EHLO, "and I support service extension requests"). + + -- RFC 2281, 4.1.1.1. + + ehlo = "EHLO" SP Domain CRLF + helo = "HELO" SP Domain CRLF + + -- RFC 2821, 4.3.2. + + EHLO or HELO + S: 250 + E: 504, 550 + + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 ServerName'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + } catch (Exception $e) { + $this->fail('Starting Esmtp should send EHLO and accept 250 response: '.$e->getMessage()); + } + } + + public function testHeloIsUsedAsFallback() + { + /* -- RFC 2821, 4.1.4. + + If the EHLO command is not acceptable to the SMTP server, 501, 500, + or 502 failure replies MUST be returned as appropriate. The SMTP + server MUST stay in the same state after transmitting these replies + that it was in before the EHLO was received. + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('501 WTF'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^HELO .+?\r\n$~D') + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 HELO'."\r\n"); + + $this->finishBuffer($buf); + try { + $smtp->start(); + } catch (Exception $e) { + $this->fail( + 'Starting Esmtp should fallback to HELO if needed and accept 250 response' + ); + } + } + + public function testInvalidHeloResponseCausesException() + { + //Overridden to first try EHLO + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('501 WTF'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^HELO .+?\r\n$~D') + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('504 WTF'."\r\n"); + $this->finishBuffer($buf); + + try { + $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started'); + $smtp->start(); + $this->fail('Non 250 HELO response should raise Exception'); + } catch (Exception $e) { + $this->assertFalse($smtp->isStarted(), '%s: SMTP start() should have failed'); + } + } + + public function testDomainNameIsPlacedInEhlo() + { + /* -- RFC 2821, 4.1.4. + + The SMTP client MUST, if possible, ensure that the domain parameter + to the EHLO command is a valid principal host name (not a CNAME or MX + name) for its host. If this is not possible (e.g., when the client's + address is dynamically assigned and the client does not have an + obvious name), an address literal SHOULD be substituted for the + domain name and supplemental information provided that will assist in + identifying the client. + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("EHLO mydomain.com\r\n") + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 ServerName'."\r\n"); + + $this->finishBuffer($buf); + $smtp->setLocalDomain('mydomain.com'); + $smtp->start(); + } + + public function testDomainNameIsPlacedInHelo() + { + //Overridden to include ESMTP + /* -- RFC 2821, 4.1.4. + + The SMTP client MUST, if possible, ensure that the domain parameter + to the EHLO command is a valid principal host name (not a CNAME or MX + name) for its host. If this is not possible (e.g., when the client's + address is dynamically assigned and the client does not have an + obvious name), an address literal SHOULD be substituted for the + domain name and supplemental information provided that will assist in + identifying the client. + */ + + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('501 WTF'."\r\n"); + $buf->shouldReceive('write') + ->once() + ->with("HELO mydomain.com\r\n") + ->andReturn(2); + $buf->shouldReceive('readLine') + ->once() + ->with(2) + ->andReturn('250 ServerName'."\r\n"); + + $this->finishBuffer($buf); + $smtp->setLocalDomain('mydomain.com'); + $smtp->start(); + } + + public function testPipelining() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $this->assertNull($smtp->getPipelining()); + + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250-ServerName'."\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 PIPELINING'."\r\n"); + + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("DATA\r\n")->andReturn(3); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(1)->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(2)->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(3)->andReturn("354 OK\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $sent = $smtp->send($message, $failedRecipients); + + $this->assertEquals(1, $sent); + $this->assertEmpty($failedRecipients); + + $this->assertTrue($smtp->getPipelining()); + } + + public function testPipeliningWithRecipientFailure() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $this->assertNull($smtp->getPipelining()); + + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn([ + 'good@foo' => null, + 'bad@foo' => null, + 'good@bar' => null, + ]); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250-ServerName'."\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 PIPELINING'."\r\n"); + + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(3); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(4); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("DATA\r\n") + ->andReturn(5); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(2) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(3) + ->andReturn("450 Unknown address bad@foo\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(4) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(5) + ->andReturn("354 OK\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $sent = $smtp->send($message, $failedRecipients); + + $this->assertEquals(2, $sent); + $this->assertEquals(['bad@foo'], $failedRecipients); + + $this->assertTrue($smtp->getPipelining()); + } + + public function testPipeliningWithSenderFailure() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $this->assertNull($smtp->getPipelining()); + + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250-ServerName'."\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 PIPELINING'."\r\n"); + + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("DATA\r\n")->andReturn(3); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(1) + ->andReturn("550 Unknown address me@domain.com\r\n"); + + $smtp->start(); + + $this->expectException('Swift_TransportException'); + $this->expectExceptionMessage('Expected response code 250 but got code "550"'); + $smtp->send($message, $failedRecipients); + } + + public function testPipeliningWithDataFailure() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $this->assertNull($smtp->getPipelining()); + + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => null]); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250-ServerName'."\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 PIPELINING'."\r\n"); + + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("MAIL FROM:\r\n") + ->andReturn(1); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("RCPT TO:\r\n") + ->andReturn(2); + $buf->shouldReceive('write') + ->ordered() + ->once() + ->with("DATA\r\n")->andReturn(3); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(1) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(2) + ->andReturn("250 OK\r\n"); + $buf->shouldReceive('readLine') + ->ordered() + ->once() + ->with(3) + ->andReturn("452 Insufficient system storage\r\n"); + + $smtp->start(); + + $this->expectException('Swift_TransportException'); + $this->expectExceptionMessage('Expected response code 354 but got code "452"'); + $smtp->send($message, $failedRecipients); + } + + public function providerPipeliningOverride() + { + return [ + [null, true, true], + [null, false, false], + [true, false, true], + [true, true, true], + [false, false, false], + [false, true, false], + ]; + } + + /** + * @dataProvider providerPipeliningOverride + */ + public function testPipeliningOverride($enabled, bool $supported, bool $expected) + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $this->assertNull($smtp->getPipelining()); + + $smtp->setPipelining($enabled); + $this->assertSame($enabled, $smtp->getPipelining()); + + $message = $this->createMessage(); + $message->shouldReceive('getFrom') + ->zeroOrMoreTimes() + ->andReturn(['me@domain.com' => 'Me']); + + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('readLine') + ->once() + ->with(0) + ->andReturn("220 some.server.tld bleh\r\n"); + $buf->shouldReceive('write') + ->once() + ->with('~^EHLO .+?\r\n$~D') + ->andReturn(1); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250-ServerName'."\r\n"); + $buf->shouldReceive('readLine') + ->once() + ->with(1) + ->andReturn('250 '.($supported ? 'PIPELINING' : 'FOOBAR')."\r\n"); + + $this->finishBuffer($buf); + $smtp->start(); + $smtp->send($message); + + $this->assertSame($expected, $smtp->getPipelining()); + } + + public function testFluidInterface() + { + $buf = $this->getBuffer(); + $smtp = $this->getTransport($buf); + $buf->shouldReceive('setParam') + ->once() + ->with('timeout', 30); + + $ref = $smtp + ->setHost('foo') + ->setPort(25) + ->setEncryption('tls') + ->setTimeout(30) + ->setPipelining(false) + ; + $this->assertEquals($ref, $smtp); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php new file mode 100644 index 0000000..deb0617 --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php @@ -0,0 +1,600 @@ +getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState) { + return $connectionState; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState) { + if (!$connectionState) { + $connectionState = true; + } + }); + $t1->shouldReceive('send') + ->twice() + ->with(\Mockery::anyOf($message1, $message2), \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState) { + if ($connectionState) { + return 1; + } + }); + $t2->shouldReceive('start')->never(); + $t2->shouldReceive('send')->never(); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message1)); + $this->assertEquals(1, $transport->send($message2)); + } + + public function testMessageCanBeTriedOnNextTransportIfExceptionThrown() + { + $e = new Swift_TransportException('b0rken'); + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + throw $e; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + return 1; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message)); + } + + public function testZeroIsReturnedIfTransportReturnsZero() + { + $message = $this->getMockery('Swift_Mime_SimpleMessage')->shouldIgnoreMissing(); + $t1 = $this->getMockery('Swift_Transport')->shouldIgnoreMissing(); + + $connectionState = false; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState) { + return $connectionState; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState) { + if (!$connectionState) { + $connectionState = true; + } + }); + $testCase = $this; + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState, $testCase) { + if (!$connectionState) { + $testCase->fail(); + } + + return 0; + }); + + $transport = $this->getTransport([$t1]); + $transport->start(); + $this->assertEquals(0, $transport->send($message)); + } + + public function testTransportsWhichThrowExceptionsAreNotRetried() + { + $e = new Swift_TransportException('maur b0rken'); + + $message1 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message3 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message4 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + throw $e; + } + }); + $t1->shouldReceive('send') + ->never() + ->with($message2, \Mockery::any()); + $t1->shouldReceive('send') + ->never() + ->with($message3, \Mockery::any()); + $t1->shouldReceive('send') + ->never() + ->with($message4, \Mockery::any()); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->times(4) + ->with(\Mockery::anyOf($message1, $message2, $message3, $message4), \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + return 1; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message1)); + $this->assertEquals(1, $transport->send($message2)); + $this->assertEquals(1, $transport->send($message3)); + $this->assertEquals(1, $transport->send($message4)); + } + + public function testExceptionIsThrownIfAllTransportsDie() + { + $e = new Swift_TransportException('b0rken'); + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + throw $e; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + throw $e; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + try { + $transport->send($message); + $this->fail('All transports failed so Exception should be thrown'); + } catch (Exception $e) { + } + } + + public function testStoppingTransportStopsAllDelegates() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $connectionState1 = true; + $connectionState2 = true; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('stop') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if ($connectionState1) { + $connectionState1 = false; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('stop') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if ($connectionState2) { + $connectionState2 = false; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $transport->stop(); + } + + public function testTransportShowsAsNotStartedIfAllDelegatesDead() + { + $e = new Swift_TransportException('b0rken'); + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + $connectionState1 = false; + throw $e; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + $connectionState2 = false; + throw $e; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertTrue($transport->isStarted()); + try { + $transport->send($message); + $this->fail('All transports failed so Exception should be thrown'); + } catch (Exception $e) { + $this->assertFalse($transport->isStarted()); + } + } + + public function testRestartingTransportRestartsDeadDelegates() + { + $e = new Swift_TransportException('b0rken'); + + $message1 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->twice() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + $connectionState1 = false; + throw $e; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message2, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1) { + if ($connectionState1) { + return 10; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + $connectionState2 = false; + throw $e; + } + }); + $t2->shouldReceive('send') + ->never() + ->with($message2, \Mockery::any()); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertTrue($transport->isStarted()); + try { + $transport->send($message1); + $this->fail('All transports failed so Exception should be thrown'); + } catch (Exception $e) { + $this->assertFalse($transport->isStarted()); + } + //Restart and re-try + $transport->start(); + $this->assertTrue($transport->isStarted()); + $this->assertEquals(10, $transport->send($message2)); + } + + public function testFailureReferenceIsPassedToDelegates() + { + $failures = []; + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + + $connectionState = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use ($connectionState) { + return $connectionState; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use ($connectionState) { + if (!$connectionState) { + $connectionState = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, $failures) + ->andReturnUsing(function () use ($connectionState) { + if ($connectionState) { + return 1; + } + }); + + $transport = $this->getTransport([$t1]); + $transport->start(); + $transport->send($message, $failures); + } + + public function testRegisterPluginDelegatesToLoadedTransports() + { + $plugin = $this->createPlugin(); + + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $t1->shouldReceive('registerPlugin') + ->once() + ->with($plugin); + $t2->shouldReceive('registerPlugin') + ->once() + ->with($plugin); + + $transport = $this->getTransport([$t1, $t2]); + $transport->registerPlugin($plugin); + } + + public function testEachDelegateIsPinged() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('ping') + ->once() + ->andReturn(true); + + $transport = $this->getTransport([$t1, $t2]); + $this->assertTrue($transport->isStarted()); + $this->assertTrue($transport->ping()); + } + + public function testDelegateIsKilledWhenPingFails() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('ping') + ->once() + ->andReturn(false); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('ping') + ->twice() + ->andReturn(true); + + $transport = $this->getTransport([$t1, $t2]); + $this->assertTrue($transport->ping()); + $this->assertTrue($transport->ping()); + $this->assertTrue($transport->isStarted()); + } + + public function XtestTransportShowsAsNotStartedIfAllPingFails() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('ping') + ->once() + ->andReturn(false); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('ping') + ->once() + ->andReturn(false); + + $transport = $this->getTransport([$t1, $t2]); + $this->assertFalse($transport->ping()); + $this->assertFalse($transport->isStarted()); + $this->assertFalse($transport->ping()); + } + + private function getTransport(array $transports) + { + $transport = new Swift_Transport_FailoverTransport(); + $transport->setTransports($transports); + + return $transport; + } + + private function createPlugin() + { + return $this->getMockery('Swift_Events_EventListener'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php new file mode 100644 index 0000000..dbc60af --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php @@ -0,0 +1,838 @@ +getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $testCase) { + if ($connectionState1) { + return 1; + } + $testCase->fail(); + }); + $t1->shouldReceive('send') + ->never() + ->with($message2, \Mockery::any()); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message2, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $testCase) { + if ($connectionState2) { + return 1; + } + $testCase->fail(); + }); + $t2->shouldReceive('send') + ->never() + ->with($message1, \Mockery::any()); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message1)); + $this->assertEquals(1, $transport->send($message2)); + } + + public function testTransportsAreReusedInRotatingFashion() + { + $message1 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message3 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message4 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $testCase) { + if ($connectionState1) { + return 1; + } + $testCase->fail(); + }); + $t1->shouldReceive('send') + ->never() + ->with($message2, \Mockery::any()); + $t1->shouldReceive('send') + ->once() + ->with($message3, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $testCase) { + if ($connectionState1) { + return 1; + } + $testCase->fail(); + }); + $t1->shouldReceive('send') + ->never() + ->with($message4, \Mockery::any()); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message2, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $testCase) { + if ($connectionState2) { + return 1; + } + $testCase->fail(); + }); + $t2->shouldReceive('send') + ->never() + ->with($message1, \Mockery::any()); + $t2->shouldReceive('send') + ->once() + ->with($message4, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $testCase) { + if ($connectionState2) { + return 1; + } + $testCase->fail(); + }); + $t2->shouldReceive('send') + ->never() + ->with($message3, \Mockery::any()); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + + $this->assertEquals(1, $transport->send($message1)); + $this->assertEquals(1, $transport->send($message2)); + $this->assertEquals(1, $transport->send($message3)); + $this->assertEquals(1, $transport->send($message4)); + } + + public function testMessageCanBeTriedOnNextTransportIfExceptionThrown() + { + $e = new Swift_TransportException('b0rken'); + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e, $testCase) { + if ($connectionState1) { + throw $e; + } + $testCase->fail(); + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $testCase) { + if ($connectionState2) { + return 1; + } + $testCase->fail(); + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message)); + } + + public function testMessageIsTriedOnNextTransportIfZeroReturned() + { + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1) { + if ($connectionState1) { + return 0; + } + + return 1; + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2) { + if ($connectionState2) { + return 1; + } + + return 0; + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message)); + } + + public function testZeroIsReturnedIfAllTransportsReturnZero() + { + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1) { + if ($connectionState1) { + return 0; + } + + return 1; + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2) { + if ($connectionState2) { + return 0; + } + + return 1; + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(0, $transport->send($message)); + } + + public function testTransportsWhichThrowExceptionsAreNotRetried() + { + $e = new Swift_TransportException('maur b0rken'); + + $message1 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message3 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message4 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e, $testCase) { + if ($connectionState1) { + throw $e; + } + $testCase->fail(); + }); + $t1->shouldReceive('send') + ->never() + ->with($message2, \Mockery::any()); + $t1->shouldReceive('send') + ->never() + ->with($message3, \Mockery::any()); + $t1->shouldReceive('send') + ->never() + ->with($message4, \Mockery::any()); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->times(4) + ->with(\Mockery::anyOf($message1, $message3, $message3, $message4), \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $testCase) { + if ($connectionState2) { + return 1; + } + $testCase->fail(); + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertEquals(1, $transport->send($message1)); + $this->assertEquals(1, $transport->send($message2)); + $this->assertEquals(1, $transport->send($message3)); + $this->assertEquals(1, $transport->send($message4)); + } + + public function testExceptionIsThrownIfAllTransportsDie() + { + $e = new Swift_TransportException('b0rken'); + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + throw $e; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + throw $e; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + try { + $transport->send($message); + $this->fail('All transports failed so Exception should be thrown'); + } catch (Exception $e) { + } + } + + public function testStoppingTransportStopsAllDelegates() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = true; + $connectionState2 = true; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('stop') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if ($connectionState1) { + $connectionState1 = false; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('stop') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if ($connectionState2) { + $connectionState2 = false; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $transport->stop(); + } + + public function testTransportShowsAsNotStartedIfAllDelegatesDead() + { + $e = new Swift_TransportException('b0rken'); + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + throw $e; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + throw $e; + } + }); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertTrue($transport->isStarted()); + try { + $transport->send($message); + $this->fail('All transports failed so Exception should be thrown'); + } catch (Exception $e) { + $this->assertFalse($transport->isStarted()); + } + } + + public function testRestartingTransportRestartsDeadDelegates() + { + $e = new Swift_TransportException('b0rken'); + + $message1 = $this->getMockery('Swift_Mime_SimpleMessage'); + $message2 = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + $connectionState1 = false; + $connectionState2 = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('start') + ->twice() + ->andReturnUsing(function () use (&$connectionState1) { + if (!$connectionState1) { + $connectionState1 = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + $connectionState1 = false; + throw $e; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message2, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState1, $e) { + if ($connectionState1) { + return 10; + } + }); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState2) { + if (!$connectionState2) { + $connectionState2 = true; + } + }); + $t2->shouldReceive('send') + ->once() + ->with($message1, \Mockery::any()) + ->andReturnUsing(function () use (&$connectionState2, $e) { + if ($connectionState2) { + throw $e; + } + }); + $t2->shouldReceive('send') + ->never() + ->with($message2, \Mockery::any()); + + $transport = $this->getTransport([$t1, $t2]); + $transport->start(); + $this->assertTrue($transport->isStarted()); + try { + $transport->send($message1); + $this->fail('All transports failed so Exception should be thrown'); + } catch (Exception $e) { + $this->assertFalse($transport->isStarted()); + } + //Restart and re-try + $transport->start(); + $this->assertTrue($transport->isStarted()); + $this->assertEquals(10, $transport->send($message2)); + } + + public function testFailureReferenceIsPassedToDelegates() + { + $failures = []; + $testCase = $this; + + $message = $this->getMockery('Swift_Mime_SimpleMessage'); + $t1 = $this->getMockery('Swift_Transport'); + $connectionState = false; + + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState) { + return $connectionState; + }); + $t1->shouldReceive('start') + ->once() + ->andReturnUsing(function () use (&$connectionState) { + if (!$connectionState) { + $connectionState = true; + } + }); + $t1->shouldReceive('send') + ->once() + ->with($message, \Mockery::on(function (&$var) use (&$failures, $testCase) { + return $testCase->varsAreReferences($var, $failures); + })) + ->andReturnUsing(function () use (&$connectionState) { + if ($connectionState) { + return 1; + } + }); + + $transport = $this->getTransport([$t1]); + $transport->start(); + $transport->send($message, $failures); + } + + public function testRegisterPluginDelegatesToLoadedTransports() + { + $plugin = $this->createPlugin(); + + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $t1->shouldReceive('registerPlugin') + ->once() + ->with($plugin); + $t2->shouldReceive('registerPlugin') + ->once() + ->with($plugin); + + $transport = $this->getTransport([$t1, $t2]); + $transport->registerPlugin($plugin); + } + + public function testEachDelegateIsPinged() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('ping') + ->once() + ->andReturn(true); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('ping') + ->once() + ->andReturn(true); + + $transport = $this->getTransport([$t1, $t2]); + $this->assertTrue($transport->isStarted()); + $this->assertTrue($transport->ping()); + } + + public function testDelegateIsKilledWhenPingFails() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('ping') + ->twice() + ->andReturn(true); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('ping') + ->once() + ->andReturn(false); + + $transport = $this->getTransport([$t1, $t2]); + $this->assertTrue($transport->ping()); + $this->assertTrue($transport->ping()); + $this->assertTrue($transport->isStarted()); + } + + public function testTransportShowsAsNotStartedIfAllPingFails() + { + $t1 = $this->getMockery('Swift_Transport'); + $t2 = $this->getMockery('Swift_Transport'); + + $testCase = $this; + $t1->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState1) { + return $connectionState1; + }); + $t1->shouldReceive('ping') + ->once() + ->andReturn(false); + + $t2->shouldReceive('isStarted') + ->zeroOrMoreTimes() + ->andReturnUsing(function () use (&$connectionState2) { + return $connectionState2; + }); + $t2->shouldReceive('ping') + ->once() + ->andReturn(false); + + $transport = $this->getTransport([$t1, $t2]); + $this->assertFalse($transport->ping()); + $this->assertFalse($transport->isStarted()); + $this->assertFalse($transport->ping()); + } + + /** + * Adapted from Yay_Matchers_ReferenceMatcher. + */ + public function varsAreReferences(&$ref1, &$ref2) + { + if (is_object($ref2)) { + return $ref1 === $ref2; + } + if ($ref1 !== $ref2) { + return false; + } + + $copy = $ref2; + $randomString = uniqid('yay', true); + $ref2 = $randomString; + $isRef = ($ref1 === $ref2); + $ref2 = $copy; + + return $isRef; + } + + private function getTransport(array $transports) + { + $transport = new Swift_Transport_LoadBalancedTransport(); + $transport->setTransports($transports); + + return $transport; + } + + private function createPlugin() + { + return $this->getMockery('Swift_Events_EventListener'); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php new file mode 100644 index 0000000..fe40d6c --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php @@ -0,0 +1,150 @@ +createEventDispatcher(); + } + $transport = new Swift_Transport_SendmailTransport($buf, $dispatcher, 'example.org', $addressEncoder); + $transport->setCommand($command); + + return $transport; + } + + protected function getSendmail($buf, $dispatcher = null) + { + if (!$dispatcher) { + $dispatcher = $this->createEventDispatcher(); + } + + return new Swift_Transport_SendmailTransport($buf, $dispatcher); + } + + public function testCommandCanBeSetAndFetched() + { + $buf = $this->getBuffer(); + $sendmail = $this->getSendmail($buf); + + $sendmail->setCommand('/usr/sbin/sendmail -bs'); + $this->assertEquals('/usr/sbin/sendmail -bs', $sendmail->getCommand()); + $sendmail->setCommand('/usr/sbin/sendmail -oi -t'); + $this->assertEquals('/usr/sbin/sendmail -oi -t', $sendmail->getCommand()); + } + + public function testSendingMessageIn_t_ModeUsesSimplePipe() + { + $buf = $this->getBuffer(); + $sendmail = $this->getSendmail($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => 'Foobar', 'zip@button' => 'Zippy']); + $message->shouldReceive('toByteStream') + ->once() + ->with($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('terminate') + ->once(); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with(["\r\n" => "\n", "\n." => "\n.."]); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with([]); + + $sendmail->setCommand('/usr/sbin/sendmail -t'); + $this->assertEquals(2, $sendmail->send($message)); + } + + public function testSendingIn_t_ModeWith_i_FlagDoesntEscapeDot() + { + $buf = $this->getBuffer(); + $sendmail = $this->getSendmail($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => 'Foobar', 'zip@button' => 'Zippy']); + $message->shouldReceive('toByteStream') + ->once() + ->with($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('terminate') + ->once(); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with(["\r\n" => "\n"]); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with([]); + + $sendmail->setCommand('/usr/sbin/sendmail -i -t'); + $this->assertEquals(2, $sendmail->send($message)); + } + + public function testSendingInTModeWith_oi_FlagDoesntEscapeDot() + { + $buf = $this->getBuffer(); + $sendmail = $this->getSendmail($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => 'Foobar', 'zip@button' => 'Zippy']); + $message->shouldReceive('toByteStream') + ->once() + ->with($buf); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('terminate') + ->once(); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with(["\r\n" => "\n"]); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with([]); + + $sendmail->setCommand('/usr/sbin/sendmail -oi -t'); + $this->assertEquals(2, $sendmail->send($message)); + } + + public function testSendingMessageRegeneratesId() + { + $buf = $this->getBuffer(); + $sendmail = $this->getSendmail($buf); + $message = $this->createMessage(); + + $message->shouldReceive('getTo') + ->zeroOrMoreTimes() + ->andReturn(['foo@bar' => 'Foobar', 'zip@button' => 'Zippy']); + $message->shouldReceive('generateId'); + $buf->shouldReceive('initialize') + ->once(); + $buf->shouldReceive('terminate') + ->once(); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with(["\r\n" => "\n", "\n." => "\n.."]); + $buf->shouldReceive('setWriteTranslations') + ->once() + ->with([]); + + $sendmail->setCommand('/usr/sbin/sendmail -t'); + $this->assertEquals(2, $sendmail->send($message)); + } + + public function testFluidInterface() + { + $buf = $this->getBuffer(); + $sendmail = $this->getTransport($buf); + + $ref = $sendmail->setCommand('/foo'); + $this->assertEquals($ref, $sendmail); + } +} diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php new file mode 100644 index 0000000..540709a --- /dev/null +++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php @@ -0,0 +1,43 @@ +createFactory(); + $factory->expects($this->once()) + ->method('createFilter') + ->with('a', 'b') + ->will($this->returnCallback([$this, 'createFilter'])); + + $buffer = $this->createBuffer($factory); + $buffer->setWriteTranslations(['a' => 'b']); + } + + public function testOverridingTranslationsOnlyAddsNeededFilters() + { + $factory = $this->createFactory(); + $factory->expects($this->exactly(2)) + ->method('createFilter') + ->will($this->returnCallback([$this, 'createFilter'])); + + $buffer = $this->createBuffer($factory); + $buffer->setWriteTranslations(['a' => 'b']); + $buffer->setWriteTranslations(['x' => 'y', 'a' => 'b']); + } + + private function createBuffer($replacementFactory) + { + return new Swift_Transport_StreamBuffer($replacementFactory); + } + + private function createFactory() + { + return $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock(); + } + + public function createFilter() + { + return $this->getMockBuilder('Swift_StreamFilter')->getMock(); + } +} diff --git a/vendor/symfony/console/Application.php b/vendor/symfony/console/Application.php new file mode 100644 index 0000000..f3914bb --- /dev/null +++ b/vendor/symfony/console/Application.php @@ -0,0 +1,1174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Command\HelpCommand; +use Symfony\Component\Console\Command\ListCommand; +use Symfony\Component\Console\CommandLoader\CommandLoaderInterface; +use Symfony\Component\Console\Event\ConsoleCommandEvent; +use Symfony\Component\Console\Event\ConsoleErrorEvent; +use Symfony\Component\Console\Event\ConsoleTerminateEvent; +use Symfony\Component\Console\Exception\CommandNotFoundException; +use Symfony\Component\Console\Exception\ExceptionInterface; +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Exception\NamespaceNotFoundException; +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Helper\DebugFormatterHelper; +use Symfony\Component\Console\Helper\FormatterHelper; +use Symfony\Component\Console\Helper\Helper; +use Symfony\Component\Console\Helper\HelperSet; +use Symfony\Component\Console\Helper\ProcessHelper; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Input\ArgvInput; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputAwareInterface; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\ErrorHandler\ErrorHandler; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use Symfony\Contracts\Service\ResetInterface; + +/** + * An Application is the container for a collection of commands. + * + * It is the main entry point of a Console application. + * + * This class is optimized for a standard CLI environment. + * + * Usage: + * + * $app = new Application('myapp', '1.0 (stable)'); + * $app->add(new SimpleCommand()); + * $app->run(); + * + * @author Fabien Potencier + */ +class Application implements ResetInterface +{ + private $commands = []; + private $wantHelps = false; + private $runningCommand; + private $name; + private $version; + private $commandLoader; + private $catchExceptions = true; + private $autoExit = true; + private $definition; + private $helperSet; + private $dispatcher; + private $terminal; + private $defaultCommand; + private $singleCommand = false; + private $initialized; + + public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN') + { + $this->name = $name; + $this->version = $version; + $this->terminal = new Terminal(); + $this->defaultCommand = 'list'; + } + + /** + * @final + */ + public function setDispatcher(EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + + public function setCommandLoader(CommandLoaderInterface $commandLoader) + { + $this->commandLoader = $commandLoader; + } + + /** + * Runs the current application. + * + * @return int 0 if everything went fine, or an error code + * + * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}. + */ + public function run(InputInterface $input = null, OutputInterface $output = null) + { + putenv('LINES='.$this->terminal->getHeight()); + putenv('COLUMNS='.$this->terminal->getWidth()); + + if (null === $input) { + $input = new ArgvInput(); + } + + if (null === $output) { + $output = new ConsoleOutput(); + } + + $renderException = function (\Throwable $e) use ($output) { + if ($output instanceof ConsoleOutputInterface) { + $this->renderThrowable($e, $output->getErrorOutput()); + } else { + $this->renderThrowable($e, $output); + } + }; + if ($phpHandler = set_exception_handler($renderException)) { + restore_exception_handler(); + if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) { + $errorHandler = true; + } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) { + $phpHandler[0]->setExceptionHandler($errorHandler); + } + } + + $this->configureIO($input, $output); + + try { + $exitCode = $this->doRun($input, $output); + } catch (\Exception $e) { + if (!$this->catchExceptions) { + throw $e; + } + + $renderException($e); + + $exitCode = $e->getCode(); + if (is_numeric($exitCode)) { + $exitCode = (int) $exitCode; + if (0 === $exitCode) { + $exitCode = 1; + } + } else { + $exitCode = 1; + } + } finally { + // if the exception handler changed, keep it + // otherwise, unregister $renderException + if (!$phpHandler) { + if (set_exception_handler($renderException) === $renderException) { + restore_exception_handler(); + } + restore_exception_handler(); + } elseif (!$errorHandler) { + $finalHandler = $phpHandler[0]->setExceptionHandler(null); + if ($finalHandler !== $renderException) { + $phpHandler[0]->setExceptionHandler($finalHandler); + } + } + } + + if ($this->autoExit) { + if ($exitCode > 255) { + $exitCode = 255; + } + + exit($exitCode); + } + + return $exitCode; + } + + /** + * Runs the current application. + * + * @return int 0 if everything went fine, or an error code + */ + public function doRun(InputInterface $input, OutputInterface $output) + { + if (true === $input->hasParameterOption(['--version', '-V'], true)) { + $output->writeln($this->getLongVersion()); + + return 0; + } + + try { + // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument. + $input->bind($this->getDefinition()); + } catch (ExceptionInterface $e) { + // Errors must be ignored, full binding/validation happens later when the command is known. + } + + $name = $this->getCommandName($input); + if (true === $input->hasParameterOption(['--help', '-h'], true)) { + if (!$name) { + $name = 'help'; + $input = new ArrayInput(['command_name' => $this->defaultCommand]); + } else { + $this->wantHelps = true; + } + } + + if (!$name) { + $name = $this->defaultCommand; + $definition = $this->getDefinition(); + $definition->setArguments(array_merge( + $definition->getArguments(), + [ + 'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name), + ] + )); + } + + try { + $this->runningCommand = null; + // the command name MUST be the first element of the input + $command = $this->find($name); + } catch (\Throwable $e) { + if (!($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) || 1 !== \count($alternatives = $e->getAlternatives()) || !$input->isInteractive()) { + if (null !== $this->dispatcher) { + $event = new ConsoleErrorEvent($input, $output, $e); + $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); + + if (0 === $event->getExitCode()) { + return 0; + } + + $e = $event->getError(); + } + + throw $e; + } + + $alternative = $alternatives[0]; + + $style = new SymfonyStyle($input, $output); + $style->block(sprintf("\nCommand \"%s\" is not defined.\n", $name), null, 'error'); + if (!$style->confirm(sprintf('Do you want to run "%s" instead? ', $alternative), false)) { + if (null !== $this->dispatcher) { + $event = new ConsoleErrorEvent($input, $output, $e); + $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); + + return $event->getExitCode(); + } + + return 1; + } + + $command = $this->find($alternative); + } + + $this->runningCommand = $command; + $exitCode = $this->doRunCommand($command, $input, $output); + $this->runningCommand = null; + + return $exitCode; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + } + + public function setHelperSet(HelperSet $helperSet) + { + $this->helperSet = $helperSet; + } + + /** + * Get the helper set associated with the command. + * + * @return HelperSet The HelperSet instance associated with this command + */ + public function getHelperSet() + { + if (!$this->helperSet) { + $this->helperSet = $this->getDefaultHelperSet(); + } + + return $this->helperSet; + } + + public function setDefinition(InputDefinition $definition) + { + $this->definition = $definition; + } + + /** + * Gets the InputDefinition related to this Application. + * + * @return InputDefinition The InputDefinition instance + */ + public function getDefinition() + { + if (!$this->definition) { + $this->definition = $this->getDefaultInputDefinition(); + } + + if ($this->singleCommand) { + $inputDefinition = $this->definition; + $inputDefinition->setArguments(); + + return $inputDefinition; + } + + return $this->definition; + } + + /** + * Gets the help message. + * + * @return string A help message + */ + public function getHelp() + { + return $this->getLongVersion(); + } + + /** + * Gets whether to catch exceptions or not during commands execution. + * + * @return bool Whether to catch exceptions or not during commands execution + */ + public function areExceptionsCaught() + { + return $this->catchExceptions; + } + + /** + * Sets whether to catch exceptions or not during commands execution. + */ + public function setCatchExceptions(bool $boolean) + { + $this->catchExceptions = $boolean; + } + + /** + * Gets whether to automatically exit after a command execution or not. + * + * @return bool Whether to automatically exit after a command execution or not + */ + public function isAutoExitEnabled() + { + return $this->autoExit; + } + + /** + * Sets whether to automatically exit after a command execution or not. + */ + public function setAutoExit(bool $boolean) + { + $this->autoExit = $boolean; + } + + /** + * Gets the name of the application. + * + * @return string The application name + */ + public function getName() + { + return $this->name; + } + + /** + * Sets the application name. + **/ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * Gets the application version. + * + * @return string The application version + */ + public function getVersion() + { + return $this->version; + } + + /** + * Sets the application version. + */ + public function setVersion(string $version) + { + $this->version = $version; + } + + /** + * Returns the long version of the application. + * + * @return string The long application version + */ + public function getLongVersion() + { + if ('UNKNOWN' !== $this->getName()) { + if ('UNKNOWN' !== $this->getVersion()) { + return sprintf('%s %s', $this->getName(), $this->getVersion()); + } + + return $this->getName(); + } + + return 'Console Tool'; + } + + /** + * Registers a new command. + * + * @return Command The newly created command + */ + public function register(string $name) + { + return $this->add(new Command($name)); + } + + /** + * Adds an array of command objects. + * + * If a Command is not enabled it will not be added. + * + * @param Command[] $commands An array of commands + */ + public function addCommands(array $commands) + { + foreach ($commands as $command) { + $this->add($command); + } + } + + /** + * Adds a command object. + * + * If a command with the same name already exists, it will be overridden. + * If the command is not enabled it will not be added. + * + * @return Command|null The registered command if enabled or null + */ + public function add(Command $command) + { + $this->init(); + + $command->setApplication($this); + + if (!$command->isEnabled()) { + $command->setApplication(null); + + return null; + } + + // Will throw if the command is not correctly initialized. + $command->getDefinition(); + + if (!$command->getName()) { + throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_debug_type($command))); + } + + $this->commands[$command->getName()] = $command; + + foreach ($command->getAliases() as $alias) { + $this->commands[$alias] = $command; + } + + return $command; + } + + /** + * Returns a registered command by name or alias. + * + * @return Command A Command object + * + * @throws CommandNotFoundException When given command name does not exist + */ + public function get(string $name) + { + $this->init(); + + if (!$this->has($name)) { + throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name)); + } + + $command = $this->commands[$name]; + + if ($this->wantHelps) { + $this->wantHelps = false; + + $helpCommand = $this->get('help'); + $helpCommand->setCommand($command); + + return $helpCommand; + } + + return $command; + } + + /** + * Returns true if the command exists, false otherwise. + * + * @return bool true if the command exists, false otherwise + */ + public function has(string $name) + { + $this->init(); + + return isset($this->commands[$name]) || ($this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name))); + } + + /** + * Returns an array of all unique namespaces used by currently registered commands. + * + * It does not return the global namespace which always exists. + * + * @return string[] An array of namespaces + */ + public function getNamespaces() + { + $namespaces = []; + foreach ($this->all() as $command) { + if ($command->isHidden()) { + continue; + } + + $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName())); + + foreach ($command->getAliases() as $alias) { + $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias)); + } + } + + return array_values(array_unique(array_filter($namespaces))); + } + + /** + * Finds a registered namespace by a name or an abbreviation. + * + * @return string A registered namespace + * + * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous + */ + public function findNamespace(string $namespace) + { + $allNamespaces = $this->getNamespaces(); + $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $namespace); + $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces); + + if (empty($namespaces)) { + $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); + + if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { + if (1 == \count($alternatives)) { + $message .= "\n\nDid you mean this?\n "; + } else { + $message .= "\n\nDid you mean one of these?\n "; + } + + $message .= implode("\n ", $alternatives); + } + + throw new NamespaceNotFoundException($message, $alternatives); + } + + $exact = \in_array($namespace, $namespaces, true); + if (\count($namespaces) > 1 && !$exact) { + throw new NamespaceNotFoundException(sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces)); + } + + return $exact ? $namespace : reset($namespaces); + } + + /** + * Finds a command by name or alias. + * + * Contrary to get, this command tries to find the best + * match if you give it an abbreviation of a name or alias. + * + * @return Command A Command instance + * + * @throws CommandNotFoundException When command name is incorrect or ambiguous + */ + public function find(string $name) + { + $this->init(); + + $aliases = []; + + foreach ($this->commands as $command) { + foreach ($command->getAliases() as $alias) { + if (!$this->has($alias)) { + $this->commands[$alias] = $command; + } + } + } + + if ($this->has($name)) { + return $this->get($name); + } + + $allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands); + $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name); + $commands = preg_grep('{^'.$expr.'}', $allCommands); + + if (empty($commands)) { + $commands = preg_grep('{^'.$expr.'}i', $allCommands); + } + + // if no commands matched or we just matched namespaces + if (empty($commands) || \count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) { + if (false !== $pos = strrpos($name, ':')) { + // check if a namespace exists and contains commands + $this->findNamespace(substr($name, 0, $pos)); + } + + $message = sprintf('Command "%s" is not defined.', $name); + + if ($alternatives = $this->findAlternatives($name, $allCommands)) { + // remove hidden commands + $alternatives = array_filter($alternatives, function ($name) { + return !$this->get($name)->isHidden(); + }); + + if (1 == \count($alternatives)) { + $message .= "\n\nDid you mean this?\n "; + } else { + $message .= "\n\nDid you mean one of these?\n "; + } + $message .= implode("\n ", $alternatives); + } + + throw new CommandNotFoundException($message, array_values($alternatives)); + } + + // filter out aliases for commands which are already on the list + if (\count($commands) > 1) { + $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands; + $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) { + if (!$commandList[$nameOrAlias] instanceof Command) { + $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias); + } + + $commandName = $commandList[$nameOrAlias]->getName(); + + $aliases[$nameOrAlias] = $commandName; + + return $commandName === $nameOrAlias || !\in_array($commandName, $commands); + })); + } + + if (\count($commands) > 1) { + $usableWidth = $this->terminal->getWidth() - 10; + $abbrevs = array_values($commands); + $maxLen = 0; + foreach ($abbrevs as $abbrev) { + $maxLen = max(Helper::strlen($abbrev), $maxLen); + } + $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) { + if ($commandList[$cmd]->isHidden()) { + unset($commands[array_search($cmd, $commands)]); + + return false; + } + + $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription(); + + return Helper::strlen($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev; + }, array_values($commands)); + + if (\count($commands) > 1) { + $suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs)); + + throw new CommandNotFoundException(sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), array_values($commands)); + } + } + + $command = $this->get(reset($commands)); + + if ($command->isHidden()) { + throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name)); + } + + return $command; + } + + /** + * Gets the commands (registered in the given namespace if provided). + * + * The array keys are the full names and the values the command instances. + * + * @return Command[] An array of Command instances + */ + public function all(string $namespace = null) + { + $this->init(); + + if (null === $namespace) { + if (!$this->commandLoader) { + return $this->commands; + } + + $commands = $this->commands; + foreach ($this->commandLoader->getNames() as $name) { + if (!isset($commands[$name]) && $this->has($name)) { + $commands[$name] = $this->get($name); + } + } + + return $commands; + } + + $commands = []; + foreach ($this->commands as $name => $command) { + if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) { + $commands[$name] = $command; + } + } + + if ($this->commandLoader) { + foreach ($this->commandLoader->getNames() as $name) { + if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) { + $commands[$name] = $this->get($name); + } + } + } + + return $commands; + } + + /** + * Returns an array of possible abbreviations given a set of names. + * + * @return string[][] An array of abbreviations + */ + public static function getAbbreviations(array $names) + { + $abbrevs = []; + foreach ($names as $name) { + for ($len = \strlen($name); $len > 0; --$len) { + $abbrev = substr($name, 0, $len); + $abbrevs[$abbrev][] = $name; + } + } + + return $abbrevs; + } + + public function renderThrowable(\Throwable $e, OutputInterface $output): void + { + $output->writeln('', OutputInterface::VERBOSITY_QUIET); + + $this->doRenderThrowable($e, $output); + + if (null !== $this->runningCommand) { + $output->writeln(sprintf('%s', sprintf($this->runningCommand->getSynopsis(), $this->getName())), OutputInterface::VERBOSITY_QUIET); + $output->writeln('', OutputInterface::VERBOSITY_QUIET); + } + } + + protected function doRenderThrowable(\Throwable $e, OutputInterface $output): void + { + do { + $message = trim($e->getMessage()); + if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $class = get_debug_type($e); + $title = sprintf(' [%s%s] ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''); + $len = Helper::strlen($title); + } else { + $len = 0; + } + + if (false !== strpos($message, "@anonymous\0")) { + $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { + return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; + }, $message); + } + + $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : PHP_INT_MAX; + $lines = []; + foreach ('' !== $message ? preg_split('/\r?\n/', $message) : [] as $line) { + foreach ($this->splitStringByWidth($line, $width - 4) as $line) { + // pre-format lines to get the right string length + $lineLength = Helper::strlen($line) + 4; + $lines[] = [$line, $lineLength]; + + $len = max($lineLength, $len); + } + } + + $messages = []; + if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $messages[] = sprintf('%s', OutputFormatter::escape(sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a'))); + } + $messages[] = $emptyLine = sprintf('%s', str_repeat(' ', $len)); + if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $messages[] = sprintf('%s%s', $title, str_repeat(' ', max(0, $len - Helper::strlen($title)))); + } + foreach ($lines as $line) { + $messages[] = sprintf(' %s %s', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1])); + } + $messages[] = $emptyLine; + $messages[] = ''; + + $output->writeln($messages, OutputInterface::VERBOSITY_QUIET); + + if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $output->writeln('Exception trace:', OutputInterface::VERBOSITY_QUIET); + + // exception related properties + $trace = $e->getTrace(); + + array_unshift($trace, [ + 'function' => '', + 'file' => $e->getFile() ?: 'n/a', + 'line' => $e->getLine() ?: 'n/a', + 'args' => [], + ]); + + for ($i = 0, $count = \count($trace); $i < $count; ++$i) { + $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; + $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; + $function = isset($trace[$i]['function']) ? $trace[$i]['function'] : ''; + $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; + $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; + + $output->writeln(sprintf(' %s%s at %s:%s', $class, $function ? $type.$function.'()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET); + } + + $output->writeln('', OutputInterface::VERBOSITY_QUIET); + } + } while ($e = $e->getPrevious()); + } + + /** + * Configures the input and output instances based on the user arguments and options. + */ + protected function configureIO(InputInterface $input, OutputInterface $output) + { + if (true === $input->hasParameterOption(['--ansi'], true)) { + $output->setDecorated(true); + } elseif (true === $input->hasParameterOption(['--no-ansi'], true)) { + $output->setDecorated(false); + } + + if (true === $input->hasParameterOption(['--no-interaction', '-n'], true)) { + $input->setInteractive(false); + } + + switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) { + case -1: $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); break; + case 1: $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); break; + case 2: $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); break; + case 3: $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); break; + default: $shellVerbosity = 0; break; + } + + if (true === $input->hasParameterOption(['--quiet', '-q'], true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); + $shellVerbosity = -1; + } else { + if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); + $shellVerbosity = 3; + } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); + $shellVerbosity = 2; + } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); + $shellVerbosity = 1; + } + } + + if (-1 === $shellVerbosity) { + $input->setInteractive(false); + } + + putenv('SHELL_VERBOSITY='.$shellVerbosity); + $_ENV['SHELL_VERBOSITY'] = $shellVerbosity; + $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity; + } + + /** + * Runs the current command. + * + * If an event dispatcher has been attached to the application, + * events are also dispatched during the life-cycle of the command. + * + * @return int 0 if everything went fine, or an error code + */ + protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) + { + foreach ($command->getHelperSet() as $helper) { + if ($helper instanceof InputAwareInterface) { + $helper->setInput($input); + } + } + + if (null === $this->dispatcher) { + return $command->run($input, $output); + } + + // bind before the console.command event, so the listeners have access to input options/arguments + try { + $command->mergeApplicationDefinition(); + $input->bind($command->getDefinition()); + } catch (ExceptionInterface $e) { + // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition + } + + $event = new ConsoleCommandEvent($command, $input, $output); + $e = null; + + try { + $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND); + + if ($event->commandShouldRun()) { + $exitCode = $command->run($input, $output); + } else { + $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED; + } + } catch (\Throwable $e) { + $event = new ConsoleErrorEvent($input, $output, $e, $command); + $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); + $e = $event->getError(); + + if (0 === $exitCode = $event->getExitCode()) { + $e = null; + } + } + + $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode); + $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE); + + if (null !== $e) { + throw $e; + } + + return $event->getExitCode(); + } + + /** + * Gets the name of the command based on input. + * + * @return string|null + */ + protected function getCommandName(InputInterface $input) + { + return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument(); + } + + /** + * Gets the default input definition. + * + * @return InputDefinition An InputDefinition instance + */ + protected function getDefaultInputDefinition() + { + return new InputDefinition([ + new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), + + new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'), + new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), + new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), + new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'), + new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'), + new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'), + new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'), + ]); + } + + /** + * Gets the default commands that should always be available. + * + * @return Command[] An array of default Command instances + */ + protected function getDefaultCommands() + { + return [new HelpCommand(), new ListCommand()]; + } + + /** + * Gets the default helper set with the helpers that should always be available. + * + * @return HelperSet A HelperSet instance + */ + protected function getDefaultHelperSet() + { + return new HelperSet([ + new FormatterHelper(), + new DebugFormatterHelper(), + new ProcessHelper(), + new QuestionHelper(), + ]); + } + + /** + * Returns abbreviated suggestions in string format. + */ + private function getAbbreviationSuggestions(array $abbrevs): string + { + return ' '.implode("\n ", $abbrevs); + } + + /** + * Returns the namespace part of the command name. + * + * This method is not part of public API and should not be used directly. + * + * @return string The namespace of the command + */ + public function extractNamespace(string $name, int $limit = null) + { + $parts = explode(':', $name, -1); + + return implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit)); + } + + /** + * Finds alternative of $name among $collection, + * if nothing is found in $collection, try in $abbrevs. + * + * @return string[] A sorted array of similar string + */ + private function findAlternatives(string $name, iterable $collection): array + { + $threshold = 1e3; + $alternatives = []; + + $collectionParts = []; + foreach ($collection as $item) { + $collectionParts[$item] = explode(':', $item); + } + + foreach (explode(':', $name) as $i => $subname) { + foreach ($collectionParts as $collectionName => $parts) { + $exists = isset($alternatives[$collectionName]); + if (!isset($parts[$i]) && $exists) { + $alternatives[$collectionName] += $threshold; + continue; + } elseif (!isset($parts[$i])) { + continue; + } + + $lev = levenshtein($subname, $parts[$i]); + if ($lev <= \strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) { + $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; + } elseif ($exists) { + $alternatives[$collectionName] += $threshold; + } + } + } + + foreach ($collection as $item) { + $lev = levenshtein($name, $item); + if ($lev <= \strlen($name) / 3 || false !== strpos($item, $name)) { + $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; + } + } + + $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; }); + ksort($alternatives, SORT_NATURAL | SORT_FLAG_CASE); + + return array_keys($alternatives); + } + + /** + * Sets the default Command name. + * + * @return self + */ + public function setDefaultCommand(string $commandName, bool $isSingleCommand = false) + { + $this->defaultCommand = $commandName; + + if ($isSingleCommand) { + // Ensure the command exist + $this->find($commandName); + + $this->singleCommand = true; + } + + return $this; + } + + /** + * @internal + */ + public function isSingleCommand(): bool + { + return $this->singleCommand; + } + + private function splitStringByWidth(string $string, int $width): array + { + // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly. + // additionally, array_slice() is not enough as some character has doubled width. + // we need a function to split string not by character count but by string width + if (false === $encoding = mb_detect_encoding($string, null, true)) { + return str_split($string, $width); + } + + $utf8String = mb_convert_encoding($string, 'utf8', $encoding); + $lines = []; + $line = ''; + + $offset = 0; + while (preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) { + $offset += \strlen($m[0]); + + foreach (preg_split('//u', $m[0]) as $char) { + // test if $char could be appended to current line + if (mb_strwidth($line.$char, 'utf8') <= $width) { + $line .= $char; + continue; + } + // if not, push current line to array and make new line + $lines[] = str_pad($line, $width); + $line = $char; + } + } + + $lines[] = \count($lines) ? str_pad($line, $width) : $line; + + mb_convert_variables($encoding, 'utf8', $lines); + + return $lines; + } + + /** + * Returns all namespaces of the command name. + * + * @return string[] The namespaces of the command + */ + private function extractAllNamespaces(string $name): array + { + // -1 as third argument is needed to skip the command short name when exploding + $parts = explode(':', $name, -1); + $namespaces = []; + + foreach ($parts as $part) { + if (\count($namespaces)) { + $namespaces[] = end($namespaces).':'.$part; + } else { + $namespaces[] = $part; + } + } + + return $namespaces; + } + + private function init() + { + if ($this->initialized) { + return; + } + $this->initialized = true; + + foreach ($this->getDefaultCommands() as $command) { + $this->add($command); + } + } +} diff --git a/vendor/symfony/console/CHANGELOG.md b/vendor/symfony/console/CHANGELOG.md new file mode 100644 index 0000000..788bf42 --- /dev/null +++ b/vendor/symfony/console/CHANGELOG.md @@ -0,0 +1,185 @@ +CHANGELOG +========= + +5.1.0 +----- + + * `Command::setHidden()` is final since Symfony 5.1 + * Add `SingleCommandApplication` + * Add `Cursor` class + +5.0.0 +----- + + * removed support for finding hidden commands using an abbreviation, use the full name instead + * removed `TableStyle::setCrossingChar()` method in favor of `TableStyle::setDefaultCrossingChar()` + * removed `TableStyle::setHorizontalBorderChar()` method in favor of `TableStyle::setDefaultCrossingChars()` + * removed `TableStyle::getHorizontalBorderChar()` method in favor of `TableStyle::getBorderChars()` + * removed `TableStyle::setVerticalBorderChar()` method in favor of `TableStyle::setVerticalBorderChars()` + * removed `TableStyle::getVerticalBorderChar()` method in favor of `TableStyle::getBorderChars()` + * removed support for returning `null` from `Command::execute()`, return `0` instead + * `ProcessHelper::run()` accepts only `array|Symfony\Component\Process\Process` for its `command` argument + * `Application::setDispatcher` accepts only `Symfony\Contracts\EventDispatcher\EventDispatcherInterface` + for its `dispatcher` argument + * renamed `Application::renderException()` and `Application::doRenderException()` + to `renderThrowable()` and `doRenderThrowable()` respectively. + +4.4.0 +----- + + * deprecated finding hidden commands using an abbreviation, use the full name instead + * added `Question::setTrimmable` default to true to allow the answer to be trimmed + * added method `minSecondsBetweenRedraws()` and `maxSecondsBetweenRedraws()` on `ProgressBar` + * `Application` implements `ResetInterface` + * marked all dispatched event classes as `@final` + * added support for displaying table horizontally + * deprecated returning `null` from `Command::execute()`, return `0` instead + * Deprecated the `Application::renderException()` and `Application::doRenderException()` methods, + use `renderThrowable()` and `doRenderThrowable()` instead. + * added support for the `NO_COLOR` env var (https://no-color.org/) + +4.3.0 +----- + + * added support for hyperlinks + * added `ProgressBar::iterate()` method that simplify updating the progress bar when iterating + * added `Question::setAutocompleterCallback()` to provide a callback function + that dynamically generates suggestions as the user types + +4.2.0 +----- + + * allowed passing commands as `[$process, 'ENV_VAR' => 'value']` to + `ProcessHelper::run()` to pass environment variables + * deprecated passing a command as a string to `ProcessHelper::run()`, + pass it the command as an array of its arguments instead + * made the `ProcessHelper` class final + * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`) + * added `capture_stderr_separately` option to `CommandTester::execute()` + +4.1.0 +----- + + * added option to run suggested command if command is not found and only 1 alternative is available + * added option to modify console output and print multiple modifiable sections + * added support for iterable messages in output `write` and `writeln` methods + +4.0.0 +----- + + * `OutputFormatter` throws an exception when unknown options are used + * removed `QuestionHelper::setInputStream()/getInputStream()` + * removed `Application::getTerminalWidth()/getTerminalHeight()` and + `Application::setTerminalDimensions()/getTerminalDimensions()` +* removed `ConsoleExceptionEvent` +* removed `ConsoleEvents::EXCEPTION` + +3.4.0 +----- + + * added `SHELL_VERBOSITY` env var to control verbosity + * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11 + `ContainerCommandLoader` for commands lazy-loading + * added a case-insensitive command name matching fallback + * added static `Command::$defaultName/getDefaultName()`, allowing for + commands to be registered at compile time in the application command loader. + Setting the `$defaultName` property avoids the need for filling the `command` + attribute on the `console.command` tag when using `AddConsoleCommandPass`. + +3.3.0 +----- + +* added `ExceptionListener` +* added `AddConsoleCommandPass` (originally in FrameworkBundle) +* [BC BREAK] `Input::getOption()` no longer returns the default value for options + with value optional explicitly passed empty +* added console.error event to catch exceptions thrown by other listeners +* deprecated console.exception event in favor of console.error +* added ability to handle `CommandNotFoundException` through the + `console.error` event +* deprecated default validation in `SymfonyQuestionHelper::ask` + +3.2.0 +------ + +* added `setInputs()` method to CommandTester for ease testing of commands expecting inputs +* added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface) +* added StreamableInputInterface +* added LockableTrait + +3.1.0 +----- + + * added truncate method to FormatterHelper + * added setColumnWidth(s) method to Table + +2.8.3 +----- + + * remove readline support from the question helper as it caused issues + +2.8.0 +----- + + * use readline for user input in the question helper when available to allow + the use of arrow keys + +2.6.0 +----- + + * added a Process helper + * added a DebugFormatter helper + +2.5.0 +----- + + * deprecated the dialog helper (use the question helper instead) + * deprecated TableHelper in favor of Table + * deprecated ProgressHelper in favor of ProgressBar + * added ConsoleLogger + * added a question helper + * added a way to set the process name of a command + * added a way to set a default command instead of `ListCommand` + +2.4.0 +----- + + * added a way to force terminal dimensions + * added a convenient method to detect verbosity level + * [BC BREAK] made descriptors use output instead of returning a string + +2.3.0 +----- + + * added multiselect support to the select dialog helper + * added Table Helper for tabular data rendering + * added support for events in `Application` + * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` + * added a way to set the progress bar progress via the `setCurrent` method + * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'` + * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG + +2.2.0 +----- + + * added support for colorization on Windows via ConEmu + * add a method to Dialog Helper to ask for a question and hide the response + * added support for interactive selections in console (DialogHelper::select()) + * added support for autocompletion as you type in Dialog Helper + +2.1.0 +----- + + * added ConsoleOutputInterface + * added the possibility to disable a command (Command::isEnabled()) + * added suggestions when a command does not exist + * added a --raw option to the list command + * added support for STDERR in the console output class (errors are now sent + to STDERR) + * made the defaults (helper set, commands, input definition) in Application + more easily customizable + * added support for the shell even if readline is not available + * added support for process isolation in Symfony shell via + `--process-isolation` switch + * added support for `--`, which disables options parsing after that point + (tokens will be parsed as arguments) diff --git a/vendor/symfony/console/Command/Command.php b/vendor/symfony/console/Command/Command.php new file mode 100644 index 0000000..7f600ec --- /dev/null +++ b/vendor/symfony/console/Command/Command.php @@ -0,0 +1,648 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Command; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Exception\ExceptionInterface; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Helper\HelperSet; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Base class for all commands. + * + * @author Fabien Potencier + */ +class Command +{ + public const SUCCESS = 0; + public const FAILURE = 1; + + /** + * @var string|null The default command name + */ + protected static $defaultName; + + private $application; + private $name; + private $processTitle; + private $aliases = []; + private $definition; + private $hidden = false; + private $help = ''; + private $description = ''; + private $ignoreValidationErrors = false; + private $applicationDefinitionMerged = false; + private $applicationDefinitionMergedWithArgs = false; + private $code; + private $synopsis = []; + private $usages = []; + private $helperSet; + + /** + * @return string|null The default command name or null when no default name is set + */ + public static function getDefaultName() + { + $class = static::class; + $r = new \ReflectionProperty($class, 'defaultName'); + + return $class === $r->class ? static::$defaultName : null; + } + + /** + * @param string|null $name The name of the command; passing null means it must be set in configure() + * + * @throws LogicException When the command name is empty + */ + public function __construct(string $name = null) + { + $this->definition = new InputDefinition(); + + if (null !== $name || null !== $name = static::getDefaultName()) { + $this->setName($name); + } + + $this->configure(); + } + + /** + * Ignores validation errors. + * + * This is mainly useful for the help command. + */ + public function ignoreValidationErrors() + { + $this->ignoreValidationErrors = true; + } + + public function setApplication(Application $application = null) + { + $this->application = $application; + if ($application) { + $this->setHelperSet($application->getHelperSet()); + } else { + $this->helperSet = null; + } + } + + public function setHelperSet(HelperSet $helperSet) + { + $this->helperSet = $helperSet; + } + + /** + * Gets the helper set. + * + * @return HelperSet|null A HelperSet instance + */ + public function getHelperSet() + { + return $this->helperSet; + } + + /** + * Gets the application instance for this command. + * + * @return Application|null An Application instance + */ + public function getApplication() + { + return $this->application; + } + + /** + * Checks whether the command is enabled or not in the current environment. + * + * Override this to check for x or y and return false if the command can not + * run properly under the current conditions. + * + * @return bool + */ + public function isEnabled() + { + return true; + } + + /** + * Configures the current command. + */ + protected function configure() + { + } + + /** + * Executes the current command. + * + * This method is not abstract because you can use this class + * as a concrete class. In this case, instead of defining the + * execute() method, you set the code to execute by passing + * a Closure to the setCode() method. + * + * @return int 0 if everything went fine, or an exit code + * + * @throws LogicException When this abstract method is not implemented + * + * @see setCode() + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + throw new LogicException('You must override the execute() method in the concrete command class.'); + } + + /** + * Interacts with the user. + * + * This method is executed before the InputDefinition is validated. + * This means that this is the only place where the command can + * interactively ask for values of missing required arguments. + */ + protected function interact(InputInterface $input, OutputInterface $output) + { + } + + /** + * Initializes the command after the input has been bound and before the input + * is validated. + * + * This is mainly useful when a lot of commands extends one main command + * where some things need to be initialized based on the input arguments and options. + * + * @see InputInterface::bind() + * @see InputInterface::validate() + */ + protected function initialize(InputInterface $input, OutputInterface $output) + { + } + + /** + * Runs the command. + * + * The code to execute is either defined directly with the + * setCode() method or by overriding the execute() method + * in a sub-class. + * + * @return int The command exit code + * + * @throws \Exception When binding input fails. Bypass this by calling {@link ignoreValidationErrors()}. + * + * @see setCode() + * @see execute() + */ + public function run(InputInterface $input, OutputInterface $output) + { + // force the creation of the synopsis before the merge with the app definition + $this->getSynopsis(true); + $this->getSynopsis(false); + + // add the application arguments and options + $this->mergeApplicationDefinition(); + + // bind the input against the command specific arguments/options + try { + $input->bind($this->definition); + } catch (ExceptionInterface $e) { + if (!$this->ignoreValidationErrors) { + throw $e; + } + } + + $this->initialize($input, $output); + + if (null !== $this->processTitle) { + if (\function_exists('cli_set_process_title')) { + if (!@cli_set_process_title($this->processTitle)) { + if ('Darwin' === PHP_OS) { + $output->writeln('Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.', OutputInterface::VERBOSITY_VERY_VERBOSE); + } else { + cli_set_process_title($this->processTitle); + } + } + } elseif (\function_exists('setproctitle')) { + setproctitle($this->processTitle); + } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { + $output->writeln('Install the proctitle PECL to be able to change the process title.'); + } + } + + if ($input->isInteractive()) { + $this->interact($input, $output); + } + + // The command name argument is often omitted when a command is executed directly with its run() method. + // It would fail the validation if we didn't make sure the command argument is present, + // since it's required by the application. + if ($input->hasArgument('command') && null === $input->getArgument('command')) { + $input->setArgument('command', $this->getName()); + } + + $input->validate(); + + if ($this->code) { + $statusCode = ($this->code)($input, $output); + } else { + $statusCode = $this->execute($input, $output); + + if (!\is_int($statusCode)) { + throw new \TypeError(sprintf('Return value of "%s::execute()" must be of the type int, "%s" returned.', static::class, get_debug_type($statusCode))); + } + } + + return is_numeric($statusCode) ? (int) $statusCode : 0; + } + + /** + * Sets the code to execute when running this command. + * + * If this method is used, it overrides the code defined + * in the execute() method. + * + * @param callable $code A callable(InputInterface $input, OutputInterface $output) + * + * @return $this + * + * @throws InvalidArgumentException + * + * @see execute() + */ + public function setCode(callable $code) + { + if ($code instanceof \Closure) { + $r = new \ReflectionFunction($code); + if (null === $r->getClosureThis()) { + $code = \Closure::bind($code, $this); + } + } + + $this->code = $code; + + return $this; + } + + /** + * Merges the application definition with the command definition. + * + * This method is not part of public API and should not be used directly. + * + * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments + */ + public function mergeApplicationDefinition(bool $mergeArgs = true) + { + if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) { + return; + } + + $this->definition->addOptions($this->application->getDefinition()->getOptions()); + + $this->applicationDefinitionMerged = true; + + if ($mergeArgs) { + $currentArguments = $this->definition->getArguments(); + $this->definition->setArguments($this->application->getDefinition()->getArguments()); + $this->definition->addArguments($currentArguments); + + $this->applicationDefinitionMergedWithArgs = true; + } + } + + /** + * Sets an array of argument and option instances. + * + * @param array|InputDefinition $definition An array of argument and option instances or a definition instance + * + * @return $this + */ + public function setDefinition($definition) + { + if ($definition instanceof InputDefinition) { + $this->definition = $definition; + } else { + $this->definition->setDefinition($definition); + } + + $this->applicationDefinitionMerged = false; + + return $this; + } + + /** + * Gets the InputDefinition attached to this Command. + * + * @return InputDefinition An InputDefinition instance + */ + public function getDefinition() + { + if (null === $this->definition) { + throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class)); + } + + return $this->definition; + } + + /** + * Gets the InputDefinition to be used to create representations of this Command. + * + * Can be overridden to provide the original command representation when it would otherwise + * be changed by merging with the application InputDefinition. + * + * This method is not part of public API and should not be used directly. + * + * @return InputDefinition An InputDefinition instance + */ + public function getNativeDefinition() + { + return $this->getDefinition(); + } + + /** + * Adds an argument. + * + * @param int|null $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL + * @param string|string[]|null $default The default value (for InputArgument::OPTIONAL mode only) + * + * @throws InvalidArgumentException When argument mode is not valid + * + * @return $this + */ + public function addArgument(string $name, int $mode = null, string $description = '', $default = null) + { + $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); + + return $this; + } + + /** + * Adds an option. + * + * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param int|null $mode The option mode: One of the InputOption::VALUE_* constants + * @param string|string[]|int|bool|null $default The default value (must be null for InputOption::VALUE_NONE) + * + * @throws InvalidArgumentException If option mode is invalid or incompatible + * + * @return $this + */ + public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) + { + $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); + + return $this; + } + + /** + * Sets the name of the command. + * + * This method can set both the namespace and the name if + * you separate them by a colon (:) + * + * $command->setName('foo:bar'); + * + * @return $this + * + * @throws InvalidArgumentException When the name is invalid + */ + public function setName(string $name) + { + $this->validateName($name); + + $this->name = $name; + + return $this; + } + + /** + * Sets the process title of the command. + * + * This feature should be used only when creating a long process command, + * like a daemon. + * + * PHP 5.5+ or the proctitle PECL library is required + * + * @return $this + */ + public function setProcessTitle(string $title) + { + $this->processTitle = $title; + + return $this; + } + + /** + * Returns the command name. + * + * @return string|null + */ + public function getName() + { + return $this->name; + } + + /** + * @param bool $hidden Whether or not the command should be hidden from the list of commands + * The default value will be true in Symfony 6.0 + * + * @return Command The current instance + * + * @final since Symfony 5.1 + */ + public function setHidden(bool $hidden /*= true*/) + { + $this->hidden = $hidden; + + return $this; + } + + /** + * @return bool whether the command should be publicly shown or not + */ + public function isHidden() + { + return $this->hidden; + } + + /** + * Sets the description for the command. + * + * @return $this + */ + public function setDescription(string $description) + { + $this->description = $description; + + return $this; + } + + /** + * Returns the description for the command. + * + * @return string The description for the command + */ + public function getDescription() + { + return $this->description; + } + + /** + * Sets the help for the command. + * + * @return $this + */ + public function setHelp(string $help) + { + $this->help = $help; + + return $this; + } + + /** + * Returns the help for the command. + * + * @return string The help for the command + */ + public function getHelp() + { + return $this->help; + } + + /** + * Returns the processed help for the command replacing the %command.name% and + * %command.full_name% patterns with the real values dynamically. + * + * @return string The processed help for the command + */ + public function getProcessedHelp() + { + $name = $this->name; + $isSingleCommand = $this->application && $this->application->isSingleCommand(); + + $placeholders = [ + '%command.name%', + '%command.full_name%', + ]; + $replacements = [ + $name, + $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'].' '.$name, + ]; + + return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription()); + } + + /** + * Sets the aliases for the command. + * + * @param string[] $aliases An array of aliases for the command + * + * @return $this + * + * @throws InvalidArgumentException When an alias is invalid + */ + public function setAliases(iterable $aliases) + { + foreach ($aliases as $alias) { + $this->validateName($alias); + } + + $this->aliases = $aliases; + + return $this; + } + + /** + * Returns the aliases for the command. + * + * @return array An array of aliases for the command + */ + public function getAliases() + { + return $this->aliases; + } + + /** + * Returns the synopsis for the command. + * + * @param bool $short Whether to show the short version of the synopsis (with options folded) or not + * + * @return string The synopsis + */ + public function getSynopsis(bool $short = false) + { + $key = $short ? 'short' : 'long'; + + if (!isset($this->synopsis[$key])) { + $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); + } + + return $this->synopsis[$key]; + } + + /** + * Add a command usage example, it'll be prefixed with the command name. + * + * @return $this + */ + public function addUsage(string $usage) + { + if (0 !== strpos($usage, $this->name)) { + $usage = sprintf('%s %s', $this->name, $usage); + } + + $this->usages[] = $usage; + + return $this; + } + + /** + * Returns alternative usages of the command. + * + * @return array + */ + public function getUsages() + { + return $this->usages; + } + + /** + * Gets a helper instance by name. + * + * @return mixed The helper value + * + * @throws LogicException if no HelperSet is defined + * @throws InvalidArgumentException if the helper is not defined + */ + public function getHelper(string $name) + { + if (null === $this->helperSet) { + throw new LogicException(sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name)); + } + + return $this->helperSet->get($name); + } + + /** + * Validates a command name. + * + * It must be non-empty and parts can optionally be separated by ":". + * + * @throws InvalidArgumentException When the name is invalid + */ + private function validateName(string $name) + { + if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { + throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); + } + } +} diff --git a/vendor/symfony/console/Command/HelpCommand.php b/vendor/symfony/console/Command/HelpCommand.php new file mode 100644 index 0000000..b32be4c --- /dev/null +++ b/vendor/symfony/console/Command/HelpCommand.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Command; + +use Symfony\Component\Console\Helper\DescriptorHelper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * HelpCommand displays the help for a given command. + * + * @author Fabien Potencier + */ +class HelpCommand extends Command +{ + private $command; + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->ignoreValidationErrors(); + + $this + ->setName('help') + ->setDefinition([ + new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), + new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), + new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), + ]) + ->setDescription('Displays help for a command') + ->setHelp(<<<'EOF' +The %command.name% command displays help for a given command: + + php %command.full_name% list + +You can also output the help in other formats by using the --format option: + + php %command.full_name% --format=xml list + +To display the list of available commands, please use the list command. +EOF + ) + ; + } + + public function setCommand(Command $command) + { + $this->command = $command; + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + if (null === $this->command) { + $this->command = $this->getApplication()->find($input->getArgument('command_name')); + } + + $helper = new DescriptorHelper(); + $helper->describe($output, $this->command, [ + 'format' => $input->getOption('format'), + 'raw_text' => $input->getOption('raw'), + ]); + + $this->command = null; + + return 0; + } +} diff --git a/vendor/symfony/console/Command/ListCommand.php b/vendor/symfony/console/Command/ListCommand.php new file mode 100644 index 0000000..8af9526 --- /dev/null +++ b/vendor/symfony/console/Command/ListCommand.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Command; + +use Symfony\Component\Console\Helper\DescriptorHelper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * ListCommand displays the list of all available commands for the application. + * + * @author Fabien Potencier + */ +class ListCommand extends Command +{ + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setName('list') + ->setDefinition($this->createDefinition()) + ->setDescription('Lists commands') + ->setHelp(<<<'EOF' +The %command.name% command lists all commands: + + php %command.full_name% + +You can also display the commands for a specific namespace: + + php %command.full_name% test + +You can also output the information in other formats by using the --format option: + + php %command.full_name% --format=xml + +It's also possible to get raw list of commands (useful for embedding command runner): + + php %command.full_name% --raw +EOF + ) + ; + } + + /** + * {@inheritdoc} + */ + public function getNativeDefinition() + { + return $this->createDefinition(); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $helper = new DescriptorHelper(); + $helper->describe($output, $this->getApplication(), [ + 'format' => $input->getOption('format'), + 'raw_text' => $input->getOption('raw'), + 'namespace' => $input->getArgument('namespace'), + ]); + + return 0; + } + + private function createDefinition(): InputDefinition + { + return new InputDefinition([ + new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), + new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), + new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), + ]); + } +} diff --git a/vendor/symfony/console/Command/LockableTrait.php b/vendor/symfony/console/Command/LockableTrait.php new file mode 100644 index 0000000..60cfe36 --- /dev/null +++ b/vendor/symfony/console/Command/LockableTrait.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Command; + +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Lock\Lock; +use Symfony\Component\Lock\LockFactory; +use Symfony\Component\Lock\Store\FlockStore; +use Symfony\Component\Lock\Store\SemaphoreStore; + +/** + * Basic lock feature for commands. + * + * @author Geoffrey Brier + */ +trait LockableTrait +{ + /** @var Lock */ + private $lock; + + /** + * Locks a command. + */ + private function lock(string $name = null, bool $blocking = false): bool + { + if (!class_exists(SemaphoreStore::class)) { + throw new LogicException('To enable the locking feature you must install the symfony/lock component.'); + } + + if (null !== $this->lock) { + throw new LogicException('A lock is already in place.'); + } + + if (SemaphoreStore::isSupported()) { + $store = new SemaphoreStore(); + } else { + $store = new FlockStore(); + } + + $this->lock = (new LockFactory($store))->createLock($name ?: $this->getName()); + if (!$this->lock->acquire($blocking)) { + $this->lock = null; + + return false; + } + + return true; + } + + /** + * Releases the command lock if there is one. + */ + private function release() + { + if ($this->lock) { + $this->lock->release(); + $this->lock = null; + } + } +} diff --git a/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php b/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php new file mode 100644 index 0000000..d4f44e8 --- /dev/null +++ b/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\CommandLoader; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\CommandNotFoundException; + +/** + * @author Robin Chalas + */ +interface CommandLoaderInterface +{ + /** + * Loads a command. + * + * @return Command + * + * @throws CommandNotFoundException + */ + public function get(string $name); + + /** + * Checks if a command exists. + * + * @return bool + */ + public function has(string $name); + + /** + * @return string[] All registered command names + */ + public function getNames(); +} diff --git a/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php b/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php new file mode 100644 index 0000000..ddccb3d --- /dev/null +++ b/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\CommandLoader; + +use Psr\Container\ContainerInterface; +use Symfony\Component\Console\Exception\CommandNotFoundException; + +/** + * Loads commands from a PSR-11 container. + * + * @author Robin Chalas + */ +class ContainerCommandLoader implements CommandLoaderInterface +{ + private $container; + private $commandMap; + + /** + * @param array $commandMap An array with command names as keys and service ids as values + */ + public function __construct(ContainerInterface $container, array $commandMap) + { + $this->container = $container; + $this->commandMap = $commandMap; + } + + /** + * {@inheritdoc} + */ + public function get(string $name) + { + if (!$this->has($name)) { + throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); + } + + return $this->container->get($this->commandMap[$name]); + } + + /** + * {@inheritdoc} + */ + public function has(string $name) + { + return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]); + } + + /** + * {@inheritdoc} + */ + public function getNames() + { + return array_keys($this->commandMap); + } +} diff --git a/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php b/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php new file mode 100644 index 0000000..7e2db34 --- /dev/null +++ b/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\CommandLoader; + +use Symfony\Component\Console\Exception\CommandNotFoundException; + +/** + * A simple command loader using factories to instantiate commands lazily. + * + * @author Maxime Steinhausser + */ +class FactoryCommandLoader implements CommandLoaderInterface +{ + private $factories; + + /** + * @param callable[] $factories Indexed by command names + */ + public function __construct(array $factories) + { + $this->factories = $factories; + } + + /** + * {@inheritdoc} + */ + public function has(string $name) + { + return isset($this->factories[$name]); + } + + /** + * {@inheritdoc} + */ + public function get(string $name) + { + if (!isset($this->factories[$name])) { + throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); + } + + $factory = $this->factories[$name]; + + return $factory(); + } + + /** + * {@inheritdoc} + */ + public function getNames() + { + return array_keys($this->factories); + } +} diff --git a/vendor/symfony/console/ConsoleEvents.php b/vendor/symfony/console/ConsoleEvents.php new file mode 100644 index 0000000..4975643 --- /dev/null +++ b/vendor/symfony/console/ConsoleEvents.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console; + +/** + * Contains all events dispatched by an Application. + * + * @author Francesco Levorato + */ +final class ConsoleEvents +{ + /** + * The COMMAND event allows you to attach listeners before any command is + * executed by the console. It also allows you to modify the command, input and output + * before they are handled to the command. + * + * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent") + */ + const COMMAND = 'console.command'; + + /** + * The TERMINATE event allows you to attach listeners after a command is + * executed by the console. + * + * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent") + */ + const TERMINATE = 'console.terminate'; + + /** + * The ERROR event occurs when an uncaught exception or error appears. + * + * This event allows you to deal with the exception/error or + * to modify the thrown exception. + * + * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent") + */ + const ERROR = 'console.error'; +} diff --git a/vendor/symfony/console/Cursor.php b/vendor/symfony/console/Cursor.php new file mode 100644 index 0000000..2da899b --- /dev/null +++ b/vendor/symfony/console/Cursor.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console; + +use Symfony\Component\Console\Output\OutputInterface; + +/** + * @author Pierre du Plessis + */ +final class Cursor +{ + private $output; + private $input; + + public function __construct(OutputInterface $output, $input = null) + { + $this->output = $output; + $this->input = $input ?? (\defined('STDIN') ? STDIN : fopen('php://input', 'r+')); + } + + public function moveUp(int $lines = 1): self + { + $this->output->write(sprintf("\x1b[%dA", $lines)); + + return $this; + } + + public function moveDown(int $lines = 1): self + { + $this->output->write(sprintf("\x1b[%dB", $lines)); + + return $this; + } + + public function moveRight(int $columns = 1): self + { + $this->output->write(sprintf("\x1b[%dC", $columns)); + + return $this; + } + + public function moveLeft(int $columns = 1): self + { + $this->output->write(sprintf("\x1b[%dD", $columns)); + + return $this; + } + + public function moveToColumn(int $column): self + { + $this->output->write(sprintf("\x1b[%dG", $column)); + + return $this; + } + + public function moveToPosition(int $column, int $row): self + { + $this->output->write(sprintf("\x1b[%d;%dH", $row + 1, $column)); + + return $this; + } + + public function savePosition(): self + { + $this->output->write("\x1b7"); + + return $this; + } + + public function restorePosition(): self + { + $this->output->write("\x1b8"); + + return $this; + } + + public function hide(): self + { + $this->output->write("\x1b[?25l"); + + return $this; + } + + public function show(): self + { + $this->output->write("\x1b[?25h\x1b[?0c"); + + return $this; + } + + /** + * Clears all the output from the current line. + */ + public function clearLine(): self + { + $this->output->write("\x1b[2K"); + + return $this; + } + + /** + * Clears all the output from the current line after the current position. + */ + public function clearLineAfter(): self + { + $this->output->write("\x1b[K"); + + return $this; + } + + /** + * Clears all the output from the cursors' current position to the end of the screen. + */ + public function clearOutput(): self + { + $this->output->write("\x1b[0J"); + + return $this; + } + + /** + * Clears the entire screen. + */ + public function clearScreen(): self + { + $this->output->write("\x1b[2J"); + + return $this; + } + + /** + * Returns the current cursor position as x,y coordinates. + */ + public function getCurrentPosition(): array + { + static $isTtySupported; + + if (null === $isTtySupported && \function_exists('proc_open')) { + $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + } + + if (!$isTtySupported) { + return [1, 1]; + } + + $sttyMode = shell_exec('stty -g'); + shell_exec('stty -icanon -echo'); + + @fwrite($this->input, "\033[6n"); + + $code = trim(fread($this->input, 1024)); + + shell_exec(sprintf('stty %s', $sttyMode)); + + sscanf($code, "\033[%d;%dR", $row, $col); + + return [$col, $row]; + } +} diff --git a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php new file mode 100644 index 0000000..f4cd387 --- /dev/null +++ b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\DependencyInjection; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\CommandLoader\ContainerCommandLoader; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\DependencyInjection\TypedReference; + +/** + * Registers console commands. + * + * @author Grégoire Pineau + */ +class AddConsoleCommandPass implements CompilerPassInterface +{ + private $commandLoaderServiceId; + private $commandTag; + private $noPreloadTag; + + public function __construct(string $commandLoaderServiceId = 'console.command_loader', string $commandTag = 'console.command', string $noPreloadTag = 'container.no_preload') + { + $this->commandLoaderServiceId = $commandLoaderServiceId; + $this->commandTag = $commandTag; + $this->noPreloadTag = $noPreloadTag; + } + + public function process(ContainerBuilder $container) + { + $commandServices = $container->findTaggedServiceIds($this->commandTag, true); + $lazyCommandMap = []; + $lazyCommandRefs = []; + $serviceIds = []; + + foreach ($commandServices as $id => $tags) { + $definition = $container->getDefinition($id); + $definition->addTag($this->noPreloadTag); + $class = $container->getParameterBag()->resolveValue($definition->getClass()); + + if (isset($tags[0]['command'])) { + $commandName = $tags[0]['command']; + } else { + if (!$r = $container->getReflectionClass($class)) { + throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + if (!$r->isSubclassOf(Command::class)) { + throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); + } + $commandName = $class::getDefaultName(); + } + + if (null === $commandName) { + if (!$definition->isPublic() || $definition->isPrivate()) { + $commandId = 'console.command.public_alias.'.$id; + $container->setAlias($commandId, $id)->setPublic(true); + $id = $commandId; + } + $serviceIds[] = $id; + + continue; + } + + unset($tags[0]); + $lazyCommandMap[$commandName] = $id; + $lazyCommandRefs[$id] = new TypedReference($id, $class); + $aliases = []; + + foreach ($tags as $tag) { + if (isset($tag['command'])) { + $aliases[] = $tag['command']; + $lazyCommandMap[$tag['command']] = $id; + } + } + + $definition->addMethodCall('setName', [$commandName]); + + if ($aliases) { + $definition->addMethodCall('setAliases', [$aliases]); + } + } + + $container + ->register($this->commandLoaderServiceId, ContainerCommandLoader::class) + ->setPublic(true) + ->addTag($this->noPreloadTag) + ->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]); + + $container->setParameter('console.command.ids', $serviceIds); + } +} diff --git a/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/symfony/console/Descriptor/ApplicationDescription.php new file mode 100644 index 0000000..d361b48 --- /dev/null +++ b/vendor/symfony/console/Descriptor/ApplicationDescription.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\CommandNotFoundException; + +/** + * @author Jean-François Simon + * + * @internal + */ +class ApplicationDescription +{ + const GLOBAL_NAMESPACE = '_global'; + + private $application; + private $namespace; + private $showHidden; + + /** + * @var array + */ + private $namespaces; + + /** + * @var Command[] + */ + private $commands; + + /** + * @var Command[] + */ + private $aliases; + + public function __construct(Application $application, string $namespace = null, bool $showHidden = false) + { + $this->application = $application; + $this->namespace = $namespace; + $this->showHidden = $showHidden; + } + + public function getNamespaces(): array + { + if (null === $this->namespaces) { + $this->inspectApplication(); + } + + return $this->namespaces; + } + + /** + * @return Command[] + */ + public function getCommands(): array + { + if (null === $this->commands) { + $this->inspectApplication(); + } + + return $this->commands; + } + + /** + * @throws CommandNotFoundException + */ + public function getCommand(string $name): Command + { + if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { + throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name)); + } + + return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name]; + } + + private function inspectApplication() + { + $this->commands = []; + $this->namespaces = []; + + $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null); + foreach ($this->sortCommands($all) as $namespace => $commands) { + $names = []; + + /** @var Command $command */ + foreach ($commands as $name => $command) { + if (!$command->getName() || (!$this->showHidden && $command->isHidden())) { + continue; + } + + if ($command->getName() === $name) { + $this->commands[$name] = $command; + } else { + $this->aliases[$name] = $command; + } + + $names[] = $name; + } + + $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; + } + } + + private function sortCommands(array $commands): array + { + $namespacedCommands = []; + $globalCommands = []; + $sortedCommands = []; + foreach ($commands as $name => $command) { + $key = $this->application->extractNamespace($name, 1); + if (\in_array($key, ['', self::GLOBAL_NAMESPACE], true)) { + $globalCommands[$name] = $command; + } else { + $namespacedCommands[$key][$name] = $command; + } + } + + if ($globalCommands) { + ksort($globalCommands); + $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands; + } + + if ($namespacedCommands) { + ksort($namespacedCommands); + foreach ($namespacedCommands as $key => $commandsSet) { + ksort($commandsSet); + $sortedCommands[$key] = $commandsSet; + } + } + + return $sortedCommands; + } +} diff --git a/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/symfony/console/Descriptor/Descriptor.php new file mode 100644 index 0000000..2834cd0 --- /dev/null +++ b/vendor/symfony/console/Descriptor/Descriptor.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * @author Jean-François Simon + * + * @internal + */ +abstract class Descriptor implements DescriptorInterface +{ + /** + * @var OutputInterface + */ + protected $output; + + /** + * {@inheritdoc} + */ + public function describe(OutputInterface $output, $object, array $options = []) + { + $this->output = $output; + + switch (true) { + case $object instanceof InputArgument: + $this->describeInputArgument($object, $options); + break; + case $object instanceof InputOption: + $this->describeInputOption($object, $options); + break; + case $object instanceof InputDefinition: + $this->describeInputDefinition($object, $options); + break; + case $object instanceof Command: + $this->describeCommand($object, $options); + break; + case $object instanceof Application: + $this->describeApplication($object, $options); + break; + default: + throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_debug_type($object))); + } + } + + /** + * Writes content to output. + */ + protected function write(string $content, bool $decorated = false) + { + $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); + } + + /** + * Describes an InputArgument instance. + * + * @return string|mixed + */ + abstract protected function describeInputArgument(InputArgument $argument, array $options = []); + + /** + * Describes an InputOption instance. + * + * @return string|mixed + */ + abstract protected function describeInputOption(InputOption $option, array $options = []); + + /** + * Describes an InputDefinition instance. + * + * @return string|mixed + */ + abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []); + + /** + * Describes a Command instance. + * + * @return string|mixed + */ + abstract protected function describeCommand(Command $command, array $options = []); + + /** + * Describes an Application instance. + * + * @return string|mixed + */ + abstract protected function describeApplication(Application $application, array $options = []); +} diff --git a/vendor/symfony/console/Descriptor/DescriptorInterface.php b/vendor/symfony/console/Descriptor/DescriptorInterface.php new file mode 100644 index 0000000..e3184a6 --- /dev/null +++ b/vendor/symfony/console/Descriptor/DescriptorInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Descriptor interface. + * + * @author Jean-François Simon + */ +interface DescriptorInterface +{ + /** + * Describes an object if supported. + * + * @param object $object + */ + public function describe(OutputInterface $output, $object, array $options = []); +} diff --git a/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/symfony/console/Descriptor/JsonDescriptor.php new file mode 100644 index 0000000..131fef1 --- /dev/null +++ b/vendor/symfony/console/Descriptor/JsonDescriptor.php @@ -0,0 +1,156 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputOption; + +/** + * JSON descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class JsonDescriptor extends Descriptor +{ + /** + * {@inheritdoc} + */ + protected function describeInputArgument(InputArgument $argument, array $options = []) + { + $this->writeData($this->getInputArgumentData($argument), $options); + } + + /** + * {@inheritdoc} + */ + protected function describeInputOption(InputOption $option, array $options = []) + { + $this->writeData($this->getInputOptionData($option), $options); + } + + /** + * {@inheritdoc} + */ + protected function describeInputDefinition(InputDefinition $definition, array $options = []) + { + $this->writeData($this->getInputDefinitionData($definition), $options); + } + + /** + * {@inheritdoc} + */ + protected function describeCommand(Command $command, array $options = []) + { + $this->writeData($this->getCommandData($command), $options); + } + + /** + * {@inheritdoc} + */ + protected function describeApplication(Application $application, array $options = []) + { + $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; + $description = new ApplicationDescription($application, $describedNamespace, true); + $commands = []; + + foreach ($description->getCommands() as $command) { + $commands[] = $this->getCommandData($command); + } + + $data = []; + if ('UNKNOWN' !== $application->getName()) { + $data['application']['name'] = $application->getName(); + if ('UNKNOWN' !== $application->getVersion()) { + $data['application']['version'] = $application->getVersion(); + } + } + + $data['commands'] = $commands; + + if ($describedNamespace) { + $data['namespace'] = $describedNamespace; + } else { + $data['namespaces'] = array_values($description->getNamespaces()); + } + + $this->writeData($data, $options); + } + + /** + * Writes data as json. + */ + private function writeData(array $data, array $options) + { + $flags = isset($options['json_encoding']) ? $options['json_encoding'] : 0; + + $this->write(json_encode($data, $flags)); + } + + private function getInputArgumentData(InputArgument $argument): array + { + return [ + 'name' => $argument->getName(), + 'is_required' => $argument->isRequired(), + 'is_array' => $argument->isArray(), + 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()), + 'default' => INF === $argument->getDefault() ? 'INF' : $argument->getDefault(), + ]; + } + + private function getInputOptionData(InputOption $option): array + { + return [ + 'name' => '--'.$option->getName(), + 'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '', + 'accept_value' => $option->acceptValue(), + 'is_value_required' => $option->isValueRequired(), + 'is_multiple' => $option->isArray(), + 'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()), + 'default' => INF === $option->getDefault() ? 'INF' : $option->getDefault(), + ]; + } + + private function getInputDefinitionData(InputDefinition $definition): array + { + $inputArguments = []; + foreach ($definition->getArguments() as $name => $argument) { + $inputArguments[$name] = $this->getInputArgumentData($argument); + } + + $inputOptions = []; + foreach ($definition->getOptions() as $name => $option) { + $inputOptions[$name] = $this->getInputOptionData($option); + } + + return ['arguments' => $inputArguments, 'options' => $inputOptions]; + } + + private function getCommandData(Command $command): array + { + $command->getSynopsis(); + $command->mergeApplicationDefinition(false); + + return [ + 'name' => $command->getName(), + 'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), + 'description' => $command->getDescription(), + 'help' => $command->getProcessedHelp(), + 'definition' => $this->getInputDefinitionData($command->getNativeDefinition()), + 'hidden' => $command->isHidden(), + ]; + } +} diff --git a/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php new file mode 100644 index 0000000..8b3e182 --- /dev/null +++ b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\Helper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Markdown descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class MarkdownDescriptor extends Descriptor +{ + /** + * {@inheritdoc} + */ + public function describe(OutputInterface $output, $object, array $options = []) + { + $decorated = $output->isDecorated(); + $output->setDecorated(false); + + parent::describe($output, $object, $options); + + $output->setDecorated($decorated); + } + + /** + * {@inheritdoc} + */ + protected function write(string $content, bool $decorated = true) + { + parent::write($content, $decorated); + } + + /** + * {@inheritdoc} + */ + protected function describeInputArgument(InputArgument $argument, array $options = []) + { + $this->write( + '#### `'.($argument->getName() ?: '')."`\n\n" + .($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '') + .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n" + .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n" + .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`' + ); + } + + /** + * {@inheritdoc} + */ + protected function describeInputOption(InputOption $option, array $options = []) + { + $name = '--'.$option->getName(); + if ($option->getShortcut()) { + $name .= '|-'.str_replace('|', '|-', $option->getShortcut()).''; + } + + $this->write( + '#### `'.$name.'`'."\n\n" + .($option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $option->getDescription())."\n\n" : '') + .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n" + .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n" + .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n" + .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`' + ); + } + + /** + * {@inheritdoc} + */ + protected function describeInputDefinition(InputDefinition $definition, array $options = []) + { + if ($showArguments = \count($definition->getArguments()) > 0) { + $this->write('### Arguments'); + foreach ($definition->getArguments() as $argument) { + $this->write("\n\n"); + if (null !== $describeInputArgument = $this->describeInputArgument($argument)) { + $this->write($describeInputArgument); + } + } + } + + if (\count($definition->getOptions()) > 0) { + if ($showArguments) { + $this->write("\n\n"); + } + + $this->write('### Options'); + foreach ($definition->getOptions() as $option) { + $this->write("\n\n"); + if (null !== $describeInputOption = $this->describeInputOption($option)) { + $this->write($describeInputOption); + } + } + } + } + + /** + * {@inheritdoc} + */ + protected function describeCommand(Command $command, array $options = []) + { + $command->getSynopsis(); + $command->mergeApplicationDefinition(false); + + $this->write( + '`'.$command->getName()."`\n" + .str_repeat('-', Helper::strlen($command->getName()) + 2)."\n\n" + .($command->getDescription() ? $command->getDescription()."\n\n" : '') + .'### Usage'."\n\n" + .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) { + return $carry.'* `'.$usage.'`'."\n"; + }) + ); + + if ($help = $command->getProcessedHelp()) { + $this->write("\n"); + $this->write($help); + } + + if ($command->getNativeDefinition()) { + $this->write("\n\n"); + $this->describeInputDefinition($command->getNativeDefinition()); + } + } + + /** + * {@inheritdoc} + */ + protected function describeApplication(Application $application, array $options = []) + { + $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; + $description = new ApplicationDescription($application, $describedNamespace); + $title = $this->getApplicationTitle($application); + + $this->write($title."\n".str_repeat('=', Helper::strlen($title))); + + foreach ($description->getNamespaces() as $namespace) { + if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { + $this->write("\n\n"); + $this->write('**'.$namespace['id'].':**'); + } + + $this->write("\n\n"); + $this->write(implode("\n", array_map(function ($commandName) use ($description) { + return sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())); + }, $namespace['commands']))); + } + + foreach ($description->getCommands() as $command) { + $this->write("\n\n"); + if (null !== $describeCommand = $this->describeCommand($command)) { + $this->write($describeCommand); + } + } + } + + private function getApplicationTitle(Application $application): string + { + if ('UNKNOWN' !== $application->getName()) { + if ('UNKNOWN' !== $application->getVersion()) { + return sprintf('%s %s', $application->getName(), $application->getVersion()); + } + + return $application->getName(); + } + + return 'Console Tool'; + } +} diff --git a/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/symfony/console/Descriptor/TextDescriptor.php new file mode 100644 index 0000000..ef6d8af --- /dev/null +++ b/vendor/symfony/console/Descriptor/TextDescriptor.php @@ -0,0 +1,342 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Helper\Helper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputOption; + +/** + * Text descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class TextDescriptor extends Descriptor +{ + /** + * {@inheritdoc} + */ + protected function describeInputArgument(InputArgument $argument, array $options = []) + { + if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { + $default = sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); + } else { + $default = ''; + } + + $totalWidth = isset($options['total_width']) ? $options['total_width'] : Helper::strlen($argument->getName()); + $spacingWidth = $totalWidth - \strlen($argument->getName()); + + $this->writeText(sprintf(' %s %s%s%s', + $argument->getName(), + str_repeat(' ', $spacingWidth), + // + 4 = 2 spaces before , 2 spaces after + preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $argument->getDescription()), + $default + ), $options); + } + + /** + * {@inheritdoc} + */ + protected function describeInputOption(InputOption $option, array $options = []) + { + if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { + $default = sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); + } else { + $default = ''; + } + + $value = ''; + if ($option->acceptValue()) { + $value = '='.strtoupper($option->getName()); + + if ($option->isValueOptional()) { + $value = '['.$value.']'; + } + } + + $totalWidth = isset($options['total_width']) ? $options['total_width'] : $this->calculateTotalWidthForOptions([$option]); + $synopsis = sprintf('%s%s', + $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : ' ', + sprintf('--%s%s', $option->getName(), $value) + ); + + $spacingWidth = $totalWidth - Helper::strlen($synopsis); + + $this->writeText(sprintf(' %s %s%s%s%s', + $synopsis, + str_repeat(' ', $spacingWidth), + // + 4 = 2 spaces before , 2 spaces after + preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $option->getDescription()), + $default, + $option->isArray() ? ' (multiple values allowed)' : '' + ), $options); + } + + /** + * {@inheritdoc} + */ + protected function describeInputDefinition(InputDefinition $definition, array $options = []) + { + $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); + foreach ($definition->getArguments() as $argument) { + $totalWidth = max($totalWidth, Helper::strlen($argument->getName())); + } + + if ($definition->getArguments()) { + $this->writeText('Arguments:', $options); + $this->writeText("\n"); + foreach ($definition->getArguments() as $argument) { + $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth])); + $this->writeText("\n"); + } + } + + if ($definition->getArguments() && $definition->getOptions()) { + $this->writeText("\n"); + } + + if ($definition->getOptions()) { + $laterOptions = []; + + $this->writeText('Options:', $options); + foreach ($definition->getOptions() as $option) { + if (\strlen($option->getShortcut()) > 1) { + $laterOptions[] = $option; + continue; + } + $this->writeText("\n"); + $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); + } + foreach ($laterOptions as $option) { + $this->writeText("\n"); + $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); + } + } + } + + /** + * {@inheritdoc} + */ + protected function describeCommand(Command $command, array $options = []) + { + $command->getSynopsis(true); + $command->getSynopsis(false); + $command->mergeApplicationDefinition(false); + + if ($description = $command->getDescription()) { + $this->writeText('Description:', $options); + $this->writeText("\n"); + $this->writeText(' '.$description); + $this->writeText("\n\n"); + } + + $this->writeText('Usage:', $options); + foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) { + $this->writeText("\n"); + $this->writeText(' '.OutputFormatter::escape($usage), $options); + } + $this->writeText("\n"); + + $definition = $command->getNativeDefinition(); + if ($definition->getOptions() || $definition->getArguments()) { + $this->writeText("\n"); + $this->describeInputDefinition($definition, $options); + $this->writeText("\n"); + } + + $help = $command->getProcessedHelp(); + if ($help && $help !== $description) { + $this->writeText("\n"); + $this->writeText('Help:', $options); + $this->writeText("\n"); + $this->writeText(' '.str_replace("\n", "\n ", $help), $options); + $this->writeText("\n"); + } + } + + /** + * {@inheritdoc} + */ + protected function describeApplication(Application $application, array $options = []) + { + $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; + $description = new ApplicationDescription($application, $describedNamespace); + + if (isset($options['raw_text']) && $options['raw_text']) { + $width = $this->getColumnWidth($description->getCommands()); + + foreach ($description->getCommands() as $command) { + $this->writeText(sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options); + $this->writeText("\n"); + } + } else { + if ('' != $help = $application->getHelp()) { + $this->writeText("$help\n\n", $options); + } + + $this->writeText("Usage:\n", $options); + $this->writeText(" command [options] [arguments]\n\n", $options); + + $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options); + + $this->writeText("\n"); + $this->writeText("\n"); + + $commands = $description->getCommands(); + $namespaces = $description->getNamespaces(); + if ($describedNamespace && $namespaces) { + // make sure all alias commands are included when describing a specific namespace + $describedNamespaceInfo = reset($namespaces); + foreach ($describedNamespaceInfo['commands'] as $name) { + $commands[$name] = $description->getCommand($name); + } + } + + // calculate max. width based on available commands per namespace + $width = $this->getColumnWidth(array_merge(...array_values(array_map(function ($namespace) use ($commands) { + return array_intersect($namespace['commands'], array_keys($commands)); + }, $namespaces)))); + + if ($describedNamespace) { + $this->writeText(sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); + } else { + $this->writeText('Available commands:', $options); + } + + foreach ($namespaces as $namespace) { + $namespace['commands'] = array_filter($namespace['commands'], function ($name) use ($commands) { + return isset($commands[$name]); + }); + + if (!$namespace['commands']) { + continue; + } + + if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { + $this->writeText("\n"); + $this->writeText(' '.$namespace['id'].'', $options); + } + + foreach ($namespace['commands'] as $name) { + $this->writeText("\n"); + $spacingWidth = $width - Helper::strlen($name); + $command = $commands[$name]; + $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : ''; + $this->writeText(sprintf(' %s%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options); + } + } + + $this->writeText("\n"); + } + } + + /** + * {@inheritdoc} + */ + private function writeText(string $content, array $options = []) + { + $this->write( + isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content, + isset($options['raw_output']) ? !$options['raw_output'] : true + ); + } + + /** + * Formats command aliases to show them in the command description. + */ + private function getCommandAliasesText(Command $command): string + { + $text = ''; + $aliases = $command->getAliases(); + + if ($aliases) { + $text = '['.implode('|', $aliases).'] '; + } + + return $text; + } + + /** + * Formats input option/argument default value. + * + * @param mixed $default + */ + private function formatDefaultValue($default): string + { + if (INF === $default) { + return 'INF'; + } + + if (\is_string($default)) { + $default = OutputFormatter::escape($default); + } elseif (\is_array($default)) { + foreach ($default as $key => $value) { + if (\is_string($value)) { + $default[$key] = OutputFormatter::escape($value); + } + } + } + + return str_replace('\\\\', '\\', json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + } + + /** + * @param (Command|string)[] $commands + */ + private function getColumnWidth(array $commands): int + { + $widths = []; + + foreach ($commands as $command) { + if ($command instanceof Command) { + $widths[] = Helper::strlen($command->getName()); + foreach ($command->getAliases() as $alias) { + $widths[] = Helper::strlen($alias); + } + } else { + $widths[] = Helper::strlen($command); + } + } + + return $widths ? max($widths) + 2 : 0; + } + + /** + * @param InputOption[] $options + */ + private function calculateTotalWidthForOptions(array $options): int + { + $totalWidth = 0; + foreach ($options as $option) { + // "-" + shortcut + ", --" + name + $nameLength = 1 + max(Helper::strlen($option->getShortcut()), 1) + 4 + Helper::strlen($option->getName()); + + if ($option->acceptValue()) { + $valueLength = 1 + Helper::strlen($option->getName()); // = + value + $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ] + + $nameLength += $valueLength; + } + $totalWidth = max($totalWidth, $nameLength); + } + + return $totalWidth; + } +} diff --git a/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/symfony/console/Descriptor/XmlDescriptor.php new file mode 100644 index 0000000..3d5dce1 --- /dev/null +++ b/vendor/symfony/console/Descriptor/XmlDescriptor.php @@ -0,0 +1,231 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputOption; + +/** + * XML descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class XmlDescriptor extends Descriptor +{ + public function getInputDefinitionDocument(InputDefinition $definition): \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($definitionXML = $dom->createElement('definition')); + + $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); + foreach ($definition->getArguments() as $argument) { + $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument)); + } + + $definitionXML->appendChild($optionsXML = $dom->createElement('options')); + foreach ($definition->getOptions() as $option) { + $this->appendDocument($optionsXML, $this->getInputOptionDocument($option)); + } + + return $dom; + } + + public function getCommandDocument(Command $command): \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($commandXML = $dom->createElement('command')); + + $command->getSynopsis(); + $command->mergeApplicationDefinition(false); + + $commandXML->setAttribute('id', $command->getName()); + $commandXML->setAttribute('name', $command->getName()); + $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0); + + $commandXML->appendChild($usagesXML = $dom->createElement('usages')); + + foreach (array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) { + $usagesXML->appendChild($dom->createElement('usage', $usage)); + } + + $commandXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription()))); + + $commandXML->appendChild($helpXML = $dom->createElement('help')); + $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp()))); + + $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition()); + $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0)); + + return $dom; + } + + public function getApplicationDocument(Application $application, string $namespace = null): \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($rootXml = $dom->createElement('symfony')); + + if ('UNKNOWN' !== $application->getName()) { + $rootXml->setAttribute('name', $application->getName()); + if ('UNKNOWN' !== $application->getVersion()) { + $rootXml->setAttribute('version', $application->getVersion()); + } + } + + $rootXml->appendChild($commandsXML = $dom->createElement('commands')); + + $description = new ApplicationDescription($application, $namespace, true); + + if ($namespace) { + $commandsXML->setAttribute('namespace', $namespace); + } + + foreach ($description->getCommands() as $command) { + $this->appendDocument($commandsXML, $this->getCommandDocument($command)); + } + + if (!$namespace) { + $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces')); + + foreach ($description->getNamespaces() as $namespaceDescription) { + $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace')); + $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']); + + foreach ($namespaceDescription['commands'] as $name) { + $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command')); + $commandXML->appendChild($dom->createTextNode($name)); + } + } + } + + return $dom; + } + + /** + * {@inheritdoc} + */ + protected function describeInputArgument(InputArgument $argument, array $options = []) + { + $this->writeDocument($this->getInputArgumentDocument($argument)); + } + + /** + * {@inheritdoc} + */ + protected function describeInputOption(InputOption $option, array $options = []) + { + $this->writeDocument($this->getInputOptionDocument($option)); + } + + /** + * {@inheritdoc} + */ + protected function describeInputDefinition(InputDefinition $definition, array $options = []) + { + $this->writeDocument($this->getInputDefinitionDocument($definition)); + } + + /** + * {@inheritdoc} + */ + protected function describeCommand(Command $command, array $options = []) + { + $this->writeDocument($this->getCommandDocument($command)); + } + + /** + * {@inheritdoc} + */ + protected function describeApplication(Application $application, array $options = []) + { + $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null)); + } + + /** + * Appends document children to parent node. + */ + private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) + { + foreach ($importedParent->childNodes as $childNode) { + $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true)); + } + } + + /** + * Writes DOM document. + */ + private function writeDocument(\DOMDocument $dom) + { + $dom->formatOutput = true; + $this->write($dom->saveXML()); + } + + private function getInputArgumentDocument(InputArgument $argument): \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + + $dom->appendChild($objectXML = $dom->createElement('argument')); + $objectXML->setAttribute('name', $argument->getName()); + $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); + $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); + $objectXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); + + $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); + $defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [var_export($argument->getDefault(), true)] : ($argument->getDefault() ? [$argument->getDefault()] : [])); + foreach ($defaults as $default) { + $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); + $defaultXML->appendChild($dom->createTextNode($default)); + } + + return $dom; + } + + private function getInputOptionDocument(InputOption $option): \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + + $dom->appendChild($objectXML = $dom->createElement('option')); + $objectXML->setAttribute('name', '--'.$option->getName()); + $pos = strpos($option->getShortcut(), '|'); + if (false !== $pos) { + $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos)); + $objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut())); + } else { + $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : ''); + } + $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); + $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); + $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); + $objectXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); + + if ($option->acceptValue()) { + $defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [var_export($option->getDefault(), true)] : ($option->getDefault() ? [$option->getDefault()] : [])); + $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); + + if (!empty($defaults)) { + foreach ($defaults as $default) { + $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); + $defaultXML->appendChild($dom->createTextNode($default)); + } + } + } + + return $dom; + } +} diff --git a/vendor/symfony/console/Event/ConsoleCommandEvent.php b/vendor/symfony/console/Event/ConsoleCommandEvent.php new file mode 100644 index 0000000..a24697c --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleCommandEvent.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Event; + +/** + * Allows to do things before the command is executed, like skipping the command or changing the input. + * + * @author Fabien Potencier + */ +final class ConsoleCommandEvent extends ConsoleEvent +{ + /** + * The return code for skipped commands, this will also be passed into the terminate event. + */ + const RETURN_CODE_DISABLED = 113; + + /** + * Indicates if the command should be run or skipped. + */ + private $commandShouldRun = true; + + /** + * Disables the command, so it won't be run. + */ + public function disableCommand(): bool + { + return $this->commandShouldRun = false; + } + + public function enableCommand(): bool + { + return $this->commandShouldRun = true; + } + + /** + * Returns true if the command is runnable, false otherwise. + */ + public function commandShouldRun(): bool + { + return $this->commandShouldRun; + } +} diff --git a/vendor/symfony/console/Event/ConsoleErrorEvent.php b/vendor/symfony/console/Event/ConsoleErrorEvent.php new file mode 100644 index 0000000..25d9b88 --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleErrorEvent.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Event; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Allows to handle throwables thrown while running a command. + * + * @author Wouter de Jong + */ +final class ConsoleErrorEvent extends ConsoleEvent +{ + private $error; + private $exitCode; + + public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, Command $command = null) + { + parent::__construct($command, $input, $output); + + $this->error = $error; + } + + public function getError(): \Throwable + { + return $this->error; + } + + public function setError(\Throwable $error): void + { + $this->error = $error; + } + + public function setExitCode(int $exitCode): void + { + $this->exitCode = $exitCode; + + $r = new \ReflectionProperty($this->error, 'code'); + $r->setAccessible(true); + $r->setValue($this->error, $this->exitCode); + } + + public function getExitCode(): int + { + return null !== $this->exitCode ? $this->exitCode : (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1); + } +} diff --git a/vendor/symfony/console/Event/ConsoleEvent.php b/vendor/symfony/console/Event/ConsoleEvent.php new file mode 100644 index 0000000..89ab645 --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleEvent.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Event; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Contracts\EventDispatcher\Event; + +/** + * Allows to inspect input and output of a command. + * + * @author Francesco Levorato + */ +class ConsoleEvent extends Event +{ + protected $command; + + private $input; + private $output; + + public function __construct(Command $command = null, InputInterface $input, OutputInterface $output) + { + $this->command = $command; + $this->input = $input; + $this->output = $output; + } + + /** + * Gets the command that is executed. + * + * @return Command|null A Command instance + */ + public function getCommand() + { + return $this->command; + } + + /** + * Gets the input instance. + * + * @return InputInterface An InputInterface instance + */ + public function getInput() + { + return $this->input; + } + + /** + * Gets the output instance. + * + * @return OutputInterface An OutputInterface instance + */ + public function getOutput() + { + return $this->output; + } +} diff --git a/vendor/symfony/console/Event/ConsoleTerminateEvent.php b/vendor/symfony/console/Event/ConsoleTerminateEvent.php new file mode 100644 index 0000000..190038d --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleTerminateEvent.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Event; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Allows to manipulate the exit code of a command after its execution. + * + * @author Francesco Levorato + */ +final class ConsoleTerminateEvent extends ConsoleEvent +{ + private $exitCode; + + public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $exitCode) + { + parent::__construct($command, $input, $output); + + $this->setExitCode($exitCode); + } + + public function setExitCode(int $exitCode): void + { + $this->exitCode = $exitCode; + } + + public function getExitCode(): int + { + return $this->exitCode; + } +} diff --git a/vendor/symfony/console/EventListener/ErrorListener.php b/vendor/symfony/console/EventListener/ErrorListener.php new file mode 100644 index 0000000..a340757 --- /dev/null +++ b/vendor/symfony/console/EventListener/ErrorListener.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\EventListener; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Console\ConsoleEvents; +use Symfony\Component\Console\Event\ConsoleErrorEvent; +use Symfony\Component\Console\Event\ConsoleEvent; +use Symfony\Component\Console\Event\ConsoleTerminateEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * @author James Halsall + * @author Robin Chalas + */ +class ErrorListener implements EventSubscriberInterface +{ + private $logger; + + public function __construct(LoggerInterface $logger = null) + { + $this->logger = $logger; + } + + public function onConsoleError(ConsoleErrorEvent $event) + { + if (null === $this->logger) { + return; + } + + $error = $event->getError(); + + if (!$inputString = $this->getInputString($event)) { + $this->logger->error('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]); + + return; + } + + $this->logger->error('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); + } + + public function onConsoleTerminate(ConsoleTerminateEvent $event) + { + if (null === $this->logger) { + return; + } + + $exitCode = $event->getExitCode(); + + if (0 === $exitCode) { + return; + } + + if (!$inputString = $this->getInputString($event)) { + $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]); + + return; + } + + $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]); + } + + public static function getSubscribedEvents() + { + return [ + ConsoleEvents::ERROR => ['onConsoleError', -128], + ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128], + ]; + } + + private static function getInputString(ConsoleEvent $event): ?string + { + $commandName = $event->getCommand() ? $event->getCommand()->getName() : null; + $input = $event->getInput(); + + if (method_exists($input, '__toString')) { + if ($commandName) { + return str_replace(["'$commandName'", "\"$commandName\""], $commandName, (string) $input); + } + + return (string) $input; + } + + return $commandName; + } +} diff --git a/vendor/symfony/console/Exception/CommandNotFoundException.php b/vendor/symfony/console/Exception/CommandNotFoundException.php new file mode 100644 index 0000000..69d5cb9 --- /dev/null +++ b/vendor/symfony/console/Exception/CommandNotFoundException.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * Represents an incorrect command name typed in the console. + * + * @author Jérôme Tamarelle + */ +class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface +{ + private $alternatives; + + /** + * @param string $message Exception message to throw + * @param array $alternatives List of similar defined names + * @param int $code Exception code + * @param \Throwable $previous Previous exception used for the exception chaining + */ + public function __construct(string $message, array $alternatives = [], int $code = 0, \Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + + $this->alternatives = $alternatives; + } + + /** + * @return array A list of similar defined names + */ + public function getAlternatives() + { + return $this->alternatives; + } +} diff --git a/vendor/symfony/console/Exception/ExceptionInterface.php b/vendor/symfony/console/Exception/ExceptionInterface.php new file mode 100644 index 0000000..1624e13 --- /dev/null +++ b/vendor/symfony/console/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * ExceptionInterface. + * + * @author Jérôme Tamarelle + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/console/Exception/InvalidArgumentException.php b/vendor/symfony/console/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..07cc0b6 --- /dev/null +++ b/vendor/symfony/console/Exception/InvalidArgumentException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * @author Jérôme Tamarelle + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/InvalidOptionException.php b/vendor/symfony/console/Exception/InvalidOptionException.php new file mode 100644 index 0000000..b2eec61 --- /dev/null +++ b/vendor/symfony/console/Exception/InvalidOptionException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * Represents an incorrect option name typed in the console. + * + * @author Jérôme Tamarelle + */ +class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/LogicException.php b/vendor/symfony/console/Exception/LogicException.php new file mode 100644 index 0000000..fc37b8d --- /dev/null +++ b/vendor/symfony/console/Exception/LogicException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * @author Jérôme Tamarelle + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/MissingInputException.php b/vendor/symfony/console/Exception/MissingInputException.php new file mode 100644 index 0000000..04f02ad --- /dev/null +++ b/vendor/symfony/console/Exception/MissingInputException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * Represents failure to read input from stdin. + * + * @author Gabriel Ostrolucký + */ +class MissingInputException extends RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/NamespaceNotFoundException.php b/vendor/symfony/console/Exception/NamespaceNotFoundException.php new file mode 100644 index 0000000..dd16e45 --- /dev/null +++ b/vendor/symfony/console/Exception/NamespaceNotFoundException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * Represents an incorrect namespace typed in the console. + * + * @author Pierre du Plessis + */ +class NamespaceNotFoundException extends CommandNotFoundException +{ +} diff --git a/vendor/symfony/console/Exception/RuntimeException.php b/vendor/symfony/console/Exception/RuntimeException.php new file mode 100644 index 0000000..51d7d80 --- /dev/null +++ b/vendor/symfony/console/Exception/RuntimeException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Exception; + +/** + * @author Jérôme Tamarelle + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Formatter/NullOutputFormatter.php b/vendor/symfony/console/Formatter/NullOutputFormatter.php new file mode 100644 index 0000000..0aa0a5c --- /dev/null +++ b/vendor/symfony/console/Formatter/NullOutputFormatter.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +/** + * @author Tien Xuan Vo + */ +final class NullOutputFormatter implements OutputFormatterInterface +{ + private $style; + + /** + * {@inheritdoc} + */ + public function format(?string $message): void + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function getStyle(string $name): OutputFormatterStyleInterface + { + if ($this->style) { + return $this->style; + } + // to comply with the interface we must return a OutputFormatterStyleInterface + return $this->style = new NullOutputFormatterStyle(); + } + + /** + * {@inheritdoc} + */ + public function hasStyle(string $name): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isDecorated(): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function setDecorated(bool $decorated): void + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function setStyle(string $name, OutputFormatterStyleInterface $style): void + { + // do nothing + } +} diff --git a/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php b/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php new file mode 100644 index 0000000..bfd0afe --- /dev/null +++ b/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +/** + * @author Tien Xuan Vo + */ +final class NullOutputFormatterStyle implements OutputFormatterStyleInterface +{ + /** + * {@inheritdoc} + */ + public function apply(string $text): string + { + return $text; + } + + /** + * {@inheritdoc} + */ + public function setBackground(string $color = null): void + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function setForeground(string $color = null): void + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function setOption(string $option): void + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function setOptions(array $options): void + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function unsetOption(string $option): void + { + // do nothing + } +} diff --git a/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/symfony/console/Formatter/OutputFormatter.php new file mode 100644 index 0000000..8fc9f28 --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatter.php @@ -0,0 +1,275 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +use Symfony\Component\Console\Exception\InvalidArgumentException; + +/** + * Formatter class for console output. + * + * @author Konstantin Kudryashov + * @author Roland Franssen + */ +class OutputFormatter implements WrappableOutputFormatterInterface +{ + private $decorated; + private $styles = []; + private $styleStack; + + /** + * Escapes "<" special char in given text. + * + * @return string Escaped text + */ + public static function escape(string $text) + { + $text = preg_replace('/([^\\\\]?) FormatterStyle" instances + */ + public function __construct(bool $decorated = false, array $styles = []) + { + $this->decorated = $decorated; + + $this->setStyle('error', new OutputFormatterStyle('white', 'red')); + $this->setStyle('info', new OutputFormatterStyle('green')); + $this->setStyle('comment', new OutputFormatterStyle('yellow')); + $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); + + foreach ($styles as $name => $style) { + $this->setStyle($name, $style); + } + + $this->styleStack = new OutputFormatterStyleStack(); + } + + /** + * {@inheritdoc} + */ + public function setDecorated(bool $decorated) + { + $this->decorated = $decorated; + } + + /** + * {@inheritdoc} + */ + public function isDecorated() + { + return $this->decorated; + } + + /** + * {@inheritdoc} + */ + public function setStyle(string $name, OutputFormatterStyleInterface $style) + { + $this->styles[strtolower($name)] = $style; + } + + /** + * {@inheritdoc} + */ + public function hasStyle(string $name) + { + return isset($this->styles[strtolower($name)]); + } + + /** + * {@inheritdoc} + */ + public function getStyle(string $name) + { + if (!$this->hasStyle($name)) { + throw new InvalidArgumentException(sprintf('Undefined style: "%s".', $name)); + } + + return $this->styles[strtolower($name)]; + } + + /** + * {@inheritdoc} + */ + public function format(?string $message) + { + return $this->formatAndWrap($message, 0); + } + + /** + * {@inheritdoc} + */ + public function formatAndWrap(?string $message, int $width) + { + $offset = 0; + $output = ''; + $tagRegex = '[a-z][^<>]*+'; + $currentLineLength = 0; + preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, PREG_OFFSET_CAPTURE); + foreach ($matches[0] as $i => $match) { + $pos = $match[1]; + $text = $match[0]; + + if (0 != $pos && '\\' == $message[$pos - 1]) { + continue; + } + + // add the text up to the next tag + $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); + $offset = $pos + \strlen($text); + + // opening tag? + if ($open = '/' != $text[1]) { + $tag = $matches[1][$i][0]; + } else { + $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : ''; + } + + if (!$open && !$tag) { + // + $this->styleStack->pop(); + } elseif (null === $style = $this->createStyleFromString($tag)) { + $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength); + } elseif ($open) { + $this->styleStack->push($style); + } else { + $this->styleStack->pop($style); + } + } + + $output .= $this->applyCurrentStyle(substr($message, $offset), $output, $width, $currentLineLength); + + if (false !== strpos($output, "\0")) { + return strtr($output, ["\0" => '\\', '\\<' => '<']); + } + + return str_replace('\\<', '<', $output); + } + + /** + * @return OutputFormatterStyleStack + */ + public function getStyleStack() + { + return $this->styleStack; + } + + /** + * Tries to create new style instance from string. + */ + private function createStyleFromString(string $string): ?OutputFormatterStyleInterface + { + if (isset($this->styles[$string])) { + return $this->styles[$string]; + } + + if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, PREG_SET_ORDER)) { + return null; + } + + $style = new OutputFormatterStyle(); + foreach ($matches as $match) { + array_shift($match); + $match[0] = strtolower($match[0]); + + if ('fg' == $match[0]) { + $style->setForeground(strtolower($match[1])); + } elseif ('bg' == $match[0]) { + $style->setBackground(strtolower($match[1])); + } elseif ('href' === $match[0]) { + $style->setHref($match[1]); + } elseif ('options' === $match[0]) { + preg_match_all('([^,;]+)', strtolower($match[1]), $options); + $options = array_shift($options); + foreach ($options as $option) { + $style->setOption($option); + } + } else { + return null; + } + } + + return $style; + } + + /** + * Applies current style from stack to text, if must be applied. + */ + private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string + { + if ('' === $text) { + return ''; + } + + if (!$width) { + return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text; + } + + if (!$currentLineLength && '' !== $current) { + $text = ltrim($text); + } + + if ($currentLineLength) { + $prefix = substr($text, 0, $i = $width - $currentLineLength)."\n"; + $text = substr($text, $i); + } else { + $prefix = ''; + } + + preg_match('~(\\n)$~', $text, $matches); + $text = $prefix.preg_replace('~([^\\n]{'.$width.'})\\ *~', "\$1\n", $text); + $text = rtrim($text, "\n").($matches[1] ?? ''); + + if (!$currentLineLength && '' !== $current && "\n" !== substr($current, -1)) { + $text = "\n".$text; + } + + $lines = explode("\n", $text); + + foreach ($lines as $line) { + $currentLineLength += \strlen($line); + if ($width <= $currentLineLength) { + $currentLineLength = 0; + } + } + + if ($this->isDecorated()) { + foreach ($lines as $i => $line) { + $lines[$i] = $this->styleStack->getCurrent()->apply($line); + } + } + + return implode("\n", $lines); + } +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/vendor/symfony/console/Formatter/OutputFormatterInterface.php new file mode 100644 index 0000000..8c50d41 --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterInterface.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +/** + * Formatter interface for console output. + * + * @author Konstantin Kudryashov + */ +interface OutputFormatterInterface +{ + /** + * Sets the decorated flag. + */ + public function setDecorated(bool $decorated); + + /** + * Gets the decorated flag. + * + * @return bool true if the output will decorate messages, false otherwise + */ + public function isDecorated(); + + /** + * Sets a new style. + */ + public function setStyle(string $name, OutputFormatterStyleInterface $style); + + /** + * Checks if output formatter has style with specified name. + * + * @return bool + */ + public function hasStyle(string $name); + + /** + * Gets style options from style with specified name. + * + * @return OutputFormatterStyleInterface + * + * @throws \InvalidArgumentException When style isn't defined + */ + public function getStyle(string $name); + + /** + * Formats a message according to the given styles. + */ + public function format(?string $message); +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/symfony/console/Formatter/OutputFormatterStyle.php new file mode 100644 index 0000000..b1291cb --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterStyle.php @@ -0,0 +1,196 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +use Symfony\Component\Console\Exception\InvalidArgumentException; + +/** + * Formatter style class for defining styles. + * + * @author Konstantin Kudryashov + */ +class OutputFormatterStyle implements OutputFormatterStyleInterface +{ + private static $availableForegroundColors = [ + 'black' => ['set' => 30, 'unset' => 39], + 'red' => ['set' => 31, 'unset' => 39], + 'green' => ['set' => 32, 'unset' => 39], + 'yellow' => ['set' => 33, 'unset' => 39], + 'blue' => ['set' => 34, 'unset' => 39], + 'magenta' => ['set' => 35, 'unset' => 39], + 'cyan' => ['set' => 36, 'unset' => 39], + 'white' => ['set' => 37, 'unset' => 39], + 'default' => ['set' => 39, 'unset' => 39], + ]; + private static $availableBackgroundColors = [ + 'black' => ['set' => 40, 'unset' => 49], + 'red' => ['set' => 41, 'unset' => 49], + 'green' => ['set' => 42, 'unset' => 49], + 'yellow' => ['set' => 43, 'unset' => 49], + 'blue' => ['set' => 44, 'unset' => 49], + 'magenta' => ['set' => 45, 'unset' => 49], + 'cyan' => ['set' => 46, 'unset' => 49], + 'white' => ['set' => 47, 'unset' => 49], + 'default' => ['set' => 49, 'unset' => 49], + ]; + private static $availableOptions = [ + 'bold' => ['set' => 1, 'unset' => 22], + 'underscore' => ['set' => 4, 'unset' => 24], + 'blink' => ['set' => 5, 'unset' => 25], + 'reverse' => ['set' => 7, 'unset' => 27], + 'conceal' => ['set' => 8, 'unset' => 28], + ]; + + private $foreground; + private $background; + private $href; + private $options = []; + private $handlesHrefGracefully; + + /** + * Initializes output formatter style. + * + * @param string|null $foreground The style foreground color name + * @param string|null $background The style background color name + */ + public function __construct(string $foreground = null, string $background = null, array $options = []) + { + if (null !== $foreground) { + $this->setForeground($foreground); + } + if (null !== $background) { + $this->setBackground($background); + } + if (\count($options)) { + $this->setOptions($options); + } + } + + /** + * {@inheritdoc} + */ + public function setForeground(string $color = null) + { + if (null === $color) { + $this->foreground = null; + + return; + } + + if (!isset(static::$availableForegroundColors[$color])) { + throw new InvalidArgumentException(sprintf('Invalid foreground color specified: "%s". Expected one of (%s).', $color, implode(', ', array_keys(static::$availableForegroundColors)))); + } + + $this->foreground = static::$availableForegroundColors[$color]; + } + + /** + * {@inheritdoc} + */ + public function setBackground(string $color = null) + { + if (null === $color) { + $this->background = null; + + return; + } + + if (!isset(static::$availableBackgroundColors[$color])) { + throw new InvalidArgumentException(sprintf('Invalid background color specified: "%s". Expected one of (%s).', $color, implode(', ', array_keys(static::$availableBackgroundColors)))); + } + + $this->background = static::$availableBackgroundColors[$color]; + } + + public function setHref(string $url): void + { + $this->href = $url; + } + + /** + * {@inheritdoc} + */ + public function setOption(string $option) + { + if (!isset(static::$availableOptions[$option])) { + throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(static::$availableOptions)))); + } + + if (!\in_array(static::$availableOptions[$option], $this->options)) { + $this->options[] = static::$availableOptions[$option]; + } + } + + /** + * {@inheritdoc} + */ + public function unsetOption(string $option) + { + if (!isset(static::$availableOptions[$option])) { + throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(static::$availableOptions)))); + } + + $pos = array_search(static::$availableOptions[$option], $this->options); + if (false !== $pos) { + unset($this->options[$pos]); + } + } + + /** + * {@inheritdoc} + */ + public function setOptions(array $options) + { + $this->options = []; + + foreach ($options as $option) { + $this->setOption($option); + } + } + + /** + * {@inheritdoc} + */ + public function apply(string $text) + { + $setCodes = []; + $unsetCodes = []; + + if (null === $this->handlesHrefGracefully) { + $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') && !getenv('KONSOLE_VERSION'); + } + + if (null !== $this->foreground) { + $setCodes[] = $this->foreground['set']; + $unsetCodes[] = $this->foreground['unset']; + } + if (null !== $this->background) { + $setCodes[] = $this->background['set']; + $unsetCodes[] = $this->background['unset']; + } + + foreach ($this->options as $option) { + $setCodes[] = $option['set']; + $unsetCodes[] = $option['unset']; + } + + if (null !== $this->href && $this->handlesHrefGracefully) { + $text = "\033]8;;$this->href\033\\$text\033]8;;\033\\"; + } + + if (0 === \count($setCodes)) { + return $text; + } + + return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes)); + } +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php new file mode 100644 index 0000000..b30560d --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +/** + * Formatter style interface for defining styles. + * + * @author Konstantin Kudryashov + */ +interface OutputFormatterStyleInterface +{ + /** + * Sets style foreground color. + */ + public function setForeground(string $color = null); + + /** + * Sets style background color. + */ + public function setBackground(string $color = null); + + /** + * Sets some specific style option. + */ + public function setOption(string $option); + + /** + * Unsets some specific style option. + */ + public function unsetOption(string $option); + + /** + * Sets multiple style options at once. + */ + public function setOptions(array $options); + + /** + * Applies the style to a given text. + * + * @return string + */ + public function apply(string $text); +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php new file mode 100644 index 0000000..33f7d52 --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Contracts\Service\ResetInterface; + +/** + * @author Jean-François Simon + */ +class OutputFormatterStyleStack implements ResetInterface +{ + /** + * @var OutputFormatterStyleInterface[] + */ + private $styles; + + private $emptyStyle; + + public function __construct(OutputFormatterStyleInterface $emptyStyle = null) + { + $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle(); + $this->reset(); + } + + /** + * Resets stack (ie. empty internal arrays). + */ + public function reset() + { + $this->styles = []; + } + + /** + * Pushes a style in the stack. + */ + public function push(OutputFormatterStyleInterface $style) + { + $this->styles[] = $style; + } + + /** + * Pops a style from the stack. + * + * @return OutputFormatterStyleInterface + * + * @throws InvalidArgumentException When style tags incorrectly nested + */ + public function pop(OutputFormatterStyleInterface $style = null) + { + if (empty($this->styles)) { + return $this->emptyStyle; + } + + if (null === $style) { + return array_pop($this->styles); + } + + foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { + if ($style->apply('') === $stackedStyle->apply('')) { + $this->styles = \array_slice($this->styles, 0, $index); + + return $stackedStyle; + } + } + + throw new InvalidArgumentException('Incorrectly nested style tag found.'); + } + + /** + * Computes current style with stacks top codes. + * + * @return OutputFormatterStyle + */ + public function getCurrent() + { + if (empty($this->styles)) { + return $this->emptyStyle; + } + + return $this->styles[\count($this->styles) - 1]; + } + + /** + * @return $this + */ + public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) + { + $this->emptyStyle = $emptyStyle; + + return $this; + } + + /** + * @return OutputFormatterStyleInterface + */ + public function getEmptyStyle() + { + return $this->emptyStyle; + } +} diff --git a/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php new file mode 100644 index 0000000..42319ee --- /dev/null +++ b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +/** + * Formatter interface for console output that supports word wrapping. + * + * @author Roland Franssen + */ +interface WrappableOutputFormatterInterface extends OutputFormatterInterface +{ + /** + * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping). + */ + public function formatAndWrap(?string $message, int $width); +} diff --git a/vendor/symfony/console/Helper/DebugFormatterHelper.php b/vendor/symfony/console/Helper/DebugFormatterHelper.php new file mode 100644 index 0000000..9d07ec2 --- /dev/null +++ b/vendor/symfony/console/Helper/DebugFormatterHelper.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +/** + * Helps outputting debug information when running an external program from a command. + * + * An external program can be a Process, an HTTP request, or anything else. + * + * @author Fabien Potencier + */ +class DebugFormatterHelper extends Helper +{ + private $colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default']; + private $started = []; + private $count = -1; + + /** + * Starts a debug formatting session. + * + * @return string + */ + public function start(string $id, string $message, string $prefix = 'RUN') + { + $this->started[$id] = ['border' => ++$this->count % \count($this->colors)]; + + return sprintf("%s %s %s\n", $this->getBorder($id), $prefix, $message); + } + + /** + * Adds progress to a formatting session. + * + * @return string + */ + public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR') + { + $message = ''; + + if ($error) { + if (isset($this->started[$id]['out'])) { + $message .= "\n"; + unset($this->started[$id]['out']); + } + if (!isset($this->started[$id]['err'])) { + $message .= sprintf('%s %s ', $this->getBorder($id), $errorPrefix); + $this->started[$id]['err'] = true; + } + + $message .= str_replace("\n", sprintf("\n%s %s ", $this->getBorder($id), $errorPrefix), $buffer); + } else { + if (isset($this->started[$id]['err'])) { + $message .= "\n"; + unset($this->started[$id]['err']); + } + if (!isset($this->started[$id]['out'])) { + $message .= sprintf('%s %s ', $this->getBorder($id), $prefix); + $this->started[$id]['out'] = true; + } + + $message .= str_replace("\n", sprintf("\n%s %s ", $this->getBorder($id), $prefix), $buffer); + } + + return $message; + } + + /** + * Stops a formatting session. + * + * @return string + */ + public function stop(string $id, string $message, bool $successful, string $prefix = 'RES') + { + $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : ''; + + if ($successful) { + return sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); + } + + $message = sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); + + unset($this->started[$id]['out'], $this->started[$id]['err']); + + return $message; + } + + private function getBorder(string $id): string + { + return sprintf(' ', $this->colors[$this->started[$id]['border']]); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'debug_formatter'; + } +} diff --git a/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/symfony/console/Helper/DescriptorHelper.php new file mode 100644 index 0000000..f2ad9db --- /dev/null +++ b/vendor/symfony/console/Helper/DescriptorHelper.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Descriptor\DescriptorInterface; +use Symfony\Component\Console\Descriptor\JsonDescriptor; +use Symfony\Component\Console\Descriptor\MarkdownDescriptor; +use Symfony\Component\Console\Descriptor\TextDescriptor; +use Symfony\Component\Console\Descriptor\XmlDescriptor; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * This class adds helper method to describe objects in various formats. + * + * @author Jean-François Simon + */ +class DescriptorHelper extends Helper +{ + /** + * @var DescriptorInterface[] + */ + private $descriptors = []; + + public function __construct() + { + $this + ->register('txt', new TextDescriptor()) + ->register('xml', new XmlDescriptor()) + ->register('json', new JsonDescriptor()) + ->register('md', new MarkdownDescriptor()) + ; + } + + /** + * Describes an object if supported. + * + * Available options are: + * * format: string, the output format name + * * raw_text: boolean, sets output type as raw + * + * @throws InvalidArgumentException when the given format is not supported + */ + public function describe(OutputInterface $output, ?object $object, array $options = []) + { + $options = array_merge([ + 'raw_text' => false, + 'format' => 'txt', + ], $options); + + if (!isset($this->descriptors[$options['format']])) { + throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format'])); + } + + $descriptor = $this->descriptors[$options['format']]; + $descriptor->describe($output, $object, $options); + } + + /** + * Registers a descriptor. + * + * @return $this + */ + public function register(string $format, DescriptorInterface $descriptor) + { + $this->descriptors[$format] = $descriptor; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'descriptor'; + } +} diff --git a/vendor/symfony/console/Helper/Dumper.php b/vendor/symfony/console/Helper/Dumper.php new file mode 100644 index 0000000..b013b6c --- /dev/null +++ b/vendor/symfony/console/Helper/Dumper.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\VarDumper\Cloner\ClonerInterface; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +/** + * @author Roland Franssen + */ +final class Dumper +{ + private $output; + private $dumper; + private $cloner; + private $handler; + + public function __construct(OutputInterface $output, CliDumper $dumper = null, ClonerInterface $cloner = null) + { + $this->output = $output; + $this->dumper = $dumper; + $this->cloner = $cloner; + + if (class_exists(CliDumper::class)) { + $this->handler = function ($var): string { + $dumper = $this->dumper ?? $this->dumper = new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR); + $dumper->setColors($this->output->isDecorated()); + + return rtrim($dumper->dump(($this->cloner ?? $this->cloner = new VarCloner())->cloneVar($var)->withRefHandles(false), true)); + }; + } else { + $this->handler = function ($var): string { + switch (true) { + case null === $var: + return 'null'; + case true === $var: + return 'true'; + case false === $var: + return 'false'; + case \is_string($var): + return '"'.$var.'"'; + default: + return rtrim(print_r($var, true)); + } + }; + } + } + + public function __invoke($var): string + { + return ($this->handler)($var); + } +} diff --git a/vendor/symfony/console/Helper/FormatterHelper.php b/vendor/symfony/console/Helper/FormatterHelper.php new file mode 100644 index 0000000..a505415 --- /dev/null +++ b/vendor/symfony/console/Helper/FormatterHelper.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Formatter\OutputFormatter; + +/** + * The Formatter class provides helpers to format messages. + * + * @author Fabien Potencier + */ +class FormatterHelper extends Helper +{ + /** + * Formats a message within a section. + * + * @return string The format section + */ + public function formatSection(string $section, string $message, string $style = 'info') + { + return sprintf('<%s>[%s] %s', $style, $section, $style, $message); + } + + /** + * Formats a message as a block of text. + * + * @param string|array $messages The message to write in the block + * + * @return string The formatter message + */ + public function formatBlock($messages, string $style, bool $large = false) + { + if (!\is_array($messages)) { + $messages = [$messages]; + } + + $len = 0; + $lines = []; + foreach ($messages as $message) { + $message = OutputFormatter::escape($message); + $lines[] = sprintf($large ? ' %s ' : ' %s ', $message); + $len = max(self::strlen($message) + ($large ? 4 : 2), $len); + } + + $messages = $large ? [str_repeat(' ', $len)] : []; + for ($i = 0; isset($lines[$i]); ++$i) { + $messages[] = $lines[$i].str_repeat(' ', $len - self::strlen($lines[$i])); + } + if ($large) { + $messages[] = str_repeat(' ', $len); + } + + for ($i = 0; isset($messages[$i]); ++$i) { + $messages[$i] = sprintf('<%s>%s', $style, $messages[$i], $style); + } + + return implode("\n", $messages); + } + + /** + * Truncates a message to the given length. + * + * @return string + */ + public function truncate(string $message, int $length, string $suffix = '...') + { + $computedLength = $length - self::strlen($suffix); + + if ($computedLength > self::strlen($message)) { + return $message; + } + + return self::substr($message, 0, $length).$suffix; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'formatter'; + } +} diff --git a/vendor/symfony/console/Helper/Helper.php b/vendor/symfony/console/Helper/Helper.php new file mode 100644 index 0000000..e52e315 --- /dev/null +++ b/vendor/symfony/console/Helper/Helper.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Formatter\OutputFormatterInterface; + +/** + * Helper is the base class for all helper classes. + * + * @author Fabien Potencier + */ +abstract class Helper implements HelperInterface +{ + protected $helperSet = null; + + /** + * {@inheritdoc} + */ + public function setHelperSet(HelperSet $helperSet = null) + { + $this->helperSet = $helperSet; + } + + /** + * {@inheritdoc} + */ + public function getHelperSet() + { + return $this->helperSet; + } + + /** + * Returns the length of a string, using mb_strwidth if it is available. + * + * @return int The length of the string + */ + public static function strlen(?string $string) + { + if (false === $encoding = mb_detect_encoding($string, null, true)) { + return \strlen($string); + } + + return mb_strwidth($string, $encoding); + } + + /** + * Returns the subset of a string, using mb_substr if it is available. + * + * @return string The string subset + */ + public static function substr(string $string, int $from, int $length = null) + { + if (false === $encoding = mb_detect_encoding($string, null, true)) { + return substr($string, $from, $length); + } + + return mb_substr($string, $from, $length, $encoding); + } + + public static function formatTime($secs) + { + static $timeFormats = [ + [0, '< 1 sec'], + [1, '1 sec'], + [2, 'secs', 1], + [60, '1 min'], + [120, 'mins', 60], + [3600, '1 hr'], + [7200, 'hrs', 3600], + [86400, '1 day'], + [172800, 'days', 86400], + ]; + + foreach ($timeFormats as $index => $format) { + if ($secs >= $format[0]) { + if ((isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0]) + || $index == \count($timeFormats) - 1 + ) { + if (2 == \count($format)) { + return $format[1]; + } + + return floor($secs / $format[2]).' '.$format[1]; + } + } + } + } + + public static function formatMemory(int $memory) + { + if ($memory >= 1024 * 1024 * 1024) { + return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024); + } + + if ($memory >= 1024 * 1024) { + return sprintf('%.1f MiB', $memory / 1024 / 1024); + } + + if ($memory >= 1024) { + return sprintf('%d KiB', $memory / 1024); + } + + return sprintf('%d B', $memory); + } + + public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, $string) + { + return self::strlen(self::removeDecoration($formatter, $string)); + } + + public static function removeDecoration(OutputFormatterInterface $formatter, $string) + { + $isDecorated = $formatter->isDecorated(); + $formatter->setDecorated(false); + // remove <...> formatting + $string = $formatter->format($string); + // remove already formatted characters + $string = preg_replace("/\033\[[^m]*m/", '', $string); + $formatter->setDecorated($isDecorated); + + return $string; + } +} diff --git a/vendor/symfony/console/Helper/HelperInterface.php b/vendor/symfony/console/Helper/HelperInterface.php new file mode 100644 index 0000000..1ce8235 --- /dev/null +++ b/vendor/symfony/console/Helper/HelperInterface.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +/** + * HelperInterface is the interface all helpers must implement. + * + * @author Fabien Potencier + */ +interface HelperInterface +{ + /** + * Sets the helper set associated with this helper. + */ + public function setHelperSet(HelperSet $helperSet = null); + + /** + * Gets the helper set associated with this helper. + * + * @return HelperSet A HelperSet instance + */ + public function getHelperSet(); + + /** + * Returns the canonical name of this helper. + * + * @return string The canonical name + */ + public function getName(); +} diff --git a/vendor/symfony/console/Helper/HelperSet.php b/vendor/symfony/console/Helper/HelperSet.php new file mode 100644 index 0000000..5c08a76 --- /dev/null +++ b/vendor/symfony/console/Helper/HelperSet.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\InvalidArgumentException; + +/** + * HelperSet represents a set of helpers to be used with a command. + * + * @author Fabien Potencier + */ +class HelperSet implements \IteratorAggregate +{ + /** + * @var Helper[] + */ + private $helpers = []; + private $command; + + /** + * @param Helper[] $helpers An array of helper + */ + public function __construct(array $helpers = []) + { + foreach ($helpers as $alias => $helper) { + $this->set($helper, \is_int($alias) ? null : $alias); + } + } + + public function set(HelperInterface $helper, string $alias = null) + { + $this->helpers[$helper->getName()] = $helper; + if (null !== $alias) { + $this->helpers[$alias] = $helper; + } + + $helper->setHelperSet($this); + } + + /** + * Returns true if the helper if defined. + * + * @return bool true if the helper is defined, false otherwise + */ + public function has(string $name) + { + return isset($this->helpers[$name]); + } + + /** + * Gets a helper value. + * + * @return HelperInterface The helper instance + * + * @throws InvalidArgumentException if the helper is not defined + */ + public function get(string $name) + { + if (!$this->has($name)) { + throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name)); + } + + return $this->helpers[$name]; + } + + public function setCommand(Command $command = null) + { + $this->command = $command; + } + + /** + * Gets the command associated with this helper set. + * + * @return Command A Command instance + */ + public function getCommand() + { + return $this->command; + } + + /** + * @return Helper[] + */ + public function getIterator() + { + return new \ArrayIterator($this->helpers); + } +} diff --git a/vendor/symfony/console/Helper/InputAwareHelper.php b/vendor/symfony/console/Helper/InputAwareHelper.php new file mode 100644 index 0000000..0d0dba2 --- /dev/null +++ b/vendor/symfony/console/Helper/InputAwareHelper.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Input\InputAwareInterface; +use Symfony\Component\Console\Input\InputInterface; + +/** + * An implementation of InputAwareInterface for Helpers. + * + * @author Wouter J + */ +abstract class InputAwareHelper extends Helper implements InputAwareInterface +{ + protected $input; + + /** + * {@inheritdoc} + */ + public function setInput(InputInterface $input) + { + $this->input = $input; + } +} diff --git a/vendor/symfony/console/Helper/ProcessHelper.php b/vendor/symfony/console/Helper/ProcessHelper.php new file mode 100644 index 0000000..f82c16b --- /dev/null +++ b/vendor/symfony/console/Helper/ProcessHelper.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Process; + +/** + * The ProcessHelper class provides helpers to run external processes. + * + * @author Fabien Potencier + * + * @final + */ +class ProcessHelper extends Helper +{ + /** + * Runs an external process. + * + * @param array|Process $cmd An instance of Process or an array of the command and arguments + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @return Process The process that ran + */ + public function run(OutputInterface $output, $cmd, string $error = null, callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process + { + if (!class_exists(Process::class)) { + throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".'); + } + + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + + $formatter = $this->getHelperSet()->get('debug_formatter'); + + if ($cmd instanceof Process) { + $cmd = [$cmd]; + } + + if (!\is_array($cmd)) { + throw new \TypeError(sprintf('The "command" argument of "%s()" must be an array or a "%s" instance, "%s" given.', __METHOD__, Process::class, get_debug_type($cmd))); + } + + if (\is_string($cmd[0] ?? null)) { + $process = new Process($cmd); + $cmd = []; + } elseif (($cmd[0] ?? null) instanceof Process) { + $process = $cmd[0]; + unset($cmd[0]); + } else { + throw new \InvalidArgumentException(sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__)); + } + + if ($verbosity <= $output->getVerbosity()) { + $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine()))); + } + + if ($output->isDebug()) { + $callback = $this->wrapCallback($output, $process, $callback); + } + + $process->run($callback, $cmd); + + if ($verbosity <= $output->getVerbosity()) { + $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode()); + $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful())); + } + + if (!$process->isSuccessful() && null !== $error) { + $output->writeln(sprintf('%s', $this->escapeString($error))); + } + + return $process; + } + + /** + * Runs the process. + * + * This is identical to run() except that an exception is thrown if the process + * exits with a non-zero exit code. + * + * @param string|Process $cmd An instance of Process or a command to run + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @return Process The process that ran + * + * @throws ProcessFailedException + * + * @see run() + */ + public function mustRun(OutputInterface $output, $cmd, string $error = null, callable $callback = null): Process + { + $process = $this->run($output, $cmd, $error, $callback); + + if (!$process->isSuccessful()) { + throw new ProcessFailedException($process); + } + + return $process; + } + + /** + * Wraps a Process callback to add debugging output. + */ + public function wrapCallback(OutputInterface $output, Process $process, callable $callback = null): callable + { + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + + $formatter = $this->getHelperSet()->get('debug_formatter'); + + return function ($type, $buffer) use ($output, $process, $callback, $formatter) { + $output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type)); + + if (null !== $callback) { + $callback($type, $buffer); + } + }; + } + + private function escapeString(string $str): string + { + return str_replace('<', '\\<', $str); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'process'; + } +} diff --git a/vendor/symfony/console/Helper/ProgressBar.php b/vendor/symfony/console/Helper/ProgressBar.php new file mode 100644 index 0000000..715bfef --- /dev/null +++ b/vendor/symfony/console/Helper/ProgressBar.php @@ -0,0 +1,600 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Cursor; +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\ConsoleSectionOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Terminal; + +/** + * The ProgressBar provides helpers to display progress output. + * + * @author Fabien Potencier + * @author Chris Jones + */ +final class ProgressBar +{ + private $barWidth = 28; + private $barChar; + private $emptyBarChar = '-'; + private $progressChar = '>'; + private $format; + private $internalFormat; + private $redrawFreq = 1; + private $writeCount; + private $lastWriteTime; + private $minSecondsBetweenRedraws = 0; + private $maxSecondsBetweenRedraws = 1; + private $output; + private $step = 0; + private $max; + private $startTime; + private $stepWidth; + private $percent = 0.0; + private $formatLineCount; + private $messages = []; + private $overwrite = true; + private $terminal; + private $previousMessage; + private $cursor; + + private static $formatters; + private static $formats; + + /** + * @param int $max Maximum steps (0 if unknown) + */ + public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 0.1) + { + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + + $this->output = $output; + $this->setMaxSteps($max); + $this->terminal = new Terminal(); + + if (0 < $minSecondsBetweenRedraws) { + $this->redrawFreq = null; + $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws; + } + + if (!$this->output->isDecorated()) { + // disable overwrite when output does not support ANSI codes. + $this->overwrite = false; + + // set a reasonable redraw frequency so output isn't flooded + $this->redrawFreq = null; + } + + $this->startTime = time(); + $this->cursor = new Cursor($output); + } + + /** + * Sets a placeholder formatter for a given name. + * + * This method also allow you to override an existing placeholder. + * + * @param string $name The placeholder name (including the delimiter char like %) + * @param callable $callable A PHP callable + */ + public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void + { + if (!self::$formatters) { + self::$formatters = self::initPlaceholderFormatters(); + } + + self::$formatters[$name] = $callable; + } + + /** + * Gets the placeholder formatter for a given name. + * + * @param string $name The placeholder name (including the delimiter char like %) + * + * @return callable|null A PHP callable + */ + public static function getPlaceholderFormatterDefinition(string $name): ?callable + { + if (!self::$formatters) { + self::$formatters = self::initPlaceholderFormatters(); + } + + return isset(self::$formatters[$name]) ? self::$formatters[$name] : null; + } + + /** + * Sets a format for a given name. + * + * This method also allow you to override an existing format. + * + * @param string $name The format name + * @param string $format A format string + */ + public static function setFormatDefinition(string $name, string $format): void + { + if (!self::$formats) { + self::$formats = self::initFormats(); + } + + self::$formats[$name] = $format; + } + + /** + * Gets the format for a given name. + * + * @param string $name The format name + * + * @return string|null A format string + */ + public static function getFormatDefinition(string $name): ?string + { + if (!self::$formats) { + self::$formats = self::initFormats(); + } + + return isset(self::$formats[$name]) ? self::$formats[$name] : null; + } + + /** + * Associates a text with a named placeholder. + * + * The text is displayed when the progress bar is rendered but only + * when the corresponding placeholder is part of the custom format line + * (by wrapping the name with %). + * + * @param string $message The text to associate with the placeholder + * @param string $name The name of the placeholder + */ + public function setMessage(string $message, string $name = 'message') + { + $this->messages[$name] = $message; + } + + public function getMessage(string $name = 'message') + { + return $this->messages[$name]; + } + + public function getStartTime(): int + { + return $this->startTime; + } + + public function getMaxSteps(): int + { + return $this->max; + } + + public function getProgress(): int + { + return $this->step; + } + + private function getStepWidth(): int + { + return $this->stepWidth; + } + + public function getProgressPercent(): float + { + return $this->percent; + } + + public function getBarOffset(): float + { + return floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? min(5, $this->barWidth / 15) * $this->writeCount : $this->step) % $this->barWidth); + } + + public function getEstimated(): float + { + if (!$this->step) { + return 0; + } + + return round((time() - $this->startTime) / $this->step * $this->max); + } + + public function getRemaining(): float + { + if (!$this->step) { + return 0; + } + + return round((time() - $this->startTime) / $this->step * ($this->max - $this->step)); + } + + public function setBarWidth(int $size) + { + $this->barWidth = max(1, $size); + } + + public function getBarWidth(): int + { + return $this->barWidth; + } + + public function setBarCharacter(string $char) + { + $this->barChar = $char; + } + + public function getBarCharacter(): string + { + if (null === $this->barChar) { + return $this->max ? '=' : $this->emptyBarChar; + } + + return $this->barChar; + } + + public function setEmptyBarCharacter(string $char) + { + $this->emptyBarChar = $char; + } + + public function getEmptyBarCharacter(): string + { + return $this->emptyBarChar; + } + + public function setProgressCharacter(string $char) + { + $this->progressChar = $char; + } + + public function getProgressCharacter(): string + { + return $this->progressChar; + } + + public function setFormat(string $format) + { + $this->format = null; + $this->internalFormat = $format; + } + + /** + * Sets the redraw frequency. + * + * @param int|float $freq The frequency in steps + */ + public function setRedrawFrequency(?int $freq) + { + $this->redrawFreq = null !== $freq ? max(1, $freq) : null; + } + + public function minSecondsBetweenRedraws(float $seconds): void + { + $this->minSecondsBetweenRedraws = $seconds; + } + + public function maxSecondsBetweenRedraws(float $seconds): void + { + $this->maxSecondsBetweenRedraws = $seconds; + } + + /** + * Returns an iterator that will automatically update the progress bar when iterated. + * + * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable + */ + public function iterate(iterable $iterable, int $max = null): iterable + { + $this->start($max ?? (is_countable($iterable) ? \count($iterable) : 0)); + + foreach ($iterable as $key => $value) { + yield $key => $value; + + $this->advance(); + } + + $this->finish(); + } + + /** + * Starts the progress output. + * + * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged + */ + public function start(int $max = null) + { + $this->startTime = time(); + $this->step = 0; + $this->percent = 0.0; + + if (null !== $max) { + $this->setMaxSteps($max); + } + + $this->display(); + } + + /** + * Advances the progress output X steps. + * + * @param int $step Number of steps to advance + */ + public function advance(int $step = 1) + { + $this->setProgress($this->step + $step); + } + + /** + * Sets whether to overwrite the progressbar, false for new line. + */ + public function setOverwrite(bool $overwrite) + { + $this->overwrite = $overwrite; + } + + public function setProgress(int $step) + { + if ($this->max && $step > $this->max) { + $this->max = $step; + } elseif ($step < 0) { + $step = 0; + } + + $redrawFreq = $this->redrawFreq ?? (($this->max ?: 10) / 10); + $prevPeriod = (int) ($this->step / $redrawFreq); + $currPeriod = (int) ($step / $redrawFreq); + $this->step = $step; + $this->percent = $this->max ? (float) $this->step / $this->max : 0; + $timeInterval = microtime(true) - $this->lastWriteTime; + + // Draw regardless of other limits + if ($this->max === $step) { + $this->display(); + + return; + } + + // Throttling + if ($timeInterval < $this->minSecondsBetweenRedraws) { + return; + } + + // Draw each step period, but not too late + if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) { + $this->display(); + } + } + + public function setMaxSteps(int $max) + { + $this->format = null; + $this->max = max(0, $max); + $this->stepWidth = $this->max ? Helper::strlen((string) $this->max) : 4; + } + + /** + * Finishes the progress output. + */ + public function finish(): void + { + if (!$this->max) { + $this->max = $this->step; + } + + if ($this->step === $this->max && !$this->overwrite) { + // prevent double 100% output + return; + } + + $this->setProgress($this->max); + } + + /** + * Outputs the current progress string. + */ + public function display(): void + { + if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { + return; + } + + if (null === $this->format) { + $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); + } + + $this->overwrite($this->buildLine()); + } + + /** + * Removes the progress bar from the current line. + * + * This is useful if you wish to write some output + * while a progress bar is running. + * Call display() to show the progress bar again. + */ + public function clear(): void + { + if (!$this->overwrite) { + return; + } + + if (null === $this->format) { + $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); + } + + $this->overwrite(''); + } + + private function setRealFormat(string $format) + { + // try to use the _nomax variant if available + if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) { + $this->format = self::getFormatDefinition($format.'_nomax'); + } elseif (null !== self::getFormatDefinition($format)) { + $this->format = self::getFormatDefinition($format); + } else { + $this->format = $format; + } + + $this->formatLineCount = substr_count($this->format, "\n"); + } + + /** + * Overwrites a previous message to the output. + */ + private function overwrite(string $message): void + { + if ($this->previousMessage === $message) { + return; + } + + $originalMessage = $message; + + if ($this->overwrite) { + if (null !== $this->previousMessage) { + if ($this->output instanceof ConsoleSectionOutput) { + $lines = floor(Helper::strlen($message) / $this->terminal->getWidth()) + $this->formatLineCount + 1; + $this->output->clear($lines); + } else { + if ($this->formatLineCount > 0) { + $this->cursor->moveUp($this->formatLineCount); + } + + $this->cursor->moveToColumn(1); + $this->cursor->clearLine(); + } + } + } elseif ($this->step > 0) { + $message = PHP_EOL.$message; + } + + $this->previousMessage = $originalMessage; + $this->lastWriteTime = microtime(true); + + $this->output->write($message); + ++$this->writeCount; + } + + private function determineBestFormat(): string + { + switch ($this->output->getVerbosity()) { + // OutputInterface::VERBOSITY_QUIET: display is disabled anyway + case OutputInterface::VERBOSITY_VERBOSE: + return $this->max ? 'verbose' : 'verbose_nomax'; + case OutputInterface::VERBOSITY_VERY_VERBOSE: + return $this->max ? 'very_verbose' : 'very_verbose_nomax'; + case OutputInterface::VERBOSITY_DEBUG: + return $this->max ? 'debug' : 'debug_nomax'; + default: + return $this->max ? 'normal' : 'normal_nomax'; + } + } + + private static function initPlaceholderFormatters(): array + { + return [ + 'bar' => function (self $bar, OutputInterface $output) { + $completeBars = $bar->getBarOffset(); + $display = str_repeat($bar->getBarCharacter(), $completeBars); + if ($completeBars < $bar->getBarWidth()) { + $emptyBars = $bar->getBarWidth() - $completeBars - Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter()); + $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars); + } + + return $display; + }, + 'elapsed' => function (self $bar) { + return Helper::formatTime(time() - $bar->getStartTime()); + }, + 'remaining' => function (self $bar) { + if (!$bar->getMaxSteps()) { + throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); + } + + return Helper::formatTime($bar->getRemaining()); + }, + 'estimated' => function (self $bar) { + if (!$bar->getMaxSteps()) { + throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); + } + + return Helper::formatTime($bar->getEstimated()); + }, + 'memory' => function (self $bar) { + return Helper::formatMemory(memory_get_usage(true)); + }, + 'current' => function (self $bar) { + return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', STR_PAD_LEFT); + }, + 'max' => function (self $bar) { + return $bar->getMaxSteps(); + }, + 'percent' => function (self $bar) { + return floor($bar->getProgressPercent() * 100); + }, + ]; + } + + private static function initFormats(): array + { + return [ + 'normal' => ' %current%/%max% [%bar%] %percent:3s%%', + 'normal_nomax' => ' %current% [%bar%]', + + 'verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', + 'verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', + + 'very_verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', + 'very_verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', + + 'debug' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', + 'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%', + ]; + } + + private function buildLine(): string + { + $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i"; + $callback = function ($matches) { + if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { + $text = $formatter($this, $this->output); + } elseif (isset($this->messages[$matches[1]])) { + $text = $this->messages[$matches[1]]; + } else { + return $matches[0]; + } + + if (isset($matches[2])) { + $text = sprintf('%'.$matches[2], $text); + } + + return $text; + }; + $line = preg_replace_callback($regex, $callback, $this->format); + + // gets string length for each sub line with multiline format + $linesLength = array_map(function ($subLine) { + return Helper::strlenWithoutDecoration($this->output->getFormatter(), rtrim($subLine, "\r")); + }, explode("\n", $line)); + + $linesWidth = max($linesLength); + + $terminalWidth = $this->terminal->getWidth(); + if ($linesWidth <= $terminalWidth) { + return $line; + } + + $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth); + + return preg_replace_callback($regex, $callback, $this->format); + } +} diff --git a/vendor/symfony/console/Helper/ProgressIndicator.php b/vendor/symfony/console/Helper/ProgressIndicator.php new file mode 100644 index 0000000..81cb783 --- /dev/null +++ b/vendor/symfony/console/Helper/ProgressIndicator.php @@ -0,0 +1,254 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * @author Kevin Bond + */ +class ProgressIndicator +{ + private $output; + private $startTime; + private $format; + private $message; + private $indicatorValues; + private $indicatorCurrent; + private $indicatorChangeInterval; + private $indicatorUpdateTime; + private $started = false; + + private static $formatters; + private static $formats; + + /** + * @param int $indicatorChangeInterval Change interval in milliseconds + * @param array|null $indicatorValues Animated indicator characters + */ + public function __construct(OutputInterface $output, string $format = null, int $indicatorChangeInterval = 100, array $indicatorValues = null) + { + $this->output = $output; + + if (null === $format) { + $format = $this->determineBestFormat(); + } + + if (null === $indicatorValues) { + $indicatorValues = ['-', '\\', '|', '/']; + } + + $indicatorValues = array_values($indicatorValues); + + if (2 > \count($indicatorValues)) { + throw new InvalidArgumentException('Must have at least 2 indicator value characters.'); + } + + $this->format = self::getFormatDefinition($format); + $this->indicatorChangeInterval = $indicatorChangeInterval; + $this->indicatorValues = $indicatorValues; + $this->startTime = time(); + } + + /** + * Sets the current indicator message. + */ + public function setMessage(?string $message) + { + $this->message = $message; + + $this->display(); + } + + /** + * Starts the indicator output. + */ + public function start(string $message) + { + if ($this->started) { + throw new LogicException('Progress indicator already started.'); + } + + $this->message = $message; + $this->started = true; + $this->startTime = time(); + $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; + $this->indicatorCurrent = 0; + + $this->display(); + } + + /** + * Advances the indicator. + */ + public function advance() + { + if (!$this->started) { + throw new LogicException('Progress indicator has not yet been started.'); + } + + if (!$this->output->isDecorated()) { + return; + } + + $currentTime = $this->getCurrentTimeInMilliseconds(); + + if ($currentTime < $this->indicatorUpdateTime) { + return; + } + + $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval; + ++$this->indicatorCurrent; + + $this->display(); + } + + /** + * Finish the indicator with message. + * + * @param $message + */ + public function finish(string $message) + { + if (!$this->started) { + throw new LogicException('Progress indicator has not yet been started.'); + } + + $this->message = $message; + $this->display(); + $this->output->writeln(''); + $this->started = false; + } + + /** + * Gets the format for a given name. + * + * @return string|null A format string + */ + public static function getFormatDefinition(string $name) + { + if (!self::$formats) { + self::$formats = self::initFormats(); + } + + return isset(self::$formats[$name]) ? self::$formats[$name] : null; + } + + /** + * Sets a placeholder formatter for a given name. + * + * This method also allow you to override an existing placeholder. + */ + public static function setPlaceholderFormatterDefinition(string $name, callable $callable) + { + if (!self::$formatters) { + self::$formatters = self::initPlaceholderFormatters(); + } + + self::$formatters[$name] = $callable; + } + + /** + * Gets the placeholder formatter for a given name (including the delimiter char like %). + * + * @return callable|null A PHP callable + */ + public static function getPlaceholderFormatterDefinition(string $name) + { + if (!self::$formatters) { + self::$formatters = self::initPlaceholderFormatters(); + } + + return isset(self::$formatters[$name]) ? self::$formatters[$name] : null; + } + + private function display() + { + if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { + return; + } + + $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) { + if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) { + return $formatter($this); + } + + return $matches[0]; + }, $this->format)); + } + + private function determineBestFormat(): string + { + switch ($this->output->getVerbosity()) { + // OutputInterface::VERBOSITY_QUIET: display is disabled anyway + case OutputInterface::VERBOSITY_VERBOSE: + return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi'; + case OutputInterface::VERBOSITY_VERY_VERBOSE: + case OutputInterface::VERBOSITY_DEBUG: + return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi'; + default: + return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi'; + } + } + + /** + * Overwrites a previous message to the output. + */ + private function overwrite(string $message) + { + if ($this->output->isDecorated()) { + $this->output->write("\x0D\x1B[2K"); + $this->output->write($message); + } else { + $this->output->writeln($message); + } + } + + private function getCurrentTimeInMilliseconds(): float + { + return round(microtime(true) * 1000); + } + + private static function initPlaceholderFormatters(): array + { + return [ + 'indicator' => function (self $indicator) { + return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)]; + }, + 'message' => function (self $indicator) { + return $indicator->message; + }, + 'elapsed' => function (self $indicator) { + return Helper::formatTime(time() - $indicator->startTime); + }, + 'memory' => function () { + return Helper::formatMemory(memory_get_usage(true)); + }, + ]; + } + + private static function initFormats(): array + { + return [ + 'normal' => ' %indicator% %message%', + 'normal_no_ansi' => ' %message%', + + 'verbose' => ' %indicator% %message% (%elapsed:6s%)', + 'verbose_no_ansi' => ' %message% (%elapsed:6s%)', + + 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)', + 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)', + ]; + } +} diff --git a/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/symfony/console/Helper/QuestionHelper.php new file mode 100644 index 0000000..97ccf68 --- /dev/null +++ b/vendor/symfony/console/Helper/QuestionHelper.php @@ -0,0 +1,527 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Cursor; +use Symfony\Component\Console\Exception\MissingInputException; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Formatter\OutputFormatterStyle; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\StreamableInputInterface; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\ConsoleSectionOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ChoiceQuestion; +use Symfony\Component\Console\Question\Question; +use Symfony\Component\Console\Terminal; +use function Symfony\Component\String\s; + +/** + * The QuestionHelper class provides helpers to interact with the user. + * + * @author Fabien Potencier + */ +class QuestionHelper extends Helper +{ + private $inputStream; + private static $shell; + private static $stty = true; + + /** + * Asks a question to the user. + * + * @return mixed The user answer + * + * @throws RuntimeException If there is no data to read in the input stream + */ + public function ask(InputInterface $input, OutputInterface $output, Question $question) + { + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + + if (!$input->isInteractive()) { + return $this->getDefaultAnswer($question); + } + + if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) { + $this->inputStream = $stream; + } + + try { + if (!$question->getValidator()) { + return $this->doAsk($output, $question); + } + + $interviewer = function () use ($output, $question) { + return $this->doAsk($output, $question); + }; + + return $this->validateAttempts($interviewer, $output, $question); + } catch (MissingInputException $exception) { + $input->setInteractive(false); + + if (null === $fallbackOutput = $this->getDefaultAnswer($question)) { + throw $exception; + } + + return $fallbackOutput; + } + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'question'; + } + + /** + * Prevents usage of stty. + */ + public static function disableStty() + { + self::$stty = false; + } + + /** + * Asks the question to the user. + * + * @return bool|mixed|string|null + * + * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden + */ + private function doAsk(OutputInterface $output, Question $question) + { + $this->writePrompt($output, $question); + + $inputStream = $this->inputStream ?: fopen('php://stdin', 'r'); + $autocomplete = $question->getAutocompleterCallback(); + + if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) { + $ret = false; + if ($question->isHidden()) { + try { + $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable()); + $ret = $question->isTrimmable() ? trim($hiddenResponse) : $hiddenResponse; + } catch (RuntimeException $e) { + if (!$question->isHiddenFallback()) { + throw $e; + } + } + } + + if (false === $ret) { + $ret = fgets($inputStream, 4096); + if (false === $ret) { + throw new MissingInputException('Aborted.'); + } + if ($question->isTrimmable()) { + $ret = trim($ret); + } + } + } else { + $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete); + $ret = $question->isTrimmable() ? trim($autocomplete) : $autocomplete; + } + + if ($output instanceof ConsoleSectionOutput) { + $output->addContent($ret); + } + + $ret = \strlen($ret) > 0 ? $ret : $question->getDefault(); + + if ($normalizer = $question->getNormalizer()) { + return $normalizer($ret); + } + + return $ret; + } + + /** + * @return mixed + */ + private function getDefaultAnswer(Question $question) + { + $default = $question->getDefault(); + + if (null === $default) { + return $default; + } + + if ($validator = $question->getValidator()) { + return \call_user_func($question->getValidator(), $default); + } elseif ($question instanceof ChoiceQuestion) { + $choices = $question->getChoices(); + + if (!$question->isMultiselect()) { + return isset($choices[$default]) ? $choices[$default] : $default; + } + + $default = explode(',', $default); + foreach ($default as $k => $v) { + $v = $question->isTrimmable() ? trim($v) : $v; + $default[$k] = isset($choices[$v]) ? $choices[$v] : $v; + } + } + + return $default; + } + + /** + * Outputs the question prompt. + */ + protected function writePrompt(OutputInterface $output, Question $question) + { + $message = $question->getQuestion(); + + if ($question instanceof ChoiceQuestion) { + $output->writeln(array_merge([ + $question->getQuestion(), + ], $this->formatChoiceQuestionChoices($question, 'info'))); + + $message = $question->getPrompt(); + } + + $output->write($message); + } + + /** + * @return string[] + */ + protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag) + { + $messages = []; + + $maxWidth = max(array_map('self::strlen', array_keys($choices = $question->getChoices()))); + + foreach ($choices as $key => $value) { + $padding = str_repeat(' ', $maxWidth - self::strlen($key)); + + $messages[] = sprintf(" [<$tag>%s$padding] %s", $key, $value); + } + + return $messages; + } + + /** + * Outputs an error message. + */ + protected function writeError(OutputInterface $output, \Exception $error) + { + if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) { + $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'); + } else { + $message = ''.$error->getMessage().''; + } + + $output->writeln($message); + } + + /** + * Autocompletes a question. + * + * @param resource $inputStream + */ + private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete): string + { + $cursor = new Cursor($output, $inputStream); + + $fullChoice = ''; + $ret = ''; + + $i = 0; + $ofs = -1; + $matches = $autocomplete($ret); + $numMatches = \count($matches); + + $sttyMode = shell_exec('stty -g'); + + // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) + shell_exec('stty -icanon -echo'); + + // Add highlighted text style + $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); + + // Read a keypress + while (!feof($inputStream)) { + $c = fread($inputStream, 1); + + // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false. + if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) { + shell_exec(sprintf('stty %s', $sttyMode)); + throw new MissingInputException('Aborted.'); + } elseif ("\177" === $c) { // Backspace Character + if (0 === $numMatches && 0 !== $i) { + --$i; + $cursor->moveLeft(s($fullChoice)->slice(-1)->width(false)); + + $fullChoice = self::substr($fullChoice, 0, $i); + } + + if (0 === $i) { + $ofs = -1; + $matches = $autocomplete($ret); + $numMatches = \count($matches); + } else { + $numMatches = 0; + } + + // Pop the last character off the end of our string + $ret = self::substr($ret, 0, $i); + } elseif ("\033" === $c) { + // Did we read an escape sequence? + $c .= fread($inputStream, 2); + + // A = Up Arrow. B = Down Arrow + if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { + if ('A' === $c[2] && -1 === $ofs) { + $ofs = 0; + } + + if (0 === $numMatches) { + continue; + } + + $ofs += ('A' === $c[2]) ? -1 : 1; + $ofs = ($numMatches + $ofs) % $numMatches; + } + } elseif (\ord($c) < 32) { + if ("\t" === $c || "\n" === $c) { + if ($numMatches > 0 && -1 !== $ofs) { + $ret = (string) $matches[$ofs]; + // Echo out remaining chars for current match + $remainingCharacters = substr($ret, \strlen(trim($this->mostRecentlyEnteredValue($fullChoice)))); + $output->write($remainingCharacters); + $fullChoice .= $remainingCharacters; + $i = self::strlen($fullChoice); + + $matches = array_filter( + $autocomplete($ret), + function ($match) use ($ret) { + return '' === $ret || 0 === strpos($match, $ret); + } + ); + $numMatches = \count($matches); + $ofs = -1; + } + + if ("\n" === $c) { + $output->write($c); + break; + } + + $numMatches = 0; + } + + continue; + } else { + if ("\x80" <= $c) { + $c .= fread($inputStream, ["\xC0" => 1, "\xD0" => 1, "\xE0" => 2, "\xF0" => 3][$c & "\xF0"]); + } + + $output->write($c); + $ret .= $c; + $fullChoice .= $c; + ++$i; + + $tempRet = $ret; + + if ($question instanceof ChoiceQuestion && $question->isMultiselect()) { + $tempRet = $this->mostRecentlyEnteredValue($fullChoice); + } + + $numMatches = 0; + $ofs = 0; + + foreach ($autocomplete($ret) as $value) { + // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) + if (0 === strpos($value, $tempRet)) { + $matches[$numMatches++] = $value; + } + } + } + + $cursor->clearLineAfter(); + + if ($numMatches > 0 && -1 !== $ofs) { + $cursor->savePosition(); + // Write highlighted text, complete the partially entered response + $charactersEntered = \strlen(trim($this->mostRecentlyEnteredValue($fullChoice))); + $output->write(''.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $charactersEntered)).''); + $cursor->restorePosition(); + } + } + + // Reset stty so it behaves normally again + shell_exec(sprintf('stty %s', $sttyMode)); + + return $fullChoice; + } + + private function mostRecentlyEnteredValue(string $entered): string + { + // Determine the most recent value that the user entered + if (false === strpos($entered, ',')) { + return $entered; + } + + $choices = explode(',', $entered); + if (\strlen($lastChoice = trim($choices[\count($choices) - 1])) > 0) { + return $lastChoice; + } + + return $entered; + } + + /** + * Gets a hidden response from user. + * + * @param resource $inputStream The handler resource + * @param bool $trimmable Is the answer trimmable + * + * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden + */ + private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = true): string + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $exe = __DIR__.'/../Resources/bin/hiddeninput.exe'; + + // handle code running from a phar + if ('phar:' === substr(__FILE__, 0, 5)) { + $tmpExe = sys_get_temp_dir().'/hiddeninput.exe'; + copy($exe, $tmpExe); + $exe = $tmpExe; + } + + $sExec = shell_exec($exe); + $value = $trimmable ? rtrim($sExec) : $sExec; + $output->writeln(''); + + if (isset($tmpExe)) { + unlink($tmpExe); + } + + return $value; + } + + if (self::$stty && Terminal::hasSttyAvailable()) { + $sttyMode = shell_exec('stty -g'); + + shell_exec('stty -echo'); + $value = fgets($inputStream, 4096); + shell_exec(sprintf('stty %s', $sttyMode)); + + if (false === $value) { + throw new MissingInputException('Aborted.'); + } + if ($trimmable) { + $value = trim($value); + } + $output->writeln(''); + + return $value; + } + + if (false !== $shell = $this->getShell()) { + $readCmd = 'csh' === $shell ? 'set mypassword = $<' : 'read -r mypassword'; + $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword' 2> /dev/null", $shell, $readCmd); + $sCommand = shell_exec($command); + $value = $trimmable ? rtrim($sCommand) : $sCommand; + $output->writeln(''); + + return $value; + } + + throw new RuntimeException('Unable to hide the response.'); + } + + /** + * Validates an attempt. + * + * @param callable $interviewer A callable that will ask for a question and return the result + * + * @return mixed The validated response + * + * @throws \Exception In case the max number of attempts has been reached and no valid response has been given + */ + private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question) + { + $error = null; + $attempts = $question->getMaxAttempts(); + + while (null === $attempts || $attempts--) { + if (null !== $error) { + $this->writeError($output, $error); + } + + try { + return $question->getValidator()($interviewer()); + } catch (RuntimeException $e) { + throw $e; + } catch (\Exception $error) { + } + + $attempts = $attempts ?? -(int) $this->askForever(); + } + + throw $error; + } + + /** + * Returns a valid unix shell. + * + * @return string|bool The valid shell name, false in case no valid shell is found + */ + private function getShell() + { + if (null !== self::$shell) { + return self::$shell; + } + + self::$shell = false; + + if (file_exists('/usr/bin/env')) { + // handle other OSs with bash/zsh/ksh/csh if available to hide the answer + $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null"; + foreach (['bash', 'zsh', 'ksh', 'csh'] as $sh) { + if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) { + self::$shell = $sh; + break; + } + } + } + + return self::$shell; + } + + private function askForever(): bool + { + $inputStream = $this->inputStream ?: fopen('php://stdin', 'r'); + + if ('php://stdin' !== (stream_get_meta_data($inputStream)['url'] ?? null)) { + return true; + } + + if (\function_exists('stream_isatty')) { + return stream_isatty($inputStream); + } + + if (\function_exists('posix_isatty')) { + return posix_isatty($inputStream); + } + + return true; + } +} diff --git a/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php new file mode 100644 index 0000000..e4e87b2 --- /dev/null +++ b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ChoiceQuestion; +use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\Console\Question\Question; +use Symfony\Component\Console\Style\SymfonyStyle; + +/** + * Symfony Style Guide compliant question helper. + * + * @author Kevin Bond + */ +class SymfonyQuestionHelper extends QuestionHelper +{ + /** + * {@inheritdoc} + */ + protected function writePrompt(OutputInterface $output, Question $question) + { + $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); + $default = $question->getDefault(); + + switch (true) { + case null === $default: + $text = sprintf(' %s:', $text); + + break; + + case $question instanceof ConfirmationQuestion: + $text = sprintf(' %s (yes/no) [%s]:', $text, $default ? 'yes' : 'no'); + + break; + + case $question instanceof ChoiceQuestion && $question->isMultiselect(): + $choices = $question->getChoices(); + $default = explode(',', $default); + + foreach ($default as $key => $value) { + $default[$key] = $choices[trim($value)]; + } + + $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape(implode(', ', $default))); + + break; + + case $question instanceof ChoiceQuestion: + $choices = $question->getChoices(); + $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape(isset($choices[$default]) ? $choices[$default] : $default)); + + break; + + default: + $text = sprintf(' %s [%s]:', $text, OutputFormatter::escape($default)); + } + + $output->writeln($text); + + $prompt = ' > '; + + if ($question instanceof ChoiceQuestion) { + $output->writeln($this->formatChoiceQuestionChoices($question, 'comment')); + + $prompt = $question->getPrompt(); + } + + $output->write($prompt); + } + + /** + * {@inheritdoc} + */ + protected function writeError(OutputInterface $output, \Exception $error) + { + if ($output instanceof SymfonyStyle) { + $output->newLine(); + $output->error($error->getMessage()); + + return; + } + + parent::writeError($output, $error); + } +} diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php new file mode 100644 index 0000000..7f3d4a3 --- /dev/null +++ b/vendor/symfony/console/Helper/Table.php @@ -0,0 +1,836 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; +use Symfony\Component\Console\Output\ConsoleSectionOutput; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Provides helpers to display a table. + * + * @author Fabien Potencier + * @author Саша Стаменковић + * @author Abdellatif Ait boudad + * @author Max Grigorian + * @author Dany Maillard + */ +class Table +{ + private const SEPARATOR_TOP = 0; + private const SEPARATOR_TOP_BOTTOM = 1; + private const SEPARATOR_MID = 2; + private const SEPARATOR_BOTTOM = 3; + private const BORDER_OUTSIDE = 0; + private const BORDER_INSIDE = 1; + + private $headerTitle; + private $footerTitle; + + /** + * Table headers. + */ + private $headers = []; + + /** + * Table rows. + */ + private $rows = []; + private $horizontal = false; + + /** + * Column widths cache. + */ + private $effectiveColumnWidths = []; + + /** + * Number of columns cache. + * + * @var int + */ + private $numberOfColumns; + + /** + * @var OutputInterface + */ + private $output; + + /** + * @var TableStyle + */ + private $style; + + /** + * @var array + */ + private $columnStyles = []; + + /** + * User set column widths. + * + * @var array + */ + private $columnWidths = []; + private $columnMaxWidths = []; + + private static $styles; + + private $rendered = false; + + public function __construct(OutputInterface $output) + { + $this->output = $output; + + if (!self::$styles) { + self::$styles = self::initStyles(); + } + + $this->setStyle('default'); + } + + /** + * Sets a style definition. + */ + public static function setStyleDefinition(string $name, TableStyle $style) + { + if (!self::$styles) { + self::$styles = self::initStyles(); + } + + self::$styles[$name] = $style; + } + + /** + * Gets a style definition by name. + * + * @return TableStyle + */ + public static function getStyleDefinition(string $name) + { + if (!self::$styles) { + self::$styles = self::initStyles(); + } + + if (isset(self::$styles[$name])) { + return self::$styles[$name]; + } + + throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); + } + + /** + * Sets table style. + * + * @param TableStyle|string $name The style name or a TableStyle instance + * + * @return $this + */ + public function setStyle($name) + { + $this->style = $this->resolveStyle($name); + + return $this; + } + + /** + * Gets the current table style. + * + * @return TableStyle + */ + public function getStyle() + { + return $this->style; + } + + /** + * Sets table column style. + * + * @param TableStyle|string $name The style name or a TableStyle instance + * + * @return $this + */ + public function setColumnStyle(int $columnIndex, $name) + { + $this->columnStyles[$columnIndex] = $this->resolveStyle($name); + + return $this; + } + + /** + * Gets the current style for a column. + * + * If style was not set, it returns the global table style. + * + * @return TableStyle + */ + public function getColumnStyle(int $columnIndex) + { + return $this->columnStyles[$columnIndex] ?? $this->getStyle(); + } + + /** + * Sets the minimum width of a column. + * + * @return $this + */ + public function setColumnWidth(int $columnIndex, int $width) + { + $this->columnWidths[$columnIndex] = $width; + + return $this; + } + + /** + * Sets the minimum width of all columns. + * + * @return $this + */ + public function setColumnWidths(array $widths) + { + $this->columnWidths = []; + foreach ($widths as $index => $width) { + $this->setColumnWidth($index, $width); + } + + return $this; + } + + /** + * Sets the maximum width of a column. + * + * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while + * formatted strings are preserved. + * + * @return $this + */ + public function setColumnMaxWidth(int $columnIndex, int $width): self + { + if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) { + throw new \LogicException(sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, get_debug_type($this->output->getFormatter()))); + } + + $this->columnMaxWidths[$columnIndex] = $width; + + return $this; + } + + public function setHeaders(array $headers) + { + $headers = array_values($headers); + if (!empty($headers) && !\is_array($headers[0])) { + $headers = [$headers]; + } + + $this->headers = $headers; + + return $this; + } + + public function setRows(array $rows) + { + $this->rows = []; + + return $this->addRows($rows); + } + + public function addRows(array $rows) + { + foreach ($rows as $row) { + $this->addRow($row); + } + + return $this; + } + + public function addRow($row) + { + if ($row instanceof TableSeparator) { + $this->rows[] = $row; + + return $this; + } + + if (!\is_array($row)) { + throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.'); + } + + $this->rows[] = array_values($row); + + return $this; + } + + /** + * Adds a row to the table, and re-renders the table. + */ + public function appendRow($row): self + { + if (!$this->output instanceof ConsoleSectionOutput) { + throw new RuntimeException(sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__)); + } + + if ($this->rendered) { + $this->output->clear($this->calculateRowCount()); + } + + $this->addRow($row); + $this->render(); + + return $this; + } + + public function setRow($column, array $row) + { + $this->rows[$column] = $row; + + return $this; + } + + public function setHeaderTitle(?string $title): self + { + $this->headerTitle = $title; + + return $this; + } + + public function setFooterTitle(?string $title): self + { + $this->footerTitle = $title; + + return $this; + } + + public function setHorizontal(bool $horizontal = true): self + { + $this->horizontal = $horizontal; + + return $this; + } + + /** + * Renders table to output. + * + * Example: + * + * +---------------+-----------------------+------------------+ + * | ISBN | Title | Author | + * +---------------+-----------------------+------------------+ + * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | + * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | + * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | + * +---------------+-----------------------+------------------+ + */ + public function render() + { + $divider = new TableSeparator(); + if ($this->horizontal) { + $rows = []; + foreach ($this->headers[0] ?? [] as $i => $header) { + $rows[$i] = [$header]; + foreach ($this->rows as $row) { + if ($row instanceof TableSeparator) { + continue; + } + if (isset($row[$i])) { + $rows[$i][] = $row[$i]; + } elseif ($rows[$i][0] instanceof TableCell && $rows[$i][0]->getColspan() >= 2) { + // Noop, there is a "title" + } else { + $rows[$i][] = null; + } + } + } + } else { + $rows = array_merge($this->headers, [$divider], $this->rows); + } + + $this->calculateNumberOfColumns($rows); + + $rows = $this->buildTableRows($rows); + $this->calculateColumnsWidth($rows); + + $isHeader = !$this->horizontal; + $isFirstRow = $this->horizontal; + foreach ($rows as $row) { + if ($divider === $row) { + $isHeader = false; + $isFirstRow = true; + + continue; + } + if ($row instanceof TableSeparator) { + $this->renderRowSeparator(); + + continue; + } + if (!$row) { + continue; + } + + if ($isHeader || $isFirstRow) { + if ($isFirstRow) { + $this->renderRowSeparator(self::SEPARATOR_TOP_BOTTOM); + $isFirstRow = false; + } else { + $this->renderRowSeparator(self::SEPARATOR_TOP, $this->headerTitle, $this->style->getHeaderTitleFormat()); + } + } + if ($this->horizontal) { + $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); + } else { + $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); + } + } + $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); + + $this->cleanup(); + $this->rendered = true; + } + + /** + * Renders horizontal header separator. + * + * Example: + * + * +-----+-----------+-------+ + */ + private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) + { + if (0 === $count = $this->numberOfColumns) { + return; + } + + $borders = $this->style->getBorderChars(); + if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) { + return; + } + + $crossings = $this->style->getCrossingChars(); + if (self::SEPARATOR_MID === $type) { + list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[2], $crossings[8], $crossings[0], $crossings[4]]; + } elseif (self::SEPARATOR_TOP === $type) { + list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[0], $crossings[1], $crossings[2], $crossings[3]]; + } elseif (self::SEPARATOR_TOP_BOTTOM === $type) { + list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[0], $crossings[9], $crossings[10], $crossings[11]]; + } else { + list($horizontal, $leftChar, $midChar, $rightChar) = [$borders[0], $crossings[7], $crossings[6], $crossings[5]]; + } + + $markup = $leftChar; + for ($column = 0; $column < $count; ++$column) { + $markup .= str_repeat($horizontal, $this->effectiveColumnWidths[$column]); + $markup .= $column === $count - 1 ? $rightChar : $midChar; + } + + if (null !== $title) { + $titleLength = Helper::strlenWithoutDecoration($formatter = $this->output->getFormatter(), $formattedTitle = sprintf($titleFormat, $title)); + $markupLength = Helper::strlen($markup); + if ($titleLength > $limit = $markupLength - 4) { + $titleLength = $limit; + $formatLength = Helper::strlenWithoutDecoration($formatter, sprintf($titleFormat, '')); + $formattedTitle = sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...'); + } + + $titleStart = ($markupLength - $titleLength) / 2; + if (false === mb_detect_encoding($markup, null, true)) { + $markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength); + } else { + $markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength); + } + } + + $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup)); + } + + /** + * Renders vertical column separator. + */ + private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string + { + $borders = $this->style->getBorderChars(); + + return sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]); + } + + /** + * Renders table row. + * + * Example: + * + * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | + */ + private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null) + { + $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); + $columns = $this->getRowColumns($row); + $last = \count($columns) - 1; + foreach ($columns as $i => $column) { + if ($firstCellFormat && 0 === $i) { + $rowContent .= $this->renderCell($row, $column, $firstCellFormat); + } else { + $rowContent .= $this->renderCell($row, $column, $cellFormat); + } + $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE); + } + $this->output->writeln($rowContent); + } + + /** + * Renders table cell with padding. + */ + private function renderCell(array $row, int $column, string $cellFormat): string + { + $cell = isset($row[$column]) ? $row[$column] : ''; + $width = $this->effectiveColumnWidths[$column]; + if ($cell instanceof TableCell && $cell->getColspan() > 1) { + // add the width of the following columns(numbers of colspan). + foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) { + $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn]; + } + } + + // str_pad won't work properly with multi-byte strings, we need to fix the padding + if (false !== $encoding = mb_detect_encoding($cell, null, true)) { + $width += \strlen($cell) - mb_strwidth($cell, $encoding); + } + + $style = $this->getColumnStyle($column); + + if ($cell instanceof TableSeparator) { + return sprintf($style->getBorderFormat(), str_repeat($style->getBorderChars()[2], $width)); + } + + $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell); + $content = sprintf($style->getCellRowContentFormat(), $cell); + + return sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $style->getPadType())); + } + + /** + * Calculate number of columns for this table. + */ + private function calculateNumberOfColumns(array $rows) + { + $columns = [0]; + foreach ($rows as $row) { + if ($row instanceof TableSeparator) { + continue; + } + + $columns[] = $this->getNumberOfColumns($row); + } + + $this->numberOfColumns = max($columns); + } + + private function buildTableRows(array $rows): TableRows + { + /** @var WrappableOutputFormatterInterface $formatter */ + $formatter = $this->output->getFormatter(); + $unmergedRows = []; + for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) { + $rows = $this->fillNextRows($rows, $rowKey); + + // Remove any new line breaks and replace it with a new line + foreach ($rows[$rowKey] as $column => $cell) { + $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1; + + if (isset($this->columnMaxWidths[$column]) && Helper::strlenWithoutDecoration($formatter, $cell) > $this->columnMaxWidths[$column]) { + $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column] * $colspan); + } + if (!strstr($cell, "\n")) { + continue; + } + $escaped = implode("\n", array_map([OutputFormatter::class, 'escapeTrailingBackslash'], explode("\n", $cell))); + $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; + $lines = explode("\n", str_replace("\n", "\n", $cell)); + foreach ($lines as $lineKey => $line) { + if ($colspan > 1) { + $line = new TableCell($line, ['colspan' => $colspan]); + } + if (0 === $lineKey) { + $rows[$rowKey][$column] = $line; + } else { + $unmergedRows[$rowKey][$lineKey][$column] = $line; + } + } + } + } + + return new TableRows(function () use ($rows, $unmergedRows): \Traversable { + foreach ($rows as $rowKey => $row) { + yield $this->fillCells($row); + + if (isset($unmergedRows[$rowKey])) { + foreach ($unmergedRows[$rowKey] as $row) { + yield $row; + } + } + } + }); + } + + private function calculateRowCount(): int + { + $numberOfRows = \count(iterator_to_array($this->buildTableRows(array_merge($this->headers, [new TableSeparator()], $this->rows)))); + + if ($this->headers) { + ++$numberOfRows; // Add row for header separator + } + + if (\count($this->rows) > 0) { + ++$numberOfRows; // Add row for footer separator + } + + return $numberOfRows; + } + + /** + * fill rows that contains rowspan > 1. + * + * @throws InvalidArgumentException + */ + private function fillNextRows(array $rows, int $line): array + { + $unmergedRows = []; + foreach ($rows[$line] as $column => $cell) { + if (null !== $cell && !$cell instanceof TableCell && !is_scalar($cell) && !(\is_object($cell) && method_exists($cell, '__toString'))) { + throw new InvalidArgumentException(sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', get_debug_type($cell))); + } + if ($cell instanceof TableCell && $cell->getRowspan() > 1) { + $nbLines = $cell->getRowspan() - 1; + $lines = [$cell]; + if (strstr($cell, "\n")) { + $lines = explode("\n", str_replace("\n", "\n", $cell)); + $nbLines = \count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines; + + $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan()]); + unset($lines[0]); + } + + // create a two dimensional array (rowspan x colspan) + $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows); + foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { + $value = isset($lines[$unmergedRowKey - $line]) ? $lines[$unmergedRowKey - $line] : ''; + $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan()]); + if ($nbLines === $unmergedRowKey - $line) { + break; + } + } + } + } + + foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { + // we need to know if $unmergedRow will be merged or inserted into $rows + if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) { + foreach ($unmergedRow as $cellKey => $cell) { + // insert cell into row at cellKey position + array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]); + } + } else { + $row = $this->copyRow($rows, $unmergedRowKey - 1); + foreach ($unmergedRow as $column => $cell) { + if (!empty($cell)) { + $row[$column] = $unmergedRow[$column]; + } + } + array_splice($rows, $unmergedRowKey, 0, [$row]); + } + } + + return $rows; + } + + /** + * fill cells for a row that contains colspan > 1. + */ + private function fillCells($row) + { + $newRow = []; + foreach ($row as $column => $cell) { + $newRow[] = $cell; + if ($cell instanceof TableCell && $cell->getColspan() > 1) { + foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) { + // insert empty value at column position + $newRow[] = ''; + } + } + } + + return $newRow ?: $row; + } + + private function copyRow(array $rows, int $line): array + { + $row = $rows[$line]; + foreach ($row as $cellKey => $cellValue) { + $row[$cellKey] = ''; + if ($cellValue instanceof TableCell) { + $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]); + } + } + + return $row; + } + + /** + * Gets number of columns by row. + */ + private function getNumberOfColumns(array $row): int + { + $columns = \count($row); + foreach ($row as $column) { + $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0; + } + + return $columns; + } + + /** + * Gets list of columns for the given row. + */ + private function getRowColumns(array $row): array + { + $columns = range(0, $this->numberOfColumns - 1); + foreach ($row as $cellKey => $cell) { + if ($cell instanceof TableCell && $cell->getColspan() > 1) { + // exclude grouped columns. + $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1)); + } + } + + return $columns; + } + + /** + * Calculates columns widths. + */ + private function calculateColumnsWidth(iterable $rows) + { + for ($column = 0; $column < $this->numberOfColumns; ++$column) { + $lengths = []; + foreach ($rows as $row) { + if ($row instanceof TableSeparator) { + continue; + } + + foreach ($row as $i => $cell) { + if ($cell instanceof TableCell) { + $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); + $textLength = Helper::strlen($textContent); + if ($textLength > 0) { + $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); + foreach ($contentColumns as $position => $content) { + $row[$i + $position] = $content; + } + } + } + } + + $lengths[] = $this->getCellWidth($row, $column); + } + + $this->effectiveColumnWidths[$column] = max($lengths) + Helper::strlen($this->style->getCellRowContentFormat()) - 2; + } + } + + private function getColumnSeparatorWidth(): int + { + return Helper::strlen(sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3])); + } + + private function getCellWidth(array $row, int $column): int + { + $cellWidth = 0; + + if (isset($row[$column])) { + $cell = $row[$column]; + $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell); + } + + $columnWidth = isset($this->columnWidths[$column]) ? $this->columnWidths[$column] : 0; + $cellWidth = max($cellWidth, $columnWidth); + + return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth; + } + + /** + * Called after rendering to cleanup cache data. + */ + private function cleanup() + { + $this->effectiveColumnWidths = []; + $this->numberOfColumns = null; + } + + private static function initStyles(): array + { + $borderless = new TableStyle(); + $borderless + ->setHorizontalBorderChars('=') + ->setVerticalBorderChars(' ') + ->setDefaultCrossingChar(' ') + ; + + $compact = new TableStyle(); + $compact + ->setHorizontalBorderChars('') + ->setVerticalBorderChars(' ') + ->setDefaultCrossingChar('') + ->setCellRowContentFormat('%s') + ; + + $styleGuide = new TableStyle(); + $styleGuide + ->setHorizontalBorderChars('-') + ->setVerticalBorderChars(' ') + ->setDefaultCrossingChar(' ') + ->setCellHeaderFormat('%s') + ; + + $box = (new TableStyle()) + ->setHorizontalBorderChars('─') + ->setVerticalBorderChars('│') + ->setCrossingChars('┼', '┌', '┬', 'â”', '┤', '┘', 'â”´', 'â””', '├') + ; + + $boxDouble = (new TableStyle()) + ->setHorizontalBorderChars('â•', '─') + ->setVerticalBorderChars('â•‘', '│') + ->setCrossingChars('┼', 'â•”', '╤', 'â•—', 'â•¢', 'â•', 'â•§', '╚', '╟', 'â• ', '╪', 'â•£') + ; + + return [ + 'default' => new TableStyle(), + 'borderless' => $borderless, + 'compact' => $compact, + 'symfony-style-guide' => $styleGuide, + 'box' => $box, + 'box-double' => $boxDouble, + ]; + } + + private function resolveStyle($name): TableStyle + { + if ($name instanceof TableStyle) { + return $name; + } + + if (isset(self::$styles[$name])) { + return self::$styles[$name]; + } + + throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); + } +} diff --git a/vendor/symfony/console/Helper/TableCell.php b/vendor/symfony/console/Helper/TableCell.php new file mode 100644 index 0000000..5b6af4a --- /dev/null +++ b/vendor/symfony/console/Helper/TableCell.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Exception\InvalidArgumentException; + +/** + * @author Abdellatif Ait boudad + */ +class TableCell +{ + private $value; + private $options = [ + 'rowspan' => 1, + 'colspan' => 1, + ]; + + public function __construct(string $value = '', array $options = []) + { + $this->value = $value; + + // check option names + if ($diff = array_diff(array_keys($options), array_keys($this->options))) { + throw new InvalidArgumentException(sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff))); + } + + $this->options = array_merge($this->options, $options); + } + + /** + * Returns the cell value. + * + * @return string + */ + public function __toString() + { + return $this->value; + } + + /** + * Gets number of colspan. + * + * @return int + */ + public function getColspan() + { + return (int) $this->options['colspan']; + } + + /** + * Gets number of rowspan. + * + * @return int + */ + public function getRowspan() + { + return (int) $this->options['rowspan']; + } +} diff --git a/vendor/symfony/console/Helper/TableRows.php b/vendor/symfony/console/Helper/TableRows.php new file mode 100644 index 0000000..16aabb3 --- /dev/null +++ b/vendor/symfony/console/Helper/TableRows.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +/** + * @internal + */ +class TableRows implements \IteratorAggregate +{ + private $generator; + + public function __construct(callable $generator) + { + $this->generator = $generator; + } + + public function getIterator(): \Traversable + { + $g = $this->generator; + + return $g(); + } +} diff --git a/vendor/symfony/console/Helper/TableSeparator.php b/vendor/symfony/console/Helper/TableSeparator.php new file mode 100644 index 0000000..e541c53 --- /dev/null +++ b/vendor/symfony/console/Helper/TableSeparator.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +/** + * Marks a row as being a separator. + * + * @author Fabien Potencier + */ +class TableSeparator extends TableCell +{ + public function __construct(array $options = []) + { + parent::__construct('', $options); + } +} diff --git a/vendor/symfony/console/Helper/TableStyle.php b/vendor/symfony/console/Helper/TableStyle.php new file mode 100644 index 0000000..28c950c --- /dev/null +++ b/vendor/symfony/console/Helper/TableStyle.php @@ -0,0 +1,364 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; + +/** + * Defines the styles for a Table. + * + * @author Fabien Potencier + * @author Саша Стаменковић + * @author Dany Maillard + */ +class TableStyle +{ + private $paddingChar = ' '; + private $horizontalOutsideBorderChar = '-'; + private $horizontalInsideBorderChar = '-'; + private $verticalOutsideBorderChar = '|'; + private $verticalInsideBorderChar = '|'; + private $crossingChar = '+'; + private $crossingTopRightChar = '+'; + private $crossingTopMidChar = '+'; + private $crossingTopLeftChar = '+'; + private $crossingMidRightChar = '+'; + private $crossingBottomRightChar = '+'; + private $crossingBottomMidChar = '+'; + private $crossingBottomLeftChar = '+'; + private $crossingMidLeftChar = '+'; + private $crossingTopLeftBottomChar = '+'; + private $crossingTopMidBottomChar = '+'; + private $crossingTopRightBottomChar = '+'; + private $headerTitleFormat = ' %s '; + private $footerTitleFormat = ' %s '; + private $cellHeaderFormat = '%s'; + private $cellRowFormat = '%s'; + private $cellRowContentFormat = ' %s '; + private $borderFormat = '%s'; + private $padType = STR_PAD_RIGHT; + + /** + * Sets padding character, used for cell padding. + * + * @return $this + */ + public function setPaddingChar(string $paddingChar) + { + if (!$paddingChar) { + throw new LogicException('The padding char must not be empty.'); + } + + $this->paddingChar = $paddingChar; + + return $this; + } + + /** + * Gets padding character, used for cell padding. + * + * @return string + */ + public function getPaddingChar() + { + return $this->paddingChar; + } + + /** + * Sets horizontal border characters. + * + * + * â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— + * 1 ISBN 2 Title │ Author â•‘ + * â• â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╪â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╪â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•£ + * â•‘ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri â•‘ + * â•‘ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens â•‘ + * â•‘ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien â•‘ + * â•‘ 80-902734-1-6 │ And Then There Were None │ Agatha Christie â•‘ + * ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• + * + */ + public function setHorizontalBorderChars(string $outside, string $inside = null): self + { + $this->horizontalOutsideBorderChar = $outside; + $this->horizontalInsideBorderChar = $inside ?? $outside; + + return $this; + } + + /** + * Sets vertical border characters. + * + * + * â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╤â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— + * â•‘ ISBN │ Title │ Author â•‘ + * â• â•â•â•â•â•â•â•1â•â•â•â•â•â•â•╪â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•╪â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•£ + * â•‘ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri â•‘ + * â•‘ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens â•‘ + * ╟───────2───────┼──────────────────────────┼──────────────────╢ + * â•‘ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien â•‘ + * â•‘ 80-902734-1-6 │ And Then There Were None │ Agatha Christie â•‘ + * ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•§â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• + * + */ + public function setVerticalBorderChars(string $outside, string $inside = null): self + { + $this->verticalOutsideBorderChar = $outside; + $this->verticalInsideBorderChar = $inside ?? $outside; + + return $this; + } + + /** + * Gets border characters. + * + * @internal + */ + public function getBorderChars(): array + { + return [ + $this->horizontalOutsideBorderChar, + $this->verticalOutsideBorderChar, + $this->horizontalInsideBorderChar, + $this->verticalInsideBorderChar, + ]; + } + + /** + * Sets crossing characters. + * + * Example: + * + * 1â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•2â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•2â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•3 + * â•‘ ISBN │ Title │ Author â•‘ + * 8'â•â•â•â•â•â•â•â•â•â•â•â•â•â•0'â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•0'â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•4' + * â•‘ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri â•‘ + * â•‘ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens â•‘ + * 8───────────────0──────────────────────────0──────────────────4 + * â•‘ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien â•‘ + * â•‘ 80-902734-1-6 │ And Then There Were None │ Agatha Christie â•‘ + * 7â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•6â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•6â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•5 + * + * + * @param string $cross Crossing char (see #0 of example) + * @param string $topLeft Top left char (see #1 of example) + * @param string $topMid Top mid char (see #2 of example) + * @param string $topRight Top right char (see #3 of example) + * @param string $midRight Mid right char (see #4 of example) + * @param string $bottomRight Bottom right char (see #5 of example) + * @param string $bottomMid Bottom mid char (see #6 of example) + * @param string $bottomLeft Bottom left char (see #7 of example) + * @param string $midLeft Mid left char (see #8 of example) + * @param string|null $topLeftBottom Top left bottom char (see #8' of example), equals to $midLeft if null + * @param string|null $topMidBottom Top mid bottom char (see #0' of example), equals to $cross if null + * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null + */ + public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null): self + { + $this->crossingChar = $cross; + $this->crossingTopLeftChar = $topLeft; + $this->crossingTopMidChar = $topMid; + $this->crossingTopRightChar = $topRight; + $this->crossingMidRightChar = $midRight; + $this->crossingBottomRightChar = $bottomRight; + $this->crossingBottomMidChar = $bottomMid; + $this->crossingBottomLeftChar = $bottomLeft; + $this->crossingMidLeftChar = $midLeft; + $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft; + $this->crossingTopMidBottomChar = $topMidBottom ?? $cross; + $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight; + + return $this; + } + + /** + * Sets default crossing character used for each cross. + * + * @see {@link setCrossingChars()} for setting each crossing individually. + */ + public function setDefaultCrossingChar(string $char): self + { + return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char); + } + + /** + * Gets crossing character. + * + * @return string + */ + public function getCrossingChar() + { + return $this->crossingChar; + } + + /** + * Gets crossing characters. + * + * @internal + */ + public function getCrossingChars(): array + { + return [ + $this->crossingChar, + $this->crossingTopLeftChar, + $this->crossingTopMidChar, + $this->crossingTopRightChar, + $this->crossingMidRightChar, + $this->crossingBottomRightChar, + $this->crossingBottomMidChar, + $this->crossingBottomLeftChar, + $this->crossingMidLeftChar, + $this->crossingTopLeftBottomChar, + $this->crossingTopMidBottomChar, + $this->crossingTopRightBottomChar, + ]; + } + + /** + * Sets header cell format. + * + * @return $this + */ + public function setCellHeaderFormat(string $cellHeaderFormat) + { + $this->cellHeaderFormat = $cellHeaderFormat; + + return $this; + } + + /** + * Gets header cell format. + * + * @return string + */ + public function getCellHeaderFormat() + { + return $this->cellHeaderFormat; + } + + /** + * Sets row cell format. + * + * @return $this + */ + public function setCellRowFormat(string $cellRowFormat) + { + $this->cellRowFormat = $cellRowFormat; + + return $this; + } + + /** + * Gets row cell format. + * + * @return string + */ + public function getCellRowFormat() + { + return $this->cellRowFormat; + } + + /** + * Sets row cell content format. + * + * @return $this + */ + public function setCellRowContentFormat(string $cellRowContentFormat) + { + $this->cellRowContentFormat = $cellRowContentFormat; + + return $this; + } + + /** + * Gets row cell content format. + * + * @return string + */ + public function getCellRowContentFormat() + { + return $this->cellRowContentFormat; + } + + /** + * Sets table border format. + * + * @return $this + */ + public function setBorderFormat(string $borderFormat) + { + $this->borderFormat = $borderFormat; + + return $this; + } + + /** + * Gets table border format. + * + * @return string + */ + public function getBorderFormat() + { + return $this->borderFormat; + } + + /** + * Sets cell padding type. + * + * @return $this + */ + public function setPadType(int $padType) + { + if (!\in_array($padType, [STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH], true)) { + throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).'); + } + + $this->padType = $padType; + + return $this; + } + + /** + * Gets cell padding type. + * + * @return int + */ + public function getPadType() + { + return $this->padType; + } + + public function getHeaderTitleFormat(): string + { + return $this->headerTitleFormat; + } + + public function setHeaderTitleFormat(string $format): self + { + $this->headerTitleFormat = $format; + + return $this; + } + + public function getFooterTitleFormat(): string + { + return $this->footerTitleFormat; + } + + public function setFooterTitleFormat(string $format): self + { + $this->footerTitleFormat = $format; + + return $this; + } +} diff --git a/vendor/symfony/console/Input/ArgvInput.php b/vendor/symfony/console/Input/ArgvInput.php new file mode 100644 index 0000000..cbd9f41 --- /dev/null +++ b/vendor/symfony/console/Input/ArgvInput.php @@ -0,0 +1,349 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\RuntimeException; + +/** + * ArgvInput represents an input coming from the CLI arguments. + * + * Usage: + * + * $input = new ArgvInput(); + * + * By default, the `$_SERVER['argv']` array is used for the input values. + * + * This can be overridden by explicitly passing the input values in the constructor: + * + * $input = new ArgvInput($_SERVER['argv']); + * + * If you pass it yourself, don't forget that the first element of the array + * is the name of the running application. + * + * When passing an argument to the constructor, be sure that it respects + * the same rules as the argv one. It's almost always better to use the + * `StringInput` when you want to provide your own input. + * + * @author Fabien Potencier + * + * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html + * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 + */ +class ArgvInput extends Input +{ + private $tokens; + private $parsed; + + public function __construct(array $argv = null, InputDefinition $definition = null) + { + if (null === $argv) { + $argv = $_SERVER['argv']; + } + + // strip the application name + array_shift($argv); + + $this->tokens = $argv; + + parent::__construct($definition); + } + + protected function setTokens(array $tokens) + { + $this->tokens = $tokens; + } + + /** + * {@inheritdoc} + */ + protected function parse() + { + $parseOptions = true; + $this->parsed = $this->tokens; + while (null !== $token = array_shift($this->parsed)) { + if ($parseOptions && '' == $token) { + $this->parseArgument($token); + } elseif ($parseOptions && '--' == $token) { + $parseOptions = false; + } elseif ($parseOptions && 0 === strpos($token, '--')) { + $this->parseLongOption($token); + } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { + $this->parseShortOption($token); + } else { + $this->parseArgument($token); + } + } + } + + /** + * Parses a short option. + */ + private function parseShortOption(string $token) + { + $name = substr($token, 1); + + if (\strlen($name) > 1) { + if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { + // an option with a value (with no space) + $this->addShortOption($name[0], substr($name, 1)); + } else { + $this->parseShortOptionSet($name); + } + } else { + $this->addShortOption($name, null); + } + } + + /** + * Parses a short option set. + * + * @throws RuntimeException When option given doesn't exist + */ + private function parseShortOptionSet(string $name) + { + $len = \strlen($name); + for ($i = 0; $i < $len; ++$i) { + if (!$this->definition->hasShortcut($name[$i])) { + $encoding = mb_detect_encoding($name, null, true); + throw new RuntimeException(sprintf('The "-%s" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding))); + } + + $option = $this->definition->getOptionForShortcut($name[$i]); + if ($option->acceptValue()) { + $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); + + break; + } else { + $this->addLongOption($option->getName(), null); + } + } + } + + /** + * Parses a long option. + */ + private function parseLongOption(string $token) + { + $name = substr($token, 2); + + if (false !== $pos = strpos($name, '=')) { + if (0 === \strlen($value = substr($name, $pos + 1))) { + array_unshift($this->parsed, $value); + } + $this->addLongOption(substr($name, 0, $pos), $value); + } else { + $this->addLongOption($name, null); + } + } + + /** + * Parses an argument. + * + * @throws RuntimeException When too many arguments are given + */ + private function parseArgument(string $token) + { + $c = \count($this->arguments); + + // if input is expecting another argument, add it + if ($this->definition->hasArgument($c)) { + $arg = $this->definition->getArgument($c); + $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; + + // if last argument isArray(), append token to last argument + } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { + $arg = $this->definition->getArgument($c - 1); + $this->arguments[$arg->getName()][] = $token; + + // unexpected argument + } else { + $all = $this->definition->getArguments(); + if (\count($all)) { + throw new RuntimeException(sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all)))); + } + + throw new RuntimeException(sprintf('No arguments expected, got "%s".', $token)); + } + } + + /** + * Adds a short option value. + * + * @throws RuntimeException When option given doesn't exist + */ + private function addShortOption(string $shortcut, $value) + { + if (!$this->definition->hasShortcut($shortcut)) { + throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); + } + + $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); + } + + /** + * Adds a long option value. + * + * @throws RuntimeException When option given doesn't exist + */ + private function addLongOption(string $name, $value) + { + if (!$this->definition->hasOption($name)) { + throw new RuntimeException(sprintf('The "--%s" option does not exist.', $name)); + } + + $option = $this->definition->getOption($name); + + if (null !== $value && !$option->acceptValue()) { + throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name)); + } + + if (\in_array($value, ['', null], true) && $option->acceptValue() && \count($this->parsed)) { + // if option accepts an optional or mandatory argument + // let's see if there is one provided + $next = array_shift($this->parsed); + if ((isset($next[0]) && '-' !== $next[0]) || \in_array($next, ['', null], true)) { + $value = $next; + } else { + array_unshift($this->parsed, $next); + } + } + + if (null === $value) { + if ($option->isValueRequired()) { + throw new RuntimeException(sprintf('The "--%s" option requires a value.', $name)); + } + + if (!$option->isArray() && !$option->isValueOptional()) { + $value = true; + } + } + + if ($option->isArray()) { + $this->options[$name][] = $value; + } else { + $this->options[$name] = $value; + } + } + + /** + * {@inheritdoc} + */ + public function getFirstArgument() + { + $isOption = false; + foreach ($this->tokens as $i => $token) { + if ($token && '-' === $token[0]) { + if (false !== strpos($token, '=') || !isset($this->tokens[$i + 1])) { + continue; + } + + // If it's a long option, consider that everything after "--" is the option name. + // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator) + $name = '-' === $token[1] ? substr($token, 2) : substr($token, -1); + if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) { + // noop + } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) { + $isOption = true; + } + + continue; + } + + if ($isOption) { + $isOption = false; + continue; + } + + return $token; + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function hasParameterOption($values, bool $onlyParams = false) + { + $values = (array) $values; + + foreach ($this->tokens as $token) { + if ($onlyParams && '--' === $token) { + return false; + } + foreach ($values as $value) { + // Options with values: + // For long options, test for '--option=' at beginning + // For short options, test for '-o' at beginning + $leading = 0 === strpos($value, '--') ? $value.'=' : $value; + if ($token === $value || '' !== $leading && 0 === strpos($token, $leading)) { + return true; + } + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function getParameterOption($values, $default = false, bool $onlyParams = false) + { + $values = (array) $values; + $tokens = $this->tokens; + + while (0 < \count($tokens)) { + $token = array_shift($tokens); + if ($onlyParams && '--' === $token) { + return $default; + } + + foreach ($values as $value) { + if ($token === $value) { + return array_shift($tokens); + } + // Options with values: + // For long options, test for '--option=' at beginning + // For short options, test for '-o' at beginning + $leading = 0 === strpos($value, '--') ? $value.'=' : $value; + if ('' !== $leading && 0 === strpos($token, $leading)) { + return substr($token, \strlen($leading)); + } + } + } + + return $default; + } + + /** + * Returns a stringified representation of the args passed to the command. + * + * @return string + */ + public function __toString() + { + $tokens = array_map(function ($token) { + if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { + return $match[1].$this->escapeToken($match[2]); + } + + if ($token && '-' !== $token[0]) { + return $this->escapeToken($token); + } + + return $token; + }, $this->tokens); + + return implode(' ', $tokens); + } +} diff --git a/vendor/symfony/console/Input/ArrayInput.php b/vendor/symfony/console/Input/ArrayInput.php new file mode 100644 index 0000000..66f0bed --- /dev/null +++ b/vendor/symfony/console/Input/ArrayInput.php @@ -0,0 +1,202 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\InvalidOptionException; + +/** + * ArrayInput represents an input provided as an array. + * + * Usage: + * + * $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']); + * + * @author Fabien Potencier + */ +class ArrayInput extends Input +{ + private $parameters; + + public function __construct(array $parameters, InputDefinition $definition = null) + { + $this->parameters = $parameters; + + parent::__construct($definition); + } + + /** + * {@inheritdoc} + */ + public function getFirstArgument() + { + foreach ($this->parameters as $param => $value) { + if ($param && \is_string($param) && '-' === $param[0]) { + continue; + } + + return $value; + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function hasParameterOption($values, bool $onlyParams = false) + { + $values = (array) $values; + + foreach ($this->parameters as $k => $v) { + if (!\is_int($k)) { + $v = $k; + } + + if ($onlyParams && '--' === $v) { + return false; + } + + if (\in_array($v, $values)) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function getParameterOption($values, $default = false, bool $onlyParams = false) + { + $values = (array) $values; + + foreach ($this->parameters as $k => $v) { + if ($onlyParams && ('--' === $k || (\is_int($k) && '--' === $v))) { + return $default; + } + + if (\is_int($k)) { + if (\in_array($v, $values)) { + return true; + } + } elseif (\in_array($k, $values)) { + return $v; + } + } + + return $default; + } + + /** + * Returns a stringified representation of the args passed to the command. + * + * @return string + */ + public function __toString() + { + $params = []; + foreach ($this->parameters as $param => $val) { + if ($param && \is_string($param) && '-' === $param[0]) { + if (\is_array($val)) { + foreach ($val as $v) { + $params[] = $param.('' != $v ? '='.$this->escapeToken($v) : ''); + } + } else { + $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : ''); + } + } else { + $params[] = \is_array($val) ? implode(' ', array_map([$this, 'escapeToken'], $val)) : $this->escapeToken($val); + } + } + + return implode(' ', $params); + } + + /** + * {@inheritdoc} + */ + protected function parse() + { + foreach ($this->parameters as $key => $value) { + if ('--' === $key) { + return; + } + if (0 === strpos($key, '--')) { + $this->addLongOption(substr($key, 2), $value); + } elseif (0 === strpos($key, '-')) { + $this->addShortOption(substr($key, 1), $value); + } else { + $this->addArgument($key, $value); + } + } + } + + /** + * Adds a short option value. + * + * @throws InvalidOptionException When option given doesn't exist + */ + private function addShortOption(string $shortcut, $value) + { + if (!$this->definition->hasShortcut($shortcut)) { + throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut)); + } + + $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); + } + + /** + * Adds a long option value. + * + * @throws InvalidOptionException When option given doesn't exist + * @throws InvalidOptionException When a required value is missing + */ + private function addLongOption(string $name, $value) + { + if (!$this->definition->hasOption($name)) { + throw new InvalidOptionException(sprintf('The "--%s" option does not exist.', $name)); + } + + $option = $this->definition->getOption($name); + + if (null === $value) { + if ($option->isValueRequired()) { + throw new InvalidOptionException(sprintf('The "--%s" option requires a value.', $name)); + } + + if (!$option->isValueOptional()) { + $value = true; + } + } + + $this->options[$name] = $value; + } + + /** + * Adds an argument value. + * + * @param string|int $name The argument name + * @param mixed $value The value for the argument + * + * @throws InvalidArgumentException When argument given doesn't exist + */ + private function addArgument($name, $value) + { + if (!$this->definition->hasArgument($name)) { + throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); + } + + $this->arguments[$name] = $value; + } +} diff --git a/vendor/symfony/console/Input/Input.php b/vendor/symfony/console/Input/Input.php new file mode 100644 index 0000000..ff5d317 --- /dev/null +++ b/vendor/symfony/console/Input/Input.php @@ -0,0 +1,201 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\RuntimeException; + +/** + * Input is the base class for all concrete Input classes. + * + * Three concrete classes are provided by default: + * + * * `ArgvInput`: The input comes from the CLI arguments (argv) + * * `StringInput`: The input is provided as a string + * * `ArrayInput`: The input is provided as an array + * + * @author Fabien Potencier + */ +abstract class Input implements InputInterface, StreamableInputInterface +{ + protected $definition; + protected $stream; + protected $options = []; + protected $arguments = []; + protected $interactive = true; + + public function __construct(InputDefinition $definition = null) + { + if (null === $definition) { + $this->definition = new InputDefinition(); + } else { + $this->bind($definition); + $this->validate(); + } + } + + /** + * {@inheritdoc} + */ + public function bind(InputDefinition $definition) + { + $this->arguments = []; + $this->options = []; + $this->definition = $definition; + + $this->parse(); + } + + /** + * Processes command line arguments. + */ + abstract protected function parse(); + + /** + * {@inheritdoc} + */ + public function validate() + { + $definition = $this->definition; + $givenArguments = $this->arguments; + + $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) { + return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); + }); + + if (\count($missingArguments) > 0) { + throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments))); + } + } + + /** + * {@inheritdoc} + */ + public function isInteractive() + { + return $this->interactive; + } + + /** + * {@inheritdoc} + */ + public function setInteractive(bool $interactive) + { + $this->interactive = $interactive; + } + + /** + * {@inheritdoc} + */ + public function getArguments() + { + return array_merge($this->definition->getArgumentDefaults(), $this->arguments); + } + + /** + * {@inheritdoc} + */ + public function getArgument(string $name) + { + if (!$this->definition->hasArgument($name)) { + throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); + } + + return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault(); + } + + /** + * {@inheritdoc} + */ + public function setArgument(string $name, $value) + { + if (!$this->definition->hasArgument($name)) { + throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); + } + + $this->arguments[$name] = $value; + } + + /** + * {@inheritdoc} + */ + public function hasArgument($name) + { + return $this->definition->hasArgument($name); + } + + /** + * {@inheritdoc} + */ + public function getOptions() + { + return array_merge($this->definition->getOptionDefaults(), $this->options); + } + + /** + * {@inheritdoc} + */ + public function getOption(string $name) + { + if (!$this->definition->hasOption($name)) { + throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); + } + + return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); + } + + /** + * {@inheritdoc} + */ + public function setOption(string $name, $value) + { + if (!$this->definition->hasOption($name)) { + throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); + } + + $this->options[$name] = $value; + } + + /** + * {@inheritdoc} + */ + public function hasOption(string $name) + { + return $this->definition->hasOption($name); + } + + /** + * Escapes a token through escapeshellarg if it contains unsafe chars. + * + * @return string + */ + public function escapeToken(string $token) + { + return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); + } + + /** + * {@inheritdoc} + */ + public function setStream($stream) + { + $this->stream = $stream; + } + + /** + * {@inheritdoc} + */ + public function getStream() + { + return $this->stream; + } +} diff --git a/vendor/symfony/console/Input/InputArgument.php b/vendor/symfony/console/Input/InputArgument.php new file mode 100644 index 0000000..b6aa645 --- /dev/null +++ b/vendor/symfony/console/Input/InputArgument.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; + +/** + * Represents a command line argument. + * + * @author Fabien Potencier + */ +class InputArgument +{ + const REQUIRED = 1; + const OPTIONAL = 2; + const IS_ARRAY = 4; + + private $name; + private $mode; + private $default; + private $description; + + /** + * @param string $name The argument name + * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL + * @param string $description A description text + * @param string|string[]|null $default The default value (for self::OPTIONAL mode only) + * + * @throws InvalidArgumentException When argument mode is not valid + */ + public function __construct(string $name, int $mode = null, string $description = '', $default = null) + { + if (null === $mode) { + $mode = self::OPTIONAL; + } elseif ($mode > 7 || $mode < 1) { + throw new InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); + } + + $this->name = $name; + $this->mode = $mode; + $this->description = $description; + + $this->setDefault($default); + } + + /** + * Returns the argument name. + * + * @return string The argument name + */ + public function getName() + { + return $this->name; + } + + /** + * Returns true if the argument is required. + * + * @return bool true if parameter mode is self::REQUIRED, false otherwise + */ + public function isRequired() + { + return self::REQUIRED === (self::REQUIRED & $this->mode); + } + + /** + * Returns true if the argument can take multiple values. + * + * @return bool true if mode is self::IS_ARRAY, false otherwise + */ + public function isArray() + { + return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); + } + + /** + * Sets the default value. + * + * @param string|string[]|null $default The default value + * + * @throws LogicException When incorrect default value is given + */ + public function setDefault($default = null) + { + if (self::REQUIRED === $this->mode && null !== $default) { + throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); + } + + if ($this->isArray()) { + if (null === $default) { + $default = []; + } elseif (!\is_array($default)) { + throw new LogicException('A default value for an array argument must be an array.'); + } + } + + $this->default = $default; + } + + /** + * Returns the default value. + * + * @return string|string[]|null The default value + */ + public function getDefault() + { + return $this->default; + } + + /** + * Returns the description text. + * + * @return string The description text + */ + public function getDescription() + { + return $this->description; + } +} diff --git a/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/symfony/console/Input/InputAwareInterface.php new file mode 100644 index 0000000..5a288de --- /dev/null +++ b/vendor/symfony/console/Input/InputAwareInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +/** + * InputAwareInterface should be implemented by classes that depends on the + * Console Input. + * + * @author Wouter J + */ +interface InputAwareInterface +{ + /** + * Sets the Console Input. + */ + public function setInput(InputInterface $input); +} diff --git a/vendor/symfony/console/Input/InputDefinition.php b/vendor/symfony/console/Input/InputDefinition.php new file mode 100644 index 0000000..4e95e9b --- /dev/null +++ b/vendor/symfony/console/Input/InputDefinition.php @@ -0,0 +1,390 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; + +/** + * A InputDefinition represents a set of valid command line arguments and options. + * + * Usage: + * + * $definition = new InputDefinition([ + * new InputArgument('name', InputArgument::REQUIRED), + * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), + * ]); + * + * @author Fabien Potencier + */ +class InputDefinition +{ + private $arguments; + private $requiredCount; + private $hasAnArrayArgument = false; + private $hasOptional; + private $options; + private $shortcuts; + + /** + * @param array $definition An array of InputArgument and InputOption instance + */ + public function __construct(array $definition = []) + { + $this->setDefinition($definition); + } + + /** + * Sets the definition of the input. + */ + public function setDefinition(array $definition) + { + $arguments = []; + $options = []; + foreach ($definition as $item) { + if ($item instanceof InputOption) { + $options[] = $item; + } else { + $arguments[] = $item; + } + } + + $this->setArguments($arguments); + $this->setOptions($options); + } + + /** + * Sets the InputArgument objects. + * + * @param InputArgument[] $arguments An array of InputArgument objects + */ + public function setArguments(array $arguments = []) + { + $this->arguments = []; + $this->requiredCount = 0; + $this->hasOptional = false; + $this->hasAnArrayArgument = false; + $this->addArguments($arguments); + } + + /** + * Adds an array of InputArgument objects. + * + * @param InputArgument[] $arguments An array of InputArgument objects + */ + public function addArguments(?array $arguments = []) + { + if (null !== $arguments) { + foreach ($arguments as $argument) { + $this->addArgument($argument); + } + } + } + + /** + * @throws LogicException When incorrect argument is given + */ + public function addArgument(InputArgument $argument) + { + if (isset($this->arguments[$argument->getName()])) { + throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); + } + + if ($this->hasAnArrayArgument) { + throw new LogicException('Cannot add an argument after an array argument.'); + } + + if ($argument->isRequired() && $this->hasOptional) { + throw new LogicException('Cannot add a required argument after an optional one.'); + } + + if ($argument->isArray()) { + $this->hasAnArrayArgument = true; + } + + if ($argument->isRequired()) { + ++$this->requiredCount; + } else { + $this->hasOptional = true; + } + + $this->arguments[$argument->getName()] = $argument; + } + + /** + * Returns an InputArgument by name or by position. + * + * @param string|int $name The InputArgument name or position + * + * @return InputArgument An InputArgument object + * + * @throws InvalidArgumentException When argument given doesn't exist + */ + public function getArgument($name) + { + if (!$this->hasArgument($name)) { + throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); + } + + $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments; + + return $arguments[$name]; + } + + /** + * Returns true if an InputArgument object exists by name or position. + * + * @param string|int $name The InputArgument name or position + * + * @return bool true if the InputArgument object exists, false otherwise + */ + public function hasArgument($name) + { + $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments; + + return isset($arguments[$name]); + } + + /** + * Gets the array of InputArgument objects. + * + * @return InputArgument[] An array of InputArgument objects + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * Returns the number of InputArguments. + * + * @return int The number of InputArguments + */ + public function getArgumentCount() + { + return $this->hasAnArrayArgument ? PHP_INT_MAX : \count($this->arguments); + } + + /** + * Returns the number of required InputArguments. + * + * @return int The number of required InputArguments + */ + public function getArgumentRequiredCount() + { + return $this->requiredCount; + } + + /** + * Gets the default values. + * + * @return array An array of default values + */ + public function getArgumentDefaults() + { + $values = []; + foreach ($this->arguments as $argument) { + $values[$argument->getName()] = $argument->getDefault(); + } + + return $values; + } + + /** + * Sets the InputOption objects. + * + * @param InputOption[] $options An array of InputOption objects + */ + public function setOptions(array $options = []) + { + $this->options = []; + $this->shortcuts = []; + $this->addOptions($options); + } + + /** + * Adds an array of InputOption objects. + * + * @param InputOption[] $options An array of InputOption objects + */ + public function addOptions(array $options = []) + { + foreach ($options as $option) { + $this->addOption($option); + } + } + + /** + * @throws LogicException When option given already exist + */ + public function addOption(InputOption $option) + { + if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { + throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName())); + } + + if ($option->getShortcut()) { + foreach (explode('|', $option->getShortcut()) as $shortcut) { + if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { + throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); + } + } + } + + $this->options[$option->getName()] = $option; + if ($option->getShortcut()) { + foreach (explode('|', $option->getShortcut()) as $shortcut) { + $this->shortcuts[$shortcut] = $option->getName(); + } + } + } + + /** + * Returns an InputOption by name. + * + * @return InputOption A InputOption object + * + * @throws InvalidArgumentException When option given doesn't exist + */ + public function getOption(string $name) + { + if (!$this->hasOption($name)) { + throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); + } + + return $this->options[$name]; + } + + /** + * Returns true if an InputOption object exists by name. + * + * This method can't be used to check if the user included the option when + * executing the command (use getOption() instead). + * + * @return bool true if the InputOption object exists, false otherwise + */ + public function hasOption(string $name) + { + return isset($this->options[$name]); + } + + /** + * Gets the array of InputOption objects. + * + * @return InputOption[] An array of InputOption objects + */ + public function getOptions() + { + return $this->options; + } + + /** + * Returns true if an InputOption object exists by shortcut. + * + * @return bool true if the InputOption object exists, false otherwise + */ + public function hasShortcut(string $name) + { + return isset($this->shortcuts[$name]); + } + + /** + * Gets an InputOption by shortcut. + * + * @return InputOption An InputOption object + */ + public function getOptionForShortcut(string $shortcut) + { + return $this->getOption($this->shortcutToName($shortcut)); + } + + /** + * Gets an array of default values. + * + * @return array An array of all default values + */ + public function getOptionDefaults() + { + $values = []; + foreach ($this->options as $option) { + $values[$option->getName()] = $option->getDefault(); + } + + return $values; + } + + /** + * Returns the InputOption name given a shortcut. + * + * @throws InvalidArgumentException When option given does not exist + * + * @internal + */ + public function shortcutToName(string $shortcut): string + { + if (!isset($this->shortcuts[$shortcut])) { + throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); + } + + return $this->shortcuts[$shortcut]; + } + + /** + * Gets the synopsis. + * + * @return string The synopsis + */ + public function getSynopsis(bool $short = false) + { + $elements = []; + + if ($short && $this->getOptions()) { + $elements[] = '[options]'; + } elseif (!$short) { + foreach ($this->getOptions() as $option) { + $value = ''; + if ($option->acceptValue()) { + $value = sprintf( + ' %s%s%s', + $option->isValueOptional() ? '[' : '', + strtoupper($option->getName()), + $option->isValueOptional() ? ']' : '' + ); + } + + $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; + $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value); + } + } + + if (\count($elements) && $this->getArguments()) { + $elements[] = '[--]'; + } + + $tail = ''; + foreach ($this->getArguments() as $argument) { + $element = '<'.$argument->getName().'>'; + if ($argument->isArray()) { + $element .= '...'; + } + + if (!$argument->isRequired()) { + $element = '['.$element; + $tail .= ']'; + } + + $elements[] = $element; + } + + return implode(' ', $elements).$tail; + } +} diff --git a/vendor/symfony/console/Input/InputInterface.php b/vendor/symfony/console/Input/InputInterface.php new file mode 100644 index 0000000..f6ad722 --- /dev/null +++ b/vendor/symfony/console/Input/InputInterface.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\RuntimeException; + +/** + * InputInterface is the interface implemented by all input classes. + * + * @author Fabien Potencier + */ +interface InputInterface +{ + /** + * Returns the first argument from the raw parameters (not parsed). + * + * @return string|null The value of the first argument or null otherwise + */ + public function getFirstArgument(); + + /** + * Returns true if the raw parameters (not parsed) contain a value. + * + * This method is to be used to introspect the input parameters + * before they have been validated. It must be used carefully. + * Does not necessarily return the correct result for short options + * when multiple flags are combined in the same option. + * + * @param string|array $values The values to look for in the raw parameters (can be an array) + * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal + * + * @return bool true if the value is contained in the raw parameters + */ + public function hasParameterOption($values, bool $onlyParams = false); + + /** + * Returns the value of a raw option (not parsed). + * + * This method is to be used to introspect the input parameters + * before they have been validated. It must be used carefully. + * Does not necessarily return the correct result for short options + * when multiple flags are combined in the same option. + * + * @param string|array $values The value(s) to look for in the raw parameters (can be an array) + * @param mixed $default The default value to return if no result is found + * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal + * + * @return mixed The option value + */ + public function getParameterOption($values, $default = false, bool $onlyParams = false); + + /** + * Binds the current Input instance with the given arguments and options. + * + * @throws RuntimeException + */ + public function bind(InputDefinition $definition); + + /** + * Validates the input. + * + * @throws RuntimeException When not enough arguments are given + */ + public function validate(); + + /** + * Returns all the given arguments merged with the default values. + * + * @return array + */ + public function getArguments(); + + /** + * Returns the argument value for a given argument name. + * + * @return string|string[]|null The argument value + * + * @throws InvalidArgumentException When argument given doesn't exist + */ + public function getArgument(string $name); + + /** + * Sets an argument value by name. + * + * @param string|string[]|null $value The argument value + * + * @throws InvalidArgumentException When argument given doesn't exist + */ + public function setArgument(string $name, $value); + + /** + * Returns true if an InputArgument object exists by name or position. + * + * @param string|int $name The InputArgument name or position + * + * @return bool true if the InputArgument object exists, false otherwise + */ + public function hasArgument($name); + + /** + * Returns all the given options merged with the default values. + * + * @return array + */ + public function getOptions(); + + /** + * Returns the option value for a given option name. + * + * @return string|string[]|bool|null The option value + * + * @throws InvalidArgumentException When option given doesn't exist + */ + public function getOption(string $name); + + /** + * Sets an option value by name. + * + * @param string|string[]|bool|null $value The option value + * + * @throws InvalidArgumentException When option given doesn't exist + */ + public function setOption(string $name, $value); + + /** + * Returns true if an InputOption object exists by name. + * + * @return bool true if the InputOption object exists, false otherwise + */ + public function hasOption(string $name); + + /** + * Is this input means interactive? + * + * @return bool + */ + public function isInteractive(); + + /** + * Sets the input interactivity. + */ + public function setInteractive(bool $interactive); +} diff --git a/vendor/symfony/console/Input/InputOption.php b/vendor/symfony/console/Input/InputOption.php new file mode 100644 index 0000000..d62e0ae --- /dev/null +++ b/vendor/symfony/console/Input/InputOption.php @@ -0,0 +1,208 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; + +/** + * Represents a command line option. + * + * @author Fabien Potencier + */ +class InputOption +{ + const VALUE_NONE = 1; + const VALUE_REQUIRED = 2; + const VALUE_OPTIONAL = 4; + const VALUE_IS_ARRAY = 8; + + private $name; + private $shortcut; + private $mode; + private $default; + private $description; + + /** + * @param string $name The option name + * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param int|null $mode The option mode: One of the VALUE_* constants + * @param string $description A description text + * @param string|string[]|int|bool|null $default The default value (must be null for self::VALUE_NONE) + * + * @throws InvalidArgumentException If option mode is invalid or incompatible + */ + public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) + { + if (0 === strpos($name, '--')) { + $name = substr($name, 2); + } + + if (empty($name)) { + throw new InvalidArgumentException('An option name cannot be empty.'); + } + + if (empty($shortcut)) { + $shortcut = null; + } + + if (null !== $shortcut) { + if (\is_array($shortcut)) { + $shortcut = implode('|', $shortcut); + } + $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-')); + $shortcuts = array_filter($shortcuts); + $shortcut = implode('|', $shortcuts); + + if (empty($shortcut)) { + throw new InvalidArgumentException('An option shortcut cannot be empty.'); + } + } + + if (null === $mode) { + $mode = self::VALUE_NONE; + } elseif ($mode > 15 || $mode < 1) { + throw new InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); + } + + $this->name = $name; + $this->shortcut = $shortcut; + $this->mode = $mode; + $this->description = $description; + + if ($this->isArray() && !$this->acceptValue()) { + throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); + } + + $this->setDefault($default); + } + + /** + * Returns the option shortcut. + * + * @return string|null The shortcut + */ + public function getShortcut() + { + return $this->shortcut; + } + + /** + * Returns the option name. + * + * @return string The name + */ + public function getName() + { + return $this->name; + } + + /** + * Returns true if the option accepts a value. + * + * @return bool true if value mode is not self::VALUE_NONE, false otherwise + */ + public function acceptValue() + { + return $this->isValueRequired() || $this->isValueOptional(); + } + + /** + * Returns true if the option requires a value. + * + * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise + */ + public function isValueRequired() + { + return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); + } + + /** + * Returns true if the option takes an optional value. + * + * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise + */ + public function isValueOptional() + { + return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); + } + + /** + * Returns true if the option can take multiple values. + * + * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise + */ + public function isArray() + { + return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); + } + + /** + * Sets the default value. + * + * @param string|string[]|int|bool|null $default The default value + * + * @throws LogicException When incorrect default value is given + */ + public function setDefault($default = null) + { + if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { + throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); + } + + if ($this->isArray()) { + if (null === $default) { + $default = []; + } elseif (!\is_array($default)) { + throw new LogicException('A default value for an array option must be an array.'); + } + } + + $this->default = $this->acceptValue() ? $default : false; + } + + /** + * Returns the default value. + * + * @return string|string[]|int|bool|null The default value + */ + public function getDefault() + { + return $this->default; + } + + /** + * Returns the description text. + * + * @return string The description text + */ + public function getDescription() + { + return $this->description; + } + + /** + * Checks whether the given option equals this one. + * + * @return bool + */ + public function equals(self $option) + { + return $option->getName() === $this->getName() + && $option->getShortcut() === $this->getShortcut() + && $option->getDefault() === $this->getDefault() + && $option->isArray() === $this->isArray() + && $option->isValueRequired() === $this->isValueRequired() + && $option->isValueOptional() === $this->isValueOptional() + ; + } +} diff --git a/vendor/symfony/console/Input/StreamableInputInterface.php b/vendor/symfony/console/Input/StreamableInputInterface.php new file mode 100644 index 0000000..d7e462f --- /dev/null +++ b/vendor/symfony/console/Input/StreamableInputInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +/** + * StreamableInputInterface is the interface implemented by all input classes + * that have an input stream. + * + * @author Robin Chalas + */ +interface StreamableInputInterface extends InputInterface +{ + /** + * Sets the input stream to read from when interacting with the user. + * + * This is mainly useful for testing purpose. + * + * @param resource $stream The input stream + */ + public function setStream($stream); + + /** + * Returns the input stream. + * + * @return resource|null + */ + public function getStream(); +} diff --git a/vendor/symfony/console/Input/StringInput.php b/vendor/symfony/console/Input/StringInput.php new file mode 100644 index 0000000..6fddf64 --- /dev/null +++ b/vendor/symfony/console/Input/StringInput.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Input; + +use Symfony\Component\Console\Exception\InvalidArgumentException; + +/** + * StringInput represents an input provided as a string. + * + * Usage: + * + * $input = new StringInput('foo --bar="foobar"'); + * + * @author Fabien Potencier + */ +class StringInput extends ArgvInput +{ + const REGEX_STRING = '([^\s]+?)(?:\s|(?setTokens($this->tokenize($input)); + } + + /** + * Tokenizes a string. + * + * @throws InvalidArgumentException When unable to parse input (should never happen) + */ + private function tokenize(string $input): array + { + $tokens = []; + $length = \strlen($input); + $cursor = 0; + while ($cursor < $length) { + if (preg_match('/\s+/A', $input, $match, null, $cursor)) { + } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) { + $tokens[] = $match[1].$match[2].stripcslashes(str_replace(['"\'', '\'"', '\'\'', '""'], '', substr($match[3], 1, \strlen($match[3]) - 2))); + } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) { + $tokens[] = stripcslashes(substr($match[0], 1, \strlen($match[0]) - 2)); + } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) { + $tokens[] = stripcslashes($match[1]); + } else { + // should never happen + throw new InvalidArgumentException(sprintf('Unable to parse input near "... %s ...".', substr($input, $cursor, 10))); + } + + $cursor += \strlen($match[0]); + } + + return $tokens; + } +} diff --git a/vendor/symfony/console/LICENSE b/vendor/symfony/console/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/console/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/console/Logger/ConsoleLogger.php b/vendor/symfony/console/Logger/ConsoleLogger.php new file mode 100644 index 0000000..3236118 --- /dev/null +++ b/vendor/symfony/console/Logger/ConsoleLogger.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Logger; + +use Psr\Log\AbstractLogger; +use Psr\Log\InvalidArgumentException; +use Psr\Log\LogLevel; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * PSR-3 compliant console logger. + * + * @author Kévin Dunglas + * + * @see https://www.php-fig.org/psr/psr-3/ + */ +class ConsoleLogger extends AbstractLogger +{ + const INFO = 'info'; + const ERROR = 'error'; + + private $output; + private $verbosityLevelMap = [ + LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, + LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, + LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, + LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, + LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, + LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, + LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, + LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG, + ]; + private $formatLevelMap = [ + LogLevel::EMERGENCY => self::ERROR, + LogLevel::ALERT => self::ERROR, + LogLevel::CRITICAL => self::ERROR, + LogLevel::ERROR => self::ERROR, + LogLevel::WARNING => self::INFO, + LogLevel::NOTICE => self::INFO, + LogLevel::INFO => self::INFO, + LogLevel::DEBUG => self::INFO, + ]; + private $errored = false; + + public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) + { + $this->output = $output; + $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; + $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; + } + + /** + * {@inheritdoc} + * + * @return void + */ + public function log($level, $message, array $context = []) + { + if (!isset($this->verbosityLevelMap[$level])) { + throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level)); + } + + $output = $this->output; + + // Write to the error output if necessary and available + if (self::ERROR === $this->formatLevelMap[$level]) { + if ($this->output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + $this->errored = true; + } + + // the if condition check isn't necessary -- it's the same one that $output will do internally anyway. + // We only do it for efficiency here as the message formatting is relatively expensive. + if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { + $output->writeln(sprintf('<%1$s>[%2$s] %3$s', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]); + } + } + + /** + * Returns true when any messages have been logged at error levels. + * + * @return bool + */ + public function hasErrored() + { + return $this->errored; + } + + /** + * Interpolates context values into the message placeholders. + * + * @author PHP Framework Interoperability Group + */ + private function interpolate(string $message, array $context): string + { + if (false === strpos($message, '{')) { + return $message; + } + + $replacements = []; + foreach ($context as $key => $val) { + if (null === $val || is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) { + $replacements["{{$key}}"] = $val; + } elseif ($val instanceof \DateTimeInterface) { + $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339); + } elseif (\is_object($val)) { + $replacements["{{$key}}"] = '[object '.\get_class($val).']'; + } else { + $replacements["{{$key}}"] = '['.\gettype($val).']'; + } + } + + return strtr($message, $replacements); + } +} diff --git a/vendor/symfony/console/Output/BufferedOutput.php b/vendor/symfony/console/Output/BufferedOutput.php new file mode 100644 index 0000000..a5ad7ad --- /dev/null +++ b/vendor/symfony/console/Output/BufferedOutput.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +/** + * @author Jean-François Simon + */ +class BufferedOutput extends Output +{ + private $buffer = ''; + + /** + * Empties buffer and returns its content. + * + * @return string + */ + public function fetch() + { + $content = $this->buffer; + $this->buffer = ''; + + return $content; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $message, bool $newline) + { + $this->buffer .= $message; + + if ($newline) { + $this->buffer .= PHP_EOL; + } + } +} diff --git a/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/symfony/console/Output/ConsoleOutput.php new file mode 100644 index 0000000..8356d4d --- /dev/null +++ b/vendor/symfony/console/Output/ConsoleOutput.php @@ -0,0 +1,159 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +use Symfony\Component\Console\Formatter\OutputFormatterInterface; + +/** + * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. + * + * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR. + * + * $output = new ConsoleOutput(); + * + * This is equivalent to: + * + * $output = new StreamOutput(fopen('php://stdout', 'w')); + * $stdErr = new StreamOutput(fopen('php://stderr', 'w')); + * + * @author Fabien Potencier + */ +class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface +{ + private $stderr; + private $consoleSectionOutputs = []; + + /** + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) + * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) + */ + public function __construct(int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) + { + parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter); + + $actualDecorated = $this->isDecorated(); + $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter()); + + if (null === $decorated) { + $this->setDecorated($actualDecorated && $this->stderr->isDecorated()); + } + } + + /** + * Creates a new output section. + */ + public function section(): ConsoleSectionOutput + { + return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); + } + + /** + * {@inheritdoc} + */ + public function setDecorated(bool $decorated) + { + parent::setDecorated($decorated); + $this->stderr->setDecorated($decorated); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + parent::setFormatter($formatter); + $this->stderr->setFormatter($formatter); + } + + /** + * {@inheritdoc} + */ + public function setVerbosity(int $level) + { + parent::setVerbosity($level); + $this->stderr->setVerbosity($level); + } + + /** + * {@inheritdoc} + */ + public function getErrorOutput() + { + return $this->stderr; + } + + /** + * {@inheritdoc} + */ + public function setErrorOutput(OutputInterface $error) + { + $this->stderr = $error; + } + + /** + * Returns true if current environment supports writing console output to + * STDOUT. + * + * @return bool + */ + protected function hasStdoutSupport() + { + return false === $this->isRunningOS400(); + } + + /** + * Returns true if current environment supports writing console output to + * STDERR. + * + * @return bool + */ + protected function hasStderrSupport() + { + return false === $this->isRunningOS400(); + } + + /** + * Checks if current executing environment is IBM iSeries (OS400), which + * doesn't properly convert character-encodings between ASCII to EBCDIC. + */ + private function isRunningOS400(): bool + { + $checks = [ + \function_exists('php_uname') ? php_uname('s') : '', + getenv('OSTYPE'), + PHP_OS, + ]; + + return false !== stripos(implode(';', $checks), 'OS400'); + } + + /** + * @return resource + */ + private function openOutputStream() + { + if (!$this->hasStdoutSupport()) { + return fopen('php://output', 'w'); + } + + return @fopen('php://stdout', 'w') ?: fopen('php://output', 'w'); + } + + /** + * @return resource + */ + private function openErrorStream() + { + return fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w'); + } +} diff --git a/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/symfony/console/Output/ConsoleOutputInterface.php new file mode 100644 index 0000000..6b6635f --- /dev/null +++ b/vendor/symfony/console/Output/ConsoleOutputInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +/** + * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. + * This adds information about stderr and section output stream. + * + * @author Dariusz Górecki + */ +interface ConsoleOutputInterface extends OutputInterface +{ + /** + * Gets the OutputInterface for errors. + * + * @return OutputInterface + */ + public function getErrorOutput(); + + public function setErrorOutput(OutputInterface $error); + + public function section(): ConsoleSectionOutput; +} diff --git a/vendor/symfony/console/Output/ConsoleSectionOutput.php b/vendor/symfony/console/Output/ConsoleSectionOutput.php new file mode 100644 index 0000000..024d99d --- /dev/null +++ b/vendor/symfony/console/Output/ConsoleSectionOutput.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +use Symfony\Component\Console\Formatter\OutputFormatterInterface; +use Symfony\Component\Console\Helper\Helper; +use Symfony\Component\Console\Terminal; + +/** + * @author Pierre du Plessis + * @author Gabriel Ostrolucký + */ +class ConsoleSectionOutput extends StreamOutput +{ + private $content = []; + private $lines = 0; + private $sections; + private $terminal; + + /** + * @param resource $stream + * @param ConsoleSectionOutput[] $sections + */ + public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter) + { + parent::__construct($stream, $verbosity, $decorated, $formatter); + array_unshift($sections, $this); + $this->sections = &$sections; + $this->terminal = new Terminal(); + } + + /** + * Clears previous output for this section. + * + * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared + */ + public function clear(int $lines = null) + { + if (empty($this->content) || !$this->isDecorated()) { + return; + } + + if ($lines) { + array_splice($this->content, -($lines * 2)); // Multiply lines by 2 to cater for each new line added between content + } else { + $lines = $this->lines; + $this->content = []; + } + + $this->lines -= $lines; + + parent::doWrite($this->popStreamContentUntilCurrentSection($lines), false); + } + + /** + * Overwrites the previous output with a new message. + * + * @param array|string $message + */ + public function overwrite($message) + { + $this->clear(); + $this->writeln($message); + } + + public function getContent(): string + { + return implode('', $this->content); + } + + /** + * @internal + */ + public function addContent(string $input) + { + foreach (explode(PHP_EOL, $input) as $lineContent) { + $this->lines += ceil($this->getDisplayLength($lineContent) / $this->terminal->getWidth()) ?: 1; + $this->content[] = $lineContent; + $this->content[] = PHP_EOL; + } + } + + /** + * {@inheritdoc} + */ + protected function doWrite($message, $newline) + { + if (!$this->isDecorated()) { + parent::doWrite($message, $newline); + + return; + } + + $erasedContent = $this->popStreamContentUntilCurrentSection(); + + $this->addContent($message); + + parent::doWrite($message, true); + parent::doWrite($erasedContent, false); + } + + /** + * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits + * current section. Then it erases content it crawled through. Optionally, it erases part of current section too. + */ + private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0): string + { + $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection; + $erasedContent = []; + + foreach ($this->sections as $section) { + if ($section === $this) { + break; + } + + $numberOfLinesToClear += $section->lines; + $erasedContent[] = $section->getContent(); + } + + if ($numberOfLinesToClear > 0) { + // move cursor up n lines + parent::doWrite(sprintf("\x1b[%dA", $numberOfLinesToClear), false); + // erase to end of screen + parent::doWrite("\x1b[0J", false); + } + + return implode('', array_reverse($erasedContent)); + } + + private function getDisplayLength(string $text): string + { + return Helper::strlenWithoutDecoration($this->getFormatter(), str_replace("\t", ' ', $text)); + } +} diff --git a/vendor/symfony/console/Output/NullOutput.php b/vendor/symfony/console/Output/NullOutput.php new file mode 100644 index 0000000..3bbe63e --- /dev/null +++ b/vendor/symfony/console/Output/NullOutput.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +use Symfony\Component\Console\Formatter\NullOutputFormatter; +use Symfony\Component\Console\Formatter\OutputFormatterInterface; + +/** + * NullOutput suppresses all output. + * + * $output = new NullOutput(); + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class NullOutput implements OutputInterface +{ + private $formatter; + + /** + * {@inheritdoc} + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + if ($this->formatter) { + return $this->formatter; + } + // to comply with the interface we must return a OutputFormatterInterface + return $this->formatter = new NullOutputFormatter(); + } + + /** + * {@inheritdoc} + */ + public function setDecorated(bool $decorated) + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function isDecorated() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function setVerbosity(int $level) + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function getVerbosity() + { + return self::VERBOSITY_QUIET; + } + + /** + * {@inheritdoc} + */ + public function isQuiet() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function isVerbose() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isVeryVerbose() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isDebug() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function writeln($messages, int $options = self::OUTPUT_NORMAL) + { + // do nothing + } + + /** + * {@inheritdoc} + */ + public function write($messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) + { + // do nothing + } +} diff --git a/vendor/symfony/console/Output/Output.php b/vendor/symfony/console/Output/Output.php new file mode 100644 index 0000000..ed13d58 --- /dev/null +++ b/vendor/symfony/console/Output/Output.php @@ -0,0 +1,174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Formatter\OutputFormatterInterface; + +/** + * Base class for output classes. + * + * There are five levels of verbosity: + * + * * normal: no option passed (normal output) + * * verbose: -v (more output) + * * very verbose: -vv (highly extended output) + * * debug: -vvv (all debug output) + * * quiet: -q (no output) + * + * @author Fabien Potencier + */ +abstract class Output implements OutputInterface +{ + private $verbosity; + private $formatter; + + /** + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool $decorated Whether to decorate messages + * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) + */ + public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, OutputFormatterInterface $formatter = null) + { + $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity; + $this->formatter = $formatter ?: new OutputFormatter(); + $this->formatter->setDecorated($decorated); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + $this->formatter = $formatter; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->formatter; + } + + /** + * {@inheritdoc} + */ + public function setDecorated(bool $decorated) + { + $this->formatter->setDecorated($decorated); + } + + /** + * {@inheritdoc} + */ + public function isDecorated() + { + return $this->formatter->isDecorated(); + } + + /** + * {@inheritdoc} + */ + public function setVerbosity(int $level) + { + $this->verbosity = $level; + } + + /** + * {@inheritdoc} + */ + public function getVerbosity() + { + return $this->verbosity; + } + + /** + * {@inheritdoc} + */ + public function isQuiet() + { + return self::VERBOSITY_QUIET === $this->verbosity; + } + + /** + * {@inheritdoc} + */ + public function isVerbose() + { + return self::VERBOSITY_VERBOSE <= $this->verbosity; + } + + /** + * {@inheritdoc} + */ + public function isVeryVerbose() + { + return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; + } + + /** + * {@inheritdoc} + */ + public function isDebug() + { + return self::VERBOSITY_DEBUG <= $this->verbosity; + } + + /** + * {@inheritdoc} + */ + public function writeln($messages, int $options = self::OUTPUT_NORMAL) + { + $this->write($messages, true, $options); + } + + /** + * {@inheritdoc} + */ + public function write($messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) + { + if (!is_iterable($messages)) { + $messages = [$messages]; + } + + $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN; + $type = $types & $options ?: self::OUTPUT_NORMAL; + + $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG; + $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL; + + if ($verbosity > $this->getVerbosity()) { + return; + } + + foreach ($messages as $message) { + switch ($type) { + case OutputInterface::OUTPUT_NORMAL: + $message = $this->formatter->format($message); + break; + case OutputInterface::OUTPUT_RAW: + break; + case OutputInterface::OUTPUT_PLAIN: + $message = strip_tags($this->formatter->format($message)); + break; + } + + $this->doWrite($message, $newline); + } + } + + /** + * Writes a message to the output. + */ + abstract protected function doWrite(string $message, bool $newline); +} diff --git a/vendor/symfony/console/Output/OutputInterface.php b/vendor/symfony/console/Output/OutputInterface.php new file mode 100644 index 0000000..38f82d8 --- /dev/null +++ b/vendor/symfony/console/Output/OutputInterface.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +use Symfony\Component\Console\Formatter\OutputFormatterInterface; + +/** + * OutputInterface is the interface implemented by all Output classes. + * + * @author Fabien Potencier + */ +interface OutputInterface +{ + const VERBOSITY_QUIET = 16; + const VERBOSITY_NORMAL = 32; + const VERBOSITY_VERBOSE = 64; + const VERBOSITY_VERY_VERBOSE = 128; + const VERBOSITY_DEBUG = 256; + + const OUTPUT_NORMAL = 1; + const OUTPUT_RAW = 2; + const OUTPUT_PLAIN = 4; + + /** + * Writes a message to the output. + * + * @param string|iterable $messages The message as an iterable of strings or a single string + * @param bool $newline Whether to add a newline + * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL + */ + public function write($messages, bool $newline = false, int $options = 0); + + /** + * Writes a message to the output and adds a newline at the end. + * + * @param string|iterable $messages The message as an iterable of strings or a single string + * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL + */ + public function writeln($messages, int $options = 0); + + /** + * Sets the verbosity of the output. + */ + public function setVerbosity(int $level); + + /** + * Gets the current verbosity of the output. + * + * @return int The current level of verbosity (one of the VERBOSITY constants) + */ + public function getVerbosity(); + + /** + * Returns whether verbosity is quiet (-q). + * + * @return bool true if verbosity is set to VERBOSITY_QUIET, false otherwise + */ + public function isQuiet(); + + /** + * Returns whether verbosity is verbose (-v). + * + * @return bool true if verbosity is set to VERBOSITY_VERBOSE, false otherwise + */ + public function isVerbose(); + + /** + * Returns whether verbosity is very verbose (-vv). + * + * @return bool true if verbosity is set to VERBOSITY_VERY_VERBOSE, false otherwise + */ + public function isVeryVerbose(); + + /** + * Returns whether verbosity is debug (-vvv). + * + * @return bool true if verbosity is set to VERBOSITY_DEBUG, false otherwise + */ + public function isDebug(); + + /** + * Sets the decorated flag. + */ + public function setDecorated(bool $decorated); + + /** + * Gets the decorated flag. + * + * @return bool true if the output will decorate messages, false otherwise + */ + public function isDecorated(); + + public function setFormatter(OutputFormatterInterface $formatter); + + /** + * Returns current output formatter instance. + * + * @return OutputFormatterInterface + */ + public function getFormatter(); +} diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php new file mode 100644 index 0000000..9b78f43 --- /dev/null +++ b/vendor/symfony/console/Output/StreamOutput.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Output; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Formatter\OutputFormatterInterface; + +/** + * StreamOutput writes the output to a given stream. + * + * Usage: + * + * $output = new StreamOutput(fopen('php://stdout', 'w')); + * + * As `StreamOutput` can use any stream, you can also use a file: + * + * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); + * + * @author Fabien Potencier + */ +class StreamOutput extends Output +{ + private $stream; + + /** + * @param resource $stream A stream resource + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) + * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) + * + * @throws InvalidArgumentException When first argument is not a real stream + */ + public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) + { + if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { + throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); + } + + $this->stream = $stream; + + if (null === $decorated) { + $decorated = $this->hasColorSupport(); + } + + parent::__construct($verbosity, $decorated, $formatter); + } + + /** + * Gets the stream attached to this StreamOutput instance. + * + * @return resource A stream resource + */ + public function getStream() + { + return $this->stream; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $message, bool $newline) + { + if ($newline) { + $message .= PHP_EOL; + } + + @fwrite($this->stream, $message); + + fflush($this->stream); + } + + /** + * Returns true if the stream supports colorization. + * + * Colorization is disabled if not supported by the stream: + * + * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo + * terminals via named pipes, so we can only check the environment. + * + * Reference: Composer\XdebugHandler\Process::supportsColor + * https://github.com/composer/xdebug-handler + * + * @return bool true if the stream supports colorization, false otherwise + */ + protected function hasColorSupport() + { + // Follow https://no-color.org/ + if (isset($_SERVER['NO_COLOR']) || false !== getenv('NO_COLOR')) { + return false; + } + + if ('Hyper' === getenv('TERM_PROGRAM')) { + return true; + } + + if (\DIRECTORY_SEPARATOR === '\\') { + return (\function_exists('sapi_windows_vt100_support') + && @sapi_windows_vt100_support($this->stream)) + || false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM'); + } + + return stream_isatty($this->stream); + } +} diff --git a/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/symfony/console/Question/ChoiceQuestion.php new file mode 100644 index 0000000..24e6604 --- /dev/null +++ b/vendor/symfony/console/Question/ChoiceQuestion.php @@ -0,0 +1,182 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Question; + +use Symfony\Component\Console\Exception\InvalidArgumentException; + +/** + * Represents a choice question. + * + * @author Fabien Potencier + */ +class ChoiceQuestion extends Question +{ + private $choices; + private $multiselect = false; + private $prompt = ' > '; + private $errorMessage = 'Value "%s" is invalid'; + + /** + * @param string $question The question to ask to the user + * @param array $choices The list of available choices + * @param mixed $default The default answer to return + */ + public function __construct(string $question, array $choices, $default = null) + { + if (!$choices) { + throw new \LogicException('Choice question must have at least 1 choice available.'); + } + + parent::__construct($question, $default); + + $this->choices = $choices; + $this->setValidator($this->getDefaultValidator()); + $this->setAutocompleterValues($choices); + } + + /** + * Returns available choices. + * + * @return array + */ + public function getChoices() + { + return $this->choices; + } + + /** + * Sets multiselect option. + * + * When multiselect is set to true, multiple choices can be answered. + * + * @return $this + */ + public function setMultiselect(bool $multiselect) + { + $this->multiselect = $multiselect; + $this->setValidator($this->getDefaultValidator()); + + return $this; + } + + /** + * Returns whether the choices are multiselect. + * + * @return bool + */ + public function isMultiselect() + { + return $this->multiselect; + } + + /** + * Gets the prompt for choices. + * + * @return string + */ + public function getPrompt() + { + return $this->prompt; + } + + /** + * Sets the prompt for choices. + * + * @return $this + */ + public function setPrompt(string $prompt) + { + $this->prompt = $prompt; + + return $this; + } + + /** + * Sets the error message for invalid values. + * + * The error message has a string placeholder (%s) for the invalid value. + * + * @return $this + */ + public function setErrorMessage(string $errorMessage) + { + $this->errorMessage = $errorMessage; + $this->setValidator($this->getDefaultValidator()); + + return $this; + } + + private function getDefaultValidator(): callable + { + $choices = $this->choices; + $errorMessage = $this->errorMessage; + $multiselect = $this->multiselect; + $isAssoc = $this->isAssoc($choices); + + return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) { + if ($multiselect) { + // Check for a separated comma values + if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selected, $matches)) { + throw new InvalidArgumentException(sprintf($errorMessage, $selected)); + } + + $selectedChoices = explode(',', $selected); + } else { + $selectedChoices = [$selected]; + } + + if ($this->isTrimmable()) { + foreach ($selectedChoices as $k => $v) { + $selectedChoices[$k] = trim($v); + } + } + + $multiselectChoices = []; + foreach ($selectedChoices as $value) { + $results = []; + foreach ($choices as $key => $choice) { + if ($choice === $value) { + $results[] = $key; + } + } + + if (\count($results) > 1) { + throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of "%s".', implode('" or "', $results))); + } + + $result = array_search($value, $choices); + + if (!$isAssoc) { + if (false !== $result) { + $result = $choices[$result]; + } elseif (isset($choices[$value])) { + $result = $choices[$value]; + } + } elseif (false === $result && isset($choices[$value])) { + $result = $value; + } + + if (false === $result) { + throw new InvalidArgumentException(sprintf($errorMessage, $value)); + } + + $multiselectChoices[] = (string) $result; + } + + if ($multiselect) { + return $multiselectChoices; + } + + return current($multiselectChoices); + }; + } +} diff --git a/vendor/symfony/console/Question/ConfirmationQuestion.php b/vendor/symfony/console/Question/ConfirmationQuestion.php new file mode 100644 index 0000000..4228521 --- /dev/null +++ b/vendor/symfony/console/Question/ConfirmationQuestion.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Question; + +/** + * Represents a yes/no question. + * + * @author Fabien Potencier + */ +class ConfirmationQuestion extends Question +{ + private $trueAnswerRegex; + + /** + * @param string $question The question to ask to the user + * @param bool $default The default answer to return, true or false + * @param string $trueAnswerRegex A regex to match the "yes" answer + */ + public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i') + { + parent::__construct($question, $default); + + $this->trueAnswerRegex = $trueAnswerRegex; + $this->setNormalizer($this->getDefaultNormalizer()); + } + + /** + * Returns the default answer normalizer. + */ + private function getDefaultNormalizer(): callable + { + $default = $this->getDefault(); + $regex = $this->trueAnswerRegex; + + return function ($answer) use ($default, $regex) { + if (\is_bool($answer)) { + return $answer; + } + + $answerIsTrue = (bool) preg_match($regex, $answer); + if (false === $default) { + return $answer && $answerIsTrue; + } + + return '' === $answer || $answerIsTrue; + }; + } +} diff --git a/vendor/symfony/console/Question/Question.php b/vendor/symfony/console/Question/Question.php new file mode 100644 index 0000000..8b0e4d9 --- /dev/null +++ b/vendor/symfony/console/Question/Question.php @@ -0,0 +1,282 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Question; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\LogicException; + +/** + * Represents a Question. + * + * @author Fabien Potencier + */ +class Question +{ + private $question; + private $attempts; + private $hidden = false; + private $hiddenFallback = true; + private $autocompleterCallback; + private $validator; + private $default; + private $normalizer; + private $trimmable = true; + + /** + * @param string $question The question to ask to the user + * @param mixed $default The default answer to return if the user enters nothing + */ + public function __construct(string $question, $default = null) + { + $this->question = $question; + $this->default = $default; + } + + /** + * Returns the question. + * + * @return string + */ + public function getQuestion() + { + return $this->question; + } + + /** + * Returns the default answer. + * + * @return mixed + */ + public function getDefault() + { + return $this->default; + } + + /** + * Returns whether the user response must be hidden. + * + * @return bool + */ + public function isHidden() + { + return $this->hidden; + } + + /** + * Sets whether the user response must be hidden or not. + * + * @param bool $hidden + * + * @return $this + * + * @throws LogicException In case the autocompleter is also used + */ + public function setHidden($hidden) + { + if ($this->autocompleterCallback) { + throw new LogicException('A hidden question cannot use the autocompleter.'); + } + + $this->hidden = (bool) $hidden; + + return $this; + } + + /** + * In case the response can not be hidden, whether to fallback on non-hidden question or not. + * + * @return bool + */ + public function isHiddenFallback() + { + return $this->hiddenFallback; + } + + /** + * Sets whether to fallback on non-hidden question if the response can not be hidden. + * + * @param bool $fallback + * + * @return $this + */ + public function setHiddenFallback($fallback) + { + $this->hiddenFallback = (bool) $fallback; + + return $this; + } + + /** + * Gets values for the autocompleter. + * + * @return iterable|null + */ + public function getAutocompleterValues() + { + $callback = $this->getAutocompleterCallback(); + + return $callback ? $callback('') : null; + } + + /** + * Sets values for the autocompleter. + * + * @return $this + * + * @throws LogicException + */ + public function setAutocompleterValues(?iterable $values) + { + if (\is_array($values)) { + $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values); + + $callback = static function () use ($values) { + return $values; + }; + } elseif ($values instanceof \Traversable) { + $valueCache = null; + $callback = static function () use ($values, &$valueCache) { + return $valueCache ?? $valueCache = iterator_to_array($values, false); + }; + } else { + $callback = null; + } + + return $this->setAutocompleterCallback($callback); + } + + /** + * Gets the callback function used for the autocompleter. + */ + public function getAutocompleterCallback(): ?callable + { + return $this->autocompleterCallback; + } + + /** + * Sets the callback function used for the autocompleter. + * + * The callback is passed the user input as argument and should return an iterable of corresponding suggestions. + * + * @return $this + */ + public function setAutocompleterCallback(callable $callback = null): self + { + if ($this->hidden && null !== $callback) { + throw new LogicException('A hidden question cannot use the autocompleter.'); + } + + $this->autocompleterCallback = $callback; + + return $this; + } + + /** + * Sets a validator for the question. + * + * @return $this + */ + public function setValidator(callable $validator = null) + { + $this->validator = $validator; + + return $this; + } + + /** + * Gets the validator for the question. + * + * @return callable|null + */ + public function getValidator() + { + return $this->validator; + } + + /** + * Sets the maximum number of attempts. + * + * Null means an unlimited number of attempts. + * + * @return $this + * + * @throws InvalidArgumentException in case the number of attempts is invalid + */ + public function setMaxAttempts(?int $attempts) + { + if (null !== $attempts && $attempts < 1) { + throw new InvalidArgumentException('Maximum number of attempts must be a positive value.'); + } + + $this->attempts = $attempts; + + return $this; + } + + /** + * Gets the maximum number of attempts. + * + * Null means an unlimited number of attempts. + * + * @return int|null + */ + public function getMaxAttempts() + { + return $this->attempts; + } + + /** + * Sets a normalizer for the response. + * + * The normalizer can be a callable (a string), a closure or a class implementing __invoke. + * + * @return $this + */ + public function setNormalizer(callable $normalizer) + { + $this->normalizer = $normalizer; + + return $this; + } + + /** + * Gets the normalizer for the response. + * + * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. + * + * @return callable|null + */ + public function getNormalizer() + { + return $this->normalizer; + } + + protected function isAssoc(array $array) + { + return (bool) \count(array_filter(array_keys($array), 'is_string')); + } + + public function isTrimmable(): bool + { + return $this->trimmable; + } + + /** + * @return $this + */ + public function setTrimmable(bool $trimmable): self + { + $this->trimmable = $trimmable; + + return $this; + } +} diff --git a/vendor/symfony/console/README.md b/vendor/symfony/console/README.md new file mode 100644 index 0000000..3e2fc60 --- /dev/null +++ b/vendor/symfony/console/README.md @@ -0,0 +1,20 @@ +Console Component +================= + +The Console component eases the creation of beautiful and testable command line +interfaces. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/console.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) + +Credits +------- + +`Resources/bin/hiddeninput.exe` is a third party binary provided within this +component. Find sources and license at https://github.com/Seldaek/hidden-input. diff --git a/vendor/symfony/console/Resources/bin/hiddeninput.exe b/vendor/symfony/console/Resources/bin/hiddeninput.exe new file mode 100644 index 0000000000000000000000000000000000000000..c8cf65e8d819e6e525121cf6b21f1c2429746038 GIT binary patch literal 9216 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 J0sQ~1{4brj`U(I5 literal 0 HcmV?d00001 diff --git a/vendor/symfony/console/SingleCommandApplication.php b/vendor/symfony/console/SingleCommandApplication.php new file mode 100644 index 0000000..ffa176f --- /dev/null +++ b/vendor/symfony/console/SingleCommandApplication.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * @author Grégoire Pineau + */ +class SingleCommandApplication extends Command +{ + private $version = 'UNKNOWN'; + private $running = false; + + public function setVersion(string $version): self + { + $this->version = $version; + + return $this; + } + + public function run(InputInterface $input = null, OutputInterface $output = null): int + { + if ($this->running) { + return parent::run($input, $output); + } + + // We use the command name as the application name + $application = new Application($this->getName() ?: 'UNKNOWN', $this->version); + // Fix the usage of the command displayed with "--help" + $this->setName($_SERVER['argv'][0]); + $application->add($this); + $application->setDefaultCommand($this->getName(), true); + + $this->running = true; + try { + $ret = $application->run($input, $output); + } finally { + $this->running = false; + } + + return $ret ?? 1; + } +} diff --git a/vendor/symfony/console/Style/OutputStyle.php b/vendor/symfony/console/Style/OutputStyle.php new file mode 100644 index 0000000..d46947f --- /dev/null +++ b/vendor/symfony/console/Style/OutputStyle.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Style; + +use Symfony\Component\Console\Formatter\OutputFormatterInterface; +use Symfony\Component\Console\Helper\ProgressBar; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Decorates output to add console style guide helpers. + * + * @author Kevin Bond + */ +abstract class OutputStyle implements OutputInterface, StyleInterface +{ + private $output; + + public function __construct(OutputInterface $output) + { + $this->output = $output; + } + + /** + * {@inheritdoc} + */ + public function newLine(int $count = 1) + { + $this->output->write(str_repeat(PHP_EOL, $count)); + } + + /** + * @return ProgressBar + */ + public function createProgressBar(int $max = 0) + { + return new ProgressBar($this->output, $max); + } + + /** + * {@inheritdoc} + */ + public function write($messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) + { + $this->output->write($messages, $newline, $type); + } + + /** + * {@inheritdoc} + */ + public function writeln($messages, int $type = self::OUTPUT_NORMAL) + { + $this->output->writeln($messages, $type); + } + + /** + * {@inheritdoc} + */ + public function setVerbosity(int $level) + { + $this->output->setVerbosity($level); + } + + /** + * {@inheritdoc} + */ + public function getVerbosity() + { + return $this->output->getVerbosity(); + } + + /** + * {@inheritdoc} + */ + public function setDecorated(bool $decorated) + { + $this->output->setDecorated($decorated); + } + + /** + * {@inheritdoc} + */ + public function isDecorated() + { + return $this->output->isDecorated(); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + $this->output->setFormatter($formatter); + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->output->getFormatter(); + } + + /** + * {@inheritdoc} + */ + public function isQuiet() + { + return $this->output->isQuiet(); + } + + /** + * {@inheritdoc} + */ + public function isVerbose() + { + return $this->output->isVerbose(); + } + + /** + * {@inheritdoc} + */ + public function isVeryVerbose() + { + return $this->output->isVeryVerbose(); + } + + /** + * {@inheritdoc} + */ + public function isDebug() + { + return $this->output->isDebug(); + } + + protected function getErrorOutput() + { + if (!$this->output instanceof ConsoleOutputInterface) { + return $this->output; + } + + return $this->output->getErrorOutput(); + } +} diff --git a/vendor/symfony/console/Style/StyleInterface.php b/vendor/symfony/console/Style/StyleInterface.php new file mode 100644 index 0000000..afb841c --- /dev/null +++ b/vendor/symfony/console/Style/StyleInterface.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Style; + +/** + * Output style helpers. + * + * @author Kevin Bond + */ +interface StyleInterface +{ + /** + * Formats a command title. + */ + public function title(string $message); + + /** + * Formats a section title. + */ + public function section(string $message); + + /** + * Formats a list. + */ + public function listing(array $elements); + + /** + * Formats informational text. + * + * @param string|array $message + */ + public function text($message); + + /** + * Formats a success result bar. + * + * @param string|array $message + */ + public function success($message); + + /** + * Formats an error result bar. + * + * @param string|array $message + */ + public function error($message); + + /** + * Formats an warning result bar. + * + * @param string|array $message + */ + public function warning($message); + + /** + * Formats a note admonition. + * + * @param string|array $message + */ + public function note($message); + + /** + * Formats a caution admonition. + * + * @param string|array $message + */ + public function caution($message); + + /** + * Formats a table. + */ + public function table(array $headers, array $rows); + + /** + * Asks a question. + * + * @return mixed + */ + public function ask(string $question, ?string $default = null, callable $validator = null); + + /** + * Asks a question with the user input hidden. + * + * @return mixed + */ + public function askHidden(string $question, callable $validator = null); + + /** + * Asks for confirmation. + * + * @return bool + */ + public function confirm(string $question, bool $default = true); + + /** + * Asks a choice question. + * + * @param string|int|null $default + * + * @return mixed + */ + public function choice(string $question, array $choices, $default = null); + + /** + * Add newline(s). + */ + public function newLine(int $count = 1); + + /** + * Starts the progress output. + */ + public function progressStart(int $max = 0); + + /** + * Advances the progress output X steps. + */ + public function progressAdvance(int $step = 1); + + /** + * Finishes the progress output. + */ + public function progressFinish(); +} diff --git a/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/symfony/console/Style/SymfonyStyle.php new file mode 100644 index 0000000..271752f --- /dev/null +++ b/vendor/symfony/console/Style/SymfonyStyle.php @@ -0,0 +1,499 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Style; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Helper\Helper; +use Symfony\Component\Console\Helper\ProgressBar; +use Symfony\Component\Console\Helper\SymfonyQuestionHelper; +use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Helper\TableCell; +use Symfony\Component\Console\Helper\TableSeparator; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\BufferedOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ChoiceQuestion; +use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\Console\Question\Question; +use Symfony\Component\Console\Terminal; + +/** + * Output decorator helpers for the Symfony Style Guide. + * + * @author Kevin Bond + */ +class SymfonyStyle extends OutputStyle +{ + const MAX_LINE_LENGTH = 120; + + private $input; + private $questionHelper; + private $progressBar; + private $lineLength; + private $bufferedOutput; + + public function __construct(InputInterface $input, OutputInterface $output) + { + $this->input = $input; + $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter()); + // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. + $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH; + $this->lineLength = min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH); + + parent::__construct($output); + } + + /** + * Formats a message as a block of text. + * + * @param string|array $messages The message to write in the block + */ + public function block($messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true) + { + $messages = \is_array($messages) ? array_values($messages) : [$messages]; + + $this->autoPrependBlock(); + $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape)); + $this->newLine(); + } + + /** + * {@inheritdoc} + */ + public function title(string $message) + { + $this->autoPrependBlock(); + $this->writeln([ + sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), + sprintf('%s', str_repeat('=', Helper::strlenWithoutDecoration($this->getFormatter(), $message))), + ]); + $this->newLine(); + } + + /** + * {@inheritdoc} + */ + public function section(string $message) + { + $this->autoPrependBlock(); + $this->writeln([ + sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), + sprintf('%s', str_repeat('-', Helper::strlenWithoutDecoration($this->getFormatter(), $message))), + ]); + $this->newLine(); + } + + /** + * {@inheritdoc} + */ + public function listing(array $elements) + { + $this->autoPrependText(); + $elements = array_map(function ($element) { + return sprintf(' * %s', $element); + }, $elements); + + $this->writeln($elements); + $this->newLine(); + } + + /** + * {@inheritdoc} + */ + public function text($message) + { + $this->autoPrependText(); + + $messages = \is_array($message) ? array_values($message) : [$message]; + foreach ($messages as $message) { + $this->writeln(sprintf(' %s', $message)); + } + } + + /** + * Formats a command comment. + * + * @param string|array $message + */ + public function comment($message) + { + $this->block($message, null, null, ' // ', false, false); + } + + /** + * {@inheritdoc} + */ + public function success($message) + { + $this->block($message, 'OK', 'fg=black;bg=green', ' ', true); + } + + /** + * {@inheritdoc} + */ + public function error($message) + { + $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true); + } + + /** + * {@inheritdoc} + */ + public function warning($message) + { + $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true); + } + + /** + * {@inheritdoc} + */ + public function note($message) + { + $this->block($message, 'NOTE', 'fg=yellow', ' ! '); + } + + /** + * {@inheritdoc} + */ + public function caution($message) + { + $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true); + } + + /** + * {@inheritdoc} + */ + public function table(array $headers, array $rows) + { + $style = clone Table::getStyleDefinition('symfony-style-guide'); + $style->setCellHeaderFormat('%s'); + + $table = new Table($this); + $table->setHeaders($headers); + $table->setRows($rows); + $table->setStyle($style); + + $table->render(); + $this->newLine(); + } + + /** + * Formats a horizontal table. + */ + public function horizontalTable(array $headers, array $rows) + { + $style = clone Table::getStyleDefinition('symfony-style-guide'); + $style->setCellHeaderFormat('%s'); + + $table = new Table($this); + $table->setHeaders($headers); + $table->setRows($rows); + $table->setStyle($style); + $table->setHorizontal(true); + + $table->render(); + $this->newLine(); + } + + /** + * Formats a list of key/value horizontally. + * + * Each row can be one of: + * * 'A title' + * * ['key' => 'value'] + * * new TableSeparator() + * + * @param string|array|TableSeparator ...$list + */ + public function definitionList(...$list) + { + $style = clone Table::getStyleDefinition('symfony-style-guide'); + $style->setCellHeaderFormat('%s'); + + $table = new Table($this); + $headers = []; + $row = []; + foreach ($list as $value) { + if ($value instanceof TableSeparator) { + $headers[] = $value; + $row[] = $value; + continue; + } + if (\is_string($value)) { + $headers[] = new TableCell($value, ['colspan' => 2]); + $row[] = null; + continue; + } + if (!\is_array($value)) { + throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.'); + } + $headers[] = key($value); + $row[] = current($value); + } + + $table->setHeaders($headers); + $table->setRows([$row]); + $table->setHorizontal(); + $table->setStyle($style); + + $table->render(); + $this->newLine(); + } + + /** + * {@inheritdoc} + */ + public function ask(string $question, ?string $default = null, $validator = null) + { + $question = new Question($question, $default); + $question->setValidator($validator); + + return $this->askQuestion($question); + } + + /** + * {@inheritdoc} + */ + public function askHidden(string $question, $validator = null) + { + $question = new Question($question); + + $question->setHidden(true); + $question->setValidator($validator); + + return $this->askQuestion($question); + } + + /** + * {@inheritdoc} + */ + public function confirm($question, $default = true) + { + return $this->askQuestion(new ConfirmationQuestion($question, $default)); + } + + /** + * {@inheritdoc} + */ + public function choice(string $question, array $choices, $default = null) + { + if (null !== $default) { + $values = array_flip($choices); + $default = isset($values[$default]) ? $values[$default] : $default; + } + + return $this->askQuestion(new ChoiceQuestion($question, $choices, $default)); + } + + /** + * {@inheritdoc} + */ + public function progressStart(int $max = 0) + { + $this->progressBar = $this->createProgressBar($max); + $this->progressBar->start(); + } + + /** + * {@inheritdoc} + */ + public function progressAdvance(int $step = 1) + { + $this->getProgressBar()->advance($step); + } + + /** + * {@inheritdoc} + */ + public function progressFinish() + { + $this->getProgressBar()->finish(); + $this->newLine(2); + $this->progressBar = null; + } + + /** + * {@inheritdoc} + */ + public function createProgressBar(int $max = 0) + { + $progressBar = parent::createProgressBar($max); + + if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) { + $progressBar->setEmptyBarCharacter('â–‘'); // light shade character \u2591 + $progressBar->setProgressCharacter(''); + $progressBar->setBarCharacter('â–“'); // dark shade character \u2593 + } + + return $progressBar; + } + + /** + * @return mixed + */ + public function askQuestion(Question $question) + { + if ($this->input->isInteractive()) { + $this->autoPrependBlock(); + } + + if (!$this->questionHelper) { + $this->questionHelper = new SymfonyQuestionHelper(); + } + + $answer = $this->questionHelper->ask($this->input, $this, $question); + + if ($this->input->isInteractive()) { + $this->newLine(); + $this->bufferedOutput->write("\n"); + } + + return $answer; + } + + /** + * {@inheritdoc} + */ + public function writeln($messages, int $type = self::OUTPUT_NORMAL) + { + if (!is_iterable($messages)) { + $messages = [$messages]; + } + + foreach ($messages as $message) { + parent::writeln($message, $type); + $this->writeBuffer($message, true, $type); + } + } + + /** + * {@inheritdoc} + */ + public function write($messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) + { + if (!is_iterable($messages)) { + $messages = [$messages]; + } + + foreach ($messages as $message) { + parent::write($message, $newline, $type); + $this->writeBuffer($message, $newline, $type); + } + } + + /** + * {@inheritdoc} + */ + public function newLine(int $count = 1) + { + parent::newLine($count); + $this->bufferedOutput->write(str_repeat("\n", $count)); + } + + /** + * Returns a new instance which makes use of stderr if available. + * + * @return self + */ + public function getErrorStyle() + { + return new self($this->input, $this->getErrorOutput()); + } + + private function getProgressBar(): ProgressBar + { + if (!$this->progressBar) { + throw new RuntimeException('The ProgressBar is not started.'); + } + + return $this->progressBar; + } + + private function autoPrependBlock(): void + { + $chars = substr(str_replace(PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2); + + if (!isset($chars[0])) { + $this->newLine(); //empty history, so we should start with a new line. + + return; + } + //Prepend new line for each non LF chars (This means no blank line was output before) + $this->newLine(2 - substr_count($chars, "\n")); + } + + private function autoPrependText(): void + { + $fetched = $this->bufferedOutput->fetch(); + //Prepend new line if last char isn't EOL: + if ("\n" !== substr($fetched, -1)) { + $this->newLine(); + } + } + + private function writeBuffer(string $message, bool $newLine, int $type): void + { + // We need to know if the two last chars are PHP_EOL + // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer + $this->bufferedOutput->write(substr($message, -4), $newLine, $type); + } + + private function createBlock(iterable $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array + { + $indentLength = 0; + $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix); + $lines = []; + + if (null !== $type) { + $type = sprintf('[%s] ', $type); + $indentLength = \strlen($type); + $lineIndentation = str_repeat(' ', $indentLength); + } + + // wrap and add newlines for each element + foreach ($messages as $key => $message) { + if ($escape) { + $message = OutputFormatter::escape($message); + } + + $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true))); + + if (\count($messages) > 1 && $key < \count($messages) - 1) { + $lines[] = ''; + } + } + + $firstLineIndex = 0; + if ($padding && $this->isDecorated()) { + $firstLineIndex = 1; + array_unshift($lines, ''); + $lines[] = ''; + } + + foreach ($lines as $i => &$line) { + if (null !== $type) { + $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line; + } + + $line = $prefix.$line; + $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line)); + + if ($style) { + $line = sprintf('<%s>%s', $style, $line); + } + } + + return $lines; + } +} diff --git a/vendor/symfony/console/Terminal.php b/vendor/symfony/console/Terminal.php new file mode 100644 index 0000000..b8cc04e --- /dev/null +++ b/vendor/symfony/console/Terminal.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console; + +class Terminal +{ + private static $width; + private static $height; + private static $stty; + + /** + * Gets the terminal width. + * + * @return int + */ + public function getWidth() + { + $width = getenv('COLUMNS'); + if (false !== $width) { + return (int) trim($width); + } + + if (null === self::$width) { + self::initDimensions(); + } + + return self::$width ?: 80; + } + + /** + * Gets the terminal height. + * + * @return int + */ + public function getHeight() + { + $height = getenv('LINES'); + if (false !== $height) { + return (int) trim($height); + } + + if (null === self::$height) { + self::initDimensions(); + } + + return self::$height ?: 50; + } + + /** + * @internal + * + * @return bool + */ + public static function hasSttyAvailable() + { + if (null !== self::$stty) { + return self::$stty; + } + + exec('stty 2>&1', $output, $exitcode); + + return self::$stty = 0 === $exitcode; + } + + private static function initDimensions() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON')), $matches)) { + // extract [w, H] from "wxh (WxH)" + // or [w, h] from "wxh" + self::$width = (int) $matches[1]; + self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2]; + } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) { + // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash) + // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT + self::initDimensionsUsingStty(); + } elseif (null !== $dimensions = self::getConsoleMode()) { + // extract [w, h] from "wxh" + self::$width = (int) $dimensions[0]; + self::$height = (int) $dimensions[1]; + } + } else { + self::initDimensionsUsingStty(); + } + } + + /** + * Returns whether STDOUT has vt100 support (some Windows 10+ configurations). + */ + private static function hasVt100Support(): bool + { + return \function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(fopen('php://stdout', 'w')); + } + + /** + * Initializes dimensions using the output of an stty columns line. + */ + private static function initDimensionsUsingStty() + { + if ($sttyString = self::getSttyColumns()) { + if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { + // extract [w, h] from "rows h; columns w;" + self::$width = (int) $matches[2]; + self::$height = (int) $matches[1]; + } elseif (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { + // extract [w, h] from "; h rows; w columns" + self::$width = (int) $matches[2]; + self::$height = (int) $matches[1]; + } + } + } + + /** + * Runs and parses mode CON if it's available, suppressing any error output. + * + * @return int[]|null An array composed of the width and the height or null if it could not be parsed + */ + private static function getConsoleMode(): ?array + { + $info = self::readFromProcess('mode CON'); + + if (null === $info || !preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { + return null; + } + + return [(int) $matches[2], (int) $matches[1]]; + } + + /** + * Runs and parses stty -a if it's available, suppressing any error output. + */ + private static function getSttyColumns(): ?string + { + return self::readFromProcess('stty -a | grep columns'); + } + + private static function readFromProcess(string $command): ?string + { + if (!\function_exists('proc_open')) { + return null; + } + + $descriptorspec = [ + 1 => ['pipe', 'w'], + 2 => ['pipe', 'w'], + ]; + + $process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); + if (!\is_resource($process)) { + return null; + } + + $info = stream_get_contents($pipes[1]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($process); + + return $info; + } +} diff --git a/vendor/symfony/console/Tester/ApplicationTester.php b/vendor/symfony/console/Tester/ApplicationTester.php new file mode 100644 index 0000000..d021c14 --- /dev/null +++ b/vendor/symfony/console/Tester/ApplicationTester.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tester; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Input\ArrayInput; + +/** + * Eases the testing of console applications. + * + * When testing an application, don't forget to disable the auto exit flag: + * + * $application = new Application(); + * $application->setAutoExit(false); + * + * @author Fabien Potencier + */ +class ApplicationTester +{ + use TesterTrait; + + private $application; + private $input; + private $statusCode; + + public function __construct(Application $application) + { + $this->application = $application; + } + + /** + * Executes the application. + * + * Available options: + * + * * interactive: Sets the input interactive flag + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + * + * @return int The command exit code + */ + public function run(array $input, array $options = []) + { + $this->input = new ArrayInput($input); + if (isset($options['interactive'])) { + $this->input->setInteractive($options['interactive']); + } + + if ($this->inputs) { + $this->input->setStream(self::createStream($this->inputs)); + } + + $this->initOutput($options); + + return $this->statusCode = $this->application->run($this->input, $this->output); + } +} diff --git a/vendor/symfony/console/Tester/CommandTester.php b/vendor/symfony/console/Tester/CommandTester.php new file mode 100644 index 0000000..57efc9a --- /dev/null +++ b/vendor/symfony/console/Tester/CommandTester.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tester; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\ArrayInput; + +/** + * Eases the testing of console commands. + * + * @author Fabien Potencier + * @author Robin Chalas + */ +class CommandTester +{ + use TesterTrait; + + private $command; + private $input; + private $statusCode; + + public function __construct(Command $command) + { + $this->command = $command; + } + + /** + * Executes the command. + * + * Available execution options: + * + * * interactive: Sets the input interactive flag + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + * + * @param array $input An array of command arguments and options + * @param array $options An array of execution options + * + * @return int The command exit code + */ + public function execute(array $input, array $options = []) + { + // set the command name automatically if the application requires + // this argument and no command name was passed + if (!isset($input['command']) + && (null !== $application = $this->command->getApplication()) + && $application->getDefinition()->hasArgument('command') + ) { + $input = array_merge(['command' => $this->command->getName()], $input); + } + + $this->input = new ArrayInput($input); + // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN. + $this->input->setStream(self::createStream($this->inputs)); + + if (isset($options['interactive'])) { + $this->input->setInteractive($options['interactive']); + } + + if (!isset($options['decorated'])) { + $options['decorated'] = false; + } + + $this->initOutput($options); + + return $this->statusCode = $this->command->run($this->input, $this->output); + } +} diff --git a/vendor/symfony/console/Tester/TesterTrait.php b/vendor/symfony/console/Tester/TesterTrait.php new file mode 100644 index 0000000..73ee010 --- /dev/null +++ b/vendor/symfony/console/Tester/TesterTrait.php @@ -0,0 +1,178 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tester; + +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Output\StreamOutput; + +/** + * @author Amrouche Hamza + */ +trait TesterTrait +{ + /** @var StreamOutput */ + private $output; + private $inputs = []; + private $captureStreamsIndependently = false; + + /** + * Gets the display returned by the last execution of the command or application. + * + * @return string The display + */ + public function getDisplay(bool $normalize = false) + { + if (null === $this->output) { + throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?'); + } + + rewind($this->output->getStream()); + + $display = stream_get_contents($this->output->getStream()); + + if ($normalize) { + $display = str_replace(PHP_EOL, "\n", $display); + } + + return $display; + } + + /** + * Gets the output written to STDERR by the application. + * + * @param bool $normalize Whether to normalize end of lines to \n or not + * + * @return string + */ + public function getErrorOutput(bool $normalize = false) + { + if (!$this->captureStreamsIndependently) { + throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); + } + + rewind($this->output->getErrorOutput()->getStream()); + + $display = stream_get_contents($this->output->getErrorOutput()->getStream()); + + if ($normalize) { + $display = str_replace(PHP_EOL, "\n", $display); + } + + return $display; + } + + /** + * Gets the input instance used by the last execution of the command or application. + * + * @return InputInterface The current input instance + */ + public function getInput() + { + return $this->input; + } + + /** + * Gets the output instance used by the last execution of the command or application. + * + * @return OutputInterface The current output instance + */ + public function getOutput() + { + return $this->output; + } + + /** + * Gets the status code returned by the last execution of the command or application. + * + * @return int The status code + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * Sets the user inputs. + * + * @param array $inputs An array of strings representing each input + * passed to the command input stream + * + * @return $this + */ + public function setInputs(array $inputs) + { + $this->inputs = $inputs; + + return $this; + } + + /** + * Initializes the output property. + * + * Available options: + * + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + */ + private function initOutput(array $options) + { + $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; + if (!$this->captureStreamsIndependently) { + $this->output = new StreamOutput(fopen('php://memory', 'w', false)); + if (isset($options['decorated'])) { + $this->output->setDecorated($options['decorated']); + } + if (isset($options['verbosity'])) { + $this->output->setVerbosity($options['verbosity']); + } + } else { + $this->output = new ConsoleOutput( + isset($options['verbosity']) ? $options['verbosity'] : ConsoleOutput::VERBOSITY_NORMAL, + isset($options['decorated']) ? $options['decorated'] : null + ); + + $errorOutput = new StreamOutput(fopen('php://memory', 'w', false)); + $errorOutput->setFormatter($this->output->getFormatter()); + $errorOutput->setVerbosity($this->output->getVerbosity()); + $errorOutput->setDecorated($this->output->isDecorated()); + + $reflectedOutput = new \ReflectionObject($this->output); + $strErrProperty = $reflectedOutput->getProperty('stderr'); + $strErrProperty->setAccessible(true); + $strErrProperty->setValue($this->output, $errorOutput); + + $reflectedParent = $reflectedOutput->getParentClass(); + $streamProperty = $reflectedParent->getProperty('stream'); + $streamProperty->setAccessible(true); + $streamProperty->setValue($this->output, fopen('php://memory', 'w', false)); + } + } + + /** + * @return resource + */ + private static function createStream(array $inputs) + { + $stream = fopen('php://memory', 'r+', false); + + foreach ($inputs as $input) { + fwrite($stream, $input.PHP_EOL); + } + + rewind($stream); + + return $stream; + } +} diff --git a/vendor/symfony/console/composer.json b/vendor/symfony/console/composer.json new file mode 100644 index 0000000..3f7e36a --- /dev/null +++ b/vendor/symfony/console/composer.json @@ -0,0 +1,63 @@ +{ + "name": "symfony/console", + "type": "library", + "description": "Symfony Console Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "suggest": { + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "", + "psr/log": "For using the console logger" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Console\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/css-selector/CHANGELOG.md b/vendor/symfony/css-selector/CHANGELOG.md new file mode 100644 index 0000000..de81fa2 --- /dev/null +++ b/vendor/symfony/css-selector/CHANGELOG.md @@ -0,0 +1,18 @@ +CHANGELOG +========= + +4.4.0 +----- + + * Added support for `*:only-of-type` + +2.8.0 +----- + + * Added the `CssSelectorConverter` class as a non-static API for the component. + * Deprecated the `CssSelector` static API of the component. + +2.1.0 +----- + + * none diff --git a/vendor/symfony/css-selector/CssSelectorConverter.php b/vendor/symfony/css-selector/CssSelectorConverter.php new file mode 100644 index 0000000..bbb6afe --- /dev/null +++ b/vendor/symfony/css-selector/CssSelectorConverter.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector; + +use Symfony\Component\CssSelector\Parser\Shortcut\ClassParser; +use Symfony\Component\CssSelector\Parser\Shortcut\ElementParser; +use Symfony\Component\CssSelector\Parser\Shortcut\EmptyStringParser; +use Symfony\Component\CssSelector\Parser\Shortcut\HashParser; +use Symfony\Component\CssSelector\XPath\Extension\HtmlExtension; +use Symfony\Component\CssSelector\XPath\Translator; + +/** + * CssSelectorConverter is the main entry point of the component and can convert CSS + * selectors to XPath expressions. + * + * @author Christophe Coevoet + */ +class CssSelectorConverter +{ + private $translator; + private $cache; + + private static $xmlCache = []; + private static $htmlCache = []; + + /** + * @param bool $html Whether HTML support should be enabled. Disable it for XML documents + */ + public function __construct(bool $html = true) + { + $this->translator = new Translator(); + + if ($html) { + $this->translator->registerExtension(new HtmlExtension($this->translator)); + $this->cache = &self::$htmlCache; + } else { + $this->cache = &self::$xmlCache; + } + + $this->translator + ->registerParserShortcut(new EmptyStringParser()) + ->registerParserShortcut(new ElementParser()) + ->registerParserShortcut(new ClassParser()) + ->registerParserShortcut(new HashParser()) + ; + } + + /** + * Translates a CSS expression to its XPath equivalent. + * + * Optionally, a prefix can be added to the resulting XPath + * expression with the $prefix parameter. + * + * @return string + */ + public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::') + { + return $this->cache[$prefix][$cssExpr] ?? $this->cache[$prefix][$cssExpr] = $this->translator->cssToXPath($cssExpr, $prefix); + } +} diff --git a/vendor/symfony/css-selector/Exception/ExceptionInterface.php b/vendor/symfony/css-selector/Exception/ExceptionInterface.php new file mode 100644 index 0000000..9e25900 --- /dev/null +++ b/vendor/symfony/css-selector/Exception/ExceptionInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Exception; + +/** + * Interface for exceptions. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/css-selector/Exception/ExpressionErrorException.php b/vendor/symfony/css-selector/Exception/ExpressionErrorException.php new file mode 100644 index 0000000..fd5deea --- /dev/null +++ b/vendor/symfony/css-selector/Exception/ExpressionErrorException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Exception; + +/** + * ParseException is thrown when a CSS selector syntax is not valid. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + */ +class ExpressionErrorException extends ParseException +{ +} diff --git a/vendor/symfony/css-selector/Exception/InternalErrorException.php b/vendor/symfony/css-selector/Exception/InternalErrorException.php new file mode 100644 index 0000000..e60e5ed --- /dev/null +++ b/vendor/symfony/css-selector/Exception/InternalErrorException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Exception; + +/** + * ParseException is thrown when a CSS selector syntax is not valid. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + */ +class InternalErrorException extends ParseException +{ +} diff --git a/vendor/symfony/css-selector/Exception/ParseException.php b/vendor/symfony/css-selector/Exception/ParseException.php new file mode 100644 index 0000000..3b0b0ee --- /dev/null +++ b/vendor/symfony/css-selector/Exception/ParseException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Exception; + +/** + * ParseException is thrown when a CSS selector syntax is not valid. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Fabien Potencier + */ +class ParseException extends \Exception implements ExceptionInterface +{ +} diff --git a/vendor/symfony/css-selector/Exception/SyntaxErrorException.php b/vendor/symfony/css-selector/Exception/SyntaxErrorException.php new file mode 100644 index 0000000..7deacf9 --- /dev/null +++ b/vendor/symfony/css-selector/Exception/SyntaxErrorException.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Exception; + +use Symfony\Component\CssSelector\Parser\Token; + +/** + * ParseException is thrown when a CSS selector syntax is not valid. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + */ +class SyntaxErrorException extends ParseException +{ + /** + * @return self + */ + public static function unexpectedToken(string $expectedValue, Token $foundToken) + { + return new self(sprintf('Expected %s, but %s found.', $expectedValue, $foundToken)); + } + + /** + * @return self + */ + public static function pseudoElementFound(string $pseudoElement, string $unexpectedLocation) + { + return new self(sprintf('Unexpected pseudo-element "::%s" found %s.', $pseudoElement, $unexpectedLocation)); + } + + /** + * @return self + */ + public static function unclosedString(int $position) + { + return new self(sprintf('Unclosed/invalid string at %s.', $position)); + } + + /** + * @return self + */ + public static function nestedNot() + { + return new self('Got nested ::not().'); + } + + /** + * @return self + */ + public static function stringAsFunctionArgument() + { + return new self('String not allowed as function argument.'); + } +} diff --git a/vendor/symfony/css-selector/LICENSE b/vendor/symfony/css-selector/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/css-selector/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/css-selector/Node/AbstractNode.php b/vendor/symfony/css-selector/Node/AbstractNode.php new file mode 100644 index 0000000..1306aea --- /dev/null +++ b/vendor/symfony/css-selector/Node/AbstractNode.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Abstract base node class. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +abstract class AbstractNode implements NodeInterface +{ + /** + * @var string + */ + private $nodeName; + + public function getNodeName(): string + { + if (null === $this->nodeName) { + $this->nodeName = preg_replace('~.*\\\\([^\\\\]+)Node$~', '$1', static::class); + } + + return $this->nodeName; + } +} diff --git a/vendor/symfony/css-selector/Node/AttributeNode.php b/vendor/symfony/css-selector/Node/AttributeNode.php new file mode 100644 index 0000000..bf702d9 --- /dev/null +++ b/vendor/symfony/css-selector/Node/AttributeNode.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a "[| ]" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class AttributeNode extends AbstractNode +{ + private $selector; + private $namespace; + private $attribute; + private $operator; + private $value; + + public function __construct(NodeInterface $selector, ?string $namespace, string $attribute, string $operator, ?string $value) + { + $this->selector = $selector; + $this->namespace = $namespace; + $this->attribute = $attribute; + $this->operator = $operator; + $this->value = $value; + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getNamespace(): ?string + { + return $this->namespace; + } + + public function getAttribute(): string + { + return $this->attribute; + } + + public function getOperator(): string + { + return $this->operator; + } + + public function getValue(): ?string + { + return $this->value; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0)); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + $attribute = $this->namespace ? $this->namespace.'|'.$this->attribute : $this->attribute; + + return 'exists' === $this->operator + ? sprintf('%s[%s[%s]]', $this->getNodeName(), $this->selector, $attribute) + : sprintf("%s[%s[%s %s '%s']]", $this->getNodeName(), $this->selector, $attribute, $this->operator, $this->value); + } +} diff --git a/vendor/symfony/css-selector/Node/ClassNode.php b/vendor/symfony/css-selector/Node/ClassNode.php new file mode 100644 index 0000000..1998b4b --- /dev/null +++ b/vendor/symfony/css-selector/Node/ClassNode.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a "." node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class ClassNode extends AbstractNode +{ + private $selector; + private $name; + + public function __construct(NodeInterface $selector, string $name) + { + $this->selector = $selector; + $this->name = $name; + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getName(): string + { + return $this->name; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0)); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + return sprintf('%s[%s.%s]', $this->getNodeName(), $this->selector, $this->name); + } +} diff --git a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php new file mode 100644 index 0000000..f97fd21 --- /dev/null +++ b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a combined node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class CombinedSelectorNode extends AbstractNode +{ + private $selector; + private $combinator; + private $subSelector; + + public function __construct(NodeInterface $selector, string $combinator, NodeInterface $subSelector) + { + $this->selector = $selector; + $this->combinator = $combinator; + $this->subSelector = $subSelector; + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getCombinator(): string + { + return $this->combinator; + } + + public function getSubSelector(): NodeInterface + { + return $this->subSelector; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus($this->subSelector->getSpecificity()); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + $combinator = ' ' === $this->combinator ? '' : $this->combinator; + + return sprintf('%s[%s %s %s]', $this->getNodeName(), $this->selector, $combinator, $this->subSelector); + } +} diff --git a/vendor/symfony/css-selector/Node/ElementNode.php b/vendor/symfony/css-selector/Node/ElementNode.php new file mode 100644 index 0000000..7949ed9 --- /dev/null +++ b/vendor/symfony/css-selector/Node/ElementNode.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a "|" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class ElementNode extends AbstractNode +{ + private $namespace; + private $element; + + public function __construct(string $namespace = null, string $element = null) + { + $this->namespace = $namespace; + $this->element = $element; + } + + public function getNamespace(): ?string + { + return $this->namespace; + } + + public function getElement(): ?string + { + return $this->element; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return new Specificity(0, 0, $this->element ? 1 : 0); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + $element = $this->element ?: '*'; + + return sprintf('%s[%s]', $this->getNodeName(), $this->namespace ? $this->namespace.'|'.$element : $element); + } +} diff --git a/vendor/symfony/css-selector/Node/FunctionNode.php b/vendor/symfony/css-selector/Node/FunctionNode.php new file mode 100644 index 0000000..d3e9b4f --- /dev/null +++ b/vendor/symfony/css-selector/Node/FunctionNode.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +use Symfony\Component\CssSelector\Parser\Token; + +/** + * Represents a ":()" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class FunctionNode extends AbstractNode +{ + private $selector; + private $name; + private $arguments; + + /** + * @param Token[] $arguments + */ + public function __construct(NodeInterface $selector, string $name, array $arguments = []) + { + $this->selector = $selector; + $this->name = strtolower($name); + $this->arguments = $arguments; + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getName(): string + { + return $this->name; + } + + /** + * @return Token[] + */ + public function getArguments(): array + { + return $this->arguments; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0)); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + $arguments = implode(', ', array_map(function (Token $token) { + return "'".$token->getValue()."'"; + }, $this->arguments)); + + return sprintf('%s[%s:%s(%s)]', $this->getNodeName(), $this->selector, $this->name, $arguments ? '['.$arguments.']' : ''); + } +} diff --git a/vendor/symfony/css-selector/Node/HashNode.php b/vendor/symfony/css-selector/Node/HashNode.php new file mode 100644 index 0000000..f73fa2e --- /dev/null +++ b/vendor/symfony/css-selector/Node/HashNode.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a "#" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class HashNode extends AbstractNode +{ + private $selector; + private $id; + + public function __construct(NodeInterface $selector, string $id) + { + $this->selector = $selector; + $this->id = $id; + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getId(): string + { + return $this->id; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus(new Specificity(1, 0, 0)); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + return sprintf('%s[%s#%s]', $this->getNodeName(), $this->selector, $this->id); + } +} diff --git a/vendor/symfony/css-selector/Node/NegationNode.php b/vendor/symfony/css-selector/Node/NegationNode.php new file mode 100644 index 0000000..afa47cf --- /dev/null +++ b/vendor/symfony/css-selector/Node/NegationNode.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a ":not()" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class NegationNode extends AbstractNode +{ + private $selector; + private $subSelector; + + public function __construct(NodeInterface $selector, NodeInterface $subSelector) + { + $this->selector = $selector; + $this->subSelector = $subSelector; + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getSubSelector(): NodeInterface + { + return $this->subSelector; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus($this->subSelector->getSpecificity()); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + return sprintf('%s[%s:not(%s)]', $this->getNodeName(), $this->selector, $this->subSelector); + } +} diff --git a/vendor/symfony/css-selector/Node/NodeInterface.php b/vendor/symfony/css-selector/Node/NodeInterface.php new file mode 100644 index 0000000..b078d26 --- /dev/null +++ b/vendor/symfony/css-selector/Node/NodeInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Interface for nodes. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +interface NodeInterface +{ + public function getNodeName(): string; + + public function getSpecificity(): Specificity; + + public function __toString(): string; +} diff --git a/vendor/symfony/css-selector/Node/PseudoNode.php b/vendor/symfony/css-selector/Node/PseudoNode.php new file mode 100644 index 0000000..7d4a011 --- /dev/null +++ b/vendor/symfony/css-selector/Node/PseudoNode.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a ":" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class PseudoNode extends AbstractNode +{ + private $selector; + private $identifier; + + public function __construct(NodeInterface $selector, string $identifier) + { + $this->selector = $selector; + $this->identifier = strtolower($identifier); + } + + public function getSelector(): NodeInterface + { + return $this->selector; + } + + public function getIdentifier(): string + { + return $this->identifier; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0)); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + return sprintf('%s[%s:%s]', $this->getNodeName(), $this->selector, $this->identifier); + } +} diff --git a/vendor/symfony/css-selector/Node/SelectorNode.php b/vendor/symfony/css-selector/Node/SelectorNode.php new file mode 100644 index 0000000..a76aa5b --- /dev/null +++ b/vendor/symfony/css-selector/Node/SelectorNode.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a "(::|:)" node. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class SelectorNode extends AbstractNode +{ + private $tree; + private $pseudoElement; + + public function __construct(NodeInterface $tree, string $pseudoElement = null) + { + $this->tree = $tree; + $this->pseudoElement = $pseudoElement ? strtolower($pseudoElement) : null; + } + + public function getTree(): NodeInterface + { + return $this->tree; + } + + public function getPseudoElement(): ?string + { + return $this->pseudoElement; + } + + /** + * {@inheritdoc} + */ + public function getSpecificity(): Specificity + { + return $this->tree->getSpecificity()->plus(new Specificity(0, 0, $this->pseudoElement ? 1 : 0)); + } + + /** + * {@inheritdoc} + */ + public function __toString(): string + { + return sprintf('%s[%s%s]', $this->getNodeName(), $this->tree, $this->pseudoElement ? '::'.$this->pseudoElement : ''); + } +} diff --git a/vendor/symfony/css-selector/Node/Specificity.php b/vendor/symfony/css-selector/Node/Specificity.php new file mode 100644 index 0000000..d0ac8aa --- /dev/null +++ b/vendor/symfony/css-selector/Node/Specificity.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Node; + +/** + * Represents a node specificity. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @see http://www.w3.org/TR/selectors/#specificity + * + * @author Jean-François Simon + * + * @internal + */ +class Specificity +{ + const A_FACTOR = 100; + const B_FACTOR = 10; + const C_FACTOR = 1; + + private $a; + private $b; + private $c; + + public function __construct(int $a, int $b, int $c) + { + $this->a = $a; + $this->b = $b; + $this->c = $c; + } + + public function plus(self $specificity): self + { + return new self($this->a + $specificity->a, $this->b + $specificity->b, $this->c + $specificity->c); + } + + public function getValue(): int + { + return $this->a * self::A_FACTOR + $this->b * self::B_FACTOR + $this->c * self::C_FACTOR; + } + + /** + * Returns -1 if the object specificity is lower than the argument, + * 0 if they are equal, and 1 if the argument is lower. + */ + public function compareTo(self $specificity): int + { + if ($this->a !== $specificity->a) { + return $this->a > $specificity->a ? 1 : -1; + } + + if ($this->b !== $specificity->b) { + return $this->b > $specificity->b ? 1 : -1; + } + + if ($this->c !== $specificity->c) { + return $this->c > $specificity->c ? 1 : -1; + } + + return 0; + } +} diff --git a/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php b/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php new file mode 100644 index 0000000..93f3188 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector comment handler. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class CommentHandler implements HandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(Reader $reader, TokenStream $stream): bool + { + if ('/*' !== $reader->getSubstring(2)) { + return false; + } + + $offset = $reader->getOffset('*/'); + + if (false === $offset) { + $reader->moveToEnd(); + } else { + $reader->moveForward($offset + 2); + } + + return true; + } +} diff --git a/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php b/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php new file mode 100644 index 0000000..9ec714d --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector handler interface. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +interface HandlerInterface +{ + public function handle(Reader $reader, TokenStream $stream): bool; +} diff --git a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php new file mode 100644 index 0000000..7ae9b43 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\Token; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector comment handler. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class HashHandler implements HandlerInterface +{ + private $patterns; + private $escaping; + + public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) + { + $this->patterns = $patterns; + $this->escaping = $escaping; + } + + /** + * {@inheritdoc} + */ + public function handle(Reader $reader, TokenStream $stream): bool + { + $match = $reader->findPattern($this->patterns->getHashPattern()); + + if (!$match) { + return false; + } + + $value = $this->escaping->escapeUnicode($match[1]); + $stream->push(new Token(Token::TYPE_HASH, $value, $reader->getPosition())); + $reader->moveForward(\strlen($match[0])); + + return true; + } +} diff --git a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php new file mode 100644 index 0000000..7b2a14e --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\Token; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector comment handler. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class IdentifierHandler implements HandlerInterface +{ + private $patterns; + private $escaping; + + public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) + { + $this->patterns = $patterns; + $this->escaping = $escaping; + } + + /** + * {@inheritdoc} + */ + public function handle(Reader $reader, TokenStream $stream): bool + { + $match = $reader->findPattern($this->patterns->getIdentifierPattern()); + + if (!$match) { + return false; + } + + $value = $this->escaping->escapeUnicode($match[0]); + $stream->push(new Token(Token::TYPE_IDENTIFIER, $value, $reader->getPosition())); + $reader->moveForward(\strlen($match[0])); + + return true; + } +} diff --git a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php new file mode 100644 index 0000000..8291a68 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\Token; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector comment handler. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class NumberHandler implements HandlerInterface +{ + private $patterns; + + public function __construct(TokenizerPatterns $patterns) + { + $this->patterns = $patterns; + } + + /** + * {@inheritdoc} + */ + public function handle(Reader $reader, TokenStream $stream): bool + { + $match = $reader->findPattern($this->patterns->getNumberPattern()); + + if (!$match) { + return false; + } + + $stream->push(new Token(Token::TYPE_NUMBER, $match[0], $reader->getPosition())); + $reader->moveForward(\strlen($match[0])); + + return true; + } +} diff --git a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php new file mode 100644 index 0000000..6ce83cd --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Exception\InternalErrorException; +use Symfony\Component\CssSelector\Exception\SyntaxErrorException; +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\Token; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping; +use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector comment handler. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class StringHandler implements HandlerInterface +{ + private $patterns; + private $escaping; + + public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) + { + $this->patterns = $patterns; + $this->escaping = $escaping; + } + + /** + * {@inheritdoc} + */ + public function handle(Reader $reader, TokenStream $stream): bool + { + $quote = $reader->getSubstring(1); + + if (!\in_array($quote, ["'", '"'])) { + return false; + } + + $reader->moveForward(1); + $match = $reader->findPattern($this->patterns->getQuotedStringPattern($quote)); + + if (!$match) { + throw new InternalErrorException(sprintf('Should have found at least an empty match at %d.', $reader->getPosition())); + } + + // check unclosed strings + if (\strlen($match[0]) === $reader->getRemainingLength()) { + throw SyntaxErrorException::unclosedString($reader->getPosition() - 1); + } + + // check quotes pairs validity + if ($quote !== $reader->getSubstring(1, \strlen($match[0]))) { + throw SyntaxErrorException::unclosedString($reader->getPosition() - 1); + } + + $string = $this->escaping->escapeUnicodeAndNewLine($match[0]); + $stream->push(new Token(Token::TYPE_STRING, $string, $reader->getPosition())); + $reader->moveForward(\strlen($match[0]) + 1); + + return true; + } +} diff --git a/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php b/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php new file mode 100644 index 0000000..21345e3 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Handler; + +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\Token; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector whitespace handler. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class WhitespaceHandler implements HandlerInterface +{ + /** + * {@inheritdoc} + */ + public function handle(Reader $reader, TokenStream $stream): bool + { + $match = $reader->findPattern('~^[ \t\r\n\f]+~'); + + if (false === $match) { + return false; + } + + $stream->push(new Token(Token::TYPE_WHITESPACE, $match[0], $reader->getPosition())); + $reader->moveForward(\strlen($match[0])); + + return true; + } +} diff --git a/vendor/symfony/css-selector/Parser/Parser.php b/vendor/symfony/css-selector/Parser/Parser.php new file mode 100644 index 0000000..e8a46c0 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Parser.php @@ -0,0 +1,353 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser; + +use Symfony\Component\CssSelector\Exception\SyntaxErrorException; +use Symfony\Component\CssSelector\Node; +use Symfony\Component\CssSelector\Parser\Tokenizer\Tokenizer; + +/** + * CSS selector parser. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class Parser implements ParserInterface +{ + private $tokenizer; + + public function __construct(Tokenizer $tokenizer = null) + { + $this->tokenizer = $tokenizer ?: new Tokenizer(); + } + + /** + * {@inheritdoc} + */ + public function parse(string $source): array + { + $reader = new Reader($source); + $stream = $this->tokenizer->tokenize($reader); + + return $this->parseSelectorList($stream); + } + + /** + * Parses the arguments for ":nth-child()" and friends. + * + * @param Token[] $tokens + * + * @throws SyntaxErrorException + */ + public static function parseSeries(array $tokens): array + { + foreach ($tokens as $token) { + if ($token->isString()) { + throw SyntaxErrorException::stringAsFunctionArgument(); + } + } + + $joined = trim(implode('', array_map(function (Token $token) { + return $token->getValue(); + }, $tokens))); + + $int = function ($string) { + if (!is_numeric($string)) { + throw SyntaxErrorException::stringAsFunctionArgument(); + } + + return (int) $string; + }; + + switch (true) { + case 'odd' === $joined: + return [2, 1]; + case 'even' === $joined: + return [2, 0]; + case 'n' === $joined: + return [1, 0]; + case false === strpos($joined, 'n'): + return [0, $int($joined)]; + } + + $split = explode('n', $joined); + $first = isset($split[0]) ? $split[0] : null; + + return [ + $first ? ('-' === $first || '+' === $first ? $int($first.'1') : $int($first)) : 1, + isset($split[1]) && $split[1] ? $int($split[1]) : 0, + ]; + } + + private function parseSelectorList(TokenStream $stream): array + { + $stream->skipWhitespace(); + $selectors = []; + + while (true) { + $selectors[] = $this->parserSelectorNode($stream); + + if ($stream->getPeek()->isDelimiter([','])) { + $stream->getNext(); + $stream->skipWhitespace(); + } else { + break; + } + } + + return $selectors; + } + + private function parserSelectorNode(TokenStream $stream): Node\SelectorNode + { + list($result, $pseudoElement) = $this->parseSimpleSelector($stream); + + while (true) { + $stream->skipWhitespace(); + $peek = $stream->getPeek(); + + if ($peek->isFileEnd() || $peek->isDelimiter([','])) { + break; + } + + if (null !== $pseudoElement) { + throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector'); + } + + if ($peek->isDelimiter(['+', '>', '~'])) { + $combinator = $stream->getNext()->getValue(); + $stream->skipWhitespace(); + } else { + $combinator = ' '; + } + + list($nextSelector, $pseudoElement) = $this->parseSimpleSelector($stream); + $result = new Node\CombinedSelectorNode($result, $combinator, $nextSelector); + } + + return new Node\SelectorNode($result, $pseudoElement); + } + + /** + * Parses next simple node (hash, class, pseudo, negation). + * + * @throws SyntaxErrorException + */ + private function parseSimpleSelector(TokenStream $stream, bool $insideNegation = false): array + { + $stream->skipWhitespace(); + + $selectorStart = \count($stream->getUsed()); + $result = $this->parseElementNode($stream); + $pseudoElement = null; + + while (true) { + $peek = $stream->getPeek(); + if ($peek->isWhitespace() + || $peek->isFileEnd() + || $peek->isDelimiter([',', '+', '>', '~']) + || ($insideNegation && $peek->isDelimiter([')'])) + ) { + break; + } + + if (null !== $pseudoElement) { + throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector'); + } + + if ($peek->isHash()) { + $result = new Node\HashNode($result, $stream->getNext()->getValue()); + } elseif ($peek->isDelimiter(['.'])) { + $stream->getNext(); + $result = new Node\ClassNode($result, $stream->getNextIdentifier()); + } elseif ($peek->isDelimiter(['['])) { + $stream->getNext(); + $result = $this->parseAttributeNode($result, $stream); + } elseif ($peek->isDelimiter([':'])) { + $stream->getNext(); + + if ($stream->getPeek()->isDelimiter([':'])) { + $stream->getNext(); + $pseudoElement = $stream->getNextIdentifier(); + + continue; + } + + $identifier = $stream->getNextIdentifier(); + if (\in_array(strtolower($identifier), ['first-line', 'first-letter', 'before', 'after'])) { + // Special case: CSS 2.1 pseudo-elements can have a single ':'. + // Any new pseudo-element must have two. + $pseudoElement = $identifier; + + continue; + } + + if (!$stream->getPeek()->isDelimiter(['('])) { + $result = new Node\PseudoNode($result, $identifier); + + continue; + } + + $stream->getNext(); + $stream->skipWhitespace(); + + if ('not' === strtolower($identifier)) { + if ($insideNegation) { + throw SyntaxErrorException::nestedNot(); + } + + list($argument, $argumentPseudoElement) = $this->parseSimpleSelector($stream, true); + $next = $stream->getNext(); + + if (null !== $argumentPseudoElement) { + throw SyntaxErrorException::pseudoElementFound($argumentPseudoElement, 'inside ::not()'); + } + + if (!$next->isDelimiter([')'])) { + throw SyntaxErrorException::unexpectedToken('")"', $next); + } + + $result = new Node\NegationNode($result, $argument); + } else { + $arguments = []; + $next = null; + + while (true) { + $stream->skipWhitespace(); + $next = $stream->getNext(); + + if ($next->isIdentifier() + || $next->isString() + || $next->isNumber() + || $next->isDelimiter(['+', '-']) + ) { + $arguments[] = $next; + } elseif ($next->isDelimiter([')'])) { + break; + } else { + throw SyntaxErrorException::unexpectedToken('an argument', $next); + } + } + + if (empty($arguments)) { + throw SyntaxErrorException::unexpectedToken('at least one argument', $next); + } + + $result = new Node\FunctionNode($result, $identifier, $arguments); + } + } else { + throw SyntaxErrorException::unexpectedToken('selector', $peek); + } + } + + if (\count($stream->getUsed()) === $selectorStart) { + throw SyntaxErrorException::unexpectedToken('selector', $stream->getPeek()); + } + + return [$result, $pseudoElement]; + } + + private function parseElementNode(TokenStream $stream): Node\ElementNode + { + $peek = $stream->getPeek(); + + if ($peek->isIdentifier() || $peek->isDelimiter(['*'])) { + if ($peek->isIdentifier()) { + $namespace = $stream->getNext()->getValue(); + } else { + $stream->getNext(); + $namespace = null; + } + + if ($stream->getPeek()->isDelimiter(['|'])) { + $stream->getNext(); + $element = $stream->getNextIdentifierOrStar(); + } else { + $element = $namespace; + $namespace = null; + } + } else { + $element = $namespace = null; + } + + return new Node\ElementNode($namespace, $element); + } + + private function parseAttributeNode(Node\NodeInterface $selector, TokenStream $stream): Node\AttributeNode + { + $stream->skipWhitespace(); + $attribute = $stream->getNextIdentifierOrStar(); + + if (null === $attribute && !$stream->getPeek()->isDelimiter(['|'])) { + throw SyntaxErrorException::unexpectedToken('"|"', $stream->getPeek()); + } + + if ($stream->getPeek()->isDelimiter(['|'])) { + $stream->getNext(); + + if ($stream->getPeek()->isDelimiter(['='])) { + $namespace = null; + $stream->getNext(); + $operator = '|='; + } else { + $namespace = $attribute; + $attribute = $stream->getNextIdentifier(); + $operator = null; + } + } else { + $namespace = $operator = null; + } + + if (null === $operator) { + $stream->skipWhitespace(); + $next = $stream->getNext(); + + if ($next->isDelimiter([']'])) { + return new Node\AttributeNode($selector, $namespace, $attribute, 'exists', null); + } elseif ($next->isDelimiter(['='])) { + $operator = '='; + } elseif ($next->isDelimiter(['^', '$', '*', '~', '|', '!']) + && $stream->getPeek()->isDelimiter(['=']) + ) { + $operator = $next->getValue().'='; + $stream->getNext(); + } else { + throw SyntaxErrorException::unexpectedToken('operator', $next); + } + } + + $stream->skipWhitespace(); + $value = $stream->getNext(); + + if ($value->isNumber()) { + // if the value is a number, it's casted into a string + $value = new Token(Token::TYPE_STRING, (string) $value->getValue(), $value->getPosition()); + } + + if (!($value->isIdentifier() || $value->isString())) { + throw SyntaxErrorException::unexpectedToken('string or identifier', $value); + } + + $stream->skipWhitespace(); + $next = $stream->getNext(); + + if (!$next->isDelimiter([']'])) { + throw SyntaxErrorException::unexpectedToken('"]"', $next); + } + + return new Node\AttributeNode($selector, $namespace, $attribute, $operator, $value->getValue()); + } +} diff --git a/vendor/symfony/css-selector/Parser/ParserInterface.php b/vendor/symfony/css-selector/Parser/ParserInterface.php new file mode 100644 index 0000000..51c3d93 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/ParserInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser; + +use Symfony\Component\CssSelector\Node\SelectorNode; + +/** + * CSS selector parser interface. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +interface ParserInterface +{ + /** + * Parses given selector source into an array of tokens. + * + * @return SelectorNode[] + */ + public function parse(string $source): array; +} diff --git a/vendor/symfony/css-selector/Parser/Reader.php b/vendor/symfony/css-selector/Parser/Reader.php new file mode 100644 index 0000000..4b43eff --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Reader.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser; + +/** + * CSS selector reader. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class Reader +{ + private $source; + private $length; + private $position = 0; + + public function __construct(string $source) + { + $this->source = $source; + $this->length = \strlen($source); + } + + public function isEOF(): bool + { + return $this->position >= $this->length; + } + + public function getPosition(): int + { + return $this->position; + } + + public function getRemainingLength(): int + { + return $this->length - $this->position; + } + + public function getSubstring(int $length, int $offset = 0): string + { + return substr($this->source, $this->position + $offset, $length); + } + + public function getOffset(string $string) + { + $position = strpos($this->source, $string, $this->position); + + return false === $position ? false : $position - $this->position; + } + + /** + * @return array|false + */ + public function findPattern(string $pattern) + { + $source = substr($this->source, $this->position); + + if (preg_match($pattern, $source, $matches)) { + return $matches; + } + + return false; + } + + public function moveForward(int $length) + { + $this->position += $length; + } + + public function moveToEnd() + { + $this->position = $this->length; + } +} diff --git a/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php b/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php new file mode 100644 index 0000000..17fa8c2 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Shortcut; + +use Symfony\Component\CssSelector\Node\ClassNode; +use Symfony\Component\CssSelector\Node\ElementNode; +use Symfony\Component\CssSelector\Node\SelectorNode; +use Symfony\Component\CssSelector\Parser\ParserInterface; + +/** + * CSS selector class parser shortcut. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class ClassParser implements ParserInterface +{ + /** + * {@inheritdoc} + */ + public function parse(string $source): array + { + // Matches an optional namespace, optional element, and required class + // $source = 'test|input.ab6bd_field'; + // $matches = array (size=4) + // 0 => string 'test|input.ab6bd_field' (length=22) + // 1 => string 'test' (length=4) + // 2 => string 'input' (length=5) + // 3 => string 'ab6bd_field' (length=11) + if (preg_match('/^(?:([a-z]++)\|)?+([\w-]++|\*)?+\.([\w-]++)$/i', trim($source), $matches)) { + return [ + new SelectorNode(new ClassNode(new ElementNode($matches[1] ?: null, $matches[2] ?: null), $matches[3])), + ]; + } + + return []; + } +} diff --git a/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php b/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php new file mode 100644 index 0000000..8b9a863 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Shortcut; + +use Symfony\Component\CssSelector\Node\ElementNode; +use Symfony\Component\CssSelector\Node\SelectorNode; +use Symfony\Component\CssSelector\Parser\ParserInterface; + +/** + * CSS selector element parser shortcut. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class ElementParser implements ParserInterface +{ + /** + * {@inheritdoc} + */ + public function parse(string $source): array + { + // Matches an optional namespace, required element or `*` + // $source = 'testns|testel'; + // $matches = array (size=3) + // 0 => string 'testns|testel' (length=13) + // 1 => string 'testns' (length=6) + // 2 => string 'testel' (length=6) + if (preg_match('/^(?:([a-z]++)\|)?([\w-]++|\*)$/i', trim($source), $matches)) { + return [new SelectorNode(new ElementNode($matches[1] ?: null, $matches[2]))]; + } + + return []; + } +} diff --git a/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php b/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php new file mode 100644 index 0000000..222df5c --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Shortcut; + +use Symfony\Component\CssSelector\Node\ElementNode; +use Symfony\Component\CssSelector\Node\SelectorNode; +use Symfony\Component\CssSelector\Parser\ParserInterface; + +/** + * CSS selector class parser shortcut. + * + * This shortcut ensure compatibility with previous version. + * - The parser fails to parse an empty string. + * - In the previous version, an empty string matches each tags. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class EmptyStringParser implements ParserInterface +{ + /** + * {@inheritdoc} + */ + public function parse(string $source): array + { + // Matches an empty string + if ('' == $source) { + return [new SelectorNode(new ElementNode(null, '*'))]; + } + + return []; + } +} diff --git a/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php b/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php new file mode 100644 index 0000000..fb07ee6 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Shortcut; + +use Symfony\Component\CssSelector\Node\ElementNode; +use Symfony\Component\CssSelector\Node\HashNode; +use Symfony\Component\CssSelector\Node\SelectorNode; +use Symfony\Component\CssSelector\Parser\ParserInterface; + +/** + * CSS selector hash parser shortcut. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class HashParser implements ParserInterface +{ + /** + * {@inheritdoc} + */ + public function parse(string $source): array + { + // Matches an optional namespace, optional element, and required id + // $source = 'test|input#ab6bd_field'; + // $matches = array (size=4) + // 0 => string 'test|input#ab6bd_field' (length=22) + // 1 => string 'test' (length=4) + // 2 => string 'input' (length=5) + // 3 => string 'ab6bd_field' (length=11) + if (preg_match('/^(?:([a-z]++)\|)?+([\w-]++|\*)?+#([\w-]++)$/i', trim($source), $matches)) { + return [ + new SelectorNode(new HashNode(new ElementNode($matches[1] ?: null, $matches[2] ?: null), $matches[3])), + ]; + } + + return []; + } +} diff --git a/vendor/symfony/css-selector/Parser/Token.php b/vendor/symfony/css-selector/Parser/Token.php new file mode 100644 index 0000000..9a32485 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Token.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser; + +/** + * CSS selector token. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class Token +{ + const TYPE_FILE_END = 'eof'; + const TYPE_DELIMITER = 'delimiter'; + const TYPE_WHITESPACE = 'whitespace'; + const TYPE_IDENTIFIER = 'identifier'; + const TYPE_HASH = 'hash'; + const TYPE_NUMBER = 'number'; + const TYPE_STRING = 'string'; + + private $type; + private $value; + private $position; + + public function __construct(?string $type, ?string $value, ?int $position) + { + $this->type = $type; + $this->value = $value; + $this->position = $position; + } + + public function getType(): ?int + { + return $this->type; + } + + public function getValue(): ?string + { + return $this->value; + } + + public function getPosition(): ?int + { + return $this->position; + } + + public function isFileEnd(): bool + { + return self::TYPE_FILE_END === $this->type; + } + + public function isDelimiter(array $values = []): bool + { + if (self::TYPE_DELIMITER !== $this->type) { + return false; + } + + if (empty($values)) { + return true; + } + + return \in_array($this->value, $values); + } + + public function isWhitespace(): bool + { + return self::TYPE_WHITESPACE === $this->type; + } + + public function isIdentifier(): bool + { + return self::TYPE_IDENTIFIER === $this->type; + } + + public function isHash(): bool + { + return self::TYPE_HASH === $this->type; + } + + public function isNumber(): bool + { + return self::TYPE_NUMBER === $this->type; + } + + public function isString(): bool + { + return self::TYPE_STRING === $this->type; + } + + public function __toString(): string + { + if ($this->value) { + return sprintf('<%s "%s" at %s>', $this->type, $this->value, $this->position); + } + + return sprintf('<%s at %s>', $this->type, $this->position); + } +} diff --git a/vendor/symfony/css-selector/Parser/TokenStream.php b/vendor/symfony/css-selector/Parser/TokenStream.php new file mode 100644 index 0000000..f4c2585 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/TokenStream.php @@ -0,0 +1,171 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser; + +use Symfony\Component\CssSelector\Exception\InternalErrorException; +use Symfony\Component\CssSelector\Exception\SyntaxErrorException; + +/** + * CSS selector token stream. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class TokenStream +{ + /** + * @var Token[] + */ + private $tokens = []; + + /** + * @var Token[] + */ + private $used = []; + + /** + * @var int + */ + private $cursor = 0; + + /** + * @var Token|null + */ + private $peeked; + + /** + * @var bool + */ + private $peeking = false; + + /** + * Pushes a token. + * + * @return $this + */ + public function push(Token $token): self + { + $this->tokens[] = $token; + + return $this; + } + + /** + * Freezes stream. + * + * @return $this + */ + public function freeze(): self + { + return $this; + } + + /** + * Returns next token. + * + * @throws InternalErrorException If there is no more token + */ + public function getNext(): Token + { + if ($this->peeking) { + $this->peeking = false; + $this->used[] = $this->peeked; + + return $this->peeked; + } + + if (!isset($this->tokens[$this->cursor])) { + throw new InternalErrorException('Unexpected token stream end.'); + } + + return $this->tokens[$this->cursor++]; + } + + /** + * Returns peeked token. + */ + public function getPeek(): Token + { + if (!$this->peeking) { + $this->peeked = $this->getNext(); + $this->peeking = true; + } + + return $this->peeked; + } + + /** + * Returns used tokens. + * + * @return Token[] + */ + public function getUsed(): array + { + return $this->used; + } + + /** + * Returns nex identifier token. + * + * @return string The identifier token value + * + * @throws SyntaxErrorException If next token is not an identifier + */ + public function getNextIdentifier(): string + { + $next = $this->getNext(); + + if (!$next->isIdentifier()) { + throw SyntaxErrorException::unexpectedToken('identifier', $next); + } + + return $next->getValue(); + } + + /** + * Returns nex identifier or star delimiter token. + * + * @return string|null The identifier token value or null if star found + * + * @throws SyntaxErrorException If next token is not an identifier or a star delimiter + */ + public function getNextIdentifierOrStar(): ?string + { + $next = $this->getNext(); + + if ($next->isIdentifier()) { + return $next->getValue(); + } + + if ($next->isDelimiter(['*'])) { + return null; + } + + throw SyntaxErrorException::unexpectedToken('identifier or "*"', $next); + } + + /** + * Skips next whitespace if any. + */ + public function skipWhitespace() + { + $peek = $this->getPeek(); + + if ($peek->isWhitespace()) { + $this->getNext(); + } + } +} diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php new file mode 100644 index 0000000..e0dcc5b --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Tokenizer; + +use Symfony\Component\CssSelector\Parser\Handler; +use Symfony\Component\CssSelector\Parser\Reader; +use Symfony\Component\CssSelector\Parser\Token; +use Symfony\Component\CssSelector\Parser\TokenStream; + +/** + * CSS selector tokenizer. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class Tokenizer +{ + /** + * @var Handler\HandlerInterface[] + */ + private $handlers; + + public function __construct() + { + $patterns = new TokenizerPatterns(); + $escaping = new TokenizerEscaping($patterns); + + $this->handlers = [ + new Handler\WhitespaceHandler(), + new Handler\IdentifierHandler($patterns, $escaping), + new Handler\HashHandler($patterns, $escaping), + new Handler\StringHandler($patterns, $escaping), + new Handler\NumberHandler($patterns), + new Handler\CommentHandler(), + ]; + } + + /** + * Tokenize selector source code. + */ + public function tokenize(Reader $reader): TokenStream + { + $stream = new TokenStream(); + + while (!$reader->isEOF()) { + foreach ($this->handlers as $handler) { + if ($handler->handle($reader, $stream)) { + continue 2; + } + } + + $stream->push(new Token(Token::TYPE_DELIMITER, $reader->getSubstring(1), $reader->getPosition())); + $reader->moveForward(1); + } + + return $stream + ->push(new Token(Token::TYPE_FILE_END, null, $reader->getPosition())) + ->freeze(); + } +} diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php new file mode 100644 index 0000000..013e827 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Tokenizer; + +/** + * CSS selector tokenizer escaping applier. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class TokenizerEscaping +{ + private $patterns; + + public function __construct(TokenizerPatterns $patterns) + { + $this->patterns = $patterns; + } + + public function escapeUnicode(string $value): string + { + $value = $this->replaceUnicodeSequences($value); + + return preg_replace($this->patterns->getSimpleEscapePattern(), '$1', $value); + } + + public function escapeUnicodeAndNewLine(string $value): string + { + $value = preg_replace($this->patterns->getNewLineEscapePattern(), '', $value); + + return $this->escapeUnicode($value); + } + + private function replaceUnicodeSequences(string $value): string + { + return preg_replace_callback($this->patterns->getUnicodeEscapePattern(), function ($match) { + $c = hexdec($match[1]); + + if (0x80 > $c %= 0x200000) { + return \chr($c); + } + if (0x800 > $c) { + return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F); + } + if (0x10000 > $c) { + return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F); + } + + return ''; + }, $value); + } +} diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php new file mode 100644 index 0000000..5f16ac4 --- /dev/null +++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\Parser\Tokenizer; + +/** + * CSS selector tokenizer patterns builder. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class TokenizerPatterns +{ + private $unicodeEscapePattern; + private $simpleEscapePattern; + private $newLineEscapePattern; + private $escapePattern; + private $stringEscapePattern; + private $nonAsciiPattern; + private $nmCharPattern; + private $nmStartPattern; + private $identifierPattern; + private $hashPattern; + private $numberPattern; + private $quotedStringPattern; + + public function __construct() + { + $this->unicodeEscapePattern = '\\\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?'; + $this->simpleEscapePattern = '\\\\(.)'; + $this->newLineEscapePattern = '\\\\(?:\n|\r\n|\r|\f)'; + $this->escapePattern = $this->unicodeEscapePattern.'|\\\\[^\n\r\f0-9a-f]'; + $this->stringEscapePattern = $this->newLineEscapePattern.'|'.$this->escapePattern; + $this->nonAsciiPattern = '[^\x00-\x7F]'; + $this->nmCharPattern = '[_a-z0-9-]|'.$this->escapePattern.'|'.$this->nonAsciiPattern; + $this->nmStartPattern = '[_a-z]|'.$this->escapePattern.'|'.$this->nonAsciiPattern; + $this->identifierPattern = '-?(?:'.$this->nmStartPattern.')(?:'.$this->nmCharPattern.')*'; + $this->hashPattern = '#((?:'.$this->nmCharPattern.')+)'; + $this->numberPattern = '[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)'; + $this->quotedStringPattern = '([^\n\r\f%s]|'.$this->stringEscapePattern.')*'; + } + + public function getNewLineEscapePattern(): string + { + return '~^'.$this->newLineEscapePattern.'~'; + } + + public function getSimpleEscapePattern(): string + { + return '~^'.$this->simpleEscapePattern.'~'; + } + + public function getUnicodeEscapePattern(): string + { + return '~^'.$this->unicodeEscapePattern.'~i'; + } + + public function getIdentifierPattern(): string + { + return '~^'.$this->identifierPattern.'~i'; + } + + public function getHashPattern(): string + { + return '~^'.$this->hashPattern.'~i'; + } + + public function getNumberPattern(): string + { + return '~^'.$this->numberPattern.'~'; + } + + public function getQuotedStringPattern(string $quote): string + { + return '~^'.sprintf($this->quotedStringPattern, $quote).'~i'; + } +} diff --git a/vendor/symfony/css-selector/README.md b/vendor/symfony/css-selector/README.md new file mode 100644 index 0000000..7c4c411 --- /dev/null +++ b/vendor/symfony/css-selector/README.md @@ -0,0 +1,20 @@ +CssSelector Component +===================== + +The CssSelector component converts CSS selectors to XPath expressions. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/css_selector.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) + +Credits +------- + +This component is a port of the Python cssselect library +[v0.7.1](https://github.com/SimonSapin/cssselect/releases/tag/v0.7.1), +which is distributed under the BSD license. diff --git a/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php b/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php new file mode 100644 index 0000000..44e0035 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +/** + * XPath expression translator abstract extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +abstract class AbstractExtension implements ExtensionInterface +{ + /** + * {@inheritdoc} + */ + public function getNodeTranslators(): array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function getCombinationTranslators(): array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function getFunctionTranslators(): array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function getPseudoClassTranslators(): array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function getAttributeMatchingTranslators(): array + { + return []; + } +} diff --git a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php new file mode 100644 index 0000000..a9879f1 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +use Symfony\Component\CssSelector\XPath\Translator; +use Symfony\Component\CssSelector\XPath\XPathExpr; + +/** + * XPath expression translator attribute extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class AttributeMatchingExtension extends AbstractExtension +{ + /** + * {@inheritdoc} + */ + public function getAttributeMatchingTranslators(): array + { + return [ + 'exists' => [$this, 'translateExists'], + '=' => [$this, 'translateEquals'], + '~=' => [$this, 'translateIncludes'], + '|=' => [$this, 'translateDashMatch'], + '^=' => [$this, 'translatePrefixMatch'], + '$=' => [$this, 'translateSuffixMatch'], + '*=' => [$this, 'translateSubstringMatch'], + '!=' => [$this, 'translateDifferent'], + ]; + } + + public function translateExists(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition($attribute); + } + + public function translateEquals(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition(sprintf('%s = %s', $attribute, Translator::getXpathLiteral($value))); + } + + public function translateIncludes(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition($value ? sprintf( + '%1$s and contains(concat(\' \', normalize-space(%1$s), \' \'), %2$s)', + $attribute, + Translator::getXpathLiteral(' '.$value.' ') + ) : '0'); + } + + public function translateDashMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition(sprintf( + '%1$s and (%1$s = %2$s or starts-with(%1$s, %3$s))', + $attribute, + Translator::getXpathLiteral($value), + Translator::getXpathLiteral($value.'-') + )); + } + + public function translatePrefixMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition($value ? sprintf( + '%1$s and starts-with(%1$s, %2$s)', + $attribute, + Translator::getXpathLiteral($value) + ) : '0'); + } + + public function translateSuffixMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition($value ? sprintf( + '%1$s and substring(%1$s, string-length(%1$s)-%2$s) = %3$s', + $attribute, + \strlen($value) - 1, + Translator::getXpathLiteral($value) + ) : '0'); + } + + public function translateSubstringMatch(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition($value ? sprintf( + '%1$s and contains(%1$s, %2$s)', + $attribute, + Translator::getXpathLiteral($value) + ) : '0'); + } + + public function translateDifferent(XPathExpr $xpath, string $attribute, ?string $value): XPathExpr + { + return $xpath->addCondition(sprintf( + $value ? 'not(%1$s) or %1$s != %2$s' : '%s != %s', + $attribute, + Translator::getXpathLiteral($value) + )); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'attribute-matching'; + } +} diff --git a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php new file mode 100644 index 0000000..aee976e --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +use Symfony\Component\CssSelector\XPath\XPathExpr; + +/** + * XPath expression translator combination extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class CombinationExtension extends AbstractExtension +{ + /** + * {@inheritdoc} + */ + public function getCombinationTranslators(): array + { + return [ + ' ' => [$this, 'translateDescendant'], + '>' => [$this, 'translateChild'], + '+' => [$this, 'translateDirectAdjacent'], + '~' => [$this, 'translateIndirectAdjacent'], + ]; + } + + public function translateDescendant(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr + { + return $xpath->join('/descendant-or-self::*/', $combinedXpath); + } + + public function translateChild(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr + { + return $xpath->join('/', $combinedXpath); + } + + public function translateDirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr + { + return $xpath + ->join('/following-sibling::', $combinedXpath) + ->addNameTest() + ->addCondition('position() = 1'); + } + + public function translateIndirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr + { + return $xpath->join('/following-sibling::', $combinedXpath); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'combination'; + } +} diff --git a/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php b/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php new file mode 100644 index 0000000..1a74b90 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +/** + * XPath expression translator extension interface. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +interface ExtensionInterface +{ + /** + * Returns node translators. + * + * These callables will receive the node as first argument and the translator as second argument. + * + * @return callable[] + */ + public function getNodeTranslators(): array; + + /** + * Returns combination translators. + * + * @return callable[] + */ + public function getCombinationTranslators(): array; + + /** + * Returns function translators. + * + * @return callable[] + */ + public function getFunctionTranslators(): array; + + /** + * Returns pseudo-class translators. + * + * @return callable[] + */ + public function getPseudoClassTranslators(): array; + + /** + * Returns attribute operation translators. + * + * @return callable[] + */ + public function getAttributeMatchingTranslators(): array; + + /** + * Returns extension name. + */ + public function getName(): string; +} diff --git a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php new file mode 100644 index 0000000..2b79aaa --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php @@ -0,0 +1,171 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +use Symfony\Component\CssSelector\Exception\ExpressionErrorException; +use Symfony\Component\CssSelector\Exception\SyntaxErrorException; +use Symfony\Component\CssSelector\Node\FunctionNode; +use Symfony\Component\CssSelector\Parser\Parser; +use Symfony\Component\CssSelector\XPath\Translator; +use Symfony\Component\CssSelector\XPath\XPathExpr; + +/** + * XPath expression translator function extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class FunctionExtension extends AbstractExtension +{ + /** + * {@inheritdoc} + */ + public function getFunctionTranslators(): array + { + return [ + 'nth-child' => [$this, 'translateNthChild'], + 'nth-last-child' => [$this, 'translateNthLastChild'], + 'nth-of-type' => [$this, 'translateNthOfType'], + 'nth-last-of-type' => [$this, 'translateNthLastOfType'], + 'contains' => [$this, 'translateContains'], + 'lang' => [$this, 'translateLang'], + ]; + } + + /** + * @throws ExpressionErrorException + */ + public function translateNthChild(XPathExpr $xpath, FunctionNode $function, bool $last = false, bool $addNameTest = true): XPathExpr + { + try { + list($a, $b) = Parser::parseSeries($function->getArguments()); + } catch (SyntaxErrorException $e) { + throw new ExpressionErrorException(sprintf('Invalid series: "%s".', implode('", "', $function->getArguments())), 0, $e); + } + + $xpath->addStarPrefix(); + if ($addNameTest) { + $xpath->addNameTest(); + } + + if (0 === $a) { + return $xpath->addCondition('position() = '.($last ? 'last() - '.($b - 1) : $b)); + } + + if ($a < 0) { + if ($b < 1) { + return $xpath->addCondition('false()'); + } + + $sign = '<='; + } else { + $sign = '>='; + } + + $expr = 'position()'; + + if ($last) { + $expr = 'last() - '.$expr; + --$b; + } + + if (0 !== $b) { + $expr .= ' - '.$b; + } + + $conditions = [sprintf('%s %s 0', $expr, $sign)]; + + if (1 !== $a && -1 !== $a) { + $conditions[] = sprintf('(%s) mod %d = 0', $expr, $a); + } + + return $xpath->addCondition(implode(' and ', $conditions)); + + // todo: handle an+b, odd, even + // an+b means every-a, plus b, e.g., 2n+1 means odd + // 0n+b means b + // n+0 means a=1, i.e., all elements + // an means every a elements, i.e., 2n means even + // -n means -1n + // -1n+6 means elements 6 and previous + } + + public function translateNthLastChild(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + return $this->translateNthChild($xpath, $function, true); + } + + public function translateNthOfType(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + return $this->translateNthChild($xpath, $function, false, false); + } + + /** + * @throws ExpressionErrorException + */ + public function translateNthLastOfType(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + if ('*' === $xpath->getElement()) { + throw new ExpressionErrorException('"*:nth-of-type()" is not implemented.'); + } + + return $this->translateNthChild($xpath, $function, true, false); + } + + /** + * @throws ExpressionErrorException + */ + public function translateContains(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + $arguments = $function->getArguments(); + foreach ($arguments as $token) { + if (!($token->isString() || $token->isIdentifier())) { + throw new ExpressionErrorException('Expected a single string or identifier for :contains(), got '.implode(', ', $arguments)); + } + } + + return $xpath->addCondition(sprintf( + 'contains(string(.), %s)', + Translator::getXpathLiteral($arguments[0]->getValue()) + )); + } + + /** + * @throws ExpressionErrorException + */ + public function translateLang(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + $arguments = $function->getArguments(); + foreach ($arguments as $token) { + if (!($token->isString() || $token->isIdentifier())) { + throw new ExpressionErrorException('Expected a single string or identifier for :lang(), got '.implode(', ', $arguments)); + } + } + + return $xpath->addCondition(sprintf( + 'lang(%s)', + Translator::getXpathLiteral($arguments[0]->getValue()) + )); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'function'; + } +} diff --git a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php new file mode 100644 index 0000000..6edc085 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php @@ -0,0 +1,187 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +use Symfony\Component\CssSelector\Exception\ExpressionErrorException; +use Symfony\Component\CssSelector\Node\FunctionNode; +use Symfony\Component\CssSelector\XPath\Translator; +use Symfony\Component\CssSelector\XPath\XPathExpr; + +/** + * XPath expression translator HTML extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class HtmlExtension extends AbstractExtension +{ + public function __construct(Translator $translator) + { + $translator + ->getExtension('node') + ->setFlag(NodeExtension::ELEMENT_NAME_IN_LOWER_CASE, true) + ->setFlag(NodeExtension::ATTRIBUTE_NAME_IN_LOWER_CASE, true); + } + + /** + * {@inheritdoc} + */ + public function getPseudoClassTranslators(): array + { + return [ + 'checked' => [$this, 'translateChecked'], + 'link' => [$this, 'translateLink'], + 'disabled' => [$this, 'translateDisabled'], + 'enabled' => [$this, 'translateEnabled'], + 'selected' => [$this, 'translateSelected'], + 'invalid' => [$this, 'translateInvalid'], + 'hover' => [$this, 'translateHover'], + 'visited' => [$this, 'translateVisited'], + ]; + } + + /** + * {@inheritdoc} + */ + public function getFunctionTranslators(): array + { + return [ + 'lang' => [$this, 'translateLang'], + ]; + } + + public function translateChecked(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition( + '(@checked ' + ."and (name(.) = 'input' or name(.) = 'command')" + ."and (@type = 'checkbox' or @type = 'radio'))" + ); + } + + public function translateLink(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition("@href and (name(.) = 'a' or name(.) = 'link' or name(.) = 'area')"); + } + + public function translateDisabled(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition( + '(' + .'@disabled and' + .'(' + ."(name(.) = 'input' and @type != 'hidden')" + ." or name(.) = 'button'" + ." or name(.) = 'select'" + ." or name(.) = 'textarea'" + ." or name(.) = 'command'" + ." or name(.) = 'fieldset'" + ." or name(.) = 'optgroup'" + ." or name(.) = 'option'" + .')' + .') or (' + ."(name(.) = 'input' and @type != 'hidden')" + ." or name(.) = 'button'" + ." or name(.) = 'select'" + ." or name(.) = 'textarea'" + .')' + .' and ancestor::fieldset[@disabled]' + ); + // todo: in the second half, add "and is not a descendant of that fieldset element's first legend element child, if any." + } + + public function translateEnabled(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition( + '(' + .'@href and (' + ."name(.) = 'a'" + ." or name(.) = 'link'" + ." or name(.) = 'area'" + .')' + .') or (' + .'(' + ."name(.) = 'command'" + ." or name(.) = 'fieldset'" + ." or name(.) = 'optgroup'" + .')' + .' and not(@disabled)' + .') or (' + .'(' + ."(name(.) = 'input' and @type != 'hidden')" + ." or name(.) = 'button'" + ." or name(.) = 'select'" + ." or name(.) = 'textarea'" + ." or name(.) = 'keygen'" + .')' + .' and not (@disabled or ancestor::fieldset[@disabled])' + .') or (' + ."name(.) = 'option' and not(" + .'@disabled or ancestor::optgroup[@disabled]' + .')' + .')' + ); + } + + /** + * @throws ExpressionErrorException + */ + public function translateLang(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + $arguments = $function->getArguments(); + foreach ($arguments as $token) { + if (!($token->isString() || $token->isIdentifier())) { + throw new ExpressionErrorException('Expected a single string or identifier for :lang(), got '.implode(', ', $arguments)); + } + } + + return $xpath->addCondition(sprintf( + 'ancestor-or-self::*[@lang][1][starts-with(concat(' + ."translate(@%s, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '-')" + .', %s)]', + 'lang', + Translator::getXpathLiteral(strtolower($arguments[0]->getValue()).'-') + )); + } + + public function translateSelected(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition("(@selected and name(.) = 'option')"); + } + + public function translateInvalid(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition('0'); + } + + public function translateHover(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition('0'); + } + + public function translateVisited(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition('0'); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'html'; + } +} diff --git a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php new file mode 100644 index 0000000..3a26a88 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php @@ -0,0 +1,197 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +use Symfony\Component\CssSelector\Node; +use Symfony\Component\CssSelector\XPath\Translator; +use Symfony\Component\CssSelector\XPath\XPathExpr; + +/** + * XPath expression translator node extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class NodeExtension extends AbstractExtension +{ + const ELEMENT_NAME_IN_LOWER_CASE = 1; + const ATTRIBUTE_NAME_IN_LOWER_CASE = 2; + const ATTRIBUTE_VALUE_IN_LOWER_CASE = 4; + + private $flags; + + public function __construct(int $flags = 0) + { + $this->flags = $flags; + } + + /** + * @return $this + */ + public function setFlag(int $flag, bool $on): self + { + if ($on && !$this->hasFlag($flag)) { + $this->flags += $flag; + } + + if (!$on && $this->hasFlag($flag)) { + $this->flags -= $flag; + } + + return $this; + } + + public function hasFlag(int $flag): bool + { + return (bool) ($this->flags & $flag); + } + + /** + * {@inheritdoc} + */ + public function getNodeTranslators(): array + { + return [ + 'Selector' => [$this, 'translateSelector'], + 'CombinedSelector' => [$this, 'translateCombinedSelector'], + 'Negation' => [$this, 'translateNegation'], + 'Function' => [$this, 'translateFunction'], + 'Pseudo' => [$this, 'translatePseudo'], + 'Attribute' => [$this, 'translateAttribute'], + 'Class' => [$this, 'translateClass'], + 'Hash' => [$this, 'translateHash'], + 'Element' => [$this, 'translateElement'], + ]; + } + + public function translateSelector(Node\SelectorNode $node, Translator $translator): XPathExpr + { + return $translator->nodeToXPath($node->getTree()); + } + + public function translateCombinedSelector(Node\CombinedSelectorNode $node, Translator $translator): XPathExpr + { + return $translator->addCombination($node->getCombinator(), $node->getSelector(), $node->getSubSelector()); + } + + public function translateNegation(Node\NegationNode $node, Translator $translator): XPathExpr + { + $xpath = $translator->nodeToXPath($node->getSelector()); + $subXpath = $translator->nodeToXPath($node->getSubSelector()); + $subXpath->addNameTest(); + + if ($subXpath->getCondition()) { + return $xpath->addCondition(sprintf('not(%s)', $subXpath->getCondition())); + } + + return $xpath->addCondition('0'); + } + + public function translateFunction(Node\FunctionNode $node, Translator $translator): XPathExpr + { + $xpath = $translator->nodeToXPath($node->getSelector()); + + return $translator->addFunction($xpath, $node); + } + + public function translatePseudo(Node\PseudoNode $node, Translator $translator): XPathExpr + { + $xpath = $translator->nodeToXPath($node->getSelector()); + + return $translator->addPseudoClass($xpath, $node->getIdentifier()); + } + + public function translateAttribute(Node\AttributeNode $node, Translator $translator): XPathExpr + { + $name = $node->getAttribute(); + $safe = $this->isSafeName($name); + + if ($this->hasFlag(self::ATTRIBUTE_NAME_IN_LOWER_CASE)) { + $name = strtolower($name); + } + + if ($node->getNamespace()) { + $name = sprintf('%s:%s', $node->getNamespace(), $name); + $safe = $safe && $this->isSafeName($node->getNamespace()); + } + + $attribute = $safe ? '@'.$name : sprintf('attribute::*[name() = %s]', Translator::getXpathLiteral($name)); + $value = $node->getValue(); + $xpath = $translator->nodeToXPath($node->getSelector()); + + if ($this->hasFlag(self::ATTRIBUTE_VALUE_IN_LOWER_CASE)) { + $value = strtolower($value); + } + + return $translator->addAttributeMatching($xpath, $node->getOperator(), $attribute, $value); + } + + public function translateClass(Node\ClassNode $node, Translator $translator): XPathExpr + { + $xpath = $translator->nodeToXPath($node->getSelector()); + + return $translator->addAttributeMatching($xpath, '~=', '@class', $node->getName()); + } + + public function translateHash(Node\HashNode $node, Translator $translator): XPathExpr + { + $xpath = $translator->nodeToXPath($node->getSelector()); + + return $translator->addAttributeMatching($xpath, '=', '@id', $node->getId()); + } + + public function translateElement(Node\ElementNode $node): XPathExpr + { + $element = $node->getElement(); + + if ($this->hasFlag(self::ELEMENT_NAME_IN_LOWER_CASE)) { + $element = strtolower($element); + } + + if ($element) { + $safe = $this->isSafeName($element); + } else { + $element = '*'; + $safe = true; + } + + if ($node->getNamespace()) { + $element = sprintf('%s:%s', $node->getNamespace(), $element); + $safe = $safe && $this->isSafeName($node->getNamespace()); + } + + $xpath = new XPathExpr('', $element); + + if (!$safe) { + $xpath->addNameTest(); + } + + return $xpath; + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'node'; + } + + private function isSafeName(string $name): bool + { + return 0 < preg_match('~^[a-zA-Z_][a-zA-Z0-9_.-]*$~', $name); + } +} diff --git a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php new file mode 100644 index 0000000..a50b048 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath\Extension; + +use Symfony\Component\CssSelector\Exception\ExpressionErrorException; +use Symfony\Component\CssSelector\XPath\XPathExpr; + +/** + * XPath expression translator pseudo-class extension. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class PseudoClassExtension extends AbstractExtension +{ + /** + * {@inheritdoc} + */ + public function getPseudoClassTranslators(): array + { + return [ + 'root' => [$this, 'translateRoot'], + 'first-child' => [$this, 'translateFirstChild'], + 'last-child' => [$this, 'translateLastChild'], + 'first-of-type' => [$this, 'translateFirstOfType'], + 'last-of-type' => [$this, 'translateLastOfType'], + 'only-child' => [$this, 'translateOnlyChild'], + 'only-of-type' => [$this, 'translateOnlyOfType'], + 'empty' => [$this, 'translateEmpty'], + ]; + } + + public function translateRoot(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition('not(parent::*)'); + } + + public function translateFirstChild(XPathExpr $xpath): XPathExpr + { + return $xpath + ->addStarPrefix() + ->addNameTest() + ->addCondition('position() = 1'); + } + + public function translateLastChild(XPathExpr $xpath): XPathExpr + { + return $xpath + ->addStarPrefix() + ->addNameTest() + ->addCondition('position() = last()'); + } + + /** + * @throws ExpressionErrorException + */ + public function translateFirstOfType(XPathExpr $xpath): XPathExpr + { + if ('*' === $xpath->getElement()) { + throw new ExpressionErrorException('"*:first-of-type" is not implemented.'); + } + + return $xpath + ->addStarPrefix() + ->addCondition('position() = 1'); + } + + /** + * @throws ExpressionErrorException + */ + public function translateLastOfType(XPathExpr $xpath): XPathExpr + { + if ('*' === $xpath->getElement()) { + throw new ExpressionErrorException('"*:last-of-type" is not implemented.'); + } + + return $xpath + ->addStarPrefix() + ->addCondition('position() = last()'); + } + + public function translateOnlyChild(XPathExpr $xpath): XPathExpr + { + return $xpath + ->addStarPrefix() + ->addNameTest() + ->addCondition('last() = 1'); + } + + public function translateOnlyOfType(XPathExpr $xpath): XPathExpr + { + $element = $xpath->getElement(); + + return $xpath->addCondition(sprintf('count(preceding-sibling::%s)=0 and count(following-sibling::%s)=0', $element, $element)); + } + + public function translateEmpty(XPathExpr $xpath): XPathExpr + { + return $xpath->addCondition('not(*) and not(string-length())'); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'pseudo-class'; + } +} diff --git a/vendor/symfony/css-selector/XPath/Translator.php b/vendor/symfony/css-selector/XPath/Translator.php new file mode 100644 index 0000000..d1b6518 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/Translator.php @@ -0,0 +1,230 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath; + +use Symfony\Component\CssSelector\Exception\ExpressionErrorException; +use Symfony\Component\CssSelector\Node\FunctionNode; +use Symfony\Component\CssSelector\Node\NodeInterface; +use Symfony\Component\CssSelector\Node\SelectorNode; +use Symfony\Component\CssSelector\Parser\Parser; +use Symfony\Component\CssSelector\Parser\ParserInterface; + +/** + * XPath expression translator interface. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class Translator implements TranslatorInterface +{ + private $mainParser; + + /** + * @var ParserInterface[] + */ + private $shortcutParsers = []; + + /** + * @var Extension\ExtensionInterface[] + */ + private $extensions = []; + + private $nodeTranslators = []; + private $combinationTranslators = []; + private $functionTranslators = []; + private $pseudoClassTranslators = []; + private $attributeMatchingTranslators = []; + + public function __construct(ParserInterface $parser = null) + { + $this->mainParser = $parser ?: new Parser(); + + $this + ->registerExtension(new Extension\NodeExtension()) + ->registerExtension(new Extension\CombinationExtension()) + ->registerExtension(new Extension\FunctionExtension()) + ->registerExtension(new Extension\PseudoClassExtension()) + ->registerExtension(new Extension\AttributeMatchingExtension()) + ; + } + + public static function getXpathLiteral(string $element): string + { + if (false === strpos($element, "'")) { + return "'".$element."'"; + } + + if (false === strpos($element, '"')) { + return '"'.$element.'"'; + } + + $string = $element; + $parts = []; + while (true) { + if (false !== $pos = strpos($string, "'")) { + $parts[] = sprintf("'%s'", substr($string, 0, $pos)); + $parts[] = "\"'\""; + $string = substr($string, $pos + 1); + } else { + $parts[] = "'$string'"; + break; + } + } + + return sprintf('concat(%s)', implode(', ', $parts)); + } + + /** + * {@inheritdoc} + */ + public function cssToXPath(string $cssExpr, string $prefix = 'descendant-or-self::'): string + { + $selectors = $this->parseSelectors($cssExpr); + + /** @var SelectorNode $selector */ + foreach ($selectors as $index => $selector) { + if (null !== $selector->getPseudoElement()) { + throw new ExpressionErrorException('Pseudo-elements are not supported.'); + } + + $selectors[$index] = $this->selectorToXPath($selector, $prefix); + } + + return implode(' | ', $selectors); + } + + /** + * {@inheritdoc} + */ + public function selectorToXPath(SelectorNode $selector, string $prefix = 'descendant-or-self::'): string + { + return ($prefix ?: '').$this->nodeToXPath($selector); + } + + /** + * @return $this + */ + public function registerExtension(Extension\ExtensionInterface $extension): self + { + $this->extensions[$extension->getName()] = $extension; + + $this->nodeTranslators = array_merge($this->nodeTranslators, $extension->getNodeTranslators()); + $this->combinationTranslators = array_merge($this->combinationTranslators, $extension->getCombinationTranslators()); + $this->functionTranslators = array_merge($this->functionTranslators, $extension->getFunctionTranslators()); + $this->pseudoClassTranslators = array_merge($this->pseudoClassTranslators, $extension->getPseudoClassTranslators()); + $this->attributeMatchingTranslators = array_merge($this->attributeMatchingTranslators, $extension->getAttributeMatchingTranslators()); + + return $this; + } + + /** + * @throws ExpressionErrorException + */ + public function getExtension(string $name): Extension\ExtensionInterface + { + if (!isset($this->extensions[$name])) { + throw new ExpressionErrorException(sprintf('Extension "%s" not registered.', $name)); + } + + return $this->extensions[$name]; + } + + /** + * @return $this + */ + public function registerParserShortcut(ParserInterface $shortcut): self + { + $this->shortcutParsers[] = $shortcut; + + return $this; + } + + /** + * @throws ExpressionErrorException + */ + public function nodeToXPath(NodeInterface $node): XPathExpr + { + if (!isset($this->nodeTranslators[$node->getNodeName()])) { + throw new ExpressionErrorException(sprintf('Node "%s" not supported.', $node->getNodeName())); + } + + return $this->nodeTranslators[$node->getNodeName()]($node, $this); + } + + /** + * @throws ExpressionErrorException + */ + public function addCombination(string $combiner, NodeInterface $xpath, NodeInterface $combinedXpath): XPathExpr + { + if (!isset($this->combinationTranslators[$combiner])) { + throw new ExpressionErrorException(sprintf('Combiner "%s" not supported.', $combiner)); + } + + return $this->combinationTranslators[$combiner]($this->nodeToXPath($xpath), $this->nodeToXPath($combinedXpath)); + } + + /** + * @throws ExpressionErrorException + */ + public function addFunction(XPathExpr $xpath, FunctionNode $function): XPathExpr + { + if (!isset($this->functionTranslators[$function->getName()])) { + throw new ExpressionErrorException(sprintf('Function "%s" not supported.', $function->getName())); + } + + return $this->functionTranslators[$function->getName()]($xpath, $function); + } + + /** + * @throws ExpressionErrorException + */ + public function addPseudoClass(XPathExpr $xpath, string $pseudoClass): XPathExpr + { + if (!isset($this->pseudoClassTranslators[$pseudoClass])) { + throw new ExpressionErrorException(sprintf('Pseudo-class "%s" not supported.', $pseudoClass)); + } + + return $this->pseudoClassTranslators[$pseudoClass]($xpath); + } + + /** + * @throws ExpressionErrorException + */ + public function addAttributeMatching(XPathExpr $xpath, string $operator, string $attribute, $value): XPathExpr + { + if (!isset($this->attributeMatchingTranslators[$operator])) { + throw new ExpressionErrorException(sprintf('Attribute matcher operator "%s" not supported.', $operator)); + } + + return $this->attributeMatchingTranslators[$operator]($xpath, $attribute, $value); + } + + /** + * @return SelectorNode[] + */ + private function parseSelectors(string $css): array + { + foreach ($this->shortcutParsers as $shortcut) { + $tokens = $shortcut->parse($css); + + if (!empty($tokens)) { + return $tokens; + } + } + + return $this->mainParser->parse($css); + } +} diff --git a/vendor/symfony/css-selector/XPath/TranslatorInterface.php b/vendor/symfony/css-selector/XPath/TranslatorInterface.php new file mode 100644 index 0000000..c19eefb --- /dev/null +++ b/vendor/symfony/css-selector/XPath/TranslatorInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath; + +use Symfony\Component\CssSelector\Node\SelectorNode; + +/** + * XPath expression translator interface. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +interface TranslatorInterface +{ + /** + * Translates a CSS selector to an XPath expression. + */ + public function cssToXPath(string $cssExpr, string $prefix = 'descendant-or-self::'): string; + + /** + * Translates a parsed selector node to an XPath expression. + */ + public function selectorToXPath(SelectorNode $selector, string $prefix = 'descendant-or-self::'): string; +} diff --git a/vendor/symfony/css-selector/XPath/XPathExpr.php b/vendor/symfony/css-selector/XPath/XPathExpr.php new file mode 100644 index 0000000..638cbd0 --- /dev/null +++ b/vendor/symfony/css-selector/XPath/XPathExpr.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\CssSelector\XPath; + +/** + * XPath expression translator interface. + * + * This component is a port of the Python cssselect library, + * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. + * + * @author Jean-François Simon + * + * @internal + */ +class XPathExpr +{ + private $path; + private $element; + private $condition; + + public function __construct(string $path = '', string $element = '*', string $condition = '', bool $starPrefix = false) + { + $this->path = $path; + $this->element = $element; + $this->condition = $condition; + + if ($starPrefix) { + $this->addStarPrefix(); + } + } + + public function getElement(): string + { + return $this->element; + } + + public function addCondition(string $condition): self + { + $this->condition = $this->condition ? sprintf('(%s) and (%s)', $this->condition, $condition) : $condition; + + return $this; + } + + public function getCondition(): string + { + return $this->condition; + } + + public function addNameTest(): self + { + if ('*' !== $this->element) { + $this->addCondition('name() = '.Translator::getXpathLiteral($this->element)); + $this->element = '*'; + } + + return $this; + } + + public function addStarPrefix(): self + { + $this->path .= '*/'; + + return $this; + } + + /** + * Joins another XPathExpr with a combiner. + * + * @return $this + */ + public function join(string $combiner, self $expr): self + { + $path = $this->__toString().$combiner; + + if ('*/' !== $expr->path) { + $path .= $expr->path; + } + + $this->path = $path; + $this->element = $expr->element; + $this->condition = $expr->condition; + + return $this; + } + + public function __toString(): string + { + $path = $this->path.$this->element; + $condition = null === $this->condition || '' === $this->condition ? '' : '['.$this->condition.']'; + + return $path.$condition; + } +} diff --git a/vendor/symfony/css-selector/composer.json b/vendor/symfony/css-selector/composer.json new file mode 100644 index 0000000..19c9f34 --- /dev/null +++ b/vendor/symfony/css-selector/composer.json @@ -0,0 +1,37 @@ +{ + "name": "symfony/css-selector", + "type": "library", + "description": "Symfony CssSelector Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\CssSelector\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/deprecation-contracts/.gitignore b/vendor/symfony/deprecation-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md new file mode 100644 index 0000000..e984777 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/master/CHANGELOG.md diff --git a/vendor/symfony/deprecation-contracts/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE new file mode 100644 index 0000000..5593b1d --- /dev/null +++ b/vendor/symfony/deprecation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/deprecation-contracts/README.md b/vendor/symfony/deprecation-contracts/README.md new file mode 100644 index 0000000..4957933 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/README.md @@ -0,0 +1,26 @@ +Symfony Deprecation Contracts +============================= + +A generic function and convention to trigger deprecation notices. + +This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. + +By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, +the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. + +The function requires at least 3 arguments: + - the name of the Composer package that is triggering the deprecation + - the version of the package that introduced the deprecation + - the message of the deprecation + - more arguments can be provided: they will be inserted in the message using `printf()` formatting + +Example: +```php +trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); +``` + +This will generate the following message: +`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` + +While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty +`function trigger_deprecation() {}` in your application. diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json new file mode 100644 index 0000000..2aa3b5d --- /dev/null +++ b/vendor/symfony/deprecation-contracts/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/deprecation-contracts", + "type": "library", + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php new file mode 100644 index 0000000..0d3451f --- /dev/null +++ b/vendor/symfony/deprecation-contracts/function.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (!function_exists('trigger_deprecation')) { + /** + * Triggers a silenced deprecation notice. + * + * @param string $package The name of the Composer package that is triggering the deprecation + * @param string $version The version of the package that introduced the deprecation + * @param string $message The message of the deprecation + * @param mixed ...$args Values to insert in the message using printf() formatting + * + * @author Nicolas Grekas + */ + function trigger_deprecation(string $package, string $version, string $message, ...$args): void + { + @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), E_USER_DEPRECATED); + } +} diff --git a/vendor/symfony/error-handler/BufferingLogger.php b/vendor/symfony/error-handler/BufferingLogger.php new file mode 100644 index 0000000..16e433d --- /dev/null +++ b/vendor/symfony/error-handler/BufferingLogger.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler; + +use Psr\Log\AbstractLogger; + +/** + * A buffering logger that stacks logs for later. + * + * @author Nicolas Grekas + */ +class BufferingLogger extends AbstractLogger +{ + private $logs = []; + + public function log($level, $message, array $context = []): void + { + $this->logs[] = [$level, $message, $context]; + } + + public function cleanLogs(): array + { + $logs = $this->logs; + $this->logs = []; + + return $logs; + } + + public function __destruct() + { + foreach ($this->logs as [$level, $message, $context]) { + if (false !== strpos($message, '{')) { + foreach ($context as $key => $val) { + if (null === $val || is_scalar($val) || (\is_object($val) && \is_callable([$val, '__toString']))) { + $message = str_replace("{{$key}}", $val, $message); + } elseif ($val instanceof \DateTimeInterface) { + $message = str_replace("{{$key}}", $val->format(\DateTime::RFC3339), $message); + } elseif (\is_object($val)) { + $message = str_replace("{{$key}}", '[object '.\get_class($val).']', $message); + } else { + $message = str_replace("{{$key}}", '['.\gettype($val).']', $message); + } + } + } + + error_log(sprintf('%s [%s] %s', date(\DateTime::RFC3339), $level, $message)); + } + } +} diff --git a/vendor/symfony/error-handler/CHANGELOG.md b/vendor/symfony/error-handler/CHANGELOG.md new file mode 100644 index 0000000..b449dba --- /dev/null +++ b/vendor/symfony/error-handler/CHANGELOG.md @@ -0,0 +1,13 @@ +CHANGELOG +========= + +5.1.0 +----- + + * The `HtmlErrorRenderer` and `SerializerErrorRenderer` add `X-Debug-Exception` and `X-Debug-Exception-File` headers in debug mode. + +4.4.0 +----- + + * added the component + * added `ErrorHandler::call()` method utility to turn any PHP error into `\ErrorException` diff --git a/vendor/symfony/error-handler/Debug.php b/vendor/symfony/error-handler/Debug.php new file mode 100644 index 0000000..9cc8ec1 --- /dev/null +++ b/vendor/symfony/error-handler/Debug.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler; + +/** + * Registers all the debug tools. + * + * @author Fabien Potencier + */ +class Debug +{ + public static function enable(): ErrorHandler + { + error_reporting(-1); + + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) { + ini_set('display_errors', 0); + } elseif (!filter_var(ini_get('log_errors'), FILTER_VALIDATE_BOOLEAN) || ini_get('error_log')) { + // CLI - display errors only if they're not already logged to STDERR + ini_set('display_errors', 1); + } + + @ini_set('zend.assertions', 1); + ini_set('assert.active', 1); + ini_set('assert.warning', 0); + ini_set('assert.exception', 1); + + DebugClassLoader::enable(); + + return ErrorHandler::register(new ErrorHandler(new BufferingLogger(), true)); + } +} diff --git a/vendor/symfony/error-handler/DebugClassLoader.php b/vendor/symfony/error-handler/DebugClassLoader.php new file mode 100644 index 0000000..a0c8954 --- /dev/null +++ b/vendor/symfony/error-handler/DebugClassLoader.php @@ -0,0 +1,1080 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler; + +use Doctrine\Common\Persistence\Proxy as LegacyProxy; +use Doctrine\Persistence\Proxy; +use PHPUnit\Framework\MockObject\Matcher\StatelessInvocation; +use PHPUnit\Framework\MockObject\MockObject; +use Prophecy\Prophecy\ProphecySubjectInterface; +use ProxyManager\Proxy\ProxyInterface; + +/** + * Autoloader checking if the class is really defined in the file found. + * + * The ClassLoader will wrap all registered autoloaders + * and will throw an exception if a file is found but does + * not declare the class. + * + * It can also patch classes to turn docblocks into actual return types. + * This behavior is controlled by the SYMFONY_PATCH_TYPE_DECLARATIONS env var, + * which is a url-encoded array with the follow parameters: + * - "force": any value enables deprecation notices - can be any of: + * - "docblock" to patch only docblock annotations + * - "object" to turn union types to the "object" type when possible (not recommended) + * - "1" to add all possible return types including magic methods + * - "0" to add possible return types excluding magic methods + * - "php": the target version of PHP - e.g. "7.1" doesn't generate "object" types + * - "deprecations": "1" to trigger a deprecation notice when a child class misses a + * return type while the parent declares an "@return" annotation + * + * Note that patching doesn't care about any coding style so you'd better to run + * php-cs-fixer after, with rules "phpdoc_trim_consecutive_blank_line_separation" + * and "no_superfluous_phpdoc_tags" enabled typically. + * + * @author Fabien Potencier + * @author Christophe Coevoet + * @author Nicolas Grekas + * @author Guilhem Niot + */ +class DebugClassLoader +{ + private const SPECIAL_RETURN_TYPES = [ + 'void' => 'void', + 'null' => 'null', + 'resource' => 'resource', + 'boolean' => 'bool', + 'true' => 'bool', + 'false' => 'bool', + 'integer' => 'int', + 'array' => 'array', + 'bool' => 'bool', + 'callable' => 'callable', + 'float' => 'float', + 'int' => 'int', + 'iterable' => 'iterable', + 'object' => 'object', + 'string' => 'string', + 'self' => 'self', + 'parent' => 'parent', + ] + (\PHP_VERSION_ID >= 80000 ? [ + '$this' => 'static', + ] : [ + 'mixed' => 'mixed', + 'static' => 'object', + '$this' => 'object', + ]); + + private const BUILTIN_RETURN_TYPES = [ + 'void' => true, + 'array' => true, + 'bool' => true, + 'callable' => true, + 'float' => true, + 'int' => true, + 'iterable' => true, + 'object' => true, + 'string' => true, + 'self' => true, + 'parent' => true, + ] + (\PHP_VERSION_ID >= 80000 ? [ + 'mixed' => true, + 'static' => true, + ] : []); + + private const MAGIC_METHODS = [ + '__set' => 'void', + '__isset' => 'bool', + '__unset' => 'void', + '__sleep' => 'array', + '__wakeup' => 'void', + '__toString' => 'string', + '__clone' => 'void', + '__debugInfo' => 'array', + '__serialize' => 'array', + '__unserialize' => 'void', + ]; + + private const INTERNAL_TYPES = [ + 'ArrayAccess' => [ + 'offsetExists' => 'bool', + 'offsetSet' => 'void', + 'offsetUnset' => 'void', + ], + 'Countable' => [ + 'count' => 'int', + ], + 'Iterator' => [ + 'next' => 'void', + 'valid' => 'bool', + 'rewind' => 'void', + ], + 'IteratorAggregate' => [ + 'getIterator' => '\Traversable', + ], + 'OuterIterator' => [ + 'getInnerIterator' => '\Iterator', + ], + 'RecursiveIterator' => [ + 'hasChildren' => 'bool', + ], + 'SeekableIterator' => [ + 'seek' => 'void', + ], + 'Serializable' => [ + 'serialize' => 'string', + 'unserialize' => 'void', + ], + 'SessionHandlerInterface' => [ + 'open' => 'bool', + 'close' => 'bool', + 'read' => 'string', + 'write' => 'bool', + 'destroy' => 'bool', + 'gc' => 'bool', + ], + 'SessionIdInterface' => [ + 'create_sid' => 'string', + ], + 'SessionUpdateTimestampHandlerInterface' => [ + 'validateId' => 'bool', + 'updateTimestamp' => 'bool', + ], + 'Throwable' => [ + 'getMessage' => 'string', + 'getCode' => 'int', + 'getFile' => 'string', + 'getLine' => 'int', + 'getTrace' => 'array', + 'getPrevious' => '?\Throwable', + 'getTraceAsString' => 'string', + ], + ]; + + private $classLoader; + private $isFinder; + private $loaded = []; + private $patchTypes; + + private static $caseCheck; + private static $checkedClasses = []; + private static $final = []; + private static $finalMethods = []; + private static $deprecated = []; + private static $internal = []; + private static $internalMethods = []; + private static $annotatedParameters = []; + private static $darwinCache = ['/' => ['/', []]]; + private static $method = []; + private static $returnTypes = []; + private static $methodTraits = []; + private static $fileOffsets = []; + + public function __construct(callable $classLoader) + { + $this->classLoader = $classLoader; + $this->isFinder = \is_array($classLoader) && method_exists($classLoader[0], 'findFile'); + parse_str(getenv('SYMFONY_PATCH_TYPE_DECLARATIONS') ?: '', $this->patchTypes); + $this->patchTypes += [ + 'force' => null, + 'php' => null, + 'deprecations' => false, + ]; + + if (!isset(self::$caseCheck)) { + $file = is_file(__FILE__) ? __FILE__ : rtrim(realpath('.'), \DIRECTORY_SEPARATOR); + $i = strrpos($file, \DIRECTORY_SEPARATOR); + $dir = substr($file, 0, 1 + $i); + $file = substr($file, 1 + $i); + $test = strtoupper($file) === $file ? strtolower($file) : strtoupper($file); + $test = realpath($dir.$test); + + if (false === $test || false === $i) { + // filesystem is case sensitive + self::$caseCheck = 0; + } elseif (substr($test, -\strlen($file)) === $file) { + // filesystem is case insensitive and realpath() normalizes the case of characters + self::$caseCheck = 1; + } elseif (false !== stripos(PHP_OS, 'darwin')) { + // on MacOSX, HFS+ is case insensitive but realpath() doesn't normalize the case of characters + self::$caseCheck = 2; + } else { + // filesystem case checks failed, fallback to disabling them + self::$caseCheck = 0; + } + } + } + + /** + * Gets the wrapped class loader. + * + * @return callable The wrapped class loader + */ + public function getClassLoader(): callable + { + return $this->classLoader; + } + + /** + * Wraps all autoloaders. + */ + public static function enable(): void + { + // Ensures we don't hit https://bugs.php.net/42098 + class_exists('Symfony\Component\ErrorHandler\ErrorHandler'); + class_exists('Psr\Log\LogLevel'); + + if (!\is_array($functions = spl_autoload_functions())) { + return; + } + + foreach ($functions as $function) { + spl_autoload_unregister($function); + } + + foreach ($functions as $function) { + if (!\is_array($function) || !$function[0] instanceof self) { + $function = [new static($function), 'loadClass']; + } + + spl_autoload_register($function); + } + } + + /** + * Disables the wrapping. + */ + public static function disable(): void + { + if (!\is_array($functions = spl_autoload_functions())) { + return; + } + + foreach ($functions as $function) { + spl_autoload_unregister($function); + } + + foreach ($functions as $function) { + if (\is_array($function) && $function[0] instanceof self) { + $function = $function[0]->getClassLoader(); + } + + spl_autoload_register($function); + } + } + + public static function checkClasses(): bool + { + if (!\is_array($functions = spl_autoload_functions())) { + return false; + } + + $loader = null; + + foreach ($functions as $function) { + if (\is_array($function) && $function[0] instanceof self) { + $loader = $function[0]; + break; + } + } + + if (null === $loader) { + return false; + } + + static $offsets = [ + 'get_declared_interfaces' => 0, + 'get_declared_traits' => 0, + 'get_declared_classes' => 0, + ]; + + foreach ($offsets as $getSymbols => $i) { + $symbols = $getSymbols(); + + for (; $i < \count($symbols); ++$i) { + if (!is_subclass_of($symbols[$i], MockObject::class) + && !is_subclass_of($symbols[$i], ProphecySubjectInterface::class) + && !is_subclass_of($symbols[$i], Proxy::class) + && !is_subclass_of($symbols[$i], ProxyInterface::class) + && !is_subclass_of($symbols[$i], LegacyProxy::class) + ) { + $loader->checkClass($symbols[$i]); + } + } + + $offsets[$getSymbols] = $i; + } + + return true; + } + + public function findFile(string $class): ?string + { + return $this->isFinder ? ($this->classLoader[0]->findFile($class) ?: null) : null; + } + + /** + * Loads the given class or interface. + * + * @throws \RuntimeException + */ + public function loadClass(string $class): void + { + $e = error_reporting(error_reporting() | E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR); + + try { + if ($this->isFinder && !isset($this->loaded[$class])) { + $this->loaded[$class] = true; + if (!$file = $this->classLoader[0]->findFile($class) ?: '') { + // no-op + } elseif (\function_exists('opcache_is_script_cached') && @opcache_is_script_cached($file)) { + include $file; + + return; + } elseif (false === include $file) { + return; + } + } else { + ($this->classLoader)($class); + $file = ''; + } + } finally { + error_reporting($e); + } + + $this->checkClass($class, $file); + } + + private function checkClass(string $class, string $file = null): void + { + $exists = null === $file || class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false); + + if (null !== $file && $class && '\\' === $class[0]) { + $class = substr($class, 1); + } + + if ($exists) { + if (isset(self::$checkedClasses[$class])) { + return; + } + self::$checkedClasses[$class] = true; + + $refl = new \ReflectionClass($class); + if (null === $file && $refl->isInternal()) { + return; + } + $name = $refl->getName(); + + if ($name !== $class && 0 === strcasecmp($name, $class)) { + throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: "%s" vs "%s".', $class, $name)); + } + + $deprecations = $this->checkAnnotations($refl, $name); + + foreach ($deprecations as $message) { + @trigger_error($message, E_USER_DEPRECATED); + } + } + + if (!$file) { + return; + } + + if (!$exists) { + if (false !== strpos($class, '/')) { + throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class)); + } + + throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file)); + } + + if (self::$caseCheck && $message = $this->checkCase($refl, $file, $class)) { + throw new \RuntimeException(sprintf('Case mismatch between class and real file names: "%s" vs "%s" in "%s".', $message[0], $message[1], $message[2])); + } + } + + public function checkAnnotations(\ReflectionClass $refl, string $class): array + { + if ( + 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerForV7' === $class + || 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerForV6' === $class + ) { + return []; + } + $deprecations = []; + + $className = false !== strpos($class, "@anonymous\0") ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : $class; + + // Don't trigger deprecations for classes in the same vendor + if ($class !== $className) { + $vendor = preg_match('/^namespace ([^;\\\\\s]++)[;\\\\]/m', @file_get_contents($refl->getFileName()), $vendor) ? $vendor[1].'\\' : ''; + $vendorLen = \strlen($vendor); + } elseif (2 > $vendorLen = 1 + (strpos($class, '\\') ?: strpos($class, '_'))) { + $vendorLen = 0; + $vendor = ''; + } else { + $vendor = str_replace('_', '\\', substr($class, 0, $vendorLen)); + } + + // Detect annotations on the class + if (false !== $doc = $refl->getDocComment()) { + foreach (['final', 'deprecated', 'internal'] as $annotation) { + if (false !== strpos($doc, $annotation) && preg_match('#\n\s+\* @'.$annotation.'(?:( .+?)\.?)?\r?\n\s+\*(?: @|/$|\r?\n)#s', $doc, $notice)) { + self::${$annotation}[$class] = isset($notice[1]) ? preg_replace('#\.?\r?\n( \*)? *(?= |\r?\n|$)#', '', $notice[1]) : ''; + } + } + + if ($refl->isInterface() && false !== strpos($doc, 'method') && preg_match_all('#\n \* @method\s+(static\s+)?+([\w\|&\[\]\\\]+\s+)?(\w+(?:\s*\([^\)]*\))?)+(.+?([[:punct:]]\s*)?)?(?=\r?\n \*(?: @|/$|\r?\n))#', $doc, $notice, PREG_SET_ORDER)) { + foreach ($notice as $method) { + $static = '' !== $method[1] && !empty($method[2]); + $name = $method[3]; + $description = $method[4] ?? null; + if (false === strpos($name, '(')) { + $name .= '()'; + } + if (null !== $description) { + $description = trim($description); + if (!isset($method[5])) { + $description .= '.'; + } + } + self::$method[$class][] = [$class, $name, $static, $description]; + } + } + } + + $parent = get_parent_class($class) ?: null; + $parentAndOwnInterfaces = $this->getOwnInterfaces($class, $parent); + if ($parent) { + $parentAndOwnInterfaces[$parent] = $parent; + + if (!isset(self::$checkedClasses[$parent])) { + $this->checkClass($parent); + } + + if (isset(self::$final[$parent])) { + $deprecations[] = sprintf('The "%s" class is considered final%s. It may change without further notice as of its next major version. You should not extend it from "%s".', $parent, self::$final[$parent], $className); + } + } + + // Detect if the parent is annotated + foreach ($parentAndOwnInterfaces + class_uses($class, false) as $use) { + if (!isset(self::$checkedClasses[$use])) { + $this->checkClass($use); + } + if (isset(self::$deprecated[$use]) && strncmp($vendor, str_replace('_', '\\', $use), $vendorLen) && !isset(self::$deprecated[$class])) { + $type = class_exists($class, false) ? 'class' : (interface_exists($class, false) ? 'interface' : 'trait'); + $verb = class_exists($use, false) || interface_exists($class, false) ? 'extends' : (interface_exists($use, false) ? 'implements' : 'uses'); + + $deprecations[] = sprintf('The "%s" %s %s "%s" that is deprecated%s.', $className, $type, $verb, $use, self::$deprecated[$use]); + } + if (isset(self::$internal[$use]) && strncmp($vendor, str_replace('_', '\\', $use), $vendorLen)) { + $deprecations[] = sprintf('The "%s" %s is considered internal%s. It may change without further notice. You should not use it from "%s".', $use, class_exists($use, false) ? 'class' : (interface_exists($use, false) ? 'interface' : 'trait'), self::$internal[$use], $className); + } + if (isset(self::$method[$use])) { + if ($refl->isAbstract()) { + if (isset(self::$method[$class])) { + self::$method[$class] = array_merge(self::$method[$class], self::$method[$use]); + } else { + self::$method[$class] = self::$method[$use]; + } + } elseif (!$refl->isInterface()) { + $hasCall = $refl->hasMethod('__call'); + $hasStaticCall = $refl->hasMethod('__callStatic'); + foreach (self::$method[$use] as $method) { + list($interface, $name, $static, $description) = $method; + if ($static ? $hasStaticCall : $hasCall) { + continue; + } + $realName = substr($name, 0, strpos($name, '(')); + if (!$refl->hasMethod($realName) || !($methodRefl = $refl->getMethod($realName))->isPublic() || ($static && !$methodRefl->isStatic()) || (!$static && $methodRefl->isStatic())) { + $deprecations[] = sprintf('Class "%s" should implement method "%s::%s"%s', $className, ($static ? 'static ' : '').$interface, $name, null == $description ? '.' : ': '.$description); + } + } + } + } + } + + if (trait_exists($class)) { + $file = $refl->getFileName(); + + foreach ($refl->getMethods() as $method) { + if ($method->getFileName() === $file) { + self::$methodTraits[$file][$method->getStartLine()] = $class; + } + } + + return $deprecations; + } + + // Inherit @final, @internal, @param and @return annotations for methods + self::$finalMethods[$class] = []; + self::$internalMethods[$class] = []; + self::$annotatedParameters[$class] = []; + self::$returnTypes[$class] = []; + foreach ($parentAndOwnInterfaces as $use) { + foreach (['finalMethods', 'internalMethods', 'annotatedParameters', 'returnTypes'] as $property) { + if (isset(self::${$property}[$use])) { + self::${$property}[$class] = self::${$property}[$class] ? self::${$property}[$use] + self::${$property}[$class] : self::${$property}[$use]; + } + } + + if (null !== (self::INTERNAL_TYPES[$use] ?? null)) { + foreach (self::INTERNAL_TYPES[$use] as $method => $returnType) { + if ('void' !== $returnType) { + self::$returnTypes[$class] += [$method => [$returnType, $returnType, $class, '']]; + } + } + } + } + + foreach ($refl->getMethods() as $method) { + if ($method->class !== $class) { + continue; + } + + if (null === $ns = self::$methodTraits[$method->getFileName()][$method->getStartLine()] ?? null) { + $ns = $vendor; + $len = $vendorLen; + } elseif (2 > $len = 1 + (strpos($ns, '\\') ?: strpos($ns, '_'))) { + $len = 0; + $ns = ''; + } else { + $ns = str_replace('_', '\\', substr($ns, 0, $len)); + } + + if ($parent && isset(self::$finalMethods[$parent][$method->name])) { + list($declaringClass, $message) = self::$finalMethods[$parent][$method->name]; + $deprecations[] = sprintf('The "%s::%s()" method is considered final%s. It may change without further notice as of its next major version. You should not extend it from "%s".', $declaringClass, $method->name, $message, $className); + } + + if (isset(self::$internalMethods[$class][$method->name])) { + list($declaringClass, $message) = self::$internalMethods[$class][$method->name]; + if (strncmp($ns, $declaringClass, $len)) { + $deprecations[] = sprintf('The "%s::%s()" method is considered internal%s. It may change without further notice. You should not extend it from "%s".', $declaringClass, $method->name, $message, $className); + } + } + + // To read method annotations + $doc = $method->getDocComment(); + + if (isset(self::$annotatedParameters[$class][$method->name])) { + $definedParameters = []; + foreach ($method->getParameters() as $parameter) { + $definedParameters[$parameter->name] = true; + } + + foreach (self::$annotatedParameters[$class][$method->name] as $parameterName => $deprecation) { + if (!isset($definedParameters[$parameterName]) && !($doc && preg_match("/\\n\\s+\\* @param +((?(?!callable *\().*?|callable *\(.*\).*?))(?<= )\\\${$parameterName}\\b/", $doc))) { + $deprecations[] = sprintf($deprecation, $className); + } + } + } + + $forcePatchTypes = $this->patchTypes['force']; + + if ($canAddReturnType = null !== $forcePatchTypes && false === strpos($method->getFileName(), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) { + if ('void' !== (self::MAGIC_METHODS[$method->name] ?? 'void')) { + $this->patchTypes['force'] = $forcePatchTypes ?: 'docblock'; + } + + $canAddReturnType = false !== strpos($refl->getFileName(), \DIRECTORY_SEPARATOR.'Tests'.\DIRECTORY_SEPARATOR) + || $refl->isFinal() + || $method->isFinal() + || $method->isPrivate() + || ('' === (self::$internal[$class] ?? null) && !$refl->isAbstract()) + || '' === (self::$final[$class] ?? null) + || preg_match('/@(final|internal)$/m', $doc) + ; + } + + if (null !== ($returnType = self::$returnTypes[$class][$method->name] ?? self::MAGIC_METHODS[$method->name] ?? null) && !$method->hasReturnType() && !($doc && preg_match('/\n\s+\* @return +(\S+)/', $doc))) { + list($normalizedType, $returnType, $declaringClass, $declaringFile) = \is_string($returnType) ? [$returnType, $returnType, '', ''] : $returnType; + + if ('void' === $normalizedType) { + $canAddReturnType = false; + } + + if ($canAddReturnType && 'docblock' !== $this->patchTypes['force']) { + $this->patchMethod($method, $returnType, $declaringFile, $normalizedType); + } + + if (strncmp($ns, $declaringClass, $len)) { + if ($canAddReturnType && 'docblock' === $this->patchTypes['force'] && false === strpos($method->getFileName(), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) { + $this->patchMethod($method, $returnType, $declaringFile, $normalizedType); + } elseif ('' !== $declaringClass && $this->patchTypes['deprecations']) { + $deprecations[] = sprintf('Method "%s::%s()" will return "%s" as of its next major version. Doing the same in %s "%s" will be required when upgrading.', $declaringClass, $method->name, $normalizedType, interface_exists($declaringClass) ? 'implementation' : 'child class', $className); + } + } + } + + if (!$doc) { + $this->patchTypes['force'] = $forcePatchTypes; + + continue; + } + + $matches = []; + + if (!$method->hasReturnType() && ((false !== strpos($doc, '@return') && preg_match('/\n\s+\* @return +(\S+)/', $doc, $matches)) || 'void' !== (self::MAGIC_METHODS[$method->name] ?? 'void'))) { + $matches = $matches ?: [1 => self::MAGIC_METHODS[$method->name]]; + $this->setReturnType($matches[1], $method, $parent); + + if (isset(self::$returnTypes[$class][$method->name][0]) && $canAddReturnType) { + $this->fixReturnStatements($method, self::$returnTypes[$class][$method->name][0]); + } + + if ($method->isPrivate()) { + unset(self::$returnTypes[$class][$method->name]); + } + } + + $this->patchTypes['force'] = $forcePatchTypes; + + if ($method->isPrivate()) { + continue; + } + + $finalOrInternal = false; + + foreach (['final', 'internal'] as $annotation) { + if (false !== strpos($doc, $annotation) && preg_match('#\n\s+\* @'.$annotation.'(?:( .+?)\.?)?\r?\n\s+\*(?: @|/$|\r?\n)#s', $doc, $notice)) { + $message = isset($notice[1]) ? preg_replace('#\.?\r?\n( \*)? *(?= |\r?\n|$)#', '', $notice[1]) : ''; + self::${$annotation.'Methods'}[$class][$method->name] = [$class, $message]; + $finalOrInternal = true; + } + } + + if ($finalOrInternal || $method->isConstructor() || false === strpos($doc, '@param') || StatelessInvocation::class === $class) { + continue; + } + if (!preg_match_all('#\n\s+\* @param +((?(?!callable *\().*?|callable *\(.*\).*?))(?<= )\$([a-zA-Z0-9_\x7f-\xff]++)#', $doc, $matches, PREG_SET_ORDER)) { + continue; + } + if (!isset(self::$annotatedParameters[$class][$method->name])) { + $definedParameters = []; + foreach ($method->getParameters() as $parameter) { + $definedParameters[$parameter->name] = true; + } + } + foreach ($matches as list(, $parameterType, $parameterName)) { + if (!isset($definedParameters[$parameterName])) { + $parameterType = trim($parameterType); + self::$annotatedParameters[$class][$method->name][$parameterName] = sprintf('The "%%s::%s()" method will require a new "%s$%s" argument in the next major version of its %s "%s", not defining it is deprecated.', $method->name, $parameterType ? $parameterType.' ' : '', $parameterName, interface_exists($className) ? 'interface' : 'parent class', $className); + } + } + } + + return $deprecations; + } + + public function checkCase(\ReflectionClass $refl, string $file, string $class): ?array + { + $real = explode('\\', $class.strrchr($file, '.')); + $tail = explode(\DIRECTORY_SEPARATOR, str_replace('/', \DIRECTORY_SEPARATOR, $file)); + + $i = \count($tail) - 1; + $j = \count($real) - 1; + + while (isset($tail[$i], $real[$j]) && $tail[$i] === $real[$j]) { + --$i; + --$j; + } + + array_splice($tail, 0, $i + 1); + + if (!$tail) { + return null; + } + + $tail = \DIRECTORY_SEPARATOR.implode(\DIRECTORY_SEPARATOR, $tail); + $tailLen = \strlen($tail); + $real = $refl->getFileName(); + + if (2 === self::$caseCheck) { + $real = $this->darwinRealpath($real); + } + + if (0 === substr_compare($real, $tail, -$tailLen, $tailLen, true) + && 0 !== substr_compare($real, $tail, -$tailLen, $tailLen, false) + ) { + return [substr($tail, -$tailLen + 1), substr($real, -$tailLen + 1), substr($real, 0, -$tailLen + 1)]; + } + + return null; + } + + /** + * `realpath` on MacOSX doesn't normalize the case of characters. + */ + private function darwinRealpath(string $real): string + { + $i = 1 + strrpos($real, '/'); + $file = substr($real, $i); + $real = substr($real, 0, $i); + + if (isset(self::$darwinCache[$real])) { + $kDir = $real; + } else { + $kDir = strtolower($real); + + if (isset(self::$darwinCache[$kDir])) { + $real = self::$darwinCache[$kDir][0]; + } else { + $dir = getcwd(); + + if (!@chdir($real)) { + return $real.$file; + } + + $real = getcwd().'/'; + chdir($dir); + + $dir = $real; + $k = $kDir; + $i = \strlen($dir) - 1; + while (!isset(self::$darwinCache[$k])) { + self::$darwinCache[$k] = [$dir, []]; + self::$darwinCache[$dir] = &self::$darwinCache[$k]; + + while ('/' !== $dir[--$i]) { + } + $k = substr($k, 0, ++$i); + $dir = substr($dir, 0, $i--); + } + } + } + + $dirFiles = self::$darwinCache[$kDir][1]; + + if (!isset($dirFiles[$file]) && ') : eval()\'d code' === substr($file, -17)) { + // Get the file name from "file_name.php(123) : eval()'d code" + $file = substr($file, 0, strrpos($file, '(', -17)); + } + + if (isset($dirFiles[$file])) { + return $real.$dirFiles[$file]; + } + + $kFile = strtolower($file); + + if (!isset($dirFiles[$kFile])) { + foreach (scandir($real, 2) as $f) { + if ('.' !== $f[0]) { + $dirFiles[$f] = $f; + if ($f === $file) { + $kFile = $k = $file; + } elseif ($f !== $k = strtolower($f)) { + $dirFiles[$k] = $f; + } + } + } + self::$darwinCache[$kDir][1] = $dirFiles; + } + + return $real.$dirFiles[$kFile]; + } + + /** + * `class_implements` includes interfaces from the parents so we have to manually exclude them. + * + * @return string[] + */ + private function getOwnInterfaces(string $class, ?string $parent): array + { + $ownInterfaces = class_implements($class, false); + + if ($parent) { + foreach (class_implements($parent, false) as $interface) { + unset($ownInterfaces[$interface]); + } + } + + foreach ($ownInterfaces as $interface) { + foreach (class_implements($interface) as $interface) { + unset($ownInterfaces[$interface]); + } + } + + return $ownInterfaces; + } + + private function setReturnType(string $types, \ReflectionMethod $method, ?string $parent): void + { + $nullable = false; + $typesMap = []; + foreach (explode('|', $types) as $t) { + $typesMap[$this->normalizeType($t, $method->class, $parent)] = $t; + } + + if (isset($typesMap['array'])) { + if (isset($typesMap['Traversable']) || isset($typesMap['\Traversable'])) { + $typesMap['iterable'] = 'array' !== $typesMap['array'] ? $typesMap['array'] : 'iterable'; + unset($typesMap['array'], $typesMap['Traversable'], $typesMap['\Traversable']); + } elseif ('array' !== $typesMap['array'] && isset(self::$returnTypes[$method->class][$method->name])) { + return; + } + } + + if (isset($typesMap['array']) && isset($typesMap['iterable'])) { + if ('[]' === substr($typesMap['array'], -2)) { + $typesMap['iterable'] = $typesMap['array']; + } + unset($typesMap['array']); + } + + $iterable = $object = true; + foreach ($typesMap as $n => $t) { + if ('null' !== $n) { + $iterable = $iterable && (\in_array($n, ['array', 'iterable']) || false !== strpos($n, 'Iterator')); + $object = $object && (\in_array($n, ['callable', 'object', '$this', 'static']) || !isset(self::SPECIAL_RETURN_TYPES[$n])); + } + } + + $normalizedType = key($typesMap); + $returnType = current($typesMap); + + foreach ($typesMap as $n => $t) { + if ('null' === $n) { + $nullable = true; + } elseif ('null' === $normalizedType) { + $normalizedType = $t; + $returnType = $t; + } elseif ($n !== $normalizedType || !preg_match('/^\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $n)) { + if ($iterable) { + $normalizedType = $returnType = 'iterable'; + } elseif ($object && 'object' === $this->patchTypes['force']) { + $normalizedType = $returnType = 'object'; + } else { + // ignore multi-types return declarations + return; + } + } + } + + if ('void' === $normalizedType || (\PHP_VERSION_ID >= 80000 && 'mixed' === $normalizedType)) { + $nullable = false; + } elseif (!isset(self::BUILTIN_RETURN_TYPES[$normalizedType]) && isset(self::SPECIAL_RETURN_TYPES[$normalizedType])) { + // ignore other special return types + return; + } + + if ($nullable) { + $normalizedType = '?'.$normalizedType; + $returnType .= '|null'; + } + + self::$returnTypes[$method->class][$method->name] = [$normalizedType, $returnType, $method->class, $method->getFileName()]; + } + + private function normalizeType(string $type, string $class, ?string $parent): string + { + if (isset(self::SPECIAL_RETURN_TYPES[$lcType = strtolower($type)])) { + if ('parent' === $lcType = self::SPECIAL_RETURN_TYPES[$lcType]) { + $lcType = null !== $parent ? '\\'.$parent : 'parent'; + } elseif ('self' === $lcType) { + $lcType = '\\'.$class; + } + + return $lcType; + } + + if ('[]' === substr($type, -2)) { + return 'array'; + } + + if (preg_match('/^(array|iterable|callable) *[<(]/', $lcType, $m)) { + return $m[1]; + } + + // We could resolve "use" statements to return the FQDN + // but this would be too expensive for a runtime checker + + return $type; + } + + /** + * Utility method to add @return annotations to the Symfony code-base where it triggers a self-deprecations. + */ + private function patchMethod(\ReflectionMethod $method, string $returnType, string $declaringFile, string $normalizedType) + { + static $patchedMethods = []; + static $useStatements = []; + + if (!is_file($file = $method->getFileName()) || isset($patchedMethods[$file][$startLine = $method->getStartLine()])) { + return; + } + + $patchedMethods[$file][$startLine] = true; + $fileOffset = self::$fileOffsets[$file] ?? 0; + $startLine += $fileOffset - 2; + $nullable = '?' === $normalizedType[0] ? '?' : ''; + $normalizedType = ltrim($normalizedType, '?'); + $returnType = explode('|', $returnType); + $code = file($file); + + foreach ($returnType as $i => $type) { + if (preg_match('/((?:\[\])+)$/', $type, $m)) { + $type = substr($type, 0, -\strlen($m[1])); + $format = '%s'.$m[1]; + } elseif (preg_match('/^(array|iterable)<([^,>]++)>$/', $type, $m)) { + $type = $m[2]; + $format = $m[1].'<%s>'; + } else { + $format = null; + } + + if (isset(self::SPECIAL_RETURN_TYPES[$type]) || ('\\' === $type[0] && !$p = strrpos($type, '\\', 1))) { + continue; + } + + list($namespace, $useOffset, $useMap) = $useStatements[$file] ?? $useStatements[$file] = self::getUseStatements($file); + + if ('\\' !== $type[0]) { + list($declaringNamespace, , $declaringUseMap) = $useStatements[$declaringFile] ?? $useStatements[$declaringFile] = self::getUseStatements($declaringFile); + + $p = strpos($type, '\\', 1); + $alias = $p ? substr($type, 0, $p) : $type; + + if (isset($declaringUseMap[$alias])) { + $type = '\\'.$declaringUseMap[$alias].($p ? substr($type, $p) : ''); + } else { + $type = '\\'.$declaringNamespace.$type; + } + + $p = strrpos($type, '\\', 1); + } + + $alias = substr($type, 1 + $p); + $type = substr($type, 1); + + if (!isset($useMap[$alias]) && (class_exists($c = $namespace.$alias) || interface_exists($c) || trait_exists($c))) { + $useMap[$alias] = $c; + } + + if (!isset($useMap[$alias])) { + $useStatements[$file][2][$alias] = $type; + $code[$useOffset] = "use $type;\n".$code[$useOffset]; + ++$fileOffset; + } elseif ($useMap[$alias] !== $type) { + $alias .= 'FIXME'; + $useStatements[$file][2][$alias] = $type; + $code[$useOffset] = "use $type as $alias;\n".$code[$useOffset]; + ++$fileOffset; + } + + $returnType[$i] = null !== $format ? sprintf($format, $alias) : $alias; + + if (!isset(self::SPECIAL_RETURN_TYPES[$normalizedType]) && !isset(self::SPECIAL_RETURN_TYPES[$returnType[$i]])) { + $normalizedType = $returnType[$i]; + } + } + + if ('docblock' === $this->patchTypes['force'] || ('object' === $normalizedType && '7.1' === $this->patchTypes['php'])) { + $returnType = implode('|', $returnType); + + if ($method->getDocComment()) { + $code[$startLine] = " * @return $returnType\n".$code[$startLine]; + } else { + $code[$startLine] .= <<fixReturnStatements($method, $nullable.$normalizedType); + } + + private static function getUseStatements(string $file): array + { + $namespace = ''; + $useMap = []; + $useOffset = 0; + + if (!is_file($file)) { + return [$namespace, $useOffset, $useMap]; + } + + $file = file($file); + + for ($i = 0; $i < \count($file); ++$i) { + if (preg_match('/^(class|interface|trait|abstract) /', $file[$i])) { + break; + } + + if (0 === strpos($file[$i], 'namespace ')) { + $namespace = substr($file[$i], \strlen('namespace '), -2).'\\'; + $useOffset = $i + 2; + } + + if (0 === strpos($file[$i], 'use ')) { + $useOffset = $i; + + for (; 0 === strpos($file[$i], 'use '); ++$i) { + $u = explode(' as ', substr($file[$i], 4, -2), 2); + + if (1 === \count($u)) { + $p = strrpos($u[0], '\\'); + $useMap[substr($u[0], false !== $p ? 1 + $p : 0)] = $u[0]; + } else { + $useMap[$u[1]] = $u[0]; + } + } + + break; + } + } + + return [$namespace, $useOffset, $useMap]; + } + + private function fixReturnStatements(\ReflectionMethod $method, string $returnType) + { + if ('7.1' === $this->patchTypes['php'] && 'object' === ltrim($returnType, '?') && 'docblock' !== $this->patchTypes['force']) { + return; + } + + if (!is_file($file = $method->getFileName())) { + return; + } + + $fixedCode = $code = file($file); + $i = (self::$fileOffsets[$file] ?? 0) + $method->getStartLine(); + + if ('?' !== $returnType && 'docblock' !== $this->patchTypes['force']) { + $fixedCode[$i - 1] = preg_replace('/\)(;?\n)/', "): $returnType\\1", $code[$i - 1]); + } + + $end = $method->isGenerator() ? $i : $method->getEndLine(); + for (; $i < $end; ++$i) { + if ('void' === $returnType) { + $fixedCode[$i] = str_replace(' return null;', ' return;', $code[$i]); + } elseif ('mixed' === $returnType || '?' === $returnType[0]) { + $fixedCode[$i] = str_replace(' return;', ' return null;', $code[$i]); + } else { + $fixedCode[$i] = str_replace(' return;', " return $returnType!?;", $code[$i]); + } + } + + if ($fixedCode !== $code) { + file_put_contents($file, $fixedCode); + } + } +} diff --git a/vendor/symfony/error-handler/Error/ClassNotFoundError.php b/vendor/symfony/error-handler/Error/ClassNotFoundError.php new file mode 100644 index 0000000..443fba2 --- /dev/null +++ b/vendor/symfony/error-handler/Error/ClassNotFoundError.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Error; + +class ClassNotFoundError extends \Error +{ + /** + * {@inheritdoc} + */ + public function __construct(string $message, \Throwable $previous) + { + parent::__construct($message, $previous->getCode(), $previous->getPrevious()); + + foreach ([ + 'file' => $previous->getFile(), + 'line' => $previous->getLine(), + 'trace' => $previous->getTrace(), + ] as $property => $value) { + $refl = new \ReflectionProperty(\Error::class, $property); + $refl->setAccessible(true); + $refl->setValue($this, $value); + } + } +} diff --git a/vendor/symfony/error-handler/Error/FatalError.php b/vendor/symfony/error-handler/Error/FatalError.php new file mode 100644 index 0000000..98490b5 --- /dev/null +++ b/vendor/symfony/error-handler/Error/FatalError.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Error; + +class FatalError extends \Error +{ + private $error; + + /** + * {@inheritdoc} + * + * @param array $error An array as returned by error_get_last() + */ + public function __construct(string $message, int $code, array $error, int $traceOffset = null, bool $traceArgs = true, array $trace = null) + { + parent::__construct($message, $code); + + $this->error = $error; + + if (null !== $trace) { + if (!$traceArgs) { + foreach ($trace as &$frame) { + unset($frame['args'], $frame['this'], $frame); + } + } + } elseif (null !== $traceOffset) { + if (\function_exists('xdebug_get_function_stack')) { + $trace = xdebug_get_function_stack(); + if (0 < $traceOffset) { + array_splice($trace, -$traceOffset); + } + + foreach ($trace as &$frame) { + if (!isset($frame['type'])) { + // XDebug pre 2.1.1 doesn't currently set the call type key http://bugs.xdebug.org/view.php?id=695 + if (isset($frame['class'])) { + $frame['type'] = '::'; + } + } elseif ('dynamic' === $frame['type']) { + $frame['type'] = '->'; + } elseif ('static' === $frame['type']) { + $frame['type'] = '::'; + } + + // XDebug also has a different name for the parameters array + if (!$traceArgs) { + unset($frame['params'], $frame['args']); + } elseif (isset($frame['params']) && !isset($frame['args'])) { + $frame['args'] = $frame['params']; + unset($frame['params']); + } + } + + unset($frame); + $trace = array_reverse($trace); + } else { + $trace = []; + } + } + + foreach ([ + 'file' => $error['file'], + 'line' => $error['line'], + 'trace' => $trace, + ] as $property => $value) { + if (null !== $value) { + $refl = new \ReflectionProperty(\Error::class, $property); + $refl->setAccessible(true); + $refl->setValue($this, $value); + } + } + } + + /** + * {@inheritdoc} + */ + public function getError(): array + { + return $this->error; + } +} diff --git a/vendor/symfony/error-handler/Error/OutOfMemoryError.php b/vendor/symfony/error-handler/Error/OutOfMemoryError.php new file mode 100644 index 0000000..d685c3d --- /dev/null +++ b/vendor/symfony/error-handler/Error/OutOfMemoryError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Error; + +class OutOfMemoryError extends FatalError +{ +} diff --git a/vendor/symfony/error-handler/Error/UndefinedFunctionError.php b/vendor/symfony/error-handler/Error/UndefinedFunctionError.php new file mode 100644 index 0000000..b57dd15 --- /dev/null +++ b/vendor/symfony/error-handler/Error/UndefinedFunctionError.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Error; + +class UndefinedFunctionError extends \Error +{ + /** + * {@inheritdoc} + */ + public function __construct(string $message, \Throwable $previous) + { + parent::__construct($message, $previous->getCode(), $previous->getPrevious()); + + foreach ([ + 'file' => $previous->getFile(), + 'line' => $previous->getLine(), + 'trace' => $previous->getTrace(), + ] as $property => $value) { + $refl = new \ReflectionProperty(\Error::class, $property); + $refl->setAccessible(true); + $refl->setValue($this, $value); + } + } +} diff --git a/vendor/symfony/error-handler/Error/UndefinedMethodError.php b/vendor/symfony/error-handler/Error/UndefinedMethodError.php new file mode 100644 index 0000000..adc8731 --- /dev/null +++ b/vendor/symfony/error-handler/Error/UndefinedMethodError.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Error; + +class UndefinedMethodError extends \Error +{ + /** + * {@inheritdoc} + */ + public function __construct(string $message, \Throwable $previous) + { + parent::__construct($message, $previous->getCode(), $previous->getPrevious()); + + foreach ([ + 'file' => $previous->getFile(), + 'line' => $previous->getLine(), + 'trace' => $previous->getTrace(), + ] as $property => $value) { + $refl = new \ReflectionProperty(\Error::class, $property); + $refl->setAccessible(true); + $refl->setValue($this, $value); + } + } +} diff --git a/vendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php b/vendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php new file mode 100644 index 0000000..7cd2b38 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php @@ -0,0 +1,193 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorEnhancer; + +use Composer\Autoload\ClassLoader; +use Symfony\Component\ErrorHandler\DebugClassLoader; +use Symfony\Component\ErrorHandler\Error\ClassNotFoundError; +use Symfony\Component\ErrorHandler\Error\FatalError; + +/** + * @author Fabien Potencier + */ +class ClassNotFoundErrorEnhancer implements ErrorEnhancerInterface +{ + /** + * {@inheritdoc} + */ + public function enhance(\Throwable $error): ?\Throwable + { + // Some specific versions of PHP produce a fatal error when extending a not found class. + $message = !$error instanceof FatalError ? $error->getMessage() : $error->getError()['message']; + $messageLen = \strlen($message); + $notFoundSuffix = '\' not found'; + $notFoundSuffixLen = \strlen($notFoundSuffix); + if ($notFoundSuffixLen > $messageLen) { + return null; + } + + if (0 !== substr_compare($message, $notFoundSuffix, -$notFoundSuffixLen)) { + return null; + } + + foreach (['class', 'interface', 'trait'] as $typeName) { + $prefix = ucfirst($typeName).' \''; + $prefixLen = \strlen($prefix); + if (0 !== strpos($message, $prefix)) { + continue; + } + + $fullyQualifiedClassName = substr($message, $prefixLen, -$notFoundSuffixLen); + if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedClassName, '\\')) { + $className = substr($fullyQualifiedClassName, $namespaceSeparatorIndex + 1); + $namespacePrefix = substr($fullyQualifiedClassName, 0, $namespaceSeparatorIndex); + $message = sprintf('Attempted to load %s "%s" from namespace "%s".', $typeName, $className, $namespacePrefix); + $tail = ' for another namespace?'; + } else { + $className = $fullyQualifiedClassName; + $message = sprintf('Attempted to load %s "%s" from the global namespace.', $typeName, $className); + $tail = '?'; + } + + if ($candidates = $this->getClassCandidates($className)) { + $tail = array_pop($candidates).'"?'; + if ($candidates) { + $tail = ' for e.g. "'.implode('", "', $candidates).'" or "'.$tail; + } else { + $tail = ' for "'.$tail; + } + } + $message .= "\nDid you forget a \"use\" statement".$tail; + + return new ClassNotFoundError($message, $error); + } + + return null; + } + + /** + * Tries to guess the full namespace for a given class name. + * + * By default, it looks for PSR-0 and PSR-4 classes registered via a Symfony or a Composer + * autoloader (that should cover all common cases). + * + * @param string $class A class name (without its namespace) + * + * Returns an array of possible fully qualified class names + */ + private function getClassCandidates(string $class): array + { + if (!\is_array($functions = spl_autoload_functions())) { + return []; + } + + // find Symfony and Composer autoloaders + $classes = []; + + foreach ($functions as $function) { + if (!\is_array($function)) { + continue; + } + // get class loaders wrapped by DebugClassLoader + if ($function[0] instanceof DebugClassLoader) { + $function = $function[0]->getClassLoader(); + + if (!\is_array($function)) { + continue; + } + } + + if ($function[0] instanceof ClassLoader) { + foreach ($function[0]->getPrefixes() as $prefix => $paths) { + foreach ($paths as $path) { + $classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix)); + } + } + + foreach ($function[0]->getPrefixesPsr4() as $prefix => $paths) { + foreach ($paths as $path) { + $classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix)); + } + } + } + } + + return array_unique($classes); + } + + private function findClassInPath(string $path, string $class, string $prefix): array + { + if (!$path = realpath($path.'/'.strtr($prefix, '\\_', '//')) ?: realpath($path.'/'.\dirname(strtr($prefix, '\\_', '//'))) ?: realpath($path)) { + return []; + } + + $classes = []; + $filename = $class.'.php'; + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) { + if ($filename == $file->getFileName() && $class = $this->convertFileToClass($path, $file->getPathName(), $prefix)) { + $classes[] = $class; + } + } + + return $classes; + } + + private function convertFileToClass(string $path, string $file, string $prefix): ?string + { + $candidates = [ + // namespaced class + $namespacedClass = str_replace([$path.\DIRECTORY_SEPARATOR, '.php', '/'], ['', '', '\\'], $file), + // namespaced class (with target dir) + $prefix.$namespacedClass, + // namespaced class (with target dir and separator) + $prefix.'\\'.$namespacedClass, + // PEAR class + str_replace('\\', '_', $namespacedClass), + // PEAR class (with target dir) + str_replace('\\', '_', $prefix.$namespacedClass), + // PEAR class (with target dir and separator) + str_replace('\\', '_', $prefix.'\\'.$namespacedClass), + ]; + + if ($prefix) { + $candidates = array_filter($candidates, function ($candidate) use ($prefix) { return 0 === strpos($candidate, $prefix); }); + } + + // We cannot use the autoloader here as most of them use require; but if the class + // is not found, the new autoloader call will require the file again leading to a + // "cannot redeclare class" error. + foreach ($candidates as $candidate) { + if ($this->classExists($candidate)) { + return $candidate; + } + } + + try { + require_once $file; + } catch (\Throwable $e) { + return null; + } + + foreach ($candidates as $candidate) { + if ($this->classExists($candidate)) { + return $candidate; + } + } + + return null; + } + + private function classExists(string $class): bool + { + return class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false); + } +} diff --git a/vendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php b/vendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php new file mode 100644 index 0000000..7c3f4ef --- /dev/null +++ b/vendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorEnhancer; + +interface ErrorEnhancerInterface +{ + /** + * Returns an \Throwable instance if the class is able to improve the error, null otherwise. + */ + public function enhance(\Throwable $error): ?\Throwable; +} diff --git a/vendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php b/vendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php new file mode 100644 index 0000000..f4c49c2 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorEnhancer; + +use Symfony\Component\ErrorHandler\Error\FatalError; +use Symfony\Component\ErrorHandler\Error\UndefinedFunctionError; + +/** + * @author Fabien Potencier + */ +class UndefinedFunctionErrorEnhancer implements ErrorEnhancerInterface +{ + /** + * {@inheritdoc} + */ + public function enhance(\Throwable $error): ?\Throwable + { + if ($error instanceof FatalError) { + return null; + } + + $message = $error->getMessage(); + $messageLen = \strlen($message); + $notFoundSuffix = '()'; + $notFoundSuffixLen = \strlen($notFoundSuffix); + if ($notFoundSuffixLen > $messageLen) { + return null; + } + + if (0 !== substr_compare($message, $notFoundSuffix, -$notFoundSuffixLen)) { + return null; + } + + $prefix = 'Call to undefined function '; + $prefixLen = \strlen($prefix); + if (0 !== strpos($message, $prefix)) { + return null; + } + + $fullyQualifiedFunctionName = substr($message, $prefixLen, -$notFoundSuffixLen); + if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedFunctionName, '\\')) { + $functionName = substr($fullyQualifiedFunctionName, $namespaceSeparatorIndex + 1); + $namespacePrefix = substr($fullyQualifiedFunctionName, 0, $namespaceSeparatorIndex); + $message = sprintf('Attempted to call function "%s" from namespace "%s".', $functionName, $namespacePrefix); + } else { + $functionName = $fullyQualifiedFunctionName; + $message = sprintf('Attempted to call function "%s" from the global namespace.', $functionName); + } + + $candidates = []; + foreach (get_defined_functions() as $type => $definedFunctionNames) { + foreach ($definedFunctionNames as $definedFunctionName) { + if (false !== $namespaceSeparatorIndex = strrpos($definedFunctionName, '\\')) { + $definedFunctionNameBasename = substr($definedFunctionName, $namespaceSeparatorIndex + 1); + } else { + $definedFunctionNameBasename = $definedFunctionName; + } + + if ($definedFunctionNameBasename === $functionName) { + $candidates[] = '\\'.$definedFunctionName; + } + } + } + + if ($candidates) { + sort($candidates); + $last = array_pop($candidates).'"?'; + if ($candidates) { + $candidates = 'e.g. "'.implode('", "', $candidates).'" or "'.$last; + } else { + $candidates = '"'.$last; + } + $message .= "\nDid you mean to call ".$candidates; + } + + return new UndefinedFunctionError($message, $error); + } +} diff --git a/vendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php b/vendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php new file mode 100644 index 0000000..ad0e4b3 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorEnhancer; + +use Symfony\Component\ErrorHandler\Error\FatalError; +use Symfony\Component\ErrorHandler\Error\UndefinedMethodError; + +/** + * @author Grégoire Pineau + */ +class UndefinedMethodErrorEnhancer implements ErrorEnhancerInterface +{ + /** + * {@inheritdoc} + */ + public function enhance(\Throwable $error): ?\Throwable + { + if ($error instanceof FatalError) { + return null; + } + + $message = $error->getMessage(); + preg_match('/^Call to undefined method (.*)::(.*)\(\)$/', $message, $matches); + if (!$matches) { + return null; + } + + $className = $matches[1]; + $methodName = $matches[2]; + + $message = sprintf('Attempted to call an undefined method named "%s" of class "%s".', $methodName, $className); + + if (!class_exists($className) || null === $methods = get_class_methods($className)) { + // failed to get the class or its methods on which an unknown method was called (for example on an anonymous class) + return new UndefinedMethodError($message, $error); + } + + $candidates = []; + foreach ($methods as $definedMethodName) { + $lev = levenshtein($methodName, $definedMethodName); + if ($lev <= \strlen($methodName) / 3 || false !== strpos($definedMethodName, $methodName)) { + $candidates[] = $definedMethodName; + } + } + + if ($candidates) { + sort($candidates); + $last = array_pop($candidates).'"?'; + if ($candidates) { + $candidates = 'e.g. "'.implode('", "', $candidates).'" or "'.$last; + } else { + $candidates = '"'.$last; + } + + $message .= "\nDid you mean to call ".$candidates; + } + + return new UndefinedMethodError($message, $error); + } +} diff --git a/vendor/symfony/error-handler/ErrorHandler.php b/vendor/symfony/error-handler/ErrorHandler.php new file mode 100644 index 0000000..55164d6 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorHandler.php @@ -0,0 +1,784 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use Symfony\Component\ErrorHandler\Error\FatalError; +use Symfony\Component\ErrorHandler\Error\OutOfMemoryError; +use Symfony\Component\ErrorHandler\ErrorEnhancer\ClassNotFoundErrorEnhancer; +use Symfony\Component\ErrorHandler\ErrorEnhancer\ErrorEnhancerInterface; +use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedFunctionErrorEnhancer; +use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedMethodErrorEnhancer; +use Symfony\Component\ErrorHandler\ErrorRenderer\CliErrorRenderer; +use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; +use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; + +/** + * A generic ErrorHandler for the PHP engine. + * + * Provides five bit fields that control how errors are handled: + * - thrownErrors: errors thrown as \ErrorException + * - loggedErrors: logged errors, when not @-silenced + * - scopedErrors: errors thrown or logged with their local context + * - tracedErrors: errors logged with their stack trace + * - screamedErrors: never @-silenced errors + * + * Each error level can be logged by a dedicated PSR-3 logger object. + * Screaming only applies to logging. + * Throwing takes precedence over logging. + * Uncaught exceptions are logged as E_ERROR. + * E_DEPRECATED and E_USER_DEPRECATED levels never throw. + * E_RECOVERABLE_ERROR and E_USER_ERROR levels always throw. + * Non catchable errors that can be detected at shutdown time are logged when the scream bit field allows so. + * As errors have a performance cost, repeated errors are all logged, so that the developer + * can see them and weight them as more important to fix than others of the same level. + * + * @author Nicolas Grekas + * @author Grégoire Pineau + * + * @final + */ +class ErrorHandler +{ + private $levels = [ + E_DEPRECATED => 'Deprecated', + E_USER_DEPRECATED => 'User Deprecated', + E_NOTICE => 'Notice', + E_USER_NOTICE => 'User Notice', + E_STRICT => 'Runtime Notice', + E_WARNING => 'Warning', + E_USER_WARNING => 'User Warning', + E_COMPILE_WARNING => 'Compile Warning', + E_CORE_WARNING => 'Core Warning', + E_USER_ERROR => 'User Error', + E_RECOVERABLE_ERROR => 'Catchable Fatal Error', + E_COMPILE_ERROR => 'Compile Error', + E_PARSE => 'Parse Error', + E_ERROR => 'Error', + E_CORE_ERROR => 'Core Error', + ]; + + private $loggers = [ + E_DEPRECATED => [null, LogLevel::INFO], + E_USER_DEPRECATED => [null, LogLevel::INFO], + E_NOTICE => [null, LogLevel::WARNING], + E_USER_NOTICE => [null, LogLevel::WARNING], + E_STRICT => [null, LogLevel::WARNING], + E_WARNING => [null, LogLevel::WARNING], + E_USER_WARNING => [null, LogLevel::WARNING], + E_COMPILE_WARNING => [null, LogLevel::WARNING], + E_CORE_WARNING => [null, LogLevel::WARNING], + E_USER_ERROR => [null, LogLevel::CRITICAL], + E_RECOVERABLE_ERROR => [null, LogLevel::CRITICAL], + E_COMPILE_ERROR => [null, LogLevel::CRITICAL], + E_PARSE => [null, LogLevel::CRITICAL], + E_ERROR => [null, LogLevel::CRITICAL], + E_CORE_ERROR => [null, LogLevel::CRITICAL], + ]; + + private $thrownErrors = 0x1FFF; // E_ALL - E_DEPRECATED - E_USER_DEPRECATED + private $scopedErrors = 0x1FFF; // E_ALL - E_DEPRECATED - E_USER_DEPRECATED + private $tracedErrors = 0x77FB; // E_ALL - E_STRICT - E_PARSE + private $screamedErrors = 0x55; // E_ERROR + E_CORE_ERROR + E_COMPILE_ERROR + E_PARSE + private $loggedErrors = 0; + private $configureException; + private $debug; + + private $isRecursive = 0; + private $isRoot = false; + private $exceptionHandler; + private $bootstrappingLogger; + + private static $reservedMemory; + private static $toStringException; + private static $silencedErrorCache = []; + private static $silencedErrorCount = 0; + private static $exitCode = 0; + + /** + * Registers the error handler. + */ + public static function register(self $handler = null, bool $replace = true): self + { + if (null === self::$reservedMemory) { + self::$reservedMemory = str_repeat('x', 10240); + register_shutdown_function(__CLASS__.'::handleFatalError'); + } + + if ($handlerIsNew = null === $handler) { + $handler = new static(); + } + + if (null === $prev = set_error_handler([$handler, 'handleError'])) { + restore_error_handler(); + // Specifying the error types earlier would expose us to https://bugs.php.net/63206 + set_error_handler([$handler, 'handleError'], $handler->thrownErrors | $handler->loggedErrors); + $handler->isRoot = true; + } + + if ($handlerIsNew && \is_array($prev) && $prev[0] instanceof self) { + $handler = $prev[0]; + $replace = false; + } + if (!$replace && $prev) { + restore_error_handler(); + $handlerIsRegistered = \is_array($prev) && $handler === $prev[0]; + } else { + $handlerIsRegistered = true; + } + if (\is_array($prev = set_exception_handler([$handler, 'handleException'])) && $prev[0] instanceof self) { + restore_exception_handler(); + if (!$handlerIsRegistered) { + $handler = $prev[0]; + } elseif ($handler !== $prev[0] && $replace) { + set_exception_handler([$handler, 'handleException']); + $p = $prev[0]->setExceptionHandler(null); + $handler->setExceptionHandler($p); + $prev[0]->setExceptionHandler($p); + } + } else { + $handler->setExceptionHandler($prev ?? [$handler, 'renderException']); + } + + $handler->throwAt(E_ALL & $handler->thrownErrors, true); + + return $handler; + } + + /** + * Calls a function and turns any PHP error into \ErrorException. + * + * @return mixed What $function(...$arguments) returns + * + * @throws \ErrorException When $function(...$arguments) triggers a PHP error + */ + public static function call(callable $function, ...$arguments) + { + set_error_handler(static function (int $type, string $message, string $file, int $line) { + if (__FILE__ === $file) { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); + $file = $trace[2]['file'] ?? $file; + $line = $trace[2]['line'] ?? $line; + } + + throw new \ErrorException($message, 0, $type, $file, $line); + }); + + try { + return $function(...$arguments); + } finally { + restore_error_handler(); + } + } + + public function __construct(BufferingLogger $bootstrappingLogger = null, bool $debug = false) + { + if ($bootstrappingLogger) { + $this->bootstrappingLogger = $bootstrappingLogger; + $this->setDefaultLogger($bootstrappingLogger); + } + $traceReflector = new \ReflectionProperty('Exception', 'trace'); + $traceReflector->setAccessible(true); + $this->configureException = \Closure::bind(static function ($e, $trace, $file = null, $line = null) use ($traceReflector) { + $traceReflector->setValue($e, $trace); + $e->file = $file ?? $e->file; + $e->line = $line ?? $e->line; + }, null, new class() extends \Exception { + }); + $this->debug = $debug; + } + + /** + * Sets a logger to non assigned errors levels. + * + * @param LoggerInterface $logger A PSR-3 logger to put as default for the given levels + * @param array|int $levels An array map of E_* to LogLevel::* or an integer bit field of E_* constants + * @param bool $replace Whether to replace or not any existing logger + */ + public function setDefaultLogger(LoggerInterface $logger, $levels = E_ALL, bool $replace = false): void + { + $loggers = []; + + if (\is_array($levels)) { + foreach ($levels as $type => $logLevel) { + if (empty($this->loggers[$type][0]) || $replace || $this->loggers[$type][0] === $this->bootstrappingLogger) { + $loggers[$type] = [$logger, $logLevel]; + } + } + } else { + if (null === $levels) { + $levels = E_ALL; + } + foreach ($this->loggers as $type => $log) { + if (($type & $levels) && (empty($log[0]) || $replace || $log[0] === $this->bootstrappingLogger)) { + $log[0] = $logger; + $loggers[$type] = $log; + } + } + } + + $this->setLoggers($loggers); + } + + /** + * Sets a logger for each error level. + * + * @param array $loggers Error levels to [LoggerInterface|null, LogLevel::*] map + * + * @return array The previous map + * + * @throws \InvalidArgumentException + */ + public function setLoggers(array $loggers): array + { + $prevLogged = $this->loggedErrors; + $prev = $this->loggers; + $flush = []; + + foreach ($loggers as $type => $log) { + if (!isset($prev[$type])) { + throw new \InvalidArgumentException('Unknown error type: '.$type); + } + if (!\is_array($log)) { + $log = [$log]; + } elseif (!\array_key_exists(0, $log)) { + throw new \InvalidArgumentException('No logger provided.'); + } + if (null === $log[0]) { + $this->loggedErrors &= ~$type; + } elseif ($log[0] instanceof LoggerInterface) { + $this->loggedErrors |= $type; + } else { + throw new \InvalidArgumentException('Invalid logger provided.'); + } + $this->loggers[$type] = $log + $prev[$type]; + + if ($this->bootstrappingLogger && $prev[$type][0] === $this->bootstrappingLogger) { + $flush[$type] = $type; + } + } + $this->reRegister($prevLogged | $this->thrownErrors); + + if ($flush) { + foreach ($this->bootstrappingLogger->cleanLogs() as $log) { + $type = ThrowableUtils::getSeverity($log[2]['exception']); + if (!isset($flush[$type])) { + $this->bootstrappingLogger->log($log[0], $log[1], $log[2]); + } elseif ($this->loggers[$type][0]) { + $this->loggers[$type][0]->log($this->loggers[$type][1], $log[1], $log[2]); + } + } + } + + return $prev; + } + + /** + * Sets a user exception handler. + * + * @param callable(\Throwable $e)|null $handler + * + * @return callable|null The previous exception handler + */ + public function setExceptionHandler(?callable $handler): ?callable + { + $prev = $this->exceptionHandler; + $this->exceptionHandler = $handler; + + return $prev; + } + + /** + * Sets the PHP error levels that throw an exception when a PHP error occurs. + * + * @param int $levels A bit field of E_* constants for thrown errors + * @param bool $replace Replace or amend the previous value + * + * @return int The previous value + */ + public function throwAt(int $levels, bool $replace = false): int + { + $prev = $this->thrownErrors; + $this->thrownErrors = ($levels | E_RECOVERABLE_ERROR | E_USER_ERROR) & ~E_USER_DEPRECATED & ~E_DEPRECATED; + if (!$replace) { + $this->thrownErrors |= $prev; + } + $this->reRegister($prev | $this->loggedErrors); + + return $prev; + } + + /** + * Sets the PHP error levels for which local variables are preserved. + * + * @param int $levels A bit field of E_* constants for scoped errors + * @param bool $replace Replace or amend the previous value + * + * @return int The previous value + */ + public function scopeAt(int $levels, bool $replace = false): int + { + $prev = $this->scopedErrors; + $this->scopedErrors = $levels; + if (!$replace) { + $this->scopedErrors |= $prev; + } + + return $prev; + } + + /** + * Sets the PHP error levels for which the stack trace is preserved. + * + * @param int $levels A bit field of E_* constants for traced errors + * @param bool $replace Replace or amend the previous value + * + * @return int The previous value + */ + public function traceAt(int $levels, bool $replace = false): int + { + $prev = $this->tracedErrors; + $this->tracedErrors = (int) $levels; + if (!$replace) { + $this->tracedErrors |= $prev; + } + + return $prev; + } + + /** + * Sets the error levels where the @-operator is ignored. + * + * @param int $levels A bit field of E_* constants for screamed errors + * @param bool $replace Replace or amend the previous value + * + * @return int The previous value + */ + public function screamAt(int $levels, bool $replace = false): int + { + $prev = $this->screamedErrors; + $this->screamedErrors = $levels; + if (!$replace) { + $this->screamedErrors |= $prev; + } + + return $prev; + } + + /** + * Re-registers as a PHP error handler if levels changed. + */ + private function reRegister(int $prev): void + { + if ($prev !== $this->thrownErrors | $this->loggedErrors) { + $handler = set_error_handler('var_dump'); + $handler = \is_array($handler) ? $handler[0] : null; + restore_error_handler(); + if ($handler === $this) { + restore_error_handler(); + if ($this->isRoot) { + set_error_handler([$this, 'handleError'], $this->thrownErrors | $this->loggedErrors); + } else { + set_error_handler([$this, 'handleError']); + } + } + } + } + + /** + * Handles errors by filtering then logging them according to the configured bit fields. + * + * @return bool Returns false when no handling happens so that the PHP engine can handle the error itself + * + * @throws \ErrorException When $this->thrownErrors requests so + * + * @internal + */ + public function handleError(int $type, string $message, string $file, int $line): bool + { + if (\PHP_VERSION_ID >= 70300 && E_WARNING === $type && '"' === $message[0] && false !== strpos($message, '" targeting switch is equivalent to "break')) { + $type = E_DEPRECATED; + } + + // Level is the current error reporting level to manage silent error. + $level = error_reporting(); + $silenced = 0 === ($level & $type); + // Strong errors are not authorized to be silenced. + $level |= E_RECOVERABLE_ERROR | E_USER_ERROR | E_DEPRECATED | E_USER_DEPRECATED; + $log = $this->loggedErrors & $type; + $throw = $this->thrownErrors & $type & $level; + $type &= $level | $this->screamedErrors; + + // Never throw on warnings triggered by assert() + if (E_WARNING === $type && 'a' === $message[0] && 0 === strncmp($message, 'assert(): ', 10)) { + $throw = 0; + } + + if (!$type || (!$log && !$throw)) { + return !$silenced && $type && $log; + } + $scope = $this->scopedErrors & $type; + + if (false !== strpos($message, "@anonymous\0")) { + $logMessage = $this->parseAnonymousClass($message); + } else { + $logMessage = $this->levels[$type].': '.$message; + } + + if (null !== self::$toStringException) { + $errorAsException = self::$toStringException; + self::$toStringException = null; + } elseif (!$throw && !($type & $level)) { + if (!isset(self::$silencedErrorCache[$id = $file.':'.$line])) { + $lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5), $type, $file, $line, false) : []; + $errorAsException = new SilencedErrorContext($type, $file, $line, isset($lightTrace[1]) ? [$lightTrace[0]] : $lightTrace); + } elseif (isset(self::$silencedErrorCache[$id][$message])) { + $lightTrace = null; + $errorAsException = self::$silencedErrorCache[$id][$message]; + ++$errorAsException->count; + } else { + $lightTrace = []; + $errorAsException = null; + } + + if (100 < ++self::$silencedErrorCount) { + self::$silencedErrorCache = $lightTrace = []; + self::$silencedErrorCount = 1; + } + if ($errorAsException) { + self::$silencedErrorCache[$id][$message] = $errorAsException; + } + if (null === $lightTrace) { + return true; + } + } else { + $errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line); + + if ($throw || $this->tracedErrors & $type) { + $backtrace = $errorAsException->getTrace(); + $lightTrace = $this->cleanTrace($backtrace, $type, $file, $line, $throw); + ($this->configureException)($errorAsException, $lightTrace, $file, $line); + } else { + ($this->configureException)($errorAsException, []); + $backtrace = []; + } + } + + if ($throw) { + if (\PHP_VERSION_ID < 70400 && E_USER_ERROR & $type) { + for ($i = 1; isset($backtrace[$i]); ++$i) { + if (isset($backtrace[$i]['function'], $backtrace[$i]['type'], $backtrace[$i - 1]['function']) + && '__toString' === $backtrace[$i]['function'] + && '->' === $backtrace[$i]['type'] + && !isset($backtrace[$i - 1]['class']) + && ('trigger_error' === $backtrace[$i - 1]['function'] || 'user_error' === $backtrace[$i - 1]['function']) + ) { + // Here, we know trigger_error() has been called from __toString(). + // PHP triggers a fatal error when throwing from __toString(). + // A small convention allows working around the limitation: + // given a caught $e exception in __toString(), quitting the method with + // `return trigger_error($e, E_USER_ERROR);` allows this error handler + // to make $e get through the __toString() barrier. + + $context = 4 < \func_num_args() ? (func_get_arg(4) ?: []) : []; + + foreach ($context as $e) { + if ($e instanceof \Throwable && $e->__toString() === $message) { + self::$toStringException = $e; + + return true; + } + } + + // Display the original error message instead of the default one. + $this->handleException($errorAsException); + + // Stop the process by giving back the error to the native handler. + return false; + } + } + } + + throw $errorAsException; + } + + if ($this->isRecursive) { + $log = 0; + } else { + if (\PHP_VERSION_ID < (\PHP_VERSION_ID < 70400 ? 70316 : 70404)) { + $currentErrorHandler = set_error_handler('var_dump'); + restore_error_handler(); + } + + try { + $this->isRecursive = true; + $level = ($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG; + $this->loggers[$type][0]->log($level, $logMessage, $errorAsException ? ['exception' => $errorAsException] : []); + } finally { + $this->isRecursive = false; + + if (\PHP_VERSION_ID < (\PHP_VERSION_ID < 70400 ? 70316 : 70404)) { + set_error_handler($currentErrorHandler); + } + } + } + + return !$silenced && $type && $log; + } + + /** + * Handles an exception by logging then forwarding it to another handler. + * + * @internal + */ + public function handleException(\Throwable $exception) + { + $handlerException = null; + + if (!$exception instanceof FatalError) { + self::$exitCode = 255; + + $type = ThrowableUtils::getSeverity($exception); + } else { + $type = $exception->getError()['type']; + } + + if ($this->loggedErrors & $type) { + if (false !== strpos($message = $exception->getMessage(), "@anonymous\0")) { + $message = $this->parseAnonymousClass($message); + } + + if ($exception instanceof FatalError) { + $message = 'Fatal '.$message; + } elseif ($exception instanceof \Error) { + $message = 'Uncaught Error: '.$message; + } elseif ($exception instanceof \ErrorException) { + $message = 'Uncaught '.$message; + } else { + $message = 'Uncaught Exception: '.$message; + } + + try { + $this->loggers[$type][0]->log($this->loggers[$type][1], $message, ['exception' => $exception]); + } catch (\Throwable $handlerException) { + } + } + + if (!$exception instanceof OutOfMemoryError) { + foreach ($this->getErrorEnhancers() as $errorEnhancer) { + if ($e = $errorEnhancer->enhance($exception)) { + $exception = $e; + break; + } + } + } + + $exceptionHandler = $this->exceptionHandler; + $this->exceptionHandler = [$this, 'renderException']; + + if (null === $exceptionHandler || $exceptionHandler === $this->exceptionHandler) { + $this->exceptionHandler = null; + } + + try { + if (null !== $exceptionHandler) { + return $exceptionHandler($exception); + } + $handlerException = $handlerException ?: $exception; + } catch (\Throwable $handlerException) { + } + if ($exception === $handlerException && null === $this->exceptionHandler) { + self::$reservedMemory = null; // Disable the fatal error handler + throw $exception; // Give back $exception to the native handler + } + + $loggedErrors = $this->loggedErrors; + $this->loggedErrors = $exception === $handlerException ? 0 : $this->loggedErrors; + + try { + $this->handleException($handlerException); + } finally { + $this->loggedErrors = $loggedErrors; + } + } + + /** + * Shutdown registered function for handling PHP fatal errors. + * + * @param array|null $error An array as returned by error_get_last() + * + * @internal + */ + public static function handleFatalError(array $error = null): void + { + if (null === self::$reservedMemory) { + return; + } + + $handler = self::$reservedMemory = null; + $handlers = []; + $previousHandler = null; + $sameHandlerLimit = 10; + + while (!\is_array($handler) || !$handler[0] instanceof self) { + $handler = set_exception_handler('var_dump'); + restore_exception_handler(); + + if (!$handler) { + break; + } + restore_exception_handler(); + + if ($handler !== $previousHandler) { + array_unshift($handlers, $handler); + $previousHandler = $handler; + } elseif (0 === --$sameHandlerLimit) { + $handler = null; + break; + } + } + foreach ($handlers as $h) { + set_exception_handler($h); + } + if (!$handler) { + return; + } + if ($handler !== $h) { + $handler[0]->setExceptionHandler($h); + } + $handler = $handler[0]; + $handlers = []; + + if ($exit = null === $error) { + $error = error_get_last(); + } + + if ($error && $error['type'] &= E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR) { + // Let's not throw anymore but keep logging + $handler->throwAt(0, true); + $trace = isset($error['backtrace']) ? $error['backtrace'] : null; + + if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) { + $fatalError = new OutOfMemoryError($handler->levels[$error['type']].': '.$error['message'], 0, $error, 2, false, $trace); + } else { + $fatalError = new FatalError($handler->levels[$error['type']].': '.$error['message'], 0, $error, 2, true, $trace); + } + } else { + $fatalError = null; + } + + try { + if (null !== $fatalError) { + self::$exitCode = 255; + $handler->handleException($fatalError); + } + } catch (FatalError $e) { + // Ignore this re-throw + } + + if ($exit && self::$exitCode) { + $exitCode = self::$exitCode; + register_shutdown_function('register_shutdown_function', function () use ($exitCode) { exit($exitCode); }); + } + } + + /** + * Renders the given exception. + * + * As this method is mainly called during boot where nothing is yet available, + * the output is always either HTML or CLI depending where PHP runs. + */ + private function renderException(\Throwable $exception): void + { + $renderer = \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) ? new CliErrorRenderer() : new HtmlErrorRenderer($this->debug); + + $exception = $renderer->render($exception); + + if (!headers_sent()) { + http_response_code($exception->getStatusCode()); + + foreach ($exception->getHeaders() as $name => $value) { + header($name.': '.$value, false); + } + } + + echo $exception->getAsString(); + } + + /** + * Override this method if you want to define more error enhancers. + * + * @return ErrorEnhancerInterface[] + */ + protected function getErrorEnhancers(): iterable + { + return [ + new UndefinedFunctionErrorEnhancer(), + new UndefinedMethodErrorEnhancer(), + new ClassNotFoundErrorEnhancer(), + ]; + } + + /** + * Cleans the trace by removing function arguments and the frames added by the error handler and DebugClassLoader. + */ + private function cleanTrace(array $backtrace, int $type, string &$file, int &$line, bool $throw): array + { + $lightTrace = $backtrace; + + for ($i = 0; isset($backtrace[$i]); ++$i) { + if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) { + $lightTrace = \array_slice($lightTrace, 1 + $i); + break; + } + } + if (E_USER_DEPRECATED === $type) { + for ($i = 0; isset($lightTrace[$i]); ++$i) { + if (!isset($lightTrace[$i]['file'], $lightTrace[$i]['line'], $lightTrace[$i]['function'])) { + continue; + } + if (!isset($lightTrace[$i]['class']) && 'trigger_deprecation' === $lightTrace[$i]['function']) { + $file = $lightTrace[$i]['file']; + $line = $lightTrace[$i]['line']; + $lightTrace = \array_slice($lightTrace, 1 + $i); + break; + } + } + } + if (class_exists(DebugClassLoader::class, false)) { + for ($i = \count($lightTrace) - 2; 0 < $i; --$i) { + if (DebugClassLoader::class === ($lightTrace[$i]['class'] ?? null)) { + array_splice($lightTrace, --$i, 2); + } + } + } + if (!($throw || $this->scopedErrors & $type)) { + for ($i = 0; isset($lightTrace[$i]); ++$i) { + unset($lightTrace[$i]['args'], $lightTrace[$i]['object']); + } + } + + return $lightTrace; + } + + /** + * Parse the error message by removing the anonymous class notation + * and using the parent class instead if possible. + */ + private function parseAnonymousClass(string $message): string + { + return preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', static function ($m) { + return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; + }, $message); + } +} diff --git a/vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php b/vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php new file mode 100644 index 0000000..5c0f6a7 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorRenderer; + +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +// Help opcache.preload discover always-needed symbols +class_exists(CliDumper::class); + +/** + * @author Nicolas Grekas + */ +class CliErrorRenderer implements ErrorRendererInterface +{ + /** + * {@inheritdoc} + */ + public function render(\Throwable $exception): FlattenException + { + $cloner = new VarCloner(); + $dumper = new class() extends CliDumper { + protected function supportsColors(): bool + { + $outputStream = $this->outputStream; + $this->outputStream = fopen('php://stdout', 'w'); + + try { + return parent::supportsColors(); + } finally { + $this->outputStream = $outputStream; + } + } + }; + + return FlattenException::createFromThrowable($exception) + ->setAsString($dumper->dump($cloner->cloneVar($exception), true)); + } +} diff --git a/vendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php b/vendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php new file mode 100644 index 0000000..aba1966 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorRenderer; + +use Symfony\Component\ErrorHandler\Exception\FlattenException; + +/** + * Formats an exception to be used as response content. + * + * @author Yonel Ceruto + */ +interface ErrorRendererInterface +{ + /** + * Renders a Throwable as a FlattenException. + */ + public function render(\Throwable $exception): FlattenException; +} diff --git a/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php b/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php new file mode 100644 index 0000000..11f3a60 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php @@ -0,0 +1,354 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorRenderer; + +use Psr\Log\LoggerInterface; +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; + +/** + * @author Yonel Ceruto + */ +class HtmlErrorRenderer implements ErrorRendererInterface +{ + private const GHOST_ADDONS = [ + '02-14' => self::GHOST_HEART, + '02-29' => self::GHOST_PLUS, + '10-18' => self::GHOST_GIFT, + ]; + + private const GHOST_GIFT = 'M124.00534057617188,5.3606138080358505 C124.40059661865234,4.644828304648399 125.1237564086914,3.712414965033531 123.88127899169922,3.487462028861046 C123.53517150878906,3.3097832053899765 123.18894958496094,2.9953975528478622 122.8432846069336,3.345616325736046 C122.07421112060547,3.649444565176964 121.40750122070312,4.074306473135948 122.2164306640625,4.869479164481163 C122.57514953613281,5.3830065578222275 122.90142822265625,6.503447040915489 123.3077621459961,6.626829609274864 C123.55027770996094,6.210384353995323 123.7774658203125,5.785196766257286 124.00534057617188,5.3606138080358505 zM122.30630493164062,7.336987480521202 C121.60028076171875,6.076864704489708 121.03211975097656,4.72498320043087 120.16796875,3.562500938773155 C119.11695098876953,2.44033907353878 117.04605865478516,2.940566048026085 116.57544708251953,4.387995228171349 C115.95028686523438,5.819030746817589 117.2991714477539,7.527640804648399 118.826171875,7.348545059561729 C119.98493194580078,7.367936596274376 121.15027618408203,7.420116886496544 122.30630493164062,7.336987480521202 zM128.1732177734375,7.379541382193565 C129.67486572265625,7.17823551595211 130.53842163085938,5.287807449698448 129.68344116210938,4.032590612769127 C128.92578125,2.693056806921959 126.74605560302734,2.6463639587163925 125.98509216308594,4.007616028189659 C125.32617950439453,5.108129009604454 124.75428009033203,6.258124336600304 124.14962768554688,7.388818249106407 C125.48638916015625,7.465229496359825 126.8357162475586,7.447416767477989 128.1732177734375,7.379541382193565 zM130.6601104736328,8.991325363516808 C131.17202758789062,8.540884003043175 133.1543731689453,8.009847149252892 131.65304565429688,7.582054600119591 C131.2811279296875,7.476506695151329 130.84751892089844,6.99234913289547 130.5132598876953,7.124847874045372 C129.78744506835938,8.02728746831417 128.67140197753906,8.55669592320919 127.50616455078125,8.501235947012901 C127.27806091308594,8.576229080557823 126.11459350585938,8.38720129430294 126.428955078125,8.601900085806847 C127.25099182128906,9.070617660880089 128.0523223876953,9.579657539725304 128.902587890625,9.995706543326378 C129.49813842773438,9.678531631827354 130.0761260986328,9.329126343131065 130.6601104736328,8.991325363516808 zM118.96446990966797,9.246344551444054 C119.4022445678711,8.991325363516808 119.84001922607422,8.736305221915245 120.27779388427734,8.481284126639366 C118.93965911865234,8.414779648184776 117.40827941894531,8.607666000723839 116.39698791503906,7.531384453177452 C116.11186981201172,7.212117180228233 115.83845520019531,6.846597656607628 115.44329071044922,7.248530372977257 C114.96995544433594,7.574637398123741 113.5140609741211,7.908811077475548 114.63501739501953,8.306883797049522 C115.61112976074219,8.883499130606651 116.58037567138672,9.474181160330772 117.58061218261719,10.008124336600304 C118.05723571777344,9.784612640738487 118.50651550292969,9.5052699893713 118.96446990966797,9.246344551444054 zM125.38018035888672,12.091858848929405 C125.9474868774414,11.636047348380089 127.32159423828125,11.201767906546593 127.36749267578125,10.712632164359093 C126.08487701416016,9.974547371268272 124.83960723876953,9.152772888541222 123.49772644042969,8.528907760977745 C123.03594207763672,8.353693947196007 122.66152954101562,8.623294815421104 122.28982543945312,8.857431396842003 C121.19065856933594,9.51122473180294 120.06505584716797,10.12446115911007 119.00167083740234,10.835315689444542 C120.39238739013672,11.69529627263546 121.79983520507812,12.529837593436241 123.22095489501953,13.338589653372765 C123.94580841064453,12.932025894522667 124.66128540039062,12.508862480521202 125.38018035888672,12.091858848929405 zM131.07164001464844,13.514615997672081 C131.66018676757812,13.143282875418663 132.2487335205078,12.771927818655968 132.8372802734375,12.400571808218956 C132.8324737548828,11.156818374991417 132.8523406982422,9.912529930472374 132.81829833984375,8.669195160269737 C131.63046264648438,9.332009300589561 130.45948791503906,10.027913078665733 129.30828857421875,10.752535805106163 C129.182373046875,12.035354599356651 129.24623107910156,13.33940313756466 129.27359008789062,14.628684982657433 C129.88104248046875,14.27079389989376 130.4737548828125,13.888019546866417 131.07164001464844,13.514640793204308 zM117.26847839355469,12.731024727225304 C117.32825469970703,11.67083452641964 117.45709991455078,10.46224020421505 116.17853546142578,10.148179039359093 C115.37110900878906,9.77159021794796 114.25194549560547,8.806716904044151 113.62991333007812,8.81639002263546 C113.61052703857422,10.0110072940588 113.62078857421875,11.20585821568966 113.61869049072266,12.400571808218956 C114.81139373779297,13.144886955618858 115.98292541503906,13.925040230154991 117.20137023925781,14.626662239432335 C117.31951141357422,14.010867103934288 117.24227905273438,13.35805033147335 117.26847839355469,12.731024727225304 zM125.80937957763672,16.836034759879112 C126.51483917236328,16.390663132071495 127.22030639648438,15.945291504263878 127.92576599121094,15.49991987645626 C127.92250061035156,14.215868934988976 127.97560119628906,12.929980263113976 127.91757202148438,11.647302612662315 C127.14225769042969,11.869626984000206 126.25550079345703,12.556857094168663 125.43866729736328,12.983742699027061 C124.82704162597656,13.342005714774132 124.21542358398438,13.700271591544151 123.60379028320312,14.05853746831417 C123.61585235595703,15.429577812552452 123.57081604003906,16.803131088614464 123.64839172363281,18.172149643301964 C124.37957000732422,17.744937881827354 125.09130859375,17.284801468253136 125.80937957763672,16.836034759879112 zM122.8521499633789,16.115344032645226 C122.8521499633789,15.429741844534874 122.8521499633789,14.744139656424522 122.8521499633789,14.05853746831417 C121.43595123291016,13.230924591422081 120.02428436279297,12.395455345511436 118.60256958007812,11.577354416251183 C118.52394104003906,12.888403877615929 118.56887817382812,14.204405769705772 118.55702209472656,15.517732605338097 C119.97289276123047,16.4041957706213 121.37410736083984,17.314891800284386 122.80789947509766,18.172149643301964 C122.86368560791016,17.488990768790245 122.84332275390625,16.800363525748253 122.8521499633789,16.115344032645226 zM131.10684204101562,18.871450409293175 C131.68399047851562,18.48711584508419 132.2611541748047,18.10278509557247 132.8383026123047,17.718475326895714 C132.81423950195312,16.499977096915245 132.89776611328125,15.264989838004112 132.77627563476562,14.05993078649044 C131.5760040283203,14.744719490408897 130.41763305664062,15.524359688162804 129.23875427246094,16.255397781729698 C129.26707458496094,17.516149505972862 129.18060302734375,18.791316971182823 129.3108367919922,20.041303619742393 C129.91973876953125,19.667551025748253 130.51010131835938,19.264152511954308 131.10684204101562,18.871450409293175 zM117.2557373046875,18.188333496451378 C117.25104522705078,17.549470886588097 117.24633026123047,16.91058538854122 117.24163055419922,16.271720871329308 C116.04924774169922,15.525708183646202 114.87187957763672,14.75476549565792 113.66158294677734,14.038097366690636 C113.5858383178711,15.262084946036339 113.62901306152344,16.49083898961544 113.61761474609375,17.717010483145714 C114.82051086425781,18.513254150748253 116.00987243652344,19.330610260367393 117.22888946533203,20.101993545889854 C117.27559661865234,19.466014847159386 117.25241088867188,18.825733169913292 117.2557373046875,18.188333496451378 zM125.8398666381836,22.38675306737423 C126.54049682617188,21.921453461050987 127.24110412597656,21.456151947379112 127.94172668457031,20.99083136022091 C127.94009399414062,19.693386062979698 127.96646118164062,18.395381912589073 127.93160247802734,17.098379120230675 C126.50540924072266,17.97775076329708 125.08877563476562,18.873308166861534 123.68258666992188,19.78428266942501 C123.52366638183594,21.03710363805294 123.626708984375,22.32878302037716 123.62647247314453,23.595300659537315 C124.06291198730469,23.86113165318966 125.1788101196289,22.68297766149044 125.8398666381836,22.38675306737423 zM122.8521499633789,21.83134649693966 C122.76741790771484,20.936696991324425 123.21651458740234,19.67745779454708 122.0794677734375,19.330633148550987 C120.93280029296875,18.604360565543175 119.7907485961914,17.870157226920128 118.62899780273438,17.16818617284298 C118.45966339111328,18.396427139639854 118.63676452636719,19.675991043448448 118.50668334960938,20.919256195425987 C119.89984130859375,21.92635916173458 121.32942199707031,22.88914106786251 122.78502655029297,23.803510650992393 C122.90177917480469,23.1627406924963 122.82917022705078,22.48402212560177 122.8521499633789,21.83134649693966 zM117.9798355102539,21.59483526647091 C116.28416442871094,20.46288488805294 114.58848571777344,19.330957397818565 112.892822265625,18.199007019400597 C112.89473724365234,14.705654129385948 112.84647369384766,11.211485847830772 112.90847778320312,7.718807205557823 C113.7575912475586,7.194885239005089 114.66117858886719,6.765397056937218 115.5350341796875,6.284702762961388 C114.97061157226562,4.668964847922325 115.78496551513672,2.7054970115423203 117.42159271240234,2.1007001250982285 C118.79354095458984,1.537783369421959 120.44731903076172,2.0457767099142075 121.32200622558594,3.23083733022213 C121.95732116699219,2.9050118774175644 122.59264373779297,2.5791852325201035 123.22796630859375,2.253336176276207 C123.86669921875,2.5821153968572617 124.50543975830078,2.9108948558568954 125.1441650390625,3.23967407643795 C126.05941009521484,2.154020771384239 127.62747192382812,1.5344576686620712 128.986328125,2.1429056972265244 C130.61741638183594,2.716217741370201 131.50650024414062,4.675290569663048 130.9215545654297,6.2884936183691025 C131.8018341064453,6.78548763692379 132.7589111328125,7.1738648265600204 133.5660400390625,7.780336365103722 C133.60182189941406,11.252970680594444 133.56637573242188,14.726140961050987 133.5631103515625,18.199007019400597 C130.18914794921875,20.431867584586143 126.86984252929688,22.74994657933712 123.44108581542969,24.897907242178917 C122.44406127929688,24.897628769278526 121.5834732055664,23.815067276358604 120.65831756591797,23.37616156041622 C119.76387023925781,22.784828171133995 118.87168884277344,22.19007681310177 117.9798355102539,21.59483526647091 z'; + private const GHOST_HEART = 'M125.91386369681868,8.305165958366445 C128.95033202169043,-0.40540639102854037 140.8469835342744,8.305165958366445 125.91386369681868,19.504526138305664 C110.98208663272044,8.305165958366445 122.87795231771452,-0.40540639102854037 125.91386369681868,8.305165958366445 z'; + private const GHOST_PLUS = 'M111.36824226379395,8.969108581542969 L118.69175148010254,8.969108581542969 L118.69175148010254,1.6455793380737305 L126.20429420471191,1.6455793380737305 L126.20429420471191,8.969108581542969 L133.52781105041504,8.969108581542969 L133.52781105041504,16.481630325317383 L126.20429420471191,16.481630325317383 L126.20429420471191,23.805158615112305 L118.69175148010254,23.805158615112305 L118.69175148010254,16.481630325317383 L111.36824226379395,16.481630325317383 z'; + + private $debug; + private $charset; + private $fileLinkFormat; + private $projectDir; + private $outputBuffer; + private $logger; + + /** + * @param bool|callable $debug The debugging mode as a boolean or a callable that should return it + * @param bool|callable $outputBuffer The output buffer as a string or a callable that should return it + */ + public function __construct($debug = false, string $charset = null, $fileLinkFormat = null, string $projectDir = null, $outputBuffer = '', LoggerInterface $logger = null) + { + if (!\is_bool($debug) && !\is_callable($debug)) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a boolean or a callable, "%s" given.', __METHOD__, get_debug_type($debug))); + } + + if (!\is_string($outputBuffer) && !\is_callable($outputBuffer)) { + throw new \TypeError(sprintf('Argument 5 passed to "%s()" must be a string or a callable, "%s" given.', __METHOD__, get_debug_type($outputBuffer))); + } + + $this->debug = $debug; + $this->charset = $charset ?: (ini_get('default_charset') ?: 'UTF-8'); + $this->fileLinkFormat = $fileLinkFormat ?: (ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format')); + $this->projectDir = $projectDir; + $this->outputBuffer = $outputBuffer; + $this->logger = $logger; + } + + /** + * {@inheritdoc} + */ + public function render(\Throwable $exception): FlattenException + { + $headers = ['Content-Type' => 'text/html; charset='.$this->charset]; + if (\is_bool($this->debug) ? $this->debug : ($this->debug)($exception)) { + $headers['X-Debug-Exception'] = rawurlencode($exception->getMessage()); + $headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine(); + } + + $exception = FlattenException::createFromThrowable($exception, null, $headers); + + return $exception->setAsString($this->renderException($exception)); + } + + /** + * Gets the HTML content associated with the given exception. + */ + public function getBody(FlattenException $exception): string + { + return $this->renderException($exception, 'views/exception.html.php'); + } + + /** + * Gets the stylesheet associated with the given exception. + */ + public function getStylesheet(): string + { + if (!$this->debug) { + return $this->include('assets/css/error.css'); + } + + return $this->include('assets/css/exception.css'); + } + + public static function isDebug(RequestStack $requestStack, bool $debug): \Closure + { + return static function () use ($requestStack, $debug): bool { + if (!$request = $requestStack->getCurrentRequest()) { + return $debug; + } + + return $debug && $request->attributes->getBoolean('showException', true); + }; + } + + public static function getAndCleanOutputBuffer(RequestStack $requestStack): \Closure + { + return static function () use ($requestStack): string { + if (!$request = $requestStack->getCurrentRequest()) { + return ''; + } + + $startObLevel = $request->headers->get('X-Php-Ob-Level', -1); + + if (ob_get_level() <= $startObLevel) { + return ''; + } + + Response::closeOutputBuffers($startObLevel + 1, true); + + return ob_get_clean(); + }; + } + + private function renderException(FlattenException $exception, string $debugTemplate = 'views/exception_full.html.php'): string + { + $debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception); + $statusText = $this->escape($exception->getStatusText()); + $statusCode = $this->escape($exception->getStatusCode()); + + if (!$debug) { + return $this->include('views/error.html.php', [ + 'statusText' => $statusText, + 'statusCode' => $statusCode, + ]); + } + + $exceptionMessage = $this->escape($exception->getMessage()); + + return $this->include($debugTemplate, [ + 'exception' => $exception, + 'exceptionMessage' => $exceptionMessage, + 'statusText' => $statusText, + 'statusCode' => $statusCode, + 'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null, + 'currentContent' => \is_string($this->outputBuffer) ? $this->outputBuffer : ($this->outputBuffer)(), + ]); + } + + /** + * Formats an array as a string. + */ + private function formatArgs(array $args): string + { + $result = []; + foreach ($args as $key => $item) { + if ('object' === $item[0]) { + $formattedValue = sprintf('object(%s)', $this->abbrClass($item[1])); + } elseif ('array' === $item[0]) { + $formattedValue = sprintf('array(%s)', \is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]); + } elseif ('null' === $item[0]) { + $formattedValue = 'null'; + } elseif ('boolean' === $item[0]) { + $formattedValue = ''.strtolower(var_export($item[1], true)).''; + } elseif ('resource' === $item[0]) { + $formattedValue = 'resource'; + } else { + $formattedValue = str_replace("\n", '', $this->escape(var_export($item[1], true))); + } + + $result[] = \is_int($key) ? $formattedValue : sprintf("'%s' => %s", $this->escape($key), $formattedValue); + } + + return implode(', ', $result); + } + + private function formatArgsAsText(array $args) + { + return strip_tags($this->formatArgs($args)); + } + + private function escape(string $string): string + { + return htmlspecialchars($string, ENT_COMPAT | ENT_SUBSTITUTE, $this->charset); + } + + private function abbrClass(string $class): string + { + $parts = explode('\\', $class); + $short = array_pop($parts); + + return sprintf('%s', $class, $short); + } + + private function getFileRelative(string $file): ?string + { + $file = str_replace('\\', '/', $file); + + if (null !== $this->projectDir && 0 === strpos($file, $this->projectDir)) { + return ltrim(substr($file, \strlen($this->projectDir)), '/'); + } + + return null; + } + + /** + * Returns the link for a given file/line pair. + * + * @return string|false A link or false + */ + private function getFileLink(string $file, int $line) + { + if ($fmt = $this->fileLinkFormat) { + return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line); + } + + return false; + } + + /** + * Formats a file path. + * + * @param string $file An absolute file path + * @param int $line The line number + * @param string $text Use this text for the link rather than the file path + */ + private function formatFile(string $file, int $line, string $text = null): string + { + $file = trim($file); + + if (null === $text) { + $text = $file; + if (null !== $rel = $this->getFileRelative($text)) { + $rel = explode('/', $rel, 2); + $text = sprintf('%s%s', $this->projectDir, $rel[0], '/'.($rel[1] ?? '')); + } + } + + if (0 < $line) { + $text .= ' at line '.$line; + } + + if (false !== $link = $this->getFileLink($file, $line)) { + return sprintf('%s', $this->escape($link), $text); + } + + return $text; + } + + /** + * Returns an excerpt of a code file around the given line number. + * + * @param string $file A file path + * @param int $line The selected line number + * @param int $srcContext The number of displayed lines around or -1 for the whole file + * + * @return string An HTML string + */ + private function fileExcerpt(string $file, int $line, int $srcContext = 3): string + { + if (is_file($file) && is_readable($file)) { + // highlight_file could throw warnings + // see https://bugs.php.net/25725 + $code = @highlight_file($file, true); + // remove main code/span tags + $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code); + // split multiline spans + $code = preg_replace_callback('#]++)>((?:[^<]*+
)++[^<]*+)
#', function ($m) { + return "".str_replace('
', "

", $m[2]).''; + }, $code); + $content = explode('
', $code); + + $lines = []; + if (0 > $srcContext) { + $srcContext = \count($content); + } + + for ($i = max($line - $srcContext, 1), $max = min($line + $srcContext, \count($content)); $i <= $max; ++$i) { + $lines[] = ''.$this->fixCodeMarkup($content[$i - 1]).''; + } + + return '
    '.implode("\n", $lines).'
'; + } + + return ''; + } + + private function fixCodeMarkup(string $line) + { + // ending tag from previous line + $opening = strpos($line, ''); + if (false !== $closing && (false === $opening || $closing < $opening)) { + $line = substr_replace($line, '', $closing, 7); + } + + // missing tag at the end of line + $opening = strpos($line, ''); + if (false !== $opening && (false === $closing || $closing > $opening)) { + $line .= ''; + } + + return trim($line); + } + + private function formatFileFromText(string $text) + { + return preg_replace_callback('/in ("|")?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', function ($match) { + return 'in '.$this->formatFile($match[2], $match[3]); + }, $text); + } + + private function formatLogMessage(string $message, array $context) + { + if ($context && false !== strpos($message, '{')) { + $replacements = []; + foreach ($context as $key => $val) { + if (is_scalar($val)) { + $replacements['{'.$key.'}'] = $val; + } + } + + if ($replacements) { + $message = strtr($message, $replacements); + } + } + + return $this->escape($message); + } + + private function addElementToGhost(): string + { + if (!isset(self::GHOST_ADDONS[date('m-d')])) { + return ''; + } + + return ''; + } + + private function include(string $name, array $context = []): string + { + extract($context, EXTR_SKIP); + ob_start(); + include __DIR__.'/../Resources/'.$name; + + return trim(ob_get_clean()); + } +} diff --git a/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php b/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php new file mode 100644 index 0000000..a1fa7d2 --- /dev/null +++ b/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\ErrorRenderer; + +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\Serializer\Exception\NotEncodableValueException; +use Symfony\Component\Serializer\SerializerInterface; + +/** + * Formats an exception using Serializer for rendering. + * + * @author Nicolas Grekas + */ +class SerializerErrorRenderer implements ErrorRendererInterface +{ + private $serializer; + private $format; + private $fallbackErrorRenderer; + private $debug; + + /** + * @param string|callable(FlattenException) $format The format as a string or a callable that should return it + * formats not supported by Request::getMimeTypes() should be given as mime types + * @param bool|callable $debug The debugging mode as a boolean or a callable that should return it + */ + public function __construct(SerializerInterface $serializer, $format, ErrorRendererInterface $fallbackErrorRenderer = null, $debug = false) + { + if (!\is_string($format) && !\is_callable($format)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be a string or a callable, "%s" given.', __METHOD__, get_debug_type($format))); + } + + if (!\is_bool($debug) && !\is_callable($debug)) { + throw new \TypeError(sprintf('Argument 4 passed to "%s()" must be a boolean or a callable, "%s" given.', __METHOD__, get_debug_type($debug))); + } + + $this->serializer = $serializer; + $this->format = $format; + $this->fallbackErrorRenderer = $fallbackErrorRenderer ?? new HtmlErrorRenderer(); + $this->debug = $debug; + } + + /** + * {@inheritdoc} + */ + public function render(\Throwable $exception): FlattenException + { + $headers = []; + $debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception); + if ($debug) { + $headers['X-Debug-Exception'] = rawurlencode($exception->getMessage()); + $headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine(); + } + + $flattenException = FlattenException::createFromThrowable($exception, null, $headers); + + try { + $format = \is_string($this->format) ? $this->format : ($this->format)($flattenException); + $headers = [ + 'Content-Type' => Request::getMimeTypes($format)[0] ?? $format, + 'Vary' => 'Accept', + ]; + + return $flattenException->setAsString($this->serializer->serialize($flattenException, $format, [ + 'exception' => $exception, + 'debug' => $debug, + ])) + ->setHeaders($flattenException->getHeaders() + $headers); + } catch (NotEncodableValueException $e) { + return $this->fallbackErrorRenderer->render($exception); + } + } + + public static function getPreferredFormat(RequestStack $requestStack): \Closure + { + return static function () use ($requestStack) { + if (!$request = $requestStack->getCurrentRequest()) { + throw new NotEncodableValueException(); + } + + return $request->getPreferredFormat(); + }; + } +} diff --git a/vendor/symfony/error-handler/Exception/FlattenException.php b/vendor/symfony/error-handler/Exception/FlattenException.php new file mode 100644 index 0000000..37d9586 --- /dev/null +++ b/vendor/symfony/error-handler/Exception/FlattenException.php @@ -0,0 +1,400 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Exception; + +use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; + +/** + * FlattenException wraps a PHP Error or Exception to be able to serialize it. + * + * Basically, this class removes all objects from the trace. + * + * @author Fabien Potencier + */ +class FlattenException +{ + private $message; + private $code; + private $previous; + private $trace; + private $traceAsString; + private $class; + private $statusCode; + private $statusText; + private $headers; + private $file; + private $line; + private $asString; + + /** + * @return static + */ + public static function create(\Exception $exception, $statusCode = null, array $headers = []): self + { + return static::createFromThrowable($exception, $statusCode, $headers); + } + + /** + * @return static + */ + public static function createFromThrowable(\Throwable $exception, int $statusCode = null, array $headers = []): self + { + $e = new static(); + $e->setMessage($exception->getMessage()); + $e->setCode($exception->getCode()); + + if ($exception instanceof HttpExceptionInterface) { + $statusCode = $exception->getStatusCode(); + $headers = array_merge($headers, $exception->getHeaders()); + } elseif ($exception instanceof RequestExceptionInterface) { + $statusCode = 400; + } + + if (null === $statusCode) { + $statusCode = 500; + } + + if (class_exists(Response::class) && isset(Response::$statusTexts[$statusCode])) { + $statusText = Response::$statusTexts[$statusCode]; + } else { + $statusText = 'Whoops, looks like something went wrong.'; + } + + $e->setStatusText($statusText); + $e->setStatusCode($statusCode); + $e->setHeaders($headers); + $e->setTraceFromThrowable($exception); + $e->setClass(get_debug_type($exception)); + $e->setFile($exception->getFile()); + $e->setLine($exception->getLine()); + + $previous = $exception->getPrevious(); + + if ($previous instanceof \Throwable) { + $e->setPrevious(static::createFromThrowable($previous)); + } + + return $e; + } + + public function toArray(): array + { + $exceptions = []; + foreach (array_merge([$this], $this->getAllPrevious()) as $exception) { + $exceptions[] = [ + 'message' => $exception->getMessage(), + 'class' => $exception->getClass(), + 'trace' => $exception->getTrace(), + ]; + } + + return $exceptions; + } + + public function getStatusCode(): int + { + return $this->statusCode; + } + + /** + * @return $this + */ + public function setStatusCode($code): self + { + $this->statusCode = $code; + + return $this; + } + + public function getHeaders(): array + { + return $this->headers; + } + + /** + * @return $this + */ + public function setHeaders(array $headers): self + { + $this->headers = $headers; + + return $this; + } + + public function getClass(): string + { + return $this->class; + } + + /** + * @return $this + */ + public function setClass($class): self + { + $this->class = false !== strpos($class, "@anonymous\0") ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : $class; + + return $this; + } + + public function getFile(): string + { + return $this->file; + } + + /** + * @return $this + */ + public function setFile($file): self + { + $this->file = $file; + + return $this; + } + + public function getLine(): int + { + return $this->line; + } + + /** + * @return $this + */ + public function setLine($line): self + { + $this->line = $line; + + return $this; + } + + public function getStatusText(): string + { + return $this->statusText; + } + + public function setStatusText(string $statusText): self + { + $this->statusText = $statusText; + + return $this; + } + + public function getMessage(): string + { + return $this->message; + } + + /** + * @return $this + */ + public function setMessage($message): self + { + if (false !== strpos($message, "@anonymous\0")) { + $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { + return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; + }, $message); + } + + $this->message = $message; + + return $this; + } + + /** + * @return int|string int most of the time (might be a string with PDOException) + */ + public function getCode() + { + return $this->code; + } + + /** + * @return $this + */ + public function setCode($code): self + { + $this->code = $code; + + return $this; + } + + public function getPrevious(): ?self + { + return $this->previous; + } + + /** + * @return $this + */ + public function setPrevious(self $previous): self + { + $this->previous = $previous; + + return $this; + } + + /** + * @return self[] + */ + public function getAllPrevious(): array + { + $exceptions = []; + $e = $this; + while ($e = $e->getPrevious()) { + $exceptions[] = $e; + } + + return $exceptions; + } + + public function getTrace(): array + { + return $this->trace; + } + + /** + * @return $this + */ + public function setTraceFromThrowable(\Throwable $throwable): self + { + $this->traceAsString = $throwable->getTraceAsString(); + + return $this->setTrace($throwable->getTrace(), $throwable->getFile(), $throwable->getLine()); + } + + /** + * @return $this + */ + public function setTrace($trace, $file, $line): self + { + $this->trace = []; + $this->trace[] = [ + 'namespace' => '', + 'short_class' => '', + 'class' => '', + 'type' => '', + 'function' => '', + 'file' => $file, + 'line' => $line, + 'args' => [], + ]; + foreach ($trace as $entry) { + $class = ''; + $namespace = ''; + if (isset($entry['class'])) { + $parts = explode('\\', $entry['class']); + $class = array_pop($parts); + $namespace = implode('\\', $parts); + } + + $this->trace[] = [ + 'namespace' => $namespace, + 'short_class' => $class, + 'class' => isset($entry['class']) ? $entry['class'] : '', + 'type' => isset($entry['type']) ? $entry['type'] : '', + 'function' => isset($entry['function']) ? $entry['function'] : null, + 'file' => isset($entry['file']) ? $entry['file'] : null, + 'line' => isset($entry['line']) ? $entry['line'] : null, + 'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : [], + ]; + } + + return $this; + } + + private function flattenArgs(array $args, int $level = 0, int &$count = 0): array + { + $result = []; + foreach ($args as $key => $value) { + if (++$count > 1e4) { + return ['array', '*SKIPPED over 10000 entries*']; + } + if ($value instanceof \__PHP_Incomplete_Class) { + // is_object() returns false on PHP<=7.1 + $result[$key] = ['incomplete-object', $this->getClassNameFromIncomplete($value)]; + } elseif (\is_object($value)) { + $result[$key] = ['object', \get_class($value)]; + } elseif (\is_array($value)) { + if ($level > 10) { + $result[$key] = ['array', '*DEEP NESTED ARRAY*']; + } else { + $result[$key] = ['array', $this->flattenArgs($value, $level + 1, $count)]; + } + } elseif (null === $value) { + $result[$key] = ['null', null]; + } elseif (\is_bool($value)) { + $result[$key] = ['boolean', $value]; + } elseif (\is_int($value)) { + $result[$key] = ['integer', $value]; + } elseif (\is_float($value)) { + $result[$key] = ['float', $value]; + } elseif (\is_resource($value)) { + $result[$key] = ['resource', get_resource_type($value)]; + } else { + $result[$key] = ['string', (string) $value]; + } + } + + return $result; + } + + private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value): string + { + $array = new \ArrayObject($value); + + return $array['__PHP_Incomplete_Class_Name']; + } + + public function getTraceAsString(): string + { + return $this->traceAsString; + } + + /** + * @return $this + */ + public function setAsString(?string $asString): self + { + $this->asString = $asString; + + return $this; + } + + public function getAsString(): string + { + if (null !== $this->asString) { + return $this->asString; + } + + $message = ''; + $next = false; + + foreach (array_reverse(array_merge([$this], $this->getAllPrevious())) as $exception) { + if ($next) { + $message .= 'Next '; + } else { + $next = true; + } + $message .= $exception->getClass(); + + if ('' != $exception->getMessage()) { + $message .= ': '.$exception->getMessage(); + } + + $message .= ' in '.$exception->getFile().':'.$exception->getLine(). + "\nStack trace:\n".$exception->getTraceAsString()."\n\n"; + } + + return rtrim($message); + } +} diff --git a/vendor/symfony/error-handler/Exception/SilencedErrorContext.php b/vendor/symfony/error-handler/Exception/SilencedErrorContext.php new file mode 100644 index 0000000..18defc7 --- /dev/null +++ b/vendor/symfony/error-handler/Exception/SilencedErrorContext.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler\Exception; + +/** + * Data Object that represents a Silenced Error. + * + * @author Grégoire Pineau + */ +class SilencedErrorContext implements \JsonSerializable +{ + public $count = 1; + + private $severity; + private $file; + private $line; + private $trace; + + public function __construct(int $severity, string $file, int $line, array $trace = [], int $count = 1) + { + $this->severity = $severity; + $this->file = $file; + $this->line = $line; + $this->trace = $trace; + $this->count = $count; + } + + public function getSeverity(): int + { + return $this->severity; + } + + public function getFile(): string + { + return $this->file; + } + + public function getLine(): int + { + return $this->line; + } + + public function getTrace(): array + { + return $this->trace; + } + + public function jsonSerialize(): array + { + return [ + 'severity' => $this->severity, + 'file' => $this->file, + 'line' => $this->line, + 'trace' => $this->trace, + 'count' => $this->count, + ]; + } +} diff --git a/vendor/symfony/error-handler/LICENSE b/vendor/symfony/error-handler/LICENSE new file mode 100644 index 0000000..4bf0fef --- /dev/null +++ b/vendor/symfony/error-handler/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2019-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/error-handler/README.md b/vendor/symfony/error-handler/README.md new file mode 100644 index 0000000..d14ccfd --- /dev/null +++ b/vendor/symfony/error-handler/README.md @@ -0,0 +1,41 @@ +ErrorHandler Component +====================== + +The ErrorHandler component provides tools to manage errors and ease debugging PHP code. + +Getting Started +--------------- + +``` +$ composer require symfony/error-handler +``` + +```php +use Symfony\Component\ErrorHandler\Debug; +use Symfony\Component\ErrorHandler\ErrorHandler; +use Symfony\Component\ErrorHandler\DebugClassLoader; + +Debug::enable(); + +// or enable only one feature +//ErrorHandler::register(); +//DebugClassLoader::enable(); + +$data = ErrorHandler::call(static function () use ($filename, $datetimeFormat) { + // if any code executed inside this anonymous function fails, a PHP exception + // will be thrown, even if the code uses the '@' PHP silence operator + $data = json_decode(file_get_contents($filename), true); + $data['read_at'] = date($datetimeFormat); + file_put_contents($filename, json_encode($data)); + + return $data; +}); +``` + +Resources +--------- + + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/error-handler/Resources/assets/css/error.css b/vendor/symfony/error-handler/Resources/assets/css/error.css new file mode 100644 index 0000000..332d818 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/css/error.css @@ -0,0 +1,4 @@ +body { background-color: #fff; color: #222; font: 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; } +.container { margin: 30px; max-width: 600px; } +h1 { color: #dc3545; font-size: 24px; } +h2 { font-size: 18px; } diff --git a/vendor/symfony/error-handler/Resources/assets/css/exception.css b/vendor/symfony/error-handler/Resources/assets/css/exception.css new file mode 100644 index 0000000..e873c73 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/css/exception.css @@ -0,0 +1,250 @@ +/* This file is based on WebProfilerBundle/Resources/views/Profiler/profiler.css.twig. + If you make any change in this file, verify the same change is needed in the other file. */ +:root { + --font-sans-serif: Helvetica, Arial, sans-serif; + --page-background: #f9f9f9; + --color-text: #222; + /* when updating any of these colors, do the same in toolbar.css.twig */ + --color-success: #4f805d; + --color-warning: #a46a1f; + --color-error: #b0413e; + --color-muted: #999; + --tab-background: #fff; + --tab-color: #444; + --tab-active-background: #666; + --tab-active-color: #fafafa; + --tab-disabled-background: #f5f5f5; + --tab-disabled-color: #999; + --metric-value-background: #fff; + --metric-value-color: inherit; + --metric-unit-color: #999; + --metric-label-background: #e0e0e0; + --metric-label-color: inherit; + --table-border: #e0e0e0; + --table-background: #fff; + --table-header: #e0e0e0; + --trace-selected-background: #F7E5A1; + --tree-active-background: #F7E5A1; + --exception-title-color: var(--base-2); + --shadow: 0px 0px 1px rgba(128, 128, 128, .2); + --border: 1px solid #e0e0e0; + --background-error: var(--color-error); + --highlight-comment: #969896; + --highlight-default: #222222; + --highlight-keyword: #a71d5d; + --highlight-string: #183691; + --base-0: #fff; + --base-1: #f5f5f5; + --base-2: #e0e0e0; + --base-3: #ccc; + --base-4: #666; + --base-5: #444; + --base-6: #222; +} + +.theme-dark { + --page-background: #36393e; + --color-text: #e0e0e0; + --color-muted: #777; + --color-error: #d43934; + --tab-background: #555; + --tab-color: #ccc; + --tab-active-background: #888; + --tab-active-color: #fafafa; + --tab-disabled-background: var(--page-background); + --tab-disabled-color: #777; + --metric-value-background: #555; + --metric-value-color: inherit; + --metric-unit-color: #999; + --metric-label-background: #777; + --metric-label-color: #e0e0e0; + --trace-selected-background: #71663acc; + --table-border: #444; + --table-background: #333; + --table-header: #555; + --info-background: rgba(79, 148, 195, 0.5); + --tree-active-background: var(--metric-label-background); + --exception-title-color: var(--base-2); + --shadow: 0px 0px 1px rgba(32, 32, 32, .2); + --border: 1px solid #666; + --background-error: #b0413e; + --highlight-comment: #dedede; + --highlight-default: var(--base-6); + --highlight-keyword: #ff413c; + --highlight-string: #70a6fd; + --base-0: #2e3136; + --base-1: #444; + --base-2: #666; + --base-3: #666; + --base-4: #666; + --base-5: #e0e0e0; + --base-6: #f5f5f5; + --card-label-background: var(--tab-active-background); + --card-label-color: var(--tab-active-color); +} + +html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0} + +html { + /* always display the vertical scrollbar to avoid jumps when toggling contents */ + overflow-y: scroll; +} +body { background-color: var(--page-background); color: var(--base-6); font: 14px/1.4 Helvetica, Arial, sans-serif; padding-bottom: 45px; } + +a { cursor: pointer; text-decoration: none; } +a:hover { text-decoration: underline; } +abbr[title] { border-bottom: none; cursor: help; text-decoration: none; } + +code, pre { font: 13px/1.5 Consolas, Monaco, Menlo, "Ubuntu Mono", "Liberation Mono", monospace; } + +table, tr, th, td { background: var(--base-0); border-collapse: collapse; vertical-align: top; } +table { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 1em 0; width: 100%; } +table th, table td { border: solid var(--base-2); border-width: 1px 0; padding: 8px 10px; } +table th { background-color: var(--base-2); font-weight: bold; text-align: left; } + +.m-t-5 { margin-top: 5px; } +.hidden-xs-down { display: none; } +.block { display: block; } +.full-width { width: 100%; } +.hidden { display: none; } +.prewrap { white-space: pre-wrap; } +.nowrap { white-space: nowrap; } +.newline { display: block; } +.break-long-words { word-wrap: break-word; overflow-wrap: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; min-width: 0; } +.text-small { font-size: 12px !important; } +.text-muted { color: #999; } +.text-bold { font-weight: bold; } +.empty { border: 4px dashed var(--base-2); color: #999; margin: 1em 0; padding: .5em 2em; } + +.status-success { background: rgba(94, 151, 110, 0.3); } +.status-warning { background: rgba(240, 181, 24, 0.3); } +.status-error { background: rgba(176, 65, 62, 0.2); } +.status-success td, .status-warning td, .status-error td { background: transparent; } +tr.status-error td, tr.status-warning td { border-bottom: 1px solid var(--base-2); border-top: 1px solid var(--base-2); } +.status-warning .colored { color: #A46A1F; } +.status-error .colored { color: var(--color-error); } + +.sf-toggle { cursor: pointer; } +.sf-toggle-content { -moz-transition: display .25s ease; -webkit-transition: display .25s ease; transition: display .25s ease; } +.sf-toggle-content.sf-toggle-hidden { display: none; } +.sf-toggle-content.sf-toggle-visible { display: block; } +thead.sf-toggle-content.sf-toggle-visible, tbody.sf-toggle-content.sf-toggle-visible { display: table-row-group; } +.sf-toggle-off .icon-close, .sf-toggle-on .icon-open { display: none; } +.sf-toggle-off .icon-open, .sf-toggle-on .icon-close { display: block; } + +.tab-navigation { margin: 0 0 1em 0; padding: 0; } +.tab-navigation li { background: var(--tab-background); border: 1px solid var(--table-border); color: var(--tab-color); cursor: pointer; display: inline-block; font-size: 16px; margin: 0 0 0 -1px; padding: .5em .75em; z-index: 1; } +.tab-navigation li .badge { background-color: var(--base-1); color: var(--base-4); display: inline-block; font-size: 14px; font-weight: bold; margin-left: 8px; min-width: 10px; padding: 1px 6px; text-align: center; white-space: nowrap; } +.tab-navigation li.disabled { background: var(--tab-disabled-background); color: var(--tab-disabled-color); } +.tab-navigation li.active { background: var(--tab-active-background); color: var(--tab-active-color); z-index: 1100; } +.tab-navigation li.active .badge { background-color: var(--base-5); color: var(--base-2); } +.tab-content > *:first-child { margin-top: 0; } +.tab-navigation li .badge.status-warning { background: var(--color-warning); color: #FFF; } +.tab-navigation li .badge.status-error { background: var(--background-error); color: #FFF; } +.sf-tabs .tab:not(:first-child) { display: none; } + +[data-filters] { position: relative; } +[data-filtered] { cursor: pointer; } +[data-filtered]:after { content: '\00a0\25BE'; } +[data-filtered]:hover .filter-list li { display: inline-flex; } +[class*="filter-hidden-"] { display: none; } +.filter-list { position: absolute; border: var(--border); box-shadow: var(--shadow); margin: 0; padding: 0; display: flex; flex-direction: column; } +.filter-list :after { content: ''; } +.filter-list li { + background: var(--tab-disabled-background); + border-bottom: var(--border); + color: var(--tab-disabled-color); + display: none; + list-style: none; + margin: 0; + padding: 5px 10px; + text-align: left; + font-weight: normal; +} +.filter-list li.active { + background: var(--tab-background); + color: var(--tab-color); +} +.filter-list li.last-active { + background: var(--tab-active-background); + color: var(--tab-active-color); +} + +.filter-list-level li { cursor: s-resize; } +.filter-list-level li.active { cursor: n-resize; } +.filter-list-level li.last-active { cursor: default; } +.filter-list-level li.last-active:before { content: '\2714\00a0'; } +.filter-list-choice li:before { content: '\2714\00a0'; color: transparent; } +.filter-list-choice li.active:before { color: unset; } + +.container { max-width: 1024px; margin: 0 auto; padding: 0 15px; } +.container::after { content: ""; display: table; clear: both; } + +header { background-color: #222; color: rgba(255, 255, 255, 0.75); font-size: 13px; height: 33px; line-height: 33px; padding: 0; } +header .container { display: flex; justify-content: space-between; } +.logo { flex: 1; font-size: 13px; font-weight: normal; margin: 0; padding: 0; } +.logo svg { height: 18px; width: 18px; opacity: .8; vertical-align: -5px; } + +.help-link { margin-left: 15px; } +.help-link a { color: inherit; } +.help-link .icon svg { height: 15px; width: 15px; opacity: .7; vertical-align: -2px; } +.help-link a:hover { color: #EEE; text-decoration: none; } +.help-link a:hover svg { opacity: .9; } + +.exception-summary { background: var(--background-error); border-bottom: 2px solid rgba(0, 0, 0, 0.1); border-top: 1px solid rgba(0, 0, 0, .3); flex: 0 0 auto; margin-bottom: 15px; } +.exception-metadata { background: rgba(0, 0, 0, 0.1); padding: 7px 0; } +.exception-metadata .container { display: flex; flex-direction: row; justify-content: space-between; } +.exception-metadata h2, .exception-metadata h2 > a { color: rgba(255, 255, 255, 0.8); font-size: 13px; font-weight: 400; margin: 0; } +.exception-http small { font-size: 13px; opacity: .7; } +.exception-hierarchy { flex: 1; } +.exception-hierarchy .icon { margin: 0 3px; opacity: .7; } +.exception-hierarchy .icon svg { height: 13px; width: 13px; vertical-align: -2px; } + +.exception-without-message .exception-message-wrapper { display: none; } +.exception-message-wrapper .container { display: flex; align-items: flex-start; min-height: 70px; padding: 10px 15px 8px; } +.exception-message { flex-grow: 1; } +.exception-message, .exception-message a { color: #FFF; font-size: 21px; font-weight: 400; margin: 0; } +.exception-message.long { font-size: 18px; } +.exception-message a { border-bottom: 1px solid rgba(255, 255, 255, 0.5); font-size: inherit; text-decoration: none; } +.exception-message a:hover { border-bottom-color: #ffffff; } + +.exception-illustration { flex-basis: 111px; flex-shrink: 0; height: 66px; margin-left: 15px; opacity: .7; } + +.trace + .trace { margin-top: 30px; } +.trace-head { background-color: var(--base-2); padding: 10px; position: relative; } +.trace-head .trace-class { color: var(--base-6); font-size: 18px; font-weight: bold; line-height: 1.3; margin: 0; position: relative; } +.trace-head .trace-namespace { color: #999; display: block; font-size: 13px; } +.trace-head .icon { position: absolute; right: 0; top: 0; } +.trace-head .icon svg { fill: var(--base-5); height: 24px; width: 24px; } + +.trace-details { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 1em 0; table-layout: fixed; } + +.trace-message { font-size: 14px; font-weight: normal; margin: .5em 0 0; } + +.trace-line { position: relative; padding-top: 8px; padding-bottom: 8px; } +.trace-line + .trace-line { border-top: var(--border); } +.trace-line:hover { background: var(--base-1); } +.trace-line a { color: var(--base-6); } +.trace-line .icon { opacity: .4; position: absolute; left: 10px; top: 11px; } +.trace-line .icon svg { fill: var(--base-5); height: 16px; width: 16px; } +.trace-line-header { padding-left: 36px; padding-right: 10px; } + +.trace-file-path, .trace-file-path a { color: var(--base-6); font-size: 13px; } +.trace-class { color: var(--color-error); } +.trace-type { padding: 0 2px; } +.trace-method { color: var(--color-error); font-weight: bold; } +.trace-arguments { color: #777; font-weight: normal; padding-left: 2px; } + +.trace-code { background: var(--base-0); font-size: 12px; margin: 10px 10px 2px 10px; padding: 10px; overflow-x: auto; white-space: nowrap; } +.trace-code ol { margin: 0; float: left; } +.trace-code li { color: #969896; margin: 0; padding-left: 10px; float: left; width: 100%; } +.trace-code li + li { margin-top: 5px; } +.trace-code li.selected { background: var(--trace-selected-background); margin-top: 2px; } +.trace-code li code { color: var(--base-6); white-space: nowrap; } + +.trace-as-text .stacktrace { line-height: 1.8; margin: 0 0 15px; white-space: pre-wrap; } + +@media (min-width: 575px) { + .hidden-xs-down { display: initial; } + .help-link { margin-left: 30px; } +} diff --git a/vendor/symfony/error-handler/Resources/assets/css/exception_full.css b/vendor/symfony/error-handler/Resources/assets/css/exception_full.css new file mode 100644 index 0000000..fa77cb3 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/css/exception_full.css @@ -0,0 +1,128 @@ +.sf-reset .traces { + padding-bottom: 14px; +} +.sf-reset .traces li { + font-size: 12px; + color: #868686; + padding: 5px 4px; + list-style-type: decimal; + margin-left: 20px; +} +.sf-reset #logs .traces li.error { + font-style: normal; + color: #AA3333; + background: #f9ecec; +} +.sf-reset #logs .traces li.warning { + font-style: normal; + background: #ffcc00; +} +/* fix for Opera not liking empty
  • */ +.sf-reset .traces li:after { + content: "\00A0"; +} +.sf-reset .trace { + border: 1px solid #D3D3D3; + padding: 10px; + overflow: auto; + margin: 10px 0 20px; +} +.sf-reset .block-exception { + -moz-border-radius: 16px; + -webkit-border-radius: 16px; + border-radius: 16px; + margin-bottom: 20px; + background-color: #f6f6f6; + border: 1px solid #dfdfdf; + padding: 30px 28px; + word-wrap: break-word; + overflow: hidden; +} +.sf-reset .block-exception div { + color: #313131; + font-size: 10px; +} +.sf-reset .block-exception-detected .illustration-exception, +.sf-reset .block-exception-detected .text-exception { + float: left; +} +.sf-reset .block-exception-detected .illustration-exception { + width: 152px; +} +.sf-reset .block-exception-detected .text-exception { + width: 670px; + padding: 30px 44px 24px 46px; + position: relative; +} +.sf-reset .text-exception .open-quote, +.sf-reset .text-exception .close-quote { + font-family: Arial, Helvetica, sans-serif; + position: absolute; + color: #C9C9C9; + font-size: 8em; +} +.sf-reset .open-quote { + top: 0; + left: 0; +} +.sf-reset .close-quote { + bottom: -0.5em; + right: 50px; +} +.sf-reset .block-exception p { + font-family: Arial, Helvetica, sans-serif; +} +.sf-reset .block-exception p a, +.sf-reset .block-exception p a:hover { + color: #565656; +} +.sf-reset .logs h2 { + float: left; + width: 654px; +} +.sf-reset .error-count, .sf-reset .support { + float: right; + width: 170px; + text-align: right; +} +.sf-reset .error-count span { + display: inline-block; + background-color: #aacd4e; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; + padding: 4px; + color: white; + margin-right: 2px; + font-size: 11px; + font-weight: bold; +} + +.sf-reset .support a { + display: inline-block; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; + padding: 4px; + color: #000000; + margin-right: 2px; + font-size: 11px; + font-weight: bold; +} + +.sf-reset .toggle { + vertical-align: middle; +} +.sf-reset .linked ul, +.sf-reset .linked li { + display: inline; +} +.sf-reset #output-content { + color: #000; + font-size: 12px; +} +.sf-reset #traces-text pre { + white-space: pre; + font-size: 12px; + font-family: monospace; +} diff --git a/vendor/symfony/error-handler/Resources/assets/images/chevron-right.svg b/vendor/symfony/error-handler/Resources/assets/images/chevron-right.svg new file mode 100644 index 0000000..6837aff --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/chevron-right.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/favicon.png.base64 b/vendor/symfony/error-handler/Resources/assets/images/favicon.png.base64 new file mode 100644 index 0000000..fb076ed --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/favicon.png.base64 @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAADVUlEQVRIx82XX0jTURTHLYPyqZdefQx66CEo80+aYpoIkqzUikz6Z5klQoWUWYRIJYEUGpQ+lIr9U5dOTLdCtkmWZis3rbnC5fw/neYW002307mX/cZvP3/7o1PwwOdh95x7vnf39zvnd29AgBer2xO6DclAXiMqZAqxIiNIN/IYSUS2BPhjmGATchUxI+ADWiRhpWK7HKuHFVBFdmU5YvnI4grFGCaReF/EBH4KsZlGgj2JBTuCYBWRIYF8YoEOJ6wBt/gEs7mBbyOjQXruPLSdOgPCiEiPSUUHDoL8Ug5IUo9B/d5wrt+G7OAKNrODPuVdB6vRCIzN6SdBlpW9RIgk/1FeAXabzRlrUPVCS/JhbmwudztnGeeH9AyXBIwtmM3wLinZJZHifjHw2V+NBoRh+9ixQrbgbnaSIcl7cGea6hoXQbNe7za241oeO5Z0p42M4BV2EqP2D50wo+6HzvwC6C4sApNOR8cmOrtcnhtj2kYRyC9eBvXzKrBZrXSs72kFd1t3MoKVbMekQkEnSNKOO8fac3LpmK6l1TlGtsxmsdKFsecPYgwxst0cwROMYDXboSotg0WLBRqjY51jLYcENElXwW2XJKPydvoI2GN9T8rBtrAArYIUruBJXkFheCQYlCpQP6uk5dAQFQNaUROMSGVQFxLmkoQsxDJrhLbTZ+nvVsERME9MgPJRKV/58AsyomTSzE813WLFvWK++qI0xSfQl8k8Pg46sYRuv5t6dS+4RqxDwaa4BGjYH+NTQvKScIp9+YL/hoZh3jDtLRHtt2C3g6bmhX+CpsFBWg7ilDSPgj0lD2ncr5ev/BP8VvyAJhqVyZeUhPOrEhEFxgEtjft846Z/guQTNT89Q5P9flMLoth4F7808wKtWWKzAwNQHxrh/1vaid2F+XpYTSbQf1XA2McOmOpROnvpvMEA4tSjq1cW0sws2gCYxswY6TKkvzYnJq1NHZLnRU4BX+4U0uburvusu8Kv8iHY7qefkM4IFngJHEOUXmLEPgiGsI8YnlZILit3vSSLRTQe/MPIZva5pshNIEmyFQlCvruJKXPkCEfmePzkphXHdzZNQdoRI9KPlBAxlj/I8U97ERPS5bjGbWDFbEdqHVe5caTBeZZx2H/IMvzeN15yoQAAAABJRU5ErkJggg== diff --git a/vendor/symfony/error-handler/Resources/assets/images/icon-book.svg b/vendor/symfony/error-handler/Resources/assets/images/icon-book.svg new file mode 100644 index 0000000..498a74f --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/icon-book.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg b/vendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg new file mode 100644 index 0000000..be534ad --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svg b/vendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svg new file mode 100644 index 0000000..471c274 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg b/vendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg new file mode 100644 index 0000000..b2593a9 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svg b/vendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svg new file mode 100644 index 0000000..2f5c3b3 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/icon-support.svg b/vendor/symfony/error-handler/Resources/assets/images/icon-support.svg new file mode 100644 index 0000000..03fd8e7 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/icon-support.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php b/vendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php new file mode 100644 index 0000000..4b2f9c1 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php @@ -0,0 +1 @@ +addElementToGhost(); ?> diff --git a/vendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg b/vendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg new file mode 100644 index 0000000..f10824a --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg @@ -0,0 +1 @@ + diff --git a/vendor/symfony/error-handler/Resources/assets/js/exception.js b/vendor/symfony/error-handler/Resources/assets/js/exception.js new file mode 100644 index 0000000..8cc7b53 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/assets/js/exception.js @@ -0,0 +1,279 @@ +/* This file is based on WebProfilerBundle/Resources/views/Profiler/base_js.html.twig. + If you make any change in this file, verify the same change is needed in the other file. */ +/* .tab'); + var tabNavigation = document.createElement('ul'); + tabNavigation.className = 'tab-navigation'; + + var selectedTabId = 'tab-' + i + '-0'; /* select the first tab by default */ + for (var j = 0; j < tabs.length; j++) { + var tabId = 'tab-' + i + '-' + j; + var tabTitle = tabs[j].querySelector('.tab-title').innerHTML; + + var tabNavigationItem = document.createElement('li'); + tabNavigationItem.setAttribute('data-tab-id', tabId); + if (hasClass(tabs[j], 'active')) { selectedTabId = tabId; } + if (hasClass(tabs[j], 'disabled')) { addClass(tabNavigationItem, 'disabled'); } + tabNavigationItem.innerHTML = tabTitle; + tabNavigation.appendChild(tabNavigationItem); + + var tabContent = tabs[j].querySelector('.tab-content'); + tabContent.parentElement.setAttribute('id', tabId); + } + + tabGroups[i].insertBefore(tabNavigation, tabGroups[i].firstChild); + addClass(document.querySelector('[data-tab-id="' + selectedTabId + '"]'), 'active'); + } + + /* display the active tab and add the 'click' event listeners */ + for (i = 0; i < tabGroups.length; i++) { + tabNavigation = tabGroups[i].querySelectorAll(':scope >.tab-navigation li'); + + for (j = 0; j < tabNavigation.length; j++) { + tabId = tabNavigation[j].getAttribute('data-tab-id'); + document.getElementById(tabId).querySelector('.tab-title').className = 'hidden'; + + if (hasClass(tabNavigation[j], 'active')) { + document.getElementById(tabId).className = 'block'; + } else { + document.getElementById(tabId).className = 'hidden'; + } + + tabNavigation[j].addEventListener('click', function(e) { + var activeTab = e.target || e.srcElement; + + /* needed because when the tab contains HTML contents, user can click */ + /* on any of those elements instead of their parent '
  • ' element */ + while (activeTab.tagName.toLowerCase() !== 'li') { + activeTab = activeTab.parentNode; + } + + /* get the full list of tabs through the parent of the active tab element */ + var tabNavigation = activeTab.parentNode.children; + for (var k = 0; k < tabNavigation.length; k++) { + var tabId = tabNavigation[k].getAttribute('data-tab-id'); + document.getElementById(tabId).className = 'hidden'; + removeClass(tabNavigation[k], 'active'); + } + + addClass(activeTab, 'active'); + var activeTabId = activeTab.getAttribute('data-tab-id'); + document.getElementById(activeTabId).className = 'block'; + }); + } + + tabGroups[i].setAttribute('data-processed', 'true'); + } + }, + + createToggles: function() { + var toggles = document.querySelectorAll('.sf-toggle:not([data-processed=true])'); + + for (var i = 0; i < toggles.length; i++) { + var elementSelector = toggles[i].getAttribute('data-toggle-selector'); + var element = document.querySelector(elementSelector); + + addClass(element, 'sf-toggle-content'); + + if (toggles[i].hasAttribute('data-toggle-initial') && toggles[i].getAttribute('data-toggle-initial') == 'display') { + addClass(toggles[i], 'sf-toggle-on'); + addClass(element, 'sf-toggle-visible'); + } else { + addClass(toggles[i], 'sf-toggle-off'); + addClass(element, 'sf-toggle-hidden'); + } + + addEventListener(toggles[i], 'click', function(e) { + e.preventDefault(); + + if ('' !== window.getSelection().toString()) { + /* Don't do anything on text selection */ + return; + } + + var toggle = e.target || e.srcElement; + + /* needed because when the toggle contains HTML contents, user can click */ + /* on any of those elements instead of their parent '.sf-toggle' element */ + while (!hasClass(toggle, 'sf-toggle')) { + toggle = toggle.parentNode; + } + + var element = document.querySelector(toggle.getAttribute('data-toggle-selector')); + + toggleClass(toggle, 'sf-toggle-on'); + toggleClass(toggle, 'sf-toggle-off'); + toggleClass(element, 'sf-toggle-hidden'); + toggleClass(element, 'sf-toggle-visible'); + + /* the toggle doesn't change its contents when clicking on it */ + if (!toggle.hasAttribute('data-toggle-alt-content')) { + return; + } + + if (!toggle.hasAttribute('data-toggle-original-content')) { + toggle.setAttribute('data-toggle-original-content', toggle.innerHTML); + } + + var currentContent = toggle.innerHTML; + var originalContent = toggle.getAttribute('data-toggle-original-content'); + var altContent = toggle.getAttribute('data-toggle-alt-content'); + toggle.innerHTML = currentContent !== altContent ? altContent : originalContent; + }); + + /* Prevents from disallowing clicks on links inside toggles */ + var toggleLinks = toggles[i].querySelectorAll('a'); + for (var j = 0; j < toggleLinks.length; j++) { + addEventListener(toggleLinks[j], 'click', function(e) { + e.stopPropagation(); + }); + } + + toggles[i].setAttribute('data-processed', 'true'); + } + }, + + createFilters: function() { + document.querySelectorAll('[data-filters] [data-filter]').forEach(function (filter) { + var filters = filter.closest('[data-filters]'), + type = 'choice', + name = filter.dataset.filter, + ucName = name.charAt(0).toUpperCase()+name.slice(1), + list = document.createElement('ul'), + values = filters.dataset['filter'+ucName] || filters.querySelectorAll('[data-filter-'+name+']'), + labels = {}, + defaults = null, + indexed = {}, + processed = {}; + if (typeof values === 'string') { + type = 'level'; + labels = values.split(','); + values = values.toLowerCase().split(','); + defaults = values.length - 1; + } + addClass(list, 'filter-list'); + addClass(list, 'filter-list-'+type); + values.forEach(function (value, i) { + if (value instanceof HTMLElement) { + value = value.dataset['filter'+ucName]; + } + if (value in processed) { + return; + } + var option = document.createElement('li'), + label = i in labels ? labels[i] : value, + active = false, + matches; + if ('' === label) { + option.innerHTML = '(none)'; + } else { + option.innerText = label; + } + option.dataset.filter = value; + option.setAttribute('title', 1 === (matches = filters.querySelectorAll('[data-filter-'+name+'="'+value+'"]').length) ? 'Matches 1 row' : 'Matches '+matches+' rows'); + indexed[value] = i; + list.appendChild(option); + addEventListener(option, 'click', function () { + if ('choice' === type) { + filters.querySelectorAll('[data-filter-'+name+']').forEach(function (row) { + if (option.dataset.filter === row.dataset['filter'+ucName]) { + toggleClass(row, 'filter-hidden-'+name); + } + }); + toggleClass(option, 'active'); + } else if ('level' === type) { + if (i === this.parentNode.querySelectorAll('.active').length - 1) { + return; + } + this.parentNode.querySelectorAll('li').forEach(function (currentOption, j) { + if (j <= i) { + addClass(currentOption, 'active'); + if (i === j) { + addClass(currentOption, 'last-active'); + } else { + removeClass(currentOption, 'last-active'); + } + } else { + removeClass(currentOption, 'active'); + removeClass(currentOption, 'last-active'); + } + }); + filters.querySelectorAll('[data-filter-'+name+']').forEach(function (row) { + if (i < indexed[row.dataset['filter'+ucName]]) { + addClass(row, 'filter-hidden-'+name); + } else { + removeClass(row, 'filter-hidden-'+name); + } + }); + } + }); + if ('choice' === type) { + active = null === defaults || 0 <= defaults.indexOf(value); + } else if ('level' === type) { + active = i <= defaults; + if (active && i === defaults) { + addClass(option, 'last-active'); + } + } + if (active) { + addClass(option, 'active'); + } else { + filters.querySelectorAll('[data-filter-'+name+'="'+value+'"]').forEach(function (row) { + toggleClass(row, 'filter-hidden-'+name); + }); + } + processed[value] = true; + }); + + if (1 < list.childNodes.length) { + filter.appendChild(list); + filter.dataset.filtered = ''; + } + }); + } + }; +})(); + +Sfjs.addEventListener(document, 'DOMContentLoaded', function() { + Sfjs.createTabs(); + Sfjs.createToggles(); + Sfjs.createFilters(); +}); + +/*]]>*/ diff --git a/vendor/symfony/error-handler/Resources/views/error.html.php b/vendor/symfony/error-handler/Resources/views/error.html.php new file mode 100644 index 0000000..5416d03 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/error.html.php @@ -0,0 +1,20 @@ + + + + + + An Error Occurred: <?= $statusText; ?> + + + +
    +

    Oops! An Error Occurred

    +

    The server returned a " ".

    + +

    + Something is broken. Please let us know what you were doing when this error occurred. + We will fix it as soon as possible. Sorry for any inconvenience caused. +

    +
    + + diff --git a/vendor/symfony/error-handler/Resources/views/exception.html.php b/vendor/symfony/error-handler/Resources/views/exception.html.php new file mode 100644 index 0000000..c3e7a86 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/exception.html.php @@ -0,0 +1,116 @@ +
    + + +
    +
    +

    formatFileFromText(nl2br($exceptionMessage)); ?>

    + +
    + include('assets/images/symfony-ghost.svg.php'); ?> +
    +
    +
    +
    + +
    +
    +
    + toArray(); + $exceptionWithUserCode = []; + $exceptionAsArrayCount = count($exceptionAsArray); + $last = $exceptionAsArrayCount - 1; + foreach ($exceptionAsArray as $i => $e) { + foreach ($e['trace'] as $trace) { + if ($trace['file'] && false === mb_strpos($trace['file'], '/vendor/') && false === mb_strpos($trace['file'], '/var/cache/') && $i < $last) { + $exceptionWithUserCode[] = $i; + } + } + } + ?> +

    + 1) { ?> + Exceptions + + Exception + +

    + +
    + $e) { + echo $this->include('views/traces.html.php', [ + 'exception' => $e, + 'index' => $i + 1, + 'expand' => in_array($i, $exceptionWithUserCode, true) || ([] === $exceptionWithUserCode && 0 === $i), + ]); + } + ?> +
    +
    + + +
    +

    + Logs + countErrors()) { ?>countErrors(); ?> +

    + +
    + getLogs()) { ?> + include('views/logs.html.php', ['logs' => $logger->getLogs()]); ?> + +
    +

    No log messages

    +
    + +
    +
    + + +
    +

    + 1) { ?> + Stack Traces + + Stack Trace + +

    + +
    + $e) { + echo $this->include('views/traces_text.html.php', [ + 'exception' => $e, + 'index' => $i + 1, + 'numExceptions' => $exceptionAsArrayCount, + ]); + } + ?> +
    +
    + + +
    +

    Output content

    + +
    + +
    +
    + +
    +
    diff --git a/vendor/symfony/error-handler/Resources/views/exception_full.html.php b/vendor/symfony/error-handler/Resources/views/exception_full.html.php new file mode 100644 index 0000000..80b813e --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/exception_full.html.php @@ -0,0 +1,49 @@ + + + + + + + + <?= $_message; ?> + + + + + + + + +
    + +
    + + + include('views/exception.html.php', $context); ?> + + + + + diff --git a/vendor/symfony/error-handler/Resources/views/logs.html.php b/vendor/symfony/error-handler/Resources/views/logs.html.php new file mode 100644 index 0000000..c866e06 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/logs.html.php @@ -0,0 +1,45 @@ + + + + + + + + + + + + = 400) { + $status = 'error'; + } elseif ($log['priority'] >= 300) { + $status = 'warning'; + } else { + $severity = 0; + if (($exception = $log['context']['exception'] ?? null) instanceof \ErrorException) { + $severity = $exception->getSeverity(); + } + $status = E_DEPRECATED === $severity || E_USER_DEPRECATED === $severity ? 'warning' : 'normal'; + } ?> + data-filter-channel="escape($log['channel']); ?>"> + + + + + + + + +
    LevelChannelMessage
    + escape($log['priorityName']); ?> + + + escape($log['channel']); ?> + + formatLogMessage($log['message'], $log['context']); ?> + +
    + +
    diff --git a/vendor/symfony/error-handler/Resources/views/trace.html.php b/vendor/symfony/error-handler/Resources/views/trace.html.php new file mode 100644 index 0000000..153f7d6 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/trace.html.php @@ -0,0 +1,40 @@ +
    + + include('assets/images/icon-minus-square.svg'); ?> + include('assets/images/icon-plus-square.svg'); ?> + + + + abbrClass($trace['class']); ?>(formatArgs($trace['args']); ?>) + + + + getFileLink($trace['file'], $lineNumber); + $filePath = strtr(strip_tags($this->formatFile($trace['file'], $lineNumber)), [' at line '.$lineNumber => '']); + $filePathParts = explode(DIRECTORY_SEPARATOR, $filePath); + ?> + + in + + + + + + + + (line ) + + +
    + +
    + fileExcerpt($trace['file'], $trace['line'], 5), [ + '#DD0000' => 'var(--highlight-string)', + '#007700' => 'var(--highlight-keyword)', + '#0000BB' => 'var(--highlight-default)', + '#FF8000' => 'var(--highlight-comment)', + ]); ?> +
    + diff --git a/vendor/symfony/error-handler/Resources/views/traces.html.php b/vendor/symfony/error-handler/Resources/views/traces.html.php new file mode 100644 index 0000000..d587b05 --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/traces.html.php @@ -0,0 +1,42 @@ +
    +
    +
    + +

    + include('assets/images/icon-minus-square-o.svg'); ?> + include('assets/images/icon-plus-square-o.svg'); ?> + + + 1 ? '\\' : ''; ?> + + +

    + + 1) { ?> +

    escape($exception['message']); ?>

    + +
    +
    + +
    + $trace) { + $isVendorTrace = $trace['file'] && (false !== mb_strpos($trace['file'], '/vendor/') || false !== mb_strpos($trace['file'], '/var/cache/')); + $displayCodeSnippet = $isFirstUserCode && !$isVendorTrace; + if ($displayCodeSnippet) { + $isFirstUserCode = false; + } ?> +
    + include('views/trace.html.php', [ + 'prefix' => $index, + 'i' => $i, + 'trace' => $trace, + 'style' => $isVendorTrace ? 'compact' : ($displayCodeSnippet ? 'expanded' : ''), + ]); ?> +
    + +
    +
    +
    diff --git a/vendor/symfony/error-handler/Resources/views/traces_text.html.php b/vendor/symfony/error-handler/Resources/views/traces_text.html.php new file mode 100644 index 0000000..a7090fb --- /dev/null +++ b/vendor/symfony/error-handler/Resources/views/traces_text.html.php @@ -0,0 +1,43 @@ + + + + + + + + + + + + +
    +

    + 1) { ?> + [/] + + + include('assets/images/icon-minus-square-o.svg'); ?> + include('assets/images/icon-plus-square-o.svg'); ?> +

    +
    + +
    +escape($exception['class']).":\n";
    +                    if ($exception['message']) {
    +                        echo $this->escape($exception['message'])."\n";
    +                    }
    +
    +                    foreach ($exception['trace'] as $trace) {
    +                        echo "\n  ";
    +                        if ($trace['function']) {
    +                            echo $this->escape('at '.$trace['class'].$trace['type'].$trace['function']).'('.(isset($trace['args']) ? $this->formatArgsAsText($trace['args']) : '').')';
    +                        }
    +                        if ($trace['file'] && $trace['line']) {
    +                            echo($trace['function'] ? "\n     (" : 'at ').strtr(strip_tags($this->formatFile($trace['file'], $trace['line'])), [' at line '.$trace['line'] => '']).':'.$trace['line'].($trace['function'] ? ')' : '');
    +                        }
    +                    }
    +?>
    +                
    + +
    diff --git a/vendor/symfony/error-handler/ThrowableUtils.php b/vendor/symfony/error-handler/ThrowableUtils.php new file mode 100644 index 0000000..5cbe87f --- /dev/null +++ b/vendor/symfony/error-handler/ThrowableUtils.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ErrorHandler; + +/** + * @internal + */ +class ThrowableUtils +{ + public static function getSeverity(\Throwable $throwable): int + { + if ($throwable instanceof \ErrorException) { + return $throwable->getSeverity(); + } + + if ($throwable instanceof \ParseError) { + return E_PARSE; + } + + if ($throwable instanceof \TypeError) { + return E_RECOVERABLE_ERROR; + } + + return E_ERROR; + } +} diff --git a/vendor/symfony/error-handler/composer.json b/vendor/symfony/error-handler/composer.json new file mode 100644 index 0000000..64e72d9 --- /dev/null +++ b/vendor/symfony/error-handler/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony/error-handler", + "type": "library", + "description": "Symfony ErrorHandler Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/deprecation-contracts": "^2.1" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/event-dispatcher-contracts/.gitignore b/vendor/symfony/event-dispatcher-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md b/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md new file mode 100644 index 0000000..e984777 --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/master/CHANGELOG.md diff --git a/vendor/symfony/event-dispatcher-contracts/Event.php b/vendor/symfony/event-dispatcher-contracts/Event.php new file mode 100644 index 0000000..46dcb2b --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/Event.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\EventDispatcher; + +use Psr\EventDispatcher\StoppableEventInterface; + +/** + * Event is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass + * state information to an event handler when an event is raised. + * + * You can call the method stopPropagation() to abort the execution of + * further listeners in your event listener. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + * @author Nicolas Grekas + */ +class Event implements StoppableEventInterface +{ + private $propagationStopped = false; + + /** + * {@inheritdoc} + */ + public function isPropagationStopped(): bool + { + return $this->propagationStopped; + } + + /** + * Stops the propagation of the event to further event listeners. + * + * If multiple event listeners are connected to the same event, no + * further event listener will be triggered once any trigger calls + * stopPropagation(). + */ + public function stopPropagation(): void + { + $this->propagationStopped = true; + } +} diff --git a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php new file mode 100644 index 0000000..351dc51 --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\EventDispatcher; + +use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface; + +/** + * Allows providing hooks on domain-specific lifecycles by dispatching events. + */ +interface EventDispatcherInterface extends PsrEventDispatcherInterface +{ + /** + * Dispatches an event to all registered listeners. + * + * @param object $event The event to pass to the event handlers/listeners + * @param string|null $eventName The name of the event to dispatch. If not supplied, + * the class of $event should be used instead. + * + * @return object The passed $event MUST be returned + */ + public function dispatch(object $event, string $eventName = null): object; +} diff --git a/vendor/symfony/event-dispatcher-contracts/LICENSE b/vendor/symfony/event-dispatcher-contracts/LICENSE new file mode 100644 index 0000000..69d925b --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/event-dispatcher-contracts/README.md b/vendor/symfony/event-dispatcher-contracts/README.md new file mode 100644 index 0000000..fb051c7 --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/README.md @@ -0,0 +1,9 @@ +Symfony EventDispatcher Contracts +================================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/master/README.md for more information. diff --git a/vendor/symfony/event-dispatcher-contracts/composer.json b/vendor/symfony/event-dispatcher-contracts/composer.json new file mode 100644 index 0000000..c712bc2 --- /dev/null +++ b/vendor/symfony/event-dispatcher-contracts/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/event-dispatcher-contracts", + "type": "library", + "description": "Generic abstractions related to dispatching event", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" } + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/vendor/symfony/event-dispatcher/CHANGELOG.md b/vendor/symfony/event-dispatcher/CHANGELOG.md new file mode 100644 index 0000000..92a3b8b --- /dev/null +++ b/vendor/symfony/event-dispatcher/CHANGELOG.md @@ -0,0 +1,81 @@ +CHANGELOG +========= + +5.1.0 +----- + + * The `LegacyEventDispatcherProxy` class has been deprecated. + * Added an optional `dispatcher` attribute to the listener and subscriber tags in `RegisterListenerPass`. + +5.0.0 +----- + + * The signature of the `EventDispatcherInterface::dispatch()` method has been changed to `dispatch($event, string $eventName = null): object`. + * The `Event` class has been removed in favor of `Symfony\Contracts\EventDispatcher\Event`. + * The `TraceableEventDispatcherInterface` has been removed. + * The `WrappedListener` class is now final. + +4.4.0 +----- + + * `AddEventAliasesPass` has been added, allowing applications and bundles to extend the event alias mapping used by `RegisterListenersPass`. + * Made the `event` attribute of the `kernel.event_listener` tag optional for FQCN events. + +4.3.0 +----- + + * The signature of the `EventDispatcherInterface::dispatch()` method should be updated to `dispatch($event, string $eventName = null)`, not doing so is deprecated + * deprecated the `Event` class, use `Symfony\Contracts\EventDispatcher\Event` instead + +4.1.0 +----- + + * added support for invokable event listeners tagged with `kernel.event_listener` by default + * The `TraceableEventDispatcher::getOrphanedEvents()` method has been added. + * The `TraceableEventDispatcherInterface` has been deprecated. + +4.0.0 +----- + + * removed the `ContainerAwareEventDispatcher` class + * added the `reset()` method to the `TraceableEventDispatcherInterface` + +3.4.0 +----- + + * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated. + +3.3.0 +----- + + * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead. + +3.0.0 +----- + + * The method `getListenerPriority($eventName, $listener)` has been added to the + `EventDispatcherInterface`. + * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()` + and `Event::getName()` have been removed. + The event dispatcher and the event name are passed to the listener call. + +2.5.0 +----- + + * added Debug\TraceableEventDispatcher (originally in HttpKernel) + * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface + * added RegisterListenersPass (originally in HttpKernel) + +2.1.0 +----- + + * added TraceableEventDispatcherInterface + * added ContainerAwareEventDispatcher + * added a reference to the EventDispatcher on the Event + * added a reference to the Event name on the event + * added fluid interface to the dispatch() method which now returns the Event + object + * added GenericEvent event class + * added the possibility for subscribers to subscribe several times for the + same event + * added ImmutableEventDispatcher diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php new file mode 100644 index 0000000..11dce48 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php @@ -0,0 +1,363 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Debug; + +use Psr\EventDispatcher\StoppableEventInterface; +use Psr\Log\LoggerInterface; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Contracts\Service\ResetInterface; + +/** + * Collects some data about event listeners. + * + * This event dispatcher delegates the dispatching to another one. + * + * @author Fabien Potencier + */ +class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface +{ + protected $logger; + protected $stopwatch; + + private $callStack; + private $dispatcher; + private $wrappedListeners; + private $orphanedEvents; + private $requestStack; + private $currentRequestHash = ''; + + public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null) + { + $this->dispatcher = $dispatcher; + $this->stopwatch = $stopwatch; + $this->logger = $logger; + $this->wrappedListeners = []; + $this->orphanedEvents = []; + $this->requestStack = $requestStack; + } + + /** + * {@inheritdoc} + */ + public function addListener(string $eventName, $listener, int $priority = 0) + { + $this->dispatcher->addListener($eventName, $listener, $priority); + } + + /** + * {@inheritdoc} + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + $this->dispatcher->addSubscriber($subscriber); + } + + /** + * {@inheritdoc} + */ + public function removeListener(string $eventName, $listener) + { + if (isset($this->wrappedListeners[$eventName])) { + foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { + if ($wrappedListener->getWrappedListener() === $listener) { + $listener = $wrappedListener; + unset($this->wrappedListeners[$eventName][$index]); + break; + } + } + } + + return $this->dispatcher->removeListener($eventName, $listener); + } + + /** + * {@inheritdoc} + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) + { + return $this->dispatcher->removeSubscriber($subscriber); + } + + /** + * {@inheritdoc} + */ + public function getListeners(string $eventName = null) + { + return $this->dispatcher->getListeners($eventName); + } + + /** + * {@inheritdoc} + */ + public function getListenerPriority(string $eventName, $listener) + { + // we might have wrapped listeners for the event (if called while dispatching) + // in that case get the priority by wrapper + if (isset($this->wrappedListeners[$eventName])) { + foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { + if ($wrappedListener->getWrappedListener() === $listener) { + return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); + } + } + } + + return $this->dispatcher->getListenerPriority($eventName, $listener); + } + + /** + * {@inheritdoc} + */ + public function hasListeners(string $eventName = null) + { + return $this->dispatcher->hasListeners($eventName); + } + + /** + * {@inheritdoc} + */ + public function dispatch(object $event, string $eventName = null): object + { + $eventName = $eventName ?? \get_class($event); + + if (null === $this->callStack) { + $this->callStack = new \SplObjectStorage(); + } + + $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : ''; + + if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) { + $this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName)); + } + + $this->preProcess($eventName); + try { + $this->beforeDispatch($eventName, $event); + try { + $e = $this->stopwatch->start($eventName, 'section'); + try { + $this->dispatcher->dispatch($event, $eventName); + } finally { + if ($e->isStarted()) { + $e->stop(); + } + } + } finally { + $this->afterDispatch($eventName, $event); + } + } finally { + $this->currentRequestHash = $currentRequestHash; + $this->postProcess($eventName); + } + + return $event; + } + + /** + * @return array + */ + public function getCalledListeners(Request $request = null) + { + if (null === $this->callStack) { + return []; + } + + $hash = $request ? spl_object_hash($request) : null; + $called = []; + foreach ($this->callStack as $listener) { + list($eventName, $requestHash) = $this->callStack->getInfo(); + if (null === $hash || $hash === $requestHash) { + $called[] = $listener->getInfo($eventName); + } + } + + return $called; + } + + /** + * @return array + */ + public function getNotCalledListeners(Request $request = null) + { + try { + $allListeners = $this->getListeners(); + } catch (\Exception $e) { + if (null !== $this->logger) { + $this->logger->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); + } + + // unable to retrieve the uncalled listeners + return []; + } + + $hash = $request ? spl_object_hash($request) : null; + $calledListeners = []; + + if (null !== $this->callStack) { + foreach ($this->callStack as $calledListener) { + list(, $requestHash) = $this->callStack->getInfo(); + + if (null === $hash || $hash === $requestHash) { + $calledListeners[] = $calledListener->getWrappedListener(); + } + } + } + + $notCalled = []; + foreach ($allListeners as $eventName => $listeners) { + foreach ($listeners as $listener) { + if (!\in_array($listener, $calledListeners, true)) { + if (!$listener instanceof WrappedListener) { + $listener = new WrappedListener($listener, null, $this->stopwatch, $this); + } + $notCalled[] = $listener->getInfo($eventName); + } + } + } + + uasort($notCalled, [$this, 'sortNotCalledListeners']); + + return $notCalled; + } + + public function getOrphanedEvents(Request $request = null): array + { + if ($request) { + return $this->orphanedEvents[spl_object_hash($request)] ?? []; + } + + if (!$this->orphanedEvents) { + return []; + } + + return array_merge(...array_values($this->orphanedEvents)); + } + + public function reset() + { + $this->callStack = null; + $this->orphanedEvents = []; + $this->currentRequestHash = ''; + } + + /** + * Proxies all method calls to the original event dispatcher. + * + * @param string $method The method name + * @param array $arguments The method arguments + * + * @return mixed + */ + public function __call(string $method, array $arguments) + { + return $this->dispatcher->{$method}(...$arguments); + } + + /** + * Called before dispatching the event. + */ + protected function beforeDispatch(string $eventName, object $event) + { + } + + /** + * Called after dispatching the event. + */ + protected function afterDispatch(string $eventName, object $event) + { + } + + private function preProcess(string $eventName): void + { + if (!$this->dispatcher->hasListeners($eventName)) { + $this->orphanedEvents[$this->currentRequestHash][] = $eventName; + + return; + } + + foreach ($this->dispatcher->getListeners($eventName) as $listener) { + $priority = $this->getListenerPriority($eventName, $listener); + $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this); + $this->wrappedListeners[$eventName][] = $wrappedListener; + $this->dispatcher->removeListener($eventName, $listener); + $this->dispatcher->addListener($eventName, $wrappedListener, $priority); + $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]); + } + } + + private function postProcess(string $eventName): void + { + unset($this->wrappedListeners[$eventName]); + $skipped = false; + foreach ($this->dispatcher->getListeners($eventName) as $listener) { + if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch. + continue; + } + // Unwrap listener + $priority = $this->getListenerPriority($eventName, $listener); + $this->dispatcher->removeListener($eventName, $listener); + $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority); + + if (null !== $this->logger) { + $context = ['event' => $eventName, 'listener' => $listener->getPretty()]; + } + + if ($listener->wasCalled()) { + if (null !== $this->logger) { + $this->logger->debug('Notified event "{event}" to listener "{listener}".', $context); + } + } else { + $this->callStack->detach($listener); + } + + if (null !== $this->logger && $skipped) { + $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context); + } + + if ($listener->stoppedPropagation()) { + if (null !== $this->logger) { + $this->logger->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); + } + + $skipped = true; + } + } + } + + private function sortNotCalledListeners(array $a, array $b) + { + if (0 !== $cmp = strcmp($a['event'], $b['event'])) { + return $cmp; + } + + if (\is_int($a['priority']) && !\is_int($b['priority'])) { + return 1; + } + + if (!\is_int($a['priority']) && \is_int($b['priority'])) { + return -1; + } + + if ($a['priority'] === $b['priority']) { + return 0; + } + + if ($a['priority'] > $b['priority']) { + return -1; + } + + return 1; + } +} diff --git a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php new file mode 100644 index 0000000..58a5ed9 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Debug; + +use Psr\EventDispatcher\StoppableEventInterface; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Component\VarDumper\Caster\ClassStub; + +/** + * @author Fabien Potencier + */ +final class WrappedListener +{ + private $listener; + private $optimizedListener; + private $name; + private $called; + private $stoppedPropagation; + private $stopwatch; + private $dispatcher; + private $pretty; + private $stub; + private $priority; + private static $hasClassStub; + + public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) + { + $this->listener = $listener; + $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null); + $this->stopwatch = $stopwatch; + $this->dispatcher = $dispatcher; + $this->called = false; + $this->stoppedPropagation = false; + + if (\is_array($listener)) { + $this->name = \is_object($listener[0]) ? get_debug_type($listener[0]) : $listener[0]; + $this->pretty = $this->name.'::'.$listener[1]; + } elseif ($listener instanceof \Closure) { + $r = new \ReflectionFunction($listener); + if (false !== strpos($r->name, '{closure}')) { + $this->pretty = $this->name = 'closure'; + } elseif ($class = $r->getClosureScopeClass()) { + $this->name = $class->name; + $this->pretty = $this->name.'::'.$r->name; + } else { + $this->pretty = $this->name = $r->name; + } + } elseif (\is_string($listener)) { + $this->pretty = $this->name = $listener; + } else { + $this->name = get_debug_type($listener); + $this->pretty = $this->name.'::__invoke'; + } + + if (null !== $name) { + $this->name = $name; + } + + if (null === self::$hasClassStub) { + self::$hasClassStub = class_exists(ClassStub::class); + } + } + + public function getWrappedListener() + { + return $this->listener; + } + + public function wasCalled(): bool + { + return $this->called; + } + + public function stoppedPropagation(): bool + { + return $this->stoppedPropagation; + } + + public function getPretty(): string + { + return $this->pretty; + } + + public function getInfo(string $eventName): array + { + if (null === $this->stub) { + $this->stub = self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->listener) : $this->pretty.'()'; + } + + return [ + 'event' => $eventName, + 'priority' => null !== $this->priority ? $this->priority : (null !== $this->dispatcher ? $this->dispatcher->getListenerPriority($eventName, $this->listener) : null), + 'pretty' => $this->pretty, + 'stub' => $this->stub, + ]; + } + + public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher): void + { + $dispatcher = $this->dispatcher ?: $dispatcher; + + $this->called = true; + $this->priority = $dispatcher->getListenerPriority($eventName, $this->listener); + + $e = $this->stopwatch->start($this->name, 'event_listener'); + + ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); + + if ($e->isStarted()) { + $e->stop(); + } + + if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { + $this->stoppedPropagation = true; + } + } +} diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php new file mode 100644 index 0000000..c4ea50f --- /dev/null +++ b/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +/** + * This pass allows bundles to extend the list of event aliases. + * + * @author Alexander M. Turek + */ +class AddEventAliasesPass implements CompilerPassInterface +{ + private $eventAliases; + private $eventAliasesParameter; + + public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases') + { + $this->eventAliases = $eventAliases; + $this->eventAliasesParameter = $eventAliasesParameter; + } + + public function process(ContainerBuilder $container): void + { + $eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : []; + + $container->setParameter( + $this->eventAliasesParameter, + array_merge($eventAliases, $this->eventAliases) + ); + } +} diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php new file mode 100644 index 0000000..a40cee0 --- /dev/null +++ b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php @@ -0,0 +1,226 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\DependencyInjection; + +use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Contracts\EventDispatcher\Event; + +/** + * Compiler pass to register tagged services for an event dispatcher. + */ +class RegisterListenersPass implements CompilerPassInterface +{ + protected $dispatcherService; + protected $listenerTag; + protected $subscriberTag; + protected $eventAliasesParameter; + + private $hotPathEvents = []; + private $hotPathTagName; + private $noPreloadEvents = []; + private $noPreloadTagName; + + public function __construct(string $dispatcherService = 'event_dispatcher', string $listenerTag = 'kernel.event_listener', string $subscriberTag = 'kernel.event_subscriber', string $eventAliasesParameter = 'event_dispatcher.event_aliases') + { + $this->dispatcherService = $dispatcherService; + $this->listenerTag = $listenerTag; + $this->subscriberTag = $subscriberTag; + $this->eventAliasesParameter = $eventAliasesParameter; + } + + /** + * @return $this + */ + public function setHotPathEvents(array $hotPathEvents, string $tagName = 'container.hot_path') + { + $this->hotPathEvents = array_flip($hotPathEvents); + $this->hotPathTagName = $tagName; + + return $this; + } + + /** + * @return $this + */ + public function setNoPreloadEvents(array $noPreloadEvents, string $tagName = 'container.no_preload'): self + { + $this->noPreloadEvents = array_flip($noPreloadEvents); + $this->noPreloadTagName = $tagName; + + return $this; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { + return; + } + + $aliases = []; + + if ($container->hasParameter($this->eventAliasesParameter)) { + $aliases = $container->getParameter($this->eventAliasesParameter); + } + + $globalDispatcherDefinition = $container->findDefinition($this->dispatcherService); + + foreach ($container->findTaggedServiceIds($this->listenerTag, true) as $id => $events) { + $noPreload = 0; + + foreach ($events as $event) { + $priority = isset($event['priority']) ? $event['priority'] : 0; + + if (!isset($event['event'])) { + if ($container->getDefinition($id)->hasTag($this->subscriberTag)) { + continue; + } + + $event['method'] = $event['method'] ?? '__invoke'; + $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']); + } + + $event['event'] = $aliases[$event['event']] ?? $event['event']; + + if (!isset($event['method'])) { + $event['method'] = 'on'.preg_replace_callback([ + '/(?<=\b)[a-z]/i', + '/[^a-z0-9]/i', + ], function ($matches) { return strtoupper($matches[0]); }, $event['event']); + $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); + + if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) { + $event['method'] = '__invoke'; + } + } + + $dispatcherDefinition = $globalDispatcherDefinition; + if (isset($event['dispatcher'])) { + $dispatcherDefinition = $container->getDefinition($event['dispatcher']); + } + + $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); + + if (isset($this->hotPathEvents[$event['event']])) { + $container->getDefinition($id)->addTag($this->hotPathTagName); + } elseif (isset($this->noPreloadEvents[$event['event']])) { + ++$noPreload; + } + } + + if ($noPreload && \count($events) === $noPreload) { + $container->getDefinition($id)->addTag($this->noPreloadTagName); + } + } + + $extractingDispatcher = new ExtractingEventDispatcher(); + + foreach ($container->findTaggedServiceIds($this->subscriberTag, true) as $id => $tags) { + $def = $container->getDefinition($id); + + // We must assume that the class value has been correctly filled, even if the service is created by a factory + $class = $def->getClass(); + + if (!$r = $container->getReflectionClass($class)) { + throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + if (!$r->isSubclassOf(EventSubscriberInterface::class)) { + throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, EventSubscriberInterface::class)); + } + $class = $r->name; + + $dispatcherDefinitions = []; + foreach ($tags as $attributes) { + if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) { + continue; + } + + $dispatcherDefinitions[] = $container->getDefinition($attributes['dispatcher']); + } + + if (!$dispatcherDefinitions) { + $dispatcherDefinitions = [$globalDispatcherDefinition]; + } + + $noPreload = 0; + ExtractingEventDispatcher::$aliases = $aliases; + ExtractingEventDispatcher::$subscriber = $class; + $extractingDispatcher->addSubscriber($extractingDispatcher); + foreach ($extractingDispatcher->listeners as $args) { + $args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]]; + foreach ($dispatcherDefinitions as $dispatcherDefinition) { + $dispatcherDefinition->addMethodCall('addListener', $args); + } + + if (isset($this->hotPathEvents[$args[0]])) { + $container->getDefinition($id)->addTag($this->hotPathTagName); + } elseif (isset($this->noPreloadEvents[$args[0]])) { + ++$noPreload; + } + } + if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) { + $container->getDefinition($id)->addTag($this->noPreloadTagName); + } + $extractingDispatcher->listeners = []; + ExtractingEventDispatcher::$aliases = []; + } + } + + private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string + { + if ( + null === ($class = $container->getDefinition($id)->getClass()) + || !($r = $container->getReflectionClass($class, false)) + || !$r->hasMethod($method) + || 1 > ($m = $r->getMethod($method))->getNumberOfParameters() + || !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType + || $type->isBuiltin() + || Event::class === ($name = $type->getName()) + ) { + throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); + } + + return $name; + } +} + +/** + * @internal + */ +class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface +{ + public $listeners = []; + + public static $aliases = []; + public static $subscriber; + + public function addListener(string $eventName, $listener, int $priority = 0) + { + $this->listeners[] = [$eventName, $listener[1], $priority]; + } + + public static function getSubscribedEvents(): array + { + $events = []; + + foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) { + $events[self::$aliases[$eventName] ?? $eventName] = $params; + } + + return $events; + } +} diff --git a/vendor/symfony/event-dispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/EventDispatcher.php new file mode 100644 index 0000000..8dba33d --- /dev/null +++ b/vendor/symfony/event-dispatcher/EventDispatcher.php @@ -0,0 +1,280 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +use Psr\EventDispatcher\StoppableEventInterface; +use Symfony\Component\EventDispatcher\Debug\WrappedListener; + +/** + * The EventDispatcherInterface is the central point of Symfony's event listener system. + * + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + * @author Fabien Potencier + * @author Jordi Boggiano + * @author Jordan Alliot + * @author Nicolas Grekas + */ +class EventDispatcher implements EventDispatcherInterface +{ + private $listeners = []; + private $sorted = []; + private $optimized; + + public function __construct() + { + if (__CLASS__ === static::class) { + $this->optimized = []; + } + } + + /** + * {@inheritdoc} + */ + public function dispatch(object $event, string $eventName = null): object + { + $eventName = $eventName ?? \get_class($event); + + if (null !== $this->optimized && null !== $eventName) { + $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName)); + } else { + $listeners = $this->getListeners($eventName); + } + + if ($listeners) { + $this->callListeners($listeners, $eventName, $event); + } + + return $event; + } + + /** + * {@inheritdoc} + */ + public function getListeners(string $eventName = null) + { + if (null !== $eventName) { + if (empty($this->listeners[$eventName])) { + return []; + } + + if (!isset($this->sorted[$eventName])) { + $this->sortListeners($eventName); + } + + return $this->sorted[$eventName]; + } + + foreach ($this->listeners as $eventName => $eventListeners) { + if (!isset($this->sorted[$eventName])) { + $this->sortListeners($eventName); + } + } + + return array_filter($this->sorted); + } + + /** + * {@inheritdoc} + */ + public function getListenerPriority(string $eventName, $listener) + { + if (empty($this->listeners[$eventName])) { + return null; + } + + if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { + $listener[0] = $listener[0](); + $listener[1] = $listener[1] ?? '__invoke'; + } + + foreach ($this->listeners[$eventName] as $priority => &$listeners) { + foreach ($listeners as &$v) { + if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { + $v[0] = $v[0](); + $v[1] = $v[1] ?? '__invoke'; + } + if ($v === $listener) { + return $priority; + } + } + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function hasListeners(string $eventName = null) + { + if (null !== $eventName) { + return !empty($this->listeners[$eventName]); + } + + foreach ($this->listeners as $eventListeners) { + if ($eventListeners) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function addListener(string $eventName, $listener, int $priority = 0) + { + $this->listeners[$eventName][$priority][] = $listener; + unset($this->sorted[$eventName], $this->optimized[$eventName]); + } + + /** + * {@inheritdoc} + */ + public function removeListener(string $eventName, $listener) + { + if (empty($this->listeners[$eventName])) { + return; + } + + if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { + $listener[0] = $listener[0](); + $listener[1] = $listener[1] ?? '__invoke'; + } + + foreach ($this->listeners[$eventName] as $priority => &$listeners) { + foreach ($listeners as $k => &$v) { + if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { + $v[0] = $v[0](); + $v[1] = $v[1] ?? '__invoke'; + } + if ($v === $listener) { + unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); + } + } + + if (!$listeners) { + unset($this->listeners[$eventName][$priority]); + } + } + } + + /** + * {@inheritdoc} + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { + if (\is_string($params)) { + $this->addListener($eventName, [$subscriber, $params]); + } elseif (\is_string($params[0])) { + $this->addListener($eventName, [$subscriber, $params[0]], isset($params[1]) ? $params[1] : 0); + } else { + foreach ($params as $listener) { + $this->addListener($eventName, [$subscriber, $listener[0]], isset($listener[1]) ? $listener[1] : 0); + } + } + } + } + + /** + * {@inheritdoc} + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) + { + foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { + if (\is_array($params) && \is_array($params[0])) { + foreach ($params as $listener) { + $this->removeListener($eventName, [$subscriber, $listener[0]]); + } + } else { + $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); + } + } + } + + /** + * Triggers the listeners of an event. + * + * This method can be overridden to add functionality that is executed + * for each listener. + * + * @param callable[] $listeners The event listeners + * @param string $eventName The name of the event to dispatch + * @param object $event The event object to pass to the event handlers/listeners + */ + protected function callListeners(iterable $listeners, string $eventName, object $event) + { + $stoppable = $event instanceof StoppableEventInterface; + + foreach ($listeners as $listener) { + if ($stoppable && $event->isPropagationStopped()) { + break; + } + $listener($event, $eventName, $this); + } + } + + /** + * Sorts the internal list of listeners for the given event by priority. + */ + private function sortListeners(string $eventName) + { + krsort($this->listeners[$eventName]); + $this->sorted[$eventName] = []; + + foreach ($this->listeners[$eventName] as &$listeners) { + foreach ($listeners as $k => &$listener) { + if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { + $listener[0] = $listener[0](); + $listener[1] = $listener[1] ?? '__invoke'; + } + $this->sorted[$eventName][] = $listener; + } + } + } + + /** + * Optimizes the internal list of listeners for the given event by priority. + */ + private function optimizeListeners(string $eventName): array + { + krsort($this->listeners[$eventName]); + $this->optimized[$eventName] = []; + + foreach ($this->listeners[$eventName] as &$listeners) { + foreach ($listeners as &$listener) { + $closure = &$this->optimized[$eventName][]; + if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { + $closure = static function (...$args) use (&$listener, &$closure) { + if ($listener[0] instanceof \Closure) { + $listener[0] = $listener[0](); + $listener[1] = $listener[1] ?? '__invoke'; + } + ($closure = \Closure::fromCallable($listener))(...$args); + }; + } else { + $closure = $listener instanceof \Closure || $listener instanceof WrappedListener ? $listener : \Closure::fromCallable($listener); + } + } + } + + return $this->optimized[$eventName]; + } +} diff --git a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php new file mode 100644 index 0000000..88c707c --- /dev/null +++ b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface; + +/** + * The EventDispatcherInterface is the central point of Symfony's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @author Bernhard Schussek + */ +interface EventDispatcherInterface extends ContractsEventDispatcherInterface +{ + /** + * Adds an event listener that listens on the specified events. + * + * @param callable $listener The listener + * @param int $priority The higher this value, the earlier an event + * listener will be triggered in the chain (defaults to 0) + */ + public function addListener(string $eventName, $listener, int $priority = 0); + + /** + * Adds an event subscriber. + * + * The subscriber is asked for all the events it is + * interested in and added as a listener for these events. + */ + public function addSubscriber(EventSubscriberInterface $subscriber); + + /** + * Removes an event listener from the specified events. + * + * @param callable $listener The listener to remove + */ + public function removeListener(string $eventName, $listener); + + public function removeSubscriber(EventSubscriberInterface $subscriber); + + /** + * Gets the listeners of a specific event or all listeners sorted by descending priority. + * + * @return array The event listeners for the specified event, or all event listeners by event name + */ + public function getListeners(string $eventName = null); + + /** + * Gets the listener priority for a specific event. + * + * Returns null if the event or the listener does not exist. + * + * @param callable $listener The listener + * + * @return int|null The event listener priority + */ + public function getListenerPriority(string $eventName, $listener); + + /** + * Checks whether an event has any registered listeners. + * + * @return bool true if the specified event has any listeners, false otherwise + */ + public function hasListeners(string $eventName = null); +} diff --git a/vendor/symfony/event-dispatcher/EventSubscriberInterface.php b/vendor/symfony/event-dispatcher/EventSubscriberInterface.php new file mode 100644 index 0000000..741590b --- /dev/null +++ b/vendor/symfony/event-dispatcher/EventSubscriberInterface.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * An EventSubscriber knows itself what events it is interested in. + * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + */ +interface EventSubscriberInterface +{ + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * ['eventName' => 'methodName'] + * * ['eventName' => ['methodName', $priority]] + * * ['eventName' => [['methodName1', $priority], ['methodName2']]] + * + * The code must not depend on runtime state as it will only be called at compile time. + * All logic depending on runtime state must be put into the individual methods handling the events. + * + * @return array The event names to listen to + */ + public static function getSubscribedEvents(); +} diff --git a/vendor/symfony/event-dispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/GenericEvent.php new file mode 100644 index 0000000..34b95ce --- /dev/null +++ b/vendor/symfony/event-dispatcher/GenericEvent.php @@ -0,0 +1,170 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +use Symfony\Contracts\EventDispatcher\Event; + +/** + * Event encapsulation class. + * + * Encapsulates events thus decoupling the observer from the subject they encapsulate. + * + * @author Drak + */ +class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate +{ + protected $subject; + protected $arguments; + + /** + * Encapsulate an event with $subject and $args. + * + * @param mixed $subject The subject of the event, usually an object or a callable + * @param array $arguments Arguments to store in the event + */ + public function __construct($subject = null, array $arguments = []) + { + $this->subject = $subject; + $this->arguments = $arguments; + } + + /** + * Getter for subject property. + * + * @return mixed The observer subject + */ + public function getSubject() + { + return $this->subject; + } + + /** + * Get argument by key. + * + * @return mixed Contents of array key + * + * @throws \InvalidArgumentException if key is not found + */ + public function getArgument(string $key) + { + if ($this->hasArgument($key)) { + return $this->arguments[$key]; + } + + throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key)); + } + + /** + * Add argument to event. + * + * @param mixed $value Value + * + * @return $this + */ + public function setArgument(string $key, $value) + { + $this->arguments[$key] = $value; + + return $this; + } + + /** + * Getter for all arguments. + * + * @return array + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * Set args property. + * + * @return $this + */ + public function setArguments(array $args = []) + { + $this->arguments = $args; + + return $this; + } + + /** + * Has argument. + * + * @return bool + */ + public function hasArgument(string $key) + { + return \array_key_exists($key, $this->arguments); + } + + /** + * ArrayAccess for argument getter. + * + * @param string $key Array key + * + * @return mixed + * + * @throws \InvalidArgumentException if key does not exist in $this->args + */ + public function offsetGet($key) + { + return $this->getArgument($key); + } + + /** + * ArrayAccess for argument setter. + * + * @param string $key Array key to set + * @param mixed $value Value + */ + public function offsetSet($key, $value) + { + $this->setArgument($key, $value); + } + + /** + * ArrayAccess for unset argument. + * + * @param string $key Array key + */ + public function offsetUnset($key) + { + if ($this->hasArgument($key)) { + unset($this->arguments[$key]); + } + } + + /** + * ArrayAccess has argument. + * + * @param string $key Array key + * + * @return bool + */ + public function offsetExists($key) + { + return $this->hasArgument($key); + } + + /** + * IteratorAggregate for iterating over the object like an array. + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->arguments); + } +} diff --git a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php new file mode 100644 index 0000000..568d79c --- /dev/null +++ b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * A read-only proxy for an event dispatcher. + * + * @author Bernhard Schussek + */ +class ImmutableEventDispatcher implements EventDispatcherInterface +{ + private $dispatcher; + + public function __construct(EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + + /** + * {@inheritdoc} + */ + public function dispatch(object $event, string $eventName = null): object + { + return $this->dispatcher->dispatch($event, $eventName); + } + + /** + * {@inheritdoc} + */ + public function addListener(string $eventName, $listener, int $priority = 0) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function removeListener(string $eventName, $listener) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function getListeners(string $eventName = null) + { + return $this->dispatcher->getListeners($eventName); + } + + /** + * {@inheritdoc} + */ + public function getListenerPriority(string $eventName, $listener) + { + return $this->dispatcher->getListenerPriority($eventName, $listener); + } + + /** + * {@inheritdoc} + */ + public function hasListeners(string $eventName = null) + { + return $this->dispatcher->hasListeners($eventName); + } +} diff --git a/vendor/symfony/event-dispatcher/LICENSE b/vendor/symfony/event-dispatcher/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/event-dispatcher/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php b/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php new file mode 100644 index 0000000..6e17c8f --- /dev/null +++ b/vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; + +trigger_deprecation('symfony/event-dispatcher', '5.1', '%s is deprecated, use the event dispatcher without the proxy.', LegacyEventDispatcherProxy::class); + +/** + * A helper class to provide BC/FC with the legacy signature of EventDispatcherInterface::dispatch(). + * + * @author Nicolas Grekas + * + * @deprecated since Symfony 5.1 + */ +final class LegacyEventDispatcherProxy +{ + public static function decorate(?EventDispatcherInterface $dispatcher): ?EventDispatcherInterface + { + return $dispatcher; + } +} diff --git a/vendor/symfony/event-dispatcher/README.md b/vendor/symfony/event-dispatcher/README.md new file mode 100644 index 0000000..e0d38ee --- /dev/null +++ b/vendor/symfony/event-dispatcher/README.md @@ -0,0 +1,15 @@ +EventDispatcher Component +========================= + +The EventDispatcher component provides tools that allow your application +components to communicate with each other by dispatching events and listening to +them. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/event-dispatcher/composer.json b/vendor/symfony/event-dispatcher/composer.json new file mode 100644 index 0000000..a67f66a --- /dev/null +++ b/vendor/symfony/event-dispatcher/composer.json @@ -0,0 +1,56 @@ +{ + "name": "symfony/event-dispatcher", + "type": "library", + "description": "Symfony EventDispatcher Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/finder/CHANGELOG.md b/vendor/symfony/finder/CHANGELOG.md new file mode 100644 index 0000000..33f5bd5 --- /dev/null +++ b/vendor/symfony/finder/CHANGELOG.md @@ -0,0 +1,79 @@ +CHANGELOG +========= + +5.0.0 +----- + + * added `$useNaturalSort` argument to `Finder::sortByName()` + +4.3.0 +----- + + * added Finder::ignoreVCSIgnored() to ignore files based on rules listed in .gitignore + +4.2.0 +----- + + * added $useNaturalSort option to Finder::sortByName() method + * the `Finder::sortByName()` method will have a new `$useNaturalSort` + argument in version 5.0, not defining it is deprecated + * added `Finder::reverseSorting()` to reverse the sorting + +4.0.0 +----- + + * removed `ExceptionInterface` + * removed `Symfony\Component\Finder\Iterator\FilterIterator` + +3.4.0 +----- + + * deprecated `Symfony\Component\Finder\Iterator\FilterIterator` + * added Finder::hasResults() method to check if any results were found + +3.3.0 +----- + + * added double-star matching to Glob::toRegex() + +3.0.0 +----- + + * removed deprecated classes + +2.8.0 +----- + + * deprecated adapters and related classes + +2.5.0 +----- + * added support for GLOB_BRACE in the paths passed to Finder::in() + +2.3.0 +----- + + * added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs()) + * unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception + +2.2.0 +----- + + * added Finder::path() and Finder::notPath() methods + * added finder adapters to improve performance on specific platforms + * added support for wildcard characters (glob patterns) in the paths passed + to Finder::in() + +2.1.0 +----- + + * added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and + Finder::sortByModifiedTime() + * added Countable to Finder + * added support for an array of directories as an argument to + Finder::exclude() + * added searching based on the file content via Finder::contains() and + Finder::notContains() + * added support for the != operator in the Comparator + * [BC BREAK] filter expressions (used for file name and content) are no more + considered as regexps but glob patterns when they are enclosed in '*' or '?' diff --git a/vendor/symfony/finder/Comparator/Comparator.php b/vendor/symfony/finder/Comparator/Comparator.php new file mode 100644 index 0000000..cfe3965 --- /dev/null +++ b/vendor/symfony/finder/Comparator/Comparator.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Comparator; + +/** + * Comparator. + * + * @author Fabien Potencier + */ +class Comparator +{ + private $target; + private $operator = '=='; + + /** + * Gets the target value. + * + * @return string The target value + */ + public function getTarget() + { + return $this->target; + } + + public function setTarget(string $target) + { + $this->target = $target; + } + + /** + * Gets the comparison operator. + * + * @return string The operator + */ + public function getOperator() + { + return $this->operator; + } + + /** + * Sets the comparison operator. + * + * @throws \InvalidArgumentException + */ + public function setOperator(string $operator) + { + if ('' === $operator) { + $operator = '=='; + } + + if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { + throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); + } + + $this->operator = $operator; + } + + /** + * Tests against the target. + * + * @param mixed $test A test value + * + * @return bool + */ + public function test($test) + { + switch ($this->operator) { + case '>': + return $test > $this->target; + case '>=': + return $test >= $this->target; + case '<': + return $test < $this->target; + case '<=': + return $test <= $this->target; + case '!=': + return $test != $this->target; + } + + return $test == $this->target; + } +} diff --git a/vendor/symfony/finder/Comparator/DateComparator.php b/vendor/symfony/finder/Comparator/DateComparator.php new file mode 100644 index 0000000..d17c77a --- /dev/null +++ b/vendor/symfony/finder/Comparator/DateComparator.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Comparator; + +/** + * DateCompare compiles date comparisons. + * + * @author Fabien Potencier + */ +class DateComparator extends Comparator +{ + /** + * @param string $test A comparison string + * + * @throws \InvalidArgumentException If the test is not understood + */ + public function __construct(string $test) + { + if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) { + throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test)); + } + + try { + $date = new \DateTime($matches[2]); + $target = $date->format('U'); + } catch (\Exception $e) { + throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2])); + } + + $operator = isset($matches[1]) ? $matches[1] : '=='; + if ('since' === $operator || 'after' === $operator) { + $operator = '>'; + } + + if ('until' === $operator || 'before' === $operator) { + $operator = '<'; + } + + $this->setOperator($operator); + $this->setTarget($target); + } +} diff --git a/vendor/symfony/finder/Comparator/NumberComparator.php b/vendor/symfony/finder/Comparator/NumberComparator.php new file mode 100644 index 0000000..80667c9 --- /dev/null +++ b/vendor/symfony/finder/Comparator/NumberComparator.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Comparator; + +/** + * NumberComparator compiles a simple comparison to an anonymous + * subroutine, which you can call with a value to be tested again. + * + * Now this would be very pointless, if NumberCompare didn't understand + * magnitudes. + * + * The target value may use magnitudes of kilobytes (k, ki), + * megabytes (m, mi), or gigabytes (g, gi). Those suffixed + * with an i use the appropriate 2**n version in accordance with the + * IEC standard: http://physics.nist.gov/cuu/Units/binary.html + * + * Based on the Perl Number::Compare module. + * + * @author Fabien Potencier PHP port + * @author Richard Clamp Perl version + * @copyright 2004-2005 Fabien Potencier + * @copyright 2002 Richard Clamp + * + * @see http://physics.nist.gov/cuu/Units/binary.html + */ +class NumberComparator extends Comparator +{ + /** + * @param string|int $test A comparison string or an integer + * + * @throws \InvalidArgumentException If the test is not understood + */ + public function __construct(?string $test) + { + if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) { + throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test)); + } + + $target = $matches[2]; + if (!is_numeric($target)) { + throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target)); + } + if (isset($matches[3])) { + // magnitude + switch (strtolower($matches[3])) { + case 'k': + $target *= 1000; + break; + case 'ki': + $target *= 1024; + break; + case 'm': + $target *= 1000000; + break; + case 'mi': + $target *= 1024 * 1024; + break; + case 'g': + $target *= 1000000000; + break; + case 'gi': + $target *= 1024 * 1024 * 1024; + break; + } + } + + $this->setTarget($target); + $this->setOperator(isset($matches[1]) ? $matches[1] : '=='); + } +} diff --git a/vendor/symfony/finder/Exception/AccessDeniedException.php b/vendor/symfony/finder/Exception/AccessDeniedException.php new file mode 100644 index 0000000..ee195ea --- /dev/null +++ b/vendor/symfony/finder/Exception/AccessDeniedException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Exception; + +/** + * @author Jean-François Simon + */ +class AccessDeniedException extends \UnexpectedValueException +{ +} diff --git a/vendor/symfony/finder/Exception/DirectoryNotFoundException.php b/vendor/symfony/finder/Exception/DirectoryNotFoundException.php new file mode 100644 index 0000000..c6cc0f2 --- /dev/null +++ b/vendor/symfony/finder/Exception/DirectoryNotFoundException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Exception; + +/** + * @author Andreas Erhard + */ +class DirectoryNotFoundException extends \InvalidArgumentException +{ +} diff --git a/vendor/symfony/finder/Finder.php b/vendor/symfony/finder/Finder.php new file mode 100644 index 0000000..e1bcea3 --- /dev/null +++ b/vendor/symfony/finder/Finder.php @@ -0,0 +1,797 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder; + +use Symfony\Component\Finder\Comparator\DateComparator; +use Symfony\Component\Finder\Comparator\NumberComparator; +use Symfony\Component\Finder\Exception\DirectoryNotFoundException; +use Symfony\Component\Finder\Iterator\CustomFilterIterator; +use Symfony\Component\Finder\Iterator\DateRangeFilterIterator; +use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; +use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; +use Symfony\Component\Finder\Iterator\FilecontentFilterIterator; +use Symfony\Component\Finder\Iterator\FilenameFilterIterator; +use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; +use Symfony\Component\Finder\Iterator\SortableIterator; + +/** + * Finder allows to build rules to find files and directories. + * + * It is a thin wrapper around several specialized iterator classes. + * + * All rules may be invoked several times. + * + * All methods return the current Finder object to allow chaining: + * + * $finder = Finder::create()->files()->name('*.php')->in(__DIR__); + * + * @author Fabien Potencier + */ +class Finder implements \IteratorAggregate, \Countable +{ + const IGNORE_VCS_FILES = 1; + const IGNORE_DOT_FILES = 2; + const IGNORE_VCS_IGNORED_FILES = 4; + + private $mode = 0; + private $names = []; + private $notNames = []; + private $exclude = []; + private $filters = []; + private $depths = []; + private $sizes = []; + private $followLinks = false; + private $reverseSorting = false; + private $sort = false; + private $ignore = 0; + private $dirs = []; + private $dates = []; + private $iterators = []; + private $contains = []; + private $notContains = []; + private $paths = []; + private $notPaths = []; + private $ignoreUnreadableDirs = false; + + private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; + + public function __construct() + { + $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES; + } + + /** + * Creates a new Finder. + * + * @return static + */ + public static function create() + { + return new static(); + } + + /** + * Restricts the matching to directories only. + * + * @return $this + */ + public function directories() + { + $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES; + + return $this; + } + + /** + * Restricts the matching to files only. + * + * @return $this + */ + public function files() + { + $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES; + + return $this; + } + + /** + * Adds tests for the directory depth. + * + * Usage: + * + * $finder->depth('> 1') // the Finder will start matching at level 1. + * $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point. + * $finder->depth(['>= 1', '< 3']) + * + * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels + * + * @return $this + * + * @see DepthRangeFilterIterator + * @see NumberComparator + */ + public function depth($levels) + { + foreach ((array) $levels as $level) { + $this->depths[] = new Comparator\NumberComparator($level); + } + + return $this; + } + + /** + * Adds tests for file dates (last modified). + * + * The date must be something that strtotime() is able to parse: + * + * $finder->date('since yesterday'); + * $finder->date('until 2 days ago'); + * $finder->date('> now - 2 hours'); + * $finder->date('>= 2005-10-15'); + * $finder->date(['>= 2005-10-15', '<= 2006-05-27']); + * + * @param string|string[] $dates A date range string or an array of date ranges + * + * @return $this + * + * @see strtotime + * @see DateRangeFilterIterator + * @see DateComparator + */ + public function date($dates) + { + foreach ((array) $dates as $date) { + $this->dates[] = new Comparator\DateComparator($date); + } + + return $this; + } + + /** + * Adds rules that files must match. + * + * You can use patterns (delimited with / sign), globs or simple strings. + * + * $finder->name('*.php') + * $finder->name('/\.php$/') // same as above + * $finder->name('test.php') + * $finder->name(['test.py', 'test.php']) + * + * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns + * + * @return $this + * + * @see FilenameFilterIterator + */ + public function name($patterns) + { + $this->names = array_merge($this->names, (array) $patterns); + + return $this; + } + + /** + * Adds rules that files must not match. + * + * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns + * + * @return $this + * + * @see FilenameFilterIterator + */ + public function notName($patterns) + { + $this->notNames = array_merge($this->notNames, (array) $patterns); + + return $this; + } + + /** + * Adds tests that file contents must match. + * + * Strings or PCRE patterns can be used: + * + * $finder->contains('Lorem ipsum') + * $finder->contains('/Lorem ipsum/i') + * $finder->contains(['dolor', '/ipsum/i']) + * + * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns + * + * @return $this + * + * @see FilecontentFilterIterator + */ + public function contains($patterns) + { + $this->contains = array_merge($this->contains, (array) $patterns); + + return $this; + } + + /** + * Adds tests that file contents must not match. + * + * Strings or PCRE patterns can be used: + * + * $finder->notContains('Lorem ipsum') + * $finder->notContains('/Lorem ipsum/i') + * $finder->notContains(['lorem', '/dolor/i']) + * + * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns + * + * @return $this + * + * @see FilecontentFilterIterator + */ + public function notContains($patterns) + { + $this->notContains = array_merge($this->notContains, (array) $patterns); + + return $this; + } + + /** + * Adds rules that filenames must match. + * + * You can use patterns (delimited with / sign) or simple strings. + * + * $finder->path('some/special/dir') + * $finder->path('/some\/special\/dir/') // same as above + * $finder->path(['some dir', 'another/dir']) + * + * Use only / as dirname separator. + * + * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns + * + * @return $this + * + * @see FilenameFilterIterator + */ + public function path($patterns) + { + $this->paths = array_merge($this->paths, (array) $patterns); + + return $this; + } + + /** + * Adds rules that filenames must not match. + * + * You can use patterns (delimited with / sign) or simple strings. + * + * $finder->notPath('some/special/dir') + * $finder->notPath('/some\/special\/dir/') // same as above + * $finder->notPath(['some/file.txt', 'another/file.log']) + * + * Use only / as dirname separator. + * + * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns + * + * @return $this + * + * @see FilenameFilterIterator + */ + public function notPath($patterns) + { + $this->notPaths = array_merge($this->notPaths, (array) $patterns); + + return $this; + } + + /** + * Adds tests for file sizes. + * + * $finder->size('> 10K'); + * $finder->size('<= 1Ki'); + * $finder->size(4); + * $finder->size(['> 10K', '< 20K']) + * + * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges + * + * @return $this + * + * @see SizeRangeFilterIterator + * @see NumberComparator + */ + public function size($sizes) + { + foreach ((array) $sizes as $size) { + $this->sizes[] = new Comparator\NumberComparator($size); + } + + return $this; + } + + /** + * Excludes directories. + * + * Directories passed as argument must be relative to the ones defined with the `in()` method. For example: + * + * $finder->in(__DIR__)->exclude('ruby'); + * + * @param string|array $dirs A directory path or an array of directories + * + * @return $this + * + * @see ExcludeDirectoryFilterIterator + */ + public function exclude($dirs) + { + $this->exclude = array_merge($this->exclude, (array) $dirs); + + return $this; + } + + /** + * Excludes "hidden" directories and files (starting with a dot). + * + * This option is enabled by default. + * + * @return $this + * + * @see ExcludeDirectoryFilterIterator + */ + public function ignoreDotFiles(bool $ignoreDotFiles) + { + if ($ignoreDotFiles) { + $this->ignore |= static::IGNORE_DOT_FILES; + } else { + $this->ignore &= ~static::IGNORE_DOT_FILES; + } + + return $this; + } + + /** + * Forces the finder to ignore version control directories. + * + * This option is enabled by default. + * + * @return $this + * + * @see ExcludeDirectoryFilterIterator + */ + public function ignoreVCS(bool $ignoreVCS) + { + if ($ignoreVCS) { + $this->ignore |= static::IGNORE_VCS_FILES; + } else { + $this->ignore &= ~static::IGNORE_VCS_FILES; + } + + return $this; + } + + /** + * Forces Finder to obey .gitignore and ignore files based on rules listed there. + * + * This option is disabled by default. + * + * @return $this + */ + public function ignoreVCSIgnored(bool $ignoreVCSIgnored) + { + if ($ignoreVCSIgnored) { + $this->ignore |= static::IGNORE_VCS_IGNORED_FILES; + } else { + $this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES; + } + + return $this; + } + + /** + * Adds VCS patterns. + * + * @see ignoreVCS() + * + * @param string|string[] $pattern VCS patterns to ignore + */ + public static function addVCSPattern($pattern) + { + foreach ((array) $pattern as $p) { + self::$vcsPatterns[] = $p; + } + + self::$vcsPatterns = array_unique(self::$vcsPatterns); + } + + /** + * Sorts files and directories by an anonymous function. + * + * The anonymous function receives two \SplFileInfo instances to compare. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sort(\Closure $closure) + { + $this->sort = $closure; + + return $this; + } + + /** + * Sorts files and directories by name. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByName(bool $useNaturalSort = false) + { + $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME; + + return $this; + } + + /** + * Sorts files and directories by type (directories before files), then by name. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByType() + { + $this->sort = Iterator\SortableIterator::SORT_BY_TYPE; + + return $this; + } + + /** + * Sorts files and directories by the last accessed time. + * + * This is the time that the file was last accessed, read or written to. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByAccessedTime() + { + $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME; + + return $this; + } + + /** + * Reverses the sorting. + * + * @return $this + */ + public function reverseSorting() + { + $this->reverseSorting = true; + + return $this; + } + + /** + * Sorts files and directories by the last inode changed time. + * + * This is the time that the inode information was last modified (permissions, owner, group or other metadata). + * + * On Windows, since inode is not available, changed time is actually the file creation time. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByChangedTime() + { + $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME; + + return $this; + } + + /** + * Sorts files and directories by the last modified time. + * + * This is the last time the actual contents of the file were last modified. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByModifiedTime() + { + $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME; + + return $this; + } + + /** + * Filters the iterator with an anonymous function. + * + * The anonymous function receives a \SplFileInfo and must return false + * to remove files. + * + * @return $this + * + * @see CustomFilterIterator + */ + public function filter(\Closure $closure) + { + $this->filters[] = $closure; + + return $this; + } + + /** + * Forces the following of symlinks. + * + * @return $this + */ + public function followLinks() + { + $this->followLinks = true; + + return $this; + } + + /** + * Tells finder to ignore unreadable directories. + * + * By default, scanning unreadable directories content throws an AccessDeniedException. + * + * @return $this + */ + public function ignoreUnreadableDirs(bool $ignore = true) + { + $this->ignoreUnreadableDirs = $ignore; + + return $this; + } + + /** + * Searches files and directories which match defined rules. + * + * @param string|string[] $dirs A directory path or an array of directories + * + * @return $this + * + * @throws DirectoryNotFoundException if one of the directories does not exist + */ + public function in($dirs) + { + $resolvedDirs = []; + + foreach ((array) $dirs as $dir) { + if (is_dir($dir)) { + $resolvedDirs[] = $this->normalizeDir($dir); + } elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? GLOB_BRACE : 0) | GLOB_ONLYDIR | GLOB_NOSORT)) { + sort($glob); + $resolvedDirs = array_merge($resolvedDirs, array_map([$this, 'normalizeDir'], $glob)); + } else { + throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir)); + } + } + + $this->dirs = array_merge($this->dirs, $resolvedDirs); + + return $this; + } + + /** + * Returns an Iterator for the current Finder configuration. + * + * This method implements the IteratorAggregate interface. + * + * @return \Iterator|SplFileInfo[] An iterator + * + * @throws \LogicException if the in() method has not been called + */ + public function getIterator() + { + if (0 === \count($this->dirs) && 0 === \count($this->iterators)) { + throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.'); + } + + if (1 === \count($this->dirs) && 0 === \count($this->iterators)) { + return $this->searchInDirectory($this->dirs[0]); + } + + $iterator = new \AppendIterator(); + foreach ($this->dirs as $dir) { + $iterator->append($this->searchInDirectory($dir)); + } + + foreach ($this->iterators as $it) { + $iterator->append($it); + } + + return $iterator; + } + + /** + * Appends an existing set of files/directories to the finder. + * + * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array. + * + * @return $this + * + * @throws \InvalidArgumentException when the given argument is not iterable + */ + public function append(iterable $iterator) + { + if ($iterator instanceof \IteratorAggregate) { + $this->iterators[] = $iterator->getIterator(); + } elseif ($iterator instanceof \Iterator) { + $this->iterators[] = $iterator; + } elseif ($iterator instanceof \Traversable || \is_array($iterator)) { + $it = new \ArrayIterator(); + foreach ($iterator as $file) { + $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file)); + } + $this->iterators[] = $it; + } else { + throw new \InvalidArgumentException('Finder::append() method wrong argument type.'); + } + + return $this; + } + + /** + * Check if the any results were found. + * + * @return bool + */ + public function hasResults() + { + foreach ($this->getIterator() as $_) { + return true; + } + + return false; + } + + /** + * Counts all the results collected by the iterators. + * + * @return int + */ + public function count() + { + return iterator_count($this->getIterator()); + } + + private function searchInDirectory(string $dir): \Iterator + { + $exclude = $this->exclude; + $notPaths = $this->notPaths; + + if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) { + $exclude = array_merge($exclude, self::$vcsPatterns); + } + + if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) { + $notPaths[] = '#(^|/)\..+(/|$)#'; + } + + if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) { + $gitignoreFilePath = sprintf('%s/.gitignore', $dir); + if (!is_readable($gitignoreFilePath)) { + throw new \RuntimeException(sprintf('The "ignoreVCSIgnored" option cannot be used by the Finder as the "%s" file is not readable.', $gitignoreFilePath)); + } + $notPaths = array_merge($notPaths, [Gitignore::toRegex(file_get_contents($gitignoreFilePath))]); + } + + $minDepth = 0; + $maxDepth = PHP_INT_MAX; + + foreach ($this->depths as $comparator) { + switch ($comparator->getOperator()) { + case '>': + $minDepth = $comparator->getTarget() + 1; + break; + case '>=': + $minDepth = $comparator->getTarget(); + break; + case '<': + $maxDepth = $comparator->getTarget() - 1; + break; + case '<=': + $maxDepth = $comparator->getTarget(); + break; + default: + $minDepth = $maxDepth = $comparator->getTarget(); + } + } + + $flags = \RecursiveDirectoryIterator::SKIP_DOTS; + + if ($this->followLinks) { + $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS; + } + + $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs); + + if ($exclude) { + $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude); + } + + $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); + + if ($minDepth > 0 || $maxDepth < PHP_INT_MAX) { + $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth); + } + + if ($this->mode) { + $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode); + } + + if ($this->names || $this->notNames) { + $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames); + } + + if ($this->contains || $this->notContains) { + $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains); + } + + if ($this->sizes) { + $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes); + } + + if ($this->dates) { + $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates); + } + + if ($this->filters) { + $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters); + } + + if ($this->paths || $notPaths) { + $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths); + } + + if ($this->sort || $this->reverseSorting) { + $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting); + $iterator = $iteratorAggregate->getIterator(); + } + + return $iterator; + } + + /** + * Normalizes given directory names by removing trailing slashes. + * + * Excluding: (s)ftp:// or ssh2.(s)ftp:// wrapper + */ + private function normalizeDir(string $dir): string + { + if ('/' === $dir) { + return $dir; + } + + $dir = rtrim($dir, '/'.\DIRECTORY_SEPARATOR); + + if (preg_match('#^(ssh2\.)?s?ftp://#', $dir)) { + $dir .= '/'; + } + + return $dir; + } +} diff --git a/vendor/symfony/finder/Gitignore.php b/vendor/symfony/finder/Gitignore.php new file mode 100644 index 0000000..5ffe585 --- /dev/null +++ b/vendor/symfony/finder/Gitignore.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder; + +/** + * Gitignore matches against text. + * + * @author Ahmed Abdou + */ +class Gitignore +{ + /** + * Returns a regexp which is the equivalent of the gitignore pattern. + * + * @return string The regexp + */ + public static function toRegex(string $gitignoreFileContent): string + { + $gitignoreFileContent = preg_replace('/^[^\\\r\n]*#.*/m', '', $gitignoreFileContent); + $gitignoreLines = preg_split('/\r\n|\r|\n/', $gitignoreFileContent); + $gitignoreLines = array_map('trim', $gitignoreLines); + $gitignoreLines = array_filter($gitignoreLines); + + $ignoreLinesPositive = array_filter($gitignoreLines, function (string $line) { + return !preg_match('/^!/', $line); + }); + + $ignoreLinesNegative = array_filter($gitignoreLines, function (string $line) { + return preg_match('/^!/', $line); + }); + + $ignoreLinesNegative = array_map(function (string $line) { + return preg_replace('/^!(.*)/', '${1}', $line); + }, $ignoreLinesNegative); + $ignoreLinesNegative = array_map([__CLASS__, 'getRegexFromGitignore'], $ignoreLinesNegative); + + $ignoreLinesPositive = array_map([__CLASS__, 'getRegexFromGitignore'], $ignoreLinesPositive); + if (empty($ignoreLinesPositive)) { + return '/^$/'; + } + + if (empty($ignoreLinesNegative)) { + return sprintf('/%s/', implode('|', $ignoreLinesPositive)); + } + + return sprintf('/(?=^(?:(?!(%s)).)*$)(%s)/', implode('|', $ignoreLinesNegative), implode('|', $ignoreLinesPositive)); + } + + private static function getRegexFromGitignore(string $gitignorePattern): string + { + $regex = '('; + if (0 === strpos($gitignorePattern, '/')) { + $gitignorePattern = substr($gitignorePattern, 1); + $regex .= '^'; + } else { + $regex .= '(^|\/)'; + } + + if ('/' === $gitignorePattern[\strlen($gitignorePattern) - 1]) { + $gitignorePattern = substr($gitignorePattern, 0, -1); + } + + $iMax = \strlen($gitignorePattern); + for ($i = 0; $i < $iMax; ++$i) { + $doubleChars = substr($gitignorePattern, $i, 2); + if ('**' === $doubleChars) { + $regex .= '.+'; + ++$i; + continue; + } + + $c = $gitignorePattern[$i]; + switch ($c) { + case '*': + $regex .= '[^\/]+'; + break; + case '/': + case '.': + case ':': + case '(': + case ')': + case '{': + case '}': + $regex .= '\\'.$c; + break; + default: + $regex .= $c; + } + } + + $regex .= '($|\/)'; + $regex .= ')'; + + return $regex; + } +} diff --git a/vendor/symfony/finder/Glob.php b/vendor/symfony/finder/Glob.php new file mode 100644 index 0000000..8447932 --- /dev/null +++ b/vendor/symfony/finder/Glob.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder; + +/** + * Glob matches globbing patterns against text. + * + * if match_glob("foo.*", "foo.bar") echo "matched\n"; + * + * // prints foo.bar and foo.baz + * $regex = glob_to_regex("foo.*"); + * for (['foo.bar', 'foo.baz', 'foo', 'bar'] as $t) + * { + * if (/$regex/) echo "matched: $car\n"; + * } + * + * Glob implements glob(3) style matching that can be used to match + * against text, rather than fetching names from a filesystem. + * + * Based on the Perl Text::Glob module. + * + * @author Fabien Potencier PHP port + * @author Richard Clamp Perl version + * @copyright 2004-2005 Fabien Potencier + * @copyright 2002 Richard Clamp + */ +class Glob +{ + /** + * Returns a regexp which is the equivalent of the glob pattern. + * + * @return string + */ + public static function toRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#') + { + $firstByte = true; + $escaping = false; + $inCurlies = 0; + $regex = ''; + $sizeGlob = \strlen($glob); + for ($i = 0; $i < $sizeGlob; ++$i) { + $car = $glob[$i]; + if ($firstByte && $strictLeadingDot && '.' !== $car) { + $regex .= '(?=[^\.])'; + } + + $firstByte = '/' === $car; + + if ($firstByte && $strictWildcardSlash && isset($glob[$i + 2]) && '**' === $glob[$i + 1].$glob[$i + 2] && (!isset($glob[$i + 3]) || '/' === $glob[$i + 3])) { + $car = '[^/]++/'; + if (!isset($glob[$i + 3])) { + $car .= '?'; + } + + if ($strictLeadingDot) { + $car = '(?=[^\.])'.$car; + } + + $car = '/(?:'.$car.')*'; + $i += 2 + isset($glob[$i + 3]); + + if ('/' === $delimiter) { + $car = str_replace('/', '\\/', $car); + } + } + + if ($delimiter === $car || '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) { + $regex .= "\\$car"; + } elseif ('*' === $car) { + $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*'); + } elseif ('?' === $car) { + $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.'); + } elseif ('{' === $car) { + $regex .= $escaping ? '\\{' : '('; + if (!$escaping) { + ++$inCurlies; + } + } elseif ('}' === $car && $inCurlies) { + $regex .= $escaping ? '}' : ')'; + if (!$escaping) { + --$inCurlies; + } + } elseif (',' === $car && $inCurlies) { + $regex .= $escaping ? ',' : '|'; + } elseif ('\\' === $car) { + if ($escaping) { + $regex .= '\\\\'; + $escaping = false; + } else { + $escaping = true; + } + + continue; + } else { + $regex .= $car; + } + $escaping = false; + } + + return $delimiter.'^'.$regex.'$'.$delimiter; + } +} diff --git a/vendor/symfony/finder/Iterator/CustomFilterIterator.php b/vendor/symfony/finder/Iterator/CustomFilterIterator.php new file mode 100644 index 0000000..a30bbd0 --- /dev/null +++ b/vendor/symfony/finder/Iterator/CustomFilterIterator.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * CustomFilterIterator filters files by applying anonymous functions. + * + * The anonymous function receives a \SplFileInfo and must return false + * to remove files. + * + * @author Fabien Potencier + */ +class CustomFilterIterator extends \FilterIterator +{ + private $filters = []; + + /** + * @param \Iterator $iterator The Iterator to filter + * @param callable[] $filters An array of PHP callbacks + * + * @throws \InvalidArgumentException + */ + public function __construct(\Iterator $iterator, array $filters) + { + foreach ($filters as $filter) { + if (!\is_callable($filter)) { + throw new \InvalidArgumentException('Invalid PHP callback.'); + } + } + $this->filters = $filters; + + parent::__construct($iterator); + } + + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + $fileinfo = $this->current(); + + foreach ($this->filters as $filter) { + if (false === $filter($fileinfo)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php new file mode 100644 index 0000000..2e97e00 --- /dev/null +++ b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +use Symfony\Component\Finder\Comparator\DateComparator; + +/** + * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). + * + * @author Fabien Potencier + */ +class DateRangeFilterIterator extends \FilterIterator +{ + private $comparators = []; + + /** + * @param \Iterator $iterator The Iterator to filter + * @param DateComparator[] $comparators An array of DateComparator instances + */ + public function __construct(\Iterator $iterator, array $comparators) + { + $this->comparators = $comparators; + + parent::__construct($iterator); + } + + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + $fileinfo = $this->current(); + + if (!file_exists($fileinfo->getPathname())) { + return false; + } + + $filedate = $fileinfo->getMTime(); + foreach ($this->comparators as $compare) { + if (!$compare->test($filedate)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php new file mode 100644 index 0000000..436a66d --- /dev/null +++ b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * DepthRangeFilterIterator limits the directory depth. + * + * @author Fabien Potencier + */ +class DepthRangeFilterIterator extends \FilterIterator +{ + private $minDepth = 0; + + /** + * @param \RecursiveIteratorIterator $iterator The Iterator to filter + * @param int $minDepth The min depth + * @param int $maxDepth The max depth + */ + public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = PHP_INT_MAX) + { + $this->minDepth = $minDepth; + $iterator->setMaxDepth(PHP_INT_MAX === $maxDepth ? -1 : $maxDepth); + + parent::__construct($iterator); + } + + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + return $this->getInnerIterator()->getDepth() >= $this->minDepth; + } +} diff --git a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php new file mode 100644 index 0000000..6a1b291 --- /dev/null +++ b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * ExcludeDirectoryFilterIterator filters out directories. + * + * @author Fabien Potencier + */ +class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator +{ + private $iterator; + private $isRecursive; + private $excludedDirs = []; + private $excludedPattern; + + /** + * @param \Iterator $iterator The Iterator to filter + * @param string[] $directories An array of directories to exclude + */ + public function __construct(\Iterator $iterator, array $directories) + { + $this->iterator = $iterator; + $this->isRecursive = $iterator instanceof \RecursiveIterator; + $patterns = []; + foreach ($directories as $directory) { + $directory = rtrim($directory, '/'); + if (!$this->isRecursive || false !== strpos($directory, '/')) { + $patterns[] = preg_quote($directory, '#'); + } else { + $this->excludedDirs[$directory] = true; + } + } + if ($patterns) { + $this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#'; + } + + parent::__construct($iterator); + } + + /** + * Filters the iterator values. + * + * @return bool True if the value should be kept, false otherwise + */ + public function accept() + { + if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) { + return false; + } + + if ($this->excludedPattern) { + $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); + $path = str_replace('\\', '/', $path); + + return !preg_match($this->excludedPattern, $path); + } + + return true; + } + + /** + * @return bool + */ + public function hasChildren() + { + return $this->isRecursive && $this->iterator->hasChildren(); + } + + public function getChildren() + { + $children = new self($this->iterator->getChildren(), []); + $children->excludedDirs = $this->excludedDirs; + $children->excludedPattern = $this->excludedPattern; + + return $children; + } +} diff --git a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php new file mode 100644 index 0000000..a4c4eec --- /dev/null +++ b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * FileTypeFilterIterator only keeps files, directories, or both. + * + * @author Fabien Potencier + */ +class FileTypeFilterIterator extends \FilterIterator +{ + const ONLY_FILES = 1; + const ONLY_DIRECTORIES = 2; + + private $mode; + + /** + * @param \Iterator $iterator The Iterator to filter + * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) + */ + public function __construct(\Iterator $iterator, int $mode) + { + $this->mode = $mode; + + parent::__construct($iterator); + } + + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + $fileinfo = $this->current(); + if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) { + return false; + } elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) { + return false; + } + + return true; + } +} diff --git a/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php new file mode 100644 index 0000000..b26a368 --- /dev/null +++ b/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). + * + * @author Fabien Potencier + * @author Włodzimierz Gajda + */ +class FilecontentFilterIterator extends MultiplePcreFilterIterator +{ + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + if (!$this->matchRegexps && !$this->noMatchRegexps) { + return true; + } + + $fileinfo = $this->current(); + + if ($fileinfo->isDir() || !$fileinfo->isReadable()) { + return false; + } + + $content = $fileinfo->getContents(); + if (!$content) { + return false; + } + + return $this->isAccepted($content); + } + + /** + * Converts string to regexp if necessary. + * + * @param string $str Pattern: string or regexp + * + * @return string regexp corresponding to a given string or regexp + */ + protected function toRegex(string $str) + { + return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; + } +} diff --git a/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/vendor/symfony/finder/Iterator/FilenameFilterIterator.php new file mode 100644 index 0000000..dedd1ca --- /dev/null +++ b/vendor/symfony/finder/Iterator/FilenameFilterIterator.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +use Symfony\Component\Finder\Glob; + +/** + * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). + * + * @author Fabien Potencier + */ +class FilenameFilterIterator extends MultiplePcreFilterIterator +{ + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + return $this->isAccepted($this->current()->getFilename()); + } + + /** + * Converts glob to regexp. + * + * PCRE patterns are left unchanged. + * Glob strings are transformed with Glob::toRegex(). + * + * @param string $str Pattern: glob or regexp + * + * @return string regexp corresponding to a given glob or regexp + */ + protected function toRegex(string $str) + { + return $this->isRegex($str) ? $str : Glob::toRegex($str); + } +} diff --git a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php new file mode 100644 index 0000000..78a34ab --- /dev/null +++ b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). + * + * @author Fabien Potencier + */ +abstract class MultiplePcreFilterIterator extends \FilterIterator +{ + protected $matchRegexps = []; + protected $noMatchRegexps = []; + + /** + * @param \Iterator $iterator The Iterator to filter + * @param string[] $matchPatterns An array of patterns that need to match + * @param string[] $noMatchPatterns An array of patterns that need to not match + */ + public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns) + { + foreach ($matchPatterns as $pattern) { + $this->matchRegexps[] = $this->toRegex($pattern); + } + + foreach ($noMatchPatterns as $pattern) { + $this->noMatchRegexps[] = $this->toRegex($pattern); + } + + parent::__construct($iterator); + } + + /** + * Checks whether the string is accepted by the regex filters. + * + * If there is no regexps defined in the class, this method will accept the string. + * Such case can be handled by child classes before calling the method if they want to + * apply a different behavior. + * + * @return bool + */ + protected function isAccepted(string $string) + { + // should at least not match one rule to exclude + foreach ($this->noMatchRegexps as $regex) { + if (preg_match($regex, $string)) { + return false; + } + } + + // should at least match one rule + if ($this->matchRegexps) { + foreach ($this->matchRegexps as $regex) { + if (preg_match($regex, $string)) { + return true; + } + } + + return false; + } + + // If there is no match rules, the file is accepted + return true; + } + + /** + * Checks whether the string is a regex. + * + * @return bool + */ + protected function isRegex(string $str) + { + if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { + $start = substr($m[1], 0, 1); + $end = substr($m[1], -1); + + if ($start === $end) { + return !preg_match('/[*?[:alnum:] \\\\]/', $start); + } + + foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) { + if ($start === $delimiters[0] && $end === $delimiters[1]) { + return true; + } + } + } + + return false; + } + + /** + * Converts string into regexp. + * + * @return string + */ + abstract protected function toRegex(string $str); +} diff --git a/vendor/symfony/finder/Iterator/PathFilterIterator.php b/vendor/symfony/finder/Iterator/PathFilterIterator.php new file mode 100644 index 0000000..67b71f4 --- /dev/null +++ b/vendor/symfony/finder/Iterator/PathFilterIterator.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * PathFilterIterator filters files by path patterns (e.g. some/special/dir). + * + * @author Fabien Potencier + * @author Włodzimierz Gajda + */ +class PathFilterIterator extends MultiplePcreFilterIterator +{ + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + $filename = $this->current()->getRelativePathname(); + + if ('\\' === \DIRECTORY_SEPARATOR) { + $filename = str_replace('\\', '/', $filename); + } + + return $this->isAccepted($filename); + } + + /** + * Converts strings to regexp. + * + * PCRE patterns are left unchanged. + * + * Default conversion: + * 'lorem/ipsum/dolor' ==> 'lorem\/ipsum\/dolor/' + * + * Use only / as directory separator (on Windows also). + * + * @param string $str Pattern: regexp or dirname + * + * @return string regexp corresponding to a given string or regexp + */ + protected function toRegex(string $str) + { + return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; + } +} diff --git a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php new file mode 100644 index 0000000..7616b14 --- /dev/null +++ b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +use Symfony\Component\Finder\Exception\AccessDeniedException; +use Symfony\Component\Finder\SplFileInfo; + +/** + * Extends the \RecursiveDirectoryIterator to support relative paths. + * + * @author Victor Berchet + */ +class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator +{ + /** + * @var bool + */ + private $ignoreUnreadableDirs; + + /** + * @var bool + */ + private $rewindable; + + // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations + private $rootPath; + private $subPath; + private $directorySeparator = '/'; + + /** + * @throws \RuntimeException + */ + public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false) + { + if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) { + throw new \RuntimeException('This iterator only support returning current as fileinfo.'); + } + + parent::__construct($path, $flags); + $this->ignoreUnreadableDirs = $ignoreUnreadableDirs; + $this->rootPath = $path; + if ('/' !== \DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) { + $this->directorySeparator = \DIRECTORY_SEPARATOR; + } + } + + /** + * Return an instance of SplFileInfo with support for relative paths. + * + * @return SplFileInfo File information + */ + public function current() + { + // the logic here avoids redoing the same work in all iterations + + if (null === $subPathname = $this->subPath) { + $subPathname = $this->subPath = (string) $this->getSubPath(); + } + if ('' !== $subPathname) { + $subPathname .= $this->directorySeparator; + } + $subPathname .= $this->getFilename(); + + if ('/' !== $basePath = $this->rootPath) { + $basePath .= $this->directorySeparator; + } + + return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname); + } + + /** + * @return \RecursiveIterator + * + * @throws AccessDeniedException + */ + public function getChildren() + { + try { + $children = parent::getChildren(); + + if ($children instanceof self) { + // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore + $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs; + + // performance optimization to avoid redoing the same work in all children + $children->rewindable = &$this->rewindable; + $children->rootPath = $this->rootPath; + } + + return $children; + } catch (\UnexpectedValueException $e) { + if ($this->ignoreUnreadableDirs) { + // If directory is unreadable and finder is set to ignore it, a fake empty content is returned. + return new \RecursiveArrayIterator([]); + } else { + throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e); + } + } + } + + /** + * Do nothing for non rewindable stream. + */ + public function rewind() + { + if (false === $this->isRewindable()) { + return; + } + + parent::rewind(); + } + + /** + * Checks if the stream is rewindable. + * + * @return bool true when the stream is rewindable, false otherwise + */ + public function isRewindable() + { + if (null !== $this->rewindable) { + return $this->rewindable; + } + + if (false !== $stream = @opendir($this->getPath())) { + $infos = stream_get_meta_data($stream); + closedir($stream); + + if ($infos['seekable']) { + return $this->rewindable = true; + } + } + + return $this->rewindable = false; + } +} diff --git a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php new file mode 100644 index 0000000..2aeef67 --- /dev/null +++ b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +use Symfony\Component\Finder\Comparator\NumberComparator; + +/** + * SizeRangeFilterIterator filters out files that are not in the given size range. + * + * @author Fabien Potencier + */ +class SizeRangeFilterIterator extends \FilterIterator +{ + private $comparators = []; + + /** + * @param \Iterator $iterator The Iterator to filter + * @param NumberComparator[] $comparators An array of NumberComparator instances + */ + public function __construct(\Iterator $iterator, array $comparators) + { + $this->comparators = $comparators; + + parent::__construct($iterator); + } + + /** + * Filters the iterator values. + * + * @return bool true if the value should be kept, false otherwise + */ + public function accept() + { + $fileinfo = $this->current(); + if (!$fileinfo->isFile()) { + return true; + } + + $filesize = $fileinfo->getSize(); + foreach ($this->comparators as $compare) { + if (!$compare->test($filesize)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/symfony/finder/Iterator/SortableIterator.php new file mode 100644 index 0000000..2aca397 --- /dev/null +++ b/vendor/symfony/finder/Iterator/SortableIterator.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder\Iterator; + +/** + * SortableIterator applies a sort on a given Iterator. + * + * @author Fabien Potencier + */ +class SortableIterator implements \IteratorAggregate +{ + const SORT_BY_NONE = 0; + const SORT_BY_NAME = 1; + const SORT_BY_TYPE = 2; + const SORT_BY_ACCESSED_TIME = 3; + const SORT_BY_CHANGED_TIME = 4; + const SORT_BY_MODIFIED_TIME = 5; + const SORT_BY_NAME_NATURAL = 6; + + private $iterator; + private $sort; + + /** + * @param \Traversable $iterator The Iterator to filter + * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) + * + * @throws \InvalidArgumentException + */ + public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false) + { + $this->iterator = $iterator; + $order = $reverseOrder ? -1 : 1; + + if (self::SORT_BY_NAME === $sort) { + $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { + return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); + }; + } elseif (self::SORT_BY_NAME_NATURAL === $sort) { + $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { + return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); + }; + } elseif (self::SORT_BY_TYPE === $sort) { + $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { + if ($a->isDir() && $b->isFile()) { + return -$order; + } elseif ($a->isFile() && $b->isDir()) { + return $order; + } + + return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); + }; + } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { + $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { + return $order * ($a->getATime() - $b->getATime()); + }; + } elseif (self::SORT_BY_CHANGED_TIME === $sort) { + $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { + return $order * ($a->getCTime() - $b->getCTime()); + }; + } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { + $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { + return $order * ($a->getMTime() - $b->getMTime()); + }; + } elseif (self::SORT_BY_NONE === $sort) { + $this->sort = $order; + } elseif (\is_callable($sort)) { + $this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort; + } else { + throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); + } + } + + /** + * @return \Traversable + */ + public function getIterator() + { + if (1 === $this->sort) { + return $this->iterator; + } + + $array = iterator_to_array($this->iterator, true); + + if (-1 === $this->sort) { + $array = array_reverse($array); + } else { + uasort($array, $this->sort); + } + + return new \ArrayIterator($array); + } +} diff --git a/vendor/symfony/finder/LICENSE b/vendor/symfony/finder/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/finder/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/finder/README.md b/vendor/symfony/finder/README.md new file mode 100644 index 0000000..0b19c75 --- /dev/null +++ b/vendor/symfony/finder/README.md @@ -0,0 +1,14 @@ +Finder Component +================ + +The Finder component finds files and directories via an intuitive fluent +interface. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/finder.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/finder/SplFileInfo.php b/vendor/symfony/finder/SplFileInfo.php new file mode 100644 index 0000000..65d7423 --- /dev/null +++ b/vendor/symfony/finder/SplFileInfo.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Finder; + +/** + * Extends \SplFileInfo to support relative paths. + * + * @author Fabien Potencier + */ +class SplFileInfo extends \SplFileInfo +{ + private $relativePath; + private $relativePathname; + + /** + * @param string $file The file name + * @param string $relativePath The relative path + * @param string $relativePathname The relative path name + */ + public function __construct(string $file, string $relativePath, string $relativePathname) + { + parent::__construct($file); + $this->relativePath = $relativePath; + $this->relativePathname = $relativePathname; + } + + /** + * Returns the relative path. + * + * This path does not contain the file name. + * + * @return string the relative path + */ + public function getRelativePath() + { + return $this->relativePath; + } + + /** + * Returns the relative path name. + * + * This path contains the file name. + * + * @return string the relative path name + */ + public function getRelativePathname() + { + return $this->relativePathname; + } + + public function getFilenameWithoutExtension(): string + { + $filename = $this->getFilename(); + + return pathinfo($filename, PATHINFO_FILENAME); + } + + /** + * Returns the contents of the file. + * + * @return string the contents of the file + * + * @throws \RuntimeException + */ + public function getContents() + { + set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); + $content = file_get_contents($this->getPathname()); + restore_error_handler(); + if (false === $content) { + throw new \RuntimeException($error); + } + + return $content; + } +} diff --git a/vendor/symfony/finder/composer.json b/vendor/symfony/finder/composer.json new file mode 100644 index 0000000..c1b0f32 --- /dev/null +++ b/vendor/symfony/finder/composer.json @@ -0,0 +1,33 @@ +{ + "name": "symfony/finder", + "type": "library", + "description": "Symfony Finder Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Finder\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/http-foundation/AcceptHeader.php b/vendor/symfony/http-foundation/AcceptHeader.php new file mode 100644 index 0000000..057c6b5 --- /dev/null +++ b/vendor/symfony/http-foundation/AcceptHeader.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +// Help opcache.preload discover always-needed symbols +class_exists(AcceptHeaderItem::class); + +/** + * Represents an Accept-* header. + * + * An accept header is compound with a list of items, + * sorted by descending quality. + * + * @author Jean-François Simon + */ +class AcceptHeader +{ + /** + * @var AcceptHeaderItem[] + */ + private $items = []; + + /** + * @var bool + */ + private $sorted = true; + + /** + * @param AcceptHeaderItem[] $items + */ + public function __construct(array $items) + { + foreach ($items as $item) { + $this->add($item); + } + } + + /** + * Builds an AcceptHeader instance from a string. + * + * @return self + */ + public static function fromString(?string $headerValue) + { + $index = 0; + + $parts = HeaderUtils::split($headerValue ?? '', ',;='); + + return new self(array_map(function ($subParts) use (&$index) { + $part = array_shift($subParts); + $attributes = HeaderUtils::combine($subParts); + + $item = new AcceptHeaderItem($part[0], $attributes); + $item->setIndex($index++); + + return $item; + }, $parts)); + } + + /** + * Returns header value's string representation. + * + * @return string + */ + public function __toString() + { + return implode(',', $this->items); + } + + /** + * Tests if header has given value. + * + * @return bool + */ + public function has(string $value) + { + return isset($this->items[$value]); + } + + /** + * Returns given value's item, if exists. + * + * @return AcceptHeaderItem|null + */ + public function get(string $value) + { + return $this->items[$value] ?? $this->items[explode('/', $value)[0].'/*'] ?? $this->items['*/*'] ?? $this->items['*'] ?? null; + } + + /** + * Adds an item. + * + * @return $this + */ + public function add(AcceptHeaderItem $item) + { + $this->items[$item->getValue()] = $item; + $this->sorted = false; + + return $this; + } + + /** + * Returns all items. + * + * @return AcceptHeaderItem[] + */ + public function all() + { + $this->sort(); + + return $this->items; + } + + /** + * Filters items on their value using given regex. + * + * @return self + */ + public function filter(string $pattern) + { + return new self(array_filter($this->items, function (AcceptHeaderItem $item) use ($pattern) { + return preg_match($pattern, $item->getValue()); + })); + } + + /** + * Returns first item. + * + * @return AcceptHeaderItem|null + */ + public function first() + { + $this->sort(); + + return !empty($this->items) ? reset($this->items) : null; + } + + /** + * Sorts items by descending quality. + */ + private function sort(): void + { + if (!$this->sorted) { + uasort($this->items, function (AcceptHeaderItem $a, AcceptHeaderItem $b) { + $qA = $a->getQuality(); + $qB = $b->getQuality(); + + if ($qA === $qB) { + return $a->getIndex() > $b->getIndex() ? 1 : -1; + } + + return $qA > $qB ? -1 : 1; + }); + + $this->sorted = true; + } + } +} diff --git a/vendor/symfony/http-foundation/AcceptHeaderItem.php b/vendor/symfony/http-foundation/AcceptHeaderItem.php new file mode 100644 index 0000000..bc4014e --- /dev/null +++ b/vendor/symfony/http-foundation/AcceptHeaderItem.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * Represents an Accept-* header item. + * + * @author Jean-François Simon + */ +class AcceptHeaderItem +{ + private $value; + private $quality = 1.0; + private $index = 0; + private $attributes = []; + + public function __construct(string $value, array $attributes = []) + { + $this->value = $value; + foreach ($attributes as $name => $value) { + $this->setAttribute($name, $value); + } + } + + /** + * Builds an AcceptHeaderInstance instance from a string. + * + * @return self + */ + public static function fromString(?string $itemValue) + { + $parts = HeaderUtils::split($itemValue ?? '', ';='); + + $part = array_shift($parts); + $attributes = HeaderUtils::combine($parts); + + return new self($part[0], $attributes); + } + + /** + * Returns header value's string representation. + * + * @return string + */ + public function __toString() + { + $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : ''); + if (\count($this->attributes) > 0) { + $string .= '; '.HeaderUtils::toString($this->attributes, ';'); + } + + return $string; + } + + /** + * Set the item value. + * + * @return $this + */ + public function setValue(string $value) + { + $this->value = $value; + + return $this; + } + + /** + * Returns the item value. + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Set the item quality. + * + * @return $this + */ + public function setQuality(float $quality) + { + $this->quality = $quality; + + return $this; + } + + /** + * Returns the item quality. + * + * @return float + */ + public function getQuality() + { + return $this->quality; + } + + /** + * Set the item index. + * + * @return $this + */ + public function setIndex(int $index) + { + $this->index = $index; + + return $this; + } + + /** + * Returns the item index. + * + * @return int + */ + public function getIndex() + { + return $this->index; + } + + /** + * Tests if an attribute exists. + * + * @return bool + */ + public function hasAttribute(string $name) + { + return isset($this->attributes[$name]); + } + + /** + * Returns an attribute by its name. + * + * @param mixed $default + * + * @return mixed + */ + public function getAttribute(string $name, $default = null) + { + return isset($this->attributes[$name]) ? $this->attributes[$name] : $default; + } + + /** + * Returns all attributes. + * + * @return array + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * Set an attribute. + * + * @return $this + */ + public function setAttribute(string $name, string $value) + { + if ('q' === $name) { + $this->quality = (float) $value; + } else { + $this->attributes[$name] = $value; + } + + return $this; + } +} diff --git a/vendor/symfony/http-foundation/BinaryFileResponse.php b/vendor/symfony/http-foundation/BinaryFileResponse.php new file mode 100644 index 0000000..30eff94 --- /dev/null +++ b/vendor/symfony/http-foundation/BinaryFileResponse.php @@ -0,0 +1,354 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\HttpFoundation\File\Exception\FileException; +use Symfony\Component\HttpFoundation\File\File; + +/** + * BinaryFileResponse represents an HTTP response delivering a file. + * + * @author Niklas Fiekas + * @author stealth35 + * @author Igor Wiedler + * @author Jordan Alliot + * @author Sergey Linnik + */ +class BinaryFileResponse extends Response +{ + protected static $trustXSendfileTypeHeader = false; + + /** + * @var File + */ + protected $file; + protected $offset = 0; + protected $maxlen = -1; + protected $deleteFileAfterSend = false; + + /** + * @param \SplFileInfo|string $file The file to stream + * @param int $status The response status code + * @param array $headers An array of response headers + * @param bool $public Files are public by default + * @param string|null $contentDisposition The type of Content-Disposition to set automatically with the filename + * @param bool $autoEtag Whether the ETag header should be automatically set + * @param bool $autoLastModified Whether the Last-Modified header should be automatically set + */ + public function __construct($file, int $status = 200, array $headers = [], bool $public = true, string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true) + { + parent::__construct(null, $status, $headers); + + $this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified); + + if ($public) { + $this->setPublic(); + } + } + + /** + * @param \SplFileInfo|string $file The file to stream + * @param int $status The response status code + * @param array $headers An array of response headers + * @param bool $public Files are public by default + * @param string|null $contentDisposition The type of Content-Disposition to set automatically with the filename + * @param bool $autoEtag Whether the ETag header should be automatically set + * @param bool $autoLastModified Whether the Last-Modified header should be automatically set + * + * @return static + */ + public static function create($file = null, int $status = 200, array $headers = [], bool $public = true, string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true) + { + return new static($file, $status, $headers, $public, $contentDisposition, $autoEtag, $autoLastModified); + } + + /** + * Sets the file to stream. + * + * @param \SplFileInfo|string $file The file to stream + * + * @return $this + * + * @throws FileException + */ + public function setFile($file, string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true) + { + if (!$file instanceof File) { + if ($file instanceof \SplFileInfo) { + $file = new File($file->getPathname()); + } else { + $file = new File((string) $file); + } + } + + if (!$file->isReadable()) { + throw new FileException('File must be readable.'); + } + + $this->file = $file; + + if ($autoEtag) { + $this->setAutoEtag(); + } + + if ($autoLastModified) { + $this->setAutoLastModified(); + } + + if ($contentDisposition) { + $this->setContentDisposition($contentDisposition); + } + + return $this; + } + + /** + * Gets the file. + * + * @return File The file to stream + */ + public function getFile() + { + return $this->file; + } + + /** + * Automatically sets the Last-Modified header according the file modification date. + */ + public function setAutoLastModified() + { + $this->setLastModified(\DateTime::createFromFormat('U', $this->file->getMTime())); + + return $this; + } + + /** + * Automatically sets the ETag header according to the checksum of the file. + */ + public function setAutoEtag() + { + $this->setEtag(base64_encode(hash_file('sha256', $this->file->getPathname(), true))); + + return $this; + } + + /** + * Sets the Content-Disposition header with the given filename. + * + * @param string $disposition ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT + * @param string $filename Optionally use this UTF-8 encoded filename instead of the real name of the file + * @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename + * + * @return $this + */ + public function setContentDisposition(string $disposition, string $filename = '', string $filenameFallback = '') + { + if ('' === $filename) { + $filename = $this->file->getFilename(); + } + + if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || false !== strpos($filename, '%'))) { + $encoding = mb_detect_encoding($filename, null, true) ?: '8bit'; + + for ($i = 0, $filenameLength = mb_strlen($filename, $encoding); $i < $filenameLength; ++$i) { + $char = mb_substr($filename, $i, 1, $encoding); + + if ('%' === $char || \ord($char) < 32 || \ord($char) > 126) { + $filenameFallback .= '_'; + } else { + $filenameFallback .= $char; + } + } + } + + $dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback); + $this->headers->set('Content-Disposition', $dispositionHeader); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function prepare(Request $request) + { + if (!$this->headers->has('Content-Type')) { + $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream'); + } + + if ('HTTP/1.0' !== $request->server->get('SERVER_PROTOCOL')) { + $this->setProtocolVersion('1.1'); + } + + $this->ensureIEOverSSLCompatibility($request); + + $this->offset = 0; + $this->maxlen = -1; + + if (false === $fileSize = $this->file->getSize()) { + return $this; + } + $this->headers->set('Content-Length', $fileSize); + + if (!$this->headers->has('Accept-Ranges')) { + // Only accept ranges on safe HTTP methods + $this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none'); + } + + if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) { + // Use X-Sendfile, do not send any content. + $type = $request->headers->get('X-Sendfile-Type'); + $path = $this->file->getRealPath(); + // Fall back to scheme://path for stream wrapped locations. + if (false === $path) { + $path = $this->file->getPathname(); + } + if ('x-accel-redirect' === strtolower($type)) { + // Do X-Accel-Mapping substitutions. + // @link https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-redirect + $parts = HeaderUtils::split($request->headers->get('X-Accel-Mapping', ''), ',='); + foreach ($parts as $part) { + list($pathPrefix, $location) = $part; + if (substr($path, 0, \strlen($pathPrefix)) === $pathPrefix) { + $path = $location.substr($path, \strlen($pathPrefix)); + // Only set X-Accel-Redirect header if a valid URI can be produced + // as nginx does not serve arbitrary file paths. + $this->headers->set($type, $path); + $this->maxlen = 0; + break; + } + } + } else { + $this->headers->set($type, $path); + $this->maxlen = 0; + } + } elseif ($request->headers->has('Range')) { + // Process the range headers. + if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) { + $range = $request->headers->get('Range'); + + list($start, $end) = explode('-', substr($range, 6), 2) + [0]; + + $end = ('' === $end) ? $fileSize - 1 : (int) $end; + + if ('' === $start) { + $start = $fileSize - $end; + $end = $fileSize - 1; + } else { + $start = (int) $start; + } + + if ($start <= $end) { + if ($start < 0 || $end > $fileSize - 1) { + $this->setStatusCode(416); + $this->headers->set('Content-Range', sprintf('bytes */%s', $fileSize)); + } elseif (0 !== $start || $end !== $fileSize - 1) { + $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1; + $this->offset = $start; + + $this->setStatusCode(206); + $this->headers->set('Content-Range', sprintf('bytes %s-%s/%s', $start, $end, $fileSize)); + $this->headers->set('Content-Length', $end - $start + 1); + } + } + } + } + + return $this; + } + + private function hasValidIfRangeHeader(?string $header): bool + { + if ($this->getEtag() === $header) { + return true; + } + + if (null === $lastModified = $this->getLastModified()) { + return false; + } + + return $lastModified->format('D, d M Y H:i:s').' GMT' === $header; + } + + /** + * Sends the file. + * + * {@inheritdoc} + */ + public function sendContent() + { + if (!$this->isSuccessful()) { + return parent::sendContent(); + } + + if (0 === $this->maxlen) { + return $this; + } + + $out = fopen('php://output', 'wb'); + $file = fopen($this->file->getPathname(), 'rb'); + + stream_copy_to_stream($file, $out, $this->maxlen, $this->offset); + + fclose($out); + fclose($file); + + if ($this->deleteFileAfterSend && file_exists($this->file->getPathname())) { + unlink($this->file->getPathname()); + } + + return $this; + } + + /** + * {@inheritdoc} + * + * @throws \LogicException when the content is not null + */ + public function setContent(?string $content) + { + if (null !== $content) { + throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getContent() + { + return false; + } + + /** + * Trust X-Sendfile-Type header. + */ + public static function trustXSendfileTypeHeader() + { + self::$trustXSendfileTypeHeader = true; + } + + /** + * If this is set to true, the file will be unlinked after the request is sent + * Note: If the X-Sendfile header is used, the deleteFileAfterSend setting will not be used. + * + * @return $this + */ + public function deleteFileAfterSend(bool $shouldDelete = true) + { + $this->deleteFileAfterSend = $shouldDelete; + + return $this; + } +} diff --git a/vendor/symfony/http-foundation/CHANGELOG.md b/vendor/symfony/http-foundation/CHANGELOG.md new file mode 100644 index 0000000..60fab83 --- /dev/null +++ b/vendor/symfony/http-foundation/CHANGELOG.md @@ -0,0 +1,265 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added `Cookie::withValue`, `Cookie::withDomain`, `Cookie::withExpires`, + `Cookie::withPath`, `Cookie::withSecure`, `Cookie::withHttpOnly`, + `Cookie::withRaw`, `Cookie::withSameSite` + * Deprecate `Response::create()`, `JsonResponse::create()`, + `RedirectResponse::create()`, and `StreamedResponse::create()` methods (use + `__construct()` instead) + * added `Request::preferSafeContent()` and `Response::setContentSafe()` to handle "safe" HTTP preference + according to [RFC 8674](https://tools.ietf.org/html/rfc8674) + * made the Mime component an optional dependency + * added `MarshallingSessionHandler`, `IdentityMarshaller` + * made `Session` accept a callback to report when the session is being used + * Add support for all core cache control directives + * Added `Symfony\Component\HttpFoundation\InputBag` + * Deprecated retrieving non-string values using `InputBag::get()`, use `InputBag::all()` if you need access to the collection of values + +5.0.0 +----- + + * made `Cookie` auto-secure and lax by default + * removed classes in the `MimeType` namespace, use the Symfony Mime component instead + * removed method `UploadedFile::getClientSize()` and the related constructor argument + * made `Request::getSession()` throw if the session has not been set before + * removed `Response::HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL` + * passing a null url when instantiating a `RedirectResponse` is not allowed + +4.4.0 +----- + + * passing arguments to `Request::isMethodSafe()` is deprecated. + * `ApacheRequest` is deprecated, use the `Request` class instead. + * passing a third argument to `HeaderBag::get()` is deprecated, use method `all()` instead + * [BC BREAK] `PdoSessionHandler` with MySQL changed the type of the lifetime column, + make sure to run `ALTER TABLE sessions MODIFY sess_lifetime INTEGER UNSIGNED NOT NULL` to + update your database. + * `PdoSessionHandler` now precalculates the expiry timestamp in the lifetime column, + make sure to run `CREATE INDEX EXPIRY ON sessions (sess_lifetime)` to update your database + to speed up garbage collection of expired sessions. + * added `SessionHandlerFactory` to create session handlers with a DSN + * added `IpUtils::anonymize()` to help with GDPR compliance. + +4.3.0 +----- + + * added PHPUnit constraints: `RequestAttributeValueSame`, `ResponseCookieValueSame`, `ResponseHasCookie`, + `ResponseHasHeader`, `ResponseHeaderSame`, `ResponseIsRedirected`, `ResponseIsSuccessful`, and `ResponseStatusCodeSame` + * deprecated `MimeTypeGuesserInterface` and `ExtensionGuesserInterface` in favor of `Symfony\Component\Mime\MimeTypesInterface`. + * deprecated `MimeType` and `MimeTypeExtensionGuesser` in favor of `Symfony\Component\Mime\MimeTypes`. + * deprecated `FileBinaryMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileBinaryMimeTypeGuesser`. + * deprecated `FileinfoMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileinfoMimeTypeGuesser`. + * added `UrlHelper` that allows to get an absolute URL and a relative path for a given path + +4.2.0 +----- + + * the default value of the "$secure" and "$samesite" arguments of Cookie's constructor + will respectively change from "false" to "null" and from "null" to "lax" in Symfony + 5.0, you should define their values explicitly or use "Cookie::create()" instead. + * added `matchPort()` in RequestMatcher + +4.1.3 +----- + + * [BC BREAK] Support for the IIS-only `X_ORIGINAL_URL` and `X_REWRITE_URL` + HTTP headers has been dropped for security reasons. + +4.1.0 +----- + + * Query string normalization uses `parse_str()` instead of custom parsing logic. + * Passing the file size to the constructor of the `UploadedFile` class is deprecated. + * The `getClientSize()` method of the `UploadedFile` class is deprecated. Use `getSize()` instead. + * added `RedisSessionHandler` to use Redis as a session storage + * The `get()` method of the `AcceptHeader` class now takes into account the + `*` and `*/*` default values (if they are present in the Accept HTTP header) + when looking for items. + * deprecated `Request::getSession()` when no session has been set. Use `Request::hasSession()` instead. + * added `CannotWriteFileException`, `ExtensionFileException`, `FormSizeFileException`, + `IniSizeFileException`, `NoFileException`, `NoTmpDirFileException`, `PartialFileException` to + handle failed `UploadedFile`. + * added `MigratingSessionHandler` for migrating between two session handlers without losing sessions + * added `HeaderUtils`. + +4.0.0 +----- + + * the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` + methods have been removed + * the `Request::HEADER_CLIENT_IP` constant has been removed, use + `Request::HEADER_X_FORWARDED_FOR` instead + * the `Request::HEADER_CLIENT_HOST` constant has been removed, use + `Request::HEADER_X_FORWARDED_HOST` instead + * the `Request::HEADER_CLIENT_PROTO` constant has been removed, use + `Request::HEADER_X_FORWARDED_PROTO` instead + * the `Request::HEADER_CLIENT_PORT` constant has been removed, use + `Request::HEADER_X_FORWARDED_PORT` instead + * checking for cacheable HTTP methods using the `Request::isMethodSafe()` + method (by not passing `false` as its argument) is not supported anymore and + throws a `\BadMethodCallException` + * the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes have been removed + * setting session save handlers that do not implement `\SessionHandlerInterface` in + `NativeSessionStorage::setSaveHandler()` is not supported anymore and throws a + `\TypeError` + +3.4.0 +----- + + * implemented PHP 7.0's `SessionUpdateTimestampHandlerInterface` with a new + `AbstractSessionHandler` base class and a new `StrictSessionHandler` wrapper + * deprecated the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes + * deprecated setting session save handlers that do not implement `\SessionHandlerInterface` in `NativeSessionStorage::setSaveHandler()` + * deprecated using `MongoDbSessionHandler` with the legacy mongo extension; use it with the mongodb/mongodb package and ext-mongodb instead + * deprecated `MemcacheSessionHandler`; use `MemcachedSessionHandler` instead + +3.3.0 +----- + + * the `Request::setTrustedProxies()` method takes a new `$trustedHeaderSet` argument, + see https://symfony.com/doc/current/deployment/proxies.html for more info, + * deprecated the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` methods, + * added `File\Stream`, to be passed to `BinaryFileResponse` when the size of the served file is unknown, + disabling `Range` and `Content-Length` handling, switching to chunked encoding instead + * added the `Cookie::fromString()` method that allows to create a cookie from a + raw header string + +3.1.0 +----- + + * Added support for creating `JsonResponse` with a string of JSON data + +3.0.0 +----- + + * The precedence of parameters returned from `Request::get()` changed from "GET, PATH, BODY" to "PATH, GET, BODY" + +2.8.0 +----- + + * Finding deep items in `ParameterBag::get()` is deprecated since version 2.8 and + will be removed in 3.0. + +2.6.0 +----- + + * PdoSessionHandler changes + - implemented different session locking strategies to prevent loss of data by concurrent access to the same session + - [BC BREAK] save session data in a binary column without base64_encode + - [BC BREAK] added lifetime column to the session table which allows to have different lifetimes for each session + - implemented lazy connections that are only opened when a session is used by either passing a dsn string + explicitly or falling back to session.save_path ini setting + - added a createTable method that initializes a correctly defined table depending on the database vendor + +2.5.0 +----- + + * added `JsonResponse::setEncodingOptions()` & `JsonResponse::getEncodingOptions()` for easier manipulation + of the options used while encoding data to JSON format. + +2.4.0 +----- + + * added RequestStack + * added Request::getEncodings() + * added accessors methods to session handlers + +2.3.0 +----- + + * added support for ranges of IPs in trusted proxies + * `UploadedFile::isValid` now returns false if the file was not uploaded via HTTP (in a non-test mode) + * Improved error-handling of `\Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler` + to ensure the supplied PDO handler throws Exceptions on error (as the class expects). Added related test cases + to verify that Exceptions are properly thrown when the PDO queries fail. + +2.2.0 +----- + + * fixed the Request::create() precedence (URI information always take precedence now) + * added Request::getTrustedProxies() + * deprecated Request::isProxyTrusted() + * [BC BREAK] JsonResponse does not turn a top level empty array to an object anymore, use an ArrayObject to enforce objects + * added a IpUtils class to check if an IP belongs to a CIDR + * added Request::getRealMethod() to get the "real" HTTP method (getMethod() returns the "intended" HTTP method) + * disabled _method request parameter support by default (call Request::enableHttpMethodParameterOverride() to + enable it, and Request::getHttpMethodParameterOverride() to check if it is supported) + * Request::splitHttpAcceptHeader() method is deprecated and will be removed in 2.3 + * Deprecated Flashbag::count() and \Countable interface, will be removed in 2.3 + +2.1.0 +----- + + * added Request::getSchemeAndHttpHost() and Request::getUserInfo() + * added a fluent interface to the Response class + * added Request::isProxyTrusted() + * added JsonResponse + * added a getTargetUrl method to RedirectResponse + * added support for streamed responses + * made Response::prepare() method the place to enforce HTTP specification + * [BC BREAK] moved management of the locale from the Session class to the Request class + * added a generic access to the PHP built-in filter mechanism: ParameterBag::filter() + * made FileBinaryMimeTypeGuesser command configurable + * added Request::getUser() and Request::getPassword() + * added support for the PATCH method in Request + * removed the ContentTypeMimeTypeGuesser class as it is deprecated and never used on PHP 5.3 + * added ResponseHeaderBag::makeDisposition() (implements RFC 6266) + * made mimetype to extension conversion configurable + * [BC BREAK] Moved all session related classes and interfaces into own namespace, as + `Symfony\Component\HttpFoundation\Session` and renamed classes accordingly. + Session handlers are located in the subnamespace `Symfony\Component\HttpFoundation\Session\Handler`. + * SessionHandlers must implement `\SessionHandlerInterface` or extend from the + `Symfony\Component\HttpFoundation\Storage\Handler\NativeSessionHandler` base class. + * Added internal storage driver proxy mechanism for forward compatibility with + PHP 5.4 `\SessionHandler` class. + * Added session handlers for custom Memcache, Memcached and Null session save handlers. + * [BC BREAK] Removed `NativeSessionStorage` and replaced with `NativeFileSessionHandler`. + * [BC BREAK] `SessionStorageInterface` methods removed: `write()`, `read()` and + `remove()`. Added `getBag()`, `registerBag()`. The `NativeSessionStorage` class + is a mediator for the session storage internals including the session handlers + which do the real work of participating in the internal PHP session workflow. + * [BC BREAK] Introduced mock implementations of `SessionStorage` to enable unit + and functional testing without starting real PHP sessions. Removed + `ArraySessionStorage`, and replaced with `MockArraySessionStorage` for unit + tests; removed `FilesystemSessionStorage`, and replaced with`MockFileSessionStorage` + for functional tests. These do not interact with global session ini + configuration values, session functions or `$_SESSION` superglobal. This means + they can be configured directly allowing multiple instances to work without + conflicting in the same PHP process. + * [BC BREAK] Removed the `close()` method from the `Session` class, as this is + now redundant. + * Deprecated the following methods from the Session class: `setFlash()`, `setFlashes()` + `getFlash()`, `hasFlash()`, and `removeFlash()`. Use `getFlashBag()` instead + which returns a `FlashBagInterface`. + * `Session->clear()` now only clears session attributes as before it cleared + flash messages and attributes. `Session->getFlashBag()->all()` clears flashes now. + * Session data is now managed by `SessionBagInterface` to better encapsulate + session data. + * Refactored session attribute and flash messages system to their own + `SessionBagInterface` implementations. + * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This + implementation is ESI compatible. + * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire + behavior of messages auto expiring after one page page load. Messages must + be retrieved by `get()` or `all()`. + * Added `Symfony\Component\HttpFoundation\Attribute\AttributeBag` to replicate + attributes storage behavior from 2.0.x (default). + * Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for + namespace session attributes. + * Flash API can stores messages in an array so there may be multiple messages + per flash type. The old `Session` class API remains without BC break as it + will allow single messages as before. + * Added basic session meta-data to the session to record session create time, + last updated time, and the lifetime of the session cookie that was provided + to the client. + * Request::getClientIp() method doesn't take a parameter anymore but bases + itself on the trustProxy parameter. + * Added isMethod() to Request object. + * [BC BREAK] The methods `getPathInfo()`, `getBaseUrl()` and `getBasePath()` of + a `Request` now all return a raw value (vs a urldecoded value before). Any call + to one of these methods must be checked and wrapped in a `rawurldecode()` if + needed. diff --git a/vendor/symfony/http-foundation/Cookie.php b/vendor/symfony/http-foundation/Cookie.php new file mode 100644 index 0000000..fa03ac3 --- /dev/null +++ b/vendor/symfony/http-foundation/Cookie.php @@ -0,0 +1,411 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * Represents a cookie. + * + * @author Johannes M. Schmitt + */ +class Cookie +{ + const SAMESITE_NONE = 'none'; + const SAMESITE_LAX = 'lax'; + const SAMESITE_STRICT = 'strict'; + + protected $name; + protected $value; + protected $domain; + protected $expire; + protected $path; + protected $secure; + protected $httpOnly; + + private $raw; + private $sameSite; + private $secureDefault = false; + + private static $reservedCharsList = "=,; \t\r\n\v\f"; + private static $reservedCharsFrom = ['=', ',', ';', ' ', "\t", "\r", "\n", "\v", "\f"]; + private static $reservedCharsTo = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C']; + + /** + * Creates cookie from raw header string. + * + * @return static + */ + public static function fromString(string $cookie, bool $decode = false) + { + $data = [ + 'expires' => 0, + 'path' => '/', + 'domain' => null, + 'secure' => false, + 'httponly' => false, + 'raw' => !$decode, + 'samesite' => null, + ]; + + $parts = HeaderUtils::split($cookie, ';='); + $part = array_shift($parts); + + $name = $decode ? urldecode($part[0]) : $part[0]; + $value = isset($part[1]) ? ($decode ? urldecode($part[1]) : $part[1]) : null; + + $data = HeaderUtils::combine($parts) + $data; + + if (isset($data['max-age'])) { + $data['expires'] = time() + (int) $data['max-age']; + } + + return new static($name, $value, $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite']); + } + + public static function create(string $name, string $value = null, $expire = 0, ?string $path = '/', string $domain = null, bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = self::SAMESITE_LAX): self + { + return new self($name, $value, $expire, $path, $domain, $secure, $httpOnly, $raw, $sameSite); + } + + /** + * @param string $name The name of the cookie + * @param string|null $value The value of the cookie + * @param int|string|\DateTimeInterface $expire The time the cookie expires + * @param string $path The path on the server in which the cookie will be available on + * @param string|null $domain The domain that the cookie is available to + * @param bool|null $secure Whether the client should send back the cookie only over HTTPS or null to auto-enable this when the request is already using HTTPS + * @param bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol + * @param bool $raw Whether the cookie value should be sent with no url encoding + * @param string|null $sameSite Whether the cookie will be available for cross-site requests + * + * @throws \InvalidArgumentException + */ + public function __construct(string $name, string $value = null, $expire = 0, ?string $path = '/', string $domain = null, bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = 'lax') + { + // from PHP source code + if ($raw && false !== strpbrk($name, self::$reservedCharsList)) { + throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name)); + } + + if (empty($name)) { + throw new \InvalidArgumentException('The cookie name cannot be empty.'); + } + + $this->name = $name; + $this->value = $value; + $this->domain = $domain; + $this->expire = $this->withExpires($expire)->expire; + $this->path = empty($path) ? '/' : $path; + $this->secure = $secure; + $this->httpOnly = $httpOnly; + $this->raw = $raw; + $this->sameSite = $this->withSameSite($sameSite)->sameSite; + } + + /** + * Creates a cookie copy with a new value. + * + * @return static + */ + public function withValue(?string $value): self + { + $cookie = clone $this; + $cookie->value = $value; + + return $cookie; + } + + /** + * Creates a cookie copy with a new domain that the cookie is available to. + * + * @return static + */ + public function withDomain(?string $domain): self + { + $cookie = clone $this; + $cookie->domain = $domain; + + return $cookie; + } + + /** + * Creates a cookie copy with a new time the cookie expires. + * + * @param int|string|\DateTimeInterface $expire + * + * @return static + */ + public function withExpires($expire = 0): self + { + // convert expiration time to a Unix timestamp + if ($expire instanceof \DateTimeInterface) { + $expire = $expire->format('U'); + } elseif (!is_numeric($expire)) { + $expire = strtotime($expire); + + if (false === $expire) { + throw new \InvalidArgumentException('The cookie expiration time is not valid.'); + } + } + + $cookie = clone $this; + $cookie->expire = 0 < $expire ? (int) $expire : 0; + + return $cookie; + } + + /** + * Creates a cookie copy with a new path on the server in which the cookie will be available on. + * + * @return static + */ + public function withPath(string $path): self + { + $cookie = clone $this; + $cookie->path = '' === $path ? '/' : $path; + + return $cookie; + } + + /** + * Creates a cookie copy that only be transmitted over a secure HTTPS connection from the client. + * + * @return static + */ + public function withSecure(bool $secure = true): self + { + $cookie = clone $this; + $cookie->secure = $secure; + + return $cookie; + } + + /** + * Creates a cookie copy that be accessible only through the HTTP protocol. + * + * @return static + */ + public function withHttpOnly(bool $httpOnly = true): self + { + $cookie = clone $this; + $cookie->httpOnly = $httpOnly; + + return $cookie; + } + + /** + * Creates a cookie copy that uses no url encoding. + * + * @return static + */ + public function withRaw(bool $raw = true): self + { + if ($raw && false !== strpbrk($this->name, self::$reservedCharsList)) { + throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $this->name)); + } + + $cookie = clone $this; + $cookie->raw = $raw; + + return $cookie; + } + + /** + * Creates a cookie copy with SameSite attribute. + * + * @return static + */ + public function withSameSite(?string $sameSite): self + { + if ('' === $sameSite) { + $sameSite = null; + } elseif (null !== $sameSite) { + $sameSite = strtolower($sameSite); + } + + if (!\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) { + throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.'); + } + + $cookie = clone $this; + $cookie->sameSite = $sameSite; + + return $cookie; + } + + /** + * Returns the cookie as a string. + * + * @return string The cookie + */ + public function __toString() + { + if ($this->isRaw()) { + $str = $this->getName(); + } else { + $str = str_replace(self::$reservedCharsFrom, self::$reservedCharsTo, $this->getName()); + } + + $str .= '='; + + if ('' === (string) $this->getValue()) { + $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; Max-Age=0'; + } else { + $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue()); + + if (0 !== $this->getExpiresTime()) { + $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge(); + } + } + + if ($this->getPath()) { + $str .= '; path='.$this->getPath(); + } + + if ($this->getDomain()) { + $str .= '; domain='.$this->getDomain(); + } + + if (true === $this->isSecure()) { + $str .= '; secure'; + } + + if (true === $this->isHttpOnly()) { + $str .= '; httponly'; + } + + if (null !== $this->getSameSite()) { + $str .= '; samesite='.$this->getSameSite(); + } + + return $str; + } + + /** + * Gets the name of the cookie. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Gets the value of the cookie. + * + * @return string|null + */ + public function getValue() + { + return $this->value; + } + + /** + * Gets the domain that the cookie is available to. + * + * @return string|null + */ + public function getDomain() + { + return $this->domain; + } + + /** + * Gets the time the cookie expires. + * + * @return int + */ + public function getExpiresTime() + { + return $this->expire; + } + + /** + * Gets the max-age attribute. + * + * @return int + */ + public function getMaxAge() + { + $maxAge = $this->expire - time(); + + return 0 >= $maxAge ? 0 : $maxAge; + } + + /** + * Gets the path on the server in which the cookie will be available on. + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client. + * + * @return bool + */ + public function isSecure() + { + return $this->secure ?? $this->secureDefault; + } + + /** + * Checks whether the cookie will be made accessible only through the HTTP protocol. + * + * @return bool + */ + public function isHttpOnly() + { + return $this->httpOnly; + } + + /** + * Whether this cookie is about to be cleared. + * + * @return bool + */ + public function isCleared() + { + return 0 !== $this->expire && $this->expire < time(); + } + + /** + * Checks if the cookie value should be sent with no url encoding. + * + * @return bool + */ + public function isRaw() + { + return $this->raw; + } + + /** + * Gets the SameSite attribute. + * + * @return string|null + */ + public function getSameSite() + { + return $this->sameSite; + } + + /** + * @param bool $default The default value of the "secure" flag when it is set to null + */ + public function setSecureDefault(bool $default): void + { + $this->secureDefault = $default; + } +} diff --git a/vendor/symfony/http-foundation/Exception/BadRequestException.php b/vendor/symfony/http-foundation/Exception/BadRequestException.php new file mode 100644 index 0000000..e4bb309 --- /dev/null +++ b/vendor/symfony/http-foundation/Exception/BadRequestException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Exception; + +/** + * Raised when a user sends a malformed request. + */ +class BadRequestException extends \UnexpectedValueException implements RequestExceptionInterface +{ +} diff --git a/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php b/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php new file mode 100644 index 0000000..5fcf5b4 --- /dev/null +++ b/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Exception; + +/** + * The HTTP request contains headers with conflicting information. + * + * @author Magnus Nordlander + */ +class ConflictingHeadersException extends \UnexpectedValueException implements RequestExceptionInterface +{ +} diff --git a/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php b/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php new file mode 100644 index 0000000..478d0dc --- /dev/null +++ b/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Exception; + +/** + * Interface for Request exceptions. + * + * Exceptions implementing this interface should trigger an HTTP 400 response in the application code. + */ +interface RequestExceptionInterface +{ +} diff --git a/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php b/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php new file mode 100644 index 0000000..ae7a5f1 --- /dev/null +++ b/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Exception; + +/** + * Raised when a user has performed an operation that should be considered + * suspicious from a security perspective. + */ +class SuspiciousOperationException extends \UnexpectedValueException implements RequestExceptionInterface +{ +} diff --git a/vendor/symfony/http-foundation/ExpressionRequestMatcher.php b/vendor/symfony/http-foundation/ExpressionRequestMatcher.php new file mode 100644 index 0000000..26bed7d --- /dev/null +++ b/vendor/symfony/http-foundation/ExpressionRequestMatcher.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; + +/** + * ExpressionRequestMatcher uses an expression to match a Request. + * + * @author Fabien Potencier + */ +class ExpressionRequestMatcher extends RequestMatcher +{ + private $language; + private $expression; + + public function setExpression(ExpressionLanguage $language, $expression) + { + $this->language = $language; + $this->expression = $expression; + } + + public function matches(Request $request) + { + if (!$this->language) { + throw new \LogicException('Unable to match the request as the expression language is not available.'); + } + + return $this->language->evaluate($this->expression, [ + 'request' => $request, + 'method' => $request->getMethod(), + 'path' => rawurldecode($request->getPathInfo()), + 'host' => $request->getHost(), + 'ip' => $request->getClientIp(), + 'attributes' => $request->attributes->all(), + ]) && parent::matches($request); + } +} diff --git a/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php new file mode 100644 index 0000000..136d2a9 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when the access on a file was denied. + * + * @author Bernhard Schussek + */ +class AccessDeniedException extends FileException +{ + public function __construct(string $path) + { + parent::__construct(sprintf('The file %s could not be accessed', $path)); + } +} diff --git a/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php b/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php new file mode 100644 index 0000000..c49f53a --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_CANT_WRITE error occurred with UploadedFile. + * + * @author Florent Mata + */ +class CannotWriteFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php b/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php new file mode 100644 index 0000000..ed83499 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_EXTENSION error occurred with UploadedFile. + * + * @author Florent Mata + */ +class ExtensionFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/FileException.php b/vendor/symfony/http-foundation/File/Exception/FileException.php new file mode 100644 index 0000000..fad5133 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/FileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an error occurred in the component File. + * + * @author Bernhard Schussek + */ +class FileException extends \RuntimeException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php new file mode 100644 index 0000000..31bdf68 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when a file was not found. + * + * @author Bernhard Schussek + */ +class FileNotFoundException extends FileException +{ + public function __construct(string $path) + { + parent::__construct(sprintf('The file "%s" does not exist', $path)); + } +} diff --git a/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php b/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php new file mode 100644 index 0000000..8741be0 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_FORM_SIZE error occurred with UploadedFile. + * + * @author Florent Mata + */ +class FormSizeFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php b/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php new file mode 100644 index 0000000..c8fde61 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_INI_SIZE error occurred with UploadedFile. + * + * @author Florent Mata + */ +class IniSizeFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/NoFileException.php b/vendor/symfony/http-foundation/File/Exception/NoFileException.php new file mode 100644 index 0000000..4b48cc7 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/NoFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_NO_FILE error occurred with UploadedFile. + * + * @author Florent Mata + */ +class NoFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php b/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php new file mode 100644 index 0000000..bdead2d --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_NO_TMP_DIR error occurred with UploadedFile. + * + * @author Florent Mata + */ +class NoTmpDirFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/PartialFileException.php b/vendor/symfony/http-foundation/File/Exception/PartialFileException.php new file mode 100644 index 0000000..4641efb --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/PartialFileException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an UPLOAD_ERR_PARTIAL error occurred with UploadedFile. + * + * @author Florent Mata + */ +class PartialFileException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php new file mode 100644 index 0000000..8533f99 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +class UnexpectedTypeException extends FileException +{ + public function __construct($value, string $expectedType) + { + parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, get_debug_type($value))); + } +} diff --git a/vendor/symfony/http-foundation/File/Exception/UploadException.php b/vendor/symfony/http-foundation/File/Exception/UploadException.php new file mode 100644 index 0000000..7074e76 --- /dev/null +++ b/vendor/symfony/http-foundation/File/Exception/UploadException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File\Exception; + +/** + * Thrown when an error occurred during file upload. + * + * @author Bernhard Schussek + */ +class UploadException extends FileException +{ +} diff --git a/vendor/symfony/http-foundation/File/File.php b/vendor/symfony/http-foundation/File/File.php new file mode 100644 index 0000000..e876245 --- /dev/null +++ b/vendor/symfony/http-foundation/File/File.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File; + +use Symfony\Component\HttpFoundation\File\Exception\FileException; +use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; +use Symfony\Component\Mime\MimeTypes; + +/** + * A file in the file system. + * + * @author Bernhard Schussek + */ +class File extends \SplFileInfo +{ + /** + * Constructs a new file from the given path. + * + * @param string $path The path to the file + * @param bool $checkPath Whether to check the path or not + * + * @throws FileNotFoundException If the given path is not a file + */ + public function __construct(string $path, bool $checkPath = true) + { + if ($checkPath && !is_file($path)) { + throw new FileNotFoundException($path); + } + + parent::__construct($path); + } + + /** + * Returns the extension based on the mime type. + * + * If the mime type is unknown, returns null. + * + * This method uses the mime type as guessed by getMimeType() + * to guess the file extension. + * + * @return string|null The guessed extension or null if it cannot be guessed + * + * @see MimeTypes + * @see getMimeType() + */ + public function guessExtension() + { + if (!class_exists(MimeTypes::class)) { + throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".'); + } + + return MimeTypes::getDefault()->getExtensions($this->getMimeType())[0] ?? null; + } + + /** + * Returns the mime type of the file. + * + * The mime type is guessed using a MimeTypeGuesserInterface instance, + * which uses finfo_file() then the "file" system binary, + * depending on which of those are available. + * + * @return string|null The guessed mime type (e.g. "application/pdf") + * + * @see MimeTypes + */ + public function getMimeType() + { + if (!class_exists(MimeTypes::class)) { + throw new \LogicException('You cannot guess the mime type as the Mime component is not installed. Try running "composer require symfony/mime".'); + } + + return MimeTypes::getDefault()->guessMimeType($this->getPathname()); + } + + /** + * Moves the file to a new location. + * + * @return self A File object representing the new file + * + * @throws FileException if the target file could not be created + */ + public function move(string $directory, string $name = null) + { + $target = $this->getTargetFile($directory, $name); + + set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); + $renamed = rename($this->getPathname(), $target); + restore_error_handler(); + if (!$renamed) { + throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); + } + + @chmod($target, 0666 & ~umask()); + + return $target; + } + + /** + * @return self + */ + protected function getTargetFile(string $directory, string $name = null) + { + if (!is_dir($directory)) { + if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) { + throw new FileException(sprintf('Unable to create the "%s" directory.', $directory)); + } + } elseif (!is_writable($directory)) { + throw new FileException(sprintf('Unable to write in the "%s" directory.', $directory)); + } + + $target = rtrim($directory, '/\\').\DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name)); + + return new self($target, false); + } + + /** + * Returns locale independent base name of the given path. + * + * @return string + */ + protected function getName(string $name) + { + $originalName = str_replace('\\', '/', $name); + $pos = strrpos($originalName, '/'); + $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1); + + return $originalName; + } +} diff --git a/vendor/symfony/http-foundation/File/Stream.php b/vendor/symfony/http-foundation/File/Stream.php new file mode 100644 index 0000000..69ae74c --- /dev/null +++ b/vendor/symfony/http-foundation/File/Stream.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File; + +/** + * A PHP stream of unknown size. + * + * @author Nicolas Grekas + */ +class Stream extends File +{ + /** + * {@inheritdoc} + */ + public function getSize() + { + return false; + } +} diff --git a/vendor/symfony/http-foundation/File/UploadedFile.php b/vendor/symfony/http-foundation/File/UploadedFile.php new file mode 100644 index 0000000..aa5cb9b --- /dev/null +++ b/vendor/symfony/http-foundation/File/UploadedFile.php @@ -0,0 +1,285 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\File; + +use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException; +use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException; +use Symfony\Component\HttpFoundation\File\Exception\FileException; +use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; +use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException; +use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException; +use Symfony\Component\HttpFoundation\File\Exception\NoFileException; +use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException; +use Symfony\Component\HttpFoundation\File\Exception\PartialFileException; +use Symfony\Component\Mime\MimeTypes; + +/** + * A file uploaded through a form. + * + * @author Bernhard Schussek + * @author Florian Eckerstorfer + * @author Fabien Potencier + */ +class UploadedFile extends File +{ + private $test; + private $originalName; + private $mimeType; + private $error; + + /** + * Accepts the information of the uploaded file as provided by the PHP global $_FILES. + * + * The file object is only created when the uploaded file is valid (i.e. when the + * isValid() method returns true). Otherwise the only methods that could be called + * on an UploadedFile instance are: + * + * * getClientOriginalName, + * * getClientMimeType, + * * isValid, + * * getError. + * + * Calling any other method on an non-valid instance will cause an unpredictable result. + * + * @param string $path The full temporary path to the file + * @param string $originalName The original file name of the uploaded file + * @param string|null $mimeType The type of the file as provided by PHP; null defaults to application/octet-stream + * @param int|null $error The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK + * @param bool $test Whether the test mode is active + * Local files are used in test mode hence the code should not enforce HTTP uploads + * + * @throws FileException If file_uploads is disabled + * @throws FileNotFoundException If the file does not exist + */ + public function __construct(string $path, string $originalName, string $mimeType = null, int $error = null, bool $test = false) + { + $this->originalName = $this->getName($originalName); + $this->mimeType = $mimeType ?: 'application/octet-stream'; + $this->error = $error ?: UPLOAD_ERR_OK; + $this->test = $test; + + parent::__construct($path, UPLOAD_ERR_OK === $this->error); + } + + /** + * Returns the original file name. + * + * It is extracted from the request from which the file has been uploaded. + * Then it should not be considered as a safe value. + * + * @return string The original name + */ + public function getClientOriginalName() + { + return $this->originalName; + } + + /** + * Returns the original file extension. + * + * It is extracted from the original file name that was uploaded. + * Then it should not be considered as a safe value. + * + * @return string The extension + */ + public function getClientOriginalExtension() + { + return pathinfo($this->originalName, PATHINFO_EXTENSION); + } + + /** + * Returns the file mime type. + * + * The client mime type is extracted from the request from which the file + * was uploaded, so it should not be considered as a safe value. + * + * For a trusted mime type, use getMimeType() instead (which guesses the mime + * type based on the file content). + * + * @return string The mime type + * + * @see getMimeType() + */ + public function getClientMimeType() + { + return $this->mimeType; + } + + /** + * Returns the extension based on the client mime type. + * + * If the mime type is unknown, returns null. + * + * This method uses the mime type as guessed by getClientMimeType() + * to guess the file extension. As such, the extension returned + * by this method cannot be trusted. + * + * For a trusted extension, use guessExtension() instead (which guesses + * the extension based on the guessed mime type for the file). + * + * @return string|null The guessed extension or null if it cannot be guessed + * + * @see guessExtension() + * @see getClientMimeType() + */ + public function guessClientExtension() + { + if (!class_exists(MimeTypes::class)) { + throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".'); + } + + return MimeTypes::getDefault()->getExtensions($this->getClientMimeType())[0] ?? null; + } + + /** + * Returns the upload error. + * + * If the upload was successful, the constant UPLOAD_ERR_OK is returned. + * Otherwise one of the other UPLOAD_ERR_XXX constants is returned. + * + * @return int The upload error + */ + public function getError() + { + return $this->error; + } + + /** + * Returns whether the file was uploaded successfully. + * + * @return bool True if the file has been uploaded with HTTP and no error occurred + */ + public function isValid() + { + $isOk = UPLOAD_ERR_OK === $this->error; + + return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname()); + } + + /** + * Moves the file to a new location. + * + * @return File A File object representing the new file + * + * @throws FileException if, for any reason, the file could not have been moved + */ + public function move(string $directory, string $name = null) + { + if ($this->isValid()) { + if ($this->test) { + return parent::move($directory, $name); + } + + $target = $this->getTargetFile($directory, $name); + + set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); + $moved = move_uploaded_file($this->getPathname(), $target); + restore_error_handler(); + if (!$moved) { + throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); + } + + @chmod($target, 0666 & ~umask()); + + return $target; + } + + switch ($this->error) { + case UPLOAD_ERR_INI_SIZE: + throw new IniSizeFileException($this->getErrorMessage()); + case UPLOAD_ERR_FORM_SIZE: + throw new FormSizeFileException($this->getErrorMessage()); + case UPLOAD_ERR_PARTIAL: + throw new PartialFileException($this->getErrorMessage()); + case UPLOAD_ERR_NO_FILE: + throw new NoFileException($this->getErrorMessage()); + case UPLOAD_ERR_CANT_WRITE: + throw new CannotWriteFileException($this->getErrorMessage()); + case UPLOAD_ERR_NO_TMP_DIR: + throw new NoTmpDirFileException($this->getErrorMessage()); + case UPLOAD_ERR_EXTENSION: + throw new ExtensionFileException($this->getErrorMessage()); + } + + throw new FileException($this->getErrorMessage()); + } + + /** + * Returns the maximum size of an uploaded file as configured in php.ini. + * + * @return int The maximum size of an uploaded file in bytes + */ + public static function getMaxFilesize() + { + $sizePostMax = self::parseFilesize(ini_get('post_max_size')); + $sizeUploadMax = self::parseFilesize(ini_get('upload_max_filesize')); + + return min($sizePostMax ?: PHP_INT_MAX, $sizeUploadMax ?: PHP_INT_MAX); + } + + /** + * Returns the given size from an ini value in bytes. + */ + private static function parseFilesize($size): int + { + if ('' === $size) { + return 0; + } + + $size = strtolower($size); + + $max = ltrim($size, '+'); + if (0 === strpos($max, '0x')) { + $max = \intval($max, 16); + } elseif (0 === strpos($max, '0')) { + $max = \intval($max, 8); + } else { + $max = (int) $max; + } + + switch (substr($size, -1)) { + case 't': $max *= 1024; + // no break + case 'g': $max *= 1024; + // no break + case 'm': $max *= 1024; + // no break + case 'k': $max *= 1024; + } + + return $max; + } + + /** + * Returns an informative upload error message. + * + * @return string The error message regarding the specified error code + */ + public function getErrorMessage() + { + static $errors = [ + UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).', + UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.', + UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.', + UPLOAD_ERR_NO_FILE => 'No file was uploaded.', + UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.', + UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.', + UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.', + ]; + + $errorCode = $this->error; + $maxFilesize = UPLOAD_ERR_INI_SIZE === $errorCode ? self::getMaxFilesize() / 1024 : 0; + $message = isset($errors[$errorCode]) ? $errors[$errorCode] : 'The file "%s" was not uploaded due to an unknown error.'; + + return sprintf($message, $this->getClientOriginalName(), $maxFilesize); + } +} diff --git a/vendor/symfony/http-foundation/FileBag.php b/vendor/symfony/http-foundation/FileBag.php new file mode 100644 index 0000000..5edd372 --- /dev/null +++ b/vendor/symfony/http-foundation/FileBag.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\HttpFoundation\File\UploadedFile; + +/** + * FileBag is a container for uploaded files. + * + * @author Fabien Potencier + * @author Bulat Shakirzyanov + */ +class FileBag extends ParameterBag +{ + private static $fileKeys = ['error', 'name', 'size', 'tmp_name', 'type']; + + /** + * @param array|UploadedFile[] $parameters An array of HTTP files + */ + public function __construct(array $parameters = []) + { + $this->replace($parameters); + } + + /** + * {@inheritdoc} + */ + public function replace(array $files = []) + { + $this->parameters = []; + $this->add($files); + } + + /** + * {@inheritdoc} + */ + public function set(string $key, $value) + { + if (!\is_array($value) && !$value instanceof UploadedFile) { + throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.'); + } + + parent::set($key, $this->convertFileInformation($value)); + } + + /** + * {@inheritdoc} + */ + public function add(array $files = []) + { + foreach ($files as $key => $file) { + $this->set($key, $file); + } + } + + /** + * Converts uploaded files to UploadedFile instances. + * + * @param array|UploadedFile $file A (multi-dimensional) array of uploaded file information + * + * @return UploadedFile[]|UploadedFile|null A (multi-dimensional) array of UploadedFile instances + */ + protected function convertFileInformation($file) + { + if ($file instanceof UploadedFile) { + return $file; + } + + if (\is_array($file)) { + $file = $this->fixPhpFilesArray($file); + $keys = array_keys($file); + sort($keys); + + if ($keys == self::$fileKeys) { + if (UPLOAD_ERR_NO_FILE == $file['error']) { + $file = null; + } else { + $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['error'], false); + } + } else { + $file = array_map([$this, 'convertFileInformation'], $file); + if (array_keys($keys) === $keys) { + $file = array_filter($file); + } + } + } + + return $file; + } + + /** + * Fixes a malformed PHP $_FILES array. + * + * PHP has a bug that the format of the $_FILES array differs, depending on + * whether the uploaded file fields had normal field names or array-like + * field names ("normal" vs. "parent[child]"). + * + * This method fixes the array to look like the "normal" $_FILES array. + * + * It's safe to pass an already converted array, in which case this method + * just returns the original array unmodified. + * + * @param array $data + * + * @return array + */ + protected function fixPhpFilesArray($data) + { + $keys = array_keys($data); + sort($keys); + + if (self::$fileKeys != $keys || !isset($data['name']) || !\is_array($data['name'])) { + return $data; + } + + $files = $data; + foreach (self::$fileKeys as $k) { + unset($files[$k]); + } + + foreach ($data['name'] as $key => $name) { + $files[$key] = $this->fixPhpFilesArray([ + 'error' => $data['error'][$key], + 'name' => $name, + 'type' => $data['type'][$key], + 'tmp_name' => $data['tmp_name'][$key], + 'size' => $data['size'][$key], + ]); + } + + return $files; + } +} diff --git a/vendor/symfony/http-foundation/HeaderBag.php b/vendor/symfony/http-foundation/HeaderBag.php new file mode 100644 index 0000000..d45d95e --- /dev/null +++ b/vendor/symfony/http-foundation/HeaderBag.php @@ -0,0 +1,288 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * HeaderBag is a container for HTTP headers. + * + * @author Fabien Potencier + */ +class HeaderBag implements \IteratorAggregate, \Countable +{ + protected const UPPER = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + protected const LOWER = '-abcdefghijklmnopqrstuvwxyz'; + + protected $headers = []; + protected $cacheControl = []; + + public function __construct(array $headers = []) + { + foreach ($headers as $key => $values) { + $this->set($key, $values); + } + } + + /** + * Returns the headers as a string. + * + * @return string The headers + */ + public function __toString() + { + if (!$headers = $this->all()) { + return ''; + } + + ksort($headers); + $max = max(array_map('strlen', array_keys($headers))) + 1; + $content = ''; + foreach ($headers as $name => $values) { + $name = ucwords($name, '-'); + foreach ($values as $value) { + $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value); + } + } + + return $content; + } + + /** + * Returns the headers. + * + * @param string|null $key The name of the headers to return or null to get them all + * + * @return array An array of headers + */ + public function all(string $key = null) + { + if (null !== $key) { + return $this->headers[strtr($key, self::UPPER, self::LOWER)] ?? []; + } + + return $this->headers; + } + + /** + * Returns the parameter keys. + * + * @return array An array of parameter keys + */ + public function keys() + { + return array_keys($this->all()); + } + + /** + * Replaces the current HTTP headers by a new set. + */ + public function replace(array $headers = []) + { + $this->headers = []; + $this->add($headers); + } + + /** + * Adds new headers the current HTTP headers set. + */ + public function add(array $headers) + { + foreach ($headers as $key => $values) { + $this->set($key, $values); + } + } + + /** + * Returns a header value by name. + * + * @return string|null The first header value or default value + */ + public function get(string $key, string $default = null) + { + $headers = $this->all($key); + + if (!$headers) { + return $default; + } + + if (null === $headers[0]) { + return null; + } + + return (string) $headers[0]; + } + + /** + * Sets a header by name. + * + * @param string|string[] $values The value or an array of values + * @param bool $replace Whether to replace the actual value or not (true by default) + */ + public function set(string $key, $values, bool $replace = true) + { + $key = strtr($key, self::UPPER, self::LOWER); + + if (\is_array($values)) { + $values = array_values($values); + + if (true === $replace || !isset($this->headers[$key])) { + $this->headers[$key] = $values; + } else { + $this->headers[$key] = array_merge($this->headers[$key], $values); + } + } else { + if (true === $replace || !isset($this->headers[$key])) { + $this->headers[$key] = [$values]; + } else { + $this->headers[$key][] = $values; + } + } + + if ('cache-control' === $key) { + $this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key])); + } + } + + /** + * Returns true if the HTTP header is defined. + * + * @return bool true if the parameter exists, false otherwise + */ + public function has(string $key) + { + return \array_key_exists(strtr($key, self::UPPER, self::LOWER), $this->all()); + } + + /** + * Returns true if the given HTTP header contains the given value. + * + * @return bool true if the value is contained in the header, false otherwise + */ + public function contains(string $key, string $value) + { + return \in_array($value, $this->all($key)); + } + + /** + * Removes a header. + */ + public function remove(string $key) + { + $key = strtr($key, self::UPPER, self::LOWER); + + unset($this->headers[$key]); + + if ('cache-control' === $key) { + $this->cacheControl = []; + } + } + + /** + * Returns the HTTP header value converted to a date. + * + * @return \DateTimeInterface|null The parsed DateTime or the default value if the header does not exist + * + * @throws \RuntimeException When the HTTP header is not parseable + */ + public function getDate(string $key, \DateTime $default = null) + { + if (null === $value = $this->get($key)) { + return $default; + } + + if (false === $date = \DateTime::createFromFormat(DATE_RFC2822, $value)) { + throw new \RuntimeException(sprintf('The "%s" HTTP header is not parseable (%s).', $key, $value)); + } + + return $date; + } + + /** + * Adds a custom Cache-Control directive. + * + * @param mixed $value The Cache-Control directive value + */ + public function addCacheControlDirective(string $key, $value = true) + { + $this->cacheControl[$key] = $value; + + $this->set('Cache-Control', $this->getCacheControlHeader()); + } + + /** + * Returns true if the Cache-Control directive is defined. + * + * @return bool true if the directive exists, false otherwise + */ + public function hasCacheControlDirective(string $key) + { + return \array_key_exists($key, $this->cacheControl); + } + + /** + * Returns a Cache-Control directive value by name. + * + * @return mixed|null The directive value if defined, null otherwise + */ + public function getCacheControlDirective(string $key) + { + return \array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null; + } + + /** + * Removes a Cache-Control directive. + */ + public function removeCacheControlDirective(string $key) + { + unset($this->cacheControl[$key]); + + $this->set('Cache-Control', $this->getCacheControlHeader()); + } + + /** + * Returns an iterator for headers. + * + * @return \ArrayIterator An \ArrayIterator instance + */ + public function getIterator() + { + return new \ArrayIterator($this->headers); + } + + /** + * Returns the number of headers. + * + * @return int The number of headers + */ + public function count() + { + return \count($this->headers); + } + + protected function getCacheControlHeader() + { + ksort($this->cacheControl); + + return HeaderUtils::toString($this->cacheControl, ','); + } + + /** + * Parses a Cache-Control HTTP header. + * + * @return array An array representing the attribute values + */ + protected function parseCacheControl(string $header) + { + $parts = HeaderUtils::split($header, ',='); + + return HeaderUtils::combine($parts); + } +} diff --git a/vendor/symfony/http-foundation/HeaderUtils.php b/vendor/symfony/http-foundation/HeaderUtils.php new file mode 100644 index 0000000..5866e3b --- /dev/null +++ b/vendor/symfony/http-foundation/HeaderUtils.php @@ -0,0 +1,224 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * HTTP header utility functions. + * + * @author Christian Schmidt + */ +class HeaderUtils +{ + public const DISPOSITION_ATTACHMENT = 'attachment'; + public const DISPOSITION_INLINE = 'inline'; + + /** + * This class should not be instantiated. + */ + private function __construct() + { + } + + /** + * Splits an HTTP header by one or more separators. + * + * Example: + * + * HeaderUtils::split("da, en-gb;q=0.8", ",;") + * // => ['da'], ['en-gb', 'q=0.8']] + * + * @param string $separators List of characters to split on, ordered by + * precedence, e.g. ",", ";=", or ",;=" + * + * @return array Nested array with as many levels as there are characters in + * $separators + */ + public static function split(string $header, string $separators): array + { + $quotedSeparators = preg_quote($separators, '/'); + + preg_match_all(' + / + (?!\s) + (?: + # quoted-string + "(?:[^"\\\\]|\\\\.)*(?:"|\\\\|$) + | + # token + [^"'.$quotedSeparators.']+ + )+ + (?['.$quotedSeparators.']) + \s* + /x', trim($header), $matches, PREG_SET_ORDER); + + return self::groupParts($matches, $separators); + } + + /** + * Combines an array of arrays into one associative array. + * + * Each of the nested arrays should have one or two elements. The first + * value will be used as the keys in the associative array, and the second + * will be used as the values, or true if the nested array only contains one + * element. Array keys are lowercased. + * + * Example: + * + * HeaderUtils::combine([["foo", "abc"], ["bar"]]) + * // => ["foo" => "abc", "bar" => true] + */ + public static function combine(array $parts): array + { + $assoc = []; + foreach ($parts as $part) { + $name = strtolower($part[0]); + $value = $part[1] ?? true; + $assoc[$name] = $value; + } + + return $assoc; + } + + /** + * Joins an associative array into a string for use in an HTTP header. + * + * The key and value of each entry are joined with "=", and all entries + * are joined with the specified separator and an additional space (for + * readability). Values are quoted if necessary. + * + * Example: + * + * HeaderUtils::toString(["foo" => "abc", "bar" => true, "baz" => "a b c"], ",") + * // => 'foo=abc, bar, baz="a b c"' + */ + public static function toString(array $assoc, string $separator): string + { + $parts = []; + foreach ($assoc as $name => $value) { + if (true === $value) { + $parts[] = $name; + } else { + $parts[] = $name.'='.self::quote($value); + } + } + + return implode($separator.' ', $parts); + } + + /** + * Encodes a string as a quoted string, if necessary. + * + * If a string contains characters not allowed by the "token" construct in + * the HTTP specification, it is backslash-escaped and enclosed in quotes + * to match the "quoted-string" construct. + */ + public static function quote(string $s): string + { + if (preg_match('/^[a-z0-9!#$%&\'*.^_`|~-]+$/i', $s)) { + return $s; + } + + return '"'.addcslashes($s, '"\\"').'"'; + } + + /** + * Decodes a quoted string. + * + * If passed an unquoted string that matches the "token" construct (as + * defined in the HTTP specification), it is passed through verbatimly. + */ + public static function unquote(string $s): string + { + return preg_replace('/\\\\(.)|"/', '$1', $s); + } + + /** + * Generates a HTTP Content-Disposition field-value. + * + * @param string $disposition One of "inline" or "attachment" + * @param string $filename A unicode string + * @param string $filenameFallback A string containing only ASCII characters that + * is semantically equivalent to $filename. If the filename is already ASCII, + * it can be omitted, or just copied from $filename + * + * @return string A string suitable for use as a Content-Disposition field-value + * + * @throws \InvalidArgumentException + * + * @see RFC 6266 + */ + public static function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string + { + if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) { + throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); + } + + if ('' === $filenameFallback) { + $filenameFallback = $filename; + } + + // filenameFallback is not ASCII. + if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { + throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); + } + + // percent characters aren't safe in fallback. + if (false !== strpos($filenameFallback, '%')) { + throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); + } + + // path separators aren't allowed in either. + if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) { + throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); + } + + $params = ['filename' => $filenameFallback]; + if ($filename !== $filenameFallback) { + $params['filename*'] = "utf-8''".rawurlencode($filename); + } + + return $disposition.'; '.self::toString($params, ';'); + } + + private static function groupParts(array $matches, string $separators): array + { + $separator = $separators[0]; + $partSeparators = substr($separators, 1); + + $i = 0; + $partMatches = []; + foreach ($matches as $match) { + if (isset($match['separator']) && $match['separator'] === $separator) { + ++$i; + } else { + $partMatches[$i][] = $match; + } + } + + $parts = []; + if ($partSeparators) { + foreach ($partMatches as $matches) { + $parts[] = self::groupParts($matches, $partSeparators); + } + } else { + foreach ($partMatches as $matches) { + $parts[] = self::unquote($matches[0][0]); + } + } + + return $parts; + } +} diff --git a/vendor/symfony/http-foundation/InputBag.php b/vendor/symfony/http-foundation/InputBag.php new file mode 100644 index 0000000..c83d63d --- /dev/null +++ b/vendor/symfony/http-foundation/InputBag.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\HttpFoundation\Exception\BadRequestException; + +/** + * InputBag is a container for user input values such as $_GET, $_POST, $_REQUEST, and $_COOKIE. + * + * @author Saif Eddin Gmati + */ +final class InputBag extends ParameterBag +{ + /** + * Returns a string input value by name. + * + * @param string|null $default The default value if the input key does not exist + * + * @return string|null + */ + public function get(string $key, $default = null) + { + if (null !== $default && !is_scalar($default) && !(\is_object($default) && method_exists($default, '__toString'))) { + trigger_deprecation('symfony/http-foundation', '5.1', 'Passing a non-string value as 2nd argument to "%s()" is deprecated, pass a string or null instead.', __METHOD__); + } + + $value = parent::get($key, $this); + + if (null !== $value && $this !== $value && !is_scalar($value) && !(\is_object($value) && method_exists($value, '__toString'))) { + trigger_deprecation('symfony/http-foundation', '5.1', 'Retrieving a non-string value from "%s()" is deprecated, and will throw a "%s" exception in Symfony 6.0, use "%s::all($key)" instead.', __METHOD__, BadRequestException::class, __CLASS__); + } + + return $this === $value ? $default : $value; + } + + /** + * {@inheritdoc} + */ + public function all(string $key = null): array + { + return parent::all($key); + } + + /** + * Replaces the current input values by a new set. + */ + public function replace(array $inputs = []) + { + $this->parameters = []; + $this->add($inputs); + } + + /** + * Adds input values. + */ + public function add(array $inputs = []) + { + foreach ($inputs as $input => $value) { + $this->set($input, $value); + } + } + + /** + * Sets an input by name. + * + * @param string|array|null $value + */ + public function set(string $key, $value) + { + if (null !== $value && !is_scalar($value) && !\is_array($value) && !method_exists($value, '__toString')) { + trigger_deprecation('symfony/http-foundation', '5.1', 'Passing "%s" as a 2nd Argument to "%s()" is deprecated, pass a string, array, or null instead.', get_debug_type($value), __METHOD__); + } + + $this->parameters[$key] = $value; + } + + /** + * {@inheritdoc} + */ + public function filter(string $key, $default = null, int $filter = FILTER_DEFAULT, $options = []) + { + $value = $this->has($key) ? $this->all()[$key] : $default; + + // Always turn $options into an array - this allows filter_var option shortcuts. + if (!\is_array($options) && $options) { + $options = ['flags' => $options]; + } + + if (\is_array($value) && !(($options['flags'] ?? 0) & (FILTER_REQUIRE_ARRAY | FILTER_FORCE_ARRAY))) { + trigger_deprecation('symfony/http-foundation', '5.1', 'Filtering an array value with "%s()" without passing the FILTER_REQUIRE_ARRAY or FILTER_FORCE_ARRAY flag is deprecated', __METHOD__); + + if (!isset($options['flags'])) { + $options['flags'] = FILTER_REQUIRE_ARRAY; + } + } + + return filter_var($value, $filter, $options); + } +} diff --git a/vendor/symfony/http-foundation/IpUtils.php b/vendor/symfony/http-foundation/IpUtils.php new file mode 100644 index 0000000..80c5a95 --- /dev/null +++ b/vendor/symfony/http-foundation/IpUtils.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * Http utility functions. + * + * @author Fabien Potencier + */ +class IpUtils +{ + private static $checkedIps = []; + + /** + * This class should not be instantiated. + */ + private function __construct() + { + } + + /** + * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets. + * + * @param string|array $ips List of IPs or subnets (can be a string if only a single one) + * + * @return bool Whether the IP is valid + */ + public static function checkIp(?string $requestIp, $ips) + { + if (!\is_array($ips)) { + $ips = [$ips]; + } + + $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4'; + + foreach ($ips as $ip) { + if (self::$method($requestIp, $ip)) { + return true; + } + } + + return false; + } + + /** + * Compares two IPv4 addresses. + * In case a subnet is given, it checks if it contains the request IP. + * + * @param string $ip IPv4 address or subnet in CIDR notation + * + * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet + */ + public static function checkIp4(?string $requestIp, string $ip) + { + $cacheKey = $requestIp.'-'.$ip; + if (isset(self::$checkedIps[$cacheKey])) { + return self::$checkedIps[$cacheKey]; + } + + if (!filter_var($requestIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + return self::$checkedIps[$cacheKey] = false; + } + + if (false !== strpos($ip, '/')) { + list($address, $netmask) = explode('/', $ip, 2); + + if ('0' === $netmask) { + return self::$checkedIps[$cacheKey] = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); + } + + if ($netmask < 0 || $netmask > 32) { + return self::$checkedIps[$cacheKey] = false; + } + } else { + $address = $ip; + $netmask = 32; + } + + if (false === ip2long($address)) { + return self::$checkedIps[$cacheKey] = false; + } + + return self::$checkedIps[$cacheKey] = 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask); + } + + /** + * Compares two IPv6 addresses. + * In case a subnet is given, it checks if it contains the request IP. + * + * @author David Soria Parra + * + * @see https://github.com/dsp/v6tools + * + * @param string $ip IPv6 address or subnet in CIDR notation + * + * @return bool Whether the IP is valid + * + * @throws \RuntimeException When IPV6 support is not enabled + */ + public static function checkIp6(?string $requestIp, string $ip) + { + $cacheKey = $requestIp.'-'.$ip; + if (isset(self::$checkedIps[$cacheKey])) { + return self::$checkedIps[$cacheKey]; + } + + if (!((\extension_loaded('sockets') && \defined('AF_INET6')) || @inet_pton('::1'))) { + throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".'); + } + + if (false !== strpos($ip, '/')) { + list($address, $netmask) = explode('/', $ip, 2); + + if ('0' === $netmask) { + return (bool) unpack('n*', @inet_pton($address)); + } + + if ($netmask < 1 || $netmask > 128) { + return self::$checkedIps[$cacheKey] = false; + } + } else { + $address = $ip; + $netmask = 128; + } + + $bytesAddr = unpack('n*', @inet_pton($address)); + $bytesTest = unpack('n*', @inet_pton($requestIp)); + + if (!$bytesAddr || !$bytesTest) { + return self::$checkedIps[$cacheKey] = false; + } + + for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) { + $left = $netmask - 16 * ($i - 1); + $left = ($left <= 16) ? $left : 16; + $mask = ~(0xffff >> $left) & 0xffff; + if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) { + return self::$checkedIps[$cacheKey] = false; + } + } + + return self::$checkedIps[$cacheKey] = true; + } + + /** + * Anonymizes an IP/IPv6. + * + * Removes the last byte for v4 and the last 8 bytes for v6 IPs + */ + public static function anonymize(string $ip): string + { + $wrappedIPv6 = false; + if ('[' === substr($ip, 0, 1) && ']' === substr($ip, -1, 1)) { + $wrappedIPv6 = true; + $ip = substr($ip, 1, -1); + } + + $packedAddress = inet_pton($ip); + if (4 === \strlen($packedAddress)) { + $mask = '255.255.255.0'; + } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff:ffff'))) { + $mask = '::ffff:ffff:ff00'; + } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff'))) { + $mask = '::ffff:ff00'; + } else { + $mask = 'ffff:ffff:ffff:ffff:0000:0000:0000:0000'; + } + $ip = inet_ntop($packedAddress & inet_pton($mask)); + + if ($wrappedIPv6) { + $ip = '['.$ip.']'; + } + + return $ip; + } +} diff --git a/vendor/symfony/http-foundation/JsonResponse.php b/vendor/symfony/http-foundation/JsonResponse.php new file mode 100644 index 0000000..b361d08 --- /dev/null +++ b/vendor/symfony/http-foundation/JsonResponse.php @@ -0,0 +1,219 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * Response represents an HTTP response in JSON format. + * + * Note that this class does not force the returned JSON content to be an + * object. It is however recommended that you do return an object as it + * protects yourself against XSSI and JSON-JavaScript Hijacking. + * + * @see https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/AJAX_Security_Cheat_Sheet.md#always-return-json-with-an-object-on-the-outside + * + * @author Igor Wiedler + */ +class JsonResponse extends Response +{ + protected $data; + protected $callback; + + // Encode <, >, ', &, and " characters in the JSON, making it also safe to be embedded into HTML. + // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT + const DEFAULT_ENCODING_OPTIONS = 15; + + protected $encodingOptions = self::DEFAULT_ENCODING_OPTIONS; + + /** + * @param mixed $data The response data + * @param int $status The response status code + * @param array $headers An array of response headers + * @param bool $json If the data is already a JSON string + */ + public function __construct($data = null, int $status = 200, array $headers = [], bool $json = false) + { + parent::__construct('', $status, $headers); + + if (null === $data) { + $data = new \ArrayObject(); + } + + $json ? $this->setJson($data) : $this->setData($data); + } + + /** + * Factory method for chainability. + * + * Example: + * + * return JsonResponse::create(['key' => 'value']) + * ->setSharedMaxAge(300); + * + * @param mixed $data The JSON response data + * @param int $status The response status code + * @param array $headers An array of response headers + * + * @return static + * + * @deprecated since Symfony 5.1, use __construct() instead. + */ + public static function create($data = null, int $status = 200, array $headers = []) + { + trigger_deprecation('symfony/http-foundation', '5.1', 'The "%s()" method is deprecated, use "new %s()" instead.', __METHOD__, \get_called_class()); + + return new static($data, $status, $headers); + } + + /** + * Factory method for chainability. + * + * Example: + * + * return JsonResponse::fromJsonString('{"key": "value"}') + * ->setSharedMaxAge(300); + * + * @param string|null $data The JSON response string + * @param int $status The response status code + * @param array $headers An array of response headers + * + * @return static + */ + public static function fromJsonString(string $data = null, int $status = 200, array $headers = []) + { + return new static($data, $status, $headers, true); + } + + /** + * Sets the JSONP callback. + * + * @param string|null $callback The JSONP callback or null to use none + * + * @return $this + * + * @throws \InvalidArgumentException When the callback name is not valid + */ + public function setCallback(string $callback = null) + { + if (null !== $callback) { + // partially taken from https://geekality.net/2011/08/03/valid-javascript-identifier/ + // partially taken from https://github.com/willdurand/JsonpCallbackValidator + // JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details. + // (c) William Durand + $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u'; + $reserved = [ + 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while', + 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super', 'const', 'export', + 'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false', + ]; + $parts = explode('.', $callback); + foreach ($parts as $part) { + if (!preg_match($pattern, $part) || \in_array($part, $reserved, true)) { + throw new \InvalidArgumentException('The callback name is not valid.'); + } + } + } + + $this->callback = $callback; + + return $this->update(); + } + + /** + * Sets a raw string containing a JSON document to be sent. + * + * @return $this + * + * @throws \InvalidArgumentException + */ + public function setJson(string $json) + { + $this->data = $json; + + return $this->update(); + } + + /** + * Sets the data to be sent as JSON. + * + * @param mixed $data + * + * @return $this + * + * @throws \InvalidArgumentException + */ + public function setData($data = []) + { + try { + $data = json_encode($data, $this->encodingOptions); + } catch (\Exception $e) { + if ('Exception' === \get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) { + throw $e->getPrevious() ?: $e; + } + throw $e; + } + + if (\PHP_VERSION_ID >= 70300 && (JSON_THROW_ON_ERROR & $this->encodingOptions)) { + return $this->setJson($data); + } + + if (JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException(json_last_error_msg()); + } + + return $this->setJson($data); + } + + /** + * Returns options used while encoding data to JSON. + * + * @return int + */ + public function getEncodingOptions() + { + return $this->encodingOptions; + } + + /** + * Sets options used while encoding data to JSON. + * + * @return $this + */ + public function setEncodingOptions(int $encodingOptions) + { + $this->encodingOptions = $encodingOptions; + + return $this->setData(json_decode($this->data)); + } + + /** + * Updates the content and headers according to the JSON data and callback. + * + * @return $this + */ + protected function update() + { + if (null !== $this->callback) { + // Not using application/javascript for compatibility reasons with older browsers. + $this->headers->set('Content-Type', 'text/javascript'); + + return $this->setContent(sprintf('/**/%s(%s);', $this->callback, $this->data)); + } + + // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback) + // in order to not overwrite a custom definition. + if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) { + $this->headers->set('Content-Type', 'application/json'); + } + + return $this->setContent($this->data); + } +} diff --git a/vendor/symfony/http-foundation/LICENSE b/vendor/symfony/http-foundation/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/http-foundation/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/http-foundation/ParameterBag.php b/vendor/symfony/http-foundation/ParameterBag.php new file mode 100644 index 0000000..dc45bec --- /dev/null +++ b/vendor/symfony/http-foundation/ParameterBag.php @@ -0,0 +1,219 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\HttpFoundation\Exception\BadRequestException; + +/** + * ParameterBag is a container for key/value pairs. + * + * @author Fabien Potencier + */ +class ParameterBag implements \IteratorAggregate, \Countable +{ + /** + * Parameter storage. + */ + protected $parameters; + + public function __construct(array $parameters = []) + { + $this->parameters = $parameters; + } + + /** + * Returns the parameters. + * + * @param string|null $key The name of the parameter to return or null to get them all + * + * @return array An array of parameters + */ + public function all(/*string $key = null*/) + { + $key = \func_num_args() > 0 ? func_get_arg(0) : null; + + if (null === $key) { + return $this->parameters; + } + + if (!\is_array($value = $this->parameters[$key] ?? [])) { + throw new BadRequestException(sprintf('Unexpected value for parameter "%s": expecting "array", got "%s".', $key, get_debug_type($value))); + } + + return $value; + } + + /** + * Returns the parameter keys. + * + * @return array An array of parameter keys + */ + public function keys() + { + return array_keys($this->parameters); + } + + /** + * Replaces the current parameters by a new set. + */ + public function replace(array $parameters = []) + { + $this->parameters = $parameters; + } + + /** + * Adds parameters. + */ + public function add(array $parameters = []) + { + $this->parameters = array_replace($this->parameters, $parameters); + } + + /** + * Returns a parameter by name. + * + * @param mixed $default The default value if the parameter key does not exist + * + * @return mixed + */ + public function get(string $key, $default = null) + { + return \array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default; + } + + /** + * Sets a parameter by name. + * + * @param mixed $value The value + */ + public function set(string $key, $value) + { + $this->parameters[$key] = $value; + } + + /** + * Returns true if the parameter is defined. + * + * @return bool true if the parameter exists, false otherwise + */ + public function has(string $key) + { + return \array_key_exists($key, $this->parameters); + } + + /** + * Removes a parameter. + */ + public function remove(string $key) + { + unset($this->parameters[$key]); + } + + /** + * Returns the alphabetic characters of the parameter value. + * + * @return string The filtered value + */ + public function getAlpha(string $key, string $default = '') + { + return preg_replace('/[^[:alpha:]]/', '', $this->get($key, $default)); + } + + /** + * Returns the alphabetic characters and digits of the parameter value. + * + * @return string The filtered value + */ + public function getAlnum(string $key, string $default = '') + { + return preg_replace('/[^[:alnum:]]/', '', $this->get($key, $default)); + } + + /** + * Returns the digits of the parameter value. + * + * @return string The filtered value + */ + public function getDigits(string $key, string $default = '') + { + // we need to remove - and + because they're allowed in the filter + return str_replace(['-', '+'], '', $this->filter($key, $default, FILTER_SANITIZE_NUMBER_INT)); + } + + /** + * Returns the parameter value converted to integer. + * + * @return int The filtered value + */ + public function getInt(string $key, int $default = 0) + { + return (int) $this->get($key, $default); + } + + /** + * Returns the parameter value converted to boolean. + * + * @return bool The filtered value + */ + public function getBoolean(string $key, bool $default = false) + { + return $this->filter($key, $default, FILTER_VALIDATE_BOOLEAN); + } + + /** + * Filter key. + * + * @param mixed $default Default = null + * @param int $filter FILTER_* constant + * @param mixed $options Filter options + * + * @see https://php.net/filter-var + * + * @return mixed + */ + public function filter(string $key, $default = null, int $filter = FILTER_DEFAULT, $options = []) + { + $value = $this->get($key, $default); + + // Always turn $options into an array - this allows filter_var option shortcuts. + if (!\is_array($options) && $options) { + $options = ['flags' => $options]; + } + + // Add a convenience check for arrays. + if (\is_array($value) && !isset($options['flags'])) { + $options['flags'] = FILTER_REQUIRE_ARRAY; + } + + return filter_var($value, $filter, $options); + } + + /** + * Returns an iterator for parameters. + * + * @return \ArrayIterator An \ArrayIterator instance + */ + public function getIterator() + { + return new \ArrayIterator($this->parameters); + } + + /** + * Returns the number of parameters. + * + * @return int The number of parameters + */ + public function count() + { + return \count($this->parameters); + } +} diff --git a/vendor/symfony/http-foundation/README.md b/vendor/symfony/http-foundation/README.md new file mode 100644 index 0000000..ac98f9b --- /dev/null +++ b/vendor/symfony/http-foundation/README.md @@ -0,0 +1,14 @@ +HttpFoundation Component +======================== + +The HttpFoundation component defines an object-oriented layer for the HTTP +specification. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/http_foundation.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/http-foundation/RedirectResponse.php b/vendor/symfony/http-foundation/RedirectResponse.php new file mode 100644 index 0000000..0dfb80c --- /dev/null +++ b/vendor/symfony/http-foundation/RedirectResponse.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * RedirectResponse represents an HTTP response doing a redirect. + * + * @author Fabien Potencier + */ +class RedirectResponse extends Response +{ + protected $targetUrl; + + /** + * Creates a redirect response so that it conforms to the rules defined for a redirect status code. + * + * @param string $url The URL to redirect to. The URL should be a full URL, with schema etc., + * but practically every browser redirects on paths only as well + * @param int $status The status code (302 by default) + * @param array $headers The headers (Location is always set to the given URL) + * + * @throws \InvalidArgumentException + * + * @see https://tools.ietf.org/html/rfc2616#section-10.3 + */ + public function __construct(string $url, int $status = 302, array $headers = []) + { + parent::__construct('', $status, $headers); + + $this->setTargetUrl($url); + + if (!$this->isRedirect()) { + throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $status)); + } + + if (301 == $status && !\array_key_exists('cache-control', array_change_key_case($headers, CASE_LOWER))) { + $this->headers->remove('cache-control'); + } + } + + /** + * Factory method for chainability. + * + * @param string $url The URL to redirect to + * + * @return static + * + * @deprecated since Symfony 5.1, use __construct() instead. + */ + public static function create($url = '', int $status = 302, array $headers = []) + { + trigger_deprecation('symfony/http-foundation', '5.1', 'The "%s()" method is deprecated, use "new %s()" instead.', __METHOD__, \get_called_class()); + + return new static($url, $status, $headers); + } + + /** + * Returns the target URL. + * + * @return string target URL + */ + public function getTargetUrl() + { + return $this->targetUrl; + } + + /** + * Sets the redirect target of this response. + * + * @return $this + * + * @throws \InvalidArgumentException + */ + public function setTargetUrl(string $url) + { + if ('' === $url) { + throw new \InvalidArgumentException('Cannot redirect to an empty URL.'); + } + + $this->targetUrl = $url; + + $this->setContent( + sprintf(' + + + + + + Redirecting to %1$s + + + Redirecting to %1$s. + +', htmlspecialchars($url, ENT_QUOTES, 'UTF-8'))); + + $this->headers->set('Location', $url); + + return $this; + } +} diff --git a/vendor/symfony/http-foundation/Request.php b/vendor/symfony/http-foundation/Request.php new file mode 100644 index 0000000..e737a7e --- /dev/null +++ b/vendor/symfony/http-foundation/Request.php @@ -0,0 +1,2098 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException; +use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException; +use Symfony\Component\HttpFoundation\Session\SessionInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(AcceptHeader::class); +class_exists(FileBag::class); +class_exists(HeaderBag::class); +class_exists(HeaderUtils::class); +class_exists(InputBag::class); +class_exists(ParameterBag::class); +class_exists(ServerBag::class); + +/** + * Request represents an HTTP request. + * + * The methods dealing with URL accept / return a raw path (% encoded): + * * getBasePath + * * getBaseUrl + * * getPathInfo + * * getRequestUri + * * getUri + * * getUriForPath + * + * @author Fabien Potencier + */ +class Request +{ + const HEADER_FORWARDED = 0b00001; // When using RFC 7239 + const HEADER_X_FORWARDED_FOR = 0b00010; + const HEADER_X_FORWARDED_HOST = 0b00100; + const HEADER_X_FORWARDED_PROTO = 0b01000; + const HEADER_X_FORWARDED_PORT = 0b10000; + const HEADER_X_FORWARDED_ALL = 0b11110; // All "X-Forwarded-*" headers + const HEADER_X_FORWARDED_AWS_ELB = 0b11010; // AWS ELB doesn't send X-Forwarded-Host + + const METHOD_HEAD = 'HEAD'; + const METHOD_GET = 'GET'; + const METHOD_POST = 'POST'; + const METHOD_PUT = 'PUT'; + const METHOD_PATCH = 'PATCH'; + const METHOD_DELETE = 'DELETE'; + const METHOD_PURGE = 'PURGE'; + const METHOD_OPTIONS = 'OPTIONS'; + const METHOD_TRACE = 'TRACE'; + const METHOD_CONNECT = 'CONNECT'; + + /** + * @var string[] + */ + protected static $trustedProxies = []; + + /** + * @var string[] + */ + protected static $trustedHostPatterns = []; + + /** + * @var string[] + */ + protected static $trustedHosts = []; + + protected static $httpMethodParameterOverride = false; + + /** + * Custom parameters. + * + * @var ParameterBag + */ + public $attributes; + + /** + * Request body parameters ($_POST). + * + * @var InputBag|ParameterBag + */ + public $request; + + /** + * Query string parameters ($_GET). + * + * @var InputBag + */ + public $query; + + /** + * Server and execution environment parameters ($_SERVER). + * + * @var ServerBag + */ + public $server; + + /** + * Uploaded files ($_FILES). + * + * @var FileBag + */ + public $files; + + /** + * Cookies ($_COOKIE). + * + * @var InputBag + */ + public $cookies; + + /** + * Headers (taken from the $_SERVER). + * + * @var HeaderBag + */ + public $headers; + + /** + * @var string|resource|false|null + */ + protected $content; + + /** + * @var array + */ + protected $languages; + + /** + * @var array + */ + protected $charsets; + + /** + * @var array + */ + protected $encodings; + + /** + * @var array + */ + protected $acceptableContentTypes; + + /** + * @var string + */ + protected $pathInfo; + + /** + * @var string + */ + protected $requestUri; + + /** + * @var string + */ + protected $baseUrl; + + /** + * @var string + */ + protected $basePath; + + /** + * @var string + */ + protected $method; + + /** + * @var string + */ + protected $format; + + /** + * @var SessionInterface + */ + protected $session; + + /** + * @var string + */ + protected $locale; + + /** + * @var string + */ + protected $defaultLocale = 'en'; + + /** + * @var array + */ + protected static $formats; + + protected static $requestFactory; + + /** + * @var string|null + */ + private $preferredFormat; + private $isHostValid = true; + private $isForwardedValid = true; + + /** + * @var bool|null + */ + private $isSafeContentPreferred; + + private static $trustedHeaderSet = -1; + + private static $forwardedParams = [ + self::HEADER_X_FORWARDED_FOR => 'for', + self::HEADER_X_FORWARDED_HOST => 'host', + self::HEADER_X_FORWARDED_PROTO => 'proto', + self::HEADER_X_FORWARDED_PORT => 'host', + ]; + + /** + * Names for headers that can be trusted when + * using trusted proxies. + * + * The FORWARDED header is the standard as of rfc7239. + * + * The other headers are non-standard, but widely used + * by popular reverse proxies (like Apache mod_proxy or Amazon EC2). + */ + private static $trustedHeaders = [ + self::HEADER_FORWARDED => 'FORWARDED', + self::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', + self::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', + self::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', + self::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', + ]; + + /** + * @param array $query The GET parameters + * @param array $request The POST parameters + * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) + * @param array $cookies The COOKIE parameters + * @param array $files The FILES parameters + * @param array $server The SERVER parameters + * @param string|resource|null $content The raw body data + */ + public function __construct(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) + { + $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content); + } + + /** + * Sets the parameters for this request. + * + * This method also re-initializes all properties. + * + * @param array $query The GET parameters + * @param array $request The POST parameters + * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) + * @param array $cookies The COOKIE parameters + * @param array $files The FILES parameters + * @param array $server The SERVER parameters + * @param string|resource|null $content The raw body data + */ + public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) + { + $this->request = new ParameterBag($request); + $this->query = new InputBag($query); + $this->attributes = new ParameterBag($attributes); + $this->cookies = new InputBag($cookies); + $this->files = new FileBag($files); + $this->server = new ServerBag($server); + $this->headers = new HeaderBag($this->server->getHeaders()); + + $this->content = $content; + $this->languages = null; + $this->charsets = null; + $this->encodings = null; + $this->acceptableContentTypes = null; + $this->pathInfo = null; + $this->requestUri = null; + $this->baseUrl = null; + $this->basePath = null; + $this->method = null; + $this->format = null; + } + + /** + * Creates a new request with values from PHP's super globals. + * + * @return static + */ + public static function createFromGlobals() + { + $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER); + + if ($_POST) { + $request->request = new InputBag($_POST); + } elseif (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') + && \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH']) + ) { + parse_str($request->getContent(), $data); + $request->request = new InputBag($data); + } + + return $request; + } + + /** + * Creates a Request based on a given URI and configuration. + * + * The information contained in the URI always take precedence + * over the other information (server and parameters). + * + * @param string $uri The URI + * @param string $method The HTTP method + * @param array $parameters The query (GET) or request (POST) parameters + * @param array $cookies The request cookies ($_COOKIE) + * @param array $files The request files ($_FILES) + * @param array $server The server parameters ($_SERVER) + * @param string|resource|null $content The raw body data + * + * @return static + */ + public static function create(string $uri, string $method = 'GET', array $parameters = [], array $cookies = [], array $files = [], array $server = [], $content = null) + { + $server = array_replace([ + 'SERVER_NAME' => 'localhost', + 'SERVER_PORT' => 80, + 'HTTP_HOST' => 'localhost', + 'HTTP_USER_AGENT' => 'Symfony', + 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', + 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', + 'REMOTE_ADDR' => '127.0.0.1', + 'SCRIPT_NAME' => '', + 'SCRIPT_FILENAME' => '', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + 'REQUEST_TIME' => time(), + ], $server); + + $server['PATH_INFO'] = ''; + $server['REQUEST_METHOD'] = strtoupper($method); + + $components = parse_url($uri); + if (isset($components['host'])) { + $server['SERVER_NAME'] = $components['host']; + $server['HTTP_HOST'] = $components['host']; + } + + if (isset($components['scheme'])) { + if ('https' === $components['scheme']) { + $server['HTTPS'] = 'on'; + $server['SERVER_PORT'] = 443; + } else { + unset($server['HTTPS']); + $server['SERVER_PORT'] = 80; + } + } + + if (isset($components['port'])) { + $server['SERVER_PORT'] = $components['port']; + $server['HTTP_HOST'] .= ':'.$components['port']; + } + + if (isset($components['user'])) { + $server['PHP_AUTH_USER'] = $components['user']; + } + + if (isset($components['pass'])) { + $server['PHP_AUTH_PW'] = $components['pass']; + } + + if (!isset($components['path'])) { + $components['path'] = '/'; + } + + switch (strtoupper($method)) { + case 'POST': + case 'PUT': + case 'DELETE': + if (!isset($server['CONTENT_TYPE'])) { + $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; + } + // no break + case 'PATCH': + $request = $parameters; + $query = []; + break; + default: + $request = []; + $query = $parameters; + break; + } + + $queryString = ''; + if (isset($components['query'])) { + parse_str(html_entity_decode($components['query']), $qs); + + if ($query) { + $query = array_replace($qs, $query); + $queryString = http_build_query($query, '', '&'); + } else { + $query = $qs; + $queryString = $components['query']; + } + } elseif ($query) { + $queryString = http_build_query($query, '', '&'); + } + + $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : ''); + $server['QUERY_STRING'] = $queryString; + + return self::createRequestFromFactory($query, $request, [], $cookies, $files, $server, $content); + } + + /** + * Sets a callable able to create a Request instance. + * + * This is mainly useful when you need to override the Request class + * to keep BC with an existing system. It should not be used for any + * other purpose. + */ + public static function setFactory(?callable $callable) + { + self::$requestFactory = $callable; + } + + /** + * Clones a request and overrides some of its parameters. + * + * @param array $query The GET parameters + * @param array $request The POST parameters + * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) + * @param array $cookies The COOKIE parameters + * @param array $files The FILES parameters + * @param array $server The SERVER parameters + * + * @return static + */ + public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) + { + $dup = clone $this; + if (null !== $query) { + $dup->query = new InputBag($query); + } + if (null !== $request) { + $dup->request = new ParameterBag($request); + } + if (null !== $attributes) { + $dup->attributes = new ParameterBag($attributes); + } + if (null !== $cookies) { + $dup->cookies = new InputBag($cookies); + } + if (null !== $files) { + $dup->files = new FileBag($files); + } + if (null !== $server) { + $dup->server = new ServerBag($server); + $dup->headers = new HeaderBag($dup->server->getHeaders()); + } + $dup->languages = null; + $dup->charsets = null; + $dup->encodings = null; + $dup->acceptableContentTypes = null; + $dup->pathInfo = null; + $dup->requestUri = null; + $dup->baseUrl = null; + $dup->basePath = null; + $dup->method = null; + $dup->format = null; + + if (!$dup->get('_format') && $this->get('_format')) { + $dup->attributes->set('_format', $this->get('_format')); + } + + if (!$dup->getRequestFormat(null)) { + $dup->setRequestFormat($this->getRequestFormat(null)); + } + + return $dup; + } + + /** + * Clones the current request. + * + * Note that the session is not cloned as duplicated requests + * are most of the time sub-requests of the main one. + */ + public function __clone() + { + $this->query = clone $this->query; + $this->request = clone $this->request; + $this->attributes = clone $this->attributes; + $this->cookies = clone $this->cookies; + $this->files = clone $this->files; + $this->server = clone $this->server; + $this->headers = clone $this->headers; + } + + /** + * Returns the request as a string. + * + * @return string The request + */ + public function __toString() + { + try { + $content = $this->getContent(); + } catch (\LogicException $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + + return trigger_error($e, E_USER_ERROR); + } + + $cookieHeader = ''; + $cookies = []; + + foreach ($this->cookies as $k => $v) { + $cookies[] = $k.'='.$v; + } + + if (!empty($cookies)) { + $cookieHeader = 'Cookie: '.implode('; ', $cookies)."\r\n"; + } + + return + sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n". + $this->headers. + $cookieHeader."\r\n". + $content; + } + + /** + * Overrides the PHP global variables according to this request instance. + * + * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. + * $_FILES is never overridden, see rfc1867 + */ + public function overrideGlobals() + { + $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&'))); + + $_GET = $this->query->all(); + $_POST = $this->request->all(); + $_SERVER = $this->server->all(); + $_COOKIE = $this->cookies->all(); + + foreach ($this->headers->all() as $key => $value) { + $key = strtoupper(str_replace('-', '_', $key)); + if (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) { + $_SERVER[$key] = implode(', ', $value); + } else { + $_SERVER['HTTP_'.$key] = implode(', ', $value); + } + } + + $request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE]; + + $requestOrder = ini_get('request_order') ?: ini_get('variables_order'); + $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp'; + + $_REQUEST = [[]]; + + foreach (str_split($requestOrder) as $order) { + $_REQUEST[] = $request[$order]; + } + + $_REQUEST = array_merge(...$_REQUEST); + } + + /** + * Sets a list of trusted proxies. + * + * You should only list the reverse proxies that you manage directly. + * + * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] + * @param int $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies + * + * @throws \InvalidArgumentException When $trustedHeaderSet is invalid + */ + public static function setTrustedProxies(array $proxies, int $trustedHeaderSet) + { + self::$trustedProxies = array_reduce($proxies, function ($proxies, $proxy) { + if ('REMOTE_ADDR' !== $proxy) { + $proxies[] = $proxy; + } elseif (isset($_SERVER['REMOTE_ADDR'])) { + $proxies[] = $_SERVER['REMOTE_ADDR']; + } + + return $proxies; + }, []); + self::$trustedHeaderSet = $trustedHeaderSet; + } + + /** + * Gets the list of trusted proxies. + * + * @return array An array of trusted proxies + */ + public static function getTrustedProxies() + { + return self::$trustedProxies; + } + + /** + * Gets the set of trusted headers from trusted proxies. + * + * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies + */ + public static function getTrustedHeaderSet() + { + return self::$trustedHeaderSet; + } + + /** + * Sets a list of trusted host patterns. + * + * You should only list the hosts you manage using regexs. + * + * @param array $hostPatterns A list of trusted host patterns + */ + public static function setTrustedHosts(array $hostPatterns) + { + self::$trustedHostPatterns = array_map(function ($hostPattern) { + return sprintf('{%s}i', $hostPattern); + }, $hostPatterns); + // we need to reset trusted hosts on trusted host patterns change + self::$trustedHosts = []; + } + + /** + * Gets the list of trusted host patterns. + * + * @return array An array of trusted host patterns + */ + public static function getTrustedHosts() + { + return self::$trustedHostPatterns; + } + + /** + * Normalizes a query string. + * + * It builds a normalized query string, where keys/value pairs are alphabetized, + * have consistent escaping and unneeded delimiters are removed. + * + * @return string A normalized query string for the Request + */ + public static function normalizeQueryString(?string $qs) + { + if ('' === ($qs ?? '')) { + return ''; + } + + parse_str($qs, $qs); + ksort($qs); + + return http_build_query($qs, '', '&', PHP_QUERY_RFC3986); + } + + /** + * Enables support for the _method request parameter to determine the intended HTTP method. + * + * Be warned that enabling this feature might lead to CSRF issues in your code. + * Check that you are using CSRF tokens when required. + * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered + * and used to send a "PUT" or "DELETE" request via the _method request parameter. + * If these methods are not protected against CSRF, this presents a possible vulnerability. + * + * The HTTP method can only be overridden when the real HTTP method is POST. + */ + public static function enableHttpMethodParameterOverride() + { + self::$httpMethodParameterOverride = true; + } + + /** + * Checks whether support for the _method request parameter is enabled. + * + * @return bool True when the _method request parameter is enabled, false otherwise + */ + public static function getHttpMethodParameterOverride() + { + return self::$httpMethodParameterOverride; + } + + /** + * Gets a "parameter" value from any bag. + * + * This method is mainly useful for libraries that want to provide some flexibility. If you don't need the + * flexibility in controllers, it is better to explicitly get request parameters from the appropriate + * public property instead (attributes, query, request). + * + * Order of precedence: PATH (routing placeholders or custom attributes), GET, BODY + * + * @param mixed $default The default value if the parameter key does not exist + * + * @return mixed + */ + public function get(string $key, $default = null) + { + if ($this !== $result = $this->attributes->get($key, $this)) { + return $result; + } + + if ($this->query->has($key)) { + return $this->query->all()[$key]; + } + + if ($this->request->has($key)) { + return $this->request->all()[$key]; + } + + return $default; + } + + /** + * Gets the Session. + * + * @return SessionInterface The session + */ + public function getSession() + { + $session = $this->session; + if (!$session instanceof SessionInterface && null !== $session) { + $this->setSession($session = $session()); + } + + if (null === $session) { + throw new \BadMethodCallException('Session has not been set.'); + } + + return $session; + } + + /** + * Whether the request contains a Session which was started in one of the + * previous requests. + * + * @return bool + */ + public function hasPreviousSession() + { + // the check for $this->session avoids malicious users trying to fake a session cookie with proper name + return $this->hasSession() && $this->cookies->has($this->getSession()->getName()); + } + + /** + * Whether the request contains a Session object. + * + * This method does not give any information about the state of the session object, + * like whether the session is started or not. It is just a way to check if this Request + * is associated with a Session instance. + * + * @return bool true when the Request contains a Session object, false otherwise + */ + public function hasSession() + { + return null !== $this->session; + } + + public function setSession(SessionInterface $session) + { + $this->session = $session; + } + + /** + * @internal + */ + public function setSessionFactory(callable $factory) + { + $this->session = $factory; + } + + /** + * Returns the client IP addresses. + * + * In the returned array the most trusted IP address is first, and the + * least trusted one last. The "real" client IP address is the last one, + * but this is also the least trusted one. Trusted proxies are stripped. + * + * Use this method carefully; you should use getClientIp() instead. + * + * @return array The client IP addresses + * + * @see getClientIp() + */ + public function getClientIps() + { + $ip = $this->server->get('REMOTE_ADDR'); + + if (!$this->isFromTrustedProxy()) { + return [$ip]; + } + + return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: [$ip]; + } + + /** + * Returns the client IP address. + * + * This method can read the client IP address from the "X-Forwarded-For" header + * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" + * header value is a comma+space separated list of IP addresses, the left-most + * being the original client, and each successive proxy that passed the request + * adding the IP address where it received the request from. + * + * If your reverse proxy uses a different header name than "X-Forwarded-For", + * ("Client-Ip" for instance), configure it via the $trustedHeaderSet + * argument of the Request::setTrustedProxies() method instead. + * + * @return string|null The client IP address + * + * @see getClientIps() + * @see https://wikipedia.org/wiki/X-Forwarded-For + */ + public function getClientIp() + { + $ipAddresses = $this->getClientIps(); + + return $ipAddresses[0]; + } + + /** + * Returns current script name. + * + * @return string + */ + public function getScriptName() + { + return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', '')); + } + + /** + * Returns the path being requested relative to the executed script. + * + * The path info always starts with a /. + * + * Suppose this request is instantiated from /mysite on localhost: + * + * * http://localhost/mysite returns an empty string + * * http://localhost/mysite/about returns '/about' + * * http://localhost/mysite/enco%20ded returns '/enco%20ded' + * * http://localhost/mysite/about?var=1 returns '/about' + * + * @return string The raw path (i.e. not urldecoded) + */ + public function getPathInfo() + { + if (null === $this->pathInfo) { + $this->pathInfo = $this->preparePathInfo(); + } + + return $this->pathInfo; + } + + /** + * Returns the root path from which this request is executed. + * + * Suppose that an index.php file instantiates this request object: + * + * * http://localhost/index.php returns an empty string + * * http://localhost/index.php/page returns an empty string + * * http://localhost/web/index.php returns '/web' + * * http://localhost/we%20b/index.php returns '/we%20b' + * + * @return string The raw path (i.e. not urldecoded) + */ + public function getBasePath() + { + if (null === $this->basePath) { + $this->basePath = $this->prepareBasePath(); + } + + return $this->basePath; + } + + /** + * Returns the root URL from which this request is executed. + * + * The base URL never ends with a /. + * + * This is similar to getBasePath(), except that it also includes the + * script filename (e.g. index.php) if one exists. + * + * @return string The raw URL (i.e. not urldecoded) + */ + public function getBaseUrl() + { + if (null === $this->baseUrl) { + $this->baseUrl = $this->prepareBaseUrl(); + } + + return $this->baseUrl; + } + + /** + * Gets the request's scheme. + * + * @return string + */ + public function getScheme() + { + return $this->isSecure() ? 'https' : 'http'; + } + + /** + * Returns the port on which the request is made. + * + * This method can read the client port from the "X-Forwarded-Port" header + * when trusted proxies were set via "setTrustedProxies()". + * + * The "X-Forwarded-Port" header must contain the client port. + * + * @return int|string can be a string if fetched from the server bag + */ + public function getPort() + { + if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_PORT)) { + $host = $host[0]; + } elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) { + $host = $host[0]; + } elseif (!$host = $this->headers->get('HOST')) { + return $this->server->get('SERVER_PORT'); + } + + if ('[' === $host[0]) { + $pos = strpos($host, ':', strrpos($host, ']')); + } else { + $pos = strrpos($host, ':'); + } + + if (false !== $pos && $port = substr($host, $pos + 1)) { + return (int) $port; + } + + return 'https' === $this->getScheme() ? 443 : 80; + } + + /** + * Returns the user. + * + * @return string|null + */ + public function getUser() + { + return $this->headers->get('PHP_AUTH_USER'); + } + + /** + * Returns the password. + * + * @return string|null + */ + public function getPassword() + { + return $this->headers->get('PHP_AUTH_PW'); + } + + /** + * Gets the user info. + * + * @return string A user name and, optionally, scheme-specific information about how to gain authorization to access the server + */ + public function getUserInfo() + { + $userinfo = $this->getUser(); + + $pass = $this->getPassword(); + if ('' != $pass) { + $userinfo .= ":$pass"; + } + + return $userinfo; + } + + /** + * Returns the HTTP host being requested. + * + * The port name will be appended to the host if it's non-standard. + * + * @return string + */ + public function getHttpHost() + { + $scheme = $this->getScheme(); + $port = $this->getPort(); + + if (('http' == $scheme && 80 == $port) || ('https' == $scheme && 443 == $port)) { + return $this->getHost(); + } + + return $this->getHost().':'.$port; + } + + /** + * Returns the requested URI (path and query string). + * + * @return string The raw URI (i.e. not URI decoded) + */ + public function getRequestUri() + { + if (null === $this->requestUri) { + $this->requestUri = $this->prepareRequestUri(); + } + + return $this->requestUri; + } + + /** + * Gets the scheme and HTTP host. + * + * If the URL was called with basic authentication, the user + * and the password are not added to the generated string. + * + * @return string The scheme and HTTP host + */ + public function getSchemeAndHttpHost() + { + return $this->getScheme().'://'.$this->getHttpHost(); + } + + /** + * Generates a normalized URI (URL) for the Request. + * + * @return string A normalized URI (URL) for the Request + * + * @see getQueryString() + */ + public function getUri() + { + if (null !== $qs = $this->getQueryString()) { + $qs = '?'.$qs; + } + + return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs; + } + + /** + * Generates a normalized URI for the given path. + * + * @param string $path A path to use instead of the current one + * + * @return string The normalized URI for the path + */ + public function getUriForPath(string $path) + { + return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path; + } + + /** + * Returns the path as relative reference from the current Request path. + * + * Only the URIs path component (no schema, host etc.) is relevant and must be given. + * Both paths must be absolute and not contain relative parts. + * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. + * Furthermore, they can be used to reduce the link size in documents. + * + * Example target paths, given a base path of "/a/b/c/d": + * - "/a/b/c/d" -> "" + * - "/a/b/c/" -> "./" + * - "/a/b/" -> "../" + * - "/a/b/c/other" -> "other" + * - "/a/x/y" -> "../../x/y" + * + * @return string The relative target path + */ + public function getRelativeUriForPath(string $path) + { + // be sure that we are dealing with an absolute path + if (!isset($path[0]) || '/' !== $path[0]) { + return $path; + } + + if ($path === $basePath = $this->getPathInfo()) { + return ''; + } + + $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath); + $targetDirs = explode('/', substr($path, 1)); + array_pop($sourceDirs); + $targetFile = array_pop($targetDirs); + + foreach ($sourceDirs as $i => $dir) { + if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) { + unset($sourceDirs[$i], $targetDirs[$i]); + } else { + break; + } + } + + $targetDirs[] = $targetFile; + $path = str_repeat('../', \count($sourceDirs)).implode('/', $targetDirs); + + // A reference to the same base directory or an empty subdirectory must be prefixed with "./". + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name + // (see https://tools.ietf.org/html/rfc3986#section-4.2). + return !isset($path[0]) || '/' === $path[0] + || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos) + ? "./$path" : $path; + } + + /** + * Generates the normalized query string for the Request. + * + * It builds a normalized query string, where keys/value pairs are alphabetized + * and have consistent escaping. + * + * @return string|null A normalized query string for the Request + */ + public function getQueryString() + { + $qs = static::normalizeQueryString($this->server->get('QUERY_STRING')); + + return '' === $qs ? null : $qs; + } + + /** + * Checks whether the request is secure or not. + * + * This method can read the client protocol from the "X-Forwarded-Proto" header + * when trusted proxies were set via "setTrustedProxies()". + * + * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". + * + * @return bool + */ + public function isSecure() + { + if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) { + return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true); + } + + $https = $this->server->get('HTTPS'); + + return !empty($https) && 'off' !== strtolower($https); + } + + /** + * Returns the host name. + * + * This method can read the client host name from the "X-Forwarded-Host" header + * when trusted proxies were set via "setTrustedProxies()". + * + * The "X-Forwarded-Host" header must contain the client host name. + * + * @return string + * + * @throws SuspiciousOperationException when the host name is invalid or not trusted + */ + public function getHost() + { + if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) { + $host = $host[0]; + } elseif (!$host = $this->headers->get('HOST')) { + if (!$host = $this->server->get('SERVER_NAME')) { + $host = $this->server->get('SERVER_ADDR', ''); + } + } + + // trim and remove port number from host + // host is lowercase as per RFC 952/2181 + $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); + + // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user) + // check that it does not contain forbidden characters (see RFC 952 and RFC 2181) + // use preg_replace() instead of preg_match() to prevent DoS attacks with long host names + if ($host && '' !== preg_replace('/(?:^\[)?[a-zA-Z0-9-:\]_]+\.?/', '', $host)) { + if (!$this->isHostValid) { + return ''; + } + $this->isHostValid = false; + + throw new SuspiciousOperationException(sprintf('Invalid Host "%s".', $host)); + } + + if (\count(self::$trustedHostPatterns) > 0) { + // to avoid host header injection attacks, you should provide a list of trusted host patterns + + if (\in_array($host, self::$trustedHosts)) { + return $host; + } + + foreach (self::$trustedHostPatterns as $pattern) { + if (preg_match($pattern, $host)) { + self::$trustedHosts[] = $host; + + return $host; + } + } + + if (!$this->isHostValid) { + return ''; + } + $this->isHostValid = false; + + throw new SuspiciousOperationException(sprintf('Untrusted Host "%s".', $host)); + } + + return $host; + } + + /** + * Sets the request method. + */ + public function setMethod(string $method) + { + $this->method = null; + $this->server->set('REQUEST_METHOD', $method); + } + + /** + * Gets the request "intended" method. + * + * If the X-HTTP-Method-Override header is set, and if the method is a POST, + * then it is used to determine the "real" intended HTTP method. + * + * The _method request parameter can also be used to determine the HTTP method, + * but only if enableHttpMethodParameterOverride() has been called. + * + * The method is always an uppercased string. + * + * @return string The request method + * + * @see getRealMethod() + */ + public function getMethod() + { + if (null !== $this->method) { + return $this->method; + } + + $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET')); + + if ('POST' !== $this->method) { + return $this->method; + } + + $method = $this->headers->get('X-HTTP-METHOD-OVERRIDE'); + + if (!$method && self::$httpMethodParameterOverride) { + $method = $this->request->get('_method', $this->query->get('_method', 'POST')); + } + + if (!\is_string($method)) { + return $this->method; + } + + $method = strtoupper($method); + + if (\in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'PATCH', 'PURGE', 'TRACE'], true)) { + return $this->method = $method; + } + + if (!preg_match('/^[A-Z]++$/D', $method)) { + throw new SuspiciousOperationException(sprintf('Invalid method override "%s".', $method)); + } + + return $this->method = $method; + } + + /** + * Gets the "real" request method. + * + * @return string The request method + * + * @see getMethod() + */ + public function getRealMethod() + { + return strtoupper($this->server->get('REQUEST_METHOD', 'GET')); + } + + /** + * Gets the mime type associated with the format. + * + * @return string|null The associated mime type (null if not found) + */ + public function getMimeType(string $format) + { + if (null === static::$formats) { + static::initializeFormats(); + } + + return isset(static::$formats[$format]) ? static::$formats[$format][0] : null; + } + + /** + * Gets the mime types associated with the format. + * + * @return array The associated mime types + */ + public static function getMimeTypes(string $format) + { + if (null === static::$formats) { + static::initializeFormats(); + } + + return isset(static::$formats[$format]) ? static::$formats[$format] : []; + } + + /** + * Gets the format associated with the mime type. + * + * @return string|null The format (null if not found) + */ + public function getFormat(?string $mimeType) + { + $canonicalMimeType = null; + if (false !== $pos = strpos($mimeType, ';')) { + $canonicalMimeType = trim(substr($mimeType, 0, $pos)); + } + + if (null === static::$formats) { + static::initializeFormats(); + } + + foreach (static::$formats as $format => $mimeTypes) { + if (\in_array($mimeType, (array) $mimeTypes)) { + return $format; + } + if (null !== $canonicalMimeType && \in_array($canonicalMimeType, (array) $mimeTypes)) { + return $format; + } + } + + return null; + } + + /** + * Associates a format with mime types. + * + * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) + */ + public function setFormat(?string $format, $mimeTypes) + { + if (null === static::$formats) { + static::initializeFormats(); + } + + static::$formats[$format] = \is_array($mimeTypes) ? $mimeTypes : [$mimeTypes]; + } + + /** + * Gets the request format. + * + * Here is the process to determine the format: + * + * * format defined by the user (with setRequestFormat()) + * * _format request attribute + * * $default + * + * @see getPreferredFormat + * + * @return string|null The request format + */ + public function getRequestFormat(?string $default = 'html') + { + if (null === $this->format) { + $this->format = $this->attributes->get('_format'); + } + + return null === $this->format ? $default : $this->format; + } + + /** + * Sets the request format. + */ + public function setRequestFormat(?string $format) + { + $this->format = $format; + } + + /** + * Gets the format associated with the request. + * + * @return string|null The format (null if no content type is present) + */ + public function getContentType() + { + return $this->getFormat($this->headers->get('CONTENT_TYPE')); + } + + /** + * Sets the default locale. + */ + public function setDefaultLocale(string $locale) + { + $this->defaultLocale = $locale; + + if (null === $this->locale) { + $this->setPhpDefaultLocale($locale); + } + } + + /** + * Get the default locale. + * + * @return string + */ + public function getDefaultLocale() + { + return $this->defaultLocale; + } + + /** + * Sets the locale. + */ + public function setLocale(string $locale) + { + $this->setPhpDefaultLocale($this->locale = $locale); + } + + /** + * Get the locale. + * + * @return string + */ + public function getLocale() + { + return null === $this->locale ? $this->defaultLocale : $this->locale; + } + + /** + * Checks if the request method is of specified type. + * + * @param string $method Uppercase request method (GET, POST etc) + * + * @return bool + */ + public function isMethod(string $method) + { + return $this->getMethod() === strtoupper($method); + } + + /** + * Checks whether or not the method is safe. + * + * @see https://tools.ietf.org/html/rfc7231#section-4.2.1 + * + * @return bool + */ + public function isMethodSafe() + { + return \in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE']); + } + + /** + * Checks whether or not the method is idempotent. + * + * @return bool + */ + public function isMethodIdempotent() + { + return \in_array($this->getMethod(), ['HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE']); + } + + /** + * Checks whether the method is cacheable or not. + * + * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 + * + * @return bool True for GET and HEAD, false otherwise + */ + public function isMethodCacheable() + { + return \in_array($this->getMethod(), ['GET', 'HEAD']); + } + + /** + * Returns the protocol version. + * + * If the application is behind a proxy, the protocol version used in the + * requests between the client and the proxy and between the proxy and the + * server might be different. This returns the former (from the "Via" header) + * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns + * the latter (from the "SERVER_PROTOCOL" server parameter). + * + * @return string + */ + public function getProtocolVersion() + { + if ($this->isFromTrustedProxy()) { + preg_match('~^(HTTP/)?([1-9]\.[0-9]) ~', $this->headers->get('Via'), $matches); + + if ($matches) { + return 'HTTP/'.$matches[2]; + } + } + + return $this->server->get('SERVER_PROTOCOL'); + } + + /** + * Returns the request body content. + * + * @param bool $asResource If true, a resource will be returned + * + * @return string|resource The request body content or a resource to read the body stream + * + * @throws \LogicException + */ + public function getContent(bool $asResource = false) + { + $currentContentIsResource = \is_resource($this->content); + + if (true === $asResource) { + if ($currentContentIsResource) { + rewind($this->content); + + return $this->content; + } + + // Content passed in parameter (test) + if (\is_string($this->content)) { + $resource = fopen('php://temp', 'r+'); + fwrite($resource, $this->content); + rewind($resource); + + return $resource; + } + + $this->content = false; + + return fopen('php://input', 'rb'); + } + + if ($currentContentIsResource) { + rewind($this->content); + + return stream_get_contents($this->content); + } + + if (null === $this->content || false === $this->content) { + $this->content = file_get_contents('php://input'); + } + + return $this->content; + } + + /** + * Gets the Etags. + * + * @return array The entity tags + */ + public function getETags() + { + return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY); + } + + /** + * @return bool + */ + public function isNoCache() + { + return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma'); + } + + /** + * Gets the preferred format for the response by inspecting, in the following order: + * * the request format set using setRequestFormat; + * * the values of the Accept HTTP header. + * + * Note that if you use this method, you should send the "Vary: Accept" header + * in the response to prevent any issues with intermediary HTTP caches. + */ + public function getPreferredFormat(?string $default = 'html'): ?string + { + if (null !== $this->preferredFormat || null !== $this->preferredFormat = $this->getRequestFormat(null)) { + return $this->preferredFormat; + } + + foreach ($this->getAcceptableContentTypes() as $mimeType) { + if ($this->preferredFormat = $this->getFormat($mimeType)) { + return $this->preferredFormat; + } + } + + return $default; + } + + /** + * Returns the preferred language. + * + * @param string[] $locales An array of ordered available locales + * + * @return string|null The preferred locale + */ + public function getPreferredLanguage(array $locales = null) + { + $preferredLanguages = $this->getLanguages(); + + if (empty($locales)) { + return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null; + } + + if (!$preferredLanguages) { + return $locales[0]; + } + + $extendedPreferredLanguages = []; + foreach ($preferredLanguages as $language) { + $extendedPreferredLanguages[] = $language; + if (false !== $position = strpos($language, '_')) { + $superLanguage = substr($language, 0, $position); + if (!\in_array($superLanguage, $preferredLanguages)) { + $extendedPreferredLanguages[] = $superLanguage; + } + } + } + + $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales)); + + return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0]; + } + + /** + * Gets a list of languages acceptable by the client browser. + * + * @return array Languages ordered in the user browser preferences + */ + public function getLanguages() + { + if (null !== $this->languages) { + return $this->languages; + } + + $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all(); + $this->languages = []; + foreach ($languages as $lang => $acceptHeaderItem) { + if (false !== strpos($lang, '-')) { + $codes = explode('-', $lang); + if ('i' === $codes[0]) { + // Language not listed in ISO 639 that are not variants + // of any listed language, which can be registered with the + // i-prefix, such as i-cherokee + if (\count($codes) > 1) { + $lang = $codes[1]; + } + } else { + for ($i = 0, $max = \count($codes); $i < $max; ++$i) { + if (0 === $i) { + $lang = strtolower($codes[0]); + } else { + $lang .= '_'.strtoupper($codes[$i]); + } + } + } + } + + $this->languages[] = $lang; + } + + return $this->languages; + } + + /** + * Gets a list of charsets acceptable by the client browser. + * + * @return array List of charsets in preferable order + */ + public function getCharsets() + { + if (null !== $this->charsets) { + return $this->charsets; + } + + return $this->charsets = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all()); + } + + /** + * Gets a list of encodings acceptable by the client browser. + * + * @return array List of encodings in preferable order + */ + public function getEncodings() + { + if (null !== $this->encodings) { + return $this->encodings; + } + + return $this->encodings = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all()); + } + + /** + * Gets a list of content types acceptable by the client browser. + * + * @return array List of content types in preferable order + */ + public function getAcceptableContentTypes() + { + if (null !== $this->acceptableContentTypes) { + return $this->acceptableContentTypes; + } + + return $this->acceptableContentTypes = array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all()); + } + + /** + * Returns true if the request is a XMLHttpRequest. + * + * It works if your JavaScript library sets an X-Requested-With HTTP header. + * It is known to work with common JavaScript frameworks: + * + * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript + * + * @return bool true if the request is an XMLHttpRequest, false otherwise + */ + public function isXmlHttpRequest() + { + return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); + } + + /** + * Checks whether the client browser prefers safe content or not according to RFC8674. + * + * @see https://tools.ietf.org/html/rfc8674 + */ + public function preferSafeContent(): bool + { + if (null !== $this->isSafeContentPreferred) { + return $this->isSafeContentPreferred; + } + + if (!$this->isSecure()) { + // see https://tools.ietf.org/html/rfc8674#section-3 + $this->isSafeContentPreferred = false; + + return $this->isSafeContentPreferred; + } + + $this->isSafeContentPreferred = AcceptHeader::fromString($this->headers->get('Prefer'))->has('safe'); + + return $this->isSafeContentPreferred; + } + + /* + * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24) + * + * Code subject to the new BSD license (https://framework.zend.com/license). + * + * Copyright (c) 2005-2010 Zend Technologies USA Inc. (https://www.zend.com/) + */ + + protected function prepareRequestUri() + { + $requestUri = ''; + + if ('1' == $this->server->get('IIS_WasUrlRewritten') && '' != $this->server->get('UNENCODED_URL')) { + // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem) + $requestUri = $this->server->get('UNENCODED_URL'); + $this->server->remove('UNENCODED_URL'); + $this->server->remove('IIS_WasUrlRewritten'); + } elseif ($this->server->has('REQUEST_URI')) { + $requestUri = $this->server->get('REQUEST_URI'); + + if ('' !== $requestUri && '/' === $requestUri[0]) { + // To only use path and query remove the fragment. + if (false !== $pos = strpos($requestUri, '#')) { + $requestUri = substr($requestUri, 0, $pos); + } + } else { + // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, + // only use URL path. + $uriComponents = parse_url($requestUri); + + if (isset($uriComponents['path'])) { + $requestUri = $uriComponents['path']; + } + + if (isset($uriComponents['query'])) { + $requestUri .= '?'.$uriComponents['query']; + } + } + } elseif ($this->server->has('ORIG_PATH_INFO')) { + // IIS 5.0, PHP as CGI + $requestUri = $this->server->get('ORIG_PATH_INFO'); + if ('' != $this->server->get('QUERY_STRING')) { + $requestUri .= '?'.$this->server->get('QUERY_STRING'); + } + $this->server->remove('ORIG_PATH_INFO'); + } + + // normalize the request URI to ease creating sub-requests from this request + $this->server->set('REQUEST_URI', $requestUri); + + return $requestUri; + } + + /** + * Prepares the base URL. + * + * @return string + */ + protected function prepareBaseUrl() + { + $filename = basename($this->server->get('SCRIPT_FILENAME')); + + if (basename($this->server->get('SCRIPT_NAME')) === $filename) { + $baseUrl = $this->server->get('SCRIPT_NAME'); + } elseif (basename($this->server->get('PHP_SELF')) === $filename) { + $baseUrl = $this->server->get('PHP_SELF'); + } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) { + $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility + } else { + // Backtrack up the script_filename to find the portion matching + // php_self + $path = $this->server->get('PHP_SELF', ''); + $file = $this->server->get('SCRIPT_FILENAME', ''); + $segs = explode('/', trim($file, '/')); + $segs = array_reverse($segs); + $index = 0; + $last = \count($segs); + $baseUrl = ''; + do { + $seg = $segs[$index]; + $baseUrl = '/'.$seg.$baseUrl; + ++$index; + } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos); + } + + // Does the baseUrl have anything in common with the request_uri? + $requestUri = $this->getRequestUri(); + if ('' !== $requestUri && '/' !== $requestUri[0]) { + $requestUri = '/'.$requestUri; + } + + if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) { + // full $baseUrl matches + return $prefix; + } + + if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(\dirname($baseUrl), '/'.\DIRECTORY_SEPARATOR).'/')) { + // directory portion of $baseUrl matches + return rtrim($prefix, '/'.\DIRECTORY_SEPARATOR); + } + + $truncatedRequestUri = $requestUri; + if (false !== $pos = strpos($requestUri, '?')) { + $truncatedRequestUri = substr($requestUri, 0, $pos); + } + + $basename = basename($baseUrl); + if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) { + // no match whatsoever; set it blank + return ''; + } + + // If using mod_rewrite or ISAPI_Rewrite strip the script filename + // out of baseUrl. $pos !== 0 makes sure it is not matching a value + // from PATH_INFO or QUERY_STRING + if (\strlen($requestUri) >= \strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) { + $baseUrl = substr($requestUri, 0, $pos + \strlen($baseUrl)); + } + + return rtrim($baseUrl, '/'.\DIRECTORY_SEPARATOR); + } + + /** + * Prepares the base path. + * + * @return string base path + */ + protected function prepareBasePath() + { + $baseUrl = $this->getBaseUrl(); + if (empty($baseUrl)) { + return ''; + } + + $filename = basename($this->server->get('SCRIPT_FILENAME')); + if (basename($baseUrl) === $filename) { + $basePath = \dirname($baseUrl); + } else { + $basePath = $baseUrl; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + $basePath = str_replace('\\', '/', $basePath); + } + + return rtrim($basePath, '/'); + } + + /** + * Prepares the path info. + * + * @return string path info + */ + protected function preparePathInfo() + { + if (null === ($requestUri = $this->getRequestUri())) { + return '/'; + } + + // Remove the query string from REQUEST_URI + if (false !== $pos = strpos($requestUri, '?')) { + $requestUri = substr($requestUri, 0, $pos); + } + if ('' !== $requestUri && '/' !== $requestUri[0]) { + $requestUri = '/'.$requestUri; + } + + if (null === ($baseUrl = $this->getBaseUrl())) { + return $requestUri; + } + + $pathInfo = substr($requestUri, \strlen($baseUrl)); + if (false === $pathInfo || '' === $pathInfo) { + // If substr() returns false then PATH_INFO is set to an empty string + return '/'; + } + + return (string) $pathInfo; + } + + /** + * Initializes HTTP request formats. + */ + protected static function initializeFormats() + { + static::$formats = [ + 'html' => ['text/html', 'application/xhtml+xml'], + 'txt' => ['text/plain'], + 'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'], + 'css' => ['text/css'], + 'json' => ['application/json', 'application/x-json'], + 'jsonld' => ['application/ld+json'], + 'xml' => ['text/xml', 'application/xml', 'application/x-xml'], + 'rdf' => ['application/rdf+xml'], + 'atom' => ['application/atom+xml'], + 'rss' => ['application/rss+xml'], + 'form' => ['application/x-www-form-urlencoded'], + ]; + } + + private function setPhpDefaultLocale(string $locale): void + { + // if either the class Locale doesn't exist, or an exception is thrown when + // setting the default locale, the intl module is not installed, and + // the call can be ignored: + try { + if (class_exists('Locale', false)) { + \Locale::setDefault($locale); + } + } catch (\Exception $e) { + } + } + + /** + * Returns the prefix as encoded in the string when the string starts with + * the given prefix, null otherwise. + */ + private function getUrlencodedPrefix(string $string, string $prefix): ?string + { + if (0 !== strpos(rawurldecode($string), $prefix)) { + return null; + } + + $len = \strlen($prefix); + + if (preg_match(sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) { + return $match[0]; + } + + return null; + } + + private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): self + { + if (self::$requestFactory) { + $request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content); + + if (!$request instanceof self) { + throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.'); + } + + return $request; + } + + return new static($query, $request, $attributes, $cookies, $files, $server, $content); + } + + /** + * Indicates whether this request originated from a trusted proxy. + * + * This can be useful to determine whether or not to trust the + * contents of a proxy-specific header. + * + * @return bool true if the request came from a trusted proxy, false otherwise + */ + public function isFromTrustedProxy() + { + return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR'), self::$trustedProxies); + } + + private function getTrustedValues(int $type, string $ip = null): array + { + $clientValues = []; + $forwardedValues = []; + + if ((self::$trustedHeaderSet & $type) && $this->headers->has(self::$trustedHeaders[$type])) { + foreach (explode(',', $this->headers->get(self::$trustedHeaders[$type])) as $v) { + $clientValues[] = (self::HEADER_X_FORWARDED_PORT === $type ? '0.0.0.0:' : '').trim($v); + } + } + + if ((self::$trustedHeaderSet & self::HEADER_FORWARDED) && $this->headers->has(self::$trustedHeaders[self::HEADER_FORWARDED])) { + $forwarded = $this->headers->get(self::$trustedHeaders[self::HEADER_FORWARDED]); + $parts = HeaderUtils::split($forwarded, ',;='); + $forwardedValues = []; + $param = self::$forwardedParams[$type]; + foreach ($parts as $subParts) { + if (null === $v = HeaderUtils::combine($subParts)[$param] ?? null) { + continue; + } + if (self::HEADER_X_FORWARDED_PORT === $type) { + if (']' === substr($v, -1) || false === $v = strrchr($v, ':')) { + $v = $this->isSecure() ? ':443' : ':80'; + } + $v = '0.0.0.0'.$v; + } + $forwardedValues[] = $v; + } + } + + if (null !== $ip) { + $clientValues = $this->normalizeAndFilterClientIps($clientValues, $ip); + $forwardedValues = $this->normalizeAndFilterClientIps($forwardedValues, $ip); + } + + if ($forwardedValues === $clientValues || !$clientValues) { + return $forwardedValues; + } + + if (!$forwardedValues) { + return $clientValues; + } + + if (!$this->isForwardedValid) { + return null !== $ip ? ['0.0.0.0', $ip] : []; + } + $this->isForwardedValid = false; + + throw new ConflictingHeadersException(sprintf('The request has both a trusted "%s" header and a trusted "%s" header, conflicting with each other. You should either configure your proxy to remove one of them, or configure your project to distrust the offending one.', self::$trustedHeaders[self::HEADER_FORWARDED], self::$trustedHeaders[$type])); + } + + private function normalizeAndFilterClientIps(array $clientIps, string $ip): array + { + if (!$clientIps) { + return []; + } + $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from + $firstTrustedIp = null; + + foreach ($clientIps as $key => $clientIp) { + if (strpos($clientIp, '.')) { + // Strip :port from IPv4 addresses. This is allowed in Forwarded + // and may occur in X-Forwarded-For. + $i = strpos($clientIp, ':'); + if ($i) { + $clientIps[$key] = $clientIp = substr($clientIp, 0, $i); + } + } elseif (0 === strpos($clientIp, '[')) { + // Strip brackets and :port from IPv6 addresses. + $i = strpos($clientIp, ']', 1); + $clientIps[$key] = $clientIp = substr($clientIp, 1, $i - 1); + } + + if (!filter_var($clientIp, FILTER_VALIDATE_IP)) { + unset($clientIps[$key]); + + continue; + } + + if (IpUtils::checkIp($clientIp, self::$trustedProxies)) { + unset($clientIps[$key]); + + // Fallback to this when the client IP falls into the range of trusted proxies + if (null === $firstTrustedIp) { + $firstTrustedIp = $clientIp; + } + } + } + + // Now the IP chain contains only untrusted proxies and the client IP + return $clientIps ? array_reverse($clientIps) : [$firstTrustedIp]; + } +} diff --git a/vendor/symfony/http-foundation/RequestMatcher.php b/vendor/symfony/http-foundation/RequestMatcher.php new file mode 100644 index 0000000..c32c5cd --- /dev/null +++ b/vendor/symfony/http-foundation/RequestMatcher.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * RequestMatcher compares a pre-defined set of checks against a Request instance. + * + * @author Fabien Potencier + */ +class RequestMatcher implements RequestMatcherInterface +{ + /** + * @var string|null + */ + private $path; + + /** + * @var string|null + */ + private $host; + + /** + * @var int|null + */ + private $port; + + /** + * @var string[] + */ + private $methods = []; + + /** + * @var string[] + */ + private $ips = []; + + /** + * @var array + */ + private $attributes = []; + + /** + * @var string[] + */ + private $schemes = []; + + /** + * @param string|string[]|null $methods + * @param string|string[]|null $ips + * @param string|string[]|null $schemes + */ + public function __construct(string $path = null, string $host = null, $methods = null, $ips = null, array $attributes = [], $schemes = null, int $port = null) + { + $this->matchPath($path); + $this->matchHost($host); + $this->matchMethod($methods); + $this->matchIps($ips); + $this->matchScheme($schemes); + $this->matchPort($port); + + foreach ($attributes as $k => $v) { + $this->matchAttribute($k, $v); + } + } + + /** + * Adds a check for the HTTP scheme. + * + * @param string|string[]|null $scheme An HTTP scheme or an array of HTTP schemes + */ + public function matchScheme($scheme) + { + $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : []; + } + + /** + * Adds a check for the URL host name. + */ + public function matchHost(?string $regexp) + { + $this->host = $regexp; + } + + /** + * Adds a check for the the URL port. + * + * @param int|null $port The port number to connect to + */ + public function matchPort(?int $port) + { + $this->port = $port; + } + + /** + * Adds a check for the URL path info. + */ + public function matchPath(?string $regexp) + { + $this->path = $regexp; + } + + /** + * Adds a check for the client IP. + * + * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 + */ + public function matchIp(string $ip) + { + $this->matchIps($ip); + } + + /** + * Adds a check for the client IP. + * + * @param string|string[]|null $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 + */ + public function matchIps($ips) + { + $this->ips = null !== $ips ? (array) $ips : []; + } + + /** + * Adds a check for the HTTP method. + * + * @param string|string[]|null $method An HTTP method or an array of HTTP methods + */ + public function matchMethod($method) + { + $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : []; + } + + /** + * Adds a check for request attribute. + */ + public function matchAttribute(string $key, string $regexp) + { + $this->attributes[$key] = $regexp; + } + + /** + * {@inheritdoc} + */ + public function matches(Request $request) + { + if ($this->schemes && !\in_array($request->getScheme(), $this->schemes, true)) { + return false; + } + + if ($this->methods && !\in_array($request->getMethod(), $this->methods, true)) { + return false; + } + + foreach ($this->attributes as $key => $pattern) { + if (!preg_match('{'.$pattern.'}', $request->attributes->get($key))) { + return false; + } + } + + if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) { + return false; + } + + if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) { + return false; + } + + if (null !== $this->port && 0 < $this->port && $request->getPort() !== $this->port) { + return false; + } + + if (IpUtils::checkIp($request->getClientIp(), $this->ips)) { + return true; + } + + // Note to future implementors: add additional checks above the + // foreach above or else your check might not be run! + return 0 === \count($this->ips); + } +} diff --git a/vendor/symfony/http-foundation/RequestMatcherInterface.php b/vendor/symfony/http-foundation/RequestMatcherInterface.php new file mode 100644 index 0000000..c26db3e --- /dev/null +++ b/vendor/symfony/http-foundation/RequestMatcherInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * RequestMatcherInterface is an interface for strategies to match a Request. + * + * @author Fabien Potencier + */ +interface RequestMatcherInterface +{ + /** + * Decides whether the rule(s) implemented by the strategy matches the supplied request. + * + * @return bool true if the request matches, false otherwise + */ + public function matches(Request $request); +} diff --git a/vendor/symfony/http-foundation/RequestStack.php b/vendor/symfony/http-foundation/RequestStack.php new file mode 100644 index 0000000..244a77d --- /dev/null +++ b/vendor/symfony/http-foundation/RequestStack.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * Request stack that controls the lifecycle of requests. + * + * @author Benjamin Eberlei + */ +class RequestStack +{ + /** + * @var Request[] + */ + private $requests = []; + + /** + * Pushes a Request on the stack. + * + * This method should generally not be called directly as the stack + * management should be taken care of by the application itself. + */ + public function push(Request $request) + { + $this->requests[] = $request; + } + + /** + * Pops the current request from the stack. + * + * This operation lets the current request go out of scope. + * + * This method should generally not be called directly as the stack + * management should be taken care of by the application itself. + * + * @return Request|null + */ + public function pop() + { + if (!$this->requests) { + return null; + } + + return array_pop($this->requests); + } + + /** + * @return Request|null + */ + public function getCurrentRequest() + { + return end($this->requests) ?: null; + } + + /** + * Gets the master Request. + * + * Be warned that making your code aware of the master request + * might make it un-compatible with other features of your framework + * like ESI support. + * + * @return Request|null + */ + public function getMasterRequest() + { + if (!$this->requests) { + return null; + } + + return $this->requests[0]; + } + + /** + * Returns the parent request of the current. + * + * Be warned that making your code aware of the parent request + * might make it un-compatible with other features of your framework + * like ESI support. + * + * If current Request is the master request, it returns null. + * + * @return Request|null + */ + public function getParentRequest() + { + $pos = \count($this->requests) - 2; + + if (!isset($this->requests[$pos])) { + return null; + } + + return $this->requests[$pos]; + } +} diff --git a/vendor/symfony/http-foundation/Response.php b/vendor/symfony/http-foundation/Response.php new file mode 100644 index 0000000..ddfd182 --- /dev/null +++ b/vendor/symfony/http-foundation/Response.php @@ -0,0 +1,1273 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +// Help opcache.preload discover always-needed symbols +class_exists(ResponseHeaderBag::class); + +/** + * Response represents an HTTP response. + * + * @author Fabien Potencier + */ +class Response +{ + const HTTP_CONTINUE = 100; + const HTTP_SWITCHING_PROTOCOLS = 101; + const HTTP_PROCESSING = 102; // RFC2518 + const HTTP_EARLY_HINTS = 103; // RFC8297 + const HTTP_OK = 200; + const HTTP_CREATED = 201; + const HTTP_ACCEPTED = 202; + const HTTP_NON_AUTHORITATIVE_INFORMATION = 203; + const HTTP_NO_CONTENT = 204; + const HTTP_RESET_CONTENT = 205; + const HTTP_PARTIAL_CONTENT = 206; + const HTTP_MULTI_STATUS = 207; // RFC4918 + const HTTP_ALREADY_REPORTED = 208; // RFC5842 + const HTTP_IM_USED = 226; // RFC3229 + const HTTP_MULTIPLE_CHOICES = 300; + const HTTP_MOVED_PERMANENTLY = 301; + const HTTP_FOUND = 302; + const HTTP_SEE_OTHER = 303; + const HTTP_NOT_MODIFIED = 304; + const HTTP_USE_PROXY = 305; + const HTTP_RESERVED = 306; + const HTTP_TEMPORARY_REDIRECT = 307; + const HTTP_PERMANENTLY_REDIRECT = 308; // RFC7238 + const HTTP_BAD_REQUEST = 400; + const HTTP_UNAUTHORIZED = 401; + const HTTP_PAYMENT_REQUIRED = 402; + const HTTP_FORBIDDEN = 403; + const HTTP_NOT_FOUND = 404; + const HTTP_METHOD_NOT_ALLOWED = 405; + const HTTP_NOT_ACCEPTABLE = 406; + const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407; + const HTTP_REQUEST_TIMEOUT = 408; + const HTTP_CONFLICT = 409; + const HTTP_GONE = 410; + const HTTP_LENGTH_REQUIRED = 411; + const HTTP_PRECONDITION_FAILED = 412; + const HTTP_REQUEST_ENTITY_TOO_LARGE = 413; + const HTTP_REQUEST_URI_TOO_LONG = 414; + const HTTP_UNSUPPORTED_MEDIA_TYPE = 415; + const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416; + const HTTP_EXPECTATION_FAILED = 417; + const HTTP_I_AM_A_TEAPOT = 418; // RFC2324 + const HTTP_MISDIRECTED_REQUEST = 421; // RFC7540 + const HTTP_UNPROCESSABLE_ENTITY = 422; // RFC4918 + const HTTP_LOCKED = 423; // RFC4918 + const HTTP_FAILED_DEPENDENCY = 424; // RFC4918 + const HTTP_TOO_EARLY = 425; // RFC-ietf-httpbis-replay-04 + const HTTP_UPGRADE_REQUIRED = 426; // RFC2817 + const HTTP_PRECONDITION_REQUIRED = 428; // RFC6585 + const HTTP_TOO_MANY_REQUESTS = 429; // RFC6585 + const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC6585 + const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451; + const HTTP_INTERNAL_SERVER_ERROR = 500; + const HTTP_NOT_IMPLEMENTED = 501; + const HTTP_BAD_GATEWAY = 502; + const HTTP_SERVICE_UNAVAILABLE = 503; + const HTTP_GATEWAY_TIMEOUT = 504; + const HTTP_VERSION_NOT_SUPPORTED = 505; + const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; // RFC2295 + const HTTP_INSUFFICIENT_STORAGE = 507; // RFC4918 + const HTTP_LOOP_DETECTED = 508; // RFC5842 + const HTTP_NOT_EXTENDED = 510; // RFC2774 + const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC6585 + + /** + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + */ + private const HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES = [ + 'must_revalidate' => false, + 'no_cache' => false, + 'no_store' => false, + 'no_transform' => false, + 'public' => false, + 'private' => false, + 'proxy_revalidate' => false, + 'max_age' => true, + 's_maxage' => true, + 'immutable' => false, + 'last_modified' => true, + 'etag' => true, + ]; + + /** + * @var ResponseHeaderBag + */ + public $headers; + + /** + * @var string + */ + protected $content; + + /** + * @var string + */ + protected $version; + + /** + * @var int + */ + protected $statusCode; + + /** + * @var string + */ + protected $statusText; + + /** + * @var string + */ + protected $charset; + + /** + * Status codes translation table. + * + * The list of codes is complete according to the + * {@link https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Protocol (HTTP) Status Code Registry} + * (last updated 2016-03-01). + * + * Unless otherwise noted, the status code is defined in RFC2616. + * + * @var array + */ + public static $statusTexts = [ + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', // RFC2518 + 103 => 'Early Hints', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', // RFC4918 + 208 => 'Already Reported', // RFC5842 + 226 => 'IM Used', // RFC3229 + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', // RFC7238 + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Payload Too Large', + 414 => 'URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Range Not Satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', // RFC2324 + 421 => 'Misdirected Request', // RFC7540 + 422 => 'Unprocessable Entity', // RFC4918 + 423 => 'Locked', // RFC4918 + 424 => 'Failed Dependency', // RFC4918 + 425 => 'Too Early', // RFC-ietf-httpbis-replay-04 + 426 => 'Upgrade Required', // RFC2817 + 428 => 'Precondition Required', // RFC6585 + 429 => 'Too Many Requests', // RFC6585 + 431 => 'Request Header Fields Too Large', // RFC6585 + 451 => 'Unavailable For Legal Reasons', // RFC7725 + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates', // RFC2295 + 507 => 'Insufficient Storage', // RFC4918 + 508 => 'Loop Detected', // RFC5842 + 510 => 'Not Extended', // RFC2774 + 511 => 'Network Authentication Required', // RFC6585 + ]; + + /** + * @throws \InvalidArgumentException When the HTTP status code is not valid + */ + public function __construct(?string $content = '', int $status = 200, array $headers = []) + { + $this->headers = new ResponseHeaderBag($headers); + $this->setContent($content); + $this->setStatusCode($status); + $this->setProtocolVersion('1.0'); + } + + /** + * Factory method for chainability. + * + * Example: + * + * return Response::create($body, 200) + * ->setSharedMaxAge(300); + * + * @return static + * + * @deprecated since Symfony 5.1, use __construct() instead. + */ + public static function create(?string $content = '', int $status = 200, array $headers = []) + { + trigger_deprecation('symfony/http-foundation', '5.1', 'The "%s()" method is deprecated, use "new %s()" instead.', __METHOD__, \get_called_class()); + + return new static($content, $status, $headers); + } + + /** + * Returns the Response as an HTTP string. + * + * The string representation of the Response is the same as the + * one that will be sent to the client only if the prepare() method + * has been called before. + * + * @return string The Response as an HTTP string + * + * @see prepare() + */ + public function __toString() + { + return + sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". + $this->headers."\r\n". + $this->getContent(); + } + + /** + * Clones the current Response instance. + */ + public function __clone() + { + $this->headers = clone $this->headers; + } + + /** + * Prepares the Response before it is sent to the client. + * + * This method tweaks the Response to ensure that it is + * compliant with RFC 2616. Most of the changes are based on + * the Request that is "associated" with this Response. + * + * @return $this + */ + public function prepare(Request $request) + { + $headers = $this->headers; + + if ($this->isInformational() || $this->isEmpty()) { + $this->setContent(null); + $headers->remove('Content-Type'); + $headers->remove('Content-Length'); + // prevent PHP from sending the Content-Type header based on default_mimetype + ini_set('default_mimetype', ''); + } else { + // Content-type based on the Request + if (!$headers->has('Content-Type')) { + $format = $request->getRequestFormat(null); + if (null !== $format && $mimeType = $request->getMimeType($format)) { + $headers->set('Content-Type', $mimeType); + } + } + + // Fix Content-Type + $charset = $this->charset ?: 'UTF-8'; + if (!$headers->has('Content-Type')) { + $headers->set('Content-Type', 'text/html; charset='.$charset); + } elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos($headers->get('Content-Type'), 'charset')) { + // add the charset + $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset); + } + + // Fix Content-Length + if ($headers->has('Transfer-Encoding')) { + $headers->remove('Content-Length'); + } + + if ($request->isMethod('HEAD')) { + // cf. RFC2616 14.13 + $length = $headers->get('Content-Length'); + $this->setContent(null); + if ($length) { + $headers->set('Content-Length', $length); + } + } + } + + // Fix protocol + if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) { + $this->setProtocolVersion('1.1'); + } + + // Check if we need to send extra expire info headers + if ('1.0' == $this->getProtocolVersion() && false !== strpos($headers->get('Cache-Control'), 'no-cache')) { + $headers->set('pragma', 'no-cache'); + $headers->set('expires', -1); + } + + $this->ensureIEOverSSLCompatibility($request); + + if ($request->isSecure()) { + foreach ($headers->getCookies() as $cookie) { + $cookie->setSecureDefault(true); + } + } + + return $this; + } + + /** + * Sends HTTP headers. + * + * @return $this + */ + public function sendHeaders() + { + // headers have already been sent by the developer + if (headers_sent()) { + return $this; + } + + // headers + foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) { + $replace = 0 === strcasecmp($name, 'Content-Type'); + foreach ($values as $value) { + header($name.': '.$value, $replace, $this->statusCode); + } + } + + // cookies + foreach ($this->headers->getCookies() as $cookie) { + header('Set-Cookie: '.$cookie, false, $this->statusCode); + } + + // status + header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode); + + return $this; + } + + /** + * Sends content for the current web response. + * + * @return $this + */ + public function sendContent() + { + echo $this->content; + + return $this; + } + + /** + * Sends HTTP headers and content. + * + * @return $this + */ + public function send() + { + $this->sendHeaders(); + $this->sendContent(); + + if (\function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); + } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) { + static::closeOutputBuffers(0, true); + } + + return $this; + } + + /** + * Sets the response content. + * + * @return $this + * + * @throws \UnexpectedValueException + */ + public function setContent(?string $content) + { + $this->content = $content ?? ''; + + return $this; + } + + /** + * Gets the current response content. + * + * @return string|false + */ + public function getContent() + { + return $this->content; + } + + /** + * Sets the HTTP protocol version (1.0 or 1.1). + * + * @return $this + * + * @final + */ + public function setProtocolVersion(string $version): object + { + $this->version = $version; + + return $this; + } + + /** + * Gets the HTTP protocol version. + * + * @final + */ + public function getProtocolVersion(): string + { + return $this->version; + } + + /** + * Sets the response status code. + * + * If the status text is null it will be automatically populated for the known + * status codes and left empty otherwise. + * + * @return $this + * + * @throws \InvalidArgumentException When the HTTP status code is not valid + * + * @final + */ + public function setStatusCode(int $code, $text = null): object + { + $this->statusCode = $code; + if ($this->isInvalid()) { + throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code)); + } + + if (null === $text) { + $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : 'unknown status'; + + return $this; + } + + if (false === $text) { + $this->statusText = ''; + + return $this; + } + + $this->statusText = $text; + + return $this; + } + + /** + * Retrieves the status code for the current web response. + * + * @final + */ + public function getStatusCode(): int + { + return $this->statusCode; + } + + /** + * Sets the response charset. + * + * @return $this + * + * @final + */ + public function setCharset(string $charset): object + { + $this->charset = $charset; + + return $this; + } + + /** + * Retrieves the response charset. + * + * @final + */ + public function getCharset(): ?string + { + return $this->charset; + } + + /** + * Returns true if the response may safely be kept in a shared (surrogate) cache. + * + * Responses marked "private" with an explicit Cache-Control directive are + * considered uncacheable. + * + * Responses with neither a freshness lifetime (Expires, max-age) nor cache + * validator (Last-Modified, ETag) are considered uncacheable because there is + * no way to tell when or how to remove them from the cache. + * + * Note that RFC 7231 and RFC 7234 possibly allow for a more permissive implementation, + * for example "status codes that are defined as cacheable by default [...] + * can be reused by a cache with heuristic expiration unless otherwise indicated" + * (https://tools.ietf.org/html/rfc7231#section-6.1) + * + * @final + */ + public function isCacheable(): bool + { + if (!\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410])) { + return false; + } + + if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) { + return false; + } + + return $this->isValidateable() || $this->isFresh(); + } + + /** + * Returns true if the response is "fresh". + * + * Fresh responses may be served from cache without any interaction with the + * origin. A response is considered fresh when it includes a Cache-Control/max-age + * indicator or Expires header and the calculated age is less than the freshness lifetime. + * + * @final + */ + public function isFresh(): bool + { + return $this->getTtl() > 0; + } + + /** + * Returns true if the response includes headers that can be used to validate + * the response with the origin server using a conditional GET request. + * + * @final + */ + public function isValidateable(): bool + { + return $this->headers->has('Last-Modified') || $this->headers->has('ETag'); + } + + /** + * Marks the response as "private". + * + * It makes the response ineligible for serving other clients. + * + * @return $this + * + * @final + */ + public function setPrivate(): object + { + $this->headers->removeCacheControlDirective('public'); + $this->headers->addCacheControlDirective('private'); + + return $this; + } + + /** + * Marks the response as "public". + * + * It makes the response eligible for serving other clients. + * + * @return $this + * + * @final + */ + public function setPublic(): object + { + $this->headers->addCacheControlDirective('public'); + $this->headers->removeCacheControlDirective('private'); + + return $this; + } + + /** + * Marks the response as "immutable". + * + * @return $this + * + * @final + */ + public function setImmutable(bool $immutable = true): object + { + if ($immutable) { + $this->headers->addCacheControlDirective('immutable'); + } else { + $this->headers->removeCacheControlDirective('immutable'); + } + + return $this; + } + + /** + * Returns true if the response is marked as "immutable". + * + * @final + */ + public function isImmutable(): bool + { + return $this->headers->hasCacheControlDirective('immutable'); + } + + /** + * Returns true if the response must be revalidated by shared caches once it has become stale. + * + * This method indicates that the response must not be served stale by a + * cache in any circumstance without first revalidating with the origin. + * When present, the TTL of the response should not be overridden to be + * greater than the value provided by the origin. + * + * @final + */ + public function mustRevalidate(): bool + { + return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate'); + } + + /** + * Returns the Date header as a DateTime instance. + * + * @throws \RuntimeException When the header is not parseable + * + * @final + */ + public function getDate(): ?\DateTimeInterface + { + return $this->headers->getDate('Date'); + } + + /** + * Sets the Date header. + * + * @return $this + * + * @final + */ + public function setDate(\DateTimeInterface $date): object + { + if ($date instanceof \DateTime) { + $date = \DateTimeImmutable::createFromMutable($date); + } + + $date = $date->setTimezone(new \DateTimeZone('UTC')); + $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT'); + + return $this; + } + + /** + * Returns the age of the response in seconds. + * + * @final + */ + public function getAge(): int + { + if (null !== $age = $this->headers->get('Age')) { + return (int) $age; + } + + return max(time() - (int) $this->getDate()->format('U'), 0); + } + + /** + * Marks the response stale by setting the Age header to be equal to the maximum age of the response. + * + * @return $this + */ + public function expire() + { + if ($this->isFresh()) { + $this->headers->set('Age', $this->getMaxAge()); + $this->headers->remove('Expires'); + } + + return $this; + } + + /** + * Returns the value of the Expires header as a DateTime instance. + * + * @final + */ + public function getExpires(): ?\DateTimeInterface + { + try { + return $this->headers->getDate('Expires'); + } catch (\RuntimeException $e) { + // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past + return \DateTime::createFromFormat('U', time() - 172800); + } + } + + /** + * Sets the Expires HTTP header with a DateTime instance. + * + * Passing null as value will remove the header. + * + * @return $this + * + * @final + */ + public function setExpires(\DateTimeInterface $date = null): object + { + if (null === $date) { + $this->headers->remove('Expires'); + + return $this; + } + + if ($date instanceof \DateTime) { + $date = \DateTimeImmutable::createFromMutable($date); + } + + $date = $date->setTimezone(new \DateTimeZone('UTC')); + $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT'); + + return $this; + } + + /** + * Returns the number of seconds after the time specified in the response's Date + * header when the response should no longer be considered fresh. + * + * First, it checks for a s-maxage directive, then a max-age directive, and then it falls + * back on an expires header. It returns null when no maximum age can be established. + * + * @final + */ + public function getMaxAge(): ?int + { + if ($this->headers->hasCacheControlDirective('s-maxage')) { + return (int) $this->headers->getCacheControlDirective('s-maxage'); + } + + if ($this->headers->hasCacheControlDirective('max-age')) { + return (int) $this->headers->getCacheControlDirective('max-age'); + } + + if (null !== $this->getExpires()) { + return (int) $this->getExpires()->format('U') - (int) $this->getDate()->format('U'); + } + + return null; + } + + /** + * Sets the number of seconds after which the response should no longer be considered fresh. + * + * This methods sets the Cache-Control max-age directive. + * + * @return $this + * + * @final + */ + public function setMaxAge(int $value): object + { + $this->headers->addCacheControlDirective('max-age', $value); + + return $this; + } + + /** + * Sets the number of seconds after which the response should no longer be considered fresh by shared caches. + * + * This methods sets the Cache-Control s-maxage directive. + * + * @return $this + * + * @final + */ + public function setSharedMaxAge(int $value): object + { + $this->setPublic(); + $this->headers->addCacheControlDirective('s-maxage', $value); + + return $this; + } + + /** + * Returns the response's time-to-live in seconds. + * + * It returns null when no freshness information is present in the response. + * + * When the responses TTL is <= 0, the response may not be served from cache without first + * revalidating with the origin. + * + * @final + */ + public function getTtl(): ?int + { + $maxAge = $this->getMaxAge(); + + return null !== $maxAge ? $maxAge - $this->getAge() : null; + } + + /** + * Sets the response's time-to-live for shared caches in seconds. + * + * This method adjusts the Cache-Control/s-maxage directive. + * + * @return $this + * + * @final + */ + public function setTtl(int $seconds): object + { + $this->setSharedMaxAge($this->getAge() + $seconds); + + return $this; + } + + /** + * Sets the response's time-to-live for private/client caches in seconds. + * + * This method adjusts the Cache-Control/max-age directive. + * + * @return $this + * + * @final + */ + public function setClientTtl(int $seconds): object + { + $this->setMaxAge($this->getAge() + $seconds); + + return $this; + } + + /** + * Returns the Last-Modified HTTP header as a DateTime instance. + * + * @throws \RuntimeException When the HTTP header is not parseable + * + * @final + */ + public function getLastModified(): ?\DateTimeInterface + { + return $this->headers->getDate('Last-Modified'); + } + + /** + * Sets the Last-Modified HTTP header with a DateTime instance. + * + * Passing null as value will remove the header. + * + * @return $this + * + * @final + */ + public function setLastModified(\DateTimeInterface $date = null): object + { + if (null === $date) { + $this->headers->remove('Last-Modified'); + + return $this; + } + + if ($date instanceof \DateTime) { + $date = \DateTimeImmutable::createFromMutable($date); + } + + $date = $date->setTimezone(new \DateTimeZone('UTC')); + $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT'); + + return $this; + } + + /** + * Returns the literal value of the ETag HTTP header. + * + * @final + */ + public function getEtag(): ?string + { + return $this->headers->get('ETag'); + } + + /** + * Sets the ETag value. + * + * @param string|null $etag The ETag unique identifier or null to remove the header + * @param bool $weak Whether you want a weak ETag or not + * + * @return $this + * + * @final + */ + public function setEtag(string $etag = null, bool $weak = false): object + { + if (null === $etag) { + $this->headers->remove('Etag'); + } else { + if (0 !== strpos($etag, '"')) { + $etag = '"'.$etag.'"'; + } + + $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag); + } + + return $this; + } + + /** + * Sets the response's cache headers (validation and/or expiration). + * + * Available options are: must_revalidate, no_cache, no_store, no_transform, public, private, proxy_revalidate, max_age, s_maxage, immutable, last_modified and etag. + * + * @return $this + * + * @throws \InvalidArgumentException + * + * @final + */ + public function setCache(array $options): object + { + if ($diff = array_diff(array_keys($options), array_keys(self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES))) { + throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', $diff))); + } + + if (isset($options['etag'])) { + $this->setEtag($options['etag']); + } + + if (isset($options['last_modified'])) { + $this->setLastModified($options['last_modified']); + } + + if (isset($options['max_age'])) { + $this->setMaxAge($options['max_age']); + } + + if (isset($options['s_maxage'])) { + $this->setSharedMaxAge($options['s_maxage']); + } + + foreach (self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES as $directive => $hasValue) { + if (!$hasValue && isset($options[$directive])) { + if ($options[$directive]) { + $this->headers->addCacheControlDirective(str_replace('_', '-', $directive)); + } else { + $this->headers->removeCacheControlDirective(str_replace('_', '-', $directive)); + } + } + } + + if (isset($options['public'])) { + if ($options['public']) { + $this->setPublic(); + } else { + $this->setPrivate(); + } + } + + if (isset($options['private'])) { + if ($options['private']) { + $this->setPrivate(); + } else { + $this->setPublic(); + } + } + + return $this; + } + + /** + * Modifies the response so that it conforms to the rules defined for a 304 status code. + * + * This sets the status, removes the body, and discards any headers + * that MUST NOT be included in 304 responses. + * + * @return $this + * + * @see https://tools.ietf.org/html/rfc2616#section-10.3.5 + * + * @final + */ + public function setNotModified(): object + { + $this->setStatusCode(304); + $this->setContent(null); + + // remove headers that MUST NOT be included with 304 Not Modified responses + foreach (['Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified'] as $header) { + $this->headers->remove($header); + } + + return $this; + } + + /** + * Returns true if the response includes a Vary header. + * + * @final + */ + public function hasVary(): bool + { + return null !== $this->headers->get('Vary'); + } + + /** + * Returns an array of header names given in the Vary header. + * + * @final + */ + public function getVary(): array + { + if (!$vary = $this->headers->all('Vary')) { + return []; + } + + $ret = []; + foreach ($vary as $item) { + $ret = array_merge($ret, preg_split('/[\s,]+/', $item)); + } + + return $ret; + } + + /** + * Sets the Vary header. + * + * @param string|array $headers + * @param bool $replace Whether to replace the actual value or not (true by default) + * + * @return $this + * + * @final + */ + public function setVary($headers, bool $replace = true): object + { + $this->headers->set('Vary', $headers, $replace); + + return $this; + } + + /** + * Determines if the Response validators (ETag, Last-Modified) match + * a conditional value specified in the Request. + * + * If the Response is not modified, it sets the status code to 304 and + * removes the actual content by calling the setNotModified() method. + * + * @return bool true if the Response validators match the Request, false otherwise + * + * @final + */ + public function isNotModified(Request $request): bool + { + if (!$request->isMethodCacheable()) { + return false; + } + + $notModified = false; + $lastModified = $this->headers->get('Last-Modified'); + $modifiedSince = $request->headers->get('If-Modified-Since'); + + if ($etags = $request->getETags()) { + $notModified = \in_array($this->getEtag(), $etags) || \in_array('*', $etags); + } + + if ($modifiedSince && $lastModified) { + $notModified = strtotime($modifiedSince) >= strtotime($lastModified) && (!$etags || $notModified); + } + + if ($notModified) { + $this->setNotModified(); + } + + return $notModified; + } + + /** + * Is response invalid? + * + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + * + * @final + */ + public function isInvalid(): bool + { + return $this->statusCode < 100 || $this->statusCode >= 600; + } + + /** + * Is response informative? + * + * @final + */ + public function isInformational(): bool + { + return $this->statusCode >= 100 && $this->statusCode < 200; + } + + /** + * Is response successful? + * + * @final + */ + public function isSuccessful(): bool + { + return $this->statusCode >= 200 && $this->statusCode < 300; + } + + /** + * Is the response a redirect? + * + * @final + */ + public function isRedirection(): bool + { + return $this->statusCode >= 300 && $this->statusCode < 400; + } + + /** + * Is there a client error? + * + * @final + */ + public function isClientError(): bool + { + return $this->statusCode >= 400 && $this->statusCode < 500; + } + + /** + * Was there a server side error? + * + * @final + */ + public function isServerError(): bool + { + return $this->statusCode >= 500 && $this->statusCode < 600; + } + + /** + * Is the response OK? + * + * @final + */ + public function isOk(): bool + { + return 200 === $this->statusCode; + } + + /** + * Is the response forbidden? + * + * @final + */ + public function isForbidden(): bool + { + return 403 === $this->statusCode; + } + + /** + * Is the response a not found error? + * + * @final + */ + public function isNotFound(): bool + { + return 404 === $this->statusCode; + } + + /** + * Is the response a redirect of some form? + * + * @final + */ + public function isRedirect(string $location = null): bool + { + return \in_array($this->statusCode, [201, 301, 302, 303, 307, 308]) && (null === $location ?: $location == $this->headers->get('Location')); + } + + /** + * Is the response empty? + * + * @final + */ + public function isEmpty(): bool + { + return \in_array($this->statusCode, [204, 304]); + } + + /** + * Cleans or flushes output buffers up to target level. + * + * Resulting level can be greater than target level if a non-removable buffer has been encountered. + * + * @final + */ + public static function closeOutputBuffers(int $targetLevel, bool $flush): void + { + $status = ob_get_status(true); + $level = \count($status); + $flags = PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE); + + while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) { + if ($flush) { + ob_end_flush(); + } else { + ob_end_clean(); + } + } + } + + /** + * Marks a response as safe according to RFC8674. + * + * @see https://tools.ietf.org/html/rfc8674 + */ + public function setContentSafe(bool $safe = true): void + { + if ($safe) { + $this->headers->set('Preference-Applied', 'safe'); + } elseif ('safe' === $this->headers->get('Preference-Applied')) { + $this->headers->remove('Preference-Applied'); + } + + $this->setVary('Prefer', false); + } + + /** + * Checks if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9. + * + * @see http://support.microsoft.com/kb/323308 + * + * @final + */ + protected function ensureIEOverSSLCompatibility(Request $request): void + { + if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && 1 == preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) && true === $request->isSecure()) { + if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) { + $this->headers->remove('Cache-Control'); + } + } + } +} diff --git a/vendor/symfony/http-foundation/ResponseHeaderBag.php b/vendor/symfony/http-foundation/ResponseHeaderBag.php new file mode 100644 index 0000000..76e11ce --- /dev/null +++ b/vendor/symfony/http-foundation/ResponseHeaderBag.php @@ -0,0 +1,291 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * ResponseHeaderBag is a container for Response HTTP headers. + * + * @author Fabien Potencier + */ +class ResponseHeaderBag extends HeaderBag +{ + const COOKIES_FLAT = 'flat'; + const COOKIES_ARRAY = 'array'; + + const DISPOSITION_ATTACHMENT = 'attachment'; + const DISPOSITION_INLINE = 'inline'; + + protected $computedCacheControl = []; + protected $cookies = []; + protected $headerNames = []; + + public function __construct(array $headers = []) + { + parent::__construct($headers); + + if (!isset($this->headers['cache-control'])) { + $this->set('Cache-Control', ''); + } + + /* RFC2616 - 14.18 says all Responses need to have a Date */ + if (!isset($this->headers['date'])) { + $this->initDate(); + } + } + + /** + * Returns the headers, with original capitalizations. + * + * @return array An array of headers + */ + public function allPreserveCase() + { + $headers = []; + foreach ($this->all() as $name => $value) { + $headers[$this->headerNames[$name] ?? $name] = $value; + } + + return $headers; + } + + public function allPreserveCaseWithoutCookies() + { + $headers = $this->allPreserveCase(); + if (isset($this->headerNames['set-cookie'])) { + unset($headers[$this->headerNames['set-cookie']]); + } + + return $headers; + } + + /** + * {@inheritdoc} + */ + public function replace(array $headers = []) + { + $this->headerNames = []; + + parent::replace($headers); + + if (!isset($this->headers['cache-control'])) { + $this->set('Cache-Control', ''); + } + + if (!isset($this->headers['date'])) { + $this->initDate(); + } + } + + /** + * {@inheritdoc} + */ + public function all(string $key = null) + { + $headers = parent::all(); + + if (null !== $key) { + $key = strtr($key, self::UPPER, self::LOWER); + + return 'set-cookie' !== $key ? $headers[$key] ?? [] : array_map('strval', $this->getCookies()); + } + + foreach ($this->getCookies() as $cookie) { + $headers['set-cookie'][] = (string) $cookie; + } + + return $headers; + } + + /** + * {@inheritdoc} + */ + public function set(string $key, $values, bool $replace = true) + { + $uniqueKey = strtr($key, self::UPPER, self::LOWER); + + if ('set-cookie' === $uniqueKey) { + if ($replace) { + $this->cookies = []; + } + foreach ((array) $values as $cookie) { + $this->setCookie(Cookie::fromString($cookie)); + } + $this->headerNames[$uniqueKey] = $key; + + return; + } + + $this->headerNames[$uniqueKey] = $key; + + parent::set($key, $values, $replace); + + // ensure the cache-control header has sensible defaults + if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true) && '' !== $computed = $this->computeCacheControlValue()) { + $this->headers['cache-control'] = [$computed]; + $this->headerNames['cache-control'] = 'Cache-Control'; + $this->computedCacheControl = $this->parseCacheControl($computed); + } + } + + /** + * {@inheritdoc} + */ + public function remove(string $key) + { + $uniqueKey = strtr($key, self::UPPER, self::LOWER); + unset($this->headerNames[$uniqueKey]); + + if ('set-cookie' === $uniqueKey) { + $this->cookies = []; + + return; + } + + parent::remove($key); + + if ('cache-control' === $uniqueKey) { + $this->computedCacheControl = []; + } + + if ('date' === $uniqueKey) { + $this->initDate(); + } + } + + /** + * {@inheritdoc} + */ + public function hasCacheControlDirective(string $key) + { + return \array_key_exists($key, $this->computedCacheControl); + } + + /** + * {@inheritdoc} + */ + public function getCacheControlDirective(string $key) + { + return \array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null; + } + + public function setCookie(Cookie $cookie) + { + $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie; + $this->headerNames['set-cookie'] = 'Set-Cookie'; + } + + /** + * Removes a cookie from the array, but does not unset it in the browser. + */ + public function removeCookie(string $name, ?string $path = '/', string $domain = null) + { + if (null === $path) { + $path = '/'; + } + + unset($this->cookies[$domain][$path][$name]); + + if (empty($this->cookies[$domain][$path])) { + unset($this->cookies[$domain][$path]); + + if (empty($this->cookies[$domain])) { + unset($this->cookies[$domain]); + } + } + + if (empty($this->cookies)) { + unset($this->headerNames['set-cookie']); + } + } + + /** + * Returns an array with all cookies. + * + * @return Cookie[] + * + * @throws \InvalidArgumentException When the $format is invalid + */ + public function getCookies(string $format = self::COOKIES_FLAT) + { + if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) { + throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY]))); + } + + if (self::COOKIES_ARRAY === $format) { + return $this->cookies; + } + + $flattenedCookies = []; + foreach ($this->cookies as $path) { + foreach ($path as $cookies) { + foreach ($cookies as $cookie) { + $flattenedCookies[] = $cookie; + } + } + } + + return $flattenedCookies; + } + + /** + * Clears a cookie in the browser. + */ + public function clearCookie(string $name, ?string $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true, string $sameSite = null) + { + $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite)); + } + + /** + * @see HeaderUtils::makeDisposition() + */ + public function makeDisposition(string $disposition, string $filename, string $filenameFallback = '') + { + return HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback); + } + + /** + * Returns the calculated value of the cache-control header. + * + * This considers several other headers and calculates or modifies the + * cache-control header to a sensible, conservative value. + * + * @return string + */ + protected function computeCacheControlValue() + { + if (!$this->cacheControl) { + if ($this->has('Last-Modified') || $this->has('Expires')) { + return 'private, must-revalidate'; // allows for heuristic expiration (RFC 7234 Section 4.2.2) in the case of "Last-Modified" + } + + // conservative by default + return 'no-cache, private'; + } + + $header = $this->getCacheControlHeader(); + if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) { + return $header; + } + + // public if s-maxage is defined, private otherwise + if (!isset($this->cacheControl['s-maxage'])) { + return $header.', private'; + } + + return $header; + } + + private function initDate(): void + { + $this->set('Date', gmdate('D, d M Y H:i:s').' GMT'); + } +} diff --git a/vendor/symfony/http-foundation/ServerBag.php b/vendor/symfony/http-foundation/ServerBag.php new file mode 100644 index 0000000..02c7091 --- /dev/null +++ b/vendor/symfony/http-foundation/ServerBag.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * ServerBag is a container for HTTP headers from the $_SERVER variable. + * + * @author Fabien Potencier + * @author Bulat Shakirzyanov + * @author Robert Kiss + */ +class ServerBag extends ParameterBag +{ + /** + * Gets the HTTP headers. + * + * @return array + */ + public function getHeaders() + { + $headers = []; + foreach ($this->parameters as $key => $value) { + if (0 === strpos($key, 'HTTP_')) { + $headers[substr($key, 5)] = $value; + } elseif (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) { + $headers[$key] = $value; + } + } + + if (isset($this->parameters['PHP_AUTH_USER'])) { + $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER']; + $headers['PHP_AUTH_PW'] = isset($this->parameters['PHP_AUTH_PW']) ? $this->parameters['PHP_AUTH_PW'] : ''; + } else { + /* + * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default + * For this workaround to work, add these lines to your .htaccess file: + * RewriteCond %{HTTP:Authorization} .+ + * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] + * + * A sample .htaccess file: + * RewriteEngine On + * RewriteCond %{HTTP:Authorization} .+ + * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] + * RewriteCond %{REQUEST_FILENAME} !-f + * RewriteRule ^(.*)$ app.php [QSA,L] + */ + + $authorizationHeader = null; + if (isset($this->parameters['HTTP_AUTHORIZATION'])) { + $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION']; + } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) { + $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION']; + } + + if (null !== $authorizationHeader) { + if (0 === stripos($authorizationHeader, 'basic ')) { + // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic + $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2); + if (2 == \count($exploded)) { + list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded; + } + } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) { + // In some circumstances PHP_AUTH_DIGEST needs to be set + $headers['PHP_AUTH_DIGEST'] = $authorizationHeader; + $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader; + } elseif (0 === stripos($authorizationHeader, 'bearer ')) { + /* + * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables, + * I'll just set $headers['AUTHORIZATION'] here. + * https://php.net/reserved.variables.server + */ + $headers['AUTHORIZATION'] = $authorizationHeader; + } + } + } + + if (isset($headers['AUTHORIZATION'])) { + return $headers; + } + + // PHP_AUTH_USER/PHP_AUTH_PW + if (isset($headers['PHP_AUTH_USER'])) { + $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']); + } elseif (isset($headers['PHP_AUTH_DIGEST'])) { + $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST']; + } + + return $headers; + } +} diff --git a/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php new file mode 100644 index 0000000..aad6b61 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Attribute; + +/** + * This class relates to session attribute storage. + */ +class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable +{ + private $name = 'attributes'; + private $storageKey; + + protected $attributes = []; + + /** + * @param string $storageKey The key used to store attributes in the session + */ + public function __construct(string $storageKey = '_sf2_attributes') + { + $this->storageKey = $storageKey; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } + + public function setName(string $name) + { + $this->name = $name; + } + + /** + * {@inheritdoc} + */ + public function initialize(array &$attributes) + { + $this->attributes = &$attributes; + } + + /** + * {@inheritdoc} + */ + public function getStorageKey() + { + return $this->storageKey; + } + + /** + * {@inheritdoc} + */ + public function has(string $name) + { + return \array_key_exists($name, $this->attributes); + } + + /** + * {@inheritdoc} + */ + public function get(string $name, $default = null) + { + return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; + } + + /** + * {@inheritdoc} + */ + public function set(string $name, $value) + { + $this->attributes[$name] = $value; + } + + /** + * {@inheritdoc} + */ + public function all() + { + return $this->attributes; + } + + /** + * {@inheritdoc} + */ + public function replace(array $attributes) + { + $this->attributes = []; + foreach ($attributes as $key => $value) { + $this->set($key, $value); + } + } + + /** + * {@inheritdoc} + */ + public function remove(string $name) + { + $retval = null; + if (\array_key_exists($name, $this->attributes)) { + $retval = $this->attributes[$name]; + unset($this->attributes[$name]); + } + + return $retval; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $return = $this->attributes; + $this->attributes = []; + + return $return; + } + + /** + * Returns an iterator for attributes. + * + * @return \ArrayIterator An \ArrayIterator instance + */ + public function getIterator() + { + return new \ArrayIterator($this->attributes); + } + + /** + * Returns the number of attributes. + * + * @return int The number of attributes + */ + public function count() + { + return \count($this->attributes); + } +} diff --git a/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php b/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php new file mode 100644 index 0000000..7017b71 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Attribute; + +use Symfony\Component\HttpFoundation\Session\SessionBagInterface; + +/** + * Attributes store. + * + * @author Drak + */ +interface AttributeBagInterface extends SessionBagInterface +{ + /** + * Checks if an attribute is defined. + * + * @return bool true if the attribute is defined, false otherwise + */ + public function has(string $name); + + /** + * Returns an attribute. + * + * @param mixed $default The default value if not found + * + * @return mixed + */ + public function get(string $name, $default = null); + + /** + * Sets an attribute. + * + * @param mixed $value + */ + public function set(string $name, $value); + + /** + * Returns attributes. + * + * @return array + */ + public function all(); + + public function replace(array $attributes); + + /** + * Removes an attribute. + * + * @return mixed The removed value or null when it does not exist + */ + public function remove(string $name); +} diff --git a/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php new file mode 100644 index 0000000..7e752dd --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php @@ -0,0 +1,157 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Attribute; + +/** + * This class provides structured storage of session attributes using + * a name spacing character in the key. + * + * @author Drak + */ +class NamespacedAttributeBag extends AttributeBag +{ + private $namespaceCharacter; + + /** + * @param string $storageKey Session storage key + * @param string $namespaceCharacter Namespace character to use in keys + */ + public function __construct(string $storageKey = '_sf2_attributes', string $namespaceCharacter = '/') + { + $this->namespaceCharacter = $namespaceCharacter; + parent::__construct($storageKey); + } + + /** + * {@inheritdoc} + */ + public function has(string $name) + { + // reference mismatch: if fixed, re-introduced in array_key_exists; keep as it is + $attributes = $this->resolveAttributePath($name); + $name = $this->resolveKey($name); + + if (null === $attributes) { + return false; + } + + return \array_key_exists($name, $attributes); + } + + /** + * {@inheritdoc} + */ + public function get(string $name, $default = null) + { + // reference mismatch: if fixed, re-introduced in array_key_exists; keep as it is + $attributes = $this->resolveAttributePath($name); + $name = $this->resolveKey($name); + + if (null === $attributes) { + return $default; + } + + return \array_key_exists($name, $attributes) ? $attributes[$name] : $default; + } + + /** + * {@inheritdoc} + */ + public function set(string $name, $value) + { + $attributes = &$this->resolveAttributePath($name, true); + $name = $this->resolveKey($name); + $attributes[$name] = $value; + } + + /** + * {@inheritdoc} + */ + public function remove(string $name) + { + $retval = null; + $attributes = &$this->resolveAttributePath($name); + $name = $this->resolveKey($name); + if (null !== $attributes && \array_key_exists($name, $attributes)) { + $retval = $attributes[$name]; + unset($attributes[$name]); + } + + return $retval; + } + + /** + * Resolves a path in attributes property and returns it as a reference. + * + * This method allows structured namespacing of session attributes. + * + * @param string $name Key name + * @param bool $writeContext Write context, default false + * + * @return array|null + */ + protected function &resolveAttributePath(string $name, bool $writeContext = false) + { + $array = &$this->attributes; + $name = (0 === strpos($name, $this->namespaceCharacter)) ? substr($name, 1) : $name; + + // Check if there is anything to do, else return + if (!$name) { + return $array; + } + + $parts = explode($this->namespaceCharacter, $name); + if (\count($parts) < 2) { + if (!$writeContext) { + return $array; + } + + $array[$parts[0]] = []; + + return $array; + } + + unset($parts[\count($parts) - 1]); + + foreach ($parts as $part) { + if (null !== $array && !\array_key_exists($part, $array)) { + if (!$writeContext) { + $null = null; + + return $null; + } + + $array[$part] = []; + } + + $array = &$array[$part]; + } + + return $array; + } + + /** + * Resolves the key from the name. + * + * This is the last part in a dot separated string. + * + * @return string + */ + protected function resolveKey(string $name) + { + if (false !== $pos = strrpos($name, $this->namespaceCharacter)) { + $name = substr($name, $pos + 1); + } + + return $name; + } +} diff --git a/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php new file mode 100644 index 0000000..2707d64 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php @@ -0,0 +1,161 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Flash; + +/** + * AutoExpireFlashBag flash message container. + * + * @author Drak + */ +class AutoExpireFlashBag implements FlashBagInterface +{ + private $name = 'flashes'; + private $flashes = ['display' => [], 'new' => []]; + private $storageKey; + + /** + * @param string $storageKey The key used to store flashes in the session + */ + public function __construct(string $storageKey = '_symfony_flashes') + { + $this->storageKey = $storageKey; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } + + public function setName(string $name) + { + $this->name = $name; + } + + /** + * {@inheritdoc} + */ + public function initialize(array &$flashes) + { + $this->flashes = &$flashes; + + // The logic: messages from the last request will be stored in new, so we move them to previous + // This request we will show what is in 'display'. What is placed into 'new' this time round will + // be moved to display next time round. + $this->flashes['display'] = \array_key_exists('new', $this->flashes) ? $this->flashes['new'] : []; + $this->flashes['new'] = []; + } + + /** + * {@inheritdoc} + */ + public function add(string $type, $message) + { + $this->flashes['new'][$type][] = $message; + } + + /** + * {@inheritdoc} + */ + public function peek(string $type, array $default = []) + { + return $this->has($type) ? $this->flashes['display'][$type] : $default; + } + + /** + * {@inheritdoc} + */ + public function peekAll() + { + return \array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : []; + } + + /** + * {@inheritdoc} + */ + public function get(string $type, array $default = []) + { + $return = $default; + + if (!$this->has($type)) { + return $return; + } + + if (isset($this->flashes['display'][$type])) { + $return = $this->flashes['display'][$type]; + unset($this->flashes['display'][$type]); + } + + return $return; + } + + /** + * {@inheritdoc} + */ + public function all() + { + $return = $this->flashes['display']; + $this->flashes['display'] = []; + + return $return; + } + + /** + * {@inheritdoc} + */ + public function setAll(array $messages) + { + $this->flashes['new'] = $messages; + } + + /** + * {@inheritdoc} + */ + public function set(string $type, $messages) + { + $this->flashes['new'][$type] = (array) $messages; + } + + /** + * {@inheritdoc} + */ + public function has(string $type) + { + return \array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type]; + } + + /** + * {@inheritdoc} + */ + public function keys() + { + return array_keys($this->flashes['display']); + } + + /** + * {@inheritdoc} + */ + public function getStorageKey() + { + return $this->storageKey; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + return $this->all(); + } +} diff --git a/vendor/symfony/http-foundation/Session/Flash/FlashBag.php b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php new file mode 100644 index 0000000..88df750 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php @@ -0,0 +1,152 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Flash; + +/** + * FlashBag flash message container. + * + * @author Drak + */ +class FlashBag implements FlashBagInterface +{ + private $name = 'flashes'; + private $flashes = []; + private $storageKey; + + /** + * @param string $storageKey The key used to store flashes in the session + */ + public function __construct(string $storageKey = '_symfony_flashes') + { + $this->storageKey = $storageKey; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } + + public function setName(string $name) + { + $this->name = $name; + } + + /** + * {@inheritdoc} + */ + public function initialize(array &$flashes) + { + $this->flashes = &$flashes; + } + + /** + * {@inheritdoc} + */ + public function add(string $type, $message) + { + $this->flashes[$type][] = $message; + } + + /** + * {@inheritdoc} + */ + public function peek(string $type, array $default = []) + { + return $this->has($type) ? $this->flashes[$type] : $default; + } + + /** + * {@inheritdoc} + */ + public function peekAll() + { + return $this->flashes; + } + + /** + * {@inheritdoc} + */ + public function get(string $type, array $default = []) + { + if (!$this->has($type)) { + return $default; + } + + $return = $this->flashes[$type]; + + unset($this->flashes[$type]); + + return $return; + } + + /** + * {@inheritdoc} + */ + public function all() + { + $return = $this->peekAll(); + $this->flashes = []; + + return $return; + } + + /** + * {@inheritdoc} + */ + public function set(string $type, $messages) + { + $this->flashes[$type] = (array) $messages; + } + + /** + * {@inheritdoc} + */ + public function setAll(array $messages) + { + $this->flashes = $messages; + } + + /** + * {@inheritdoc} + */ + public function has(string $type) + { + return \array_key_exists($type, $this->flashes) && $this->flashes[$type]; + } + + /** + * {@inheritdoc} + */ + public function keys() + { + return array_keys($this->flashes); + } + + /** + * {@inheritdoc} + */ + public function getStorageKey() + { + return $this->storageKey; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + return $this->all(); + } +} diff --git a/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php b/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php new file mode 100644 index 0000000..8713e71 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Flash; + +use Symfony\Component\HttpFoundation\Session\SessionBagInterface; + +/** + * FlashBagInterface. + * + * @author Drak + */ +interface FlashBagInterface extends SessionBagInterface +{ + /** + * Adds a flash message for the given type. + * + * @param mixed $message + */ + public function add(string $type, $message); + + /** + * Registers one or more messages for a given type. + * + * @param string|array $messages + */ + public function set(string $type, $messages); + + /** + * Gets flash messages for a given type. + * + * @param string $type Message category type + * @param array $default Default value if $type does not exist + * + * @return array + */ + public function peek(string $type, array $default = []); + + /** + * Gets all flash messages. + * + * @return array + */ + public function peekAll(); + + /** + * Gets and clears flash from the stack. + * + * @param array $default Default value if $type does not exist + * + * @return array + */ + public function get(string $type, array $default = []); + + /** + * Gets and clears flashes from the stack. + * + * @return array + */ + public function all(); + + /** + * Sets all flash messages. + */ + public function setAll(array $messages); + + /** + * Has flash messages for a given type? + * + * @return bool + */ + public function has(string $type); + + /** + * Returns a list of all defined types. + * + * @return array + */ + public function keys(); +} diff --git a/vendor/symfony/http-foundation/Session/Session.php b/vendor/symfony/http-foundation/Session/Session.php new file mode 100644 index 0000000..4a8af4d --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Session.php @@ -0,0 +1,281 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session; + +use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; +use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; +use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; +use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; +use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; +use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(AttributeBag::class); +class_exists(FlashBag::class); +class_exists(SessionBagProxy::class); + +/** + * @author Fabien Potencier + * @author Drak + */ +class Session implements SessionInterface, \IteratorAggregate, \Countable +{ + protected $storage; + + private $flashName; + private $attributeName; + private $data = []; + private $usageIndex = 0; + private $usageReporter; + + public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null, callable $usageReporter = null) + { + $this->storage = $storage ?: new NativeSessionStorage(); + $this->usageReporter = $usageReporter; + + $attributes = $attributes ?: new AttributeBag(); + $this->attributeName = $attributes->getName(); + $this->registerBag($attributes); + + $flashes = $flashes ?: new FlashBag(); + $this->flashName = $flashes->getName(); + $this->registerBag($flashes); + } + + /** + * {@inheritdoc} + */ + public function start() + { + return $this->storage->start(); + } + + /** + * {@inheritdoc} + */ + public function has(string $name) + { + return $this->getAttributeBag()->has($name); + } + + /** + * {@inheritdoc} + */ + public function get(string $name, $default = null) + { + return $this->getAttributeBag()->get($name, $default); + } + + /** + * {@inheritdoc} + */ + public function set(string $name, $value) + { + $this->getAttributeBag()->set($name, $value); + } + + /** + * {@inheritdoc} + */ + public function all() + { + return $this->getAttributeBag()->all(); + } + + /** + * {@inheritdoc} + */ + public function replace(array $attributes) + { + $this->getAttributeBag()->replace($attributes); + } + + /** + * {@inheritdoc} + */ + public function remove(string $name) + { + return $this->getAttributeBag()->remove($name); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $this->getAttributeBag()->clear(); + } + + /** + * {@inheritdoc} + */ + public function isStarted() + { + return $this->storage->isStarted(); + } + + /** + * Returns an iterator for attributes. + * + * @return \ArrayIterator An \ArrayIterator instance + */ + public function getIterator() + { + return new \ArrayIterator($this->getAttributeBag()->all()); + } + + /** + * Returns the number of attributes. + * + * @return int + */ + public function count() + { + return \count($this->getAttributeBag()->all()); + } + + public function &getUsageIndex(): int + { + return $this->usageIndex; + } + + /** + * @internal + */ + public function isEmpty(): bool + { + if ($this->isStarted()) { + ++$this->usageIndex; + if ($this->usageReporter && 0 <= $this->usageIndex) { + ($this->usageReporter)(); + } + } + foreach ($this->data as &$data) { + if (!empty($data)) { + return false; + } + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function invalidate(int $lifetime = null) + { + $this->storage->clear(); + + return $this->migrate(true, $lifetime); + } + + /** + * {@inheritdoc} + */ + public function migrate(bool $destroy = false, int $lifetime = null) + { + return $this->storage->regenerate($destroy, $lifetime); + } + + /** + * {@inheritdoc} + */ + public function save() + { + $this->storage->save(); + } + + /** + * {@inheritdoc} + */ + public function getId() + { + return $this->storage->getId(); + } + + /** + * {@inheritdoc} + */ + public function setId(string $id) + { + if ($this->storage->getId() !== $id) { + $this->storage->setId($id); + } + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->storage->getName(); + } + + /** + * {@inheritdoc} + */ + public function setName(string $name) + { + $this->storage->setName($name); + } + + /** + * {@inheritdoc} + */ + public function getMetadataBag() + { + ++$this->usageIndex; + if ($this->usageReporter && 0 <= $this->usageIndex) { + ($this->usageReporter)(); + } + + return $this->storage->getMetadataBag(); + } + + /** + * {@inheritdoc} + */ + public function registerBag(SessionBagInterface $bag) + { + $this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex, $this->usageReporter)); + } + + /** + * {@inheritdoc} + */ + public function getBag(string $name) + { + $bag = $this->storage->getBag($name); + + return method_exists($bag, 'getBag') ? $bag->getBag() : $bag; + } + + /** + * Gets the flashbag interface. + * + * @return FlashBagInterface + */ + public function getFlashBag() + { + return $this->getBag($this->flashName); + } + + /** + * Gets the attributebag interface. + * + * Note that this method was added to help with IDE autocompletion. + */ + private function getAttributeBag(): AttributeBagInterface + { + return $this->getBag($this->attributeName); + } +} diff --git a/vendor/symfony/http-foundation/Session/SessionBagInterface.php b/vendor/symfony/http-foundation/Session/SessionBagInterface.php new file mode 100644 index 0000000..8e37d06 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/SessionBagInterface.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session; + +/** + * Session Bag store. + * + * @author Drak + */ +interface SessionBagInterface +{ + /** + * Gets this bag's name. + * + * @return string + */ + public function getName(); + + /** + * Initializes the Bag. + */ + public function initialize(array &$array); + + /** + * Gets the storage key for this bag. + * + * @return string + */ + public function getStorageKey(); + + /** + * Clears out data from bag. + * + * @return mixed Whatever data was contained + */ + public function clear(); +} diff --git a/vendor/symfony/http-foundation/Session/SessionBagProxy.php b/vendor/symfony/http-foundation/Session/SessionBagProxy.php new file mode 100644 index 0000000..90aa010 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/SessionBagProxy.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session; + +/** + * @author Nicolas Grekas + * + * @internal + */ +final class SessionBagProxy implements SessionBagInterface +{ + private $bag; + private $data; + private $usageIndex; + private $usageReporter; + + public function __construct(SessionBagInterface $bag, array &$data, ?int &$usageIndex, ?callable $usageReporter) + { + $this->bag = $bag; + $this->data = &$data; + $this->usageIndex = &$usageIndex; + $this->usageReporter = $usageReporter; + } + + public function getBag(): SessionBagInterface + { + ++$this->usageIndex; + if ($this->usageReporter && 0 <= $this->usageIndex) { + ($this->usageReporter)(); + } + + return $this->bag; + } + + public function isEmpty(): bool + { + if (!isset($this->data[$this->bag->getStorageKey()])) { + return true; + } + ++$this->usageIndex; + if ($this->usageReporter && 0 <= $this->usageIndex) { + ($this->usageReporter)(); + } + + return empty($this->data[$this->bag->getStorageKey()]); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return $this->bag->getName(); + } + + /** + * {@inheritdoc} + */ + public function initialize(array &$array): void + { + ++$this->usageIndex; + if ($this->usageReporter && 0 <= $this->usageIndex) { + ($this->usageReporter)(); + } + + $this->data[$this->bag->getStorageKey()] = &$array; + + $this->bag->initialize($array); + } + + /** + * {@inheritdoc} + */ + public function getStorageKey(): string + { + return $this->bag->getStorageKey(); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + return $this->bag->clear(); + } +} diff --git a/vendor/symfony/http-foundation/Session/SessionInterface.php b/vendor/symfony/http-foundation/Session/SessionInterface.php new file mode 100644 index 0000000..b2f09fd --- /dev/null +++ b/vendor/symfony/http-foundation/Session/SessionInterface.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session; + +use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; + +/** + * Interface for the session. + * + * @author Drak + */ +interface SessionInterface +{ + /** + * Starts the session storage. + * + * @return bool + * + * @throws \RuntimeException if session fails to start + */ + public function start(); + + /** + * Returns the session ID. + * + * @return string + */ + public function getId(); + + /** + * Sets the session ID. + */ + public function setId(string $id); + + /** + * Returns the session name. + * + * @return string + */ + public function getName(); + + /** + * Sets the session name. + */ + public function setName(string $name); + + /** + * Invalidates the current session. + * + * Clears all session attributes and flashes and regenerates the + * session and deletes the old session from persistence. + * + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value + * will leave the system settings unchanged, 0 sets the cookie + * to expire with browser session. Time is in seconds, and is + * not a Unix timestamp. + * + * @return bool + */ + public function invalidate(int $lifetime = null); + + /** + * Migrates the current session to a new session id while maintaining all + * session attributes. + * + * @param bool $destroy Whether to delete the old session or leave it to garbage collection + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value + * will leave the system settings unchanged, 0 sets the cookie + * to expire with browser session. Time is in seconds, and is + * not a Unix timestamp. + * + * @return bool + */ + public function migrate(bool $destroy = false, int $lifetime = null); + + /** + * Force the session to be saved and closed. + * + * This method is generally not required for real sessions as + * the session will be automatically saved at the end of + * code execution. + */ + public function save(); + + /** + * Checks if an attribute is defined. + * + * @return bool + */ + public function has(string $name); + + /** + * Returns an attribute. + * + * @param mixed $default The default value if not found + * + * @return mixed + */ + public function get(string $name, $default = null); + + /** + * Sets an attribute. + * + * @param mixed $value + */ + public function set(string $name, $value); + + /** + * Returns attributes. + * + * @return array + */ + public function all(); + + /** + * Sets attributes. + */ + public function replace(array $attributes); + + /** + * Removes an attribute. + * + * @return mixed The removed value or null when it does not exist + */ + public function remove(string $name); + + /** + * Clears all attributes. + */ + public function clear(); + + /** + * Checks if the session was started. + * + * @return bool + */ + public function isStarted(); + + /** + * Registers a SessionBagInterface with the session. + */ + public function registerBag(SessionBagInterface $bag); + + /** + * Gets a bag instance by name. + * + * @return SessionBagInterface + */ + public function getBag(string $name); + + /** + * Gets session meta. + * + * @return MetadataBag + */ + public function getMetadataBag(); +} diff --git a/vendor/symfony/http-foundation/Session/SessionUtils.php b/vendor/symfony/http-foundation/Session/SessionUtils.php new file mode 100644 index 0000000..b5bce4a --- /dev/null +++ b/vendor/symfony/http-foundation/Session/SessionUtils.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session; + +/** + * Session utility functions. + * + * @author Nicolas Grekas + * @author Rémon van de Kamp + * + * @internal + */ +final class SessionUtils +{ + /** + * Finds the session header amongst the headers that are to be sent, removes it, and returns + * it so the caller can process it further. + */ + public static function popSessionCookie(string $sessionName, string $sessionId): ?string + { + $sessionCookie = null; + $sessionCookiePrefix = sprintf(' %s=', urlencode($sessionName)); + $sessionCookieWithId = sprintf('%s%s;', $sessionCookiePrefix, urlencode($sessionId)); + $otherCookies = []; + foreach (headers_list() as $h) { + if (0 !== stripos($h, 'Set-Cookie:')) { + continue; + } + if (11 === strpos($h, $sessionCookiePrefix, 11)) { + $sessionCookie = $h; + + if (11 !== strpos($h, $sessionCookieWithId, 11)) { + $otherCookies[] = $h; + } + } else { + $otherCookies[] = $h; + } + } + if (null === $sessionCookie) { + return null; + } + + header_remove('Set-Cookie'); + foreach ($otherCookies as $h) { + header($h, false); + } + + return $sessionCookie; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php new file mode 100644 index 0000000..15b3ba0 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php @@ -0,0 +1,150 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +use Symfony\Component\HttpFoundation\Session\SessionUtils; + +/** + * This abstract session handler provides a generic implementation + * of the PHP 7.0 SessionUpdateTimestampHandlerInterface, + * enabling strict and lazy session handling. + * + * @author Nicolas Grekas + */ +abstract class AbstractSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface +{ + private $sessionName; + private $prefetchId; + private $prefetchData; + private $newSessionId; + private $igbinaryEmptyData; + + /** + * @return bool + */ + public function open($savePath, $sessionName) + { + $this->sessionName = $sessionName; + if (!headers_sent() && !ini_get('session.cache_limiter') && '0' !== ini_get('session.cache_limiter')) { + header(sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) ini_get('session.cache_expire'))); + } + + return true; + } + + /** + * @return string + */ + abstract protected function doRead(string $sessionId); + + /** + * @return bool + */ + abstract protected function doWrite(string $sessionId, string $data); + + /** + * @return bool + */ + abstract protected function doDestroy(string $sessionId); + + /** + * @return bool + */ + public function validateId($sessionId) + { + $this->prefetchData = $this->read($sessionId); + $this->prefetchId = $sessionId; + + if (\PHP_VERSION_ID < 70317 || (70400 <= \PHP_VERSION_ID && \PHP_VERSION_ID < 70405)) { + // work around https://bugs.php.net/79413 + foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) { + if (!isset($frame['class']) && isset($frame['function']) && \in_array($frame['function'], ['session_regenerate_id', 'session_create_id'], true)) { + return '' === $this->prefetchData; + } + } + } + + return '' !== $this->prefetchData; + } + + /** + * @return string + */ + public function read($sessionId) + { + if (null !== $this->prefetchId) { + $prefetchId = $this->prefetchId; + $prefetchData = $this->prefetchData; + $this->prefetchId = $this->prefetchData = null; + + if ($prefetchId === $sessionId || '' === $prefetchData) { + $this->newSessionId = '' === $prefetchData ? $sessionId : null; + + return $prefetchData; + } + } + + $data = $this->doRead($sessionId); + $this->newSessionId = '' === $data ? $sessionId : null; + + return $data; + } + + /** + * @return bool + */ + public function write($sessionId, $data) + { + if (null === $this->igbinaryEmptyData) { + // see https://github.com/igbinary/igbinary/issues/146 + $this->igbinaryEmptyData = \function_exists('igbinary_serialize') ? igbinary_serialize([]) : ''; + } + if ('' === $data || $this->igbinaryEmptyData === $data) { + return $this->destroy($sessionId); + } + $this->newSessionId = null; + + return $this->doWrite($sessionId, $data); + } + + /** + * @return bool + */ + public function destroy($sessionId) + { + if (!headers_sent() && filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN)) { + if (!$this->sessionName) { + throw new \LogicException(sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', static::class)); + } + $cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId); + + /* + * We send an invalidation Set-Cookie header (zero lifetime) + * when either the session was started or a cookie with + * the session name was sent by the client (in which case + * we know it's invalid as a valid session cookie would've + * started the session). + */ + if (null === $cookie || isset($_COOKIE[$this->sessionName])) { + if (\PHP_VERSION_ID < 70300) { + setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), filter_var(ini_get('session.cookie_secure'), FILTER_VALIDATE_BOOLEAN), filter_var(ini_get('session.cookie_httponly'), FILTER_VALIDATE_BOOLEAN)); + } else { + $params = session_get_cookie_params(); + unset($params['lifetime']); + setcookie($this->sessionName, '', $params); + } + } + } + + return $this->newSessionId === $sessionId || $this->doDestroy($sessionId); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php b/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php new file mode 100644 index 0000000..bea3a32 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Ahmed TAILOULOUTE + */ +class IdentityMarshaller implements MarshallerInterface +{ + /** + * {@inheritdoc} + */ + public function marshall(array $values, ?array &$failed): array + { + foreach ($values as $key => $value) { + if (!\is_string($value)) { + throw new \LogicException(sprintf('%s accepts only string as data.', __METHOD__)); + } + } + + return $values; + } + + /** + * {@inheritdoc} + */ + public function unmarshall(string $value): string + { + return $value; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php new file mode 100644 index 0000000..25cd4ec --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Ahmed TAILOULOUTE + */ +class MarshallingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface +{ + private $handler; + private $marshaller; + + public function __construct(AbstractSessionHandler $handler, MarshallerInterface $marshaller) + { + $this->handler = $handler; + $this->marshaller = $marshaller; + } + + /** + * {@inheritdoc} + */ + public function open($savePath, $name) + { + return $this->handler->open($savePath, $name); + } + + /** + * {@inheritdoc} + */ + public function close() + { + return $this->handler->close(); + } + + /** + * {@inheritdoc} + */ + public function destroy($sessionId) + { + return $this->handler->destroy($sessionId); + } + + /** + * {@inheritdoc} + */ + public function gc($maxlifetime) + { + return $this->handler->gc($maxlifetime); + } + + /** + * {@inheritdoc} + */ + public function read($sessionId) + { + return $this->marshaller->unmarshall($this->handler->read($sessionId)); + } + + /** + * {@inheritdoc} + */ + public function write($sessionId, $data) + { + $failed = []; + $marshalledData = $this->marshaller->marshall(['data' => $data], $failed); + + if (isset($failed['data'])) { + return false; + } + + return $this->handler->write($sessionId, $marshalledData['data']); + } + + /** + * {@inheritdoc} + */ + public function validateId($sessionId) + { + return $this->handler->validateId($sessionId); + } + + /** + * {@inheritdoc} + */ + public function updateTimestamp($sessionId, $data) + { + return $this->handler->updateTimestamp($sessionId, $data); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php new file mode 100644 index 0000000..828d29e --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Memcached based session storage handler based on the Memcached class + * provided by the PHP memcached extension. + * + * @see https://php.net/memcached + * + * @author Drak + */ +class MemcachedSessionHandler extends AbstractSessionHandler +{ + private $memcached; + + /** + * @var int Time to live in seconds + */ + private $ttl; + + /** + * @var string Key prefix for shared environments + */ + private $prefix; + + /** + * Constructor. + * + * List of available options: + * * prefix: The prefix to use for the memcached keys in order to avoid collision + * * expiretime: The time to live in seconds. + * + * @throws \InvalidArgumentException When unsupported options are passed + */ + public function __construct(\Memcached $memcached, array $options = []) + { + $this->memcached = $memcached; + + if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime'])) { + throw new \InvalidArgumentException(sprintf('The following options are not supported "%s".', implode(', ', $diff))); + } + + $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400; + $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s'; + } + + /** + * @return bool + */ + public function close() + { + return $this->memcached->quit(); + } + + /** + * {@inheritdoc} + */ + protected function doRead(string $sessionId) + { + return $this->memcached->get($this->prefix.$sessionId) ?: ''; + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + $this->memcached->touch($this->prefix.$sessionId, time() + $this->ttl); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $sessionId, string $data) + { + return $this->memcached->set($this->prefix.$sessionId, $data, time() + $this->ttl); + } + + /** + * {@inheritdoc} + */ + protected function doDestroy(string $sessionId) + { + $result = $this->memcached->delete($this->prefix.$sessionId); + + return $result || \Memcached::RES_NOTFOUND == $this->memcached->getResultCode(); + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + // not required here because memcached will auto expire the records anyhow. + return true; + } + + /** + * Return a Memcached instance. + * + * @return \Memcached + */ + protected function getMemcached() + { + return $this->memcached; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php new file mode 100644 index 0000000..c6b16d1 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Migrating session handler for migrating from one handler to another. It reads + * from the current handler and writes both the current and new ones. + * + * It ignores errors from the new handler. + * + * @author Ross Motley + * @author Oliver Radwell + */ +class MigratingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface +{ + private $currentHandler; + private $writeOnlyHandler; + + public function __construct(\SessionHandlerInterface $currentHandler, \SessionHandlerInterface $writeOnlyHandler) + { + if (!$currentHandler instanceof \SessionUpdateTimestampHandlerInterface) { + $currentHandler = new StrictSessionHandler($currentHandler); + } + if (!$writeOnlyHandler instanceof \SessionUpdateTimestampHandlerInterface) { + $writeOnlyHandler = new StrictSessionHandler($writeOnlyHandler); + } + + $this->currentHandler = $currentHandler; + $this->writeOnlyHandler = $writeOnlyHandler; + } + + /** + * @return bool + */ + public function close() + { + $result = $this->currentHandler->close(); + $this->writeOnlyHandler->close(); + + return $result; + } + + /** + * @return bool + */ + public function destroy($sessionId) + { + $result = $this->currentHandler->destroy($sessionId); + $this->writeOnlyHandler->destroy($sessionId); + + return $result; + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + $result = $this->currentHandler->gc($maxlifetime); + $this->writeOnlyHandler->gc($maxlifetime); + + return $result; + } + + /** + * @return bool + */ + public function open($savePath, $sessionName) + { + $result = $this->currentHandler->open($savePath, $sessionName); + $this->writeOnlyHandler->open($savePath, $sessionName); + + return $result; + } + + /** + * @return string + */ + public function read($sessionId) + { + // No reading from new handler until switch-over + return $this->currentHandler->read($sessionId); + } + + /** + * @return bool + */ + public function write($sessionId, $sessionData) + { + $result = $this->currentHandler->write($sessionId, $sessionData); + $this->writeOnlyHandler->write($sessionId, $sessionData); + + return $result; + } + + /** + * @return bool + */ + public function validateId($sessionId) + { + // No reading from new handler until switch-over + return $this->currentHandler->validateId($sessionId); + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $sessionData) + { + $result = $this->currentHandler->updateTimestamp($sessionId, $sessionData); + $this->writeOnlyHandler->updateTimestamp($sessionId, $sessionData); + + return $result; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php new file mode 100644 index 0000000..9a2d791 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php @@ -0,0 +1,187 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Session handler using the mongodb/mongodb package and MongoDB driver extension. + * + * @author Markus Bachmann + * + * @see https://packagist.org/packages/mongodb/mongodb + * @see https://php.net/mongodb + */ +class MongoDbSessionHandler extends AbstractSessionHandler +{ + private $mongo; + + /** + * @var \MongoDB\Collection + */ + private $collection; + + /** + * @var array + */ + private $options; + + /** + * Constructor. + * + * List of available options: + * * database: The name of the database [required] + * * collection: The name of the collection [required] + * * id_field: The field name for storing the session id [default: _id] + * * data_field: The field name for storing the session data [default: data] + * * time_field: The field name for storing the timestamp [default: time] + * * expiry_field: The field name for storing the expiry-timestamp [default: expires_at]. + * + * It is strongly recommended to put an index on the `expiry_field` for + * garbage-collection. Alternatively it's possible to automatically expire + * the sessions in the database as described below: + * + * A TTL collections can be used on MongoDB 2.2+ to cleanup expired sessions + * automatically. Such an index can for example look like this: + * + * db..ensureIndex( + * { "": 1 }, + * { "expireAfterSeconds": 0 } + * ) + * + * More details on: https://docs.mongodb.org/manual/tutorial/expire-data/ + * + * If you use such an index, you can drop `gc_probability` to 0 since + * no garbage-collection is required. + * + * @throws \InvalidArgumentException When "database" or "collection" not provided + */ + public function __construct(\MongoDB\Client $mongo, array $options) + { + if (!isset($options['database']) || !isset($options['collection'])) { + throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler.'); + } + + $this->mongo = $mongo; + + $this->options = array_merge([ + 'id_field' => '_id', + 'data_field' => 'data', + 'time_field' => 'time', + 'expiry_field' => 'expires_at', + ], $options); + } + + /** + * @return bool + */ + public function close() + { + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDestroy(string $sessionId) + { + $this->getCollection()->deleteOne([ + $this->options['id_field'] => $sessionId, + ]); + + return true; + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + $this->getCollection()->deleteMany([ + $this->options['expiry_field'] => ['$lt' => new \MongoDB\BSON\UTCDateTime()], + ]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $sessionId, string $data) + { + $expiry = new \MongoDB\BSON\UTCDateTime((time() + (int) ini_get('session.gc_maxlifetime')) * 1000); + + $fields = [ + $this->options['time_field'] => new \MongoDB\BSON\UTCDateTime(), + $this->options['expiry_field'] => $expiry, + $this->options['data_field'] => new \MongoDB\BSON\Binary($data, \MongoDB\BSON\Binary::TYPE_OLD_BINARY), + ]; + + $this->getCollection()->updateOne( + [$this->options['id_field'] => $sessionId], + ['$set' => $fields], + ['upsert' => true] + ); + + return true; + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + $expiry = new \MongoDB\BSON\UTCDateTime((time() + (int) ini_get('session.gc_maxlifetime')) * 1000); + + $this->getCollection()->updateOne( + [$this->options['id_field'] => $sessionId], + ['$set' => [ + $this->options['time_field'] => new \MongoDB\BSON\UTCDateTime(), + $this->options['expiry_field'] => $expiry, + ]] + ); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doRead(string $sessionId) + { + $dbData = $this->getCollection()->findOne([ + $this->options['id_field'] => $sessionId, + $this->options['expiry_field'] => ['$gte' => new \MongoDB\BSON\UTCDateTime()], + ]); + + if (null === $dbData) { + return ''; + } + + return $dbData[$this->options['data_field']]->getData(); + } + + private function getCollection(): \MongoDB\Collection + { + if (null === $this->collection) { + $this->collection = $this->mongo->selectCollection($this->options['database'], $this->options['collection']); + } + + return $this->collection; + } + + /** + * @return \MongoDB\Client + */ + protected function getMongo() + { + return $this->mongo; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php new file mode 100644 index 0000000..effc9db --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Native session handler using PHP's built in file storage. + * + * @author Drak + */ +class NativeFileSessionHandler extends \SessionHandler +{ + /** + * @param string $savePath Path of directory to save session files + * Default null will leave setting as defined by PHP. + * '/path', 'N;/path', or 'N;octal-mode;/path + * + * @see https://php.net/session.configuration#ini.session.save-path for further details. + * + * @throws \InvalidArgumentException On invalid $savePath + * @throws \RuntimeException When failing to create the save directory + */ + public function __construct(string $savePath = null) + { + if (null === $savePath) { + $savePath = ini_get('session.save_path'); + } + + $baseDir = $savePath; + + if ($count = substr_count($savePath, ';')) { + if ($count > 2) { + throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'.', $savePath)); + } + + // characters after last ';' are the path + $baseDir = ltrim(strrchr($savePath, ';'), ';'); + } + + if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) { + throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s".', $baseDir)); + } + + ini_set('session.save_path', $savePath); + ini_set('session.save_handler', 'files'); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php new file mode 100644 index 0000000..aa0e595 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Can be used in unit testing or in a situations where persisted sessions are not desired. + * + * @author Drak + */ +class NullSessionHandler extends AbstractSessionHandler +{ + /** + * @return bool + */ + public function close() + { + return true; + } + + /** + * @return bool + */ + public function validateId($sessionId) + { + return true; + } + + /** + * {@inheritdoc} + */ + protected function doRead(string $sessionId) + { + return ''; + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + return true; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $sessionId, string $data) + { + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDestroy(string $sessionId) + { + return true; + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + return true; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php new file mode 100644 index 0000000..a301e9f --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php @@ -0,0 +1,899 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Session handler using a PDO connection to read and write data. + * + * It works with MySQL, PostgreSQL, Oracle, SQL Server and SQLite and implements + * different locking strategies to handle concurrent access to the same session. + * Locking is necessary to prevent loss of data due to race conditions and to keep + * the session data consistent between read() and write(). With locking, requests + * for the same session will wait until the other one finished writing. For this + * reason it's best practice to close a session as early as possible to improve + * concurrency. PHPs internal files session handler also implements locking. + * + * Attention: Since SQLite does not support row level locks but locks the whole database, + * it means only one session can be accessed at a time. Even different sessions would wait + * for another to finish. So saving session in SQLite should only be considered for + * development or prototypes. + * + * Session data is a binary string that can contain non-printable characters like the null byte. + * For this reason it must be saved in a binary column in the database like BLOB in MySQL. + * Saving it in a character column could corrupt the data. You can use createTable() + * to initialize a correctly defined table. + * + * @see https://php.net/sessionhandlerinterface + * + * @author Fabien Potencier + * @author Michael Williams + * @author Tobias Schultze + */ +class PdoSessionHandler extends AbstractSessionHandler +{ + /** + * No locking is done. This means sessions are prone to loss of data due to + * race conditions of concurrent requests to the same session. The last session + * write will win in this case. It might be useful when you implement your own + * logic to deal with this like an optimistic approach. + */ + const LOCK_NONE = 0; + + /** + * Creates an application-level lock on a session. The disadvantage is that the + * lock is not enforced by the database and thus other, unaware parts of the + * application could still concurrently modify the session. The advantage is it + * does not require a transaction. + * This mode is not available for SQLite and not yet implemented for oci and sqlsrv. + */ + const LOCK_ADVISORY = 1; + + /** + * Issues a real row lock. Since it uses a transaction between opening and + * closing a session, you have to be careful when you use same database connection + * that you also use for your application logic. This mode is the default because + * it's the only reliable solution across DBMSs. + */ + const LOCK_TRANSACTIONAL = 2; + + private const MAX_LIFETIME = 315576000; + + /** + * @var \PDO|null PDO instance or null when not connected yet + */ + private $pdo; + + /** + * @var string|false|null DSN string or null for session.save_path or false when lazy connection disabled + */ + private $dsn = false; + + /** + * @var string Database driver + */ + private $driver; + + /** + * @var string Table name + */ + private $table = 'sessions'; + + /** + * @var string Column for session id + */ + private $idCol = 'sess_id'; + + /** + * @var string Column for session data + */ + private $dataCol = 'sess_data'; + + /** + * @var string Column for lifetime + */ + private $lifetimeCol = 'sess_lifetime'; + + /** + * @var string Column for timestamp + */ + private $timeCol = 'sess_time'; + + /** + * @var string Username when lazy-connect + */ + private $username = ''; + + /** + * @var string Password when lazy-connect + */ + private $password = ''; + + /** + * @var array Connection options when lazy-connect + */ + private $connectionOptions = []; + + /** + * @var int The strategy for locking, see constants + */ + private $lockMode = self::LOCK_TRANSACTIONAL; + + /** + * It's an array to support multiple reads before closing which is manual, non-standard usage. + * + * @var \PDOStatement[] An array of statements to release advisory locks + */ + private $unlockStatements = []; + + /** + * @var bool True when the current session exists but expired according to session.gc_maxlifetime + */ + private $sessionExpired = false; + + /** + * @var bool Whether a transaction is active + */ + private $inTransaction = false; + + /** + * @var bool Whether gc() has been called + */ + private $gcCalled = false; + + /** + * You can either pass an existing database connection as PDO instance or + * pass a DSN string that will be used to lazy-connect to the database + * when the session is actually used. Furthermore it's possible to pass null + * which will then use the session.save_path ini setting as PDO DSN parameter. + * + * List of available options: + * * db_table: The name of the table [default: sessions] + * * db_id_col: The column where to store the session id [default: sess_id] + * * db_data_col: The column where to store the session data [default: sess_data] + * * db_lifetime_col: The column where to store the lifetime [default: sess_lifetime] + * * db_time_col: The column where to store the timestamp [default: sess_time] + * * db_username: The username when lazy-connect [default: ''] + * * db_password: The password when lazy-connect [default: ''] + * * db_connection_options: An array of driver-specific connection options [default: []] + * * lock_mode: The strategy for locking, see constants [default: LOCK_TRANSACTIONAL] + * + * @param \PDO|string|null $pdoOrDsn A \PDO instance or DSN string or URL string or null + * + * @throws \InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION + */ + public function __construct($pdoOrDsn = null, array $options = []) + { + if ($pdoOrDsn instanceof \PDO) { + if (\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) { + throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__)); + } + + $this->pdo = $pdoOrDsn; + $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); + } elseif (\is_string($pdoOrDsn) && false !== strpos($pdoOrDsn, '://')) { + $this->dsn = $this->buildDsnFromUrl($pdoOrDsn); + } else { + $this->dsn = $pdoOrDsn; + } + + $this->table = isset($options['db_table']) ? $options['db_table'] : $this->table; + $this->idCol = isset($options['db_id_col']) ? $options['db_id_col'] : $this->idCol; + $this->dataCol = isset($options['db_data_col']) ? $options['db_data_col'] : $this->dataCol; + $this->lifetimeCol = isset($options['db_lifetime_col']) ? $options['db_lifetime_col'] : $this->lifetimeCol; + $this->timeCol = isset($options['db_time_col']) ? $options['db_time_col'] : $this->timeCol; + $this->username = isset($options['db_username']) ? $options['db_username'] : $this->username; + $this->password = isset($options['db_password']) ? $options['db_password'] : $this->password; + $this->connectionOptions = isset($options['db_connection_options']) ? $options['db_connection_options'] : $this->connectionOptions; + $this->lockMode = isset($options['lock_mode']) ? $options['lock_mode'] : $this->lockMode; + } + + /** + * Creates the table to store sessions which can be called once for setup. + * + * Session ID is saved in a column of maximum length 128 because that is enough even + * for a 512 bit configured session.hash_function like Whirlpool. Session data is + * saved in a BLOB. One could also use a shorter inlined varbinary column + * if one was sure the data fits into it. + * + * @throws \PDOException When the table already exists + * @throws \DomainException When an unsupported PDO driver is used + */ + public function createTable() + { + // connect if we are not yet + $this->getConnection(); + + switch ($this->driver) { + case 'mysql': + // We use varbinary for the ID column because it prevents unwanted conversions: + // - character set conversions between server and client + // - trailing space removal + // - case-insensitivity + // - language processing like é == e + $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB"; + break; + case 'sqlite': + $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)"; + break; + case 'pgsql': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)"; + break; + case 'oci': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)"; + break; + case 'sqlsrv': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)"; + break; + default: + throw new \DomainException(sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)); + } + + try { + $this->pdo->exec($sql); + $this->pdo->exec("CREATE INDEX EXPIRY ON $this->table ($this->lifetimeCol)"); + } catch (\PDOException $e) { + $this->rollback(); + + throw $e; + } + } + + /** + * Returns true when the current session exists but expired according to session.gc_maxlifetime. + * + * Can be used to distinguish between a new session and one that expired due to inactivity. + * + * @return bool Whether current session expired + */ + public function isSessionExpired() + { + return $this->sessionExpired; + } + + /** + * @return bool + */ + public function open($savePath, $sessionName) + { + $this->sessionExpired = false; + + if (null === $this->pdo) { + $this->connect($this->dsn ?: $savePath); + } + + return parent::open($savePath, $sessionName); + } + + /** + * @return string + */ + public function read($sessionId) + { + try { + return parent::read($sessionId); + } catch (\PDOException $e) { + $this->rollback(); + + throw $e; + } + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + // We delay gc() to close() so that it is executed outside the transactional and blocking read-write process. + // This way, pruning expired sessions does not block them from being started while the current session is used. + $this->gcCalled = true; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDestroy(string $sessionId) + { + // delete the record associated with this id + $sql = "DELETE FROM $this->table WHERE $this->idCol = :id"; + + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $stmt->execute(); + } catch (\PDOException $e) { + $this->rollback(); + + throw $e; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $sessionId, string $data) + { + $maxlifetime = (int) ini_get('session.gc_maxlifetime'); + + try { + // We use a single MERGE SQL query when supported by the database. + $mergeStmt = $this->getMergeStatement($sessionId, $data, $maxlifetime); + if (null !== $mergeStmt) { + $mergeStmt->execute(); + + return true; + } + + $updateStmt = $this->getUpdateStatement($sessionId, $data, $maxlifetime); + $updateStmt->execute(); + + // When MERGE is not supported, like in Postgres < 9.5, we have to use this approach that can result in + // duplicate key errors when the same session is written simultaneously (given the LOCK_NONE behavior). + // We can just catch such an error and re-execute the update. This is similar to a serializable + // transaction with retry logic on serialization failures but without the overhead and without possible + // false positives due to longer gap locking. + if (!$updateStmt->rowCount()) { + try { + $insertStmt = $this->getInsertStatement($sessionId, $data, $maxlifetime); + $insertStmt->execute(); + } catch (\PDOException $e) { + // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys + if (0 === strpos($e->getCode(), '23')) { + $updateStmt->execute(); + } else { + throw $e; + } + } + } + } catch (\PDOException $e) { + $this->rollback(); + + throw $e; + } + + return true; + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + $expiry = time() + (int) ini_get('session.gc_maxlifetime'); + + try { + $updateStmt = $this->pdo->prepare( + "UPDATE $this->table SET $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id" + ); + $updateStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $updateStmt->bindParam(':expiry', $expiry, \PDO::PARAM_INT); + $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT); + $updateStmt->execute(); + } catch (\PDOException $e) { + $this->rollback(); + + throw $e; + } + + return true; + } + + /** + * @return bool + */ + public function close() + { + $this->commit(); + + while ($unlockStmt = array_shift($this->unlockStatements)) { + $unlockStmt->execute(); + } + + if ($this->gcCalled) { + $this->gcCalled = false; + + // delete the session records that have expired + $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol < :time AND $this->lifetimeCol > :min"; + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':time', time(), \PDO::PARAM_INT); + $stmt->bindValue(':min', self::MAX_LIFETIME, \PDO::PARAM_INT); + $stmt->execute(); + // to be removed in 6.0 + if ('mysql' === $this->driver) { + $legacySql = "DELETE FROM $this->table WHERE $this->lifetimeCol <= :min AND $this->lifetimeCol + $this->timeCol < :time"; + } else { + $legacySql = "DELETE FROM $this->table WHERE $this->lifetimeCol <= :min AND $this->lifetimeCol < :time - $this->timeCol"; + } + + $stmt = $this->pdo->prepare($legacySql); + $stmt->bindValue(':time', time(), \PDO::PARAM_INT); + $stmt->bindValue(':min', self::MAX_LIFETIME, \PDO::PARAM_INT); + $stmt->execute(); + } + + if (false !== $this->dsn) { + $this->pdo = null; // only close lazy-connection + } + + return true; + } + + /** + * Lazy-connects to the database. + */ + private function connect(string $dsn): void + { + $this->pdo = new \PDO($dsn, $this->username, $this->password, $this->connectionOptions); + $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); + } + + /** + * Builds a PDO DSN from a URL-like connection string. + * + * @todo implement missing support for oci DSN (which look totally different from other PDO ones) + */ + private function buildDsnFromUrl(string $dsnOrUrl): string + { + // (pdo_)?sqlite3?:///... => (pdo_)?sqlite3?://localhost/... or else the URL will be invalid + $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsnOrUrl); + + $params = parse_url($url); + + if (false === $params) { + return $dsnOrUrl; // If the URL is not valid, let's assume it might be a DSN already. + } + + $params = array_map('rawurldecode', $params); + + // Override the default username and password. Values passed through options will still win over these in the constructor. + if (isset($params['user'])) { + $this->username = $params['user']; + } + + if (isset($params['pass'])) { + $this->password = $params['pass']; + } + + if (!isset($params['scheme'])) { + throw new \InvalidArgumentException('URLs without scheme are not supported to configure the PdoSessionHandler.'); + } + + $driverAliasMap = [ + 'mssql' => 'sqlsrv', + 'mysql2' => 'mysql', // Amazon RDS, for some weird reason + 'postgres' => 'pgsql', + 'postgresql' => 'pgsql', + 'sqlite3' => 'sqlite', + ]; + + $driver = isset($driverAliasMap[$params['scheme']]) ? $driverAliasMap[$params['scheme']] : $params['scheme']; + + // Doctrine DBAL supports passing its internal pdo_* driver names directly too (allowing both dashes and underscores). This allows supporting the same here. + if (0 === strpos($driver, 'pdo_') || 0 === strpos($driver, 'pdo-')) { + $driver = substr($driver, 4); + } + + switch ($driver) { + case 'mysql': + case 'pgsql': + $dsn = $driver.':'; + + if (isset($params['host']) && '' !== $params['host']) { + $dsn .= 'host='.$params['host'].';'; + } + + if (isset($params['port']) && '' !== $params['port']) { + $dsn .= 'port='.$params['port'].';'; + } + + if (isset($params['path'])) { + $dbName = substr($params['path'], 1); // Remove the leading slash + $dsn .= 'dbname='.$dbName.';'; + } + + return $dsn; + + case 'sqlite': + return 'sqlite:'.substr($params['path'], 1); + + case 'sqlsrv': + $dsn = 'sqlsrv:server='; + + if (isset($params['host'])) { + $dsn .= $params['host']; + } + + if (isset($params['port']) && '' !== $params['port']) { + $dsn .= ','.$params['port']; + } + + if (isset($params['path'])) { + $dbName = substr($params['path'], 1); // Remove the leading slash + $dsn .= ';Database='.$dbName; + } + + return $dsn; + + default: + throw new \InvalidArgumentException(sprintf('The scheme "%s" is not supported by the PdoSessionHandler URL configuration. Pass a PDO DSN directly.', $params['scheme'])); + } + } + + /** + * Helper method to begin a transaction. + * + * Since SQLite does not support row level locks, we have to acquire a reserved lock + * on the database immediately. Because of https://bugs.php.net/42766 we have to create + * such a transaction manually which also means we cannot use PDO::commit or + * PDO::rollback or PDO::inTransaction for SQLite. + * + * Also MySQLs default isolation, REPEATABLE READ, causes deadlock for different sessions + * due to https://percona.com/blog/2013/12/12/one-more-innodb-gap-lock-to-avoid/ . + * So we change it to READ COMMITTED. + */ + private function beginTransaction(): void + { + if (!$this->inTransaction) { + if ('sqlite' === $this->driver) { + $this->pdo->exec('BEGIN IMMEDIATE TRANSACTION'); + } else { + if ('mysql' === $this->driver) { + $this->pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); + } + $this->pdo->beginTransaction(); + } + $this->inTransaction = true; + } + } + + /** + * Helper method to commit a transaction. + */ + private function commit(): void + { + if ($this->inTransaction) { + try { + // commit read-write transaction which also releases the lock + if ('sqlite' === $this->driver) { + $this->pdo->exec('COMMIT'); + } else { + $this->pdo->commit(); + } + $this->inTransaction = false; + } catch (\PDOException $e) { + $this->rollback(); + + throw $e; + } + } + } + + /** + * Helper method to rollback a transaction. + */ + private function rollback(): void + { + // We only need to rollback if we are in a transaction. Otherwise the resulting + // error would hide the real problem why rollback was called. We might not be + // in a transaction when not using the transactional locking behavior or when + // two callbacks (e.g. destroy and write) are invoked that both fail. + if ($this->inTransaction) { + if ('sqlite' === $this->driver) { + $this->pdo->exec('ROLLBACK'); + } else { + $this->pdo->rollBack(); + } + $this->inTransaction = false; + } + } + + /** + * Reads the session data in respect to the different locking strategies. + * + * We need to make sure we do not return session data that is already considered garbage according + * to the session.gc_maxlifetime setting because gc() is called after read() and only sometimes. + * + * @return string + */ + protected function doRead(string $sessionId) + { + if (self::LOCK_ADVISORY === $this->lockMode) { + $this->unlockStatements[] = $this->doAdvisoryLock($sessionId); + } + + $selectSql = $this->getSelectSql(); + $selectStmt = $this->pdo->prepare($selectSql); + $selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $insertStmt = null; + + do { + $selectStmt->execute(); + $sessionRows = $selectStmt->fetchAll(\PDO::FETCH_NUM); + + if ($sessionRows) { + $expiry = (int) $sessionRows[0][1]; + if ($expiry <= self::MAX_LIFETIME) { + $expiry += $sessionRows[0][2]; + } + + if ($expiry < time()) { + $this->sessionExpired = true; + + return ''; + } + + return \is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0]; + } + + if (null !== $insertStmt) { + $this->rollback(); + throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.'); + } + + if (!filter_var(ini_get('session.use_strict_mode'), FILTER_VALIDATE_BOOLEAN) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) { + // In strict mode, session fixation is not possible: new sessions always start with a unique + // random id, so that concurrency is not possible and this code path can be skipped. + // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block + // until other connections to the session are committed. + try { + $insertStmt = $this->getInsertStatement($sessionId, '', 0); + $insertStmt->execute(); + } catch (\PDOException $e) { + // Catch duplicate key error because other connection created the session already. + // It would only not be the case when the other connection destroyed the session. + if (0 === strpos($e->getCode(), '23')) { + // Retrieve finished session data written by concurrent connection by restarting the loop. + // We have to start a new transaction as a failed query will mark the current transaction as + // aborted in PostgreSQL and disallow further queries within it. + $this->rollback(); + $this->beginTransaction(); + continue; + } + + throw $e; + } + } + + return ''; + } while (true); + } + + /** + * Executes an application-level lock on the database. + * + * @return \PDOStatement The statement that needs to be executed later to release the lock + * + * @throws \DomainException When an unsupported PDO driver is used + * + * @todo implement missing advisory locks + * - for oci using DBMS_LOCK.REQUEST + * - for sqlsrv using sp_getapplock with LockOwner = Session + */ + private function doAdvisoryLock(string $sessionId): \PDOStatement + { + switch ($this->driver) { + case 'mysql': + // MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced. + $lockId = substr($sessionId, 0, 64); + // should we handle the return value? 0 on timeout, null on error + // we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout + $stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)'); + $stmt->bindValue(':key', $lockId, \PDO::PARAM_STR); + $stmt->execute(); + + $releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)'); + $releaseStmt->bindValue(':key', $lockId, \PDO::PARAM_STR); + + return $releaseStmt; + case 'pgsql': + // Obtaining an exclusive session level advisory lock requires an integer key. + // When session.sid_bits_per_character > 4, the session id can contain non-hex-characters. + // So we cannot just use hexdec(). + if (4 === \PHP_INT_SIZE) { + $sessionInt1 = $this->convertStringToInt($sessionId); + $sessionInt2 = $this->convertStringToInt(substr($sessionId, 4, 4)); + + $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)'); + $stmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT); + $stmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT); + $stmt->execute(); + + $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key1, :key2)'); + $releaseStmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT); + $releaseStmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT); + } else { + $sessionBigInt = $this->convertStringToInt($sessionId); + + $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)'); + $stmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT); + $stmt->execute(); + + $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key)'); + $releaseStmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT); + } + + return $releaseStmt; + case 'sqlite': + throw new \DomainException('SQLite does not support advisory locks.'); + default: + throw new \DomainException(sprintf('Advisory locks are currently not implemented for PDO driver "%s".', $this->driver)); + } + } + + /** + * Encodes the first 4 (when PHP_INT_SIZE == 4) or 8 characters of the string as an integer. + * + * Keep in mind, PHP integers are signed. + */ + private function convertStringToInt(string $string): int + { + if (4 === \PHP_INT_SIZE) { + return (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]); + } + + $int1 = (\ord($string[7]) << 24) + (\ord($string[6]) << 16) + (\ord($string[5]) << 8) + \ord($string[4]); + $int2 = (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]); + + return $int2 + ($int1 << 32); + } + + /** + * Return a locking or nonlocking SQL query to read session information. + * + * @throws \DomainException When an unsupported PDO driver is used + */ + private function getSelectSql(): string + { + if (self::LOCK_TRANSACTIONAL === $this->lockMode) { + $this->beginTransaction(); + + // selecting the time column should be removed in 6.0 + switch ($this->driver) { + case 'mysql': + case 'oci': + case 'pgsql': + return "SELECT $this->dataCol, $this->lifetimeCol, $this->timeCol FROM $this->table WHERE $this->idCol = :id FOR UPDATE"; + case 'sqlsrv': + return "SELECT $this->dataCol, $this->lifetimeCol, $this->timeCol FROM $this->table WITH (UPDLOCK, ROWLOCK) WHERE $this->idCol = :id"; + case 'sqlite': + // we already locked when starting transaction + break; + default: + throw new \DomainException(sprintf('Transactional locks are currently not implemented for PDO driver "%s".', $this->driver)); + } + } + + return "SELECT $this->dataCol, $this->lifetimeCol, $this->timeCol FROM $this->table WHERE $this->idCol = :id"; + } + + /** + * Returns an insert statement supported by the database for writing session data. + */ + private function getInsertStatement(string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement + { + switch ($this->driver) { + case 'oci': + $data = fopen('php://memory', 'r+'); + fwrite($data, $sessionData); + rewind($data); + $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, EMPTY_BLOB(), :expiry, :time) RETURNING $this->dataCol into :data"; + break; + default: + $data = $sessionData; + $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; + break; + } + + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); + $stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); + $stmt->bindValue(':time', time(), \PDO::PARAM_INT); + + return $stmt; + } + + /** + * Returns an update statement supported by the database for writing session data. + */ + private function getUpdateStatement(string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement + { + switch ($this->driver) { + case 'oci': + $data = fopen('php://memory', 'r+'); + fwrite($data, $sessionData); + rewind($data); + $sql = "UPDATE $this->table SET $this->dataCol = EMPTY_BLOB(), $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id RETURNING $this->dataCol into :data"; + break; + default: + $data = $sessionData; + $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id"; + break; + } + + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); + $stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); + $stmt->bindValue(':time', time(), \PDO::PARAM_INT); + + return $stmt; + } + + /** + * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data. + */ + private function getMergeStatement(string $sessionId, string $data, int $maxlifetime): ?\PDOStatement + { + switch (true) { + case 'mysql' === $this->driver: + $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ". + "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; + break; + case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='): + // MERGE is only available since SQL Server 2008 and must be terminated by semicolon + // It also requires HOLDLOCK according to https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/ + $mergeSql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". + "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; + break; + case 'sqlite' === $this->driver: + $mergeSql = "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; + break; + case 'pgsql' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '9.5', '>='): + $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ". + "ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; + break; + default: + // MERGE is not supported with LOBs: https://oracle.com/technetwork/articles/fuecks-lobs-095315.html + return null; + } + + $mergeStmt = $this->pdo->prepare($mergeSql); + + if ('sqlsrv' === $this->driver) { + $mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR); + $mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR); + $mergeStmt->bindParam(3, $data, \PDO::PARAM_LOB); + $mergeStmt->bindValue(4, time() + $maxlifetime, \PDO::PARAM_INT); + $mergeStmt->bindValue(5, time(), \PDO::PARAM_INT); + $mergeStmt->bindParam(6, $data, \PDO::PARAM_LOB); + $mergeStmt->bindValue(7, time() + $maxlifetime, \PDO::PARAM_INT); + $mergeStmt->bindValue(8, time(), \PDO::PARAM_INT); + } else { + $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); + $mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB); + $mergeStmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); + $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT); + } + + return $mergeStmt; + } + + /** + * Return a PDO instance. + * + * @return \PDO + */ + protected function getConnection() + { + if (null === $this->pdo) { + $this->connect($this->dsn ?: ini_get('session.save_path')); + } + + return $this->pdo; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php new file mode 100644 index 0000000..180f63f --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +use Predis\Response\ErrorInterface; +use Symfony\Component\Cache\Traits\RedisClusterProxy; +use Symfony\Component\Cache\Traits\RedisProxy; + +/** + * Redis based session storage handler based on the Redis class + * provided by the PHP redis extension. + * + * @author Dalibor Karlović + */ +class RedisSessionHandler extends AbstractSessionHandler +{ + private $redis; + + /** + * @var string Key prefix for shared environments + */ + private $prefix; + + /** + * @var int Time to live in seconds + */ + private $ttl; + + /** + * List of available options: + * * prefix: The prefix to use for the keys in order to avoid collision on the Redis server + * * ttl: The time to live in seconds. + * + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis + * + * @throws \InvalidArgumentException When unsupported client or options are passed + */ + public function __construct($redis, array $options = []) + { + if ( + !$redis instanceof \Redis && + !$redis instanceof \RedisArray && + !$redis instanceof \RedisCluster && + !$redis instanceof \Predis\ClientInterface && + !$redis instanceof RedisProxy && + !$redis instanceof RedisClusterProxy + ) { + throw new \InvalidArgumentException(sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, get_debug_type($redis))); + } + + if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) { + throw new \InvalidArgumentException(sprintf('The following options are not supported "%s".', implode(', ', $diff))); + } + + $this->redis = $redis; + $this->prefix = $options['prefix'] ?? 'sf_s'; + $this->ttl = $options['ttl'] ?? null; + } + + /** + * {@inheritdoc} + */ + protected function doRead(string $sessionId): string + { + return $this->redis->get($this->prefix.$sessionId) ?: ''; + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $sessionId, string $data): bool + { + $result = $this->redis->setEx($this->prefix.$sessionId, (int) ($this->ttl ?? ini_get('session.gc_maxlifetime')), $data); + + return $result && !$result instanceof ErrorInterface; + } + + /** + * {@inheritdoc} + */ + protected function doDestroy(string $sessionId): bool + { + $this->redis->del($this->prefix.$sessionId); + + return true; + } + + /** + * {@inheritdoc} + */ + public function close(): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function gc($maxlifetime): bool + { + return true; + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + return (bool) $this->redis->expire($this->prefix.$sessionId, (int) ($this->ttl ?? ini_get('session.gc_maxlifetime'))); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php b/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php new file mode 100644 index 0000000..dcdde80 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +use Doctrine\DBAL\DriverManager; +use Symfony\Component\Cache\Adapter\AbstractAdapter; +use Symfony\Component\Cache\Traits\RedisClusterProxy; +use Symfony\Component\Cache\Traits\RedisProxy; + +/** + * @author Nicolas Grekas + */ +class SessionHandlerFactory +{ + /** + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy|\Memcached|\PDO|string $connection Connection or DSN + */ + public static function createHandler($connection): AbstractSessionHandler + { + if (!\is_string($connection) && !\is_object($connection)) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a string or a connection object, "%s" given.', __METHOD__, get_debug_type($connection))); + } + + switch (true) { + case $connection instanceof \Redis: + case $connection instanceof \RedisArray: + case $connection instanceof \RedisCluster: + case $connection instanceof \Predis\ClientInterface: + case $connection instanceof RedisProxy: + case $connection instanceof RedisClusterProxy: + return new RedisSessionHandler($connection); + + case $connection instanceof \Memcached: + return new MemcachedSessionHandler($connection); + + case $connection instanceof \PDO: + return new PdoSessionHandler($connection); + + case !\is_string($connection): + throw new \InvalidArgumentException(sprintf('Unsupported Connection: "%s".', get_debug_type($connection))); + case 0 === strpos($connection, 'file://'): + return new StrictSessionHandler(new NativeFileSessionHandler(substr($connection, 7))); + + case 0 === strpos($connection, 'redis:'): + case 0 === strpos($connection, 'rediss:'): + case 0 === strpos($connection, 'memcached:'): + if (!class_exists(AbstractAdapter::class)) { + throw new \InvalidArgumentException(sprintf('Unsupported DSN "%s". Try running "composer require symfony/cache".', $connection)); + } + $handlerClass = 0 === strpos($connection, 'memcached:') ? MemcachedSessionHandler::class : RedisSessionHandler::class; + $connection = AbstractAdapter::createConnection($connection, ['lazy' => true]); + + return new $handlerClass($connection); + + case 0 === strpos($connection, 'pdo_oci://'): + if (!class_exists(DriverManager::class)) { + throw new \InvalidArgumentException(sprintf('Unsupported DSN "%s". Try running "composer require doctrine/dbal".', $connection)); + } + $connection = DriverManager::getConnection(['url' => $connection])->getWrappedConnection(); + // no break; + + case 0 === strpos($connection, 'mssql://'): + case 0 === strpos($connection, 'mysql://'): + case 0 === strpos($connection, 'mysql2://'): + case 0 === strpos($connection, 'pgsql://'): + case 0 === strpos($connection, 'postgres://'): + case 0 === strpos($connection, 'postgresql://'): + case 0 === strpos($connection, 'sqlsrv://'): + case 0 === strpos($connection, 'sqlite://'): + case 0 === strpos($connection, 'sqlite3://'): + return new PdoSessionHandler($connection); + } + + throw new \InvalidArgumentException(sprintf('Unsupported Connection: "%s".', $connection)); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php new file mode 100644 index 0000000..3cf4a6f --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; + +/** + * Adds basic `SessionUpdateTimestampHandlerInterface` behaviors to another `SessionHandlerInterface`. + * + * @author Nicolas Grekas + */ +class StrictSessionHandler extends AbstractSessionHandler +{ + private $handler; + private $doDestroy; + + public function __construct(\SessionHandlerInterface $handler) + { + if ($handler instanceof \SessionUpdateTimestampHandlerInterface) { + throw new \LogicException(sprintf('"%s" is already an instance of "SessionUpdateTimestampHandlerInterface", you cannot wrap it with "%s".', get_debug_type($handler), self::class)); + } + + $this->handler = $handler; + } + + /** + * @return bool + */ + public function open($savePath, $sessionName) + { + parent::open($savePath, $sessionName); + + return $this->handler->open($savePath, $sessionName); + } + + /** + * {@inheritdoc} + */ + protected function doRead(string $sessionId) + { + return $this->handler->read($sessionId); + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + return $this->write($sessionId, $data); + } + + /** + * {@inheritdoc} + */ + protected function doWrite(string $sessionId, string $data) + { + return $this->handler->write($sessionId, $data); + } + + /** + * @return bool + */ + public function destroy($sessionId) + { + $this->doDestroy = true; + $destroyed = parent::destroy($sessionId); + + return $this->doDestroy ? $this->doDestroy($sessionId) : $destroyed; + } + + /** + * {@inheritdoc} + */ + protected function doDestroy(string $sessionId) + { + $this->doDestroy = false; + + return $this->handler->destroy($sessionId); + } + + /** + * @return bool + */ + public function close() + { + return $this->handler->close(); + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + return $this->handler->gc($maxlifetime); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php new file mode 100644 index 0000000..c79ee02 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage; + +use Symfony\Component\HttpFoundation\Session\SessionBagInterface; + +/** + * Metadata container. + * + * Adds metadata to the session. + * + * @author Drak + */ +class MetadataBag implements SessionBagInterface +{ + const CREATED = 'c'; + const UPDATED = 'u'; + const LIFETIME = 'l'; + + /** + * @var string + */ + private $name = '__metadata'; + + /** + * @var string + */ + private $storageKey; + + /** + * @var array + */ + protected $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0]; + + /** + * Unix timestamp. + * + * @var int + */ + private $lastUsed; + + /** + * @var int + */ + private $updateThreshold; + + /** + * @param string $storageKey The key used to store bag in the session + * @param int $updateThreshold The time to wait between two UPDATED updates + */ + public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0) + { + $this->storageKey = $storageKey; + $this->updateThreshold = $updateThreshold; + } + + /** + * {@inheritdoc} + */ + public function initialize(array &$array) + { + $this->meta = &$array; + + if (isset($array[self::CREATED])) { + $this->lastUsed = $this->meta[self::UPDATED]; + + $timeStamp = time(); + if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) { + $this->meta[self::UPDATED] = $timeStamp; + } + } else { + $this->stampCreated(); + } + } + + /** + * Gets the lifetime that the session cookie was set with. + * + * @return int + */ + public function getLifetime() + { + return $this->meta[self::LIFETIME]; + } + + /** + * Stamps a new session's metadata. + * + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value + * will leave the system settings unchanged, 0 sets the cookie + * to expire with browser session. Time is in seconds, and is + * not a Unix timestamp. + */ + public function stampNew(int $lifetime = null) + { + $this->stampCreated($lifetime); + } + + /** + * {@inheritdoc} + */ + public function getStorageKey() + { + return $this->storageKey; + } + + /** + * Gets the created timestamp metadata. + * + * @return int Unix timestamp + */ + public function getCreated() + { + return $this->meta[self::CREATED]; + } + + /** + * Gets the last used metadata. + * + * @return int Unix timestamp + */ + public function getLastUsed() + { + return $this->lastUsed; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + // nothing to do + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } + + /** + * Sets name. + */ + public function setName(string $name) + { + $this->name = $name; + } + + private function stampCreated(int $lifetime = null): void + { + $timeStamp = time(); + $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp; + $this->meta[self::LIFETIME] = (null === $lifetime) ? ini_get('session.cookie_lifetime') : $lifetime; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php new file mode 100644 index 0000000..0201504 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php @@ -0,0 +1,252 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage; + +use Symfony\Component\HttpFoundation\Session\SessionBagInterface; + +/** + * MockArraySessionStorage mocks the session for unit tests. + * + * No PHP session is actually started since a session can be initialized + * and shutdown only once per PHP execution cycle. + * + * When doing functional testing, you should use MockFileSessionStorage instead. + * + * @author Fabien Potencier + * @author Bulat Shakirzyanov + * @author Drak + */ +class MockArraySessionStorage implements SessionStorageInterface +{ + /** + * @var string + */ + protected $id = ''; + + /** + * @var string + */ + protected $name; + + /** + * @var bool + */ + protected $started = false; + + /** + * @var bool + */ + protected $closed = false; + + /** + * @var array + */ + protected $data = []; + + /** + * @var MetadataBag + */ + protected $metadataBag; + + /** + * @var array|SessionBagInterface[] + */ + protected $bags = []; + + public function __construct(string $name = 'MOCKSESSID', MetadataBag $metaBag = null) + { + $this->name = $name; + $this->setMetadataBag($metaBag); + } + + public function setSessionData(array $array) + { + $this->data = $array; + } + + /** + * {@inheritdoc} + */ + public function start() + { + if ($this->started) { + return true; + } + + if (empty($this->id)) { + $this->id = $this->generateId(); + } + + $this->loadSession(); + + return true; + } + + /** + * {@inheritdoc} + */ + public function regenerate(bool $destroy = false, int $lifetime = null) + { + if (!$this->started) { + $this->start(); + } + + $this->metadataBag->stampNew($lifetime); + $this->id = $this->generateId(); + + return true; + } + + /** + * {@inheritdoc} + */ + public function getId() + { + return $this->id; + } + + /** + * {@inheritdoc} + */ + public function setId(string $id) + { + if ($this->started) { + throw new \LogicException('Cannot set session ID after the session has started.'); + } + + $this->id = $id; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } + + /** + * {@inheritdoc} + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * {@inheritdoc} + */ + public function save() + { + if (!$this->started || $this->closed) { + throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.'); + } + // nothing to do since we don't persist the session data + $this->closed = false; + $this->started = false; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + // clear out the bags + foreach ($this->bags as $bag) { + $bag->clear(); + } + + // clear out the session + $this->data = []; + + // reconnect the bags to the session + $this->loadSession(); + } + + /** + * {@inheritdoc} + */ + public function registerBag(SessionBagInterface $bag) + { + $this->bags[$bag->getName()] = $bag; + } + + /** + * {@inheritdoc} + */ + public function getBag(string $name) + { + if (!isset($this->bags[$name])) { + throw new \InvalidArgumentException(sprintf('The SessionBagInterface "%s" is not registered.', $name)); + } + + if (!$this->started) { + $this->start(); + } + + return $this->bags[$name]; + } + + /** + * {@inheritdoc} + */ + public function isStarted() + { + return $this->started; + } + + public function setMetadataBag(MetadataBag $bag = null) + { + if (null === $bag) { + $bag = new MetadataBag(); + } + + $this->metadataBag = $bag; + } + + /** + * Gets the MetadataBag. + * + * @return MetadataBag + */ + public function getMetadataBag() + { + return $this->metadataBag; + } + + /** + * Generates a session ID. + * + * This doesn't need to be particularly cryptographically secure since this is just + * a mock. + * + * @return string + */ + protected function generateId() + { + return hash('sha256', uniqid('ss_mock_', true)); + } + + protected function loadSession() + { + $bags = array_merge($this->bags, [$this->metadataBag]); + + foreach ($bags as $bag) { + $key = $bag->getStorageKey(); + $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : []; + $bag->initialize($this->data[$key]); + } + + $this->started = true; + $this->closed = false; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php new file mode 100644 index 0000000..ab8b864 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage; + +/** + * MockFileSessionStorage is used to mock sessions for + * functional testing when done in a single PHP process. + * + * No PHP session is actually started since a session can be initialized + * and shutdown only once per PHP execution cycle and this class does + * not pollute any session related globals, including session_*() functions + * or session.* PHP ini directives. + * + * @author Drak + */ +class MockFileSessionStorage extends MockArraySessionStorage +{ + private $savePath; + + /** + * @param string $savePath Path of directory to save session files + */ + public function __construct(string $savePath = null, string $name = 'MOCKSESSID', MetadataBag $metaBag = null) + { + if (null === $savePath) { + $savePath = sys_get_temp_dir(); + } + + if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) { + throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s".', $savePath)); + } + + $this->savePath = $savePath; + + parent::__construct($name, $metaBag); + } + + /** + * {@inheritdoc} + */ + public function start() + { + if ($this->started) { + return true; + } + + if (!$this->id) { + $this->id = $this->generateId(); + } + + $this->read(); + + $this->started = true; + + return true; + } + + /** + * {@inheritdoc} + */ + public function regenerate(bool $destroy = false, int $lifetime = null) + { + if (!$this->started) { + $this->start(); + } + + if ($destroy) { + $this->destroy(); + } + + return parent::regenerate($destroy, $lifetime); + } + + /** + * {@inheritdoc} + */ + public function save() + { + if (!$this->started) { + throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.'); + } + + $data = $this->data; + + foreach ($this->bags as $bag) { + if (empty($data[$key = $bag->getStorageKey()])) { + unset($data[$key]); + } + } + if ([$key = $this->metadataBag->getStorageKey()] === array_keys($data)) { + unset($data[$key]); + } + + try { + if ($data) { + file_put_contents($this->getFilePath(), serialize($data)); + } else { + $this->destroy(); + } + } finally { + $this->data = $data; + } + + // this is needed for Silex, where the session object is re-used across requests + // in functional tests. In Symfony, the container is rebooted, so we don't have + // this issue + $this->started = false; + } + + /** + * Deletes a session from persistent storage. + * Deliberately leaves session data in memory intact. + */ + private function destroy(): void + { + if (is_file($this->getFilePath())) { + unlink($this->getFilePath()); + } + } + + /** + * Calculate path to file. + */ + private function getFilePath(): string + { + return $this->savePath.'/'.$this->id.'.mocksess'; + } + + /** + * Reads session from storage and loads session. + */ + private function read(): void + { + $filePath = $this->getFilePath(); + $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : []; + + $this->loadSession(); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php new file mode 100644 index 0000000..2446b36 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php @@ -0,0 +1,467 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage; + +use Symfony\Component\HttpFoundation\Session\SessionBagInterface; +use Symfony\Component\HttpFoundation\Session\SessionUtils; +use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler; +use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; +use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; + +// Help opcache.preload discover always-needed symbols +class_exists(MetadataBag::class); +class_exists(StrictSessionHandler::class); +class_exists(SessionHandlerProxy::class); + +/** + * This provides a base class for session attribute storage. + * + * @author Drak + */ +class NativeSessionStorage implements SessionStorageInterface +{ + /** + * @var SessionBagInterface[] + */ + protected $bags = []; + + /** + * @var bool + */ + protected $started = false; + + /** + * @var bool + */ + protected $closed = false; + + /** + * @var AbstractProxy|\SessionHandlerInterface + */ + protected $saveHandler; + + /** + * @var MetadataBag + */ + protected $metadataBag; + + /** + * @var string|null + */ + private $emulateSameSite; + + /** + * Depending on how you want the storage driver to behave you probably + * want to override this constructor entirely. + * + * List of options for $options array with their defaults. + * + * @see https://php.net/session.configuration for options + * but we omit 'session.' from the beginning of the keys for convenience. + * + * ("auto_start", is not supported as it tells PHP to start a session before + * PHP starts to execute user-land code. Setting during runtime has no effect). + * + * cache_limiter, "" (use "0" to prevent headers from being sent entirely). + * cache_expire, "0" + * cookie_domain, "" + * cookie_httponly, "" + * cookie_lifetime, "0" + * cookie_path, "/" + * cookie_secure, "" + * cookie_samesite, null + * gc_divisor, "100" + * gc_maxlifetime, "1440" + * gc_probability, "1" + * lazy_write, "1" + * name, "PHPSESSID" + * referer_check, "" + * serialize_handler, "php" + * use_strict_mode, "0" + * use_cookies, "1" + * use_only_cookies, "1" + * use_trans_sid, "0" + * upload_progress.enabled, "1" + * upload_progress.cleanup, "1" + * upload_progress.prefix, "upload_progress_" + * upload_progress.name, "PHP_SESSION_UPLOAD_PROGRESS" + * upload_progress.freq, "1%" + * upload_progress.min-freq, "1" + * url_rewriter.tags, "a=href,area=href,frame=src,form=,fieldset=" + * sid_length, "32" + * sid_bits_per_character, "5" + * trans_sid_hosts, $_SERVER['HTTP_HOST'] + * trans_sid_tags, "a=href,area=href,frame=src,form=" + * + * @param AbstractProxy|\SessionHandlerInterface|null $handler + */ + public function __construct(array $options = [], $handler = null, MetadataBag $metaBag = null) + { + if (!\extension_loaded('session')) { + throw new \LogicException('PHP extension "session" is required.'); + } + + $options += [ + 'cache_limiter' => '', + 'cache_expire' => 0, + 'use_cookies' => 1, + 'lazy_write' => 1, + 'use_strict_mode' => 1, + ]; + + session_register_shutdown(); + + $this->setMetadataBag($metaBag); + $this->setOptions($options); + $this->setSaveHandler($handler); + } + + /** + * Gets the save handler instance. + * + * @return AbstractProxy|\SessionHandlerInterface + */ + public function getSaveHandler() + { + return $this->saveHandler; + } + + /** + * {@inheritdoc} + */ + public function start() + { + if ($this->started) { + return true; + } + + if (PHP_SESSION_ACTIVE === session_status()) { + throw new \RuntimeException('Failed to start the session: already started by PHP.'); + } + + if (filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN) && headers_sent($file, $line)) { + throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); + } + + // ok to try and start the session + if (!session_start()) { + throw new \RuntimeException('Failed to start the session.'); + } + + if (null !== $this->emulateSameSite) { + $originalCookie = SessionUtils::popSessionCookie(session_name(), session_id()); + if (null !== $originalCookie) { + header(sprintf('%s; SameSite=%s', $originalCookie, $this->emulateSameSite), false); + } + } + + $this->loadSession(); + + return true; + } + + /** + * {@inheritdoc} + */ + public function getId() + { + return $this->saveHandler->getId(); + } + + /** + * {@inheritdoc} + */ + public function setId(string $id) + { + $this->saveHandler->setId($id); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->saveHandler->getName(); + } + + /** + * {@inheritdoc} + */ + public function setName(string $name) + { + $this->saveHandler->setName($name); + } + + /** + * {@inheritdoc} + */ + public function regenerate(bool $destroy = false, int $lifetime = null) + { + // Cannot regenerate the session ID for non-active sessions. + if (PHP_SESSION_ACTIVE !== session_status()) { + return false; + } + + if (headers_sent()) { + return false; + } + + if (null !== $lifetime && $lifetime != ini_get('session.cookie_lifetime')) { + $this->save(); + ini_set('session.cookie_lifetime', $lifetime); + $this->start(); + } + + if ($destroy) { + $this->metadataBag->stampNew(); + } + + $isRegenerated = session_regenerate_id($destroy); + + if (null !== $this->emulateSameSite) { + $originalCookie = SessionUtils::popSessionCookie(session_name(), session_id()); + if (null !== $originalCookie) { + header(sprintf('%s; SameSite=%s', $originalCookie, $this->emulateSameSite), false); + } + } + + return $isRegenerated; + } + + /** + * {@inheritdoc} + */ + public function save() + { + // Store a copy so we can restore the bags in case the session was not left empty + $session = $_SESSION; + + foreach ($this->bags as $bag) { + if (empty($_SESSION[$key = $bag->getStorageKey()])) { + unset($_SESSION[$key]); + } + } + if ([$key = $this->metadataBag->getStorageKey()] === array_keys($_SESSION)) { + unset($_SESSION[$key]); + } + + // Register error handler to add information about the current save handler + $previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) { + if (E_WARNING === $type && 0 === strpos($msg, 'session_write_close():')) { + $handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler; + $msg = sprintf('session_write_close(): Failed to write session data with "%s" handler', \get_class($handler)); + } + + return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false; + }); + + try { + session_write_close(); + } finally { + restore_error_handler(); + + // Restore only if not empty + if ($_SESSION) { + $_SESSION = $session; + } + } + + $this->closed = true; + $this->started = false; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + // clear out the bags + foreach ($this->bags as $bag) { + $bag->clear(); + } + + // clear out the session + $_SESSION = []; + + // reconnect the bags to the session + $this->loadSession(); + } + + /** + * {@inheritdoc} + */ + public function registerBag(SessionBagInterface $bag) + { + if ($this->started) { + throw new \LogicException('Cannot register a bag when the session is already started.'); + } + + $this->bags[$bag->getName()] = $bag; + } + + /** + * {@inheritdoc} + */ + public function getBag(string $name) + { + if (!isset($this->bags[$name])) { + throw new \InvalidArgumentException(sprintf('The SessionBagInterface "%s" is not registered.', $name)); + } + + if (!$this->started && $this->saveHandler->isActive()) { + $this->loadSession(); + } elseif (!$this->started) { + $this->start(); + } + + return $this->bags[$name]; + } + + public function setMetadataBag(MetadataBag $metaBag = null) + { + if (null === $metaBag) { + $metaBag = new MetadataBag(); + } + + $this->metadataBag = $metaBag; + } + + /** + * Gets the MetadataBag. + * + * @return MetadataBag + */ + public function getMetadataBag() + { + return $this->metadataBag; + } + + /** + * {@inheritdoc} + */ + public function isStarted() + { + return $this->started; + } + + /** + * Sets session.* ini variables. + * + * For convenience we omit 'session.' from the beginning of the keys. + * Explicitly ignores other ini keys. + * + * @param array $options Session ini directives [key => value] + * + * @see https://php.net/session.configuration + */ + public function setOptions(array $options) + { + if (headers_sent() || PHP_SESSION_ACTIVE === session_status()) { + return; + } + + $validOptions = array_flip([ + 'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly', + 'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite', + 'gc_divisor', 'gc_maxlifetime', 'gc_probability', + 'lazy_write', 'name', 'referer_check', + 'serialize_handler', 'use_strict_mode', 'use_cookies', + 'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled', + 'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name', + 'upload_progress.freq', 'upload_progress.min_freq', 'url_rewriter.tags', + 'sid_length', 'sid_bits_per_character', 'trans_sid_hosts', 'trans_sid_tags', + ]); + + foreach ($options as $key => $value) { + if (isset($validOptions[$key])) { + if ('cookie_samesite' === $key && \PHP_VERSION_ID < 70300) { + // PHP < 7.3 does not support same_site cookies. We will emulate it in + // the start() method instead. + $this->emulateSameSite = $value; + continue; + } + ini_set('url_rewriter.tags' !== $key ? 'session.'.$key : $key, $value); + } + } + } + + /** + * Registers session save handler as a PHP session handler. + * + * To use internal PHP session save handlers, override this method using ini_set with + * session.save_handler and session.save_path e.g. + * + * ini_set('session.save_handler', 'files'); + * ini_set('session.save_path', '/tmp'); + * + * or pass in a \SessionHandler instance which configures session.save_handler in the + * constructor, for a template see NativeFileSessionHandler. + * + * @see https://php.net/session-set-save-handler + * @see https://php.net/sessionhandlerinterface + * @see https://php.net/sessionhandler + * + * @param AbstractProxy|\SessionHandlerInterface|null $saveHandler + * + * @throws \InvalidArgumentException + */ + public function setSaveHandler($saveHandler = null) + { + if (!$saveHandler instanceof AbstractProxy && + !$saveHandler instanceof \SessionHandlerInterface && + null !== $saveHandler) { + throw new \InvalidArgumentException('Must be instance of AbstractProxy; implement \SessionHandlerInterface; or be null.'); + } + + // Wrap $saveHandler in proxy and prevent double wrapping of proxy + if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) { + $saveHandler = new SessionHandlerProxy($saveHandler); + } elseif (!$saveHandler instanceof AbstractProxy) { + $saveHandler = new SessionHandlerProxy(new StrictSessionHandler(new \SessionHandler())); + } + $this->saveHandler = $saveHandler; + + if (headers_sent() || PHP_SESSION_ACTIVE === session_status()) { + return; + } + + if ($this->saveHandler instanceof SessionHandlerProxy) { + session_set_save_handler($this->saveHandler, false); + } + } + + /** + * Load the session with attributes. + * + * After starting the session, PHP retrieves the session from whatever handlers + * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()). + * PHP takes the return value from the read() handler, unserializes it + * and populates $_SESSION with the result automatically. + */ + protected function loadSession(array &$session = null) + { + if (null === $session) { + $session = &$_SESSION; + } + + $bags = array_merge($this->bags, [$this->metadataBag]); + + foreach ($bags as $bag) { + $key = $bag->getStorageKey(); + $session[$key] = isset($session[$key]) && \is_array($session[$key]) ? $session[$key] : []; + $bag->initialize($session[$key]); + } + + $this->started = true; + $this->closed = false; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php new file mode 100644 index 0000000..72dbef1 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage; + +use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; + +/** + * Allows session to be started by PHP and managed by Symfony. + * + * @author Drak + */ +class PhpBridgeSessionStorage extends NativeSessionStorage +{ + /** + * @param AbstractProxy|\SessionHandlerInterface|null $handler + */ + public function __construct($handler = null, MetadataBag $metaBag = null) + { + if (!\extension_loaded('session')) { + throw new \LogicException('PHP extension "session" is required.'); + } + + $this->setMetadataBag($metaBag); + $this->setSaveHandler($handler); + } + + /** + * {@inheritdoc} + */ + public function start() + { + if ($this->started) { + return true; + } + + $this->loadSession(); + + return true; + } + + /** + * {@inheritdoc} + */ + public function clear() + { + // clear out the bags and nothing else that may be set + // since the purpose of this driver is to share a handler + foreach ($this->bags as $bag) { + $bag->clear(); + } + + // reconnect the bags to the session + $this->loadSession(); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php new file mode 100644 index 0000000..e7be22c --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; + +/** + * @author Drak + */ +abstract class AbstractProxy +{ + /** + * Flag if handler wraps an internal PHP session handler (using \SessionHandler). + * + * @var bool + */ + protected $wrapper = false; + + /** + * @var string + */ + protected $saveHandlerName; + + /** + * Gets the session.save_handler name. + * + * @return string|null + */ + public function getSaveHandlerName() + { + return $this->saveHandlerName; + } + + /** + * Is this proxy handler and instance of \SessionHandlerInterface. + * + * @return bool + */ + public function isSessionHandlerInterface() + { + return $this instanceof \SessionHandlerInterface; + } + + /** + * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. + * + * @return bool + */ + public function isWrapper() + { + return $this->wrapper; + } + + /** + * Has a session started? + * + * @return bool + */ + public function isActive() + { + return PHP_SESSION_ACTIVE === session_status(); + } + + /** + * Gets the session ID. + * + * @return string + */ + public function getId() + { + return session_id(); + } + + /** + * Sets the session ID. + * + * @throws \LogicException + */ + public function setId(string $id) + { + if ($this->isActive()) { + throw new \LogicException('Cannot change the ID of an active session.'); + } + + session_id($id); + } + + /** + * Gets the session name. + * + * @return string + */ + public function getName() + { + return session_name(); + } + + /** + * Sets the session name. + * + * @throws \LogicException + */ + public function setName(string $name) + { + if ($this->isActive()) { + throw new \LogicException('Cannot change the name of an active session.'); + } + + session_name($name); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php new file mode 100644 index 0000000..de4f550 --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; + +/** + * @author Drak + */ +class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface +{ + protected $handler; + + public function __construct(\SessionHandlerInterface $handler) + { + $this->handler = $handler; + $this->wrapper = ($handler instanceof \SessionHandler); + $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user'; + } + + /** + * @return \SessionHandlerInterface + */ + public function getHandler() + { + return $this->handler; + } + + // \SessionHandlerInterface + + /** + * @return bool + */ + public function open($savePath, $sessionName) + { + return (bool) $this->handler->open($savePath, $sessionName); + } + + /** + * @return bool + */ + public function close() + { + return (bool) $this->handler->close(); + } + + /** + * @return string + */ + public function read($sessionId) + { + return (string) $this->handler->read($sessionId); + } + + /** + * @return bool + */ + public function write($sessionId, $data) + { + return (bool) $this->handler->write($sessionId, $data); + } + + /** + * @return bool + */ + public function destroy($sessionId) + { + return (bool) $this->handler->destroy($sessionId); + } + + /** + * @return bool + */ + public function gc($maxlifetime) + { + return (bool) $this->handler->gc($maxlifetime); + } + + /** + * @return bool + */ + public function validateId($sessionId) + { + return !$this->handler instanceof \SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId); + } + + /** + * @return bool + */ + public function updateTimestamp($sessionId, $data) + { + return $this->handler instanceof \SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data); + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php new file mode 100644 index 0000000..eb8e8ff --- /dev/null +++ b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php @@ -0,0 +1,131 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session\Storage; + +use Symfony\Component\HttpFoundation\Session\SessionBagInterface; + +/** + * StorageInterface. + * + * @author Fabien Potencier + * @author Drak + */ +interface SessionStorageInterface +{ + /** + * Starts the session. + * + * @return bool True if started + * + * @throws \RuntimeException if something goes wrong starting the session + */ + public function start(); + + /** + * Checks if the session is started. + * + * @return bool True if started, false otherwise + */ + public function isStarted(); + + /** + * Returns the session ID. + * + * @return string The session ID or empty + */ + public function getId(); + + /** + * Sets the session ID. + */ + public function setId(string $id); + + /** + * Returns the session name. + * + * @return string The session name + */ + public function getName(); + + /** + * Sets the session name. + */ + public function setName(string $name); + + /** + * Regenerates id that represents this storage. + * + * This method must invoke session_regenerate_id($destroy) unless + * this interface is used for a storage object designed for unit + * or functional testing where a real PHP session would interfere + * with testing. + * + * Note regenerate+destroy should not clear the session data in memory + * only delete the session data from persistent storage. + * + * Care: When regenerating the session ID no locking is involved in PHP's + * session design. See https://bugs.php.net/61470 for a discussion. + * So you must make sure the regenerated session is saved BEFORE sending the + * headers with the new ID. Symfony's HttpKernel offers a listener for this. + * See Symfony\Component\HttpKernel\EventListener\SaveSessionListener. + * Otherwise session data could get lost again for concurrent requests with the + * new ID. One result could be that you get logged out after just logging in. + * + * @param bool $destroy Destroy session when regenerating? + * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value + * will leave the system settings unchanged, 0 sets the cookie + * to expire with browser session. Time is in seconds, and is + * not a Unix timestamp. + * + * @return bool True if session regenerated, false if error + * + * @throws \RuntimeException If an error occurs while regenerating this storage + */ + public function regenerate(bool $destroy = false, int $lifetime = null); + + /** + * Force the session to be saved and closed. + * + * This method must invoke session_write_close() unless this interface is + * used for a storage object design for unit or functional testing where + * a real PHP session would interfere with testing, in which case + * it should actually persist the session data if required. + * + * @throws \RuntimeException if the session is saved without being started, or if the session + * is already closed + */ + public function save(); + + /** + * Clear all session data in memory. + */ + public function clear(); + + /** + * Gets a SessionBagInterface by name. + * + * @return SessionBagInterface + * + * @throws \InvalidArgumentException If the bag does not exist + */ + public function getBag(string $name); + + /** + * Registers a SessionBagInterface for use. + */ + public function registerBag(SessionBagInterface $bag); + + /** + * @return MetadataBag + */ + public function getMetadataBag(); +} diff --git a/vendor/symfony/http-foundation/StreamedResponse.php b/vendor/symfony/http-foundation/StreamedResponse.php new file mode 100644 index 0000000..7cbf453 --- /dev/null +++ b/vendor/symfony/http-foundation/StreamedResponse.php @@ -0,0 +1,139 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +/** + * StreamedResponse represents a streamed HTTP response. + * + * A StreamedResponse uses a callback for its content. + * + * The callback should use the standard PHP functions like echo + * to stream the response back to the client. The flush() function + * can also be used if needed. + * + * @see flush() + * + * @author Fabien Potencier + */ +class StreamedResponse extends Response +{ + protected $callback; + protected $streamed; + private $headersSent; + + public function __construct(callable $callback = null, int $status = 200, array $headers = []) + { + parent::__construct(null, $status, $headers); + + if (null !== $callback) { + $this->setCallback($callback); + } + $this->streamed = false; + $this->headersSent = false; + } + + /** + * Factory method for chainability. + * + * @param callable|null $callback A valid PHP callback or null to set it later + * + * @return static + * + * @deprecated since Symfony 5.1, use __construct() instead. + */ + public static function create($callback = null, int $status = 200, array $headers = []) + { + trigger_deprecation('symfony/http-foundation', '5.1', 'The "%s()" method is deprecated, use "new %s()" instead.', __METHOD__, \get_called_class()); + + return new static($callback, $status, $headers); + } + + /** + * Sets the PHP callback associated with this Response. + * + * @return $this + */ + public function setCallback(callable $callback) + { + $this->callback = $callback; + + return $this; + } + + /** + * {@inheritdoc} + * + * This method only sends the headers once. + * + * @return $this + */ + public function sendHeaders() + { + if ($this->headersSent) { + return $this; + } + + $this->headersSent = true; + + return parent::sendHeaders(); + } + + /** + * {@inheritdoc} + * + * This method only sends the content once. + * + * @return $this + */ + public function sendContent() + { + if ($this->streamed) { + return $this; + } + + $this->streamed = true; + + if (null === $this->callback) { + throw new \LogicException('The Response callback must not be null.'); + } + + ($this->callback)(); + + return $this; + } + + /** + * {@inheritdoc} + * + * @throws \LogicException when the content is not null + * + * @return $this + */ + public function setContent(?string $content) + { + if (null !== $content) { + throw new \LogicException('The content cannot be set on a StreamedResponse instance.'); + } + + $this->streamed = true; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getContent() + { + return false; + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php b/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php new file mode 100644 index 0000000..cb216ea --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Request; + +final class RequestAttributeValueSame extends Constraint +{ + private $name; + private $value; + + public function __construct(string $name, string $value) + { + $this->name = $name; + $this->value = $value; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('has attribute "%s" with value "%s"', $this->name, $this->value); + } + + /** + * @param Request $request + * + * {@inheritdoc} + */ + protected function matches($request): bool + { + return $this->value === $request->attributes->get($this->name); + } + + /** + * @param Request $request + * + * {@inheritdoc} + */ + protected function failureDescription($request): string + { + return 'the Request '.$this->toString(); + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php new file mode 100644 index 0000000..554e1a1 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseCookieValueSame extends Constraint +{ + private $name; + private $value; + private $path; + private $domain; + + public function __construct(string $name, string $value, string $path = '/', string $domain = null) + { + $this->name = $name; + $this->value = $value; + $this->path = $path; + $this->domain = $domain; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + $str = sprintf('has cookie "%s"', $this->name); + if ('/' !== $this->path) { + $str .= sprintf(' with path "%s"', $this->path); + } + if ($this->domain) { + $str .= sprintf(' for domain "%s"', $this->domain); + } + $str .= sprintf(' with value "%s"', $this->value); + + return $str; + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + $cookie = $this->getCookie($response); + if (!$cookie) { + return false; + } + + return $this->value === $cookie->getValue(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } + + protected function getCookie(Response $response): ?Cookie + { + $cookies = $response->headers->getCookies(); + + $filteredCookies = array_filter($cookies, function (Cookie $cookie) { + return $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain; + }); + + return reset($filteredCookies) ?: null; + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php new file mode 100644 index 0000000..eae9e27 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseHasCookie extends Constraint +{ + private $name; + private $path; + private $domain; + + public function __construct(string $name, string $path = '/', string $domain = null) + { + $this->name = $name; + $this->path = $path; + $this->domain = $domain; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + $str = sprintf('has cookie "%s"', $this->name); + if ('/' !== $this->path) { + $str .= sprintf(' with path "%s"', $this->path); + } + if ($this->domain) { + $str .= sprintf(' for domain "%s"', $this->domain); + } + + return $str; + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + return null !== $this->getCookie($response); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } + + private function getCookie(Response $response): ?Cookie + { + $cookies = $response->headers->getCookies(); + + $filteredCookies = array_filter($cookies, function (Cookie $cookie) { + return $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain; + }); + + return reset($filteredCookies) ?: null; + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php new file mode 100644 index 0000000..68ad827 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseHasHeader extends Constraint +{ + private $headerName; + + public function __construct(string $headerName) + { + $this->headerName = $headerName; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('has header "%s"', $this->headerName); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + return $response->headers->has($this->headerName); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php new file mode 100644 index 0000000..a27d0c7 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseHeaderSame extends Constraint +{ + private $headerName; + private $expectedValue; + + public function __construct(string $headerName, string $expectedValue) + { + $this->headerName = $headerName; + $this->expectedValue = $expectedValue; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('has header "%s" with value "%s"', $this->headerName, $this->expectedValue); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + return $this->expectedValue === $response->headers->get($this->headerName, null); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php new file mode 100644 index 0000000..8c4b883 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseIsRedirected extends Constraint +{ + /** + * {@inheritdoc} + */ + public function toString(): string + { + return 'is redirected'; + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + return $response->isRedirect(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function additionalFailureDescription($response): string + { + return (string) $response; + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php new file mode 100644 index 0000000..9c66558 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseIsSuccessful extends Constraint +{ + /** + * {@inheritdoc} + */ + public function toString(): string + { + return 'is successful'; + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + return $response->isSuccessful(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function additionalFailureDescription($response): string + { + return (string) $response; + } +} diff --git a/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php b/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php new file mode 100644 index 0000000..72bb000 --- /dev/null +++ b/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\HttpFoundation\Response; + +final class ResponseStatusCodeSame extends Constraint +{ + private $statusCode; + + public function __construct(int $statusCode) + { + $this->statusCode = $statusCode; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return 'status code is '.$this->statusCode; + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function matches($response): bool + { + return $this->statusCode === $response->getStatusCode(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function failureDescription($response): string + { + return 'the Response '.$this->toString(); + } + + /** + * @param Response $response + * + * {@inheritdoc} + */ + protected function additionalFailureDescription($response): string + { + return (string) $response; + } +} diff --git a/vendor/symfony/http-foundation/UrlHelper.php b/vendor/symfony/http-foundation/UrlHelper.php new file mode 100644 index 0000000..f114c0a --- /dev/null +++ b/vendor/symfony/http-foundation/UrlHelper.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation; + +use Symfony\Component\Routing\RequestContext; + +/** + * A helper service for manipulating URLs within and outside the request scope. + * + * @author Valentin Udaltsov + */ +final class UrlHelper +{ + private $requestStack; + private $requestContext; + + public function __construct(RequestStack $requestStack, RequestContext $requestContext = null) + { + $this->requestStack = $requestStack; + $this->requestContext = $requestContext; + } + + public function getAbsoluteUrl(string $path): string + { + if (false !== strpos($path, '://') || '//' === substr($path, 0, 2)) { + return $path; + } + + if (null === $request = $this->requestStack->getMasterRequest()) { + return $this->getAbsoluteUrlFromContext($path); + } + + if ('#' === $path[0]) { + $path = $request->getRequestUri().$path; + } elseif ('?' === $path[0]) { + $path = $request->getPathInfo().$path; + } + + if (!$path || '/' !== $path[0]) { + $prefix = $request->getPathInfo(); + $last = \strlen($prefix) - 1; + if ($last !== $pos = strrpos($prefix, '/')) { + $prefix = substr($prefix, 0, $pos).'/'; + } + + return $request->getUriForPath($prefix.$path); + } + + return $request->getSchemeAndHttpHost().$path; + } + + public function getRelativePath(string $path): string + { + if (false !== strpos($path, '://') || '//' === substr($path, 0, 2)) { + return $path; + } + + if (null === $request = $this->requestStack->getMasterRequest()) { + return $path; + } + + return $request->getRelativeUriForPath($path); + } + + private function getAbsoluteUrlFromContext(string $path): string + { + if (null === $this->requestContext || '' === $host = $this->requestContext->getHost()) { + return $path; + } + + $scheme = $this->requestContext->getScheme(); + $port = ''; + + if ('http' === $scheme && 80 !== $this->requestContext->getHttpPort()) { + $port = ':'.$this->requestContext->getHttpPort(); + } elseif ('https' === $scheme && 443 !== $this->requestContext->getHttpsPort()) { + $port = ':'.$this->requestContext->getHttpsPort(); + } + + if ('#' === $path[0]) { + $queryString = $this->requestContext->getQueryString(); + $path = $this->requestContext->getPathInfo().($queryString ? '?'.$queryString : '').$path; + } elseif ('?' === $path[0]) { + $path = $this->requestContext->getPathInfo().$path; + } + + if ('/' !== $path[0]) { + $path = rtrim($this->requestContext->getBaseUrl(), '/').'/'.$path; + } + + return $scheme.'://'.$host.$port.$path; + } +} diff --git a/vendor/symfony/http-foundation/composer.json b/vendor/symfony/http-foundation/composer.json new file mode 100644 index 0000000..f4350ce --- /dev/null +++ b/vendor/symfony/http-foundation/composer.json @@ -0,0 +1,45 @@ +{ + "name": "symfony/http-foundation", + "type": "library", + "description": "Symfony HttpFoundation Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0" + }, + "suggest" : { + "symfony/mime": "To use the file extension guesser" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/http-kernel/Bundle/Bundle.php b/vendor/symfony/http-kernel/Bundle/Bundle.php new file mode 100644 index 0000000..2e65f67 --- /dev/null +++ b/vendor/symfony/http-kernel/Bundle/Bundle.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Bundle; + +use Symfony\Component\Console\Application; +use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\DependencyInjection\ContainerAwareTrait; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; + +/** + * An implementation of BundleInterface that adds a few conventions for DependencyInjection extensions. + * + * @author Fabien Potencier + */ +abstract class Bundle implements BundleInterface +{ + use ContainerAwareTrait; + + protected $name; + protected $extension; + protected $path; + private $namespace; + + /** + * {@inheritdoc} + */ + public function boot() + { + } + + /** + * {@inheritdoc} + */ + public function shutdown() + { + } + + /** + * {@inheritdoc} + * + * This method can be overridden to register compilation passes, + * other extensions, ... + */ + public function build(ContainerBuilder $container) + { + } + + /** + * Returns the bundle's container extension. + * + * @return ExtensionInterface|null The container extension + * + * @throws \LogicException + */ + public function getContainerExtension() + { + if (null === $this->extension) { + $extension = $this->createContainerExtension(); + + if (null !== $extension) { + if (!$extension instanceof ExtensionInterface) { + throw new \LogicException(sprintf('Extension "%s" must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', get_debug_type($extension))); + } + + // check naming convention + $basename = preg_replace('/Bundle$/', '', $this->getName()); + $expectedAlias = Container::underscore($basename); + + if ($expectedAlias != $extension->getAlias()) { + throw new \LogicException(sprintf('Users will expect the alias of the default extension of a bundle to be the underscored version of the bundle name ("%s"). You can override "Bundle::getContainerExtension()" if you want to use "%s" or another alias.', $expectedAlias, $extension->getAlias())); + } + + $this->extension = $extension; + } else { + $this->extension = false; + } + } + + return $this->extension ?: null; + } + + /** + * {@inheritdoc} + */ + public function getNamespace() + { + if (null === $this->namespace) { + $this->parseClassName(); + } + + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function getPath() + { + if (null === $this->path) { + $reflected = new \ReflectionObject($this); + $this->path = \dirname($reflected->getFileName()); + } + + return $this->path; + } + + /** + * Returns the bundle name (the class short name). + */ + final public function getName(): string + { + if (null === $this->name) { + $this->parseClassName(); + } + + return $this->name; + } + + public function registerCommands(Application $application) + { + } + + /** + * Returns the bundle's container extension class. + * + * @return string + */ + protected function getContainerExtensionClass() + { + $basename = preg_replace('/Bundle$/', '', $this->getName()); + + return $this->getNamespace().'\\DependencyInjection\\'.$basename.'Extension'; + } + + /** + * Creates the bundle's container extension. + * + * @return ExtensionInterface|null + */ + protected function createContainerExtension() + { + return class_exists($class = $this->getContainerExtensionClass()) ? new $class() : null; + } + + private function parseClassName() + { + $pos = strrpos(static::class, '\\'); + $this->namespace = false === $pos ? '' : substr(static::class, 0, $pos); + if (null === $this->name) { + $this->name = false === $pos ? static::class : substr(static::class, $pos + 1); + } + } +} diff --git a/vendor/symfony/http-kernel/Bundle/BundleInterface.php b/vendor/symfony/http-kernel/Bundle/BundleInterface.php new file mode 100644 index 0000000..88a95d8 --- /dev/null +++ b/vendor/symfony/http-kernel/Bundle/BundleInterface.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Bundle; + +use Symfony\Component\DependencyInjection\ContainerAwareInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; + +/** + * BundleInterface. + * + * @author Fabien Potencier + */ +interface BundleInterface extends ContainerAwareInterface +{ + /** + * Boots the Bundle. + */ + public function boot(); + + /** + * Shutdowns the Bundle. + */ + public function shutdown(); + + /** + * Builds the bundle. + * + * It is only ever called once when the cache is empty. + */ + public function build(ContainerBuilder $container); + + /** + * Returns the container extension that should be implicitly loaded. + * + * @return ExtensionInterface|null The default extension or null if there is none + */ + public function getContainerExtension(); + + /** + * Returns the bundle name (the class short name). + * + * @return string The Bundle name + */ + public function getName(); + + /** + * Gets the Bundle namespace. + * + * @return string The Bundle namespace + */ + public function getNamespace(); + + /** + * Gets the Bundle directory path. + * + * The path should always be returned as a Unix path (with /). + * + * @return string The Bundle absolute path + */ + public function getPath(); +} diff --git a/vendor/symfony/http-kernel/CHANGELOG.md b/vendor/symfony/http-kernel/CHANGELOG.md new file mode 100644 index 0000000..b74c4b8 --- /dev/null +++ b/vendor/symfony/http-kernel/CHANGELOG.md @@ -0,0 +1,281 @@ +CHANGELOG +========= + +5.1.0 +----- + + * allowed to use a specific logger channel for deprecations + * made `WarmableInterface::warmUp()` return a list of classes or files to preload on PHP 7.4+; + not returning an array is deprecated + * made kernels implementing `WarmableInterface` be part of the cache warmup stage + * deprecated support for `service:action` syntax to reference controllers, use `serviceOrFqcn::method` instead + * allowed using public aliases to reference controllers + * added session usage reporting when the `_stateless` attribute of the request is set to `true` + * added `AbstractSessionListener::onSessionUsage()` to report when the session is used while a request is stateless + +5.0.0 +----- + + * removed support for getting the container from a non-booted kernel + * removed the first and second constructor argument of `ConfigDataCollector` + * removed `ConfigDataCollector::getApplicationName()` + * removed `ConfigDataCollector::getApplicationVersion()` + * removed support for `Symfony\Component\Templating\EngineInterface` in `HIncludeFragmentRenderer`, use a `Twig\Environment` only + * removed `TranslatorListener` in favor of `LocaleAwareListener` + * removed `getRootDir()` and `getName()` from `Kernel` and `KernelInterface` + * removed `FilterControllerArgumentsEvent`, use `ControllerArgumentsEvent` instead + * removed `FilterControllerEvent`, use `ControllerEvent` instead + * removed `FilterResponseEvent`, use `ResponseEvent` instead + * removed `GetResponseEvent`, use `RequestEvent` instead + * removed `GetResponseForControllerResultEvent`, use `ViewEvent` instead + * removed `GetResponseForExceptionEvent`, use `ExceptionEvent` instead + * removed `PostResponseEvent`, use `TerminateEvent` instead + * removed `SaveSessionListener` in favor of `AbstractSessionListener` + * removed `Client`, use `HttpKernelBrowser` instead + * added method `getProjectDir()` to `KernelInterface` + * removed methods `serialize` and `unserialize` from `DataCollector`, store the serialized state in the data property instead + * made `ProfilerStorageInterface` internal + * removed the second and third argument of `KernelInterface::locateResource` + * removed the second and third argument of `FileLocator::__construct` + * removed loading resources from `%kernel.root_dir%/Resources` and `%kernel.root_dir%` as + fallback directories. + * removed class `ExceptionListener`, use `ErrorListener` instead + +4.4.0 +----- + + * The `DebugHandlersListener` class has been marked as `final` + * Added new Bundle directory convention consistent with standard skeletons + * Deprecated the second and third argument of `KernelInterface::locateResource` + * Deprecated the second and third argument of `FileLocator::__construct` + * Deprecated loading resources from `%kernel.root_dir%/Resources` and `%kernel.root_dir%` as + fallback directories. Resources like service definitions are usually loaded relative to the + current directory or with a glob pattern. The fallback directories have never been advocated + so you likely do not use those in any app based on the SF Standard or Flex edition. + * Marked all dispatched event classes as `@final` + * Added `ErrorController` to enable the preview and error rendering mechanism + * Getting the container from a non-booted kernel is deprecated. + * Marked the `AjaxDataCollector`, `ConfigDataCollector`, `EventDataCollector`, + `ExceptionDataCollector`, `LoggerDataCollector`, `MemoryDataCollector`, + `RequestDataCollector` and `TimeDataCollector` classes as `@final`. + * Marked the `RouterDataCollector::collect()` method as `@final`. + * The `DataCollectorInterface::collect()` and `Profiler::collect()` methods third parameter signature + will be `\Throwable $exception = null` instead of `\Exception $exception = null` in Symfony 5.0. + * Deprecated methods `ExceptionEvent::get/setException()`, use `get/setThrowable()` instead + * Deprecated class `ExceptionListener`, use `ErrorListener` instead + +4.3.0 +----- + + * renamed `Client` to `HttpKernelBrowser` + * `KernelInterface` doesn't extend `Serializable` anymore + * deprecated the `Kernel::serialize()` and `unserialize()` methods + * increased the priority of `Symfony\Component\HttpKernel\EventListener\AddRequestFormatsListener` + * made `Symfony\Component\HttpKernel\EventListener\LocaleListener` set the default locale early + * deprecated `TranslatorListener` in favor of `LocaleAwareListener` + * added the registration of all `LocaleAwareInterface` implementations into the `LocaleAwareListener` + * made `FileLinkFormatter` final and not implement `Serializable` anymore + * the base `DataCollector` doesn't implement `Serializable` anymore, you should + store all the serialized state in the data property instead + * `DumpDataCollector` has been marked as `final` + * added an event listener to prevent search engines from indexing applications in debug mode. + * renamed `FilterControllerArgumentsEvent` to `ControllerArgumentsEvent` + * renamed `FilterControllerEvent` to `ControllerEvent` + * renamed `FilterResponseEvent` to `ResponseEvent` + * renamed `GetResponseEvent` to `RequestEvent` + * renamed `GetResponseForControllerResultEvent` to `ViewEvent` + * renamed `GetResponseForExceptionEvent` to `ExceptionEvent` + * renamed `PostResponseEvent` to `TerminateEvent` + * added `HttpClientKernel` for handling requests with an `HttpClientInterface` instance + * added `trace_header` and `trace_level` configuration options to `HttpCache` + +4.2.0 +----- + + * deprecated `KernelInterface::getRootDir()` and the `kernel.root_dir` parameter + * deprecated `KernelInterface::getName()` and the `kernel.name` parameter + * deprecated the first and second constructor argument of `ConfigDataCollector` + * deprecated `ConfigDataCollector::getApplicationName()` + * deprecated `ConfigDataCollector::getApplicationVersion()` + +4.1.0 +----- + + * added orphaned events support to `EventDataCollector` + * `ExceptionListener` now logs exceptions at priority `0` (previously logged at `-128`) + * Added support for using `service::method` to reference controllers, making it consistent with other cases. It is recommended over the `service:action` syntax with a single colon, which will be deprecated in the future. + * Added the ability to profile individual argument value resolvers via the + `Symfony\Component\HttpKernel\Controller\ArgumentResolver\TraceableValueResolver` + +4.0.0 +----- + + * removed the `DataCollector::varToString()` method, use `DataCollector::cloneVar()` + instead + * using the `DataCollector::cloneVar()` method requires the VarDumper component + * removed the `ValueExporter` class + * removed `ControllerResolverInterface::getArguments()` + * removed `TraceableControllerResolver::getArguments()` + * removed `ControllerResolver::getArguments()` and the ability to resolve arguments + * removed the `argument_resolver` service dependency from the `debug.controller_resolver` + * removed `LazyLoadingFragmentHandler::addRendererService()` + * removed `Psr6CacheClearer::addPool()` + * removed `Extension::addClassesToCompile()` and `Extension::getClassesToCompile()` + * removed `Kernel::loadClassCache()`, `Kernel::doLoadClassCache()`, `Kernel::setClassCache()`, + and `Kernel::getEnvParameters()` + * support for the `X-Status-Code` when handling exceptions in the `HttpKernel` + has been dropped, use the `HttpKernel::allowCustomResponseCode()` method + instead + * removed convention-based commands registration + * removed the `ChainCacheClearer::add()` method + * removed the `CacheaWarmerAggregate::add()` and `setWarmers()` methods + * made `CacheWarmerAggregate` and `ChainCacheClearer` classes final + +3.4.0 +----- + + * added a minimalist PSR-3 `Logger` class that writes in `stderr` + * made kernels implementing `CompilerPassInterface` able to process the container + * deprecated bundle inheritance + * added `RebootableInterface` and implemented it in `Kernel` + * deprecated commands auto registration + * deprecated `EnvParametersResource` + * added `Symfony\Component\HttpKernel\Client::catchExceptions()` + * deprecated the `ChainCacheClearer::add()` method + * deprecated the `CacheaWarmerAggregate::add()` and `setWarmers()` methods + * made `CacheWarmerAggregate` and `ChainCacheClearer` classes final + * added the possibility to reset the profiler to its initial state + * deprecated data collectors without a `reset()` method + * deprecated implementing `DebugLoggerInterface` without a `clear()` method + +3.3.0 +----- + + * added `kernel.project_dir` and `Kernel::getProjectDir()` + * deprecated `kernel.root_dir` and `Kernel::getRootDir()` + * deprecated `Kernel::getEnvParameters()` + * deprecated the special `SYMFONY__` environment variables + * added the possibility to change the query string parameter used by `UriSigner` + * deprecated `LazyLoadingFragmentHandler::addRendererService()` + * deprecated `Extension::addClassesToCompile()` and `Extension::getClassesToCompile()` + * deprecated `Psr6CacheClearer::addPool()` + +3.2.0 +----- + + * deprecated `DataCollector::varToString()`, use `cloneVar()` instead + * changed surrogate capability name in `AbstractSurrogate::addSurrogateCapability` to 'symfony' + * Added `ControllerArgumentValueResolverPass` + +3.1.0 +----- + * deprecated passing objects as URI attributes to the ESI and SSI renderers + * deprecated `ControllerResolver::getArguments()` + * added `Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface` + * added `Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface` as argument to `HttpKernel` + * added `Symfony\Component\HttpKernel\Controller\ArgumentResolver` + * added `Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::getMethod()` + * added `Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::getRedirect()` + * added the `kernel.controller_arguments` event, triggered after controller arguments have been resolved + +3.0.0 +----- + + * removed `Symfony\Component\HttpKernel\Kernel::init()` + * removed `Symfony\Component\HttpKernel\Kernel::isClassInActiveBundle()` and `Symfony\Component\HttpKernel\KernelInterface::isClassInActiveBundle()` + * removed `Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher::setProfiler()` + * removed `Symfony\Component\HttpKernel\EventListener\FragmentListener::getLocalIpAddresses()` + * removed `Symfony\Component\HttpKernel\EventListener\LocaleListener::setRequest()` + * removed `Symfony\Component\HttpKernel\EventListener\RouterListener::setRequest()` + * removed `Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest()` + * removed `Symfony\Component\HttpKernel\Fragment\FragmentHandler::setRequest()` + * removed `Symfony\Component\HttpKernel\HttpCache\Esi::hasSurrogateEsiCapability()` + * removed `Symfony\Component\HttpKernel\HttpCache\Esi::addSurrogateEsiCapability()` + * removed `Symfony\Component\HttpKernel\HttpCache\Esi::needsEsiParsing()` + * removed `Symfony\Component\HttpKernel\HttpCache\HttpCache::getEsi()` + * removed `Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel` + * removed `Symfony\Component\HttpKernel\DependencyInjection\RegisterListenersPass` + * removed `Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener` + * removed `Symfony\Component\HttpKernel\EventListener\EsiListener` + * removed `Symfony\Component\HttpKernel\HttpCache\EsiResponseCacheStrategy` + * removed `Symfony\Component\HttpKernel\HttpCache\EsiResponseCacheStrategyInterface` + * removed `Symfony\Component\HttpKernel\Log\LoggerInterface` + * removed `Symfony\Component\HttpKernel\Log\NullLogger` + * removed `Symfony\Component\HttpKernel\Profiler::import()` + * removed `Symfony\Component\HttpKernel\Profiler::export()` + +2.8.0 +----- + + * deprecated `Profiler::import` and `Profiler::export` + +2.7.0 +----- + + * added the HTTP status code to profiles + +2.6.0 +----- + + * deprecated `Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener`, use `Symfony\Component\HttpKernel\EventListener\DebugHandlersListener` instead + * deprecated unused method `Symfony\Component\HttpKernel\Kernel::isClassInActiveBundle` and `Symfony\Component\HttpKernel\KernelInterface::isClassInActiveBundle` + +2.5.0 +----- + + * deprecated `Symfony\Component\HttpKernel\DependencyInjection\RegisterListenersPass`, use `Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass` instead + +2.4.0 +----- + + * added event listeners for the session + * added the KernelEvents::FINISH_REQUEST event + +2.3.0 +----- + + * [BC BREAK] renamed `Symfony\Component\HttpKernel\EventListener\DeprecationLoggerListener` to `Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener` and changed its constructor + * deprecated `Symfony\Component\HttpKernel\Debug\ErrorHandler`, `Symfony\Component\HttpKernel\Debug\ExceptionHandler`, + `Symfony\Component\HttpKernel\Exception\FatalErrorException` and `Symfony\Component\HttpKernel\Exception\FlattenException` + * deprecated `Symfony\Component\HttpKernel\Kernel::init()` + * added the possibility to specify an id an extra attributes to hinclude tags + * added the collect of data if a controller is a Closure in the Request collector + * pass exceptions from the ExceptionListener to the logger using the logging context to allow for more + detailed messages + +2.2.0 +----- + + * [BC BREAK] the path info for sub-request is now always _fragment (or whatever you configured instead of the default) + * added Symfony\Component\HttpKernel\EventListener\FragmentListener + * added Symfony\Component\HttpKernel\UriSigner + * added Symfony\Component\HttpKernel\FragmentRenderer and rendering strategies (in Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface) + * added Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel + * added ControllerReference to create reference of Controllers (used in the FragmentRenderer class) + * [BC BREAK] renamed TimeDataCollector::getTotalTime() to + TimeDataCollector::getDuration() + * updated the MemoryDataCollector to include the memory used in the + kernel.terminate event listeners + * moved the Stopwatch classes to a new component + * added TraceableControllerResolver + * added TraceableEventDispatcher (removed ContainerAwareTraceableEventDispatcher) + * added support for WinCache opcode cache in ConfigDataCollector + +2.1.0 +----- + + * [BC BREAK] the charset is now configured via the Kernel::getCharset() method + * [BC BREAK] the current locale for the user is not stored anymore in the session + * added the HTTP method to the profiler storage + * updated all listeners to implement EventSubscriberInterface + * added TimeDataCollector + * added ContainerAwareTraceableEventDispatcher + * moved TraceableEventDispatcherInterface to the EventDispatcher component + * added RouterListener, LocaleListener, and StreamedResponseListener + * added CacheClearerInterface (and ChainCacheClearer) + * added a kernel.terminate event (via TerminableInterface and PostResponseEvent) + * added a Stopwatch class + * added WarmableInterface + * improved extensibility between bundles + * added profiler storages for Memcache(d), File-based, MongoDB, Redis + * moved Filesystem class to its own component diff --git a/vendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php b/vendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php new file mode 100644 index 0000000..270f690 --- /dev/null +++ b/vendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheClearer; + +/** + * CacheClearerInterface. + * + * @author Dustin Dobervich + */ +interface CacheClearerInterface +{ + /** + * Clears any caches necessary. + */ + public function clear(string $cacheDir); +} diff --git a/vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.php b/vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.php new file mode 100644 index 0000000..95d41a8 --- /dev/null +++ b/vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheClearer; + +/** + * ChainCacheClearer. + * + * @author Dustin Dobervich + * + * @final + */ +class ChainCacheClearer implements CacheClearerInterface +{ + private $clearers; + + public function __construct(iterable $clearers = []) + { + $this->clearers = $clearers; + } + + /** + * {@inheritdoc} + */ + public function clear(string $cacheDir) + { + foreach ($this->clearers as $clearer) { + $clearer->clear($cacheDir); + } + } +} diff --git a/vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php b/vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php new file mode 100644 index 0000000..d0e4cc9 --- /dev/null +++ b/vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheClearer; + +/** + * @author Nicolas Grekas + */ +class Psr6CacheClearer implements CacheClearerInterface +{ + private $pools = []; + + public function __construct(array $pools = []) + { + $this->pools = $pools; + } + + public function hasPool(string $name) + { + return isset($this->pools[$name]); + } + + public function getPool(string $name) + { + if (!$this->hasPool($name)) { + throw new \InvalidArgumentException(sprintf('Cache pool not found: "%s".', $name)); + } + + return $this->pools[$name]; + } + + public function clearPool(string $name) + { + if (!isset($this->pools[$name])) { + throw new \InvalidArgumentException(sprintf('Cache pool not found: "%s".', $name)); + } + + return $this->pools[$name]->clear(); + } + + /** + * {@inheritdoc} + */ + public function clear(string $cacheDir) + { + foreach ($this->pools as $pool) { + $pool->clear(); + } + } +} diff --git a/vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php new file mode 100644 index 0000000..aef42d6 --- /dev/null +++ b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheWarmer; + +/** + * Abstract cache warmer that knows how to write a file to the cache. + * + * @author Fabien Potencier + */ +abstract class CacheWarmer implements CacheWarmerInterface +{ + protected function writeCacheFile(string $file, $content) + { + $tmpFile = @tempnam(\dirname($file), basename($file)); + if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) { + @chmod($file, 0666 & ~umask()); + + return; + } + + throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $file)); + } +} diff --git a/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php new file mode 100644 index 0000000..f89b1cd --- /dev/null +++ b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheWarmer; + +/** + * Aggregates several cache warmers into a single one. + * + * @author Fabien Potencier + * + * @final + */ +class CacheWarmerAggregate implements CacheWarmerInterface +{ + private $warmers; + private $debug; + private $deprecationLogsFilepath; + private $optionalsEnabled = false; + private $onlyOptionalsEnabled = false; + + public function __construct(iterable $warmers = [], bool $debug = false, string $deprecationLogsFilepath = null) + { + $this->warmers = $warmers; + $this->debug = $debug; + $this->deprecationLogsFilepath = $deprecationLogsFilepath; + } + + public function enableOptionalWarmers() + { + $this->optionalsEnabled = true; + } + + public function enableOnlyOptionalWarmers() + { + $this->onlyOptionalsEnabled = $this->optionalsEnabled = true; + } + + /** + * Warms up the cache. + * + * @return string[] A list of classes or files to preload on PHP 7.4+ + */ + public function warmUp(string $cacheDir) + { + if ($collectDeprecations = $this->debug && !\defined('PHPUNIT_COMPOSER_INSTALL')) { + $collectedLogs = []; + $previousHandler = set_error_handler(function ($type, $message, $file, $line) use (&$collectedLogs, &$previousHandler) { + if (E_USER_DEPRECATED !== $type && E_DEPRECATED !== $type) { + return $previousHandler ? $previousHandler($type, $message, $file, $line) : false; + } + + if (isset($collectedLogs[$message])) { + ++$collectedLogs[$message]['count']; + + return null; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); + // Clean the trace by removing first frames added by the error handler itself. + for ($i = 0; isset($backtrace[$i]); ++$i) { + if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) { + $backtrace = \array_slice($backtrace, 1 + $i); + break; + } + } + + $collectedLogs[$message] = [ + 'type' => $type, + 'message' => $message, + 'file' => $file, + 'line' => $line, + 'trace' => $backtrace, + 'count' => 1, + ]; + + return null; + }); + } + + $preload = []; + try { + foreach ($this->warmers as $warmer) { + if (!$this->optionalsEnabled && $warmer->isOptional()) { + continue; + } + if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) { + continue; + } + + $preload[] = array_values((array) $warmer->warmUp($cacheDir)); + } + } finally { + if ($collectDeprecations) { + restore_error_handler(); + + if (file_exists($this->deprecationLogsFilepath)) { + $previousLogs = unserialize(file_get_contents($this->deprecationLogsFilepath)); + $collectedLogs = array_merge($previousLogs, $collectedLogs); + } + + file_put_contents($this->deprecationLogsFilepath, serialize(array_values($collectedLogs))); + } + } + + return array_values(array_unique(array_merge([], ...$preload))); + } + + /** + * Checks whether this warmer is optional or not. + * + * @return bool always false + */ + public function isOptional(): bool + { + return false; + } +} diff --git a/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php new file mode 100644 index 0000000..8fece5e --- /dev/null +++ b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheWarmer; + +/** + * Interface for classes able to warm up the cache. + * + * @author Fabien Potencier + */ +interface CacheWarmerInterface extends WarmableInterface +{ + /** + * Checks whether this warmer is optional or not. + * + * Optional warmers can be ignored on certain conditions. + * + * A warmer should return true if the cache can be + * generated incrementally and on-demand. + * + * @return bool true if the warmer is optional, false otherwise + */ + public function isOptional(); +} diff --git a/vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php b/vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php new file mode 100644 index 0000000..2f442cb --- /dev/null +++ b/vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\CacheWarmer; + +/** + * Interface for classes that support warming their cache. + * + * @author Fabien Potencier + */ +interface WarmableInterface +{ + /** + * Warms up the cache. + * + * @return string[] A list of classes or files to preload on PHP 7.4+ + */ + public function warmUp(string $cacheDir); +} diff --git a/vendor/symfony/http-kernel/Config/FileLocator.php b/vendor/symfony/http-kernel/Config/FileLocator.php new file mode 100644 index 0000000..6eca986 --- /dev/null +++ b/vendor/symfony/http-kernel/Config/FileLocator.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Config; + +use Symfony\Component\Config\FileLocator as BaseFileLocator; +use Symfony\Component\HttpKernel\KernelInterface; + +/** + * FileLocator uses the KernelInterface to locate resources in bundles. + * + * @author Fabien Potencier + */ +class FileLocator extends BaseFileLocator +{ + private $kernel; + + public function __construct(KernelInterface $kernel) + { + $this->kernel = $kernel; + + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + public function locate(string $file, string $currentPath = null, bool $first = true) + { + if (isset($file[0]) && '@' === $file[0]) { + $resource = $this->kernel->locateResource($file); + + return $first ? $resource : [$resource]; + } + + return parent::locate($file, $currentPath, $first); + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver.php new file mode 100644 index 0000000..4285ba7 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface; + +/** + * Responsible for resolving the arguments passed to an action. + * + * @author Iltar van der Berg + */ +final class ArgumentResolver implements ArgumentResolverInterface +{ + private $argumentMetadataFactory; + + /** + * @var iterable|ArgumentValueResolverInterface[] + */ + private $argumentValueResolvers; + + public function __construct(ArgumentMetadataFactoryInterface $argumentMetadataFactory = null, iterable $argumentValueResolvers = []) + { + $this->argumentMetadataFactory = $argumentMetadataFactory ?: new ArgumentMetadataFactory(); + $this->argumentValueResolvers = $argumentValueResolvers ?: self::getDefaultArgumentValueResolvers(); + } + + /** + * {@inheritdoc} + */ + public function getArguments(Request $request, callable $controller): array + { + $arguments = []; + + foreach ($this->argumentMetadataFactory->createArgumentMetadata($controller) as $metadata) { + foreach ($this->argumentValueResolvers as $resolver) { + if (!$resolver->supports($request, $metadata)) { + continue; + } + + $resolved = $resolver->resolve($request, $metadata); + + $atLeastOne = false; + foreach ($resolved as $append) { + $atLeastOne = true; + $arguments[] = $append; + } + + if (!$atLeastOne) { + throw new \InvalidArgumentException(sprintf('"%s::resolve()" must yield at least one value.', get_debug_type($resolver))); + } + + // continue to the next controller argument + continue 2; + } + + $representative = $controller; + + if (\is_array($representative)) { + $representative = sprintf('%s::%s()', \get_class($representative[0]), $representative[1]); + } elseif (\is_object($representative)) { + $representative = \get_class($representative); + } + + throw new \RuntimeException(sprintf('Controller "%s" requires that you provide a value for the "$%s" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.', $representative, $metadata->getName())); + } + + return $arguments; + } + + public static function getDefaultArgumentValueResolvers(): iterable + { + return [ + new RequestAttributeValueResolver(), + new RequestValueResolver(), + new SessionValueResolver(), + new DefaultValueResolver(), + new VariadicValueResolver(), + ]; + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php new file mode 100644 index 0000000..32a0e07 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Yields the default value defined in the action signature when no value has been given. + * + * @author Iltar van der Berg + */ +final class DefaultValueResolver implements ArgumentValueResolverInterface +{ + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + return $argument->hasDefaultValue() || (null !== $argument->getType() && $argument->isNullable() && !$argument->isVariadic()); + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + yield $argument->hasDefaultValue() ? $argument->getDefaultValue() : null; + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php new file mode 100644 index 0000000..d4971cc --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Psr\Container\ContainerInterface; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Provides an intuitive error message when controller fails because it is not registered as a service. + * + * @author Simeon Kolev + */ +final class NotTaggedControllerValueResolver implements ArgumentValueResolverInterface +{ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + $controller = $request->attributes->get('_controller'); + + if (\is_array($controller) && \is_callable($controller, true) && \is_string($controller[0])) { + $controller = $controller[0].'::'.$controller[1]; + } elseif (!\is_string($controller) || '' === $controller) { + return false; + } + + if ('\\' === $controller[0]) { + $controller = ltrim($controller, '\\'); + } + + if (!$this->container->has($controller) && false !== $i = strrpos($controller, ':')) { + $controller = substr($controller, 0, $i).strtolower(substr($controller, $i)); + } + + return false === $this->container->has($controller); + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + if (\is_array($controller = $request->attributes->get('_controller'))) { + $controller = $controller[0].'::'.$controller[1]; + } + + if ('\\' === $controller[0]) { + $controller = ltrim($controller, '\\'); + } + + if (!$this->container->has($controller)) { + $i = strrpos($controller, ':'); + $controller = substr($controller, 0, $i).strtolower(substr($controller, $i)); + } + + $what = sprintf('argument $%s of "%s()"', $argument->getName(), $controller); + $message = sprintf('Could not resolve %s, maybe you forgot to register the controller as a service or missed tagging it with the "controller.service_arguments"?', $what); + + throw new RuntimeException($message); + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php new file mode 100644 index 0000000..c62d327 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Yields a non-variadic argument's value from the request attributes. + * + * @author Iltar van der Berg + */ +final class RequestAttributeValueResolver implements ArgumentValueResolverInterface +{ + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + return !$argument->isVariadic() && $request->attributes->has($argument->getName()); + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + yield $request->attributes->get($argument->getName()); + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php new file mode 100644 index 0000000..75cbd97 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Yields the same instance as the request object passed along. + * + * @author Iltar van der Berg + */ +final class RequestValueResolver implements ArgumentValueResolverInterface +{ + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + return Request::class === $argument->getType() || is_subclass_of($argument->getType(), Request::class); + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + yield $request; + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php new file mode 100644 index 0000000..4ffb8c9 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Psr\Container\ContainerInterface; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Yields a service keyed by _controller and argument name. + * + * @author Nicolas Grekas + */ +final class ServiceValueResolver implements ArgumentValueResolverInterface +{ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + $controller = $request->attributes->get('_controller'); + + if (\is_array($controller) && \is_callable($controller, true) && \is_string($controller[0])) { + $controller = $controller[0].'::'.$controller[1]; + } elseif (!\is_string($controller) || '' === $controller) { + return false; + } + + if ('\\' === $controller[0]) { + $controller = ltrim($controller, '\\'); + } + + if (!$this->container->has($controller) && false !== $i = strrpos($controller, ':')) { + $controller = substr($controller, 0, $i).strtolower(substr($controller, $i)); + } + + return $this->container->has($controller) && $this->container->get($controller)->has($argument->getName()); + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + if (\is_array($controller = $request->attributes->get('_controller'))) { + $controller = $controller[0].'::'.$controller[1]; + } + + if ('\\' === $controller[0]) { + $controller = ltrim($controller, '\\'); + } + + if (!$this->container->has($controller)) { + $i = strrpos($controller, ':'); + $controller = substr($controller, 0, $i).strtolower(substr($controller, $i)); + } + + try { + yield $this->container->get($controller)->get($argument->getName()); + } catch (RuntimeException $e) { + $what = sprintf('argument $%s of "%s()"', $argument->getName(), $controller); + $message = preg_replace('/service "\.service_locator\.[^"]++"/', $what, $e->getMessage()); + + if ($e->getMessage() === $message) { + $message = sprintf('Cannot resolve %s: %s', $what, $message); + } + + $r = new \ReflectionProperty($e, 'message'); + $r->setAccessible(true); + $r->setValue($e, $message); + + throw $e; + } + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php new file mode 100644 index 0000000..a1e6b43 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Yields the Session. + * + * @author Iltar van der Berg + */ +final class SessionValueResolver implements ArgumentValueResolverInterface +{ + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + if (!$request->hasSession()) { + return false; + } + + $type = $argument->getType(); + if (SessionInterface::class !== $type && !is_subclass_of($type, SessionInterface::class)) { + return false; + } + + return $request->getSession() instanceof $type; + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + yield $request->getSession(); + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php new file mode 100644 index 0000000..bde3c90 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\Stopwatch\Stopwatch; + +/** + * Provides timing information via the stopwatch. + * + * @author Iltar van der Berg + */ +final class TraceableValueResolver implements ArgumentValueResolverInterface +{ + private $inner; + private $stopwatch; + + public function __construct(ArgumentValueResolverInterface $inner, Stopwatch $stopwatch) + { + $this->inner = $inner; + $this->stopwatch = $stopwatch; + } + + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + $method = \get_class($this->inner).'::'.__FUNCTION__; + $this->stopwatch->start($method, 'controller.argument_value_resolver'); + + $return = $this->inner->supports($request, $argument); + + $this->stopwatch->stop($method); + + return $return; + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + $method = \get_class($this->inner).'::'.__FUNCTION__; + $this->stopwatch->start($method, 'controller.argument_value_resolver'); + + yield from $this->inner->resolve($request, $argument); + + $this->stopwatch->stop($method); + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php new file mode 100644 index 0000000..a8f7e0f --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Yields a variadic argument's values from the request attributes. + * + * @author Iltar van der Berg + */ +final class VariadicValueResolver implements ArgumentValueResolverInterface +{ + /** + * {@inheritdoc} + */ + public function supports(Request $request, ArgumentMetadata $argument): bool + { + return $argument->isVariadic() && $request->attributes->has($argument->getName()); + } + + /** + * {@inheritdoc} + */ + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + $values = $request->attributes->get($argument->getName()); + + if (!\is_array($values)) { + throw new \InvalidArgumentException(sprintf('The action argument "...$%1$s" is required to be an array, the request attribute "%1$s" contains a type of "%2$s" instead.', $argument->getName(), get_debug_type($values))); + } + + yield from $values; + } +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolverInterface.php b/vendor/symfony/http-kernel/Controller/ArgumentResolverInterface.php new file mode 100644 index 0000000..2c32492 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolverInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpFoundation\Request; + +/** + * An ArgumentResolverInterface instance knows how to determine the + * arguments for a specific action. + * + * @author Fabien Potencier + */ +interface ArgumentResolverInterface +{ + /** + * Returns the arguments to pass to the controller. + * + * @return array An array of arguments to pass to the controller + * + * @throws \RuntimeException When no value could be provided for a required argument + */ + public function getArguments(Request $request, callable $controller); +} diff --git a/vendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php b/vendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php new file mode 100644 index 0000000..1317707 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; + +/** + * Responsible for resolving the value of an argument based on its metadata. + * + * @author Iltar van der Berg + */ +interface ArgumentValueResolverInterface +{ + /** + * Whether this resolver can resolve the value for the given ArgumentMetadata. + * + * @return bool + */ + public function supports(Request $request, ArgumentMetadata $argument); + + /** + * Returns the possible value(s). + * + * @return iterable + */ + public function resolve(Request $request, ArgumentMetadata $argument); +} diff --git a/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php b/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php new file mode 100644 index 0000000..3b94684 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Symfony\Component\DependencyInjection\Container; + +/** + * A controller resolver searching for a controller in a psr-11 container when using the "service::method" notation. + * + * @author Fabien Potencier + * @author Maxime Steinhausser + */ +class ContainerControllerResolver extends ControllerResolver +{ + protected $container; + + public function __construct(ContainerInterface $container, LoggerInterface $logger = null) + { + $this->container = $container; + + parent::__construct($logger); + } + + protected function createController(string $controller) + { + if (1 === substr_count($controller, ':')) { + $controller = str_replace(':', '::', $controller); + trigger_deprecation('symfony/http-kernel', '5.1', 'Referencing controllers with a single colon is deprecated. Use "%s" instead.', $controller); + } + + return parent::createController($controller); + } + + /** + * {@inheritdoc} + */ + protected function instantiateController(string $class) + { + $class = ltrim($class, '\\'); + + if ($this->container->has($class)) { + return $this->container->get($class); + } + + try { + return parent::instantiateController($class); + } catch (\Error $e) { + } + + $this->throwExceptionIfControllerWasRemoved($class, $e); + + if ($e instanceof \ArgumentCountError) { + throw new \InvalidArgumentException(sprintf('Controller "%s" has required constructor arguments and does not exist in the container. Did you forget to define the controller as a service?', $class), 0, $e); + } + + throw new \InvalidArgumentException(sprintf('Controller "%s" does neither exist as service nor as class.', $class), 0, $e); + } + + private function throwExceptionIfControllerWasRemoved(string $controller, \Throwable $previous) + { + if ($this->container instanceof Container && isset($this->container->getRemovedIds()[$controller])) { + throw new \InvalidArgumentException(sprintf('Controller "%s" cannot be fetched from the container because it is private. Did you forget to tag the service with "controller.service_arguments"?', $controller), 0, $previous); + } + } +} diff --git a/vendor/symfony/http-kernel/Controller/ControllerReference.php b/vendor/symfony/http-kernel/Controller/ControllerReference.php new file mode 100644 index 0000000..b4fdadd --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ControllerReference.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface; + +/** + * Acts as a marker and a data holder for a Controller. + * + * Some methods in Symfony accept both a URI (as a string) or a controller as + * an argument. In the latter case, instead of passing an array representing + * the controller, you can use an instance of this class. + * + * @author Fabien Potencier + * + * @see FragmentRendererInterface + */ +class ControllerReference +{ + public $controller; + public $attributes = []; + public $query = []; + + /** + * @param string $controller The controller name + * @param array $attributes An array of parameters to add to the Request attributes + * @param array $query An array of parameters to add to the Request query string + */ + public function __construct(string $controller, array $attributes = [], array $query = []) + { + $this->controller = $controller; + $this->attributes = $attributes; + $this->query = $query; + } +} diff --git a/vendor/symfony/http-kernel/Controller/ControllerResolver.php b/vendor/symfony/http-kernel/Controller/ControllerResolver.php new file mode 100644 index 0000000..cffe459 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ControllerResolver.php @@ -0,0 +1,220 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Psr\Log\LoggerInterface; +use Symfony\Component\HttpFoundation\Request; + +/** + * This implementation uses the '_controller' request attribute to determine + * the controller to execute. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class ControllerResolver implements ControllerResolverInterface +{ + private $logger; + + public function __construct(LoggerInterface $logger = null) + { + $this->logger = $logger; + } + + /** + * {@inheritdoc} + */ + public function getController(Request $request) + { + if (!$controller = $request->attributes->get('_controller')) { + if (null !== $this->logger) { + $this->logger->warning('Unable to look for the controller as the "_controller" parameter is missing.'); + } + + return false; + } + + if (\is_array($controller)) { + if (isset($controller[0]) && \is_string($controller[0]) && isset($controller[1])) { + try { + $controller[0] = $this->instantiateController($controller[0]); + } catch (\Error | \LogicException $e) { + try { + // We cannot just check is_callable but have to use reflection because a non-static method + // can still be called statically in PHP but we don't want that. This is deprecated in PHP 7, so we + // could simplify this with PHP 8. + if ((new \ReflectionMethod($controller[0], $controller[1]))->isStatic()) { + return $controller; + } + } catch (\ReflectionException $reflectionException) { + throw $e; + } + + throw $e; + } + } + + if (!\is_callable($controller)) { + throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$this->getControllerError($controller)); + } + + return $controller; + } + + if (\is_object($controller)) { + if (!\is_callable($controller)) { + throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$this->getControllerError($controller)); + } + + return $controller; + } + + if (\function_exists($controller)) { + return $controller; + } + + try { + $callable = $this->createController($controller); + } catch (\InvalidArgumentException $e) { + throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$e->getMessage(), 0, $e); + } + + if (!\is_callable($callable)) { + throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$this->getControllerError($callable)); + } + + return $callable; + } + + /** + * Returns a callable for the given controller. + * + * @return callable A PHP callable + * + * @throws \InvalidArgumentException When the controller cannot be created + */ + protected function createController(string $controller) + { + if (false === strpos($controller, '::')) { + $controller = $this->instantiateController($controller); + + if (!\is_callable($controller)) { + throw new \InvalidArgumentException($this->getControllerError($controller)); + } + + return $controller; + } + + list($class, $method) = explode('::', $controller, 2); + + try { + $controller = [$this->instantiateController($class), $method]; + } catch (\Error | \LogicException $e) { + try { + if ((new \ReflectionMethod($class, $method))->isStatic()) { + return $class.'::'.$method; + } + } catch (\ReflectionException $reflectionException) { + throw $e; + } + + throw $e; + } + + if (!\is_callable($controller)) { + throw new \InvalidArgumentException($this->getControllerError($controller)); + } + + return $controller; + } + + /** + * Returns an instantiated controller. + * + * @return object + */ + protected function instantiateController(string $class) + { + return new $class(); + } + + private function getControllerError($callable): string + { + if (\is_string($callable)) { + if (false !== strpos($callable, '::')) { + $callable = explode('::', $callable, 2); + } else { + return sprintf('Function "%s" does not exist.', $callable); + } + } + + if (\is_object($callable)) { + $availableMethods = $this->getClassMethodsWithoutMagicMethods($callable); + $alternativeMsg = $availableMethods ? sprintf(' or use one of the available methods: "%s"', implode('", "', $availableMethods)) : ''; + + return sprintf('Controller class "%s" cannot be called without a method name. You need to implement "__invoke"%s.', get_debug_type($callable), $alternativeMsg); + } + + if (!\is_array($callable)) { + return sprintf('Invalid type for controller given, expected string, array or object, got "%s".', get_debug_type($callable)); + } + + if (!isset($callable[0]) || !isset($callable[1]) || 2 !== \count($callable)) { + return 'Invalid array callable, expected [controller, method].'; + } + + list($controller, $method) = $callable; + + if (\is_string($controller) && !class_exists($controller)) { + return sprintf('Class "%s" does not exist.', $controller); + } + + $className = \is_object($controller) ? get_debug_type($controller) : $controller; + + if (method_exists($controller, $method)) { + return sprintf('Method "%s" on class "%s" should be public and non-abstract.', $method, $className); + } + + $collection = $this->getClassMethodsWithoutMagicMethods($controller); + + $alternatives = []; + + foreach ($collection as $item) { + $lev = levenshtein($method, $item); + + if ($lev <= \strlen($method) / 3 || false !== strpos($item, $method)) { + $alternatives[] = $item; + } + } + + asort($alternatives); + + $message = sprintf('Expected method "%s" on class "%s"', $method, $className); + + if (\count($alternatives) > 0) { + $message .= sprintf(', did you mean "%s"?', implode('", "', $alternatives)); + } else { + $message .= sprintf('. Available methods: "%s".', implode('", "', $collection)); + } + + return $message; + } + + private function getClassMethodsWithoutMagicMethods($classOrObject): array + { + $methods = get_class_methods($classOrObject); + + return array_filter($methods, function (string $method) { + return 0 !== strncmp($method, '__', 2); + }); + } +} diff --git a/vendor/symfony/http-kernel/Controller/ControllerResolverInterface.php b/vendor/symfony/http-kernel/Controller/ControllerResolverInterface.php new file mode 100644 index 0000000..8b70a88 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ControllerResolverInterface.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpFoundation\Request; + +/** + * A ControllerResolverInterface implementation knows how to determine the + * controller to execute based on a Request object. + * + * A Controller can be any valid PHP callable. + * + * @author Fabien Potencier + */ +interface ControllerResolverInterface +{ + /** + * Returns the Controller instance associated with a Request. + * + * As several resolvers can exist for a single application, a resolver must + * return false when it is not able to determine the controller. + * + * The resolver must only throw an exception when it should be able to load a + * controller but cannot because of some errors made by the developer. + * + * @return callable|false A PHP callable representing the Controller, + * or false if this resolver is not able to determine the controller + * + * @throws \LogicException If a controller was found based on the request but it is not callable + */ + public function getController(Request $request); +} diff --git a/vendor/symfony/http-kernel/Controller/ErrorController.php b/vendor/symfony/http-kernel/Controller/ErrorController.php new file mode 100644 index 0000000..b6c4401 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/ErrorController.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\HttpException; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Renders error or exception pages from a given FlattenException. + * + * @author Yonel Ceruto + * @author Matthias Pigulla + */ +class ErrorController +{ + private $kernel; + private $controller; + private $errorRenderer; + + public function __construct(HttpKernelInterface $kernel, $controller, ErrorRendererInterface $errorRenderer) + { + $this->kernel = $kernel; + $this->controller = $controller; + $this->errorRenderer = $errorRenderer; + } + + public function __invoke(\Throwable $exception): Response + { + $exception = $this->errorRenderer->render($exception); + + return new Response($exception->getAsString(), $exception->getStatusCode(), $exception->getHeaders()); + } + + public function preview(Request $request, int $code): Response + { + /* + * This Request mimics the parameters set by + * \Symfony\Component\HttpKernel\EventListener\ErrorListener::duplicateRequest, with + * the additional "showException" flag. + */ + $subRequest = $request->duplicate(null, null, [ + '_controller' => $this->controller, + 'exception' => new HttpException($code, 'This is a sample exception.'), + 'logger' => null, + 'showException' => false, + ]); + + return $this->kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST); + } +} diff --git a/vendor/symfony/http-kernel/Controller/TraceableArgumentResolver.php b/vendor/symfony/http-kernel/Controller/TraceableArgumentResolver.php new file mode 100644 index 0000000..e22cf08 --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/TraceableArgumentResolver.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Stopwatch\Stopwatch; + +/** + * @author Fabien Potencier + */ +class TraceableArgumentResolver implements ArgumentResolverInterface +{ + private $resolver; + private $stopwatch; + + public function __construct(ArgumentResolverInterface $resolver, Stopwatch $stopwatch) + { + $this->resolver = $resolver; + $this->stopwatch = $stopwatch; + } + + /** + * {@inheritdoc} + */ + public function getArguments(Request $request, callable $controller) + { + $e = $this->stopwatch->start('controller.get_arguments'); + + $ret = $this->resolver->getArguments($request, $controller); + + $e->stop(); + + return $ret; + } +} diff --git a/vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php b/vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php new file mode 100644 index 0000000..bf6b6aa --- /dev/null +++ b/vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Controller; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Stopwatch\Stopwatch; + +/** + * @author Fabien Potencier + */ +class TraceableControllerResolver implements ControllerResolverInterface +{ + private $resolver; + private $stopwatch; + + public function __construct(ControllerResolverInterface $resolver, Stopwatch $stopwatch) + { + $this->resolver = $resolver; + $this->stopwatch = $stopwatch; + } + + /** + * {@inheritdoc} + */ + public function getController(Request $request) + { + $e = $this->stopwatch->start('controller.get_callable'); + + $ret = $this->resolver->getController($request); + + $e->stop(); + + return $ret; + } +} diff --git a/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php b/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php new file mode 100644 index 0000000..6fc7e70 --- /dev/null +++ b/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\ControllerMetadata; + +/** + * Responsible for storing metadata of an argument. + * + * @author Iltar van der Berg + */ +class ArgumentMetadata +{ + private $name; + private $type; + private $isVariadic; + private $hasDefaultValue; + private $defaultValue; + private $isNullable; + + public function __construct(string $name, ?string $type, bool $isVariadic, bool $hasDefaultValue, $defaultValue, bool $isNullable = false) + { + $this->name = $name; + $this->type = $type; + $this->isVariadic = $isVariadic; + $this->hasDefaultValue = $hasDefaultValue; + $this->defaultValue = $defaultValue; + $this->isNullable = $isNullable || null === $type || ($hasDefaultValue && null === $defaultValue); + } + + /** + * Returns the name as given in PHP, $foo would yield "foo". + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Returns the type of the argument. + * + * The type is the PHP class in 5.5+ and additionally the basic type in PHP 7.0+. + * + * @return string|null + */ + public function getType() + { + return $this->type; + } + + /** + * Returns whether the argument is defined as "...$variadic". + * + * @return bool + */ + public function isVariadic() + { + return $this->isVariadic; + } + + /** + * Returns whether the argument has a default value. + * + * Implies whether an argument is optional. + * + * @return bool + */ + public function hasDefaultValue() + { + return $this->hasDefaultValue; + } + + /** + * Returns whether the argument accepts null values. + * + * @return bool + */ + public function isNullable() + { + return $this->isNullable; + } + + /** + * Returns the default value of the argument. + * + * @throws \LogicException if no default value is present; {@see self::hasDefaultValue()} + * + * @return mixed + */ + public function getDefaultValue() + { + if (!$this->hasDefaultValue) { + throw new \LogicException(sprintf('Argument $%s does not have a default value. Use "%s::hasDefaultValue()" to avoid this exception.', $this->name, __CLASS__)); + } + + return $this->defaultValue; + } +} diff --git a/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php b/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php new file mode 100644 index 0000000..05a6822 --- /dev/null +++ b/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\ControllerMetadata; + +/** + * Builds {@see ArgumentMetadata} objects based on the given Controller. + * + * @author Iltar van der Berg + */ +final class ArgumentMetadataFactory implements ArgumentMetadataFactoryInterface +{ + /** + * {@inheritdoc} + */ + public function createArgumentMetadata($controller): array + { + $arguments = []; + + if (\is_array($controller)) { + $reflection = new \ReflectionMethod($controller[0], $controller[1]); + } elseif (\is_object($controller) && !$controller instanceof \Closure) { + $reflection = (new \ReflectionObject($controller))->getMethod('__invoke'); + } else { + $reflection = new \ReflectionFunction($controller); + } + + foreach ($reflection->getParameters() as $param) { + $arguments[] = new ArgumentMetadata($param->getName(), $this->getType($param, $reflection), $param->isVariadic(), $param->isDefaultValueAvailable(), $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null, $param->allowsNull()); + } + + return $arguments; + } + + /** + * Returns an associated type to the given parameter if available. + */ + private function getType(\ReflectionParameter $parameter, \ReflectionFunctionAbstract $function): ?string + { + if (!$type = $parameter->getType()) { + return null; + } + $name = $type instanceof \ReflectionNamedType ? $type->getName() : (string) $type; + + if ($function instanceof \ReflectionMethod) { + $lcName = strtolower($name); + switch ($lcName) { + case 'self': + return $function->getDeclaringClass()->name; + case 'parent': + return ($parent = $function->getDeclaringClass()->getParentClass()) ? $parent->name : null; + } + } + + return $name; + } +} diff --git a/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php b/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php new file mode 100644 index 0000000..6ea179d --- /dev/null +++ b/vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\ControllerMetadata; + +/** + * Builds method argument data. + * + * @author Iltar van der Berg + */ +interface ArgumentMetadataFactoryInterface +{ + /** + * @param mixed $controller The controller to resolve the arguments for + * + * @return ArgumentMetadata[] + */ + public function createArgumentMetadata($controller); +} diff --git a/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php b/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php new file mode 100644 index 0000000..7b38ed5 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * AjaxDataCollector. + * + * @author Bart van den Burg + * + * @final + */ +class AjaxDataCollector extends DataCollector +{ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + // all collecting is done client side + } + + public function reset() + { + // all collecting is done client side + } + + public function getName() + { + return 'ajax'; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php b/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php new file mode 100644 index 0000000..0632f92 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php @@ -0,0 +1,306 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\HttpKernel\KernelInterface; +use Symfony\Component\VarDumper\Caster\ClassStub; + +/** + * @author Fabien Potencier + * + * @final + */ +class ConfigDataCollector extends DataCollector implements LateDataCollectorInterface +{ + /** + * @var KernelInterface + */ + private $kernel; + + /** + * Sets the Kernel associated with this Request. + */ + public function setKernel(KernelInterface $kernel = null) + { + $this->kernel = $kernel; + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->data = [ + 'token' => $response->headers->get('X-Debug-Token'), + 'symfony_version' => Kernel::VERSION, + 'symfony_state' => 'unknown', + 'env' => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a', + 'debug' => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a', + 'php_version' => PHP_VERSION, + 'php_architecture' => \PHP_INT_SIZE * 8, + 'php_intl_locale' => class_exists('Locale', false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a', + 'php_timezone' => date_default_timezone_get(), + 'xdebug_enabled' => \extension_loaded('xdebug'), + 'apcu_enabled' => \extension_loaded('apcu') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN), + 'zend_opcache_enabled' => \extension_loaded('Zend OPcache') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN), + 'bundles' => [], + 'sapi_name' => \PHP_SAPI, + ]; + + if (isset($this->kernel)) { + foreach ($this->kernel->getBundles() as $name => $bundle) { + $this->data['bundles'][$name] = new ClassStub(\get_class($bundle)); + } + + $this->data['symfony_state'] = $this->determineSymfonyState(); + $this->data['symfony_minor_version'] = sprintf('%s.%s', Kernel::MAJOR_VERSION, Kernel::MINOR_VERSION); + $this->data['symfony_lts'] = 4 === Kernel::MINOR_VERSION; + $eom = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE); + $eol = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE); + $this->data['symfony_eom'] = $eom->format('F Y'); + $this->data['symfony_eol'] = $eol->format('F Y'); + } + + if (preg_match('~^(\d+(?:\.\d+)*)(.+)?$~', $this->data['php_version'], $matches) && isset($matches[2])) { + $this->data['php_version'] = $matches[1]; + $this->data['php_version_extra'] = $matches[2]; + } + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = []; + } + + public function lateCollect() + { + $this->data = $this->cloneVar($this->data); + } + + /** + * Gets the token. + * + * @return string|null The token + */ + public function getToken() + { + return $this->data['token']; + } + + /** + * Gets the Symfony version. + * + * @return string The Symfony version + */ + public function getSymfonyVersion() + { + return $this->data['symfony_version']; + } + + /** + * Returns the state of the current Symfony release. + * + * @return string One of: unknown, dev, stable, eom, eol + */ + public function getSymfonyState() + { + return $this->data['symfony_state']; + } + + /** + * Returns the minor Symfony version used (without patch numbers of extra + * suffix like "RC", "beta", etc.). + * + * @return string + */ + public function getSymfonyMinorVersion() + { + return $this->data['symfony_minor_version']; + } + + /** + * Returns if the current Symfony version is a Long-Term Support one. + */ + public function isSymfonyLts(): bool + { + return $this->data['symfony_lts']; + } + + /** + * Returns the human redable date when this Symfony version ends its + * maintenance period. + * + * @return string + */ + public function getSymfonyEom() + { + return $this->data['symfony_eom']; + } + + /** + * Returns the human redable date when this Symfony version reaches its + * "end of life" and won't receive bugs or security fixes. + * + * @return string + */ + public function getSymfonyEol() + { + return $this->data['symfony_eol']; + } + + /** + * Gets the PHP version. + * + * @return string The PHP version + */ + public function getPhpVersion() + { + return $this->data['php_version']; + } + + /** + * Gets the PHP version extra part. + * + * @return string|null The extra part + */ + public function getPhpVersionExtra() + { + return isset($this->data['php_version_extra']) ? $this->data['php_version_extra'] : null; + } + + /** + * @return int The PHP architecture as number of bits (e.g. 32 or 64) + */ + public function getPhpArchitecture() + { + return $this->data['php_architecture']; + } + + /** + * @return string + */ + public function getPhpIntlLocale() + { + return $this->data['php_intl_locale']; + } + + /** + * @return string + */ + public function getPhpTimezone() + { + return $this->data['php_timezone']; + } + + /** + * Gets the environment. + * + * @return string The environment + */ + public function getEnv() + { + return $this->data['env']; + } + + /** + * Returns true if the debug is enabled. + * + * @return bool true if debug is enabled, false otherwise + */ + public function isDebug() + { + return $this->data['debug']; + } + + /** + * Returns true if the XDebug is enabled. + * + * @return bool true if XDebug is enabled, false otherwise + */ + public function hasXDebug() + { + return $this->data['xdebug_enabled']; + } + + /** + * Returns true if APCu is enabled. + * + * @return bool true if APCu is enabled, false otherwise + */ + public function hasApcu() + { + return $this->data['apcu_enabled']; + } + + /** + * Returns true if Zend OPcache is enabled. + * + * @return bool true if Zend OPcache is enabled, false otherwise + */ + public function hasZendOpcache() + { + return $this->data['zend_opcache_enabled']; + } + + public function getBundles() + { + return $this->data['bundles']; + } + + /** + * Gets the PHP SAPI name. + * + * @return string The environment + */ + public function getSapiName() + { + return $this->data['sapi_name']; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'config'; + } + + /** + * Tries to retrieve information about the current Symfony version. + * + * @return string One of: dev, stable, eom, eol + */ + private function determineSymfonyState(): string + { + $now = new \DateTime(); + $eom = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->modify('last day of this month'); + $eol = \DateTime::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->modify('last day of this month'); + + if ($now > $eol) { + $versionState = 'eol'; + } elseif ($now > $eom) { + $versionState = 'eom'; + } elseif ('' !== Kernel::EXTRA_VERSION) { + $versionState = 'dev'; + } else { + $versionState = 'stable'; + } + + return $versionState; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/DataCollector.php b/vendor/symfony/http-kernel/DataCollector/DataCollector.php new file mode 100644 index 0000000..ccaf66d --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/DataCollector.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\VarDumper\Caster\CutStub; +use Symfony\Component\VarDumper\Caster\ReflectionCaster; +use Symfony\Component\VarDumper\Cloner\ClonerInterface; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarDumper\Cloner\VarCloner; + +/** + * DataCollector. + * + * Children of this class must store the collected data in the data property. + * + * @author Fabien Potencier + * @author Bernhard Schussek + */ +abstract class DataCollector implements DataCollectorInterface +{ + /** + * @var array|Data + */ + protected $data = []; + + /** + * @var ClonerInterface + */ + private $cloner; + + /** + * Converts the variable into a serializable Data instance. + * + * This array can be displayed in the template using + * the VarDumper component. + * + * @param mixed $var + * + * @return Data + */ + protected function cloneVar($var) + { + if ($var instanceof Data) { + return $var; + } + if (null === $this->cloner) { + $this->cloner = new VarCloner(); + $this->cloner->setMaxItems(-1); + $this->cloner->addCasters($this->getCasters()); + } + + return $this->cloner->cloneVar($var); + } + + /** + * @return callable[] The casters to add to the cloner + */ + protected function getCasters() + { + $casters = [ + '*' => function ($v, array $a, Stub $s, $isNested) { + if (!$v instanceof Stub) { + foreach ($a as $k => $v) { + if (\is_object($v) && !$v instanceof \DateTimeInterface && !$v instanceof Stub) { + $a[$k] = new CutStub($v); + } + } + } + + return $a; + }, + ] + ReflectionCaster::UNSET_CLOSURE_FILE_INFO; + + return $casters; + } + + /** + * @return array + */ + public function __sleep() + { + return ['data']; + } + + public function __wakeup() + { + } + + /** + * @internal to prevent implementing \Serializable + */ + final protected function serialize() + { + } + + /** + * @internal to prevent implementing \Serializable + */ + final protected function unserialize($data) + { + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php b/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php new file mode 100644 index 0000000..30ab7cc --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Service\ResetInterface; + +/** + * DataCollectorInterface. + * + * @author Fabien Potencier + */ +interface DataCollectorInterface extends ResetInterface +{ + /** + * Collects data for the given Request and Response. + */ + public function collect(Request $request, Response $response, \Throwable $exception = null); + + /** + * Returns the name of the collector. + * + * @return string The collector name + */ + public function getName(); +} diff --git a/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php b/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php new file mode 100644 index 0000000..ba45a2d --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php @@ -0,0 +1,284 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; +use Symfony\Component\VarDumper\Dumper\DataDumperInterface; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Server\Connection; + +/** + * @author Nicolas Grekas + * + * @final + */ +class DumpDataCollector extends DataCollector implements DataDumperInterface +{ + private $stopwatch; + private $fileLinkFormat; + private $dataCount = 0; + private $isCollected = true; + private $clonesCount = 0; + private $clonesIndex = 0; + private $rootRefs; + private $charset; + private $requestStack; + private $dumper; + private $sourceContextProvider; + + /** + * @param DataDumperInterface|Connection|null $dumper + */ + public function __construct(Stopwatch $stopwatch = null, $fileLinkFormat = null, string $charset = null, RequestStack $requestStack = null, $dumper = null) + { + $this->stopwatch = $stopwatch; + $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); + $this->charset = $charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8'; + $this->requestStack = $requestStack; + $this->dumper = $dumper; + + // All clones share these properties by reference: + $this->rootRefs = [ + &$this->data, + &$this->dataCount, + &$this->isCollected, + &$this->clonesCount, + ]; + + $this->sourceContextProvider = $dumper instanceof Connection && isset($dumper->getContextProviders()['source']) ? $dumper->getContextProviders()['source'] : new SourceContextProvider($this->charset); + } + + public function __clone() + { + $this->clonesIndex = ++$this->clonesCount; + } + + public function dump(Data $data) + { + if ($this->stopwatch) { + $this->stopwatch->start('dump'); + } + + list('name' => $name, 'file' => $file, 'line' => $line, 'file_excerpt' => $fileExcerpt) = $this->sourceContextProvider->getContext(); + + if ($this->dumper instanceof Connection) { + if (!$this->dumper->write($data)) { + $this->isCollected = false; + } + } elseif ($this->dumper) { + $this->doDump($this->dumper, $data, $name, $file, $line); + } else { + $this->isCollected = false; + } + + if (!$this->dataCount) { + $this->data = []; + } + $this->data[] = compact('data', 'name', 'file', 'line', 'fileExcerpt'); + ++$this->dataCount; + + if ($this->stopwatch) { + $this->stopwatch->stop('dump'); + } + } + + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + if (!$this->dataCount) { + $this->data = []; + } + + // Sub-requests and programmatic calls stay in the collected profile. + if ($this->dumper || ($this->requestStack && $this->requestStack->getMasterRequest() !== $request) || $request->isXmlHttpRequest() || $request->headers->has('Origin')) { + return; + } + + // In all other conditions that remove the web debug toolbar, dumps are written on the output. + if (!$this->requestStack + || !$response->headers->has('X-Debug-Token') + || $response->isRedirection() + || ($response->headers->has('Content-Type') && false === strpos($response->headers->get('Content-Type'), 'html')) + || 'html' !== $request->getRequestFormat() + || false === strripos($response->getContent(), '') + ) { + if ($response->headers->has('Content-Type') && false !== strpos($response->headers->get('Content-Type'), 'html')) { + $dumper = new HtmlDumper('php://output', $this->charset); + $dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]); + } else { + $dumper = new CliDumper('php://output', $this->charset); + if (method_exists($dumper, 'setDisplayOptions')) { + $dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]); + } + } + + foreach ($this->data as $dump) { + $this->doDump($dumper, $dump['data'], $dump['name'], $dump['file'], $dump['line']); + } + } + } + + public function reset() + { + if ($this->stopwatch) { + $this->stopwatch->reset(); + } + $this->data = []; + $this->dataCount = 0; + $this->isCollected = true; + $this->clonesCount = 0; + $this->clonesIndex = 0; + } + + /** + * @internal + */ + public function __sleep(): array + { + if (!$this->dataCount) { + $this->data = []; + } + + if ($this->clonesCount !== $this->clonesIndex) { + return []; + } + + $this->data[] = $this->fileLinkFormat; + $this->data[] = $this->charset; + $this->dataCount = 0; + $this->isCollected = true; + + return parent::__sleep(); + } + + /** + * @internal + */ + public function __wakeup() + { + parent::__wakeup(); + + $charset = array_pop($this->data); + $fileLinkFormat = array_pop($this->data); + $this->dataCount = \count($this->data); + + self::__construct($this->stopwatch, $fileLinkFormat, $charset); + } + + public function getDumpsCount(): int + { + return $this->dataCount; + } + + public function getDumps($format, $maxDepthLimit = -1, $maxItemsPerDepth = -1): array + { + $data = fopen('php://memory', 'r+b'); + + if ('html' === $format) { + $dumper = new HtmlDumper($data, $this->charset); + $dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]); + } else { + throw new \InvalidArgumentException(sprintf('Invalid dump format: "%s".', $format)); + } + $dumps = []; + + if (!$this->dataCount) { + return $this->data = []; + } + + foreach ($this->data as $dump) { + $dumper->dump($dump['data']->withMaxDepth($maxDepthLimit)->withMaxItemsPerDepth($maxItemsPerDepth)); + $dump['data'] = stream_get_contents($data, -1, 0); + ftruncate($data, 0); + rewind($data); + $dumps[] = $dump; + } + + return $dumps; + } + + public function getName(): string + { + return 'dump'; + } + + public function __destruct() + { + if (0 === $this->clonesCount-- && !$this->isCollected && $this->dataCount) { + $this->clonesCount = 0; + $this->isCollected = true; + + $h = headers_list(); + $i = \count($h); + array_unshift($h, 'Content-Type: '.ini_get('default_mimetype')); + while (0 !== stripos($h[$i], 'Content-Type:')) { + --$i; + } + + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && stripos($h[$i], 'html')) { + $dumper = new HtmlDumper('php://output', $this->charset); + $dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]); + } else { + $dumper = new CliDumper('php://output', $this->charset); + if (method_exists($dumper, 'setDisplayOptions')) { + $dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]); + } + } + + foreach ($this->data as $i => $dump) { + $this->data[$i] = null; + $this->doDump($dumper, $dump['data'], $dump['name'], $dump['file'], $dump['line']); + } + + $this->data = []; + $this->dataCount = 0; + } + } + + private function doDump(DataDumperInterface $dumper, $data, string $name, string $file, int $line) + { + if ($dumper instanceof CliDumper) { + $contextDumper = function ($name, $file, $line, $fmt) { + if ($this instanceof HtmlDumper) { + if ($file) { + $s = $this->style('meta', '%s'); + $f = strip_tags($this->style('', $file)); + $name = strip_tags($this->style('', $name)); + if ($fmt && $link = \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line)) { + $name = sprintf(''.$s.'', strip_tags($this->style('', $link)), $f, $name); + } else { + $name = sprintf(''.$s.'', $f, $name); + } + } else { + $name = $this->style('meta', $name); + } + $this->line = $name.' on line '.$this->style('meta', $line).':'; + } else { + $this->line = $this->style('meta', $name).' on line '.$this->style('meta', $line).':'; + } + $this->dumpLine(0); + }; + $contextDumper = $contextDumper->bindTo($dumper, $dumper); + $contextDumper($name, $file, $line, $this->fileLinkFormat); + } else { + $cloner = new VarCloner(); + $dumper->dump($cloner->cloneVar($name.' on line '.$line.':')); + } + $dumper->dump($data); + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php b/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php new file mode 100644 index 0000000..27930fe --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php @@ -0,0 +1,150 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use Symfony\Contracts\Service\ResetInterface; + +/** + * EventDataCollector. + * + * @author Fabien Potencier + * + * @final + */ +class EventDataCollector extends DataCollector implements LateDataCollectorInterface +{ + protected $dispatcher; + private $requestStack; + private $currentRequest; + + public function __construct(EventDispatcherInterface $dispatcher = null, RequestStack $requestStack = null) + { + $this->dispatcher = $dispatcher; + $this->requestStack = $requestStack; + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->currentRequest = $this->requestStack && $this->requestStack->getMasterRequest() !== $request ? $request : null; + $this->data = [ + 'called_listeners' => [], + 'not_called_listeners' => [], + 'orphaned_events' => [], + ]; + } + + public function reset() + { + $this->data = []; + + if ($this->dispatcher instanceof ResetInterface) { + $this->dispatcher->reset(); + } + } + + public function lateCollect() + { + if ($this->dispatcher instanceof TraceableEventDispatcher) { + $this->setCalledListeners($this->dispatcher->getCalledListeners($this->currentRequest)); + $this->setNotCalledListeners($this->dispatcher->getNotCalledListeners($this->currentRequest)); + $this->setOrphanedEvents($this->dispatcher->getOrphanedEvents($this->currentRequest)); + } + + $this->data = $this->cloneVar($this->data); + } + + /** + * Sets the called listeners. + * + * @param array $listeners An array of called listeners + * + * @see TraceableEventDispatcher + */ + public function setCalledListeners(array $listeners) + { + $this->data['called_listeners'] = $listeners; + } + + /** + * Gets the called listeners. + * + * @return array An array of called listeners + * + * @see TraceableEventDispatcher + */ + public function getCalledListeners() + { + return $this->data['called_listeners']; + } + + /** + * Sets the not called listeners. + * + * @see TraceableEventDispatcher + */ + public function setNotCalledListeners(array $listeners) + { + $this->data['not_called_listeners'] = $listeners; + } + + /** + * Gets the not called listeners. + * + * @return array + * + * @see TraceableEventDispatcher + */ + public function getNotCalledListeners() + { + return $this->data['not_called_listeners']; + } + + /** + * Sets the orphaned events. + * + * @param array $events An array of orphaned events + * + * @see TraceableEventDispatcher + */ + public function setOrphanedEvents(array $events) + { + $this->data['orphaned_events'] = $events; + } + + /** + * Gets the orphaned events. + * + * @return array An array of orphaned events + * + * @see TraceableEventDispatcher + */ + public function getOrphanedEvents() + { + return $this->data['orphaned_events']; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'events'; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.php b/vendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.php new file mode 100644 index 0000000..5ff13f7 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.php @@ -0,0 +1,114 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * ExceptionDataCollector. + * + * @author Fabien Potencier + * + * @final + */ +class ExceptionDataCollector extends DataCollector +{ + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + if (null !== $exception) { + $this->data = [ + 'exception' => FlattenException::createFromThrowable($exception), + ]; + } + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = []; + } + + /** + * Checks if the exception is not null. + * + * @return bool true if the exception is not null, false otherwise + */ + public function hasException() + { + return isset($this->data['exception']); + } + + /** + * Gets the exception. + * + * @return \Exception|FlattenException + */ + public function getException() + { + return $this->data['exception']; + } + + /** + * Gets the exception message. + * + * @return string The exception message + */ + public function getMessage() + { + return $this->data['exception']->getMessage(); + } + + /** + * Gets the exception code. + * + * @return int The exception code + */ + public function getCode() + { + return $this->data['exception']->getCode(); + } + + /** + * Gets the status code. + * + * @return int The status code + */ + public function getStatusCode() + { + return $this->data['exception']->getStatusCode(); + } + + /** + * Gets the exception trace. + * + * @return array The exception trace + */ + public function getTrace() + { + return $this->data['exception']->getTrace(); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'exception'; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php b/vendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php new file mode 100644 index 0000000..012332d --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +/** + * LateDataCollectorInterface. + * + * @author Fabien Potencier + */ +interface LateDataCollectorInterface +{ + /** + * Collects data as late as possible. + */ + public function lateCollect(); +} diff --git a/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php new file mode 100644 index 0000000..34c6dc4 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php @@ -0,0 +1,282 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; + +/** + * LogDataCollector. + * + * @author Fabien Potencier + * + * @final + */ +class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface +{ + private $logger; + private $containerPathPrefix; + private $currentRequest; + private $requestStack; + + public function __construct($logger = null, string $containerPathPrefix = null, RequestStack $requestStack = null) + { + if (null !== $logger && $logger instanceof DebugLoggerInterface) { + $this->logger = $logger; + } + + $this->containerPathPrefix = $containerPathPrefix; + $this->requestStack = $requestStack; + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->currentRequest = $this->requestStack && $this->requestStack->getMasterRequest() !== $request ? $request : null; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + if ($this->logger instanceof DebugLoggerInterface) { + $this->logger->clear(); + } + $this->data = []; + } + + /** + * {@inheritdoc} + */ + public function lateCollect() + { + if (null !== $this->logger) { + $containerDeprecationLogs = $this->getContainerDeprecationLogs(); + $this->data = $this->computeErrorsCount($containerDeprecationLogs); + // get compiler logs later (only when they are needed) to improve performance + $this->data['compiler_logs'] = []; + $this->data['compiler_logs_filepath'] = $this->containerPathPrefix.'Compiler.log'; + $this->data['logs'] = $this->sanitizeLogs(array_merge($this->logger->getLogs($this->currentRequest), $containerDeprecationLogs)); + $this->data = $this->cloneVar($this->data); + } + $this->currentRequest = null; + } + + public function getLogs() + { + return isset($this->data['logs']) ? $this->data['logs'] : []; + } + + public function getPriorities() + { + return isset($this->data['priorities']) ? $this->data['priorities'] : []; + } + + public function countErrors() + { + return isset($this->data['error_count']) ? $this->data['error_count'] : 0; + } + + public function countDeprecations() + { + return isset($this->data['deprecation_count']) ? $this->data['deprecation_count'] : 0; + } + + public function countWarnings() + { + return isset($this->data['warning_count']) ? $this->data['warning_count'] : 0; + } + + public function countScreams() + { + return isset($this->data['scream_count']) ? $this->data['scream_count'] : 0; + } + + public function getCompilerLogs() + { + return $this->cloneVar($this->getContainerCompilerLogs($this->data['compiler_logs_filepath'] ?? null)); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'logger'; + } + + private function getContainerDeprecationLogs(): array + { + if (null === $this->containerPathPrefix || !file_exists($file = $this->containerPathPrefix.'Deprecations.log')) { + return []; + } + + if ('' === $logContent = trim(file_get_contents($file))) { + return []; + } + + $bootTime = filemtime($file); + $logs = []; + foreach (unserialize($logContent) as $log) { + $log['context'] = ['exception' => new SilencedErrorContext($log['type'], $log['file'], $log['line'], $log['trace'], $log['count'])]; + $log['timestamp'] = $bootTime; + $log['priority'] = 100; + $log['priorityName'] = 'DEBUG'; + $log['channel'] = null; + $log['scream'] = false; + unset($log['type'], $log['file'], $log['line'], $log['trace'], $log['trace'], $log['count']); + $logs[] = $log; + } + + return $logs; + } + + private function getContainerCompilerLogs(string $compilerLogsFilepath = null): array + { + if (!file_exists($compilerLogsFilepath)) { + return []; + } + + $logs = []; + foreach (file($compilerLogsFilepath, FILE_IGNORE_NEW_LINES) as $log) { + $log = explode(': ', $log, 2); + if (!isset($log[1]) || !preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $log[0])) { + $log = ['Unknown Compiler Pass', implode(': ', $log)]; + } + + $logs[$log[0]][] = ['message' => $log[1]]; + } + + return $logs; + } + + private function sanitizeLogs(array $logs) + { + $sanitizedLogs = []; + $silencedLogs = []; + + foreach ($logs as $log) { + if (!$this->isSilencedOrDeprecationErrorLog($log)) { + $sanitizedLogs[] = $log; + + continue; + } + + $message = '_'.$log['message']; + $exception = $log['context']['exception']; + + if ($exception instanceof SilencedErrorContext) { + if (isset($silencedLogs[$h = spl_object_hash($exception)])) { + continue; + } + $silencedLogs[$h] = true; + + if (!isset($sanitizedLogs[$message])) { + $sanitizedLogs[$message] = $log + [ + 'errorCount' => 0, + 'scream' => true, + ]; + } + $sanitizedLogs[$message]['errorCount'] += $exception->count; + + continue; + } + + $errorId = md5("{$exception->getSeverity()}/{$exception->getLine()}/{$exception->getFile()}\0{$message}", true); + + if (isset($sanitizedLogs[$errorId])) { + ++$sanitizedLogs[$errorId]['errorCount']; + } else { + $log += [ + 'errorCount' => 1, + 'scream' => false, + ]; + + $sanitizedLogs[$errorId] = $log; + } + } + + return array_values($sanitizedLogs); + } + + private function isSilencedOrDeprecationErrorLog(array $log): bool + { + if (!isset($log['context']['exception'])) { + return false; + } + + $exception = $log['context']['exception']; + + if ($exception instanceof SilencedErrorContext) { + return true; + } + + if ($exception instanceof \ErrorException && \in_array($exception->getSeverity(), [E_DEPRECATED, E_USER_DEPRECATED], true)) { + return true; + } + + return false; + } + + private function computeErrorsCount(array $containerDeprecationLogs): array + { + $silencedLogs = []; + $count = [ + 'error_count' => $this->logger->countErrors($this->currentRequest), + 'deprecation_count' => 0, + 'warning_count' => 0, + 'scream_count' => 0, + 'priorities' => [], + ]; + + foreach ($this->logger->getLogs($this->currentRequest) as $log) { + if (isset($count['priorities'][$log['priority']])) { + ++$count['priorities'][$log['priority']]['count']; + } else { + $count['priorities'][$log['priority']] = [ + 'count' => 1, + 'name' => $log['priorityName'], + ]; + } + if ('WARNING' === $log['priorityName']) { + ++$count['warning_count']; + } + + if ($this->isSilencedOrDeprecationErrorLog($log)) { + $exception = $log['context']['exception']; + if ($exception instanceof SilencedErrorContext) { + if (isset($silencedLogs[$h = spl_object_hash($exception)])) { + continue; + } + $silencedLogs[$h] = true; + $count['scream_count'] += $exception->count; + } else { + ++$count['deprecation_count']; + } + } + } + + foreach ($containerDeprecationLogs as $deprecationLog) { + $count['deprecation_count'] += $deprecationLog['context']['exception']->count; + } + + ksort($count['priorities']); + + return $count; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php b/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php new file mode 100644 index 0000000..3730212 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * MemoryDataCollector. + * + * @author Fabien Potencier + * + * @final + */ +class MemoryDataCollector extends DataCollector implements LateDataCollectorInterface +{ + public function __construct() + { + $this->reset(); + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->updateMemoryUsage(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = [ + 'memory' => 0, + 'memory_limit' => $this->convertToBytes(ini_get('memory_limit')), + ]; + } + + /** + * {@inheritdoc} + */ + public function lateCollect() + { + $this->updateMemoryUsage(); + } + + /** + * Gets the memory. + * + * @return int The memory + */ + public function getMemory() + { + return $this->data['memory']; + } + + /** + * Gets the PHP memory limit. + * + * @return int The memory limit + */ + public function getMemoryLimit() + { + return $this->data['memory_limit']; + } + + /** + * Updates the memory usage data. + */ + public function updateMemoryUsage() + { + $this->data['memory'] = memory_get_peak_usage(true); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'memory'; + } + + /** + * @return int|float + */ + private function convertToBytes(string $memoryLimit) + { + if ('-1' === $memoryLimit) { + return -1; + } + + $memoryLimit = strtolower($memoryLimit); + $max = strtolower(ltrim($memoryLimit, '+')); + if (0 === strpos($max, '0x')) { + $max = \intval($max, 16); + } elseif (0 === strpos($max, '0')) { + $max = \intval($max, 8); + } else { + $max = (int) $max; + } + + switch (substr($memoryLimit, -1)) { + case 't': $max *= 1024; + // no break + case 'g': $max *= 1024; + // no break + case 'm': $max *= 1024; + // no break + case 'k': $max *= 1024; + } + + return $max; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php b/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php new file mode 100644 index 0000000..b92518d --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php @@ -0,0 +1,458 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\ParameterBag; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Event\ControllerEvent; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * @author Fabien Potencier + * + * @final + */ +class RequestDataCollector extends DataCollector implements EventSubscriberInterface, LateDataCollectorInterface +{ + protected $controllers; + + public function __construct() + { + $this->controllers = new \SplObjectStorage(); + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + // attributes are serialized and as they can be anything, they need to be converted to strings. + $attributes = []; + $route = ''; + foreach ($request->attributes->all() as $key => $value) { + if ('_route' === $key) { + $route = \is_object($value) ? $value->getPath() : $value; + $attributes[$key] = $route; + } else { + $attributes[$key] = $value; + } + } + + try { + $content = $request->getContent(); + } catch (\LogicException $e) { + // the user already got the request content as a resource + $content = false; + } + + $sessionMetadata = []; + $sessionAttributes = []; + $flashes = []; + if ($request->hasSession()) { + $session = $request->getSession(); + if ($session->isStarted()) { + $sessionMetadata['Created'] = date(DATE_RFC822, $session->getMetadataBag()->getCreated()); + $sessionMetadata['Last used'] = date(DATE_RFC822, $session->getMetadataBag()->getLastUsed()); + $sessionMetadata['Lifetime'] = $session->getMetadataBag()->getLifetime(); + $sessionAttributes = $session->all(); + $flashes = $session->getFlashBag()->peekAll(); + } + } + + $statusCode = $response->getStatusCode(); + + $responseCookies = []; + foreach ($response->headers->getCookies() as $cookie) { + $responseCookies[$cookie->getName()] = $cookie; + } + + $dotenvVars = []; + foreach (explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '') as $name) { + if ('' !== $name && isset($_ENV[$name])) { + $dotenvVars[$name] = $_ENV[$name]; + } + } + + $this->data = [ + 'method' => $request->getMethod(), + 'format' => $request->getRequestFormat(), + 'content' => $content, + 'content_type' => $response->headers->get('Content-Type', 'text/html'), + 'status_text' => isset(Response::$statusTexts[$statusCode]) ? Response::$statusTexts[$statusCode] : '', + 'status_code' => $statusCode, + 'request_query' => $request->query->all(), + 'request_request' => $request->request->all(), + 'request_files' => $request->files->all(), + 'request_headers' => $request->headers->all(), + 'request_server' => $request->server->all(), + 'request_cookies' => $request->cookies->all(), + 'request_attributes' => $attributes, + 'route' => $route, + 'response_headers' => $response->headers->all(), + 'response_cookies' => $responseCookies, + 'session_metadata' => $sessionMetadata, + 'session_attributes' => $sessionAttributes, + 'flashes' => $flashes, + 'path_info' => $request->getPathInfo(), + 'controller' => 'n/a', + 'locale' => $request->getLocale(), + 'dotenv_vars' => $dotenvVars, + ]; + + if (isset($this->data['request_headers']['php-auth-pw'])) { + $this->data['request_headers']['php-auth-pw'] = '******'; + } + + if (isset($this->data['request_server']['PHP_AUTH_PW'])) { + $this->data['request_server']['PHP_AUTH_PW'] = '******'; + } + + if (isset($this->data['request_request']['_password'])) { + $this->data['request_request']['_password'] = '******'; + } + + foreach ($this->data as $key => $value) { + if (!\is_array($value)) { + continue; + } + if ('request_headers' === $key || 'response_headers' === $key) { + $this->data[$key] = array_map(function ($v) { return isset($v[0]) && !isset($v[1]) ? $v[0] : $v; }, $value); + } + } + + if (isset($this->controllers[$request])) { + $this->data['controller'] = $this->parseController($this->controllers[$request]); + unset($this->controllers[$request]); + } + + if ($request->attributes->has('_redirected') && $redirectCookie = $request->cookies->get('sf_redirect')) { + $this->data['redirect'] = json_decode($redirectCookie, true); + + $response->headers->clearCookie('sf_redirect'); + } + + if ($response->isRedirect()) { + $response->headers->setCookie(new Cookie( + 'sf_redirect', + json_encode([ + 'token' => $response->headers->get('x-debug-token'), + 'route' => $request->attributes->get('_route', 'n/a'), + 'method' => $request->getMethod(), + 'controller' => $this->parseController($request->attributes->get('_controller')), + 'status_code' => $statusCode, + 'status_text' => Response::$statusTexts[(int) $statusCode], + ]), + 0, '/', null, $request->isSecure(), true, false, 'lax' + )); + } + + $this->data['identifier'] = $this->data['route'] ?: (\is_array($this->data['controller']) ? $this->data['controller']['class'].'::'.$this->data['controller']['method'].'()' : $this->data['controller']); + + if ($response->headers->has('x-previous-debug-token')) { + $this->data['forward_token'] = $response->headers->get('x-previous-debug-token'); + } + } + + public function lateCollect() + { + $this->data = $this->cloneVar($this->data); + } + + public function reset() + { + $this->data = []; + $this->controllers = new \SplObjectStorage(); + } + + public function getMethod() + { + return $this->data['method']; + } + + public function getPathInfo() + { + return $this->data['path_info']; + } + + public function getRequestRequest() + { + return new ParameterBag($this->data['request_request']->getValue()); + } + + public function getRequestQuery() + { + return new ParameterBag($this->data['request_query']->getValue()); + } + + public function getRequestFiles() + { + return new ParameterBag($this->data['request_files']->getValue()); + } + + public function getRequestHeaders() + { + return new ParameterBag($this->data['request_headers']->getValue()); + } + + public function getRequestServer($raw = false) + { + return new ParameterBag($this->data['request_server']->getValue($raw)); + } + + public function getRequestCookies($raw = false) + { + return new ParameterBag($this->data['request_cookies']->getValue($raw)); + } + + public function getRequestAttributes() + { + return new ParameterBag($this->data['request_attributes']->getValue()); + } + + public function getResponseHeaders() + { + return new ParameterBag($this->data['response_headers']->getValue()); + } + + public function getResponseCookies() + { + return new ParameterBag($this->data['response_cookies']->getValue()); + } + + public function getSessionMetadata() + { + return $this->data['session_metadata']->getValue(); + } + + public function getSessionAttributes() + { + return $this->data['session_attributes']->getValue(); + } + + public function getFlashes() + { + return $this->data['flashes']->getValue(); + } + + public function getContent() + { + return $this->data['content']; + } + + public function isJsonRequest() + { + return 1 === preg_match('{^application/(?:\w+\++)*json$}i', $this->data['request_headers']['content-type']); + } + + public function getPrettyJson() + { + $decoded = json_decode($this->getContent()); + + return JSON_ERROR_NONE === json_last_error() ? json_encode($decoded, JSON_PRETTY_PRINT) : null; + } + + public function getContentType() + { + return $this->data['content_type']; + } + + public function getStatusText() + { + return $this->data['status_text']; + } + + public function getStatusCode() + { + return $this->data['status_code']; + } + + public function getFormat() + { + return $this->data['format']; + } + + public function getLocale() + { + return $this->data['locale']; + } + + public function getDotenvVars() + { + return new ParameterBag($this->data['dotenv_vars']->getValue()); + } + + /** + * Gets the route name. + * + * The _route request attributes is automatically set by the Router Matcher. + * + * @return string The route + */ + public function getRoute() + { + return $this->data['route']; + } + + public function getIdentifier() + { + return $this->data['identifier']; + } + + /** + * Gets the route parameters. + * + * The _route_params request attributes is automatically set by the RouterListener. + * + * @return array The parameters + */ + public function getRouteParams() + { + return isset($this->data['request_attributes']['_route_params']) ? $this->data['request_attributes']['_route_params']->getValue() : []; + } + + /** + * Gets the parsed controller. + * + * @return array|string The controller as a string or array of data + * with keys 'class', 'method', 'file' and 'line' + */ + public function getController() + { + return $this->data['controller']; + } + + /** + * Gets the previous request attributes. + * + * @return array|bool A legacy array of data from the previous redirection response + * or false otherwise + */ + public function getRedirect() + { + return isset($this->data['redirect']) ? $this->data['redirect'] : false; + } + + public function getForwardToken() + { + return isset($this->data['forward_token']) ? $this->data['forward_token'] : null; + } + + public function onKernelController(ControllerEvent $event) + { + $this->controllers[$event->getRequest()] = $event->getController(); + } + + public function onKernelResponse(ResponseEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + if ($event->getRequest()->cookies->has('sf_redirect')) { + $event->getRequest()->attributes->set('_redirected', true); + } + } + + public static function getSubscribedEvents() + { + return [ + KernelEvents::CONTROLLER => 'onKernelController', + KernelEvents::RESPONSE => 'onKernelResponse', + ]; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'request'; + } + + /** + * Parse a controller. + * + * @param mixed $controller The controller to parse + * + * @return array|string An array of controller data or a simple string + */ + protected function parseController($controller) + { + if (\is_string($controller) && false !== strpos($controller, '::')) { + $controller = explode('::', $controller); + } + + if (\is_array($controller)) { + try { + $r = new \ReflectionMethod($controller[0], $controller[1]); + + return [ + 'class' => \is_object($controller[0]) ? get_debug_type($controller[0]) : $controller[0], + 'method' => $controller[1], + 'file' => $r->getFileName(), + 'line' => $r->getStartLine(), + ]; + } catch (\ReflectionException $e) { + if (\is_callable($controller)) { + // using __call or __callStatic + return [ + 'class' => \is_object($controller[0]) ? get_debug_type($controller[0]) : $controller[0], + 'method' => $controller[1], + 'file' => 'n/a', + 'line' => 'n/a', + ]; + } + } + } + + if ($controller instanceof \Closure) { + $r = new \ReflectionFunction($controller); + + $controller = [ + 'class' => $r->getName(), + 'method' => null, + 'file' => $r->getFileName(), + 'line' => $r->getStartLine(), + ]; + + if (false !== strpos($r->name, '{closure}')) { + return $controller; + } + $controller['method'] = $r->name; + + if ($class = $r->getClosureScopeClass()) { + $controller['class'] = $class->name; + } else { + return $r->name; + } + + return $controller; + } + + if (\is_object($controller)) { + $r = new \ReflectionClass($controller); + + return [ + 'class' => $r->getName(), + 'method' => null, + 'file' => $r->getFileName(), + 'line' => $r->getStartLine(), + ]; + } + + return \is_string($controller) ? $controller : 'n/a'; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php b/vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php new file mode 100644 index 0000000..5ed6970 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Event\ControllerEvent; + +/** + * @author Fabien Potencier + */ +class RouterDataCollector extends DataCollector +{ + /** + * @var \SplObjectStorage + */ + protected $controllers; + + public function __construct() + { + $this->reset(); + } + + /** + * {@inheritdoc} + * + * @final + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + if ($response instanceof RedirectResponse) { + $this->data['redirect'] = true; + $this->data['url'] = $response->getTargetUrl(); + + if ($this->controllers->contains($request)) { + $this->data['route'] = $this->guessRoute($request, $this->controllers[$request]); + } + } + + unset($this->controllers[$request]); + } + + public function reset() + { + $this->controllers = new \SplObjectStorage(); + + $this->data = [ + 'redirect' => false, + 'url' => null, + 'route' => null, + ]; + } + + protected function guessRoute(Request $request, $controller) + { + return 'n/a'; + } + + /** + * Remembers the controller associated to each request. + */ + public function onKernelController(ControllerEvent $event) + { + $this->controllers[$event->getRequest()] = $event->getController(); + } + + /** + * @return bool Whether this request will result in a redirect + */ + public function getRedirect() + { + return $this->data['redirect']; + } + + /** + * @return string|null The target URL + */ + public function getTargetUrl() + { + return $this->data['url']; + } + + /** + * @return string|null The target route + */ + public function getTargetRoute() + { + return $this->data['route']; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'router'; + } +} diff --git a/vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php b/vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php new file mode 100644 index 0000000..4e95603 --- /dev/null +++ b/vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php @@ -0,0 +1,159 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\KernelInterface; +use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Component\Stopwatch\StopwatchEvent; + +/** + * @author Fabien Potencier + * + * @final + */ +class TimeDataCollector extends DataCollector implements LateDataCollectorInterface +{ + protected $kernel; + protected $stopwatch; + + public function __construct(KernelInterface $kernel = null, Stopwatch $stopwatch = null) + { + $this->kernel = $kernel; + $this->stopwatch = $stopwatch; + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + if (null !== $this->kernel) { + $startTime = $this->kernel->getStartTime(); + } else { + $startTime = $request->server->get('REQUEST_TIME_FLOAT'); + } + + $this->data = [ + 'token' => $response->headers->get('X-Debug-Token'), + 'start_time' => $startTime * 1000, + 'events' => [], + 'stopwatch_installed' => class_exists(Stopwatch::class, false), + ]; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = []; + + if (null !== $this->stopwatch) { + $this->stopwatch->reset(); + } + } + + /** + * {@inheritdoc} + */ + public function lateCollect() + { + if (null !== $this->stopwatch && isset($this->data['token'])) { + $this->setEvents($this->stopwatch->getSectionEvents($this->data['token'])); + } + unset($this->data['token']); + } + + /** + * Sets the request events. + * + * @param StopwatchEvent[] $events The request events + */ + public function setEvents(array $events) + { + foreach ($events as $event) { + $event->ensureStopped(); + } + + $this->data['events'] = $events; + } + + /** + * Gets the request events. + * + * @return StopwatchEvent[] The request events + */ + public function getEvents() + { + return $this->data['events']; + } + + /** + * Gets the request elapsed time. + * + * @return float The elapsed time + */ + public function getDuration() + { + if (!isset($this->data['events']['__section__'])) { + return 0; + } + + $lastEvent = $this->data['events']['__section__']; + + return $lastEvent->getOrigin() + $lastEvent->getDuration() - $this->getStartTime(); + } + + /** + * Gets the initialization time. + * + * This is the time spent until the beginning of the request handling. + * + * @return float The elapsed time + */ + public function getInitTime() + { + if (!isset($this->data['events']['__section__'])) { + return 0; + } + + return $this->data['events']['__section__']->getOrigin() - $this->getStartTime(); + } + + /** + * Gets the request time. + * + * @return float + */ + public function getStartTime() + { + return $this->data['start_time']; + } + + /** + * @return bool whether or not the stopwatch component is installed + */ + public function isStopwatchInstalled() + { + return $this->data['stopwatch_installed']; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'time'; + } +} diff --git a/vendor/symfony/http-kernel/Debug/FileLinkFormatter.php b/vendor/symfony/http-kernel/Debug/FileLinkFormatter.php new file mode 100644 index 0000000..74abb81 --- /dev/null +++ b/vendor/symfony/http-kernel/Debug/FileLinkFormatter.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Debug; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; + +/** + * Formats debug file links. + * + * @author Jérémy Romey + * + * @final + */ +class FileLinkFormatter +{ + private $fileLinkFormat; + private $requestStack; + private $baseDir; + private $urlFormat; + + /** + * @param string|\Closure $urlFormat the URL format, or a closure that returns it on-demand + */ + public function __construct($fileLinkFormat = null, RequestStack $requestStack = null, string $baseDir = null, $urlFormat = null) + { + $fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); + if ($fileLinkFormat && !\is_array($fileLinkFormat)) { + $i = strpos($f = $fileLinkFormat, '&', max(strrpos($f, '%f'), strrpos($f, '%l'))) ?: \strlen($f); + $fileLinkFormat = [substr($f, 0, $i)] + preg_split('/&([^>]++)>/', substr($f, $i), -1, PREG_SPLIT_DELIM_CAPTURE); + } + + $this->fileLinkFormat = $fileLinkFormat; + $this->requestStack = $requestStack; + $this->baseDir = $baseDir; + $this->urlFormat = $urlFormat; + } + + public function format(string $file, int $line) + { + if ($fmt = $this->getFileLinkFormat()) { + for ($i = 1; isset($fmt[$i]); ++$i) { + if (0 === strpos($file, $k = $fmt[$i++])) { + $file = substr_replace($file, $fmt[$i], 0, \strlen($k)); + break; + } + } + + return strtr($fmt[0], ['%f' => $file, '%l' => $line]); + } + + return false; + } + + /** + * @internal + */ + public function __sleep(): array + { + $this->fileLinkFormat = $this->getFileLinkFormat(); + + return ['fileLinkFormat']; + } + + /** + * @internal + */ + public static function generateUrlFormat(UrlGeneratorInterface $router, string $routeName, string $queryString): ?string + { + try { + return $router->generate($routeName).$queryString; + } catch (\Throwable $e) { + return null; + } + } + + private function getFileLinkFormat() + { + if ($this->fileLinkFormat) { + return $this->fileLinkFormat; + } + + if ($this->requestStack && $this->baseDir && $this->urlFormat) { + $request = $this->requestStack->getMasterRequest(); + + if ($request instanceof Request && (!$this->urlFormat instanceof \Closure || $this->urlFormat = ($this->urlFormat)())) { + return [ + $request->getSchemeAndHttpHost().$this->urlFormat, + $this->baseDir.\DIRECTORY_SEPARATOR, '', + ]; + } + } + + return null; + } +} diff --git a/vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.php b/vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.php new file mode 100644 index 0000000..1ece493 --- /dev/null +++ b/vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Debug; + +use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher as BaseTraceableEventDispatcher; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Collects some data about event listeners. + * + * This event dispatcher delegates the dispatching to another one. + * + * @author Fabien Potencier + */ +class TraceableEventDispatcher extends BaseTraceableEventDispatcher +{ + /** + * {@inheritdoc} + */ + protected function beforeDispatch(string $eventName, object $event) + { + switch ($eventName) { + case KernelEvents::REQUEST: + $this->stopwatch->openSection(); + break; + case KernelEvents::VIEW: + case KernelEvents::RESPONSE: + // stop only if a controller has been executed + if ($this->stopwatch->isStarted('controller')) { + $this->stopwatch->stop('controller'); + } + break; + case KernelEvents::TERMINATE: + $token = $event->getResponse()->headers->get('X-Debug-Token'); + if (null === $token) { + break; + } + // There is a very special case when using built-in AppCache class as kernel wrapper, in the case + // of an ESI request leading to a `stale` response [B] inside a `fresh` cached response [A]. + // In this case, `$token` contains the [B] debug token, but the open `stopwatch` section ID + // is equal to the [A] debug token. Trying to reopen section with the [B] token throws an exception + // which must be caught. + try { + $this->stopwatch->openSection($token); + } catch (\LogicException $e) { + } + break; + } + } + + /** + * {@inheritdoc} + */ + protected function afterDispatch(string $eventName, object $event) + { + switch ($eventName) { + case KernelEvents::CONTROLLER_ARGUMENTS: + $this->stopwatch->start('controller', 'section'); + break; + case KernelEvents::RESPONSE: + $token = $event->getResponse()->headers->get('X-Debug-Token'); + if (null === $token) { + break; + } + $this->stopwatch->stopSection($token); + break; + case KernelEvents::TERMINATE: + // In the special case described in the `preDispatch` method above, the `$token` section + // does not exist, then closing it throws an exception which must be caught. + $token = $event->getResponse()->headers->get('X-Debug-Token'); + if (null === $token) { + break; + } + try { + $this->stopwatch->stopSection($token); + } catch (\LogicException $e) { + } + break; + } + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php b/vendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php new file mode 100644 index 0000000..5eb833b --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Composer\Autoload\ClassLoader; +use Symfony\Component\Debug\DebugClassLoader as LegacyDebugClassLoader; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\ErrorHandler\DebugClassLoader; +use Symfony\Component\HttpKernel\Kernel; + +/** + * Sets the classes to compile in the cache for the container. + * + * @author Fabien Potencier + */ +class AddAnnotatedClassesToCachePass implements CompilerPassInterface +{ + private $kernel; + + public function __construct(Kernel $kernel) + { + $this->kernel = $kernel; + } + + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + $annotatedClasses = $this->kernel->getAnnotatedClassesToCompile(); + foreach ($container->getExtensions() as $extension) { + if ($extension instanceof Extension) { + $annotatedClasses = array_merge($annotatedClasses, $extension->getAnnotatedClassesToCompile()); + } + } + + $existingClasses = $this->getClassesInComposerClassMaps(); + + $annotatedClasses = $container->getParameterBag()->resolveValue($annotatedClasses); + $this->kernel->setAnnotatedClassCache($this->expandClasses($annotatedClasses, $existingClasses)); + } + + /** + * Expands the given class patterns using a list of existing classes. + * + * @param array $patterns The class patterns to expand + * @param array $classes The existing classes to match against the patterns + */ + private function expandClasses(array $patterns, array $classes): array + { + $expanded = []; + + // Explicit classes declared in the patterns are returned directly + foreach ($patterns as $key => $pattern) { + if ('\\' !== substr($pattern, -1) && false === strpos($pattern, '*')) { + unset($patterns[$key]); + $expanded[] = ltrim($pattern, '\\'); + } + } + + // Match patterns with the classes list + $regexps = $this->patternsToRegexps($patterns); + + foreach ($classes as $class) { + $class = ltrim($class, '\\'); + + if ($this->matchAnyRegexps($class, $regexps)) { + $expanded[] = $class; + } + } + + return array_unique($expanded); + } + + private function getClassesInComposerClassMaps(): array + { + $classes = []; + + foreach (spl_autoload_functions() as $function) { + if (!\is_array($function)) { + continue; + } + + if ($function[0] instanceof DebugClassLoader || $function[0] instanceof LegacyDebugClassLoader) { + $function = $function[0]->getClassLoader(); + } + + if (\is_array($function) && $function[0] instanceof ClassLoader) { + $classes += array_filter($function[0]->getClassMap()); + } + } + + return array_keys($classes); + } + + private function patternsToRegexps(array $patterns): array + { + $regexps = []; + + foreach ($patterns as $pattern) { + // Escape user input + $regex = preg_quote(ltrim($pattern, '\\')); + + // Wildcards * and ** + $regex = strtr($regex, ['\\*\\*' => '.*?', '\\*' => '[^\\\\]*?']); + + // If this class does not end by a slash, anchor the end + if ('\\' !== substr($regex, -1)) { + $regex .= '$'; + } + + $regexps[] = '{^\\\\'.$regex.'}'; + } + + return $regexps; + } + + private function matchAnyRegexps(string $class, array $regexps): bool + { + $isTest = false !== strpos($class, 'Test'); + + foreach ($regexps as $regex) { + if ($isTest && false === strpos($regex, 'Test')) { + continue; + } + + if (preg_match($regex, '\\'.$class)) { + return true; + } + } + + return false; + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php b/vendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php new file mode 100644 index 0000000..072c35f --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\ContainerBuilder; + +/** + * This extension sub-class provides first-class integration with the + * Config/Definition Component. + * + * You can use this as base class if + * + * a) you use the Config/Definition component for configuration, + * b) your configuration class is named "Configuration", and + * c) the configuration class resides in the DependencyInjection sub-folder. + * + * @author Johannes M. Schmitt + */ +abstract class ConfigurableExtension extends Extension +{ + /** + * {@inheritdoc} + */ + final public function load(array $configs, ContainerBuilder $container) + { + $this->loadInternal($this->processConfiguration($this->getConfiguration($configs, $container), $configs), $container); + } + + /** + * Configures the passed container according to the merged configuration. + */ + abstract protected function loadInternal(array $mergedConfig, ContainerBuilder $container); +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php b/vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php new file mode 100644 index 0000000..705c88d --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver\TraceableValueResolver; +use Symfony\Component\Stopwatch\Stopwatch; + +/** + * Gathers and configures the argument value resolvers. + * + * @author Iltar van der Berg + */ +class ControllerArgumentValueResolverPass implements CompilerPassInterface +{ + use PriorityTaggedServiceTrait; + + private $argumentResolverService; + private $argumentValueResolverTag; + private $traceableResolverStopwatch; + + public function __construct(string $argumentResolverService = 'argument_resolver', string $argumentValueResolverTag = 'controller.argument_value_resolver', string $traceableResolverStopwatch = 'debug.stopwatch') + { + $this->argumentResolverService = $argumentResolverService; + $this->argumentValueResolverTag = $argumentValueResolverTag; + $this->traceableResolverStopwatch = $traceableResolverStopwatch; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->argumentResolverService)) { + return; + } + + $resolvers = $this->findAndSortTaggedServices($this->argumentValueResolverTag, $container); + + if ($container->getParameter('kernel.debug') && class_exists(Stopwatch::class) && $container->has($this->traceableResolverStopwatch)) { + foreach ($resolvers as $resolverReference) { + $id = (string) $resolverReference; + $container->register("debug.$id", TraceableValueResolver::class) + ->setDecoratedService($id) + ->setArguments([new Reference("debug.$id.inner"), new Reference($this->traceableResolverStopwatch)]); + } + } + + $container + ->getDefinition($this->argumentResolverService) + ->replaceArgument(1, new IteratorArgument($resolvers)) + ; + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/Extension.php b/vendor/symfony/http-kernel/DependencyInjection/Extension.php new file mode 100644 index 0000000..db376e6 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/Extension.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension; + +/** + * Allow adding classes to the class cache. + * + * @author Fabien Potencier + */ +abstract class Extension extends BaseExtension +{ + private $annotatedClasses = []; + + /** + * Gets the annotated classes to cache. + * + * @return array An array of classes + */ + public function getAnnotatedClassesToCompile() + { + return $this->annotatedClasses; + } + + /** + * Adds annotated classes to the class cache. + * + * @param array $annotatedClasses An array of class patterns + */ + public function addAnnotatedClassesToCompile(array $annotatedClasses) + { + $this->annotatedClasses = array_merge($this->annotatedClasses, $annotatedClasses); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php b/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php new file mode 100644 index 0000000..432f767 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface; + +/** + * Adds services tagged kernel.fragment_renderer as HTTP content rendering strategies. + * + * @author Fabien Potencier + */ +class FragmentRendererPass implements CompilerPassInterface +{ + private $handlerService; + private $rendererTag; + + public function __construct(string $handlerService = 'fragment.handler', string $rendererTag = 'kernel.fragment_renderer') + { + $this->handlerService = $handlerService; + $this->rendererTag = $rendererTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->handlerService)) { + return; + } + + $definition = $container->getDefinition($this->handlerService); + $renderers = []; + foreach ($container->findTaggedServiceIds($this->rendererTag, true) as $id => $tags) { + $def = $container->getDefinition($id); + $class = $container->getParameterBag()->resolveValue($def->getClass()); + + if (!$r = $container->getReflectionClass($class)) { + throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + if (!$r->isSubclassOf(FragmentRendererInterface::class)) { + throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, FragmentRendererInterface::class)); + } + + foreach ($tags as $tag) { + $renderers[$tag['alias']] = new Reference($id); + } + } + + $definition->replaceArgument(0, ServiceLocatorTagPass::register($container, $renderers)); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php b/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php new file mode 100644 index 0000000..2ee6737 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Psr\Container\ContainerInterface; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpKernel\Fragment\FragmentHandler; + +/** + * Lazily loads fragment renderers from the dependency injection container. + * + * @author Fabien Potencier + */ +class LazyLoadingFragmentHandler extends FragmentHandler +{ + private $container; + private $initialized = []; + + public function __construct(ContainerInterface $container, RequestStack $requestStack, bool $debug = false) + { + $this->container = $container; + + parent::__construct($requestStack, [], $debug); + } + + /** + * {@inheritdoc} + */ + public function render($uri, string $renderer = 'inline', array $options = []) + { + if (!isset($this->initialized[$renderer]) && $this->container->has($renderer)) { + $this->addRenderer($this->container->get($renderer)); + $this->initialized[$renderer] = true; + } + + return parent::render($uri, $renderer, $options); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php b/vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php new file mode 100644 index 0000000..b6df1f6 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Psr\Log\LoggerInterface; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\HttpKernel\Log\Logger; + +/** + * Registers the default logger if necessary. + * + * @author Kévin Dunglas + */ +class LoggerPass implements CompilerPassInterface +{ + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + $container->setAlias(LoggerInterface::class, 'logger') + ->setPublic(false); + + if ($container->has('logger')) { + return; + } + + $container->register('logger', Logger::class) + ->setPublic(false); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php b/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php new file mode 100644 index 0000000..83e1b75 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass as BaseMergeExtensionConfigurationPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +/** + * Ensures certain extensions are always loaded. + * + * @author Kris Wallsmith + */ +class MergeExtensionConfigurationPass extends BaseMergeExtensionConfigurationPass +{ + private $extensions; + + public function __construct(array $extensions) + { + $this->extensions = $extensions; + } + + public function process(ContainerBuilder $container) + { + foreach ($this->extensions as $extension) { + if (!\count($container->getExtensionConfig($extension))) { + $container->loadFromExtension($extension, []); + } + } + + parent::process($container); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php new file mode 100644 index 0000000..82d45a8 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -0,0 +1,214 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\DependencyInjection\ChildDefinition; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use Symfony\Component\DependencyInjection\ContainerAwareInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\TypedReference; +use Symfony\Component\HttpFoundation\Request; + +/** + * Creates the service-locators required by ServiceValueResolver. + * + * @author Nicolas Grekas + */ +class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface +{ + private $resolverServiceId; + private $controllerTag; + private $controllerLocator; + private $notTaggedControllerResolverServiceId; + + public function __construct(string $resolverServiceId = 'argument_resolver.service', string $controllerTag = 'controller.service_arguments', string $controllerLocator = 'argument_resolver.controller_locator', string $notTaggedControllerResolverServiceId = 'argument_resolver.not_tagged_controller') + { + $this->resolverServiceId = $resolverServiceId; + $this->controllerTag = $controllerTag; + $this->controllerLocator = $controllerLocator; + $this->notTaggedControllerResolverServiceId = $notTaggedControllerResolverServiceId; + } + + public function process(ContainerBuilder $container) + { + if (false === $container->hasDefinition($this->resolverServiceId) && false === $container->hasDefinition($this->notTaggedControllerResolverServiceId)) { + return; + } + + $parameterBag = $container->getParameterBag(); + $controllers = []; + + $publicAliases = []; + foreach ($container->getAliases() as $id => $alias) { + if ($alias->isPublic() && !$alias->isPrivate()) { + $publicAliases[(string) $alias][] = $id; + } + } + + foreach ($container->findTaggedServiceIds($this->controllerTag, true) as $id => $tags) { + $def = $container->getDefinition($id); + $def->setPublic(true); + $class = $def->getClass(); + $autowire = $def->isAutowired(); + $bindings = $def->getBindings(); + + // resolve service class, taking parent definitions into account + while ($def instanceof ChildDefinition) { + $def = $container->findDefinition($def->getParent()); + $class = $class ?: $def->getClass(); + $bindings += $def->getBindings(); + } + $class = $parameterBag->resolveValue($class); + + if (!$r = $container->getReflectionClass($class)) { + throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + $isContainerAware = $r->implementsInterface(ContainerAwareInterface::class) || is_subclass_of($class, AbstractController::class); + + // get regular public methods + $methods = []; + $arguments = []; + foreach ($r->getMethods(\ReflectionMethod::IS_PUBLIC) as $r) { + if ('setContainer' === $r->name && $isContainerAware) { + continue; + } + if (!$r->isConstructor() && !$r->isDestructor() && !$r->isAbstract()) { + $methods[strtolower($r->name)] = [$r, $r->getParameters()]; + } + } + + // validate and collect explicit per-actions and per-arguments service references + foreach ($tags as $attributes) { + if (!isset($attributes['action']) && !isset($attributes['argument']) && !isset($attributes['id'])) { + $autowire = true; + continue; + } + foreach (['action', 'argument', 'id'] as $k) { + if (!isset($attributes[$k][0])) { + throw new InvalidArgumentException(sprintf('Missing "%s" attribute on tag "%s" %s for service "%s".', $k, $this->controllerTag, json_encode($attributes, JSON_UNESCAPED_UNICODE), $id)); + } + } + if (!isset($methods[$action = strtolower($attributes['action'])])) { + throw new InvalidArgumentException(sprintf('Invalid "action" attribute on tag "%s" for service "%s": no public "%s()" method found on class "%s".', $this->controllerTag, $id, $attributes['action'], $class)); + } + list($r, $parameters) = $methods[$action]; + $found = false; + + foreach ($parameters as $p) { + if ($attributes['argument'] === $p->name) { + if (!isset($arguments[$r->name][$p->name])) { + $arguments[$r->name][$p->name] = $attributes['id']; + } + $found = true; + break; + } + } + + if (!$found) { + throw new InvalidArgumentException(sprintf('Invalid "%s" tag for service "%s": method "%s()" has no "%s" argument on class "%s".', $this->controllerTag, $id, $r->name, $attributes['argument'], $class)); + } + } + + foreach ($methods as list($r, $parameters)) { + /** @var \ReflectionMethod $r */ + + // create a per-method map of argument-names to service/type-references + $args = []; + foreach ($parameters as $p) { + /** @var \ReflectionParameter $p */ + $type = ltrim($target = ProxyHelper::getTypeHint($r, $p), '\\'); + $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; + + if (isset($arguments[$r->name][$p->name])) { + $target = $arguments[$r->name][$p->name]; + if ('?' !== $target[0]) { + $invalidBehavior = ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE; + } elseif ('' === $target = (string) substr($target, 1)) { + throw new InvalidArgumentException(sprintf('A "%s" tag must have non-empty "id" attributes for service "%s".', $this->controllerTag, $id)); + } elseif ($p->allowsNull() && !$p->isOptional()) { + $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; + } + } elseif (isset($bindings[$bindingName = $type.' $'.$p->name]) || isset($bindings[$bindingName = '$'.$p->name]) || isset($bindings[$bindingName = $type])) { + $binding = $bindings[$bindingName]; + + list($bindingValue, $bindingId, , $bindingType, $bindingFile) = $binding->getValues(); + $binding->setValues([$bindingValue, $bindingId, true, $bindingType, $bindingFile]); + + if (!$bindingValue instanceof Reference) { + $args[$p->name] = new Reference('.value.'.$container->hash($bindingValue)); + $container->register((string) $args[$p->name], 'mixed') + ->setFactory('current') + ->addArgument([$bindingValue]); + } else { + $args[$p->name] = $bindingValue; + } + + continue; + } elseif (!$type || !$autowire || '\\' !== $target[0]) { + continue; + } elseif (!$p->allowsNull()) { + $invalidBehavior = ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE; + } + + if (Request::class === $type) { + continue; + } + + if ($type && !$p->isOptional() && !$p->allowsNull() && !class_exists($type) && !interface_exists($type, false)) { + $message = sprintf('Cannot determine controller argument for "%s::%s()": the $%s argument is type-hinted with the non-existent class or interface: "%s".', $class, $r->name, $p->name, $type); + + // see if the type-hint lives in the same namespace as the controller + if (0 === strncmp($type, $class, strrpos($class, '\\'))) { + $message .= ' Did you forget to add a use statement?'; + } + + $container->register($erroredId = '.errored.'.$container->hash($message), $type) + ->addError($message); + + $args[$p->name] = new Reference($erroredId, ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE); + } else { + $target = ltrim($target, '\\'); + $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, $p->name) : new Reference($target, $invalidBehavior); + } + } + // register the maps as a per-method service-locators + if ($args) { + $controllers[$id.'::'.$r->name] = ServiceLocatorTagPass::register($container, $args); + + foreach ($publicAliases[$id] ?? [] as $alias) { + $controllers[$alias.'::'.$r->name] = clone $controllers[$id.'::'.$r->name]; + } + } + } + } + + $controllerLocatorRef = ServiceLocatorTagPass::register($container, $controllers); + + if ($container->hasDefinition($this->resolverServiceId)) { + $container->getDefinition($this->resolverServiceId) + ->replaceArgument(0, $controllerLocatorRef); + } + + if ($container->hasDefinition($this->notTaggedControllerResolverServiceId)) { + $container->getDefinition($this->notTaggedControllerResolverServiceId) + ->replaceArgument(0, $controllerLocatorRef); + } + + $container->setAlias($this->controllerLocator, (string) $controllerLocatorRef); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php b/vendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php new file mode 100644 index 0000000..0efb164 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Register all services that have the "kernel.locale_aware" tag into the listener. + * + * @author Pierre Bobiet + */ +class RegisterLocaleAwareServicesPass implements CompilerPassInterface +{ + private $listenerServiceId; + private $localeAwareTag; + + public function __construct(string $listenerServiceId = 'locale_aware_listener', string $localeAwareTag = 'kernel.locale_aware') + { + $this->listenerServiceId = $listenerServiceId; + $this->localeAwareTag = $localeAwareTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->listenerServiceId)) { + return; + } + + $services = []; + + foreach ($container->findTaggedServiceIds($this->localeAwareTag) as $id => $tags) { + $services[] = new Reference($id); + } + + if (!$services) { + $container->removeDefinition($this->listenerServiceId); + + return; + } + + $container + ->getDefinition($this->listenerServiceId) + ->setArgument(0, new IteratorArgument($services)) + ; + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php b/vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php new file mode 100644 index 0000000..f69d376 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +/** + * Removes empty service-locators registered for ServiceValueResolver. + * + * @author Nicolas Grekas + */ +class RemoveEmptyControllerArgumentLocatorsPass implements CompilerPassInterface +{ + private $controllerLocator; + + public function __construct(string $controllerLocator = 'argument_resolver.controller_locator') + { + $this->controllerLocator = $controllerLocator; + } + + public function process(ContainerBuilder $container) + { + $controllerLocator = $container->findDefinition($this->controllerLocator); + $controllers = $controllerLocator->getArgument(0); + + foreach ($controllers as $controller => $argumentRef) { + $argumentLocator = $container->getDefinition((string) $argumentRef->getValues()[0]); + + if (!$argumentLocator->getArgument(0)) { + // remove empty argument locators + $reason = sprintf('Removing service-argument resolver for controller "%s": no corresponding services exist for the referenced types.', $controller); + } else { + // any methods listed for call-at-instantiation cannot be actions + $reason = false; + list($id, $action) = explode('::', $controller); + + if ($container->hasAlias($id)) { + continue; + } + + $controllerDef = $container->getDefinition($id); + foreach ($controllerDef->getMethodCalls() as list($method)) { + if (0 === strcasecmp($action, $method)) { + $reason = sprintf('Removing method "%s" of service "%s" from controller candidates: the method is called at instantiation, thus cannot be an action.', $action, $id); + break; + } + } + if (!$reason) { + // see Symfony\Component\HttpKernel\Controller\ContainerControllerResolver + $controllers[$id.':'.$action] = $argumentRef; + + if ('__invoke' === $action) { + $controllers[$id] = $argumentRef; + } + continue; + } + } + + unset($controllers[$controller]); + $container->log($this, $reason); + } + + $controllerLocator->replaceArgument(0, $controllers); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php b/vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php new file mode 100644 index 0000000..b5e4610 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\DependencyInjection\Reference; + +/** + * @author Alexander M. Turek + */ +class ResettableServicePass implements CompilerPassInterface +{ + private $tagName; + + public function __construct(string $tagName = 'kernel.reset') + { + $this->tagName = $tagName; + } + + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + if (!$container->has('services_resetter')) { + return; + } + + $services = $methods = []; + + foreach ($container->findTaggedServiceIds($this->tagName, true) as $id => $tags) { + $services[$id] = new Reference($id, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE); + + foreach ($tags as $attributes) { + if (!isset($attributes['method'])) { + throw new RuntimeException(sprintf('Tag "%s" requires the "method" attribute to be set.', $this->tagName)); + } + + if (!isset($methods[$id])) { + $methods[$id] = []; + } + + $methods[$id][] = $attributes['method']; + } + } + + if (!$services) { + $container->removeAlias('services_resetter'); + $container->removeDefinition('services_resetter'); + + return; + } + + $container->findDefinition('services_resetter') + ->setArgument(0, new IteratorArgument($services)) + ->setArgument(1, $methods); + } +} diff --git a/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php b/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php new file mode 100644 index 0000000..d9e0028 --- /dev/null +++ b/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\DependencyInjection; + +use Symfony\Contracts\Service\ResetInterface; + +/** + * Resets provided services. + * + * @author Alexander M. Turek + * @author Nicolas Grekas + * + * @internal + */ +class ServicesResetter implements ResetInterface +{ + private $resettableServices; + private $resetMethods; + + public function __construct(\Traversable $resettableServices, array $resetMethods) + { + $this->resettableServices = $resettableServices; + $this->resetMethods = $resetMethods; + } + + public function reset() + { + foreach ($this->resettableServices as $id => $service) { + foreach ((array) $this->resetMethods[$id] as $resetMethod) { + $service->$resetMethod(); + } + } + } +} diff --git a/vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.php b/vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.php new file mode 100644 index 0000000..d075ee9 --- /dev/null +++ b/vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Allows filtering of controller arguments. + * + * You can call getController() to retrieve the controller and getArguments + * to retrieve the current arguments. With setArguments() you can replace + * arguments that are used to call the controller. + * + * Arguments set in the event must be compatible with the signature of the + * controller. + * + * @author Christophe Coevoet + */ +final class ControllerArgumentsEvent extends KernelEvent +{ + private $controller; + private $arguments; + + public function __construct(HttpKernelInterface $kernel, callable $controller, array $arguments, Request $request, ?int $requestType) + { + parent::__construct($kernel, $request, $requestType); + + $this->controller = $controller; + $this->arguments = $arguments; + } + + public function getController(): callable + { + return $this->controller; + } + + public function setController(callable $controller) + { + $this->controller = $controller; + } + + public function getArguments(): array + { + return $this->arguments; + } + + public function setArguments(array $arguments) + { + $this->arguments = $arguments; + } +} diff --git a/vendor/symfony/http-kernel/Event/ControllerEvent.php b/vendor/symfony/http-kernel/Event/ControllerEvent.php new file mode 100644 index 0000000..da88800 --- /dev/null +++ b/vendor/symfony/http-kernel/Event/ControllerEvent.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Allows filtering of a controller callable. + * + * You can call getController() to retrieve the current controller. With + * setController() you can set a new controller that is used in the processing + * of the request. + * + * Controllers should be callables. + * + * @author Bernhard Schussek + */ +final class ControllerEvent extends KernelEvent +{ + private $controller; + + public function __construct(HttpKernelInterface $kernel, callable $controller, Request $request, ?int $requestType) + { + parent::__construct($kernel, $request, $requestType); + + $this->setController($controller); + } + + public function getController(): callable + { + return $this->controller; + } + + public function setController(callable $controller): void + { + $this->controller = $controller; + } +} diff --git a/vendor/symfony/http-kernel/Event/ExceptionEvent.php b/vendor/symfony/http-kernel/Event/ExceptionEvent.php new file mode 100644 index 0000000..a18fbd3 --- /dev/null +++ b/vendor/symfony/http-kernel/Event/ExceptionEvent.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Allows to create a response for a thrown exception. + * + * Call setResponse() to set the response that will be returned for the + * current request. The propagation of this event is stopped as soon as a + * response is set. + * + * You can also call setThrowable() to replace the thrown exception. This + * exception will be thrown if no response is set during processing of this + * event. + * + * @author Bernhard Schussek + */ +final class ExceptionEvent extends RequestEvent +{ + private $throwable; + + /** + * @var bool + */ + private $allowCustomResponseCode = false; + + public function __construct(HttpKernelInterface $kernel, Request $request, int $requestType, \Throwable $e) + { + parent::__construct($kernel, $request, $requestType); + + $this->setThrowable($e); + } + + public function getThrowable(): \Throwable + { + return $this->throwable; + } + + /** + * Replaces the thrown exception. + * + * This exception will be thrown if no response is set in the event. + */ + public function setThrowable(\Throwable $exception): void + { + $this->throwable = $exception; + } + + /** + * Mark the event as allowing a custom response code. + */ + public function allowCustomResponseCode(): void + { + $this->allowCustomResponseCode = true; + } + + /** + * Returns true if the event allows a custom response code. + */ + public function isAllowingCustomResponseCode(): bool + { + return $this->allowCustomResponseCode; + } +} diff --git a/vendor/symfony/http-kernel/Event/FinishRequestEvent.php b/vendor/symfony/http-kernel/Event/FinishRequestEvent.php new file mode 100644 index 0000000..306a7ad --- /dev/null +++ b/vendor/symfony/http-kernel/Event/FinishRequestEvent.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +/** + * Triggered whenever a request is fully processed. + * + * @author Benjamin Eberlei + */ +final class FinishRequestEvent extends KernelEvent +{ +} diff --git a/vendor/symfony/http-kernel/Event/KernelEvent.php b/vendor/symfony/http-kernel/Event/KernelEvent.php new file mode 100644 index 0000000..08558d5 --- /dev/null +++ b/vendor/symfony/http-kernel/Event/KernelEvent.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Contracts\EventDispatcher\Event; + +/** + * Base class for events thrown in the HttpKernel component. + * + * @author Bernhard Schussek + */ +class KernelEvent extends Event +{ + private $kernel; + private $request; + private $requestType; + + /** + * @param int $requestType The request type the kernel is currently processing; one of + * HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST + */ + public function __construct(HttpKernelInterface $kernel, Request $request, ?int $requestType) + { + $this->kernel = $kernel; + $this->request = $request; + $this->requestType = $requestType; + } + + /** + * Returns the kernel in which this event was thrown. + * + * @return HttpKernelInterface + */ + public function getKernel() + { + return $this->kernel; + } + + /** + * Returns the request the kernel is currently processing. + * + * @return Request + */ + public function getRequest() + { + return $this->request; + } + + /** + * Returns the request type the kernel is currently processing. + * + * @return int One of HttpKernelInterface::MASTER_REQUEST and + * HttpKernelInterface::SUB_REQUEST + */ + public function getRequestType() + { + return $this->requestType; + } + + /** + * Checks if this is a master request. + * + * @return bool True if the request is a master request + */ + public function isMasterRequest() + { + return HttpKernelInterface::MASTER_REQUEST === $this->requestType; + } +} diff --git a/vendor/symfony/http-kernel/Event/RequestEvent.php b/vendor/symfony/http-kernel/Event/RequestEvent.php new file mode 100644 index 0000000..0b2b98e --- /dev/null +++ b/vendor/symfony/http-kernel/Event/RequestEvent.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Response; + +/** + * Allows to create a response for a request. + * + * Call setResponse() to set the response that will be returned for the + * current request. The propagation of this event is stopped as soon as a + * response is set. + * + * @author Bernhard Schussek + */ +class RequestEvent extends KernelEvent +{ + private $response; + + /** + * Returns the response object. + * + * @return Response|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Sets a response and stops event propagation. + */ + public function setResponse(Response $response) + { + $this->response = $response; + + $this->stopPropagation(); + } + + /** + * Returns whether a response was set. + * + * @return bool Whether a response was set + */ + public function hasResponse() + { + return null !== $this->response; + } +} diff --git a/vendor/symfony/http-kernel/Event/ResponseEvent.php b/vendor/symfony/http-kernel/Event/ResponseEvent.php new file mode 100644 index 0000000..1e56ebe --- /dev/null +++ b/vendor/symfony/http-kernel/Event/ResponseEvent.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Allows to filter a Response object. + * + * You can call getResponse() to retrieve the current response. With + * setResponse() you can set a new response that will be returned to the + * browser. + * + * @author Bernhard Schussek + */ +final class ResponseEvent extends KernelEvent +{ + private $response; + + public function __construct(HttpKernelInterface $kernel, Request $request, int $requestType, Response $response) + { + parent::__construct($kernel, $request, $requestType); + + $this->setResponse($response); + } + + public function getResponse(): Response + { + return $this->response; + } + + public function setResponse(Response $response): void + { + $this->response = $response; + } +} diff --git a/vendor/symfony/http-kernel/Event/TerminateEvent.php b/vendor/symfony/http-kernel/Event/TerminateEvent.php new file mode 100644 index 0000000..e0002fb --- /dev/null +++ b/vendor/symfony/http-kernel/Event/TerminateEvent.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Allows to execute logic after a response was sent. + * + * Since it's only triggered on master requests, the `getRequestType()` method + * will always return the value of `HttpKernelInterface::MASTER_REQUEST`. + * + * @author Jordi Boggiano + */ +final class TerminateEvent extends KernelEvent +{ + private $response; + + public function __construct(HttpKernelInterface $kernel, Request $request, Response $response) + { + parent::__construct($kernel, $request, HttpKernelInterface::MASTER_REQUEST); + + $this->response = $response; + } + + public function getResponse(): Response + { + return $this->response; + } +} diff --git a/vendor/symfony/http-kernel/Event/ViewEvent.php b/vendor/symfony/http-kernel/Event/ViewEvent.php new file mode 100644 index 0000000..66a4cea --- /dev/null +++ b/vendor/symfony/http-kernel/Event/ViewEvent.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Event; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Allows to create a response for the return value of a controller. + * + * Call setResponse() to set the response that will be returned for the + * current request. The propagation of this event is stopped as soon as a + * response is set. + * + * @author Bernhard Schussek + */ +final class ViewEvent extends RequestEvent +{ + /** + * The return value of the controller. + * + * @var mixed + */ + private $controllerResult; + + public function __construct(HttpKernelInterface $kernel, Request $request, int $requestType, $controllerResult) + { + parent::__construct($kernel, $request, $requestType); + + $this->controllerResult = $controllerResult; + } + + /** + * Returns the return value of the controller. + * + * @return mixed The controller return value + */ + public function getControllerResult() + { + return $this->controllerResult; + } + + /** + * Assigns the return value of the controller. + * + * @param mixed $controllerResult The controller return value + */ + public function setControllerResult($controllerResult): void + { + $this->controllerResult = $controllerResult; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php b/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php new file mode 100644 index 0000000..1fe3264 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php @@ -0,0 +1,196 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Psr\Container\ContainerInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Symfony\Component\HttpKernel\Event\FinishRequestEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\Exception\UnexpectedSessionUsageException; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Sets the session onto the request on the "kernel.request" event and saves + * it on the "kernel.response" event. + * + * In addition, if the session has been started it overrides the Cache-Control + * header in such a way that all caching is disabled in that case. + * If you have a scenario where caching responses with session information in + * them makes sense, you can disable this behaviour by setting the header + * AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER on the response. + * + * @author Johannes M. Schmitt + * @author Tobias Schultze + * + * @internal + */ +abstract class AbstractSessionListener implements EventSubscriberInterface +{ + const NO_AUTO_CACHE_CONTROL_HEADER = 'Symfony-Session-NoAutoCacheControl'; + + protected $container; + private $sessionUsageStack = []; + private $debug; + + public function __construct(ContainerInterface $container = null, bool $debug = false) + { + $this->container = $container; + $this->debug = $debug; + } + + public function onKernelRequest(RequestEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + $session = null; + $request = $event->getRequest(); + if ($request->hasSession()) { + // no-op + } elseif (method_exists($request, 'setSessionFactory')) { + $request->setSessionFactory(function () { return $this->getSession(); }); + } elseif ($session = $this->getSession()) { + $request->setSession($session); + } + + $session = $session ?? ($this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : null); + $this->sessionUsageStack[] = $session instanceof Session ? $session->getUsageIndex() : 0; + } + + public function onKernelResponse(ResponseEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + $response = $event->getResponse(); + $autoCacheControl = !$response->headers->has(self::NO_AUTO_CACHE_CONTROL_HEADER); + // Always remove the internal header if present + $response->headers->remove(self::NO_AUTO_CACHE_CONTROL_HEADER); + + if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : $event->getRequest()->getSession()) { + return; + } + + if ($session->isStarted()) { + /* + * Saves the session, in case it is still open, before sending the response/headers. + * + * This ensures several things in case the developer did not save the session explicitly: + * + * * If a session save handler without locking is used, it ensures the data is available + * on the next request, e.g. after a redirect. PHPs auto-save at script end via + * session_register_shutdown is executed after fastcgi_finish_request. So in this case + * the data could be missing the next request because it might not be saved the moment + * the new request is processed. + * * A locking save handler (e.g. the native 'files') circumvents concurrency problems like + * the one above. But by saving the session before long-running things in the terminate event, + * we ensure the session is not blocked longer than needed. + * * When regenerating the session ID no locking is involved in PHPs session design. See + * https://bugs.php.net/61470 for a discussion. So in this case, the session must + * be saved anyway before sending the headers with the new session ID. Otherwise session + * data could get lost again for concurrent requests with the new ID. One result could be + * that you get logged out after just logging in. + * + * This listener should be executed as one of the last listeners, so that previous listeners + * can still operate on the open session. This prevents the overhead of restarting it. + * Listeners after closing the session can still work with the session as usual because + * Symfonys session implementation starts the session on demand. So writing to it after + * it is saved will just restart it. + */ + $session->save(); + } + + if ($session instanceof Session ? $session->getUsageIndex() === end($this->sessionUsageStack) : !$session->isStarted()) { + return; + } + + if ($autoCacheControl) { + $response + ->setExpires(new \DateTime()) + ->setPrivate() + ->setMaxAge(0) + ->headers->addCacheControlDirective('must-revalidate'); + } + + if (!$event->getRequest()->attributes->get('_stateless', false)) { + return; + } + + if ($this->debug) { + throw new UnexpectedSessionUsageException('Session was used while the request was declared stateless.'); + } + + if ($this->container->has('logger')) { + $this->container->get('logger')->warning('Session was used while the request was declared stateless.'); + } + } + + public function onFinishRequest(FinishRequestEvent $event) + { + if ($event->isMasterRequest()) { + array_pop($this->sessionUsageStack); + } + } + + public function onSessionUsage(): void + { + if (!$this->debug) { + return; + } + + if (!$requestStack = $this->container && $this->container->has('request_stack') ? $this->container->get('request_stack') : null) { + return; + } + + $stateless = false; + $clonedRequestStack = clone $requestStack; + while (null !== ($request = $clonedRequestStack->pop()) && !$stateless) { + $stateless = $request->attributes->get('_stateless'); + } + + if (!$stateless) { + return; + } + + if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : $requestStack->getCurrentRequest()->getSession()) { + return; + } + + if ($session->isStarted()) { + $session->save(); + } + + throw new UnexpectedSessionUsageException('Session was used while the request was declared stateless.'); + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => ['onKernelRequest', 128], + // low priority to come after regular response listeners, but higher than StreamedResponseListener + KernelEvents::RESPONSE => ['onKernelResponse', -1000], + KernelEvents::FINISH_REQUEST => ['onFinishRequest'], + ]; + } + + /** + * Gets the session object. + * + * @return SessionInterface|null A SessionInterface instance or null if no session is available + */ + abstract protected function getSession(); +} diff --git a/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php b/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php new file mode 100644 index 0000000..19d13b8 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php @@ -0,0 +1,114 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * TestSessionListener. + * + * Saves session in test environment. + * + * @author Bulat Shakirzyanov + * @author Fabien Potencier + * + * @internal + */ +abstract class AbstractTestSessionListener implements EventSubscriberInterface +{ + private $sessionId; + private $sessionOptions; + + public function __construct(array $sessionOptions = []) + { + $this->sessionOptions = $sessionOptions; + } + + public function onKernelRequest(RequestEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + // bootstrap the session + if (!$session = $this->getSession()) { + return; + } + + $cookies = $event->getRequest()->cookies; + + if ($cookies->has($session->getName())) { + $this->sessionId = $cookies->get($session->getName()); + $session->setId($this->sessionId); + } + } + + /** + * Checks if session was initialized and saves if current request is master + * Runs on 'kernel.response' in test environment. + */ + public function onKernelResponse(ResponseEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + $request = $event->getRequest(); + if (!$request->hasSession()) { + return; + } + + $session = $request->getSession(); + if ($wasStarted = $session->isStarted()) { + $session->save(); + } + + if ($session instanceof Session ? !$session->isEmpty() || (null !== $this->sessionId && $session->getId() !== $this->sessionId) : $wasStarted) { + $params = session_get_cookie_params() + ['samesite' => null]; + foreach ($this->sessionOptions as $k => $v) { + if (0 === strpos($k, 'cookie_')) { + $params[substr($k, 7)] = $v; + } + } + + foreach ($event->getResponse()->headers->getCookies() as $cookie) { + if ($session->getName() === $cookie->getName() && $params['path'] === $cookie->getPath() && $params['domain'] == $cookie->getDomain()) { + return; + } + } + + $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly'], false, $params['samesite'] ?: null)); + $this->sessionId = $session->getId(); + } + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => ['onKernelRequest', 192], + KernelEvents::RESPONSE => ['onKernelResponse', -128], + ]; + } + + /** + * Gets the session object. + * + * @return SessionInterface|null A SessionInterface instance or null if no session is available + */ + abstract protected function getSession(); +} diff --git a/vendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php b/vendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php new file mode 100644 index 0000000..9e896ad --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Adds configured formats to each request. + * + * @author Gildas Quemener + * + * @final + */ +class AddRequestFormatsListener implements EventSubscriberInterface +{ + protected $formats; + + public function __construct(array $formats) + { + $this->formats = $formats; + } + + /** + * Adds request formats. + */ + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + foreach ($this->formats as $format => $mimeTypes) { + $request->setFormat($format, $mimeTypes); + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array + { + return [KernelEvents::REQUEST => ['onKernelRequest', 100]]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php b/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php new file mode 100644 index 0000000..44b1ddb --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Console\ConsoleEvents; +use Symfony\Component\Console\Event\ConsoleEvent; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\ErrorHandler\ErrorHandler; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Debug\FileLinkFormatter; +use Symfony\Component\HttpKernel\Event\KernelEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Configures errors and exceptions handlers. + * + * @author Nicolas Grekas + * + * @final + */ +class DebugHandlersListener implements EventSubscriberInterface +{ + private $exceptionHandler; + private $logger; + private $deprecationLogger; + private $levels; + private $throwAt; + private $scream; + private $fileLinkFormat; + private $scope; + private $firstCall = true; + private $hasTerminatedWithException; + + /** + * @param callable|null $exceptionHandler A handler that must support \Throwable instances that will be called on Exception + * @param array|int $levels An array map of E_* to LogLevel::* or an integer bit field of E_* constants + * @param int|null $throwAt Thrown errors in a bit field of E_* constants, or null to keep the current value + * @param bool $scream Enables/disables screaming mode, where even silenced errors are logged + * @param string|FileLinkFormatter|null $fileLinkFormat The format for links to source files + * @param bool $scope Enables/disables scoping mode + */ + public function __construct(callable $exceptionHandler = null, LoggerInterface $logger = null, $levels = E_ALL, ?int $throwAt = E_ALL, bool $scream = true, $fileLinkFormat = null, bool $scope = true, LoggerInterface $deprecationLogger = null) + { + $this->exceptionHandler = $exceptionHandler; + $this->logger = $logger; + $this->levels = null === $levels ? E_ALL : $levels; + $this->throwAt = \is_int($throwAt) ? $throwAt : (null === $throwAt ? null : ($throwAt ? E_ALL : null)); + $this->scream = $scream; + $this->fileLinkFormat = $fileLinkFormat; + $this->scope = $scope; + $this->deprecationLogger = $deprecationLogger; + } + + /** + * Configures the error handler. + */ + public function configure(object $event = null) + { + if ($event instanceof ConsoleEvent && !\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) { + return; + } + if (!$event instanceof KernelEvent ? !$this->firstCall : !$event->isMasterRequest()) { + return; + } + $this->firstCall = $this->hasTerminatedWithException = false; + + $handler = set_exception_handler('var_dump'); + $handler = \is_array($handler) ? $handler[0] : null; + restore_exception_handler(); + + if ($handler instanceof ErrorHandler) { + if ($this->logger || $this->deprecationLogger) { + $this->setDefaultLoggers($handler); + if (\is_array($this->levels)) { + $levels = 0; + foreach ($this->levels as $type => $log) { + $levels |= $type; + } + } else { + $levels = $this->levels; + } + + if ($this->scream) { + $handler->screamAt($levels); + } + if ($this->scope) { + $handler->scopeAt($levels & ~E_USER_DEPRECATED & ~E_DEPRECATED); + } else { + $handler->scopeAt(0, true); + } + $this->logger = $this->deprecationLogger = $this->levels = null; + } + if (null !== $this->throwAt) { + $handler->throwAt($this->throwAt, true); + } + } + if (!$this->exceptionHandler) { + if ($event instanceof KernelEvent) { + if (method_exists($kernel = $event->getKernel(), 'terminateWithException')) { + $request = $event->getRequest(); + $hasRun = &$this->hasTerminatedWithException; + $this->exceptionHandler = static function (\Throwable $e) use ($kernel, $request, &$hasRun) { + if ($hasRun) { + throw $e; + } + + $hasRun = true; + $kernel->terminateWithException($e, $request); + }; + } + } elseif ($event instanceof ConsoleEvent && $app = $event->getCommand()->getApplication()) { + $output = $event->getOutput(); + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + $this->exceptionHandler = static function (\Throwable $e) use ($app, $output) { + $app->renderThrowable($e, $output); + }; + } + } + if ($this->exceptionHandler) { + if ($handler instanceof ErrorHandler) { + $handler->setExceptionHandler($this->exceptionHandler); + } + $this->exceptionHandler = null; + } + } + + private function setDefaultLoggers(ErrorHandler $handler): void + { + if (\is_array($this->levels)) { + $levelsDeprecatedOnly = []; + $levelsWithoutDeprecated = []; + foreach ($this->levels as $type => $log) { + if (E_DEPRECATED == $type || E_USER_DEPRECATED == $type) { + $levelsDeprecatedOnly[$type] = $log; + } else { + $levelsWithoutDeprecated[$type] = $log; + } + } + } else { + $levelsDeprecatedOnly = $this->levels & (E_DEPRECATED | E_USER_DEPRECATED); + $levelsWithoutDeprecated = $this->levels & ~E_DEPRECATED & ~E_USER_DEPRECATED; + } + + $defaultLoggerLevels = $this->levels; + if ($this->deprecationLogger && $levelsDeprecatedOnly) { + $handler->setDefaultLogger($this->deprecationLogger, $levelsDeprecatedOnly); + $defaultLoggerLevels = $levelsWithoutDeprecated; + } + + if ($this->logger && $defaultLoggerLevels) { + $handler->setDefaultLogger($this->logger, $defaultLoggerLevels); + } + } + + public static function getSubscribedEvents(): array + { + $events = [KernelEvents::REQUEST => ['configure', 2048]]; + + if (\defined('Symfony\Component\Console\ConsoleEvents::COMMAND')) { + $events[ConsoleEvents::COMMAND] = ['configure', 2048]; + } + + return $events; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php b/vendor/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php new file mode 100644 index 0000000..6607e49 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Ensures that the application is not indexed by search engines. + * + * @author Gary PEGEOT + */ +class DisallowRobotsIndexingListener implements EventSubscriberInterface +{ + private const HEADER_NAME = 'X-Robots-Tag'; + + public function onResponse(ResponseEvent $event): void + { + if (!$event->getResponse()->headers->has(static::HEADER_NAME)) { + $event->getResponse()->headers->set(static::HEADER_NAME, 'noindex'); + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() + { + return [ + KernelEvents::RESPONSE => ['onResponse', -255], + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/DumpListener.php b/vendor/symfony/http-kernel/EventListener/DumpListener.php new file mode 100644 index 0000000..30908a4 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/DumpListener.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\Console\ConsoleEvents; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\VarDumper\Cloner\ClonerInterface; +use Symfony\Component\VarDumper\Dumper\DataDumperInterface; +use Symfony\Component\VarDumper\Server\Connection; +use Symfony\Component\VarDumper\VarDumper; + +/** + * Configures dump() handler. + * + * @author Nicolas Grekas + */ +class DumpListener implements EventSubscriberInterface +{ + private $cloner; + private $dumper; + private $connection; + + public function __construct(ClonerInterface $cloner, DataDumperInterface $dumper, Connection $connection = null) + { + $this->cloner = $cloner; + $this->dumper = $dumper; + $this->connection = $connection; + } + + public function configure() + { + $cloner = $this->cloner; + $dumper = $this->dumper; + $connection = $this->connection; + + VarDumper::setHandler(static function ($var) use ($cloner, $dumper, $connection) { + $data = $cloner->cloneVar($var); + + if (!$connection || !$connection->write($data)) { + $dumper->dump($data); + } + }); + } + + public static function getSubscribedEvents() + { + if (!class_exists(ConsoleEvents::class)) { + return []; + } + + // Register early to have a working dump() as early as possible + return [ConsoleEvents::COMMAND => ['configure', 1024]]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/ErrorListener.php b/vendor/symfony/http-kernel/EventListener/ErrorListener.php new file mode 100644 index 0000000..f5cac76 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/ErrorListener.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Debug\Exception\FlattenException as LegacyFlattenException; +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; + +/** + * @author Fabien Potencier + */ +class ErrorListener implements EventSubscriberInterface +{ + protected $controller; + protected $logger; + protected $debug; + + public function __construct($controller, LoggerInterface $logger = null, bool $debug = false) + { + $this->controller = $controller; + $this->logger = $logger; + $this->debug = $debug; + } + + public function logKernelException(ExceptionEvent $event) + { + $e = FlattenException::createFromThrowable($event->getThrowable()); + + $this->logException($event->getThrowable(), sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', $e->getClass(), $e->getMessage(), $e->getFile(), $e->getLine())); + } + + public function onKernelException(ExceptionEvent $event) + { + if (null === $this->controller) { + return; + } + + $exception = $event->getThrowable(); + $request = $this->duplicateRequest($exception, $event->getRequest()); + + try { + $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, false); + } catch (\Exception $e) { + $f = FlattenException::createFromThrowable($e); + + $this->logException($e, sprintf('Exception thrown when handling an exception (%s: %s at %s line %s)', $f->getClass(), $f->getMessage(), $e->getFile(), $e->getLine())); + + $prev = $e; + do { + if ($exception === $wrapper = $prev) { + throw $e; + } + } while ($prev = $wrapper->getPrevious()); + + $prev = new \ReflectionProperty($wrapper instanceof \Exception ? \Exception::class : \Error::class, 'previous'); + $prev->setAccessible(true); + $prev->setValue($wrapper, $exception); + + throw $e; + } + + $event->setResponse($response); + + if ($this->debug) { + $event->getRequest()->attributes->set('_remove_csp_headers', true); + } + } + + public function removeCspHeader(ResponseEvent $event): void + { + if ($this->debug && $event->getRequest()->attributes->get('_remove_csp_headers', false)) { + $event->getResponse()->headers->remove('Content-Security-Policy'); + } + } + + public function onControllerArguments(ControllerArgumentsEvent $event) + { + $e = $event->getRequest()->attributes->get('exception'); + + if (!$e instanceof \Throwable || false === $k = array_search($e, $event->getArguments(), true)) { + return; + } + + $r = new \ReflectionFunction(\Closure::fromCallable($event->getController())); + $r = $r->getParameters()[$k] ?? null; + + if ($r && (!($r = $r->getType()) instanceof \ReflectionNamedType || \in_array($r->getName(), [FlattenException::class, LegacyFlattenException::class], true))) { + $arguments = $event->getArguments(); + $arguments[$k] = FlattenException::createFromThrowable($e); + $event->setArguments($arguments); + } + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::CONTROLLER_ARGUMENTS => 'onControllerArguments', + KernelEvents::EXCEPTION => [ + ['logKernelException', 0], + ['onKernelException', -128], + ], + KernelEvents::RESPONSE => ['removeCspHeader', -128], + ]; + } + + /** + * Logs an exception. + */ + protected function logException(\Throwable $exception, string $message): void + { + if (null !== $this->logger) { + if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) { + $this->logger->critical($message, ['exception' => $exception]); + } else { + $this->logger->error($message, ['exception' => $exception]); + } + } + } + + /** + * Clones the request for the exception. + */ + protected function duplicateRequest(\Throwable $exception, Request $request): Request + { + $attributes = [ + '_controller' => $this->controller, + 'exception' => $exception, + 'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null, + ]; + $request = $request->duplicate(null, null, $attributes); + $request->setMethod('GET'); + + return $request; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/FragmentListener.php b/vendor/symfony/http-kernel/EventListener/FragmentListener.php new file mode 100644 index 0000000..14c6aa6 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/FragmentListener.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\HttpKernel\UriSigner; + +/** + * Handles content fragments represented by special URIs. + * + * All URL paths starting with /_fragment are handled as + * content fragments by this listener. + * + * Throws an AccessDeniedHttpException exception if the request + * is not signed or if it is not an internal sub-request. + * + * @author Fabien Potencier + * + * @final + */ +class FragmentListener implements EventSubscriberInterface +{ + private $signer; + private $fragmentPath; + + /** + * @param string $fragmentPath The path that triggers this listener + */ + public function __construct(UriSigner $signer, string $fragmentPath = '/_fragment') + { + $this->signer = $signer; + $this->fragmentPath = $fragmentPath; + } + + /** + * Fixes request attributes when the path is '/_fragment'. + * + * @throws AccessDeniedHttpException if the request does not come from a trusted IP + */ + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + + if ($this->fragmentPath !== rawurldecode($request->getPathInfo())) { + return; + } + + if ($request->attributes->has('_controller')) { + // Is a sub-request: no need to parse _path but it should still be removed from query parameters as below. + $request->query->remove('_path'); + + return; + } + + if ($event->isMasterRequest()) { + $this->validateRequest($request); + } + + parse_str($request->query->get('_path', ''), $attributes); + $request->attributes->add($attributes); + $request->attributes->set('_route_params', array_replace($request->attributes->get('_route_params', []), $attributes)); + $request->query->remove('_path'); + } + + protected function validateRequest(Request $request) + { + // is the Request safe? + if (!$request->isMethodSafe()) { + throw new AccessDeniedHttpException(); + } + + // is the Request signed? + if ($this->signer->checkRequest($request)) { + return; + } + + throw new AccessDeniedHttpException(); + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => [['onKernelRequest', 48]], + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/LocaleAwareListener.php b/vendor/symfony/http-kernel/EventListener/LocaleAwareListener.php new file mode 100644 index 0000000..62d0302 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/LocaleAwareListener.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpKernel\Event\FinishRequestEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Contracts\Translation\LocaleAwareInterface; + +/** + * Pass the current locale to the provided services. + * + * @author Pierre Bobiet + */ +class LocaleAwareListener implements EventSubscriberInterface +{ + private $localeAwareServices; + private $requestStack; + + /** + * @param LocaleAwareInterface[] $localeAwareServices + */ + public function __construct(iterable $localeAwareServices, RequestStack $requestStack) + { + $this->localeAwareServices = $localeAwareServices; + $this->requestStack = $requestStack; + } + + public function onKernelRequest(RequestEvent $event): void + { + $this->setLocale($event->getRequest()->getLocale(), $event->getRequest()->getDefaultLocale()); + } + + public function onKernelFinishRequest(FinishRequestEvent $event): void + { + if (null === $parentRequest = $this->requestStack->getParentRequest()) { + foreach ($this->localeAwareServices as $service) { + $service->setLocale($event->getRequest()->getDefaultLocale()); + } + + return; + } + + $this->setLocale($parentRequest->getLocale(), $parentRequest->getDefaultLocale()); + } + + public static function getSubscribedEvents() + { + return [ + // must be registered after the Locale listener + KernelEvents::REQUEST => [['onKernelRequest', 15]], + KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', -15]], + ]; + } + + private function setLocale(string $locale, string $defaultLocale): void + { + foreach ($this->localeAwareServices as $service) { + try { + $service->setLocale($locale); + } catch (\InvalidArgumentException $e) { + $service->setLocale($defaultLocale); + } + } + } +} diff --git a/vendor/symfony/http-kernel/EventListener/LocaleListener.php b/vendor/symfony/http-kernel/EventListener/LocaleListener.php new file mode 100644 index 0000000..8037e32 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/LocaleListener.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpKernel\Event\FinishRequestEvent; +use Symfony\Component\HttpKernel\Event\KernelEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\Routing\RequestContextAwareInterface; + +/** + * Initializes the locale based on the current request. + * + * @author Fabien Potencier + * + * @final + */ +class LocaleListener implements EventSubscriberInterface +{ + private $router; + private $defaultLocale; + private $requestStack; + + public function __construct(RequestStack $requestStack, string $defaultLocale = 'en', RequestContextAwareInterface $router = null) + { + $this->defaultLocale = $defaultLocale; + $this->requestStack = $requestStack; + $this->router = $router; + } + + public function setDefaultLocale(KernelEvent $event) + { + $event->getRequest()->setDefaultLocale($this->defaultLocale); + } + + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + + $this->setLocale($request); + $this->setRouterContext($request); + } + + public function onKernelFinishRequest(FinishRequestEvent $event) + { + if (null !== $parentRequest = $this->requestStack->getParentRequest()) { + $this->setRouterContext($parentRequest); + } + } + + private function setLocale(Request $request) + { + if ($locale = $request->attributes->get('_locale')) { + $request->setLocale($locale); + } + } + + private function setRouterContext(Request $request) + { + if (null !== $this->router) { + $this->router->getContext()->setParameter('_locale', $request->getLocale()); + } + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => [ + ['setDefaultLocale', 100], + // must be registered after the Router to have access to the _locale + ['onKernelRequest', 16], + ], + KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', 0]], + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/ProfilerListener.php b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php new file mode 100644 index 0000000..3143f2b --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\RequestMatcherInterface; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\Event\TerminateEvent; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\HttpKernel\Profiler\Profiler; + +/** + * ProfilerListener collects data for the current request by listening to the kernel events. + * + * @author Fabien Potencier + * + * @final + */ +class ProfilerListener implements EventSubscriberInterface +{ + protected $profiler; + protected $matcher; + protected $onlyException; + protected $onlyMasterRequests; + protected $exception; + protected $profiles; + protected $requestStack; + protected $parents; + + /** + * @param bool $onlyException True if the profiler only collects data when an exception occurs, false otherwise + * @param bool $onlyMasterRequests True if the profiler only collects data when the request is a master request, false otherwise + */ + public function __construct(Profiler $profiler, RequestStack $requestStack, RequestMatcherInterface $matcher = null, bool $onlyException = false, bool $onlyMasterRequests = false) + { + $this->profiler = $profiler; + $this->matcher = $matcher; + $this->onlyException = $onlyException; + $this->onlyMasterRequests = $onlyMasterRequests; + $this->profiles = new \SplObjectStorage(); + $this->parents = new \SplObjectStorage(); + $this->requestStack = $requestStack; + } + + /** + * Handles the onKernelException event. + */ + public function onKernelException(ExceptionEvent $event) + { + if ($this->onlyMasterRequests && !$event->isMasterRequest()) { + return; + } + + $this->exception = $event->getThrowable(); + } + + /** + * Handles the onKernelResponse event. + */ + public function onKernelResponse(ResponseEvent $event) + { + $master = $event->isMasterRequest(); + if ($this->onlyMasterRequests && !$master) { + return; + } + + if ($this->onlyException && null === $this->exception) { + return; + } + + $request = $event->getRequest(); + $exception = $this->exception; + $this->exception = null; + + if (null !== $this->matcher && !$this->matcher->matches($request)) { + return; + } + + if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) { + return; + } + + $this->profiles[$request] = $profile; + + $this->parents[$request] = $this->requestStack->getParentRequest(); + } + + public function onKernelTerminate(TerminateEvent $event) + { + // attach children to parents + foreach ($this->profiles as $request) { + if (null !== $parentRequest = $this->parents[$request]) { + if (isset($this->profiles[$parentRequest])) { + $this->profiles[$parentRequest]->addChild($this->profiles[$request]); + } + } + } + + // save profiles + foreach ($this->profiles as $request) { + $this->profiler->saveProfile($this->profiles[$request]); + } + + $this->profiles = new \SplObjectStorage(); + $this->parents = new \SplObjectStorage(); + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::RESPONSE => ['onKernelResponse', -100], + KernelEvents::EXCEPTION => ['onKernelException', 0], + KernelEvents::TERMINATE => ['onKernelTerminate', -1024], + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/ResponseListener.php b/vendor/symfony/http-kernel/EventListener/ResponseListener.php new file mode 100644 index 0000000..d8292ae --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/ResponseListener.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * ResponseListener fixes the Response headers based on the Request. + * + * @author Fabien Potencier + * + * @final + */ +class ResponseListener implements EventSubscriberInterface +{ + private $charset; + + public function __construct(string $charset) + { + $this->charset = $charset; + } + + /** + * Filters the Response. + */ + public function onKernelResponse(ResponseEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + $response = $event->getResponse(); + + if (null === $response->getCharset()) { + $response->setCharset($this->charset); + } + + $response->prepare($event->getRequest()); + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::RESPONSE => 'onKernelResponse', + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/RouterListener.php b/vendor/symfony/http-kernel/EventListener/RouterListener.php new file mode 100644 index 0000000..31bbc3b --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/RouterListener.php @@ -0,0 +1,175 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Psr\Log\LoggerInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\Event\FinishRequestEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\NoConfigurationException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\Matcher\RequestMatcherInterface; +use Symfony\Component\Routing\Matcher\UrlMatcherInterface; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\RequestContextAwareInterface; + +/** + * Initializes the context from the request and sets request attributes based on a matching route. + * + * @author Fabien Potencier + * @author Yonel Ceruto + * + * @final + */ +class RouterListener implements EventSubscriberInterface +{ + private $matcher; + private $context; + private $logger; + private $requestStack; + private $projectDir; + private $debug; + + /** + * @param UrlMatcherInterface|RequestMatcherInterface $matcher The Url or Request matcher + * @param RequestContext|null $context The RequestContext (can be null when $matcher implements RequestContextAwareInterface) + * @param string $projectDir + * + * @throws \InvalidArgumentException + */ + public function __construct($matcher, RequestStack $requestStack, RequestContext $context = null, LoggerInterface $logger = null, string $projectDir = null, bool $debug = true) + { + if (!$matcher instanceof UrlMatcherInterface && !$matcher instanceof RequestMatcherInterface) { + throw new \InvalidArgumentException('Matcher must either implement UrlMatcherInterface or RequestMatcherInterface.'); + } + + if (null === $context && !$matcher instanceof RequestContextAwareInterface) { + throw new \InvalidArgumentException('You must either pass a RequestContext or the matcher must implement RequestContextAwareInterface.'); + } + + $this->matcher = $matcher; + $this->context = $context ?: $matcher->getContext(); + $this->requestStack = $requestStack; + $this->logger = $logger; + $this->projectDir = $projectDir; + $this->debug = $debug; + } + + private function setCurrentRequest(Request $request = null) + { + if (null !== $request) { + try { + $this->context->fromRequest($request); + } catch (\UnexpectedValueException $e) { + throw new BadRequestHttpException($e->getMessage(), $e, $e->getCode()); + } + } + } + + /** + * After a sub-request is done, we need to reset the routing context to the parent request so that the URL generator + * operates on the correct context again. + */ + public function onKernelFinishRequest(FinishRequestEvent $event) + { + $this->setCurrentRequest($this->requestStack->getParentRequest()); + } + + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + + $this->setCurrentRequest($request); + + if ($request->attributes->has('_controller')) { + // routing is already done + return; + } + + // add attributes based on the request (routing) + try { + // matching a request is more powerful than matching a URL path + context, so try that first + if ($this->matcher instanceof RequestMatcherInterface) { + $parameters = $this->matcher->matchRequest($request); + } else { + $parameters = $this->matcher->match($request->getPathInfo()); + } + + if (null !== $this->logger) { + $this->logger->info('Matched route "{route}".', [ + 'route' => isset($parameters['_route']) ? $parameters['_route'] : 'n/a', + 'route_parameters' => $parameters, + 'request_uri' => $request->getUri(), + 'method' => $request->getMethod(), + ]); + } + + $request->attributes->add($parameters); + unset($parameters['_route'], $parameters['_controller']); + $request->attributes->set('_route_params', $parameters); + } catch (ResourceNotFoundException $e) { + $message = sprintf('No route found for "%s %s"', $request->getMethod(), $request->getPathInfo()); + + if ($referer = $request->headers->get('referer')) { + $message .= sprintf(' (from "%s")', $referer); + } + + throw new NotFoundHttpException($message, $e); + } catch (MethodNotAllowedException $e) { + $message = sprintf('No route found for "%s %s": Method Not Allowed (Allow: %s)', $request->getMethod(), $request->getPathInfo(), implode(', ', $e->getAllowedMethods())); + + throw new MethodNotAllowedHttpException($e->getAllowedMethods(), $message, $e); + } + } + + public function onKernelException(ExceptionEvent $event) + { + if (!$this->debug || !($e = $event->getThrowable()) instanceof NotFoundHttpException) { + return; + } + + if ($e->getPrevious() instanceof NoConfigurationException) { + $event->setResponse($this->createWelcomeResponse()); + } + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => [['onKernelRequest', 32]], + KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', 0]], + KernelEvents::EXCEPTION => ['onKernelException', -64], + ]; + } + + private function createWelcomeResponse(): Response + { + $version = Kernel::VERSION; + $projectDir = realpath($this->projectDir).\DIRECTORY_SEPARATOR; + $docVersion = substr(Kernel::VERSION, 0, 3); + + ob_start(); + include \dirname(__DIR__).'/Resources/welcome.html.php'; + + return new Response(ob_get_clean(), Response::HTTP_NOT_FOUND); + } +} diff --git a/vendor/symfony/http-kernel/EventListener/SessionListener.php b/vendor/symfony/http-kernel/EventListener/SessionListener.php new file mode 100644 index 0000000..e982a79 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/SessionListener.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Psr\Container\ContainerInterface; +use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; + +/** + * Sets the session in the request. + * + * When the passed container contains a "session_storage" entry which + * holds a NativeSessionStorage instance, the "cookie_secure" option + * will be set to true whenever the current master request is secure. + * + * @author Fabien Potencier + * + * @final + */ +class SessionListener extends AbstractSessionListener +{ + public function __construct(ContainerInterface $container, bool $debug = false) + { + parent::__construct($container, $debug); + } + + protected function getSession(): ?SessionInterface + { + if (!$this->container->has('session')) { + return null; + } + + if ($this->container->has('session_storage') + && ($storage = $this->container->get('session_storage')) instanceof NativeSessionStorage + && ($masterRequest = $this->container->get('request_stack')->getMasterRequest()) + && $masterRequest->isSecure() + ) { + $storage->setOptions(['cookie_secure' => true]); + } + + return $this->container->get('session'); + } +} diff --git a/vendor/symfony/http-kernel/EventListener/StreamedResponseListener.php b/vendor/symfony/http-kernel/EventListener/StreamedResponseListener.php new file mode 100644 index 0000000..730ee54 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/StreamedResponseListener.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\StreamedResponse; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * StreamedResponseListener is responsible for sending the Response + * to the client. + * + * @author Fabien Potencier + * + * @final + */ +class StreamedResponseListener implements EventSubscriberInterface +{ + /** + * Filters the Response. + */ + public function onKernelResponse(ResponseEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + $response = $event->getResponse(); + + if ($response instanceof StreamedResponse) { + $response->send(); + } + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::RESPONSE => ['onKernelResponse', -1024], + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/SurrogateListener.php b/vendor/symfony/http-kernel/EventListener/SurrogateListener.php new file mode 100644 index 0000000..2ef4af7 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/SurrogateListener.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\HttpCache\HttpCache; +use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * SurrogateListener adds a Surrogate-Control HTTP header when the Response needs to be parsed for Surrogates. + * + * @author Fabien Potencier + * + * @final + */ +class SurrogateListener implements EventSubscriberInterface +{ + private $surrogate; + + public function __construct(SurrogateInterface $surrogate = null) + { + $this->surrogate = $surrogate; + } + + /** + * Filters the Response. + */ + public function onKernelResponse(ResponseEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + + $kernel = $event->getKernel(); + $surrogate = $this->surrogate; + if ($kernel instanceof HttpCache) { + $surrogate = $kernel->getSurrogate(); + if (null !== $this->surrogate && $this->surrogate->getName() !== $surrogate->getName()) { + $surrogate = $this->surrogate; + } + } + + if (null === $surrogate) { + return; + } + + $surrogate->addSurrogateControl($event->getResponse()); + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::RESPONSE => 'onKernelResponse', + ]; + } +} diff --git a/vendor/symfony/http-kernel/EventListener/TestSessionListener.php b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php new file mode 100644 index 0000000..ff8b4aa --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Psr\Container\ContainerInterface; +use Symfony\Component\HttpFoundation\Session\SessionInterface; + +/** + * Sets the session in the request. + * + * @author Fabien Potencier + * + * @final + */ +class TestSessionListener extends AbstractTestSessionListener +{ + private $container; + + public function __construct(ContainerInterface $container, array $sessionOptions = []) + { + $this->container = $container; + parent::__construct($sessionOptions); + } + + protected function getSession(): ?SessionInterface + { + if (!$this->container->has('session')) { + return null; + } + + return $this->container->get('session'); + } +} diff --git a/vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php b/vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php new file mode 100644 index 0000000..1f0c798 --- /dev/null +++ b/vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Validates Requests. + * + * @author Magnus Nordlander + * + * @final + */ +class ValidateRequestListener implements EventSubscriberInterface +{ + /** + * Performs the validation. + */ + public function onKernelRequest(RequestEvent $event) + { + if (!$event->isMasterRequest()) { + return; + } + $request = $event->getRequest(); + + if ($request::getTrustedProxies()) { + $request->getClientIps(); + } + + $request->getHost(); + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => [ + ['onKernelRequest', 256], + ], + ]; + } +} diff --git a/vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php b/vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php new file mode 100644 index 0000000..65e5f8c --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Fabien Potencier + * @author Christophe Coevoet + */ +class AccessDeniedHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(403, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/BadRequestHttpException.php b/vendor/symfony/http-kernel/Exception/BadRequestHttpException.php new file mode 100644 index 0000000..7de9105 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/BadRequestHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class BadRequestHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(400, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/ConflictHttpException.php b/vendor/symfony/http-kernel/Exception/ConflictHttpException.php new file mode 100644 index 0000000..ebb86ba --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/ConflictHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class ConflictHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(409, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php b/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php new file mode 100644 index 0000000..1e87690 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Grégoire Pineau + */ +class ControllerDoesNotReturnResponseException extends \LogicException +{ + public function __construct(string $message, callable $controller, string $file, int $line) + { + parent::__construct($message); + + if (!$controllerDefinition = $this->parseControllerDefinition($controller)) { + return; + } + + $this->file = $controllerDefinition['file']; + $this->line = $controllerDefinition['line']; + $r = new \ReflectionProperty(\Exception::class, 'trace'); + $r->setAccessible(true); + $r->setValue($this, array_merge([ + [ + 'line' => $line, + 'file' => $file, + ], + ], $this->getTrace())); + } + + private function parseControllerDefinition(callable $controller): ?array + { + if (\is_string($controller) && false !== strpos($controller, '::')) { + $controller = explode('::', $controller); + } + + if (\is_array($controller)) { + try { + $r = new \ReflectionMethod($controller[0], $controller[1]); + + return [ + 'file' => $r->getFileName(), + 'line' => $r->getEndLine(), + ]; + } catch (\ReflectionException $e) { + return null; + } + } + + if ($controller instanceof \Closure) { + $r = new \ReflectionFunction($controller); + + return [ + 'file' => $r->getFileName(), + 'line' => $r->getEndLine(), + ]; + } + + if (\is_object($controller)) { + $r = new \ReflectionClass($controller); + + try { + $line = $r->getMethod('__invoke')->getEndLine(); + } catch (\ReflectionException $e) { + $line = $r->getEndLine(); + } + + return [ + 'file' => $r->getFileName(), + 'line' => $line, + ]; + } + + return null; + } +} diff --git a/vendor/symfony/http-kernel/Exception/GoneHttpException.php b/vendor/symfony/http-kernel/Exception/GoneHttpException.php new file mode 100644 index 0000000..aea283a --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/GoneHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class GoneHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(410, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/HttpException.php b/vendor/symfony/http-kernel/Exception/HttpException.php new file mode 100644 index 0000000..d822cd5 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/HttpException.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * HttpException. + * + * @author Kris Wallsmith + */ +class HttpException extends \RuntimeException implements HttpExceptionInterface +{ + private $statusCode; + private $headers; + + public function __construct(int $statusCode, string $message = null, \Throwable $previous = null, array $headers = [], ?int $code = 0) + { + $this->statusCode = $statusCode; + $this->headers = $headers; + + parent::__construct($message, $code, $previous); + } + + public function getStatusCode() + { + return $this->statusCode; + } + + public function getHeaders() + { + return $this->headers; + } + + /** + * Set response headers. + * + * @param array $headers Response headers + */ + public function setHeaders(array $headers) + { + $this->headers = $headers; + } +} diff --git a/vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php b/vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php new file mode 100644 index 0000000..735e9c8 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * Interface for HTTP error exceptions. + * + * @author Kris Wallsmith + */ +interface HttpExceptionInterface extends \Throwable +{ + /** + * Returns the status code. + * + * @return int An HTTP response status code + */ + public function getStatusCode(); + + /** + * Returns response headers. + * + * @return array Response headers + */ + public function getHeaders(); +} diff --git a/vendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php b/vendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php new file mode 100644 index 0000000..44fb770 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class LengthRequiredHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(411, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php b/vendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php new file mode 100644 index 0000000..c15e46f --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Kris Wallsmith + */ +class MethodNotAllowedHttpException extends HttpException +{ + /** + * @param array $allow An array of allowed methods + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(array $allow, string $message = null, \Throwable $previous = null, ?int $code = 0, array $headers = []) + { + $headers['Allow'] = strtoupper(implode(', ', $allow)); + + parent::__construct(405, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php b/vendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php new file mode 100644 index 0000000..c5f5324 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class NotAcceptableHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(406, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/NotFoundHttpException.php b/vendor/symfony/http-kernel/Exception/NotFoundHttpException.php new file mode 100644 index 0000000..146b908 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/NotFoundHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Fabien Potencier + */ +class NotFoundHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(404, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php b/vendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php new file mode 100644 index 0000000..e878b10 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class PreconditionFailedHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(412, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php b/vendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php new file mode 100644 index 0000000..a6cb2f0 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + * + * @see http://tools.ietf.org/html/rfc6585 + */ +class PreconditionRequiredHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(428, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php b/vendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php new file mode 100644 index 0000000..c786ccf --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class ServiceUnavailableHttpException extends HttpException +{ + /** + * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct($retryAfter = null, string $message = null, \Throwable $previous = null, ?int $code = 0, array $headers = []) + { + if ($retryAfter) { + $headers['Retry-After'] = $retryAfter; + } + + parent::__construct(503, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php b/vendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php new file mode 100644 index 0000000..b709f1a --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + * + * @see http://tools.ietf.org/html/rfc6585 + */ +class TooManyRequestsHttpException extends HttpException +{ + /** + * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct($retryAfter = null, string $message = null, \Throwable $previous = null, ?int $code = 0, array $headers = []) + { + if ($retryAfter) { + $headers['Retry-After'] = $retryAfter; + } + + parent::__construct(429, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/UnauthorizedHttpException.php b/vendor/symfony/http-kernel/Exception/UnauthorizedHttpException.php new file mode 100644 index 0000000..fb86c1e --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/UnauthorizedHttpException.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class UnauthorizedHttpException extends HttpException +{ + /** + * @param string $challenge WWW-Authenticate challenge string + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $challenge, string $message = null, \Throwable $previous = null, ?int $code = 0, array $headers = []) + { + $headers['WWW-Authenticate'] = $challenge; + + parent::__construct(401, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php b/vendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php new file mode 100644 index 0000000..0145b16 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Mathias Arlaud + */ +class UnexpectedSessionUsageException extends \LogicException +{ +} diff --git a/vendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php b/vendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php new file mode 100644 index 0000000..93d4bce --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Steve Hutchins + */ +class UnprocessableEntityHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(422, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php b/vendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php new file mode 100644 index 0000000..7cda3a6 --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Ben Ramsey + */ +class UnsupportedMediaTypeHttpException extends HttpException +{ + /** + * @param string $message The internal exception message + * @param \Throwable $previous The previous exception + * @param int $code The internal exception code + */ + public function __construct(string $message = null, \Throwable $previous = null, int $code = 0, array $headers = []) + { + parent::__construct(415, $message, $previous, $headers, $code); + } +} diff --git a/vendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php b/vendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php new file mode 100644 index 0000000..f81199d --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Controller\ControllerReference; +use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface; +use Symfony\Component\HttpKernel\UriSigner; + +/** + * Implements Surrogate rendering strategy. + * + * @author Fabien Potencier + */ +abstract class AbstractSurrogateFragmentRenderer extends RoutableFragmentRenderer +{ + private $surrogate; + private $inlineStrategy; + private $signer; + + /** + * The "fallback" strategy when surrogate is not available should always be an + * instance of InlineFragmentRenderer. + * + * @param FragmentRendererInterface $inlineStrategy The inline strategy to use when the surrogate is not supported + */ + public function __construct(SurrogateInterface $surrogate = null, FragmentRendererInterface $inlineStrategy, UriSigner $signer = null) + { + $this->surrogate = $surrogate; + $this->inlineStrategy = $inlineStrategy; + $this->signer = $signer; + } + + /** + * {@inheritdoc} + * + * Note that if the current Request has no surrogate capability, this method + * falls back to use the inline rendering strategy. + * + * Additional available options: + * + * * alt: an alternative URI to render in case of an error + * * comment: a comment to add when returning the surrogate tag + * + * Note, that not all surrogate strategies support all options. For now + * 'alt' and 'comment' are only supported by ESI. + * + * @see Symfony\Component\HttpKernel\HttpCache\SurrogateInterface + */ + public function render($uri, Request $request, array $options = []) + { + if (!$this->surrogate || !$this->surrogate->hasSurrogateCapability($request)) { + if ($uri instanceof ControllerReference && $this->containsNonScalars($uri->attributes)) { + throw new \InvalidArgumentException('Passing non-scalar values as part of URI attributes to the ESI and SSI rendering strategies is not supported. Use a different rendering strategy or pass scalar values.'); + } + + return $this->inlineStrategy->render($uri, $request, $options); + } + + if ($uri instanceof ControllerReference) { + $uri = $this->generateSignedFragmentUri($uri, $request); + } + + $alt = isset($options['alt']) ? $options['alt'] : null; + if ($alt instanceof ControllerReference) { + $alt = $this->generateSignedFragmentUri($alt, $request); + } + + $tag = $this->surrogate->renderIncludeTag($uri, $alt, isset($options['ignore_errors']) ? $options['ignore_errors'] : false, isset($options['comment']) ? $options['comment'] : ''); + + return new Response($tag); + } + + private function generateSignedFragmentUri(ControllerReference $uri, Request $request): string + { + if (null === $this->signer) { + throw new \LogicException('You must use a URI when using the ESI rendering strategy or set a URL signer.'); + } + + // we need to sign the absolute URI, but want to return the path only. + $fragmentUri = $this->signer->sign($this->generateFragmentUri($uri, $request, true)); + + return substr($fragmentUri, \strlen($request->getSchemeAndHttpHost())); + } + + private function containsNonScalars(array $values): bool + { + foreach ($values as $value) { + if (\is_array($value)) { + return $this->containsNonScalars($value); + } elseif (!is_scalar($value) && null !== $value) { + return true; + } + } + + return false; + } +} diff --git a/vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php b/vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php new file mode 100644 index 0000000..a4570e3 --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +/** + * Implements the ESI rendering strategy. + * + * @author Fabien Potencier + */ +class EsiFragmentRenderer extends AbstractSurrogateFragmentRenderer +{ + /** + * {@inheritdoc} + */ + public function getName() + { + return 'esi'; + } +} diff --git a/vendor/symfony/http-kernel/Fragment/FragmentHandler.php b/vendor/symfony/http-kernel/Fragment/FragmentHandler.php new file mode 100644 index 0000000..f51978a --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/FragmentHandler.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\StreamedResponse; +use Symfony\Component\HttpKernel\Controller\ControllerReference; + +/** + * Renders a URI that represents a resource fragment. + * + * This class handles the rendering of resource fragments that are included into + * a main resource. The handling of the rendering is managed by specialized renderers. + * + * @author Fabien Potencier + * + * @see FragmentRendererInterface + */ +class FragmentHandler +{ + private $debug; + private $renderers = []; + private $requestStack; + + /** + * @param FragmentRendererInterface[] $renderers An array of FragmentRendererInterface instances + * @param bool $debug Whether the debug mode is enabled or not + */ + public function __construct(RequestStack $requestStack, array $renderers = [], bool $debug = false) + { + $this->requestStack = $requestStack; + foreach ($renderers as $renderer) { + $this->addRenderer($renderer); + } + $this->debug = $debug; + } + + /** + * Adds a renderer. + */ + public function addRenderer(FragmentRendererInterface $renderer) + { + $this->renderers[$renderer->getName()] = $renderer; + } + + /** + * Renders a URI and returns the Response content. + * + * Available options: + * + * * ignore_errors: true to return an empty string in case of an error + * + * @param string|ControllerReference $uri A URI as a string or a ControllerReference instance + * + * @return string|null The Response content or null when the Response is streamed + * + * @throws \InvalidArgumentException when the renderer does not exist + * @throws \LogicException when no master request is being handled + */ + public function render($uri, string $renderer = 'inline', array $options = []) + { + if (!isset($options['ignore_errors'])) { + $options['ignore_errors'] = !$this->debug; + } + + if (!isset($this->renderers[$renderer])) { + throw new \InvalidArgumentException(sprintf('The "%s" renderer does not exist.', $renderer)); + } + + if (!$request = $this->requestStack->getCurrentRequest()) { + throw new \LogicException('Rendering a fragment can only be done when handling a Request.'); + } + + return $this->deliver($this->renderers[$renderer]->render($uri, $request, $options)); + } + + /** + * Delivers the Response as a string. + * + * When the Response is a StreamedResponse, the content is streamed immediately + * instead of being returned. + * + * @return string|null The Response content or null when the Response is streamed + * + * @throws \RuntimeException when the Response is not successful + */ + protected function deliver(Response $response) + { + if (!$response->isSuccessful()) { + throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %d).', $this->requestStack->getCurrentRequest()->getUri(), $response->getStatusCode())); + } + + if (!$response instanceof StreamedResponse) { + return $response->getContent(); + } + + $response->sendContent(); + + return null; + } +} diff --git a/vendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php b/vendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php new file mode 100644 index 0000000..4f8ac50 --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Controller\ControllerReference; + +/** + * Interface implemented by all rendering strategies. + * + * @author Fabien Potencier + */ +interface FragmentRendererInterface +{ + /** + * Renders a URI and returns the Response content. + * + * @param string|ControllerReference $uri A URI as a string or a ControllerReference instance + * + * @return Response A Response instance + */ + public function render($uri, Request $request, array $options = []); + + /** + * Gets the name of the strategy. + * + * @return string The strategy name + */ + public function getName(); +} diff --git a/vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php b/vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php new file mode 100644 index 0000000..618859d --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Controller\ControllerReference; +use Symfony\Component\HttpKernel\UriSigner; +use Twig\Environment; + +/** + * Implements the Hinclude rendering strategy. + * + * @author Fabien Potencier + */ +class HIncludeFragmentRenderer extends RoutableFragmentRenderer +{ + private $globalDefaultTemplate; + private $signer; + private $twig; + private $charset; + + /** + * @param string $globalDefaultTemplate The global default content (it can be a template name or the content) + */ + public function __construct(Environment $twig = null, UriSigner $signer = null, string $globalDefaultTemplate = null, string $charset = 'utf-8') + { + $this->twig = $twig; + $this->globalDefaultTemplate = $globalDefaultTemplate; + $this->signer = $signer; + $this->charset = $charset; + } + + /** + * Checks if a templating engine has been set. + * + * @return bool true if the templating engine has been set, false otherwise + */ + public function hasTemplating() + { + return null !== $this->twig; + } + + /** + * {@inheritdoc} + * + * Additional available options: + * + * * default: The default content (it can be a template name or the content) + * * id: An optional hx:include tag id attribute + * * attributes: An optional array of hx:include tag attributes + */ + public function render($uri, Request $request, array $options = []) + { + if ($uri instanceof ControllerReference) { + if (null === $this->signer) { + throw new \LogicException('You must use a proper URI when using the Hinclude rendering strategy or set a URL signer.'); + } + + // we need to sign the absolute URI, but want to return the path only. + $uri = substr($this->signer->sign($this->generateFragmentUri($uri, $request, true)), \strlen($request->getSchemeAndHttpHost())); + } + + // We need to replace ampersands in the URI with the encoded form in order to return valid html/xml content. + $uri = str_replace('&', '&', $uri); + + $template = isset($options['default']) ? $options['default'] : $this->globalDefaultTemplate; + if (null !== $this->twig && $template && $this->twig->getLoader()->exists($template)) { + $content = $this->twig->render($template); + } else { + $content = $template; + } + + $attributes = isset($options['attributes']) && \is_array($options['attributes']) ? $options['attributes'] : []; + if (isset($options['id']) && $options['id']) { + $attributes['id'] = $options['id']; + } + $renderedAttributes = ''; + if (\count($attributes) > 0) { + $flags = ENT_QUOTES | ENT_SUBSTITUTE; + foreach ($attributes as $attribute => $value) { + $renderedAttributes .= sprintf( + ' %s="%s"', + htmlspecialchars($attribute, $flags, $this->charset, false), + htmlspecialchars($value, $flags, $this->charset, false) + ); + } + } + + return new Response(sprintf('%s', $uri, $renderedAttributes, $content)); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'hinclude'; + } +} diff --git a/vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php b/vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php new file mode 100644 index 0000000..3bbdbd3 --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php @@ -0,0 +1,145 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Controller\ControllerReference; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\HttpCache\SubRequestHandler; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; + +/** + * Implements the inline rendering strategy where the Request is rendered by the current HTTP kernel. + * + * @author Fabien Potencier + */ +class InlineFragmentRenderer extends RoutableFragmentRenderer +{ + private $kernel; + private $dispatcher; + + public function __construct(HttpKernelInterface $kernel, EventDispatcherInterface $dispatcher = null) + { + $this->kernel = $kernel; + $this->dispatcher = $dispatcher; + } + + /** + * {@inheritdoc} + * + * Additional available options: + * + * * alt: an alternative URI to render in case of an error + */ + public function render($uri, Request $request, array $options = []) + { + $reference = null; + if ($uri instanceof ControllerReference) { + $reference = $uri; + + // Remove attributes from the generated URI because if not, the Symfony + // routing system will use them to populate the Request attributes. We don't + // want that as we want to preserve objects (so we manually set Request attributes + // below instead) + $attributes = $reference->attributes; + $reference->attributes = []; + + // The request format and locale might have been overridden by the user + foreach (['_format', '_locale'] as $key) { + if (isset($attributes[$key])) { + $reference->attributes[$key] = $attributes[$key]; + } + } + + $uri = $this->generateFragmentUri($uri, $request, false, false); + + $reference->attributes = array_merge($attributes, $reference->attributes); + } + + $subRequest = $this->createSubRequest($uri, $request); + + // override Request attributes as they can be objects (which are not supported by the generated URI) + if (null !== $reference) { + $subRequest->attributes->add($reference->attributes); + } + + $level = ob_get_level(); + try { + return SubRequestHandler::handle($this->kernel, $subRequest, HttpKernelInterface::SUB_REQUEST, false); + } catch (\Exception $e) { + // we dispatch the exception event to trigger the logging + // the response that comes back is ignored + if (isset($options['ignore_errors']) && $options['ignore_errors'] && $this->dispatcher) { + $event = new ExceptionEvent($this->kernel, $request, HttpKernelInterface::SUB_REQUEST, $e); + + $this->dispatcher->dispatch($event, KernelEvents::EXCEPTION); + } + + // let's clean up the output buffers that were created by the sub-request + Response::closeOutputBuffers($level, false); + + if (isset($options['alt'])) { + $alt = $options['alt']; + unset($options['alt']); + + return $this->render($alt, $request, $options); + } + + if (!isset($options['ignore_errors']) || !$options['ignore_errors']) { + throw $e; + } + + return new Response(); + } + } + + protected function createSubRequest($uri, Request $request) + { + $cookies = $request->cookies->all(); + $server = $request->server->all(); + + unset($server['HTTP_IF_MODIFIED_SINCE']); + unset($server['HTTP_IF_NONE_MATCH']); + + $subRequest = Request::create($uri, 'get', [], $cookies, [], $server); + if ($request->headers->has('Surrogate-Capability')) { + $subRequest->headers->set('Surrogate-Capability', $request->headers->get('Surrogate-Capability')); + } + + static $setSession; + + if (null === $setSession) { + $setSession = \Closure::bind(static function ($subRequest, $request) { $subRequest->session = $request->session; }, null, Request::class); + } + $setSession($subRequest, $request); + + if ($request->get('_format')) { + $subRequest->attributes->set('_format', $request->get('_format')); + } + if ($request->getDefaultLocale() !== $request->getLocale()) { + $subRequest->setLocale($request->getLocale()); + } + + return $subRequest; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'inline'; + } +} diff --git a/vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php b/vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php new file mode 100644 index 0000000..c9a1757 --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Controller\ControllerReference; +use Symfony\Component\HttpKernel\EventListener\FragmentListener; + +/** + * Adds the possibility to generate a fragment URI for a given Controller. + * + * @author Fabien Potencier + */ +abstract class RoutableFragmentRenderer implements FragmentRendererInterface +{ + private $fragmentPath = '/_fragment'; + + /** + * Sets the fragment path that triggers the fragment listener. + * + * @see FragmentListener + */ + public function setFragmentPath(string $path) + { + $this->fragmentPath = $path; + } + + /** + * Generates a fragment URI for a given controller. + * + * @param bool $absolute Whether to generate an absolute URL or not + * @param bool $strict Whether to allow non-scalar attributes or not + * + * @return string A fragment URI + */ + protected function generateFragmentUri(ControllerReference $reference, Request $request, bool $absolute = false, bool $strict = true) + { + if ($strict) { + $this->checkNonScalar($reference->attributes); + } + + // We need to forward the current _format and _locale values as we don't have + // a proper routing pattern to do the job for us. + // This makes things inconsistent if you switch from rendering a controller + // to rendering a route if the route pattern does not contain the special + // _format and _locale placeholders. + if (!isset($reference->attributes['_format'])) { + $reference->attributes['_format'] = $request->getRequestFormat(); + } + if (!isset($reference->attributes['_locale'])) { + $reference->attributes['_locale'] = $request->getLocale(); + } + + $reference->attributes['_controller'] = $reference->controller; + + $reference->query['_path'] = http_build_query($reference->attributes, '', '&'); + + $path = $this->fragmentPath.'?'.http_build_query($reference->query, '', '&'); + + if ($absolute) { + return $request->getUriForPath($path); + } + + return $request->getBaseUrl().$path; + } + + private function checkNonScalar(array $values) + { + foreach ($values as $key => $value) { + if (\is_array($value)) { + $this->checkNonScalar($value); + } elseif (!is_scalar($value) && null !== $value) { + throw new \LogicException(sprintf('Controller attributes cannot contain non-scalar/non-null values (value for key "%s" is not a scalar or null).', $key)); + } + } + } +} diff --git a/vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php b/vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php new file mode 100644 index 0000000..45e7122 --- /dev/null +++ b/vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Fragment; + +/** + * Implements the SSI rendering strategy. + * + * @author Sebastian Krebs + */ +class SsiFragmentRenderer extends AbstractSurrogateFragmentRenderer +{ + /** + * {@inheritdoc} + */ + public function getName() + { + return 'ssi'; + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php b/vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php new file mode 100644 index 0000000..bcfa134 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * Abstract class implementing Surrogate capabilities to Request and Response instances. + * + * @author Fabien Potencier + * @author Robin Chalas + */ +abstract class AbstractSurrogate implements SurrogateInterface +{ + protected $contentTypes; + protected $phpEscapeMap = [ + ['', '', '', ''], + ]; + + /** + * @param array $contentTypes An array of content-type that should be parsed for Surrogate information + * (default: text/html, text/xml, application/xhtml+xml, and application/xml) + */ + public function __construct(array $contentTypes = ['text/html', 'text/xml', 'application/xhtml+xml', 'application/xml']) + { + $this->contentTypes = $contentTypes; + } + + /** + * Returns a new cache strategy instance. + * + * @return ResponseCacheStrategyInterface A ResponseCacheStrategyInterface instance + */ + public function createCacheStrategy() + { + return new ResponseCacheStrategy(); + } + + /** + * {@inheritdoc} + */ + public function hasSurrogateCapability(Request $request) + { + if (null === $value = $request->headers->get('Surrogate-Capability')) { + return false; + } + + return false !== strpos($value, sprintf('%s/1.0', strtoupper($this->getName()))); + } + + /** + * {@inheritdoc} + */ + public function addSurrogateCapability(Request $request) + { + $current = $request->headers->get('Surrogate-Capability'); + $new = sprintf('symfony="%s/1.0"', strtoupper($this->getName())); + + $request->headers->set('Surrogate-Capability', $current ? $current.', '.$new : $new); + } + + /** + * {@inheritdoc} + */ + public function needsParsing(Response $response) + { + if (!$control = $response->headers->get('Surrogate-Control')) { + return false; + } + + $pattern = sprintf('#content="[^"]*%s/1.0[^"]*"#', strtoupper($this->getName())); + + return (bool) preg_match($pattern, $control); + } + + /** + * {@inheritdoc} + */ + public function handle(HttpCache $cache, string $uri, string $alt, bool $ignoreErrors) + { + $subRequest = Request::create($uri, Request::METHOD_GET, [], $cache->getRequest()->cookies->all(), [], $cache->getRequest()->server->all()); + + try { + $response = $cache->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true); + + if (!$response->isSuccessful()) { + throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %d).', $subRequest->getUri(), $response->getStatusCode())); + } + + return $response->getContent(); + } catch (\Exception $e) { + if ($alt) { + return $this->handle($cache, $alt, '', $ignoreErrors); + } + + if (!$ignoreErrors) { + throw $e; + } + } + + return ''; + } + + /** + * Remove the Surrogate from the Surrogate-Control header. + */ + protected function removeFromControl(Response $response) + { + if (!$response->headers->has('Surrogate-Control')) { + return; + } + + $value = $response->headers->get('Surrogate-Control'); + $upperName = strtoupper($this->getName()); + + if (sprintf('content="%s/1.0"', $upperName) == $value) { + $response->headers->remove('Surrogate-Control'); + } elseif (preg_match(sprintf('#,\s*content="%s/1.0"#', $upperName), $value)) { + $response->headers->set('Surrogate-Control', preg_replace(sprintf('#,\s*content="%s/1.0"#', $upperName), '', $value)); + } elseif (preg_match(sprintf('#content="%s/1.0",\s*#', $upperName), $value)) { + $response->headers->set('Surrogate-Control', preg_replace(sprintf('#content="%s/1.0",\s*#', $upperName), '', $value)); + } + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/Esi.php b/vendor/symfony/http-kernel/HttpCache/Esi.php new file mode 100644 index 0000000..af67e8f --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/Esi.php @@ -0,0 +1,117 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * Esi implements the ESI capabilities to Request and Response instances. + * + * For more information, read the following W3C notes: + * + * * ESI Language Specification 1.0 (http://www.w3.org/TR/esi-lang) + * + * * Edge Architecture Specification (http://www.w3.org/TR/edge-arch) + * + * @author Fabien Potencier + */ +class Esi extends AbstractSurrogate +{ + public function getName() + { + return 'esi'; + } + + /** + * {@inheritdoc} + */ + public function addSurrogateControl(Response $response) + { + if (false !== strpos($response->getContent(), 'headers->set('Surrogate-Control', 'content="ESI/1.0"'); + } + } + + /** + * {@inheritdoc} + */ + public function renderIncludeTag(string $uri, string $alt = null, bool $ignoreErrors = true, string $comment = '') + { + $html = sprintf('', + $uri, + $ignoreErrors ? ' onerror="continue"' : '', + $alt ? sprintf(' alt="%s"', $alt) : '' + ); + + if (!empty($comment)) { + return sprintf("\n%s", $comment, $html); + } + + return $html; + } + + /** + * {@inheritdoc} + */ + public function process(Request $request, Response $response) + { + $type = $response->headers->get('Content-Type'); + if (empty($type)) { + $type = 'text/html'; + } + + $parts = explode(';', $type); + if (!\in_array($parts[0], $this->contentTypes)) { + return $response; + } + + // we don't use a proper XML parser here as we can have ESI tags in a plain text response + $content = $response->getContent(); + $content = preg_replace('#.*?#s', '', $content); + $content = preg_replace('#]+>#s', '', $content); + + $chunks = preg_split('##', $content, -1, PREG_SPLIT_DELIM_CAPTURE); + $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]); + + $i = 1; + while (isset($chunks[$i])) { + $options = []; + preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER); + foreach ($matches as $set) { + $options[$set[1]] = $set[2]; + } + + if (!isset($options['src'])) { + throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.'); + } + + $chunks[$i] = sprintf('surrogate->handle($this, %s, %s, %s) ?>'."\n", + var_export($options['src'], true), + var_export(isset($options['alt']) ? $options['alt'] : '', true), + isset($options['onerror']) && 'continue' === $options['onerror'] ? 'true' : 'false' + ); + ++$i; + $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]); + ++$i; + } + $content = implode('', $chunks); + + $response->setContent($content); + $response->headers->set('X-Body-Eval', 'ESI'); + + // remove ESI/1.0 from the Surrogate-Control header + $this->removeFromControl($response); + + return $response; + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/HttpCache.php b/vendor/symfony/http-kernel/HttpCache/HttpCache.php new file mode 100644 index 0000000..f8f5a9a --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/HttpCache.php @@ -0,0 +1,735 @@ + + * + * This code is partially based on the Rack-Cache library by Ryan Tomayko, + * which is released under the MIT license. + * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801) + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpKernel\TerminableInterface; + +/** + * Cache provides HTTP caching. + * + * @author Fabien Potencier + */ +class HttpCache implements HttpKernelInterface, TerminableInterface +{ + private $kernel; + private $store; + private $request; + private $surrogate; + private $surrogateCacheStrategy; + private $options = []; + private $traces = []; + + /** + * Constructor. + * + * The available options are: + * + * * debug If true, exceptions are thrown when things go wrong. Otherwise, the cache + * will try to carry on and deliver a meaningful response. + * + * * trace_level May be one of 'none', 'short' and 'full'. For 'short', a concise trace of the + * master request will be added as an HTTP header. 'full' will add traces for all + * requests (including ESI subrequests). (default: 'full' if in debug; 'none' otherwise) + * + * * trace_header Header name to use for traces. (default: X-Symfony-Cache) + * + * * default_ttl The number of seconds that a cache entry should be considered + * fresh when no explicit freshness information is provided in + * a response. Explicit Cache-Control or Expires headers + * override this value. (default: 0) + * + * * private_headers Set of request headers that trigger "private" cache-control behavior + * on responses that don't explicitly state whether the response is + * public or private via a Cache-Control directive. (default: Authorization and Cookie) + * + * * allow_reload Specifies whether the client can force a cache reload by including a + * Cache-Control "no-cache" directive in the request. Set it to ``true`` + * for compliance with RFC 2616. (default: false) + * + * * allow_revalidate Specifies whether the client can force a cache revalidate by including + * a Cache-Control "max-age=0" directive in the request. Set it to ``true`` + * for compliance with RFC 2616. (default: false) + * + * * stale_while_revalidate Specifies the default number of seconds (the granularity is the second as the + * Response TTL precision is a second) during which the cache can immediately return + * a stale response while it revalidates it in the background (default: 2). + * This setting is overridden by the stale-while-revalidate HTTP Cache-Control + * extension (see RFC 5861). + * + * * stale_if_error Specifies the default number of seconds (the granularity is the second) during which + * the cache can serve a stale response when an error is encountered (default: 60). + * This setting is overridden by the stale-if-error HTTP Cache-Control extension + * (see RFC 5861). + */ + public function __construct(HttpKernelInterface $kernel, StoreInterface $store, SurrogateInterface $surrogate = null, array $options = []) + { + $this->store = $store; + $this->kernel = $kernel; + $this->surrogate = $surrogate; + + // needed in case there is a fatal error because the backend is too slow to respond + register_shutdown_function([$this->store, 'cleanup']); + + $this->options = array_merge([ + 'debug' => false, + 'default_ttl' => 0, + 'private_headers' => ['Authorization', 'Cookie'], + 'allow_reload' => false, + 'allow_revalidate' => false, + 'stale_while_revalidate' => 2, + 'stale_if_error' => 60, + 'trace_level' => 'none', + 'trace_header' => 'X-Symfony-Cache', + ], $options); + + if (!isset($options['trace_level'])) { + $this->options['trace_level'] = $this->options['debug'] ? 'full' : 'none'; + } + } + + /** + * Gets the current store. + * + * @return StoreInterface A StoreInterface instance + */ + public function getStore() + { + return $this->store; + } + + /** + * Returns an array of events that took place during processing of the last request. + * + * @return array An array of events + */ + public function getTraces() + { + return $this->traces; + } + + private function addTraces(Response $response) + { + $traceString = null; + + if ('full' === $this->options['trace_level']) { + $traceString = $this->getLog(); + } + + if ('short' === $this->options['trace_level'] && $masterId = array_key_first($this->traces)) { + $traceString = implode('/', $this->traces[$masterId]); + } + + if (null !== $traceString) { + $response->headers->add([$this->options['trace_header'] => $traceString]); + } + } + + /** + * Returns a log message for the events of the last request processing. + * + * @return string A log message + */ + public function getLog() + { + $log = []; + foreach ($this->traces as $request => $traces) { + $log[] = sprintf('%s: %s', $request, implode(', ', $traces)); + } + + return implode('; ', $log); + } + + /** + * Gets the Request instance associated with the master request. + * + * @return Request A Request instance + */ + public function getRequest() + { + return $this->request; + } + + /** + * Gets the Kernel instance. + * + * @return HttpKernelInterface An HttpKernelInterface instance + */ + public function getKernel() + { + return $this->kernel; + } + + /** + * Gets the Surrogate instance. + * + * @return SurrogateInterface A Surrogate instance + * + * @throws \LogicException + */ + public function getSurrogate() + { + return $this->surrogate; + } + + /** + * {@inheritdoc} + */ + public function handle(Request $request, int $type = HttpKernelInterface::MASTER_REQUEST, bool $catch = true) + { + // FIXME: catch exceptions and implement a 500 error page here? -> in Varnish, there is a built-in error page mechanism + if (HttpKernelInterface::MASTER_REQUEST === $type) { + $this->traces = []; + // Keep a clone of the original request for surrogates so they can access it. + // We must clone here to get a separate instance because the application will modify the request during + // the application flow (we know it always does because we do ourselves by setting REMOTE_ADDR to 127.0.0.1 + // and adding the X-Forwarded-For header, see HttpCache::forward()). + $this->request = clone $request; + if (null !== $this->surrogate) { + $this->surrogateCacheStrategy = $this->surrogate->createCacheStrategy(); + } + } + + $this->traces[$this->getTraceKey($request)] = []; + + if (!$request->isMethodSafe()) { + $response = $this->invalidate($request, $catch); + } elseif ($request->headers->has('expect') || !$request->isMethodCacheable()) { + $response = $this->pass($request, $catch); + } elseif ($this->options['allow_reload'] && $request->isNoCache()) { + /* + If allow_reload is configured and the client requests "Cache-Control: no-cache", + reload the cache by fetching a fresh response and caching it (if possible). + */ + $this->record($request, 'reload'); + $response = $this->fetch($request, $catch); + } else { + $response = $this->lookup($request, $catch); + } + + $this->restoreResponseBody($request, $response); + + if (HttpKernelInterface::MASTER_REQUEST === $type) { + $this->addTraces($response); + } + + if (null !== $this->surrogate) { + if (HttpKernelInterface::MASTER_REQUEST === $type) { + $this->surrogateCacheStrategy->update($response); + } else { + $this->surrogateCacheStrategy->add($response); + } + } + + $response->prepare($request); + + $response->isNotModified($request); + + return $response; + } + + /** + * {@inheritdoc} + */ + public function terminate(Request $request, Response $response) + { + if ($this->getKernel() instanceof TerminableInterface) { + $this->getKernel()->terminate($request, $response); + } + } + + /** + * Forwards the Request to the backend without storing the Response in the cache. + * + * @param bool $catch Whether to process exceptions + * + * @return Response A Response instance + */ + protected function pass(Request $request, bool $catch = false) + { + $this->record($request, 'pass'); + + return $this->forward($request, $catch); + } + + /** + * Invalidates non-safe methods (like POST, PUT, and DELETE). + * + * @param bool $catch Whether to process exceptions + * + * @return Response A Response instance + * + * @throws \Exception + * + * @see RFC2616 13.10 + */ + protected function invalidate(Request $request, bool $catch = false) + { + $response = $this->pass($request, $catch); + + // invalidate only when the response is successful + if ($response->isSuccessful() || $response->isRedirect()) { + try { + $this->store->invalidate($request); + + // As per the RFC, invalidate Location and Content-Location URLs if present + foreach (['Location', 'Content-Location'] as $header) { + if ($uri = $response->headers->get($header)) { + $subRequest = Request::create($uri, 'get', [], [], [], $request->server->all()); + + $this->store->invalidate($subRequest); + } + } + + $this->record($request, 'invalidate'); + } catch (\Exception $e) { + $this->record($request, 'invalidate-failed'); + + if ($this->options['debug']) { + throw $e; + } + } + } + + return $response; + } + + /** + * Lookups a Response from the cache for the given Request. + * + * When a matching cache entry is found and is fresh, it uses it as the + * response without forwarding any request to the backend. When a matching + * cache entry is found but is stale, it attempts to "validate" the entry with + * the backend using conditional GET. When no matching cache entry is found, + * it triggers "miss" processing. + * + * @param bool $catch Whether to process exceptions + * + * @return Response A Response instance + * + * @throws \Exception + */ + protected function lookup(Request $request, bool $catch = false) + { + try { + $entry = $this->store->lookup($request); + } catch (\Exception $e) { + $this->record($request, 'lookup-failed'); + + if ($this->options['debug']) { + throw $e; + } + + return $this->pass($request, $catch); + } + + if (null === $entry) { + $this->record($request, 'miss'); + + return $this->fetch($request, $catch); + } + + if (!$this->isFreshEnough($request, $entry)) { + $this->record($request, 'stale'); + + return $this->validate($request, $entry, $catch); + } + + if ($entry->headers->hasCacheControlDirective('no-cache')) { + return $this->validate($request, $entry, $catch); + } + + $this->record($request, 'fresh'); + + $entry->headers->set('Age', $entry->getAge()); + + return $entry; + } + + /** + * Validates that a cache entry is fresh. + * + * The original request is used as a template for a conditional + * GET request with the backend. + * + * @param bool $catch Whether to process exceptions + * + * @return Response A Response instance + */ + protected function validate(Request $request, Response $entry, bool $catch = false) + { + $subRequest = clone $request; + + // send no head requests because we want content + if ('HEAD' === $request->getMethod()) { + $subRequest->setMethod('GET'); + } + + // add our cached last-modified validator + if ($entry->headers->has('Last-Modified')) { + $subRequest->headers->set('if_modified_since', $entry->headers->get('Last-Modified')); + } + + // Add our cached etag validator to the environment. + // We keep the etags from the client to handle the case when the client + // has a different private valid entry which is not cached here. + $cachedEtags = $entry->getEtag() ? [$entry->getEtag()] : []; + $requestEtags = $request->getETags(); + if ($etags = array_unique(array_merge($cachedEtags, $requestEtags))) { + $subRequest->headers->set('if_none_match', implode(', ', $etags)); + } + + $response = $this->forward($subRequest, $catch, $entry); + + if (304 == $response->getStatusCode()) { + $this->record($request, 'valid'); + + // return the response and not the cache entry if the response is valid but not cached + $etag = $response->getEtag(); + if ($etag && \in_array($etag, $requestEtags) && !\in_array($etag, $cachedEtags)) { + return $response; + } + + $entry = clone $entry; + $entry->headers->remove('Date'); + + foreach (['Date', 'Expires', 'Cache-Control', 'ETag', 'Last-Modified'] as $name) { + if ($response->headers->has($name)) { + $entry->headers->set($name, $response->headers->get($name)); + } + } + + $response = $entry; + } else { + $this->record($request, 'invalid'); + } + + if ($response->isCacheable()) { + $this->store($request, $response); + } + + return $response; + } + + /** + * Unconditionally fetches a fresh response from the backend and + * stores it in the cache if is cacheable. + * + * @param bool $catch Whether to process exceptions + * + * @return Response A Response instance + */ + protected function fetch(Request $request, bool $catch = false) + { + $subRequest = clone $request; + + // send no head requests because we want content + if ('HEAD' === $request->getMethod()) { + $subRequest->setMethod('GET'); + } + + // avoid that the backend sends no content + $subRequest->headers->remove('if_modified_since'); + $subRequest->headers->remove('if_none_match'); + + $response = $this->forward($subRequest, $catch); + + if ($response->isCacheable()) { + $this->store($request, $response); + } + + return $response; + } + + /** + * Forwards the Request to the backend and returns the Response. + * + * All backend requests (cache passes, fetches, cache validations) + * run through this method. + * + * @param bool $catch Whether to catch exceptions or not + * @param Response|null $entry A Response instance (the stale entry if present, null otherwise) + * + * @return Response A Response instance + */ + protected function forward(Request $request, bool $catch = false, Response $entry = null) + { + if ($this->surrogate) { + $this->surrogate->addSurrogateCapability($request); + } + + // always a "master" request (as the real master request can be in cache) + $response = SubRequestHandler::handle($this->kernel, $request, HttpKernelInterface::MASTER_REQUEST, $catch); + + /* + * Support stale-if-error given on Responses or as a config option. + * RFC 7234 summarizes in Section 4.2.4 (but also mentions with the individual + * Cache-Control directives) that + * + * A cache MUST NOT generate a stale response if it is prohibited by an + * explicit in-protocol directive (e.g., by a "no-store" or "no-cache" + * cache directive, a "must-revalidate" cache-response-directive, or an + * applicable "s-maxage" or "proxy-revalidate" cache-response-directive; + * see Section 5.2.2). + * + * https://tools.ietf.org/html/rfc7234#section-4.2.4 + * + * We deviate from this in one detail, namely that we *do* serve entries in the + * stale-if-error case even if they have a `s-maxage` Cache-Control directive. + */ + if (null !== $entry + && \in_array($response->getStatusCode(), [500, 502, 503, 504]) + && !$entry->headers->hasCacheControlDirective('no-cache') + && !$entry->mustRevalidate() + ) { + if (null === $age = $entry->headers->getCacheControlDirective('stale-if-error')) { + $age = $this->options['stale_if_error']; + } + + /* + * stale-if-error gives the (extra) time that the Response may be used *after* it has become stale. + * So we compare the time the $entry has been sitting in the cache already with the + * time it was fresh plus the allowed grace period. + */ + if ($entry->getAge() <= $entry->getMaxAge() + $age) { + $this->record($request, 'stale-if-error'); + + return $entry; + } + } + + /* + RFC 7231 Sect. 7.1.1.2 says that a server that does not have a reasonably accurate + clock MUST NOT send a "Date" header, although it MUST send one in most other cases + except for 1xx or 5xx responses where it MAY do so. + + Anyway, a client that received a message without a "Date" header MUST add it. + */ + if (!$response->headers->has('Date')) { + $response->setDate(\DateTime::createFromFormat('U', time())); + } + + $this->processResponseBody($request, $response); + + if ($this->isPrivateRequest($request) && !$response->headers->hasCacheControlDirective('public')) { + $response->setPrivate(); + } elseif ($this->options['default_ttl'] > 0 && null === $response->getTtl() && !$response->headers->getCacheControlDirective('must-revalidate')) { + $response->setTtl($this->options['default_ttl']); + } + + return $response; + } + + /** + * Checks whether the cache entry is "fresh enough" to satisfy the Request. + * + * @return bool true if the cache entry if fresh enough, false otherwise + */ + protected function isFreshEnough(Request $request, Response $entry) + { + if (!$entry->isFresh()) { + return $this->lock($request, $entry); + } + + if ($this->options['allow_revalidate'] && null !== $maxAge = $request->headers->getCacheControlDirective('max-age')) { + return $maxAge > 0 && $maxAge >= $entry->getAge(); + } + + return true; + } + + /** + * Locks a Request during the call to the backend. + * + * @return bool true if the cache entry can be returned even if it is staled, false otherwise + */ + protected function lock(Request $request, Response $entry) + { + // try to acquire a lock to call the backend + $lock = $this->store->lock($request); + + if (true === $lock) { + // we have the lock, call the backend + return false; + } + + // there is already another process calling the backend + + // May we serve a stale response? + if ($this->mayServeStaleWhileRevalidate($entry)) { + $this->record($request, 'stale-while-revalidate'); + + return true; + } + + // wait for the lock to be released + if ($this->waitForLock($request)) { + // replace the current entry with the fresh one + $new = $this->lookup($request); + $entry->headers = $new->headers; + $entry->setContent($new->getContent()); + $entry->setStatusCode($new->getStatusCode()); + $entry->setProtocolVersion($new->getProtocolVersion()); + foreach ($new->headers->getCookies() as $cookie) { + $entry->headers->setCookie($cookie); + } + } else { + // backend is slow as hell, send a 503 response (to avoid the dog pile effect) + $entry->setStatusCode(503); + $entry->setContent('503 Service Unavailable'); + $entry->headers->set('Retry-After', 10); + } + + return true; + } + + /** + * Writes the Response to the cache. + * + * @throws \Exception + */ + protected function store(Request $request, Response $response) + { + try { + $this->store->write($request, $response); + + $this->record($request, 'store'); + + $response->headers->set('Age', $response->getAge()); + } catch (\Exception $e) { + $this->record($request, 'store-failed'); + + if ($this->options['debug']) { + throw $e; + } + } + + // now that the response is cached, release the lock + $this->store->unlock($request); + } + + /** + * Restores the Response body. + */ + private function restoreResponseBody(Request $request, Response $response) + { + if ($response->headers->has('X-Body-Eval')) { + ob_start(); + + if ($response->headers->has('X-Body-File')) { + include $response->headers->get('X-Body-File'); + } else { + eval('; ?>'.$response->getContent().'setContent(ob_get_clean()); + $response->headers->remove('X-Body-Eval'); + if (!$response->headers->has('Transfer-Encoding')) { + $response->headers->set('Content-Length', \strlen($response->getContent())); + } + } elseif ($response->headers->has('X-Body-File')) { + // Response does not include possibly dynamic content (ESI, SSI), so we need + // not handle the content for HEAD requests + if (!$request->isMethod('HEAD')) { + $response->setContent(file_get_contents($response->headers->get('X-Body-File'))); + } + } else { + return; + } + + $response->headers->remove('X-Body-File'); + } + + protected function processResponseBody(Request $request, Response $response) + { + if (null !== $this->surrogate && $this->surrogate->needsParsing($response)) { + $this->surrogate->process($request, $response); + } + } + + /** + * Checks if the Request includes authorization or other sensitive information + * that should cause the Response to be considered private by default. + */ + private function isPrivateRequest(Request $request): bool + { + foreach ($this->options['private_headers'] as $key) { + $key = strtolower(str_replace('HTTP_', '', $key)); + + if ('cookie' === $key) { + if (\count($request->cookies->all())) { + return true; + } + } elseif ($request->headers->has($key)) { + return true; + } + } + + return false; + } + + /** + * Records that an event took place. + */ + private function record(Request $request, string $event) + { + $this->traces[$this->getTraceKey($request)][] = $event; + } + + /** + * Calculates the key we use in the "trace" array for a given request. + */ + private function getTraceKey(Request $request): string + { + $path = $request->getPathInfo(); + if ($qs = $request->getQueryString()) { + $path .= '?'.$qs; + } + + return $request->getMethod().' '.$path; + } + + /** + * Checks whether the given (cached) response may be served as "stale" when a revalidation + * is currently in progress. + */ + private function mayServeStaleWhileRevalidate(Response $entry): bool + { + $timeout = $entry->headers->getCacheControlDirective('stale-while-revalidate'); + + if (null === $timeout) { + $timeout = $this->options['stale_while_revalidate']; + } + + return abs($entry->getTtl()) < $timeout; + } + + /** + * Waits for the store to release a locked entry. + */ + private function waitForLock(Request $request): bool + { + $wait = 0; + while ($this->store->isLocked($request) && $wait < 100) { + usleep(50000); + ++$wait; + } + + return $wait < 100; + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php b/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php new file mode 100644 index 0000000..c30ffac --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php @@ -0,0 +1,213 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Response; + +/** + * ResponseCacheStrategy knows how to compute the Response cache HTTP header + * based on the different response cache headers. + * + * This implementation changes the master response TTL to the smallest TTL received + * or force validation if one of the surrogates has validation cache strategy. + * + * @author Fabien Potencier + */ +class ResponseCacheStrategy implements ResponseCacheStrategyInterface +{ + /** + * Cache-Control headers that are sent to the final response if they appear in ANY of the responses. + */ + private static $overrideDirectives = ['private', 'no-cache', 'no-store', 'no-transform', 'must-revalidate', 'proxy-revalidate']; + + /** + * Cache-Control headers that are sent to the final response if they appear in ALL of the responses. + */ + private static $inheritDirectives = ['public', 'immutable']; + + private $embeddedResponses = 0; + private $isNotCacheableResponseEmbedded = false; + private $age = 0; + private $flagDirectives = [ + 'no-cache' => null, + 'no-store' => null, + 'no-transform' => null, + 'must-revalidate' => null, + 'proxy-revalidate' => null, + 'public' => null, + 'private' => null, + 'immutable' => null, + ]; + private $ageDirectives = [ + 'max-age' => null, + 's-maxage' => null, + 'expires' => null, + ]; + + /** + * {@inheritdoc} + */ + public function add(Response $response) + { + ++$this->embeddedResponses; + + foreach (self::$overrideDirectives as $directive) { + if ($response->headers->hasCacheControlDirective($directive)) { + $this->flagDirectives[$directive] = true; + } + } + + foreach (self::$inheritDirectives as $directive) { + if (false !== $this->flagDirectives[$directive]) { + $this->flagDirectives[$directive] = $response->headers->hasCacheControlDirective($directive); + } + } + + $age = $response->getAge(); + $this->age = max($this->age, $age); + + if ($this->willMakeFinalResponseUncacheable($response)) { + $this->isNotCacheableResponseEmbedded = true; + + return; + } + + $this->storeRelativeAgeDirective('max-age', $response->headers->getCacheControlDirective('max-age'), $age); + $this->storeRelativeAgeDirective('s-maxage', $response->headers->getCacheControlDirective('s-maxage') ?: $response->headers->getCacheControlDirective('max-age'), $age); + + $expires = $response->getExpires(); + $expires = null !== $expires ? (int) $expires->format('U') - (int) $response->getDate()->format('U') : null; + $this->storeRelativeAgeDirective('expires', $expires >= 0 ? $expires : null, 0); + } + + /** + * {@inheritdoc} + */ + public function update(Response $response) + { + // if we have no embedded Response, do nothing + if (0 === $this->embeddedResponses) { + return; + } + + // Remove validation related headers of the master response, + // because some of the response content comes from at least + // one embedded response (which likely has a different caching strategy). + $response->setEtag(null); + $response->setLastModified(null); + + $this->add($response); + + $response->headers->set('Age', $this->age); + + if ($this->isNotCacheableResponseEmbedded) { + if ($this->flagDirectives['no-store']) { + $response->headers->set('Cache-Control', 'no-cache, no-store, must-revalidate'); + } else { + $response->headers->set('Cache-Control', 'no-cache, must-revalidate'); + } + + return; + } + + $flags = array_filter($this->flagDirectives); + + if (isset($flags['must-revalidate'])) { + $flags['no-cache'] = true; + } + + $response->headers->set('Cache-Control', implode(', ', array_keys($flags))); + + $maxAge = null; + + if (is_numeric($this->ageDirectives['max-age'])) { + $maxAge = $this->ageDirectives['max-age'] + $this->age; + $response->headers->addCacheControlDirective('max-age', $maxAge); + } + + if (is_numeric($this->ageDirectives['s-maxage'])) { + $sMaxage = $this->ageDirectives['s-maxage'] + $this->age; + + if ($maxAge !== $sMaxage) { + $response->headers->addCacheControlDirective('s-maxage', $sMaxage); + } + } + + if (is_numeric($this->ageDirectives['expires'])) { + $date = clone $response->getDate(); + $date->modify('+'.($this->ageDirectives['expires'] + $this->age).' seconds'); + $response->setExpires($date); + } + } + + /** + * RFC2616, Section 13.4. + * + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.4 + */ + private function willMakeFinalResponseUncacheable(Response $response): bool + { + // RFC2616: A response received with a status code of 200, 203, 300, 301 or 410 + // MAY be stored by a cache […] unless a cache-control directive prohibits caching. + if ($response->headers->hasCacheControlDirective('no-cache') + || $response->headers->getCacheControlDirective('no-store') + ) { + return true; + } + + // Last-Modified and Etag headers cannot be merged, they render the response uncacheable + // by default (except if the response also has max-age etc.). + if (\in_array($response->getStatusCode(), [200, 203, 300, 301, 410]) + && null === $response->getLastModified() + && null === $response->getEtag() + ) { + return false; + } + + // RFC2616: A response received with any other status code (e.g. status codes 302 and 307) + // MUST NOT be returned in a reply to a subsequent request unless there are + // cache-control directives or another header(s) that explicitly allow it. + $cacheControl = ['max-age', 's-maxage', 'must-revalidate', 'proxy-revalidate', 'public', 'private']; + foreach ($cacheControl as $key) { + if ($response->headers->hasCacheControlDirective($key)) { + return false; + } + } + + if ($response->headers->has('Expires')) { + return false; + } + + return true; + } + + /** + * Store lowest max-age/s-maxage/expires for the final response. + * + * The response might have been stored in cache a while ago. To keep things comparable, + * we have to subtract the age so that the value is normalized for an age of 0. + * + * If the value is lower than the currently stored value, we update the value, to keep a rolling + * minimal value of each instruction. If the value is NULL, the directive will not be set on the final response. + */ + private function storeRelativeAgeDirective(string $directive, ?int $value, int $age) + { + if (null === $value) { + $this->ageDirectives[$directive] = false; + } + + if (false !== $this->ageDirectives[$directive]) { + $value -= $age; + $this->ageDirectives[$directive] = null !== $this->ageDirectives[$directive] ? min($this->ageDirectives[$directive], $value) : $value; + } + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php b/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php new file mode 100644 index 0000000..e282299 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php @@ -0,0 +1,37 @@ + + * + * This code is partially based on the Rack-Cache library by Ryan Tomayko, + * which is released under the MIT license. + * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801) + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Response; + +/** + * ResponseCacheStrategyInterface implementations know how to compute the + * Response cache HTTP header based on the different response cache headers. + * + * @author Fabien Potencier + */ +interface ResponseCacheStrategyInterface +{ + /** + * Adds a Response. + */ + public function add(Response $response); + + /** + * Updates the Response HTTP headers based on the embedded Responses. + */ + public function update(Response $response); +} diff --git a/vendor/symfony/http-kernel/HttpCache/Ssi.php b/vendor/symfony/http-kernel/HttpCache/Ssi.php new file mode 100644 index 0000000..587c43a --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/Ssi.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * Ssi implements the SSI capabilities to Request and Response instances. + * + * @author Sebastian Krebs + */ +class Ssi extends AbstractSurrogate +{ + /** + * {@inheritdoc} + */ + public function getName() + { + return 'ssi'; + } + + /** + * {@inheritdoc} + */ + public function addSurrogateControl(Response $response) + { + if (false !== strpos($response->getContent(), '', $uri); + } + + /** + * {@inheritdoc} + */ + public function process(Request $request, Response $response) + { + $type = $response->headers->get('Content-Type'); + if (empty($type)) { + $type = 'text/html'; + } + + $parts = explode(';', $type); + if (!\in_array($parts[0], $this->contentTypes)) { + return $response; + } + + // we don't use a proper XML parser here as we can have SSI tags in a plain text response + $content = $response->getContent(); + + $chunks = preg_split('##', $content, -1, PREG_SPLIT_DELIM_CAPTURE); + $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]); + + $i = 1; + while (isset($chunks[$i])) { + $options = []; + preg_match_all('/(virtual)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER); + foreach ($matches as $set) { + $options[$set[1]] = $set[2]; + } + + if (!isset($options['virtual'])) { + throw new \RuntimeException('Unable to process an SSI tag without a "virtual" attribute.'); + } + + $chunks[$i] = sprintf('surrogate->handle($this, %s, \'\', false) ?>'."\n", + var_export($options['virtual'], true) + ); + ++$i; + $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]); + ++$i; + } + $content = implode('', $chunks); + + $response->setContent($content); + $response->headers->set('X-Body-Eval', 'SSI'); + + // remove SSI/1.0 from the Surrogate-Control header + $this->removeFromControl($response); + + return $response; + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/Store.php b/vendor/symfony/http-kernel/HttpCache/Store.php new file mode 100644 index 0000000..22a03f2 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/Store.php @@ -0,0 +1,473 @@ + + * + * This code is partially based on the Rack-Cache library by Ryan Tomayko, + * which is released under the MIT license. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * Store implements all the logic for storing cache metadata (Request and Response headers). + * + * @author Fabien Potencier + */ +class Store implements StoreInterface +{ + protected $root; + private $keyCache; + private $locks; + + /** + * @throws \RuntimeException + */ + public function __construct(string $root) + { + $this->root = $root; + if (!file_exists($this->root) && !@mkdir($this->root, 0777, true) && !is_dir($this->root)) { + throw new \RuntimeException(sprintf('Unable to create the store directory (%s).', $this->root)); + } + $this->keyCache = new \SplObjectStorage(); + $this->locks = []; + } + + /** + * Cleanups storage. + */ + public function cleanup() + { + // unlock everything + foreach ($this->locks as $lock) { + flock($lock, LOCK_UN); + fclose($lock); + } + + $this->locks = []; + } + + /** + * Tries to lock the cache for a given Request, without blocking. + * + * @return bool|string true if the lock is acquired, the path to the current lock otherwise + */ + public function lock(Request $request) + { + $key = $this->getCacheKey($request); + + if (!isset($this->locks[$key])) { + $path = $this->getPath($key); + if (!file_exists(\dirname($path)) && false === @mkdir(\dirname($path), 0777, true) && !is_dir(\dirname($path))) { + return $path; + } + $h = fopen($path, 'cb'); + if (!flock($h, LOCK_EX | LOCK_NB)) { + fclose($h); + + return $path; + } + + $this->locks[$key] = $h; + } + + return true; + } + + /** + * Releases the lock for the given Request. + * + * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise + */ + public function unlock(Request $request) + { + $key = $this->getCacheKey($request); + + if (isset($this->locks[$key])) { + flock($this->locks[$key], LOCK_UN); + fclose($this->locks[$key]); + unset($this->locks[$key]); + + return true; + } + + return false; + } + + public function isLocked(Request $request) + { + $key = $this->getCacheKey($request); + + if (isset($this->locks[$key])) { + return true; // shortcut if lock held by this process + } + + if (!file_exists($path = $this->getPath($key))) { + return false; + } + + $h = fopen($path, 'rb'); + flock($h, LOCK_EX | LOCK_NB, $wouldBlock); + flock($h, LOCK_UN); // release the lock we just acquired + fclose($h); + + return (bool) $wouldBlock; + } + + /** + * Locates a cached Response for the Request provided. + * + * @return Response|null A Response instance, or null if no cache entry was found + */ + public function lookup(Request $request) + { + $key = $this->getCacheKey($request); + + if (!$entries = $this->getMetadata($key)) { + return null; + } + + // find a cached entry that matches the request. + $match = null; + foreach ($entries as $entry) { + if ($this->requestsMatch(isset($entry[1]['vary'][0]) ? implode(', ', $entry[1]['vary']) : '', $request->headers->all(), $entry[0])) { + $match = $entry; + + break; + } + } + + if (null === $match) { + return null; + } + + $headers = $match[1]; + if (file_exists($path = $this->getPath($headers['x-content-digest'][0]))) { + return $this->restoreResponse($headers, $path); + } + + // TODO the metaStore referenced an entity that doesn't exist in + // the entityStore. We definitely want to return nil but we should + // also purge the entry from the meta-store when this is detected. + return null; + } + + /** + * Writes a cache entry to the store for the given Request and Response. + * + * Existing entries are read and any that match the response are removed. This + * method calls write with the new list of cache entries. + * + * @return string The key under which the response is stored + * + * @throws \RuntimeException + */ + public function write(Request $request, Response $response) + { + $key = $this->getCacheKey($request); + $storedEnv = $this->persistRequest($request); + + if ($response->headers->has('X-Body-File')) { + // Assume the response came from disk, but at least perform some safeguard checks + if (!$response->headers->has('X-Content-Digest')) { + throw new \RuntimeException('A restored response must have the X-Content-Digest header.'); + } + + $digest = $response->headers->get('X-Content-Digest'); + if ($this->getPath($digest) !== $response->headers->get('X-Body-File')) { + throw new \RuntimeException('X-Body-File and X-Content-Digest do not match.'); + } + // Everything seems ok, omit writing content to disk + } else { + $digest = $this->generateContentDigest($response); + $response->headers->set('X-Content-Digest', $digest); + + if (!$this->save($digest, $response->getContent(), false)) { + throw new \RuntimeException('Unable to store the entity.'); + } + + if (!$response->headers->has('Transfer-Encoding')) { + $response->headers->set('Content-Length', \strlen($response->getContent())); + } + } + + // read existing cache entries, remove non-varying, and add this one to the list + $entries = []; + $vary = $response->headers->get('vary'); + foreach ($this->getMetadata($key) as $entry) { + if (!isset($entry[1]['vary'][0])) { + $entry[1]['vary'] = ['']; + } + + if ($entry[1]['vary'][0] != $vary || !$this->requestsMatch($vary ?? '', $entry[0], $storedEnv)) { + $entries[] = $entry; + } + } + + $headers = $this->persistResponse($response); + unset($headers['age']); + + array_unshift($entries, [$storedEnv, $headers]); + + if (!$this->save($key, serialize($entries))) { + throw new \RuntimeException('Unable to store the metadata.'); + } + + return $key; + } + + /** + * Returns content digest for $response. + * + * @return string + */ + protected function generateContentDigest(Response $response) + { + return 'en'.hash('sha256', $response->getContent()); + } + + /** + * Invalidates all cache entries that match the request. + * + * @throws \RuntimeException + */ + public function invalidate(Request $request) + { + $modified = false; + $key = $this->getCacheKey($request); + + $entries = []; + foreach ($this->getMetadata($key) as $entry) { + $response = $this->restoreResponse($entry[1]); + if ($response->isFresh()) { + $response->expire(); + $modified = true; + $entries[] = [$entry[0], $this->persistResponse($response)]; + } else { + $entries[] = $entry; + } + } + + if ($modified && !$this->save($key, serialize($entries))) { + throw new \RuntimeException('Unable to store the metadata.'); + } + } + + /** + * Determines whether two Request HTTP header sets are non-varying based on + * the vary response header value provided. + * + * @param string|null $vary A Response vary header + * @param array $env1 A Request HTTP header array + * @param array $env2 A Request HTTP header array + */ + private function requestsMatch(?string $vary, array $env1, array $env2): bool + { + if (empty($vary)) { + return true; + } + + foreach (preg_split('/[\s,]+/', $vary) as $header) { + $key = str_replace('_', '-', strtolower($header)); + $v1 = isset($env1[$key]) ? $env1[$key] : null; + $v2 = isset($env2[$key]) ? $env2[$key] : null; + if ($v1 !== $v2) { + return false; + } + } + + return true; + } + + /** + * Gets all data associated with the given key. + * + * Use this method only if you know what you are doing. + */ + private function getMetadata(string $key): array + { + if (!$entries = $this->load($key)) { + return []; + } + + return unserialize($entries); + } + + /** + * Purges data for the given URL. + * + * This method purges both the HTTP and the HTTPS version of the cache entry. + * + * @return bool true if the URL exists with either HTTP or HTTPS scheme and has been purged, false otherwise + */ + public function purge(string $url) + { + $http = preg_replace('#^https:#', 'http:', $url); + $https = preg_replace('#^http:#', 'https:', $url); + + $purgedHttp = $this->doPurge($http); + $purgedHttps = $this->doPurge($https); + + return $purgedHttp || $purgedHttps; + } + + /** + * Purges data for the given URL. + */ + private function doPurge(string $url): bool + { + $key = $this->getCacheKey(Request::create($url)); + if (isset($this->locks[$key])) { + flock($this->locks[$key], LOCK_UN); + fclose($this->locks[$key]); + unset($this->locks[$key]); + } + + if (file_exists($path = $this->getPath($key))) { + unlink($path); + + return true; + } + + return false; + } + + /** + * Loads data for the given key. + */ + private function load(string $key): ?string + { + $path = $this->getPath($key); + + return file_exists($path) && false !== ($contents = file_get_contents($path)) ? $contents : null; + } + + /** + * Save data for the given key. + */ + private function save(string $key, string $data, bool $overwrite = true): bool + { + $path = $this->getPath($key); + + if (!$overwrite && file_exists($path)) { + return true; + } + + if (isset($this->locks[$key])) { + $fp = $this->locks[$key]; + @ftruncate($fp, 0); + @fseek($fp, 0); + $len = @fwrite($fp, $data); + if (\strlen($data) !== $len) { + @ftruncate($fp, 0); + + return false; + } + } else { + if (!file_exists(\dirname($path)) && false === @mkdir(\dirname($path), 0777, true) && !is_dir(\dirname($path))) { + return false; + } + + $tmpFile = tempnam(\dirname($path), basename($path)); + if (false === $fp = @fopen($tmpFile, 'wb')) { + @unlink($tmpFile); + + return false; + } + @fwrite($fp, $data); + @fclose($fp); + + if ($data != file_get_contents($tmpFile)) { + @unlink($tmpFile); + + return false; + } + + if (false === @rename($tmpFile, $path)) { + @unlink($tmpFile); + + return false; + } + } + + @chmod($path, 0666 & ~umask()); + + return true; + } + + public function getPath(string $key) + { + return $this->root.\DIRECTORY_SEPARATOR.substr($key, 0, 2).\DIRECTORY_SEPARATOR.substr($key, 2, 2).\DIRECTORY_SEPARATOR.substr($key, 4, 2).\DIRECTORY_SEPARATOR.substr($key, 6); + } + + /** + * Generates a cache key for the given Request. + * + * This method should return a key that must only depend on a + * normalized version of the request URI. + * + * If the same URI can have more than one representation, based on some + * headers, use a Vary header to indicate them, and each representation will + * be stored independently under the same cache key. + * + * @return string A key for the given Request + */ + protected function generateCacheKey(Request $request) + { + return 'md'.hash('sha256', $request->getUri()); + } + + /** + * Returns a cache key for the given Request. + */ + private function getCacheKey(Request $request): string + { + if (isset($this->keyCache[$request])) { + return $this->keyCache[$request]; + } + + return $this->keyCache[$request] = $this->generateCacheKey($request); + } + + /** + * Persists the Request HTTP headers. + */ + private function persistRequest(Request $request): array + { + return $request->headers->all(); + } + + /** + * Persists the Response HTTP headers. + */ + private function persistResponse(Response $response): array + { + $headers = $response->headers->all(); + $headers['X-Status'] = [$response->getStatusCode()]; + + return $headers; + } + + /** + * Restores a Response from the HTTP headers and body. + */ + private function restoreResponse(array $headers, string $path = null): Response + { + $status = $headers['X-Status'][0]; + unset($headers['X-Status']); + + if (null !== $path) { + $headers['X-Body-File'] = [$path]; + } + + return new Response($path, $status, $headers); + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/StoreInterface.php b/vendor/symfony/http-kernel/HttpCache/StoreInterface.php new file mode 100644 index 0000000..49d88c2 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/StoreInterface.php @@ -0,0 +1,81 @@ + + * + * This code is partially based on the Rack-Cache library by Ryan Tomayko, + * which is released under the MIT license. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * Interface implemented by HTTP cache stores. + * + * @author Fabien Potencier + */ +interface StoreInterface +{ + /** + * Locates a cached Response for the Request provided. + * + * @return Response|null A Response instance, or null if no cache entry was found + */ + public function lookup(Request $request); + + /** + * Writes a cache entry to the store for the given Request and Response. + * + * Existing entries are read and any that match the response are removed. This + * method calls write with the new list of cache entries. + * + * @return string The key under which the response is stored + */ + public function write(Request $request, Response $response); + + /** + * Invalidates all cache entries that match the request. + */ + public function invalidate(Request $request); + + /** + * Locks the cache for a given Request. + * + * @return bool|string true if the lock is acquired, the path to the current lock otherwise + */ + public function lock(Request $request); + + /** + * Releases the lock for the given Request. + * + * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise + */ + public function unlock(Request $request); + + /** + * Returns whether or not a lock exists. + * + * @return bool true if lock exists, false otherwise + */ + public function isLocked(Request $request); + + /** + * Purges data for the given URL. + * + * @return bool true if the URL exists and has been purged, false otherwise + */ + public function purge(string $url); + + /** + * Cleanups storage. + */ + public function cleanup(); +} diff --git a/vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php b/vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php new file mode 100644 index 0000000..294b964 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\IpUtils; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; + +/** + * @author Nicolas Grekas + * + * @internal + */ +class SubRequestHandler +{ + public static function handle(HttpKernelInterface $kernel, Request $request, int $type, bool $catch): Response + { + // save global state related to trusted headers and proxies + $trustedProxies = Request::getTrustedProxies(); + $trustedHeaderSet = Request::getTrustedHeaderSet(); + + // remove untrusted values + $remoteAddr = $request->server->get('REMOTE_ADDR'); + if (!IpUtils::checkIp($remoteAddr, $trustedProxies)) { + $trustedHeaders = [ + 'FORWARDED' => $trustedHeaderSet & Request::HEADER_FORWARDED, + 'X_FORWARDED_FOR' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_FOR, + 'X_FORWARDED_HOST' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_HOST, + 'X_FORWARDED_PROTO' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_PROTO, + 'X_FORWARDED_PORT' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_PORT, + ]; + foreach (array_filter($trustedHeaders) as $name => $key) { + $request->headers->remove($name); + $request->server->remove('HTTP_'.$name); + } + } + + // compute trusted values, taking any trusted proxies into account + $trustedIps = []; + $trustedValues = []; + foreach (array_reverse($request->getClientIps()) as $ip) { + $trustedIps[] = $ip; + $trustedValues[] = sprintf('for="%s"', $ip); + } + if ($ip !== $remoteAddr) { + $trustedIps[] = $remoteAddr; + $trustedValues[] = sprintf('for="%s"', $remoteAddr); + } + + // set trusted values, reusing as much as possible the global trusted settings + if (Request::HEADER_FORWARDED & $trustedHeaderSet) { + $trustedValues[0] .= sprintf(';host="%s";proto=%s', $request->getHttpHost(), $request->getScheme()); + $request->headers->set('Forwarded', $v = implode(', ', $trustedValues)); + $request->server->set('HTTP_FORWARDED', $v); + } + if (Request::HEADER_X_FORWARDED_FOR & $trustedHeaderSet) { + $request->headers->set('X-Forwarded-For', $v = implode(', ', $trustedIps)); + $request->server->set('HTTP_X_FORWARDED_FOR', $v); + } elseif (!(Request::HEADER_FORWARDED & $trustedHeaderSet)) { + Request::setTrustedProxies($trustedProxies, $trustedHeaderSet | Request::HEADER_X_FORWARDED_FOR); + $request->headers->set('X-Forwarded-For', $v = implode(', ', $trustedIps)); + $request->server->set('HTTP_X_FORWARDED_FOR', $v); + } + + // fix the client IP address by setting it to 127.0.0.1, + // which is the core responsibility of this method + $request->server->set('REMOTE_ADDR', '127.0.0.1'); + + // ensure 127.0.0.1 is set as trusted proxy + if (!IpUtils::checkIp('127.0.0.1', $trustedProxies)) { + Request::setTrustedProxies(array_merge($trustedProxies, ['127.0.0.1']), Request::getTrustedHeaderSet()); + } + + try { + return $kernel->handle($request, $type, $catch); + } finally { + // restore global state + Request::setTrustedProxies($trustedProxies, $trustedHeaderSet); + } + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php b/vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php new file mode 100644 index 0000000..53a7e2a --- /dev/null +++ b/vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\HttpCache; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +interface SurrogateInterface +{ + /** + * Returns surrogate name. + * + * @return string + */ + public function getName(); + + /** + * Returns a new cache strategy instance. + * + * @return ResponseCacheStrategyInterface A ResponseCacheStrategyInterface instance + */ + public function createCacheStrategy(); + + /** + * Checks that at least one surrogate has Surrogate capability. + * + * @return bool true if one surrogate has Surrogate capability, false otherwise + */ + public function hasSurrogateCapability(Request $request); + + /** + * Adds Surrogate-capability to the given Request. + */ + public function addSurrogateCapability(Request $request); + + /** + * Adds HTTP headers to specify that the Response needs to be parsed for Surrogate. + * + * This method only adds an Surrogate HTTP header if the Response has some Surrogate tags. + */ + public function addSurrogateControl(Response $response); + + /** + * Checks that the Response needs to be parsed for Surrogate tags. + * + * @return bool true if the Response needs to be parsed, false otherwise + */ + public function needsParsing(Response $response); + + /** + * Renders a Surrogate tag. + * + * @param string $alt An alternate URI + * @param string $comment A comment to add as an esi:include tag + * + * @return string + */ + public function renderIncludeTag(string $uri, string $alt = null, bool $ignoreErrors = true, string $comment = ''); + + /** + * Replaces a Response Surrogate tags with the included resource content. + * + * @return Response + */ + public function process(Request $request, Response $response); + + /** + * Handles a Surrogate from the cache. + * + * @param string $alt An alternative URI + * + * @return string + * + * @throws \RuntimeException + * @throws \Exception + */ + public function handle(HttpCache $cache, string $uri, string $alt, bool $ignoreErrors); +} diff --git a/vendor/symfony/http-kernel/HttpClientKernel.php b/vendor/symfony/http-kernel/HttpClientKernel.php new file mode 100644 index 0000000..a5e207d --- /dev/null +++ b/vendor/symfony/http-kernel/HttpClientKernel.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\HttpClient\HttpClient; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; +use Symfony\Component\Mime\Part\AbstractPart; +use Symfony\Component\Mime\Part\DataPart; +use Symfony\Component\Mime\Part\Multipart\FormDataPart; +use Symfony\Component\Mime\Part\TextPart; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(ResponseHeaderBag::class); + +/** + * An implementation of a Symfony HTTP kernel using a "real" HTTP client. + * + * @author Fabien Potencier + */ +final class HttpClientKernel implements HttpKernelInterface +{ + private $client; + + public function __construct(HttpClientInterface $client = null) + { + if (!class_exists(HttpClient::class)) { + throw new \LogicException(sprintf('You cannot use "%s" as the HttpClient component is not installed. Try running "composer require symfony/http-client".', __CLASS__)); + } + + $this->client = $client ?? HttpClient::create(); + } + + public function handle(Request $request, int $type = HttpKernelInterface::MASTER_REQUEST, bool $catch = true): Response + { + $headers = $this->getHeaders($request); + $body = ''; + if (null !== $part = $this->getBody($request)) { + $headers = array_merge($headers, $part->getPreparedHeaders()->toArray()); + $body = $part->bodyToIterable(); + } + $response = $this->client->request($request->getMethod(), $request->getUri(), [ + 'headers' => $headers, + 'body' => $body, + 'max_redirects' => 0, + ] + $request->attributes->get('http_client_options', [])); + + $response = new Response($response->getContent(!$catch), $response->getStatusCode(), $response->getHeaders(!$catch)); + + $response->headers->remove('X-Body-File'); + $response->headers->remove('X-Body-Eval'); + $response->headers->remove('X-Content-Digest'); + + $response->headers = new class($response->headers->all()) extends ResponseHeaderBag { + protected function computeCacheControlValue(): string + { + return $this->getCacheControlHeader(); // preserve the original value + } + }; + + return $response; + } + + private function getBody(Request $request): ?AbstractPart + { + if (\in_array($request->getMethod(), ['GET', 'HEAD'])) { + return null; + } + + if (!class_exists(AbstractPart::class)) { + throw new \LogicException('You cannot pass non-empty bodies as the Mime component is not installed. Try running "composer require symfony/mime".'); + } + + if ($content = $request->getContent()) { + return new TextPart($content, 'utf-8', 'plain', '8bit'); + } + + $fields = $request->request->all(); + foreach ($request->files->all() as $name => $file) { + $fields[$name] = DataPart::fromPath($file->getPathname(), $file->getClientOriginalName(), $file->getClientMimeType()); + } + + return new FormDataPart($fields); + } + + private function getHeaders(Request $request): array + { + $headers = []; + foreach ($request->headers as $key => $value) { + $headers[$key] = $value; + } + $cookies = []; + foreach ($request->cookies->all() as $name => $value) { + $cookies[] = $name.'='.$value; + } + if ($cookies) { + $headers['cookie'] = implode('; ', $cookies); + } + + return $headers; + } +} diff --git a/vendor/symfony/http-kernel/HttpKernel.php b/vendor/symfony/http-kernel/HttpKernel.php new file mode 100644 index 0000000..8503313 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpKernel.php @@ -0,0 +1,294 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Controller\ArgumentResolver; +use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface; +use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; +use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent; +use Symfony\Component\HttpKernel\Event\ControllerEvent; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\Event\FinishRequestEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\Event\ResponseEvent; +use Symfony\Component\HttpKernel\Event\TerminateEvent; +use Symfony\Component\HttpKernel\Event\ViewEvent; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\Exception\ControllerDoesNotReturnResponseException; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(LegacyEventDispatcherProxy::class); +class_exists(ControllerArgumentsEvent::class); +class_exists(ControllerEvent::class); +class_exists(ExceptionEvent::class); +class_exists(FinishRequestEvent::class); +class_exists(RequestEvent::class); +class_exists(ResponseEvent::class); +class_exists(TerminateEvent::class); +class_exists(ViewEvent::class); +class_exists(KernelEvents::class); + +/** + * HttpKernel notifies events to convert a Request object to a Response one. + * + * @author Fabien Potencier + */ +class HttpKernel implements HttpKernelInterface, TerminableInterface +{ + protected $dispatcher; + protected $resolver; + protected $requestStack; + private $argumentResolver; + + public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null, ArgumentResolverInterface $argumentResolver = null) + { + $this->dispatcher = $dispatcher; + $this->resolver = $resolver; + $this->requestStack = $requestStack ?: new RequestStack(); + $this->argumentResolver = $argumentResolver; + + if (null === $this->argumentResolver) { + $this->argumentResolver = new ArgumentResolver(); + } + } + + /** + * {@inheritdoc} + */ + public function handle(Request $request, int $type = HttpKernelInterface::MASTER_REQUEST, bool $catch = true) + { + $request->headers->set('X-Php-Ob-Level', (string) ob_get_level()); + + try { + return $this->handleRaw($request, $type); + } catch (\Exception $e) { + if ($e instanceof RequestExceptionInterface) { + $e = new BadRequestHttpException($e->getMessage(), $e); + } + if (false === $catch) { + $this->finishRequest($request, $type); + + throw $e; + } + + return $this->handleThrowable($e, $request, $type); + } + } + + /** + * {@inheritdoc} + */ + public function terminate(Request $request, Response $response) + { + $this->dispatcher->dispatch(new TerminateEvent($this, $request, $response), KernelEvents::TERMINATE); + } + + /** + * @internal + */ + public function terminateWithException(\Throwable $exception, Request $request = null) + { + if (!$request = $request ?: $this->requestStack->getMasterRequest()) { + throw $exception; + } + + $response = $this->handleThrowable($exception, $request, self::MASTER_REQUEST); + + $response->sendHeaders(); + $response->sendContent(); + + $this->terminate($request, $response); + } + + /** + * Handles a request to convert it to a response. + * + * Exceptions are not caught. + * + * @throws \LogicException If one of the listener does not behave as expected + * @throws NotFoundHttpException When controller cannot be found + */ + private function handleRaw(Request $request, int $type = self::MASTER_REQUEST): Response + { + $this->requestStack->push($request); + + // request + $event = new RequestEvent($this, $request, $type); + $this->dispatcher->dispatch($event, KernelEvents::REQUEST); + + if ($event->hasResponse()) { + return $this->filterResponse($event->getResponse(), $request, $type); + } + + // load controller + if (false === $controller = $this->resolver->getController($request)) { + throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". The route is wrongly configured.', $request->getPathInfo())); + } + + $event = new ControllerEvent($this, $controller, $request, $type); + $this->dispatcher->dispatch($event, KernelEvents::CONTROLLER); + $controller = $event->getController(); + + // controller arguments + $arguments = $this->argumentResolver->getArguments($request, $controller); + + $event = new ControllerArgumentsEvent($this, $controller, $arguments, $request, $type); + $this->dispatcher->dispatch($event, KernelEvents::CONTROLLER_ARGUMENTS); + $controller = $event->getController(); + $arguments = $event->getArguments(); + + // call controller + $response = $controller(...$arguments); + + // view + if (!$response instanceof Response) { + $event = new ViewEvent($this, $request, $type, $response); + $this->dispatcher->dispatch($event, KernelEvents::VIEW); + + if ($event->hasResponse()) { + $response = $event->getResponse(); + } else { + $msg = sprintf('The controller must return a "Symfony\Component\HttpFoundation\Response" object but it returned %s.', $this->varToString($response)); + + // the user may have forgotten to return something + if (null === $response) { + $msg .= ' Did you forget to add a return statement somewhere in your controller?'; + } + + throw new ControllerDoesNotReturnResponseException($msg, $controller, __FILE__, __LINE__ - 17); + } + } + + return $this->filterResponse($response, $request, $type); + } + + /** + * Filters a response object. + * + * @throws \RuntimeException if the passed object is not a Response instance + */ + private function filterResponse(Response $response, Request $request, int $type): Response + { + $event = new ResponseEvent($this, $request, $type, $response); + + $this->dispatcher->dispatch($event, KernelEvents::RESPONSE); + + $this->finishRequest($request, $type); + + return $event->getResponse(); + } + + /** + * Publishes the finish request event, then pop the request from the stack. + * + * Note that the order of the operations is important here, otherwise + * operations such as {@link RequestStack::getParentRequest()} can lead to + * weird results. + */ + private function finishRequest(Request $request, int $type) + { + $this->dispatcher->dispatch(new FinishRequestEvent($this, $request, $type), KernelEvents::FINISH_REQUEST); + $this->requestStack->pop(); + } + + /** + * Handles a throwable by trying to convert it to a Response. + * + * @throws \Exception + */ + private function handleThrowable(\Throwable $e, Request $request, int $type): Response + { + $event = new ExceptionEvent($this, $request, $type, $e); + $this->dispatcher->dispatch($event, KernelEvents::EXCEPTION); + + // a listener might have replaced the exception + $e = $event->getThrowable(); + + if (!$event->hasResponse()) { + $this->finishRequest($request, $type); + + throw $e; + } + + $response = $event->getResponse(); + + // the developer asked for a specific status code + if (!$event->isAllowingCustomResponseCode() && !$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) { + // ensure that we actually have an error response + if ($e instanceof HttpExceptionInterface) { + // keep the HTTP status code and headers + $response->setStatusCode($e->getStatusCode()); + $response->headers->add($e->getHeaders()); + } else { + $response->setStatusCode(500); + } + } + + try { + return $this->filterResponse($response, $request, $type); + } catch (\Exception $e) { + return $response; + } + } + + /** + * Returns a human-readable string for the specified variable. + */ + private function varToString($var): string + { + if (\is_object($var)) { + return sprintf('an object of type %s', \get_class($var)); + } + + if (\is_array($var)) { + $a = []; + foreach ($var as $k => $v) { + $a[] = sprintf('%s => ...', $k); + } + + return sprintf('an array ([%s])', mb_substr(implode(', ', $a), 0, 255)); + } + + if (\is_resource($var)) { + return sprintf('a resource (%s)', get_resource_type($var)); + } + + if (null === $var) { + return 'null'; + } + + if (false === $var) { + return 'a boolean value (false)'; + } + + if (true === $var) { + return 'a boolean value (true)'; + } + + if (\is_string($var)) { + return sprintf('a string ("%s%s")', mb_substr($var, 0, 255), mb_strlen($var) > 255 ? '...' : ''); + } + + if (is_numeric($var)) { + return sprintf('a number (%s)', (string) $var); + } + + return (string) $var; + } +} diff --git a/vendor/symfony/http-kernel/HttpKernelBrowser.php b/vendor/symfony/http-kernel/HttpKernelBrowser.php new file mode 100644 index 0000000..d28be99 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpKernelBrowser.php @@ -0,0 +1,199 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\BrowserKit\AbstractBrowser; +use Symfony\Component\BrowserKit\CookieJar; +use Symfony\Component\BrowserKit\History; +use Symfony\Component\BrowserKit\Request as DomRequest; +use Symfony\Component\BrowserKit\Response as DomResponse; +use Symfony\Component\HttpFoundation\File\UploadedFile; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * Simulates a browser and makes requests to an HttpKernel instance. + * + * @author Fabien Potencier + * + * @method Request getRequest() A Request instance + * @method Response getResponse() A Response instance + */ +class HttpKernelBrowser extends AbstractBrowser +{ + protected $kernel; + private $catchExceptions = true; + + /** + * @param array $server The server parameters (equivalent of $_SERVER) + */ + public function __construct(HttpKernelInterface $kernel, array $server = [], History $history = null, CookieJar $cookieJar = null) + { + // These class properties must be set before calling the parent constructor, as it may depend on it. + $this->kernel = $kernel; + $this->followRedirects = false; + + parent::__construct($server, $history, $cookieJar); + } + + /** + * Sets whether to catch exceptions when the kernel is handling a request. + */ + public function catchExceptions(bool $catchExceptions) + { + $this->catchExceptions = $catchExceptions; + } + + /** + * Makes a request. + * + * @return Response A Response instance + */ + protected function doRequest($request) + { + $response = $this->kernel->handle($request, HttpKernelInterface::MASTER_REQUEST, $this->catchExceptions); + + if ($this->kernel instanceof TerminableInterface) { + $this->kernel->terminate($request, $response); + } + + return $response; + } + + /** + * Returns the script to execute when the request must be insulated. + * + * @return string + */ + protected function getScript($request) + { + $kernel = var_export(serialize($this->kernel), true); + $request = var_export(serialize($request), true); + + $errorReporting = error_reporting(); + + $requires = ''; + foreach (get_declared_classes() as $class) { + if (0 === strpos($class, 'ComposerAutoloaderInit')) { + $r = new \ReflectionClass($class); + $file = \dirname($r->getFileName(), 2).'/autoload.php'; + if (file_exists($file)) { + $requires .= 'require_once '.var_export($file, true).";\n"; + } + } + } + + if (!$requires) { + throw new \RuntimeException('Composer autoloader not found.'); + } + + $code = <<getHandleScript(); + } + + protected function getHandleScript() + { + return <<<'EOF' +$response = $kernel->handle($request); + +if ($kernel instanceof Symfony\Component\HttpKernel\TerminableInterface) { + $kernel->terminate($request, $response); +} + +echo serialize($response); +EOF; + } + + /** + * Converts the BrowserKit request to a HttpKernel request. + * + * @return Request A Request instance + */ + protected function filterRequest(DomRequest $request) + { + $httpRequest = Request::create($request->getUri(), $request->getMethod(), $request->getParameters(), $request->getCookies(), $request->getFiles(), $request->getServer(), $request->getContent()); + + foreach ($this->filterFiles($httpRequest->files->all()) as $key => $value) { + $httpRequest->files->set($key, $value); + } + + return $httpRequest; + } + + /** + * Filters an array of files. + * + * This method created test instances of UploadedFile so that the move() + * method can be called on those instances. + * + * If the size of a file is greater than the allowed size (from php.ini) then + * an invalid UploadedFile is returned with an error set to UPLOAD_ERR_INI_SIZE. + * + * @see UploadedFile + * + * @return array An array with all uploaded files marked as already moved + */ + protected function filterFiles(array $files) + { + $filtered = []; + foreach ($files as $key => $value) { + if (\is_array($value)) { + $filtered[$key] = $this->filterFiles($value); + } elseif ($value instanceof UploadedFile) { + if ($value->isValid() && $value->getSize() > UploadedFile::getMaxFilesize()) { + $filtered[$key] = new UploadedFile( + '', + $value->getClientOriginalName(), + $value->getClientMimeType(), + UPLOAD_ERR_INI_SIZE, + true + ); + } else { + $filtered[$key] = new UploadedFile( + $value->getPathname(), + $value->getClientOriginalName(), + $value->getClientMimeType(), + $value->getError(), + true + ); + } + } + } + + return $filtered; + } + + /** + * Converts the HttpKernel response to a BrowserKit response. + * + * @return DomResponse A DomResponse instance + */ + protected function filterResponse($response) + { + // this is needed to support StreamedResponse + ob_start(); + $response->sendContent(); + $content = ob_get_clean(); + + return new DomResponse($content, $response->getStatusCode(), $response->headers->all()); + } +} diff --git a/vendor/symfony/http-kernel/HttpKernelInterface.php b/vendor/symfony/http-kernel/HttpKernelInterface.php new file mode 100644 index 0000000..a75d1a8 --- /dev/null +++ b/vendor/symfony/http-kernel/HttpKernelInterface.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * HttpKernelInterface handles a Request to convert it to a Response. + * + * @author Fabien Potencier + */ +interface HttpKernelInterface +{ + const MASTER_REQUEST = 1; + const SUB_REQUEST = 2; + + /** + * Handles a Request to convert it to a Response. + * + * When $catch is true, the implementation must catch all exceptions + * and do its best to convert them to a Response instance. + * + * @param int $type The type of the request + * (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST) + * @param bool $catch Whether to catch exceptions or not + * + * @return Response A Response instance + * + * @throws \Exception When an Exception occurs during processing + */ + public function handle(Request $request, int $type = self::MASTER_REQUEST, bool $catch = true); +} diff --git a/vendor/symfony/http-kernel/Kernel.php b/vendor/symfony/http-kernel/Kernel.php new file mode 100644 index 0000000..c90c77a --- /dev/null +++ b/vendor/symfony/http-kernel/Kernel.php @@ -0,0 +1,825 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator; +use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper; +use Symfony\Component\Config\ConfigCache; +use Symfony\Component\Config\Loader\DelegatingLoader; +use Symfony\Component\Config\Loader\LoaderResolver; +use Symfony\Component\Debug\DebugClassLoader as LegacyDebugClassLoader; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\PassConfig; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\Dumper\PhpDumper; +use Symfony\Component\DependencyInjection\Dumper\Preloader; +use Symfony\Component\DependencyInjection\Loader\ClosureLoader; +use Symfony\Component\DependencyInjection\Loader\DirectoryLoader; +use Symfony\Component\DependencyInjection\Loader\GlobFileLoader; +use Symfony\Component\DependencyInjection\Loader\IniFileLoader; +use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; +use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +use Symfony\Component\ErrorHandler\DebugClassLoader; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Bundle\BundleInterface; +use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface; +use Symfony\Component\HttpKernel\Config\FileLocator; +use Symfony\Component\HttpKernel\DependencyInjection\AddAnnotatedClassesToCachePass; +use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass; + +// Help opcache.preload discover always-needed symbols +class_exists(ConfigCache::class); + +/** + * The Kernel is the heart of the Symfony system. + * + * It manages an environment made of bundles. + * + * Environment names must always start with a letter and + * they must only contain letters and numbers. + * + * @author Fabien Potencier + */ +abstract class Kernel implements KernelInterface, RebootableInterface, TerminableInterface +{ + /** + * @var BundleInterface[] + */ + protected $bundles = []; + + protected $container; + protected $environment; + protected $debug; + protected $booted = false; + protected $startTime; + + private $projectDir; + private $warmupDir; + private $requestStackSize = 0; + private $resetServices = false; + + private static $freshCache = []; + + const VERSION = '5.1.5'; + const VERSION_ID = 50105; + const MAJOR_VERSION = 5; + const MINOR_VERSION = 1; + const RELEASE_VERSION = 5; + const EXTRA_VERSION = ''; + + const END_OF_MAINTENANCE = '01/2021'; + const END_OF_LIFE = '01/2021'; + + public function __construct(string $environment, bool $debug) + { + $this->environment = $environment; + $this->debug = $debug; + } + + public function __clone() + { + $this->booted = false; + $this->container = null; + $this->requestStackSize = 0; + $this->resetServices = false; + } + + /** + * {@inheritdoc} + */ + public function boot() + { + if (true === $this->booted) { + if (!$this->requestStackSize && $this->resetServices) { + if ($this->container->has('services_resetter')) { + $this->container->get('services_resetter')->reset(); + } + $this->resetServices = false; + if ($this->debug) { + $this->startTime = microtime(true); + } + } + + return; + } + if ($this->debug) { + $this->startTime = microtime(true); + } + if ($this->debug && !isset($_ENV['SHELL_VERBOSITY']) && !isset($_SERVER['SHELL_VERBOSITY'])) { + putenv('SHELL_VERBOSITY=3'); + $_ENV['SHELL_VERBOSITY'] = 3; + $_SERVER['SHELL_VERBOSITY'] = 3; + } + + // init bundles + $this->initializeBundles(); + + // init container + $this->initializeContainer(); + + foreach ($this->getBundles() as $bundle) { + $bundle->setContainer($this->container); + $bundle->boot(); + } + + $this->booted = true; + } + + /** + * {@inheritdoc} + */ + public function reboot(?string $warmupDir) + { + $this->shutdown(); + $this->warmupDir = $warmupDir; + $this->boot(); + } + + /** + * {@inheritdoc} + */ + public function terminate(Request $request, Response $response) + { + if (false === $this->booted) { + return; + } + + if ($this->getHttpKernel() instanceof TerminableInterface) { + $this->getHttpKernel()->terminate($request, $response); + } + } + + /** + * {@inheritdoc} + */ + public function shutdown() + { + if (false === $this->booted) { + return; + } + + $this->booted = false; + + foreach ($this->getBundles() as $bundle) { + $bundle->shutdown(); + $bundle->setContainer(null); + } + + $this->container = null; + $this->requestStackSize = 0; + $this->resetServices = false; + } + + /** + * {@inheritdoc} + */ + public function handle(Request $request, int $type = HttpKernelInterface::MASTER_REQUEST, bool $catch = true) + { + $this->boot(); + ++$this->requestStackSize; + $this->resetServices = true; + + try { + return $this->getHttpKernel()->handle($request, $type, $catch); + } finally { + --$this->requestStackSize; + } + } + + /** + * Gets a HTTP kernel from the container. + * + * @return HttpKernelInterface + */ + protected function getHttpKernel() + { + return $this->container->get('http_kernel'); + } + + /** + * {@inheritdoc} + */ + public function getBundles() + { + return $this->bundles; + } + + /** + * {@inheritdoc} + */ + public function getBundle(string $name) + { + if (!isset($this->bundles[$name])) { + throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the "registerBundles()" method of your "%s.php" file?', $name, get_debug_type($this))); + } + + return $this->bundles[$name]; + } + + /** + * {@inheritdoc} + */ + public function locateResource(string $name) + { + if ('@' !== $name[0]) { + throw new \InvalidArgumentException(sprintf('A resource name must start with @ ("%s" given).', $name)); + } + + if (false !== strpos($name, '..')) { + throw new \RuntimeException(sprintf('File name "%s" contains invalid characters (..).', $name)); + } + + $bundleName = substr($name, 1); + $path = ''; + if (false !== strpos($bundleName, '/')) { + list($bundleName, $path) = explode('/', $bundleName, 2); + } + + $bundle = $this->getBundle($bundleName); + if (file_exists($file = $bundle->getPath().'/'.$path)) { + return $file; + } + + throw new \InvalidArgumentException(sprintf('Unable to find file "%s".', $name)); + } + + /** + * {@inheritdoc} + */ + public function getEnvironment() + { + return $this->environment; + } + + /** + * {@inheritdoc} + */ + public function isDebug() + { + return $this->debug; + } + + /** + * Gets the application root dir (path of the project's composer file). + * + * @return string The project root dir + */ + public function getProjectDir() + { + if (null === $this->projectDir) { + $r = new \ReflectionObject($this); + + if (!is_file($dir = $r->getFileName())) { + throw new \LogicException(sprintf('Cannot auto-detect project dir for kernel of class "%s".', $r->name)); + } + + $dir = $rootDir = \dirname($dir); + while (!is_file($dir.'/composer.json')) { + if ($dir === \dirname($dir)) { + return $this->projectDir = $rootDir; + } + $dir = \dirname($dir); + } + $this->projectDir = $dir; + } + + return $this->projectDir; + } + + /** + * {@inheritdoc} + */ + public function getContainer() + { + if (!$this->container) { + throw new \LogicException('Cannot retrieve the container from a non-booted kernel.'); + } + + return $this->container; + } + + /** + * @internal + */ + public function setAnnotatedClassCache(array $annotatedClasses) + { + file_put_contents(($this->warmupDir ?: $this->getCacheDir()).'/annotations.map', sprintf('debug && null !== $this->startTime ? $this->startTime : -INF; + } + + /** + * {@inheritdoc} + */ + public function getCacheDir() + { + return $this->getProjectDir().'/var/cache/'.$this->environment; + } + + /** + * {@inheritdoc} + */ + public function getLogDir() + { + return $this->getProjectDir().'/var/log'; + } + + /** + * {@inheritdoc} + */ + public function getCharset() + { + return 'UTF-8'; + } + + /** + * Gets the patterns defining the classes to parse and cache for annotations. + */ + public function getAnnotatedClassesToCompile(): array + { + return []; + } + + /** + * Initializes bundles. + * + * @throws \LogicException if two bundles share a common name + */ + protected function initializeBundles() + { + // init bundles + $this->bundles = []; + foreach ($this->registerBundles() as $bundle) { + $name = $bundle->getName(); + if (isset($this->bundles[$name])) { + throw new \LogicException(sprintf('Trying to register two bundles with the same name "%s".', $name)); + } + $this->bundles[$name] = $bundle; + } + } + + /** + * The extension point similar to the Bundle::build() method. + * + * Use this method to register compiler passes and manipulate the container during the building process. + */ + protected function build(ContainerBuilder $container) + { + } + + /** + * Gets the container class. + * + * @throws \InvalidArgumentException If the generated classname is invalid + * + * @return string The container class + */ + protected function getContainerClass() + { + $class = static::class; + $class = false !== strpos($class, "@anonymous\0") ? get_parent_class($class).str_replace('.', '_', ContainerBuilder::hash($class)) : $class; + $class = str_replace('\\', '_', $class).ucfirst($this->environment).($this->debug ? 'Debug' : '').'Container'; + + if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $class)) { + throw new \InvalidArgumentException(sprintf('The environment "%s" contains invalid characters, it can only contain characters allowed in PHP class names.', $this->environment)); + } + + return $class; + } + + /** + * Gets the container's base class. + * + * All names except Container must be fully qualified. + * + * @return string + */ + protected function getContainerBaseClass() + { + return 'Container'; + } + + /** + * Initializes the service container. + * + * The cached version of the service container is used when fresh, otherwise the + * container is built. + */ + protected function initializeContainer() + { + $class = $this->getContainerClass(); + $cacheDir = $this->warmupDir ?: $this->getCacheDir(); + $cache = new ConfigCache($cacheDir.'/'.$class.'.php', $this->debug); + $cachePath = $cache->getPath(); + + // Silence E_WARNING to ignore "include" failures - don't use "@" to prevent silencing fatal errors + $errorLevel = error_reporting(E_ALL ^ E_WARNING); + + try { + if (is_file($cachePath) && \is_object($this->container = include $cachePath) + && (!$this->debug || (self::$freshCache[$cachePath] ?? $cache->isFresh())) + ) { + self::$freshCache[$cachePath] = true; + $this->container->set('kernel', $this); + error_reporting($errorLevel); + + return; + } + } catch (\Throwable $e) { + } + + $oldContainer = \is_object($this->container) ? new \ReflectionClass($this->container) : $this->container = null; + + try { + is_dir($cacheDir) ?: mkdir($cacheDir, 0777, true); + + if ($lock = fopen($cachePath.'.lock', 'w')) { + flock($lock, LOCK_EX | LOCK_NB, $wouldBlock); + + if (!flock($lock, $wouldBlock ? LOCK_SH : LOCK_EX)) { + fclose($lock); + $lock = null; + } elseif (!\is_object($this->container = include $cachePath)) { + $this->container = null; + } elseif (!$oldContainer || \get_class($this->container) !== $oldContainer->name) { + flock($lock, LOCK_UN); + fclose($lock); + $this->container->set('kernel', $this); + + return; + } + } + } catch (\Throwable $e) { + } finally { + error_reporting($errorLevel); + } + + if ($collectDeprecations = $this->debug && !\defined('PHPUNIT_COMPOSER_INSTALL')) { + $collectedLogs = []; + $previousHandler = set_error_handler(function ($type, $message, $file, $line) use (&$collectedLogs, &$previousHandler) { + if (E_USER_DEPRECATED !== $type && E_DEPRECATED !== $type) { + return $previousHandler ? $previousHandler($type, $message, $file, $line) : false; + } + + if (isset($collectedLogs[$message])) { + ++$collectedLogs[$message]['count']; + + return null; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5); + // Clean the trace by removing first frames added by the error handler itself. + for ($i = 0; isset($backtrace[$i]); ++$i) { + if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) { + $backtrace = \array_slice($backtrace, 1 + $i); + break; + } + } + for ($i = 0; isset($backtrace[$i]); ++$i) { + if (!isset($backtrace[$i]['file'], $backtrace[$i]['line'], $backtrace[$i]['function'])) { + continue; + } + if (!isset($backtrace[$i]['class']) && 'trigger_deprecation' === $backtrace[$i]['function']) { + $file = $backtrace[$i]['file']; + $line = $backtrace[$i]['line']; + $backtrace = \array_slice($backtrace, 1 + $i); + break; + } + } + + // Remove frames added by DebugClassLoader. + for ($i = \count($backtrace) - 2; 0 < $i; --$i) { + if (\in_array($backtrace[$i]['class'] ?? null, [DebugClassLoader::class, LegacyDebugClassLoader::class], true)) { + $backtrace = [$backtrace[$i + 1]]; + break; + } + } + + $collectedLogs[$message] = [ + 'type' => $type, + 'message' => $message, + 'file' => $file, + 'line' => $line, + 'trace' => [$backtrace[0]], + 'count' => 1, + ]; + + return null; + }); + } + + try { + $container = null; + $container = $this->buildContainer(); + $container->compile(); + } finally { + if ($collectDeprecations) { + restore_error_handler(); + + file_put_contents($cacheDir.'/'.$class.'Deprecations.log', serialize(array_values($collectedLogs))); + file_put_contents($cacheDir.'/'.$class.'Compiler.log', null !== $container ? implode("\n", $container->getCompiler()->getLog()) : ''); + } + } + + $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass()); + + if ($lock) { + flock($lock, LOCK_UN); + fclose($lock); + } + + $this->container = require $cachePath; + $this->container->set('kernel', $this); + + if ($oldContainer && \get_class($this->container) !== $oldContainer->name) { + // Because concurrent requests might still be using them, + // old container files are not removed immediately, + // but on a next dump of the container. + static $legacyContainers = []; + $oldContainerDir = \dirname($oldContainer->getFileName()); + $legacyContainers[$oldContainerDir.'.legacy'] = true; + foreach (glob(\dirname($oldContainerDir).\DIRECTORY_SEPARATOR.'*.legacy', GLOB_NOSORT) as $legacyContainer) { + if (!isset($legacyContainers[$legacyContainer]) && @unlink($legacyContainer)) { + (new Filesystem())->remove(substr($legacyContainer, 0, -7)); + } + } + + touch($oldContainerDir.'.legacy'); + } + + $preload = $this instanceof WarmableInterface ? (array) $this->warmUp($this->container->getParameter('kernel.cache_dir')) : []; + + if ($this->container->has('cache_warmer')) { + $preload = array_merge($preload, (array) $this->container->get('cache_warmer')->warmUp($this->container->getParameter('kernel.cache_dir'))); + } + + if ($preload && method_exists(Preloader::class, 'append') && file_exists($preloadFile = $cacheDir.'/'.$class.'.preload.php')) { + Preloader::append($preloadFile, $preload); + } + } + + /** + * Returns the kernel parameters. + * + * @return array An array of kernel parameters + */ + protected function getKernelParameters() + { + $bundles = []; + $bundlesMetadata = []; + + foreach ($this->bundles as $name => $bundle) { + $bundles[$name] = \get_class($bundle); + $bundlesMetadata[$name] = [ + 'path' => $bundle->getPath(), + 'namespace' => $bundle->getNamespace(), + ]; + } + + return [ + 'kernel.project_dir' => realpath($this->getProjectDir()) ?: $this->getProjectDir(), + 'kernel.environment' => $this->environment, + 'kernel.debug' => $this->debug, + 'kernel.cache_dir' => realpath($cacheDir = $this->warmupDir ?: $this->getCacheDir()) ?: $cacheDir, + 'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(), + 'kernel.bundles' => $bundles, + 'kernel.bundles_metadata' => $bundlesMetadata, + 'kernel.charset' => $this->getCharset(), + 'kernel.container_class' => $this->getContainerClass(), + ]; + } + + /** + * Builds the service container. + * + * @return ContainerBuilder The compiled service container + * + * @throws \RuntimeException + */ + protected function buildContainer() + { + foreach (['cache' => $this->warmupDir ?: $this->getCacheDir(), 'logs' => $this->getLogDir()] as $name => $dir) { + if (!is_dir($dir)) { + if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) { + throw new \RuntimeException(sprintf('Unable to create the "%s" directory (%s).', $name, $dir)); + } + } elseif (!is_writable($dir)) { + throw new \RuntimeException(sprintf('Unable to write in the "%s" directory (%s).', $name, $dir)); + } + } + + $container = $this->getContainerBuilder(); + $container->addObjectResource($this); + $this->prepareContainer($container); + + if (null !== $cont = $this->registerContainerConfiguration($this->getContainerLoader($container))) { + $container->merge($cont); + } + + $container->addCompilerPass(new AddAnnotatedClassesToCachePass($this)); + + return $container; + } + + /** + * Prepares the ContainerBuilder before it is compiled. + */ + protected function prepareContainer(ContainerBuilder $container) + { + $extensions = []; + foreach ($this->bundles as $bundle) { + if ($extension = $bundle->getContainerExtension()) { + $container->registerExtension($extension); + } + + if ($this->debug) { + $container->addObjectResource($bundle); + } + } + + foreach ($this->bundles as $bundle) { + $bundle->build($container); + } + + $this->build($container); + + foreach ($container->getExtensions() as $extension) { + $extensions[] = $extension->getAlias(); + } + + // ensure these extensions are implicitly loaded + $container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions)); + } + + /** + * Gets a new ContainerBuilder instance used to build the service container. + * + * @return ContainerBuilder + */ + protected function getContainerBuilder() + { + $container = new ContainerBuilder(); + $container->getParameterBag()->add($this->getKernelParameters()); + + if ($this instanceof CompilerPassInterface) { + $container->addCompilerPass($this, PassConfig::TYPE_BEFORE_OPTIMIZATION, -10000); + } + if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator')) { + $container->setProxyInstantiator(new RuntimeInstantiator()); + } + + return $container; + } + + /** + * Dumps the service container to PHP code in the cache. + * + * @param string $class The name of the class to generate + * @param string $baseClass The name of the container's base class + */ + protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, string $class, string $baseClass) + { + // cache the container + $dumper = new PhpDumper($container); + + if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper')) { + $dumper->setProxyDumper(new ProxyDumper()); + } + + $content = $dumper->dump([ + 'class' => $class, + 'base_class' => $baseClass, + 'file' => $cache->getPath(), + 'as_files' => true, + 'debug' => $this->debug, + 'build_time' => $container->hasParameter('kernel.container_build_time') ? $container->getParameter('kernel.container_build_time') : time(), + 'preload_classes' => array_map('get_class', $this->bundles), + ]); + + $rootCode = array_pop($content); + $dir = \dirname($cache->getPath()).'/'; + $fs = new Filesystem(); + + foreach ($content as $file => $code) { + $fs->dumpFile($dir.$file, $code); + @chmod($dir.$file, 0666 & ~umask()); + } + $legacyFile = \dirname($dir.key($content)).'.legacy'; + if (file_exists($legacyFile)) { + @unlink($legacyFile); + } + + $cache->write($rootCode, $container->getResources()); + } + + /** + * Returns a loader for the container. + * + * @return DelegatingLoader The loader + */ + protected function getContainerLoader(ContainerInterface $container) + { + $locator = new FileLocator($this); + $resolver = new LoaderResolver([ + new XmlFileLoader($container, $locator), + new YamlFileLoader($container, $locator), + new IniFileLoader($container, $locator), + new PhpFileLoader($container, $locator), + new GlobFileLoader($container, $locator), + new DirectoryLoader($container, $locator), + new ClosureLoader($container), + ]); + + return new DelegatingLoader($resolver); + } + + /** + * Removes comments from a PHP source string. + * + * We don't use the PHP php_strip_whitespace() function + * as we want the content to be readable and well-formatted. + * + * @return string The PHP string with the comments removed + */ + public static function stripComments(string $source) + { + if (!\function_exists('token_get_all')) { + return $source; + } + + $rawChunk = ''; + $output = ''; + $tokens = token_get_all($source); + $ignoreSpace = false; + for ($i = 0; isset($tokens[$i]); ++$i) { + $token = $tokens[$i]; + if (!isset($token[1]) || 'b"' === $token) { + $rawChunk .= $token; + } elseif (T_START_HEREDOC === $token[0]) { + $output .= $rawChunk.$token[1]; + do { + $token = $tokens[++$i]; + $output .= isset($token[1]) && 'b"' !== $token ? $token[1] : $token; + } while (T_END_HEREDOC !== $token[0]); + $rawChunk = ''; + } elseif (T_WHITESPACE === $token[0]) { + if ($ignoreSpace) { + $ignoreSpace = false; + + continue; + } + + // replace multiple new lines with a single newline + $rawChunk .= preg_replace(['/\n{2,}/S'], "\n", $token[1]); + } elseif (\in_array($token[0], [T_COMMENT, T_DOC_COMMENT])) { + $ignoreSpace = true; + } else { + $rawChunk .= $token[1]; + + // The PHP-open tag already has a new-line + if (T_OPEN_TAG === $token[0]) { + $ignoreSpace = true; + } + } + } + + $output .= $rawChunk; + + unset($tokens, $rawChunk); + gc_mem_caches(); + + return $output; + } + + /** + * @return array + */ + public function __sleep() + { + return ['environment', 'debug']; + } + + public function __wakeup() + { + $this->__construct($this->environment, $this->debug); + } +} diff --git a/vendor/symfony/http-kernel/KernelEvents.php b/vendor/symfony/http-kernel/KernelEvents.php new file mode 100644 index 0000000..0e1c908 --- /dev/null +++ b/vendor/symfony/http-kernel/KernelEvents.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +/** + * Contains all events thrown in the HttpKernel component. + * + * @author Bernhard Schussek + */ +final class KernelEvents +{ + /** + * The REQUEST event occurs at the very beginning of request + * dispatching. + * + * This event allows you to create a response for a request before any + * other code in the framework is executed. + * + * @Event("Symfony\Component\HttpKernel\Event\RequestEvent") + */ + const REQUEST = 'kernel.request'; + + /** + * The EXCEPTION event occurs when an uncaught exception appears. + * + * This event allows you to create a response for a thrown exception or + * to modify the thrown exception. + * + * @Event("Symfony\Component\HttpKernel\Event\ExceptionEvent") + */ + const EXCEPTION = 'kernel.exception'; + + /** + * The CONTROLLER event occurs once a controller was found for + * handling a request. + * + * This event allows you to change the controller that will handle the + * request. + * + * @Event("Symfony\Component\HttpKernel\Event\ControllerEvent") + */ + const CONTROLLER = 'kernel.controller'; + + /** + * The CONTROLLER_ARGUMENTS event occurs once controller arguments have been resolved. + * + * This event allows you to change the arguments that will be passed to + * the controller. + * + * @Event("Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent") + */ + const CONTROLLER_ARGUMENTS = 'kernel.controller_arguments'; + + /** + * The VIEW event occurs when the return value of a controller + * is not a Response instance. + * + * This event allows you to create a response for the return value of the + * controller. + * + * @Event("Symfony\Component\HttpKernel\Event\ViewEvent") + */ + const VIEW = 'kernel.view'; + + /** + * The RESPONSE event occurs once a response was created for + * replying to a request. + * + * This event allows you to modify or replace the response that will be + * replied. + * + * @Event("Symfony\Component\HttpKernel\Event\ResponseEvent") + */ + const RESPONSE = 'kernel.response'; + + /** + * The FINISH_REQUEST event occurs when a response was generated for a request. + * + * This event allows you to reset the global and environmental state of + * the application, when it was changed during the request. + * + * @Event("Symfony\Component\HttpKernel\Event\FinishRequestEvent") + */ + const FINISH_REQUEST = 'kernel.finish_request'; + + /** + * The TERMINATE event occurs once a response was sent. + * + * This event allows you to run expensive post-response jobs. + * + * @Event("Symfony\Component\HttpKernel\Event\TerminateEvent") + */ + const TERMINATE = 'kernel.terminate'; +} diff --git a/vendor/symfony/http-kernel/KernelInterface.php b/vendor/symfony/http-kernel/KernelInterface.php new file mode 100644 index 0000000..cea86f6 --- /dev/null +++ b/vendor/symfony/http-kernel/KernelInterface.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpKernel\Bundle\BundleInterface; + +/** + * The Kernel is the heart of the Symfony system. + * + * It manages an environment made of application kernel and bundles. + * + * @author Fabien Potencier + */ +interface KernelInterface extends HttpKernelInterface +{ + /** + * Returns an array of bundles to register. + * + * @return iterable|BundleInterface[] An iterable of bundle instances + */ + public function registerBundles(); + + /** + * Loads the container configuration. + */ + public function registerContainerConfiguration(LoaderInterface $loader); + + /** + * Boots the current kernel. + */ + public function boot(); + + /** + * Shutdowns the kernel. + * + * This method is mainly useful when doing functional testing. + */ + public function shutdown(); + + /** + * Gets the registered bundle instances. + * + * @return BundleInterface[] An array of registered bundle instances + */ + public function getBundles(); + + /** + * Returns a bundle. + * + * @return BundleInterface A BundleInterface instance + * + * @throws \InvalidArgumentException when the bundle is not enabled + */ + public function getBundle(string $name); + + /** + * Returns the file path for a given bundle resource. + * + * A Resource can be a file or a directory. + * + * The resource name must follow the following pattern: + * + * "@BundleName/path/to/a/file.something" + * + * where BundleName is the name of the bundle + * and the remaining part is the relative path in the bundle. + * + * @return string The absolute path of the resource + * + * @throws \InvalidArgumentException if the file cannot be found or the name is not valid + * @throws \RuntimeException if the name contains invalid/unsafe characters + */ + public function locateResource(string $name); + + /** + * Gets the environment. + * + * @return string The current environment + */ + public function getEnvironment(); + + /** + * Checks if debug mode is enabled. + * + * @return bool true if debug mode is enabled, false otherwise + */ + public function isDebug(); + + /** + * Gets the project dir (path of the project's composer file). + * + * @return string + */ + public function getProjectDir(); + + /** + * Gets the current container. + * + * @return ContainerInterface + */ + public function getContainer(); + + /** + * Gets the request start time (not available if debug is disabled). + * + * @return float The request start timestamp + */ + public function getStartTime(); + + /** + * Gets the cache directory. + * + * @return string The cache directory + */ + public function getCacheDir(); + + /** + * Gets the log directory. + * + * @return string The log directory + */ + public function getLogDir(); + + /** + * Gets the charset of the application. + * + * @return string The charset + */ + public function getCharset(); +} diff --git a/vendor/symfony/http-kernel/LICENSE b/vendor/symfony/http-kernel/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/http-kernel/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php b/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php new file mode 100644 index 0000000..2c2eae6 --- /dev/null +++ b/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Log; + +use Symfony\Component\HttpFoundation\Request; + +/** + * DebugLoggerInterface. + * + * @author Fabien Potencier + */ +interface DebugLoggerInterface +{ + /** + * Returns an array of logs. + * + * A log is an array with the following mandatory keys: + * timestamp, message, priority, and priorityName. + * It can also have an optional context key containing an array. + * + * @return array An array of logs + */ + public function getLogs(Request $request = null); + + /** + * Returns the number of errors. + * + * @return int The number of errors + */ + public function countErrors(Request $request = null); + + /** + * Removes all log records. + */ + public function clear(); +} diff --git a/vendor/symfony/http-kernel/Log/Logger.php b/vendor/symfony/http-kernel/Log/Logger.php new file mode 100644 index 0000000..1e6308d --- /dev/null +++ b/vendor/symfony/http-kernel/Log/Logger.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Log; + +use Psr\Log\AbstractLogger; +use Psr\Log\InvalidArgumentException; +use Psr\Log\LogLevel; + +/** + * Minimalist PSR-3 logger designed to write in stderr or any other stream. + * + * @author Kévin Dunglas + */ +class Logger extends AbstractLogger +{ + private static $levels = [ + LogLevel::DEBUG => 0, + LogLevel::INFO => 1, + LogLevel::NOTICE => 2, + LogLevel::WARNING => 3, + LogLevel::ERROR => 4, + LogLevel::CRITICAL => 5, + LogLevel::ALERT => 6, + LogLevel::EMERGENCY => 7, + ]; + + private $minLevelIndex; + private $formatter; + private $handle; + + public function __construct(string $minLevel = null, $output = null, callable $formatter = null) + { + if (null === $minLevel) { + $minLevel = null === $output || 'php://stdout' === $output || 'php://stderr' === $output ? LogLevel::ERROR : LogLevel::WARNING; + + if (isset($_ENV['SHELL_VERBOSITY']) || isset($_SERVER['SHELL_VERBOSITY'])) { + switch ((int) (isset($_ENV['SHELL_VERBOSITY']) ? $_ENV['SHELL_VERBOSITY'] : $_SERVER['SHELL_VERBOSITY'])) { + case -1: $minLevel = LogLevel::ERROR; break; + case 1: $minLevel = LogLevel::NOTICE; break; + case 2: $minLevel = LogLevel::INFO; break; + case 3: $minLevel = LogLevel::DEBUG; break; + } + } + } + + if (!isset(self::$levels[$minLevel])) { + throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $minLevel)); + } + + $this->minLevelIndex = self::$levels[$minLevel]; + $this->formatter = $formatter ?: [$this, 'format']; + if ($output && false === $this->handle = \is_resource($output) ? $output : @fopen($output, 'a')) { + throw new InvalidArgumentException(sprintf('Unable to open "%s".', $output)); + } + } + + /** + * {@inheritdoc} + * + * @return void + */ + public function log($level, $message, array $context = []) + { + if (!isset(self::$levels[$level])) { + throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level)); + } + + if (self::$levels[$level] < $this->minLevelIndex) { + return; + } + + $formatter = $this->formatter; + if ($this->handle) { + @fwrite($this->handle, $formatter($level, $message, $context)); + } else { + error_log($formatter($level, $message, $context, false)); + } + } + + private function format(string $level, string $message, array $context, bool $prefixDate = true): string + { + if (false !== strpos($message, '{')) { + $replacements = []; + foreach ($context as $key => $val) { + if (null === $val || is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) { + $replacements["{{$key}}"] = $val; + } elseif ($val instanceof \DateTimeInterface) { + $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339); + } elseif (\is_object($val)) { + $replacements["{{$key}}"] = '[object '.\get_class($val).']'; + } else { + $replacements["{{$key}}"] = '['.\gettype($val).']'; + } + } + + $message = strtr($message, $replacements); + } + + $log = sprintf('[%s] %s', $level, $message).PHP_EOL; + if ($prefixDate) { + $log = date(\DateTime::RFC3339).' '.$log; + } + + return $log; + } +} diff --git a/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php new file mode 100644 index 0000000..3b5dfbf --- /dev/null +++ b/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php @@ -0,0 +1,303 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Profiler; + +/** + * Storage for profiler using files. + * + * @author Alexandre Salomé + */ +class FileProfilerStorage implements ProfilerStorageInterface +{ + /** + * Folder where profiler data are stored. + * + * @var string + */ + private $folder; + + /** + * Constructs the file storage using a "dsn-like" path. + * + * Example : "file:/path/to/the/storage/folder" + * + * @throws \RuntimeException + */ + public function __construct(string $dsn) + { + if (0 !== strpos($dsn, 'file:')) { + throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use FileStorage with an invalid dsn "%s". The expected format is "file:/path/to/the/storage/folder".', $dsn)); + } + $this->folder = substr($dsn, 5); + + if (!is_dir($this->folder) && false === @mkdir($this->folder, 0777, true) && !is_dir($this->folder)) { + throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $this->folder)); + } + } + + /** + * {@inheritdoc} + */ + public function find(?string $ip, ?string $url, ?int $limit, ?string $method, int $start = null, int $end = null, string $statusCode = null): array + { + $file = $this->getIndexFilename(); + + if (!file_exists($file)) { + return []; + } + + $file = fopen($file, 'r'); + fseek($file, 0, SEEK_END); + + $result = []; + while (\count($result) < $limit && $line = $this->readLineFromFile($file)) { + $values = str_getcsv($line); + list($csvToken, $csvIp, $csvMethod, $csvUrl, $csvTime, $csvParent, $csvStatusCode) = $values; + $csvTime = (int) $csvTime; + + if ($ip && false === strpos($csvIp, $ip) || $url && false === strpos($csvUrl, $url) || $method && false === strpos($csvMethod, $method) || $statusCode && false === strpos($csvStatusCode, $statusCode)) { + continue; + } + + if (!empty($start) && $csvTime < $start) { + continue; + } + + if (!empty($end) && $csvTime > $end) { + continue; + } + + $result[$csvToken] = [ + 'token' => $csvToken, + 'ip' => $csvIp, + 'method' => $csvMethod, + 'url' => $csvUrl, + 'time' => $csvTime, + 'parent' => $csvParent, + 'status_code' => $csvStatusCode, + ]; + } + + fclose($file); + + return array_values($result); + } + + /** + * {@inheritdoc} + */ + public function purge() + { + $flags = \FilesystemIterator::SKIP_DOTS; + $iterator = new \RecursiveDirectoryIterator($this->folder, $flags); + $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST); + + foreach ($iterator as $file) { + if (is_file($file)) { + unlink($file); + } else { + rmdir($file); + } + } + } + + /** + * {@inheritdoc} + */ + public function read(string $token): ?Profile + { + if (!$token || !file_exists($file = $this->getFilename($token))) { + return null; + } + + if (\function_exists('gzcompress')) { + $file = 'compress.zlib://'.$file; + } + + return $this->createProfileFromData($token, unserialize(file_get_contents($file))); + } + + /** + * {@inheritdoc} + * + * @throws \RuntimeException + */ + public function write(Profile $profile): bool + { + $file = $this->getFilename($profile->getToken()); + + $profileIndexed = is_file($file); + if (!$profileIndexed) { + // Create directory + $dir = \dirname($file); + if (!is_dir($dir) && false === @mkdir($dir, 0777, true) && !is_dir($dir)) { + throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $dir)); + } + } + + $profileToken = $profile->getToken(); + // when there are errors in sub-requests, the parent and/or children tokens + // may equal the profile token, resulting in infinite loops + $parentToken = $profile->getParentToken() !== $profileToken ? $profile->getParentToken() : null; + $childrenToken = array_filter(array_map(function (Profile $p) use ($profileToken) { + return $profileToken !== $p->getToken() ? $p->getToken() : null; + }, $profile->getChildren())); + + // Store profile + $data = [ + 'token' => $profileToken, + 'parent' => $parentToken, + 'children' => $childrenToken, + 'data' => $profile->getCollectors(), + 'ip' => $profile->getIp(), + 'method' => $profile->getMethod(), + 'url' => $profile->getUrl(), + 'time' => $profile->getTime(), + 'status_code' => $profile->getStatusCode(), + ]; + + $context = stream_context_create(); + + if (\function_exists('gzcompress')) { + $file = 'compress.zlib://'.$file; + stream_context_set_option($context, 'zlib', 'level', 3); + } + + if (false === file_put_contents($file, serialize($data), 0, $context)) { + return false; + } + + if (!$profileIndexed) { + // Add to index + if (false === $file = fopen($this->getIndexFilename(), 'a')) { + return false; + } + + fputcsv($file, [ + $profile->getToken(), + $profile->getIp(), + $profile->getMethod(), + $profile->getUrl(), + $profile->getTime(), + $profile->getParentToken(), + $profile->getStatusCode(), + ]); + fclose($file); + } + + return true; + } + + /** + * Gets filename to store data, associated to the token. + * + * @return string The profile filename + */ + protected function getFilename(string $token) + { + // Uses 4 last characters, because first are mostly the same. + $folderA = substr($token, -2, 2); + $folderB = substr($token, -4, 2); + + return $this->folder.'/'.$folderA.'/'.$folderB.'/'.$token; + } + + /** + * Gets the index filename. + * + * @return string The index filename + */ + protected function getIndexFilename() + { + return $this->folder.'/index.csv'; + } + + /** + * Reads a line in the file, backward. + * + * This function automatically skips the empty lines and do not include the line return in result value. + * + * @param resource $file The file resource, with the pointer placed at the end of the line to read + * + * @return mixed A string representing the line or null if beginning of file is reached + */ + protected function readLineFromFile($file) + { + $line = ''; + $position = ftell($file); + + if (0 === $position) { + return null; + } + + while (true) { + $chunkSize = min($position, 1024); + $position -= $chunkSize; + fseek($file, $position); + + if (0 === $chunkSize) { + // bof reached + break; + } + + $buffer = fread($file, $chunkSize); + + if (false === ($upTo = strrpos($buffer, "\n"))) { + $line = $buffer.$line; + continue; + } + + $position += $upTo; + $line = substr($buffer, $upTo + 1).$line; + fseek($file, max(0, $position), SEEK_SET); + + if ('' !== $line) { + break; + } + } + + return '' === $line ? null : $line; + } + + protected function createProfileFromData(string $token, array $data, Profile $parent = null) + { + $profile = new Profile($token); + $profile->setIp($data['ip']); + $profile->setMethod($data['method']); + $profile->setUrl($data['url']); + $profile->setTime($data['time']); + $profile->setStatusCode($data['status_code']); + $profile->setCollectors($data['data']); + + if (!$parent && $data['parent']) { + $parent = $this->read($data['parent']); + } + + if ($parent) { + $profile->setParent($parent); + } + + foreach ($data['children'] as $token) { + if (!$token || !file_exists($file = $this->getFilename($token))) { + continue; + } + + if (\function_exists('gzcompress')) { + $file = 'compress.zlib://'.$file; + } + + $profile->addChild($this->createProfileFromData($token, unserialize(file_get_contents($file)), $profile)); + } + + return $profile; + } +} diff --git a/vendor/symfony/http-kernel/Profiler/Profile.php b/vendor/symfony/http-kernel/Profiler/Profile.php new file mode 100644 index 0000000..37b690e --- /dev/null +++ b/vendor/symfony/http-kernel/Profiler/Profile.php @@ -0,0 +1,274 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Profiler; + +use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface; + +/** + * Profile. + * + * @author Fabien Potencier + */ +class Profile +{ + private $token; + + /** + * @var DataCollectorInterface[] + */ + private $collectors = []; + + private $ip; + private $method; + private $url; + private $time; + private $statusCode; + + /** + * @var Profile + */ + private $parent; + + /** + * @var Profile[] + */ + private $children = []; + + public function __construct(string $token) + { + $this->token = $token; + } + + public function setToken(string $token) + { + $this->token = $token; + } + + /** + * Gets the token. + * + * @return string The token + */ + public function getToken() + { + return $this->token; + } + + /** + * Sets the parent token. + */ + public function setParent(self $parent) + { + $this->parent = $parent; + } + + /** + * Returns the parent profile. + * + * @return self + */ + public function getParent() + { + return $this->parent; + } + + /** + * Returns the parent token. + * + * @return string|null The parent token + */ + public function getParentToken() + { + return $this->parent ? $this->parent->getToken() : null; + } + + /** + * Returns the IP. + * + * @return string|null The IP + */ + public function getIp() + { + return $this->ip; + } + + public function setIp(?string $ip) + { + $this->ip = $ip; + } + + /** + * Returns the request method. + * + * @return string|null The request method + */ + public function getMethod() + { + return $this->method; + } + + public function setMethod(string $method) + { + $this->method = $method; + } + + /** + * Returns the URL. + * + * @return string|null The URL + */ + public function getUrl() + { + return $this->url; + } + + public function setUrl(?string $url) + { + $this->url = $url; + } + + /** + * @return int The time + */ + public function getTime() + { + if (null === $this->time) { + return 0; + } + + return $this->time; + } + + public function setTime(int $time) + { + $this->time = $time; + } + + public function setStatusCode(int $statusCode) + { + $this->statusCode = $statusCode; + } + + /** + * @return int|null + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * Finds children profilers. + * + * @return self[] + */ + public function getChildren() + { + return $this->children; + } + + /** + * Sets children profiler. + * + * @param Profile[] $children + */ + public function setChildren(array $children) + { + $this->children = []; + foreach ($children as $child) { + $this->addChild($child); + } + } + + /** + * Adds the child token. + */ + public function addChild(self $child) + { + $this->children[] = $child; + $child->setParent($this); + } + + public function getChildByToken(string $token): ?self + { + foreach ($this->children as $child) { + if ($token === $child->getToken()) { + return $child; + } + } + + return null; + } + + /** + * Gets a Collector by name. + * + * @return DataCollectorInterface A DataCollectorInterface instance + * + * @throws \InvalidArgumentException if the collector does not exist + */ + public function getCollector(string $name) + { + if (!isset($this->collectors[$name])) { + throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name)); + } + + return $this->collectors[$name]; + } + + /** + * Gets the Collectors associated with this profile. + * + * @return DataCollectorInterface[] + */ + public function getCollectors() + { + return $this->collectors; + } + + /** + * Sets the Collectors associated with this profile. + * + * @param DataCollectorInterface[] $collectors + */ + public function setCollectors(array $collectors) + { + $this->collectors = []; + foreach ($collectors as $collector) { + $this->addCollector($collector); + } + } + + /** + * Adds a Collector. + */ + public function addCollector(DataCollectorInterface $collector) + { + $this->collectors[$collector->getName()] = $collector; + } + + /** + * @return bool + */ + public function hasCollector(string $name) + { + return isset($this->collectors[$name]); + } + + /** + * @return array + */ + public function __sleep() + { + return ['token', 'parent', 'children', 'collectors', 'ip', 'method', 'url', 'time', 'statusCode']; + } +} diff --git a/vendor/symfony/http-kernel/Profiler/Profiler.php b/vendor/symfony/http-kernel/Profiler/Profiler.php new file mode 100644 index 0000000..72af8e0 --- /dev/null +++ b/vendor/symfony/http-kernel/Profiler/Profiler.php @@ -0,0 +1,253 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Profiler; + +use Psr\Log\LoggerInterface; +use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface; +use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; +use Symfony\Contracts\Service\ResetInterface; + +/** + * Profiler. + * + * @author Fabien Potencier + */ +class Profiler implements ResetInterface +{ + private $storage; + + /** + * @var DataCollectorInterface[] + */ + private $collectors = []; + + private $logger; + private $initiallyEnabled = true; + private $enabled = true; + + public function __construct(ProfilerStorageInterface $storage, LoggerInterface $logger = null, bool $enable = true) + { + $this->storage = $storage; + $this->logger = $logger; + $this->initiallyEnabled = $this->enabled = $enable; + } + + /** + * Disables the profiler. + */ + public function disable() + { + $this->enabled = false; + } + + /** + * Enables the profiler. + */ + public function enable() + { + $this->enabled = true; + } + + /** + * Loads the Profile for the given Response. + * + * @return Profile|null A Profile instance + */ + public function loadProfileFromResponse(Response $response) + { + if (!$token = $response->headers->get('X-Debug-Token')) { + return null; + } + + return $this->loadProfile($token); + } + + /** + * Loads the Profile for the given token. + * + * @return Profile|null A Profile instance + */ + public function loadProfile(string $token) + { + return $this->storage->read($token); + } + + /** + * Saves a Profile. + * + * @return bool + */ + public function saveProfile(Profile $profile) + { + // late collect + foreach ($profile->getCollectors() as $collector) { + if ($collector instanceof LateDataCollectorInterface) { + $collector->lateCollect(); + } + } + + if (!($ret = $this->storage->write($profile)) && null !== $this->logger) { + $this->logger->warning('Unable to store the profiler information.', ['configured_storage' => \get_class($this->storage)]); + } + + return $ret; + } + + /** + * Purges all data from the storage. + */ + public function purge() + { + $this->storage->purge(); + } + + /** + * Finds profiler tokens for the given criteria. + * + * @param string|null $limit The maximum number of tokens to return + * @param string|null $start The start date to search from + * @param string|null $end The end date to search to + * + * @return array An array of tokens + * + * @see https://php.net/datetime.formats for the supported date/time formats + */ + public function find(?string $ip, ?string $url, ?string $limit, ?string $method, ?string $start, ?string $end, string $statusCode = null) + { + return $this->storage->find($ip, $url, $limit, $method, $this->getTimestamp($start), $this->getTimestamp($end), $statusCode); + } + + /** + * Collects data for the given Response. + * + * @return Profile|null A Profile instance or null if the profiler is disabled + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + if (false === $this->enabled) { + return null; + } + + $profile = new Profile(substr(hash('sha256', uniqid(mt_rand(), true)), 0, 6)); + $profile->setTime(time()); + $profile->setUrl($request->getUri()); + $profile->setMethod($request->getMethod()); + $profile->setStatusCode($response->getStatusCode()); + try { + $profile->setIp($request->getClientIp()); + } catch (ConflictingHeadersException $e) { + $profile->setIp('Unknown'); + } + + if ($prevToken = $response->headers->get('X-Debug-Token')) { + $response->headers->set('X-Previous-Debug-Token', $prevToken); + } + + $response->headers->set('X-Debug-Token', $profile->getToken()); + + foreach ($this->collectors as $collector) { + $collector->collect($request, $response, $exception); + + // we need to clone for sub-requests + $profile->addCollector(clone $collector); + } + + return $profile; + } + + public function reset() + { + foreach ($this->collectors as $collector) { + $collector->reset(); + } + $this->enabled = $this->initiallyEnabled; + } + + /** + * Gets the Collectors associated with this profiler. + * + * @return array An array of collectors + */ + public function all() + { + return $this->collectors; + } + + /** + * Sets the Collectors associated with this profiler. + * + * @param DataCollectorInterface[] $collectors An array of collectors + */ + public function set(array $collectors = []) + { + $this->collectors = []; + foreach ($collectors as $collector) { + $this->add($collector); + } + } + + /** + * Adds a Collector. + */ + public function add(DataCollectorInterface $collector) + { + $this->collectors[$collector->getName()] = $collector; + } + + /** + * Returns true if a Collector for the given name exists. + * + * @param string $name A collector name + * + * @return bool + */ + public function has(string $name) + { + return isset($this->collectors[$name]); + } + + /** + * Gets a Collector by name. + * + * @param string $name A collector name + * + * @return DataCollectorInterface A DataCollectorInterface instance + * + * @throws \InvalidArgumentException if the collector does not exist + */ + public function get(string $name) + { + if (!isset($this->collectors[$name])) { + throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name)); + } + + return $this->collectors[$name]; + } + + private function getTimestamp(?string $value): ?int + { + if (null === $value || '' === $value) { + return null; + } + + try { + $value = new \DateTime(is_numeric($value) ? '@'.$value : $value); + } catch (\Exception $e) { + return null; + } + + return $value->getTimestamp(); + } +} diff --git a/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php b/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php new file mode 100644 index 0000000..0fbc449 --- /dev/null +++ b/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Profiler; + +/** + * ProfilerStorageInterface. + * + * This interface exists for historical reasons. The only supported + * implementation is FileProfilerStorage. + * + * As the profiler must only be used on non-production servers, the file storage + * is more than enough and no other implementations will ever be supported. + * + * @internal + * + * @author Fabien Potencier + */ +interface ProfilerStorageInterface +{ + /** + * Finds profiler tokens for the given criteria. + * + * @param int|null $limit The maximum number of tokens to return + * @param int|null $start The start date to search from + * @param int|null $end The end date to search to + * + * @return array An array of tokens + */ + public function find(?string $ip, ?string $url, ?int $limit, ?string $method, int $start = null, int $end = null): array; + + /** + * Reads data associated with the given token. + * + * The method returns false if the token does not exist in the storage. + * + * @return Profile|null The profile associated with token + */ + public function read(string $token): ?Profile; + + /** + * Saves a Profile. + * + * @return bool Write operation successful + */ + public function write(Profile $profile): bool; + + /** + * Purges all data from the database. + */ + public function purge(); +} diff --git a/vendor/symfony/http-kernel/README.md b/vendor/symfony/http-kernel/README.md new file mode 100644 index 0000000..abdaf51 --- /dev/null +++ b/vendor/symfony/http-kernel/README.md @@ -0,0 +1,16 @@ +HttpKernel Component +==================== + +The HttpKernel component provides a structured process for converting a Request +into a Response by making use of the EventDispatcher component. It's flexible +enough to create a full-stack framework (Symfony), a micro-framework (Silex) or +an advanced CMS system (Drupal). + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/http_kernel.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/http-kernel/RebootableInterface.php b/vendor/symfony/http-kernel/RebootableInterface.php new file mode 100644 index 0000000..0dc46c3 --- /dev/null +++ b/vendor/symfony/http-kernel/RebootableInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +/** + * Allows the Kernel to be rebooted using a temporary cache directory. + * + * @author Nicolas Grekas + */ +interface RebootableInterface +{ + /** + * Reboots a kernel. + * + * The getCacheDir() method of a rebootable kernel should not be called + * while building the container. Use the %kernel.cache_dir% parameter instead. + * + * @param string|null $warmupDir pass null to reboot in the regular cache directory + */ + public function reboot(?string $warmupDir); +} diff --git a/vendor/symfony/http-kernel/Resources/welcome.html.php b/vendor/symfony/http-kernel/Resources/welcome.html.php new file mode 100644 index 0000000..b8337dc --- /dev/null +++ b/vendor/symfony/http-kernel/Resources/welcome.html.php @@ -0,0 +1,119 @@ + + + + + + Welcome to Symfony! + + + +
    +
    + + You're seeing this page because you haven't configured any homepage URL and debug mode is enabled. +
    + +
    +
    + +

    Welcome to Symfony

    +
    + +
    + + + + + + +

    Your application is now ready and you can start working on it.

    +
    + + +
    + +
    + +
    +
    + + diff --git a/vendor/symfony/http-kernel/TerminableInterface.php b/vendor/symfony/http-kernel/TerminableInterface.php new file mode 100644 index 0000000..8aa3319 --- /dev/null +++ b/vendor/symfony/http-kernel/TerminableInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * Terminable extends the Kernel request/response cycle with dispatching a post + * response event after sending the response and before shutting down the kernel. + * + * @author Jordi Boggiano + * @author Pierre Minnieur + */ +interface TerminableInterface +{ + /** + * Terminates a request/response cycle. + * + * Should be called after sending the response and before shutting down the kernel. + */ + public function terminate(Request $request, Response $response); +} diff --git a/vendor/symfony/http-kernel/UriSigner.php b/vendor/symfony/http-kernel/UriSigner.php new file mode 100644 index 0000000..df08dd6 --- /dev/null +++ b/vendor/symfony/http-kernel/UriSigner.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel; + +use Symfony\Component\HttpFoundation\Request; + +/** + * Signs URIs. + * + * @author Fabien Potencier + */ +class UriSigner +{ + private $secret; + private $parameter; + + /** + * @param string $secret A secret + * @param string $parameter Query string parameter to use + */ + public function __construct(string $secret, string $parameter = '_hash') + { + $this->secret = $secret; + $this->parameter = $parameter; + } + + /** + * Signs a URI. + * + * The given URI is signed by adding the query string parameter + * which value depends on the URI and the secret. + * + * @return string The signed URI + */ + public function sign(string $uri) + { + $url = parse_url($uri); + if (isset($url['query'])) { + parse_str($url['query'], $params); + } else { + $params = []; + } + + $uri = $this->buildUrl($url, $params); + $params[$this->parameter] = $this->computeHash($uri); + + return $this->buildUrl($url, $params); + } + + /** + * Checks that a URI contains the correct hash. + * + * @return bool True if the URI is signed correctly, false otherwise + */ + public function check(string $uri) + { + $url = parse_url($uri); + if (isset($url['query'])) { + parse_str($url['query'], $params); + } else { + $params = []; + } + + if (empty($params[$this->parameter])) { + return false; + } + + $hash = $params[$this->parameter]; + unset($params[$this->parameter]); + + return hash_equals($this->computeHash($this->buildUrl($url, $params)), $hash); + } + + public function checkRequest(Request $request): bool + { + $qs = ($qs = $request->server->get('QUERY_STRING')) ? '?'.$qs : ''; + + // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering) + return $this->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().$qs); + } + + private function computeHash(string $uri): string + { + return base64_encode(hash_hmac('sha256', $uri, $this->secret, true)); + } + + private function buildUrl(array $url, array $params = []): string + { + ksort($params, SORT_STRING); + $url['query'] = http_build_query($params, '', '&'); + + $scheme = isset($url['scheme']) ? $url['scheme'].'://' : ''; + $host = isset($url['host']) ? $url['host'] : ''; + $port = isset($url['port']) ? ':'.$url['port'] : ''; + $user = isset($url['user']) ? $url['user'] : ''; + $pass = isset($url['pass']) ? ':'.$url['pass'] : ''; + $pass = ($user || $pass) ? "$pass@" : ''; + $path = isset($url['path']) ? $url['path'] : ''; + $query = isset($url['query']) && $url['query'] ? '?'.$url['query'] : ''; + $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : ''; + + return $scheme.$user.$pass.$host.$port.$path.$query.$fragment; + } +} diff --git a/vendor/symfony/http-kernel/composer.json b/vendor/symfony/http-kernel/composer.json new file mode 100644 index 0000000..c016af2 --- /dev/null +++ b/vendor/symfony/http-kernel/composer.json @@ -0,0 +1,83 @@ +{ + "name": "symfony/http-kernel", + "type": "library", + "description": "Symfony HttpKernel Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15", + "psr/log": "~1.0" + }, + "require-dev": { + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "psr/cache": "~1.0", + "twig/twig": "^2.4|^3.0" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/form": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\HttpKernel\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/mime/Address.php b/vendor/symfony/mime/Address.php new file mode 100644 index 0000000..9847712 --- /dev/null +++ b/vendor/symfony/mime/Address.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\RFCValidation; +use Symfony\Component\Mime\Encoder\IdnAddressEncoder; +use Symfony\Component\Mime\Exception\InvalidArgumentException; +use Symfony\Component\Mime\Exception\LogicException; +use Symfony\Component\Mime\Exception\RfcComplianceException; + +/** + * @author Fabien Potencier + */ +final class Address +{ + /** + * A regex that matches a structure like 'Name '. + * It matches anything between the first < and last > as email address. + * This allows to use a single string to construct an Address, which can be convenient to use in + * config, and allows to have more readable config. + * This does not try to cover all edge cases for address. + */ + private const FROM_STRING_PATTERN = '~(?[^<]*)<(?.*)>[^>]*~'; + + private static $validator; + private static $encoder; + + private $address; + private $name; + + public function __construct(string $address, string $name = '') + { + if (!class_exists(EmailValidator::class)) { + throw new LogicException(sprintf('The "%s" class cannot be used as it needs "%s"; try running "composer require egulias/email-validator".', __CLASS__, EmailValidator::class)); + } + + if (null === self::$validator) { + self::$validator = new EmailValidator(); + } + + $this->address = trim($address); + $this->name = trim(str_replace(["\n", "\r"], '', $name)); + + if (!self::$validator->isValid($this->address, new RFCValidation())) { + throw new RfcComplianceException(sprintf('Email "%s" does not comply with addr-spec of RFC 2822.', $address)); + } + } + + public function getAddress(): string + { + return $this->address; + } + + public function getName(): string + { + return $this->name; + } + + public function getEncodedAddress(): string + { + if (null === self::$encoder) { + self::$encoder = new IdnAddressEncoder(); + } + + return self::$encoder->encodeString($this->address); + } + + public function toString(): string + { + return ($n = $this->getName()) ? $n.' <'.$this->getEncodedAddress().'>' : $this->getEncodedAddress(); + } + + /** + * @param Address|string $address + */ + public static function create($address): self + { + if ($address instanceof self) { + return $address; + } + if (\is_string($address)) { + return self::fromString($address); + } + + throw new InvalidArgumentException(sprintf('An address can be an instance of Address or a string ("%s") given).', get_debug_type($address))); + } + + /** + * @param (Address|string)[] $addresses + * + * @return Address[] + */ + public static function createArray(array $addresses): array + { + $addrs = []; + foreach ($addresses as $address) { + $addrs[] = self::create($address); + } + + return $addrs; + } + + public static function fromString(string $string): self + { + if (false === strpos($string, '<')) { + return new self($string, ''); + } + + if (!preg_match(self::FROM_STRING_PATTERN, $string, $matches)) { + throw new InvalidArgumentException(sprintf('Could not parse "%s" to a "%s" instance.', $string, static::class)); + } + + return new self($matches['addrSpec'], trim($matches['displayName'], ' \'"')); + } +} diff --git a/vendor/symfony/mime/BodyRendererInterface.php b/vendor/symfony/mime/BodyRendererInterface.php new file mode 100644 index 0000000..d692172 --- /dev/null +++ b/vendor/symfony/mime/BodyRendererInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +/** + * @author Fabien Potencier + */ +interface BodyRendererInterface +{ + public function render(Message $message): void; +} diff --git a/vendor/symfony/mime/CHANGELOG.md b/vendor/symfony/mime/CHANGELOG.md new file mode 100644 index 0000000..6148360 --- /dev/null +++ b/vendor/symfony/mime/CHANGELOG.md @@ -0,0 +1,20 @@ +CHANGELOG +========= + +4.4.0 +----- + + * [BC BREAK] Removed `NamedAddress` (`Address` now supports a name) + * Added PHPUnit constraints + * Added `AbstractPart::asDebugString()` + * Added `Address::fromString()` + +4.3.3 +----- + + * [BC BREAK] Renamed method `Headers::getAll()` to `Headers::all()`. + +4.3.0 +----- + + * Introduced the component as experimental diff --git a/vendor/symfony/mime/CharacterStream.php b/vendor/symfony/mime/CharacterStream.php new file mode 100644 index 0000000..9d0a9c6 --- /dev/null +++ b/vendor/symfony/mime/CharacterStream.php @@ -0,0 +1,218 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +/** + * @author Fabien Potencier + * @author Xavier De Cock + * + * @internal + */ +final class CharacterStream +{ + /** Pre-computed for optimization */ + private const UTF8_LENGTH_MAP = [ + "\x00" => 1, "\x01" => 1, "\x02" => 1, "\x03" => 1, "\x04" => 1, "\x05" => 1, "\x06" => 1, "\x07" => 1, + "\x08" => 1, "\x09" => 1, "\x0a" => 1, "\x0b" => 1, "\x0c" => 1, "\x0d" => 1, "\x0e" => 1, "\x0f" => 1, + "\x10" => 1, "\x11" => 1, "\x12" => 1, "\x13" => 1, "\x14" => 1, "\x15" => 1, "\x16" => 1, "\x17" => 1, + "\x18" => 1, "\x19" => 1, "\x1a" => 1, "\x1b" => 1, "\x1c" => 1, "\x1d" => 1, "\x1e" => 1, "\x1f" => 1, + "\x20" => 1, "\x21" => 1, "\x22" => 1, "\x23" => 1, "\x24" => 1, "\x25" => 1, "\x26" => 1, "\x27" => 1, + "\x28" => 1, "\x29" => 1, "\x2a" => 1, "\x2b" => 1, "\x2c" => 1, "\x2d" => 1, "\x2e" => 1, "\x2f" => 1, + "\x30" => 1, "\x31" => 1, "\x32" => 1, "\x33" => 1, "\x34" => 1, "\x35" => 1, "\x36" => 1, "\x37" => 1, + "\x38" => 1, "\x39" => 1, "\x3a" => 1, "\x3b" => 1, "\x3c" => 1, "\x3d" => 1, "\x3e" => 1, "\x3f" => 1, + "\x40" => 1, "\x41" => 1, "\x42" => 1, "\x43" => 1, "\x44" => 1, "\x45" => 1, "\x46" => 1, "\x47" => 1, + "\x48" => 1, "\x49" => 1, "\x4a" => 1, "\x4b" => 1, "\x4c" => 1, "\x4d" => 1, "\x4e" => 1, "\x4f" => 1, + "\x50" => 1, "\x51" => 1, "\x52" => 1, "\x53" => 1, "\x54" => 1, "\x55" => 1, "\x56" => 1, "\x57" => 1, + "\x58" => 1, "\x59" => 1, "\x5a" => 1, "\x5b" => 1, "\x5c" => 1, "\x5d" => 1, "\x5e" => 1, "\x5f" => 1, + "\x60" => 1, "\x61" => 1, "\x62" => 1, "\x63" => 1, "\x64" => 1, "\x65" => 1, "\x66" => 1, "\x67" => 1, + "\x68" => 1, "\x69" => 1, "\x6a" => 1, "\x6b" => 1, "\x6c" => 1, "\x6d" => 1, "\x6e" => 1, "\x6f" => 1, + "\x70" => 1, "\x71" => 1, "\x72" => 1, "\x73" => 1, "\x74" => 1, "\x75" => 1, "\x76" => 1, "\x77" => 1, + "\x78" => 1, "\x79" => 1, "\x7a" => 1, "\x7b" => 1, "\x7c" => 1, "\x7d" => 1, "\x7e" => 1, "\x7f" => 1, + "\x80" => 0, "\x81" => 0, "\x82" => 0, "\x83" => 0, "\x84" => 0, "\x85" => 0, "\x86" => 0, "\x87" => 0, + "\x88" => 0, "\x89" => 0, "\x8a" => 0, "\x8b" => 0, "\x8c" => 0, "\x8d" => 0, "\x8e" => 0, "\x8f" => 0, + "\x90" => 0, "\x91" => 0, "\x92" => 0, "\x93" => 0, "\x94" => 0, "\x95" => 0, "\x96" => 0, "\x97" => 0, + "\x98" => 0, "\x99" => 0, "\x9a" => 0, "\x9b" => 0, "\x9c" => 0, "\x9d" => 0, "\x9e" => 0, "\x9f" => 0, + "\xa0" => 0, "\xa1" => 0, "\xa2" => 0, "\xa3" => 0, "\xa4" => 0, "\xa5" => 0, "\xa6" => 0, "\xa7" => 0, + "\xa8" => 0, "\xa9" => 0, "\xaa" => 0, "\xab" => 0, "\xac" => 0, "\xad" => 0, "\xae" => 0, "\xaf" => 0, + "\xb0" => 0, "\xb1" => 0, "\xb2" => 0, "\xb3" => 0, "\xb4" => 0, "\xb5" => 0, "\xb6" => 0, "\xb7" => 0, + "\xb8" => 0, "\xb9" => 0, "\xba" => 0, "\xbb" => 0, "\xbc" => 0, "\xbd" => 0, "\xbe" => 0, "\xbf" => 0, + "\xc0" => 2, "\xc1" => 2, "\xc2" => 2, "\xc3" => 2, "\xc4" => 2, "\xc5" => 2, "\xc6" => 2, "\xc7" => 2, + "\xc8" => 2, "\xc9" => 2, "\xca" => 2, "\xcb" => 2, "\xcc" => 2, "\xcd" => 2, "\xce" => 2, "\xcf" => 2, + "\xd0" => 2, "\xd1" => 2, "\xd2" => 2, "\xd3" => 2, "\xd4" => 2, "\xd5" => 2, "\xd6" => 2, "\xd7" => 2, + "\xd8" => 2, "\xd9" => 2, "\xda" => 2, "\xdb" => 2, "\xdc" => 2, "\xdd" => 2, "\xde" => 2, "\xdf" => 2, + "\xe0" => 3, "\xe1" => 3, "\xe2" => 3, "\xe3" => 3, "\xe4" => 3, "\xe5" => 3, "\xe6" => 3, "\xe7" => 3, + "\xe8" => 3, "\xe9" => 3, "\xea" => 3, "\xeb" => 3, "\xec" => 3, "\xed" => 3, "\xee" => 3, "\xef" => 3, + "\xf0" => 4, "\xf1" => 4, "\xf2" => 4, "\xf3" => 4, "\xf4" => 4, "\xf5" => 4, "\xf6" => 4, "\xf7" => 4, + "\xf8" => 5, "\xf9" => 5, "\xfa" => 5, "\xfb" => 5, "\xfc" => 6, "\xfd" => 6, "\xfe" => 0, "\xff" => 0, + ]; + + private $data = ''; + private $dataSize = 0; + private $map = []; + private $charCount = 0; + private $currentPos = 0; + private $fixedWidth = 0; + + /** + * @param resource|string $input + */ + public function __construct($input, ?string $charset = 'utf-8') + { + $charset = strtolower(trim($charset)) ?: 'utf-8'; + if ('utf-8' === $charset || 'utf8' === $charset) { + $this->fixedWidth = 0; + $this->map = ['p' => [], 'i' => []]; + } else { + switch ($charset) { + // 16 bits + case 'ucs2': + case 'ucs-2': + case 'utf16': + case 'utf-16': + $this->fixedWidth = 2; + break; + + // 32 bits + case 'ucs4': + case 'ucs-4': + case 'utf32': + case 'utf-32': + $this->fixedWidth = 4; + break; + + // 7-8 bit charsets: (us-)?ascii, (iso|iec)-?8859-?[0-9]+, windows-?125[0-9], cp-?[0-9]+, ansi, macintosh, + // koi-?7, koi-?8-?.+, mik, (cork|t1), v?iscii + // and fallback + default: + $this->fixedWidth = 1; + } + } + if (\is_resource($input)) { + $blocks = 16372; + while (false !== $read = fread($input, $blocks)) { + $this->write($read); + } + } else { + $this->write($input); + } + } + + public function read(int $length): ?string + { + if ($this->currentPos >= $this->charCount) { + return null; + } + $length = ($this->currentPos + $length > $this->charCount) ? $this->charCount - $this->currentPos : $length; + if ($this->fixedWidth > 0) { + $len = $length * $this->fixedWidth; + $ret = substr($this->data, $this->currentPos * $this->fixedWidth, $len); + $this->currentPos += $length; + } else { + $end = $this->currentPos + $length; + $end = $end > $this->charCount ? $this->charCount : $end; + $ret = ''; + $start = 0; + if ($this->currentPos > 0) { + $start = $this->map['p'][$this->currentPos - 1]; + } + $to = $start; + for (; $this->currentPos < $end; ++$this->currentPos) { + if (isset($this->map['i'][$this->currentPos])) { + $ret .= substr($this->data, $start, $to - $start).'?'; + $start = $this->map['p'][$this->currentPos]; + } else { + $to = $this->map['p'][$this->currentPos]; + } + } + $ret .= substr($this->data, $start, $to - $start); + } + + return $ret; + } + + public function readBytes(int $length): ?array + { + if (null !== $read = $this->read($length)) { + return array_map('ord', str_split($read, 1)); + } + + return null; + } + + public function setPointer(int $charOffset): void + { + if ($this->charCount < $charOffset) { + $charOffset = $this->charCount; + } + $this->currentPos = $charOffset; + } + + public function write(string $chars): void + { + $ignored = ''; + $this->data .= $chars; + if ($this->fixedWidth > 0) { + $strlen = \strlen($chars); + $ignoredL = $strlen % $this->fixedWidth; + $ignored = $ignoredL ? substr($chars, -$ignoredL) : ''; + $this->charCount += ($strlen - $ignoredL) / $this->fixedWidth; + } else { + $this->charCount += $this->getUtf8CharPositions($chars, $this->dataSize, $ignored); + } + $this->dataSize = \strlen($this->data) - \strlen($ignored); + } + + private function getUtf8CharPositions(string $string, int $startOffset, string &$ignoredChars): int + { + $strlen = \strlen($string); + $charPos = \count($this->map['p']); + $foundChars = 0; + $invalid = false; + for ($i = 0; $i < $strlen; ++$i) { + $char = $string[$i]; + $size = self::UTF8_LENGTH_MAP[$char]; + if (0 == $size) { + /* char is invalid, we must wait for a resync */ + $invalid = true; + continue; + } + + if ($invalid) { + /* We mark the chars as invalid and start a new char */ + $this->map['p'][$charPos + $foundChars] = $startOffset + $i; + $this->map['i'][$charPos + $foundChars] = true; + ++$foundChars; + $invalid = false; + } + if (($i + $size) > $strlen) { + $ignoredChars = substr($string, $i); + break; + } + for ($j = 1; $j < $size; ++$j) { + $char = $string[$i + $j]; + if ($char > "\x7F" && $char < "\xC0") { + // Valid - continue parsing + } else { + /* char is invalid, we must wait for a resync */ + $invalid = true; + continue 2; + } + } + /* Ok we got a complete char here */ + $this->map['p'][$charPos + $foundChars] = $startOffset + $i + $size; + $i += $j - 1; + ++$foundChars; + } + + return $foundChars; + } +} diff --git a/vendor/symfony/mime/Crypto/SMime.php b/vendor/symfony/mime/Crypto/SMime.php new file mode 100644 index 0000000..ad88c19 --- /dev/null +++ b/vendor/symfony/mime/Crypto/SMime.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Crypto; + +use Symfony\Component\Mime\Exception\RuntimeException; +use Symfony\Component\Mime\Part\SMimePart; + +/** + * @author Sebastiaan Stok + * + * @internal + */ +abstract class SMime +{ + protected function normalizeFilePath(string $path): string + { + if (!file_exists($path)) { + throw new RuntimeException(sprintf('File does not exist: "%s".', $path)); + } + + return 'file://'.str_replace('\\', '/', realpath($path)); + } + + protected function iteratorToFile(iterable $iterator, $stream): void + { + foreach ($iterator as $chunk) { + fwrite($stream, $chunk); + } + } + + protected function convertMessageToSMimePart($stream, string $type, string $subtype): SMimePart + { + rewind($stream); + + $headers = ''; + + while (!feof($stream)) { + $buffer = fread($stream, 78); + $headers .= $buffer; + + // Detect ending of header list + if (preg_match('/(\r\n\r\n|\n\n)/', $headers, $match)) { + $headersPosEnd = strpos($headers, $headerBodySeparator = $match[0]); + + break; + } + } + + $headers = $this->getMessageHeaders(trim(substr($headers, 0, $headersPosEnd))); + + fseek($stream, $headersPosEnd + \strlen($headerBodySeparator)); + + return new SMimePart($this->getStreamIterator($stream), $type, $subtype, $this->getParametersFromHeader($headers['content-type'])); + } + + protected function getStreamIterator($stream): iterable + { + while (!feof($stream)) { + yield str_replace("\n", "\r\n", str_replace("\r\n", "\n", fread($stream, 16372))); + } + } + + private function getMessageHeaders(string $headerData): array + { + $headers = []; + $headerLines = explode("\r\n", str_replace("\n", "\r\n", str_replace("\r\n", "\n", $headerData))); + $currentHeaderName = ''; + + // Transform header lines into an associative array + foreach ($headerLines as $headerLine) { + // Empty lines between headers indicate a new mime-entity + if ('' === $headerLine) { + break; + } + + // Handle headers that span multiple lines + if (false === strpos($headerLine, ':')) { + $headers[$currentHeaderName] .= ' '.trim($headerLine); + continue; + } + + $header = explode(':', $headerLine, 2); + $currentHeaderName = strtolower($header[0]); + $headers[$currentHeaderName] = trim($header[1]); + } + + return $headers; + } + + private function getParametersFromHeader(string $header): array + { + $params = []; + + preg_match_all('/(?P[a-z-0-9]+)=(?P"[^"]+"|(?:[^\s;]+|$))(?:\s+;)?/i', $header, $matches); + + foreach ($matches['value'] as $pos => $paramValue) { + $params[$matches['name'][$pos]] = trim($paramValue, '"'); + } + + return $params; + } +} diff --git a/vendor/symfony/mime/Crypto/SMimeEncrypter.php b/vendor/symfony/mime/Crypto/SMimeEncrypter.php new file mode 100644 index 0000000..d6961a6 --- /dev/null +++ b/vendor/symfony/mime/Crypto/SMimeEncrypter.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Crypto; + +use Symfony\Component\Mime\Exception\RuntimeException; +use Symfony\Component\Mime\Message; + +/** + * @author Sebastiaan Stok + */ +final class SMimeEncrypter extends SMime +{ + private $certs; + private $cipher; + + /** + * @param string|string[] $certificate The path (or array of paths) of the file(s) containing the X.509 certificate(s) + * @param int|null $cipher A set of algorithms used to encrypt the message. Must be one of these PHP constants: https://www.php.net/manual/en/openssl.ciphers.php + */ + public function __construct($certificate, int $cipher = null) + { + if (!\extension_loaded('openssl')) { + throw new \LogicException('PHP extension "openssl" is required to use SMime.'); + } + + if (\is_array($certificate)) { + $this->certs = array_map([$this, 'normalizeFilePath'], $certificate); + } else { + $this->certs = $this->normalizeFilePath($certificate); + } + + $this->cipher = $cipher ?? OPENSSL_CIPHER_AES_256_CBC; + } + + public function encrypt(Message $message): Message + { + $bufferFile = tmpfile(); + $outputFile = tmpfile(); + + $this->iteratorToFile($message->toIterable(), $bufferFile); + + if (!@openssl_pkcs7_encrypt(stream_get_meta_data($bufferFile)['uri'], stream_get_meta_data($outputFile)['uri'], $this->certs, [], 0, $this->cipher)) { + throw new RuntimeException(sprintf('Failed to encrypt S/Mime message. Error: "%s".', openssl_error_string())); + } + + $mimePart = $this->convertMessageToSMimePart($outputFile, 'application', 'pkcs7-mime'); + $mimePart->getHeaders() + ->addTextHeader('Content-Transfer-Encoding', 'base64') + ->addParameterizedHeader('Content-Disposition', 'attachment', ['name' => 'smime.p7m']) + ; + + return new Message($message->getHeaders(), $mimePart); + } +} diff --git a/vendor/symfony/mime/Crypto/SMimeSigner.php b/vendor/symfony/mime/Crypto/SMimeSigner.php new file mode 100644 index 0000000..1b55537 --- /dev/null +++ b/vendor/symfony/mime/Crypto/SMimeSigner.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Crypto; + +use Symfony\Component\Mime\Exception\RuntimeException; +use Symfony\Component\Mime\Message; + +/** + * @author Sebastiaan Stok + */ +final class SMimeSigner extends SMime +{ + private $signCertificate; + private $signPrivateKey; + private $signOptions; + private $extraCerts; + + /** + * @param string $certificate The path of the file containing the signing certificate (in PEM format) + * @param string $privateKey The path of the file containing the private key (in PEM format) + * @param string|null $privateKeyPassphrase A passphrase of the private key (if any) + * @param string|null $extraCerts The path of the file containing intermediate certificates (in PEM format) needed by the signing certificate + * @param int|null $signOptions Bitwise operator options for openssl_pkcs7_sign() (@see https://secure.php.net/manual/en/openssl.pkcs7.flags.php) + */ + public function __construct(string $certificate, string $privateKey, string $privateKeyPassphrase = null, string $extraCerts = null, int $signOptions = null) + { + if (!\extension_loaded('openssl')) { + throw new \LogicException('PHP extension "openssl" is required to use SMime.'); + } + + $this->signCertificate = $this->normalizeFilePath($certificate); + + if (null !== $privateKeyPassphrase) { + $this->signPrivateKey = [$this->normalizeFilePath($privateKey), $privateKeyPassphrase]; + } else { + $this->signPrivateKey = $this->normalizeFilePath($privateKey); + } + + $this->signOptions = $signOptions ?? PKCS7_DETACHED; + $this->extraCerts = $extraCerts ? realpath($extraCerts) : null; + } + + public function sign(Message $message): Message + { + $bufferFile = tmpfile(); + $outputFile = tmpfile(); + + $this->iteratorToFile($message->getBody()->toIterable(), $bufferFile); + + if (!@openssl_pkcs7_sign(stream_get_meta_data($bufferFile)['uri'], stream_get_meta_data($outputFile)['uri'], $this->signCertificate, $this->signPrivateKey, [], $this->signOptions, $this->extraCerts)) { + throw new RuntimeException(sprintf('Failed to sign S/Mime message. Error: "%s".', openssl_error_string())); + } + + return new Message($message->getHeaders(), $this->convertMessageToSMimePart($outputFile, 'multipart', 'signed')); + } +} diff --git a/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php b/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php new file mode 100644 index 0000000..e24beb0 --- /dev/null +++ b/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Registers custom mime types guessers. + * + * @author Fabien Potencier + */ +class AddMimeTypeGuesserPass implements CompilerPassInterface +{ + private $mimeTypesService; + private $mimeTypeGuesserTag; + + public function __construct(string $mimeTypesService = 'mime_types', string $mimeTypeGuesserTag = 'mime.mime_type_guesser') + { + $this->mimeTypesService = $mimeTypesService; + $this->mimeTypeGuesserTag = $mimeTypeGuesserTag; + } + + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + if ($container->has($this->mimeTypesService)) { + $definition = $container->findDefinition($this->mimeTypesService); + foreach ($container->findTaggedServiceIds($this->mimeTypeGuesserTag, true) as $id => $attributes) { + $definition->addMethodCall('registerGuesser', [new Reference($id)]); + } + } + } +} diff --git a/vendor/symfony/mime/Email.php b/vendor/symfony/mime/Email.php new file mode 100644 index 0000000..e5f9f11 --- /dev/null +++ b/vendor/symfony/mime/Email.php @@ -0,0 +1,581 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\LogicException; +use Symfony\Component\Mime\Part\AbstractPart; +use Symfony\Component\Mime\Part\DataPart; +use Symfony\Component\Mime\Part\Multipart\AlternativePart; +use Symfony\Component\Mime\Part\Multipart\MixedPart; +use Symfony\Component\Mime\Part\Multipart\RelatedPart; +use Symfony\Component\Mime\Part\TextPart; + +/** + * @author Fabien Potencier + */ +class Email extends Message +{ + const PRIORITY_HIGHEST = 1; + const PRIORITY_HIGH = 2; + const PRIORITY_NORMAL = 3; + const PRIORITY_LOW = 4; + const PRIORITY_LOWEST = 5; + + private const PRIORITY_MAP = [ + self::PRIORITY_HIGHEST => 'Highest', + self::PRIORITY_HIGH => 'High', + self::PRIORITY_NORMAL => 'Normal', + self::PRIORITY_LOW => 'Low', + self::PRIORITY_LOWEST => 'Lowest', + ]; + + private $text; + private $textCharset; + private $html; + private $htmlCharset; + private $attachments = []; + + /** + * @return $this + */ + public function subject(string $subject) + { + return $this->setHeaderBody('Text', 'Subject', $subject); + } + + public function getSubject(): ?string + { + return $this->getHeaders()->getHeaderBody('Subject'); + } + + /** + * @return $this + */ + public function date(\DateTimeInterface $dateTime) + { + return $this->setHeaderBody('Date', 'Date', $dateTime); + } + + public function getDate(): ?\DateTimeImmutable + { + return $this->getHeaders()->getHeaderBody('Date'); + } + + /** + * @param Address|string $address + * + * @return $this + */ + public function returnPath($address) + { + return $this->setHeaderBody('Path', 'Return-Path', Address::create($address)); + } + + public function getReturnPath(): ?Address + { + return $this->getHeaders()->getHeaderBody('Return-Path'); + } + + /** + * @param Address|string $address + * + * @return $this + */ + public function sender($address) + { + return $this->setHeaderBody('Mailbox', 'Sender', Address::create($address)); + } + + public function getSender(): ?Address + { + return $this->getHeaders()->getHeaderBody('Sender'); + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function addFrom(...$addresses) + { + return $this->addListAddressHeaderBody('From', $addresses); + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function from(...$addresses) + { + return $this->setListAddressHeaderBody('From', $addresses); + } + + /** + * @return Address[] + */ + public function getFrom(): array + { + return $this->getHeaders()->getHeaderBody('From') ?: []; + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function addReplyTo(...$addresses) + { + return $this->addListAddressHeaderBody('Reply-To', $addresses); + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function replyTo(...$addresses) + { + return $this->setListAddressHeaderBody('Reply-To', $addresses); + } + + /** + * @return Address[] + */ + public function getReplyTo(): array + { + return $this->getHeaders()->getHeaderBody('Reply-To') ?: []; + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function addTo(...$addresses) + { + return $this->addListAddressHeaderBody('To', $addresses); + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function to(...$addresses) + { + return $this->setListAddressHeaderBody('To', $addresses); + } + + /** + * @return Address[] + */ + public function getTo(): array + { + return $this->getHeaders()->getHeaderBody('To') ?: []; + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function addCc(...$addresses) + { + return $this->addListAddressHeaderBody('Cc', $addresses); + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function cc(...$addresses) + { + return $this->setListAddressHeaderBody('Cc', $addresses); + } + + /** + * @return Address[] + */ + public function getCc(): array + { + return $this->getHeaders()->getHeaderBody('Cc') ?: []; + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function addBcc(...$addresses) + { + return $this->addListAddressHeaderBody('Bcc', $addresses); + } + + /** + * @param Address|string ...$addresses + * + * @return $this + */ + public function bcc(...$addresses) + { + return $this->setListAddressHeaderBody('Bcc', $addresses); + } + + /** + * @return Address[] + */ + public function getBcc(): array + { + return $this->getHeaders()->getHeaderBody('Bcc') ?: []; + } + + /** + * Sets the priority of this message. + * + * The value is an integer where 1 is the highest priority and 5 is the lowest. + * + * @return $this + */ + public function priority(int $priority) + { + if ($priority > 5) { + $priority = 5; + } elseif ($priority < 1) { + $priority = 1; + } + + return $this->setHeaderBody('Text', 'X-Priority', sprintf('%d (%s)', $priority, self::PRIORITY_MAP[$priority])); + } + + /** + * Get the priority of this message. + * + * The returned value is an integer where 1 is the highest priority and 5 + * is the lowest. + */ + public function getPriority(): int + { + list($priority) = sscanf($this->getHeaders()->getHeaderBody('X-Priority'), '%[1-5]'); + + return $priority ?? 3; + } + + /** + * @param resource|string $body + * + * @return $this + */ + public function text($body, string $charset = 'utf-8') + { + $this->text = $body; + $this->textCharset = $charset; + + return $this; + } + + /** + * @return resource|string|null + */ + public function getTextBody() + { + return $this->text; + } + + public function getTextCharset(): ?string + { + return $this->textCharset; + } + + /** + * @param resource|string|null $body + * + * @return $this + */ + public function html($body, string $charset = 'utf-8') + { + $this->html = $body; + $this->htmlCharset = $charset; + + return $this; + } + + /** + * @return resource|string|null + */ + public function getHtmlBody() + { + return $this->html; + } + + public function getHtmlCharset(): ?string + { + return $this->htmlCharset; + } + + /** + * @param resource|string $body + * + * @return $this + */ + public function attach($body, string $name = null, string $contentType = null) + { + $this->attachments[] = ['body' => $body, 'name' => $name, 'content-type' => $contentType, 'inline' => false]; + + return $this; + } + + /** + * @return $this + */ + public function attachFromPath(string $path, string $name = null, string $contentType = null) + { + $this->attachments[] = ['path' => $path, 'name' => $name, 'content-type' => $contentType, 'inline' => false]; + + return $this; + } + + /** + * @param resource|string $body + * + * @return $this + */ + public function embed($body, string $name = null, string $contentType = null) + { + $this->attachments[] = ['body' => $body, 'name' => $name, 'content-type' => $contentType, 'inline' => true]; + + return $this; + } + + /** + * @return $this + */ + public function embedFromPath(string $path, string $name = null, string $contentType = null) + { + $this->attachments[] = ['path' => $path, 'name' => $name, 'content-type' => $contentType, 'inline' => true]; + + return $this; + } + + /** + * @return $this + */ + public function attachPart(DataPart $part) + { + $this->attachments[] = ['part' => $part]; + + return $this; + } + + /** + * @return DataPart[] + */ + public function getAttachments(): array + { + $parts = []; + foreach ($this->attachments as $attachment) { + $parts[] = $this->createDataPart($attachment); + } + + return $parts; + } + + public function getBody(): AbstractPart + { + if (null !== $body = parent::getBody()) { + return $body; + } + + return $this->generateBody(); + } + + public function ensureValidity() + { + if (null === $this->text && null === $this->html && !$this->attachments) { + throw new LogicException('A message must have a text or an HTML part or attachments.'); + } + + parent::ensureValidity(); + } + + /** + * Generates an AbstractPart based on the raw body of a message. + * + * The most "complex" part generated by this method is when there is text and HTML bodies + * with related images for the HTML part and some attachments: + * + * multipart/mixed + * | + * |------------> multipart/related + * | | + * | |------------> multipart/alternative + * | | | + * | | ------------> text/plain (with content) + * | | | + * | | ------------> text/html (with content) + * | | + * | ------------> image/png (with content) + * | + * ------------> application/pdf (with content) + */ + private function generateBody(): AbstractPart + { + $this->ensureValidity(); + + [$htmlPart, $attachmentParts, $inlineParts] = $this->prepareParts(); + + $part = null === $this->text ? null : new TextPart($this->text, $this->textCharset); + if (null !== $htmlPart) { + if (null !== $part) { + $part = new AlternativePart($part, $htmlPart); + } else { + $part = $htmlPart; + } + } + + if ($inlineParts) { + $part = new RelatedPart($part, ...$inlineParts); + } + + if ($attachmentParts) { + if ($part) { + $part = new MixedPart($part, ...$attachmentParts); + } else { + $part = new MixedPart(...$attachmentParts); + } + } + + return $part; + } + + private function prepareParts(): ?array + { + $names = []; + $htmlPart = null; + $html = $this->html; + if (null !== $this->html) { + $htmlPart = new TextPart($html, $this->htmlCharset, 'html'); + $html = $htmlPart->getBody(); + preg_match_all('(]*src\s*=\s*(?:([\'"])cid:([^"]+)\\1|cid:([^>\s]+)))i', $html, $names); + $names = array_filter(array_unique(array_merge($names[2], $names[3]))); + } + + $attachmentParts = $inlineParts = []; + foreach ($this->attachments as $attachment) { + foreach ($names as $name) { + if (isset($attachment['part'])) { + continue; + } + if ($name !== $attachment['name']) { + continue; + } + if (isset($inlineParts[$name])) { + continue 2; + } + $attachment['inline'] = true; + $inlineParts[$name] = $part = $this->createDataPart($attachment); + $html = str_replace('cid:'.$name, 'cid:'.$part->getContentId(), $html); + continue 2; + } + $attachmentParts[] = $this->createDataPart($attachment); + } + if (null !== $htmlPart) { + $htmlPart = new TextPart($html, $this->htmlCharset, 'html'); + } + + return [$htmlPart, $attachmentParts, array_values($inlineParts)]; + } + + private function createDataPart(array $attachment): DataPart + { + if (isset($attachment['part'])) { + return $attachment['part']; + } + + if (isset($attachment['body'])) { + $part = new DataPart($attachment['body'], $attachment['name'] ?? null, $attachment['content-type'] ?? null); + } else { + $part = DataPart::fromPath($attachment['path'] ?? '', $attachment['name'] ?? null, $attachment['content-type'] ?? null); + } + if ($attachment['inline']) { + $part->asInline(); + } + + return $part; + } + + /** + * @return $this + */ + private function setHeaderBody(string $type, string $name, $body): object + { + $this->getHeaders()->setHeaderBody($type, $name, $body); + + return $this; + } + + private function addListAddressHeaderBody(string $name, array $addresses) + { + if (!$header = $this->getHeaders()->get($name)) { + return $this->setListAddressHeaderBody($name, $addresses); + } + $header->addAddresses(Address::createArray($addresses)); + + return $this; + } + + private function setListAddressHeaderBody(string $name, array $addresses) + { + $addresses = Address::createArray($addresses); + $headers = $this->getHeaders(); + if ($header = $headers->get($name)) { + $header->setAddresses($addresses); + } else { + $headers->addMailboxListHeader($name, $addresses); + } + + return $this; + } + + /** + * @internal + */ + public function __serialize(): array + { + if (\is_resource($this->text)) { + $this->text = (new TextPart($this->text))->getBody(); + } + + if (\is_resource($this->html)) { + $this->html = (new TextPart($this->html))->getBody(); + } + + foreach ($this->attachments as $i => $attachment) { + if (isset($attachment['body']) && \is_resource($attachment['body'])) { + $this->attachments[$i]['body'] = (new TextPart($attachment['body']))->getBody(); + } + } + + return [$this->text, $this->textCharset, $this->html, $this->htmlCharset, $this->attachments, parent::__serialize()]; + } + + /** + * @internal + */ + public function __unserialize(array $data): void + { + [$this->text, $this->textCharset, $this->html, $this->htmlCharset, $this->attachments, $parentData] = $data; + + parent::__unserialize($parentData); + } +} diff --git a/vendor/symfony/mime/Encoder/AddressEncoderInterface.php b/vendor/symfony/mime/Encoder/AddressEncoderInterface.php new file mode 100644 index 0000000..de477d8 --- /dev/null +++ b/vendor/symfony/mime/Encoder/AddressEncoderInterface.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +use Symfony\Component\Mime\Exception\AddressEncoderException; + +/** + * @author Christian Schmidt + */ +interface AddressEncoderInterface +{ + /** + * Encodes an email address. + * + * @throws AddressEncoderException if the email cannot be represented in + * the encoding implemented by this class + */ + public function encodeString(string $address): string; +} diff --git a/vendor/symfony/mime/Encoder/Base64ContentEncoder.php b/vendor/symfony/mime/Encoder/Base64ContentEncoder.php new file mode 100644 index 0000000..881eaab --- /dev/null +++ b/vendor/symfony/mime/Encoder/Base64ContentEncoder.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +use Symfony\Component\Mime\Exception\RuntimeException; + +/** + * @author Fabien Potencier + */ +final class Base64ContentEncoder extends Base64Encoder implements ContentEncoderInterface +{ + public function encodeByteStream($stream, int $maxLineLength = 0): iterable + { + if (!\is_resource($stream)) { + throw new \TypeError(sprintf('Method "%s" takes a stream as a first argument.', __METHOD__)); + } + + $filter = stream_filter_append($stream, 'convert.base64-encode', STREAM_FILTER_READ, [ + 'line-length' => 0 >= $maxLineLength || 76 < $maxLineLength ? 76 : $maxLineLength, + 'line-break-chars' => "\r\n", + ]); + if (!\is_resource($filter)) { + throw new RuntimeException('Unable to set the base64 content encoder to the filter.'); + } + + while (!feof($stream)) { + yield fread($stream, 16372); + } + stream_filter_remove($filter); + } + + public function getName(): string + { + return 'base64'; + } +} diff --git a/vendor/symfony/mime/Encoder/Base64Encoder.php b/vendor/symfony/mime/Encoder/Base64Encoder.php new file mode 100644 index 0000000..7106478 --- /dev/null +++ b/vendor/symfony/mime/Encoder/Base64Encoder.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Chris Corbyn + */ +class Base64Encoder implements EncoderInterface +{ + /** + * Takes an unencoded string and produces a Base64 encoded string from it. + * + * Base64 encoded strings have a maximum line length of 76 characters. + * If the first line needs to be shorter, indicate the difference with + * $firstLineOffset. + */ + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + if (0 >= $maxLineLength || 76 < $maxLineLength) { + $maxLineLength = 76; + } + + $encodedString = base64_encode($string); + $firstLine = ''; + if (0 !== $firstLineOffset) { + $firstLine = substr($encodedString, 0, $maxLineLength - $firstLineOffset)."\r\n"; + $encodedString = substr($encodedString, $maxLineLength - $firstLineOffset); + } + + return $firstLine.trim(chunk_split($encodedString, $maxLineLength, "\r\n")); + } +} diff --git a/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php b/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php new file mode 100644 index 0000000..5c06f6d --- /dev/null +++ b/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Chris Corbyn + */ +final class Base64MimeHeaderEncoder extends Base64Encoder implements MimeHeaderEncoderInterface +{ + public function getName(): string + { + return 'B'; + } + + /** + * Takes an unencoded string and produces a Base64 encoded string from it. + * + * If the charset is iso-2022-jp, it uses mb_encode_mimeheader instead of + * default encodeString, otherwise pass to the parent method. + */ + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + if ('iso-2022-jp' === strtolower($charset)) { + $old = mb_internal_encoding(); + mb_internal_encoding('utf-8'); + $newstring = mb_encode_mimeheader($string, 'iso-2022-jp', $this->getName(), "\r\n"); + mb_internal_encoding($old); + + return $newstring; + } + + return parent::encodeString($string, $charset, $firstLineOffset, $maxLineLength); + } +} diff --git a/vendor/symfony/mime/Encoder/ContentEncoderInterface.php b/vendor/symfony/mime/Encoder/ContentEncoderInterface.php new file mode 100644 index 0000000..a45ad04 --- /dev/null +++ b/vendor/symfony/mime/Encoder/ContentEncoderInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Chris Corbyn + */ +interface ContentEncoderInterface extends EncoderInterface +{ + /** + * Encodes the stream to a Generator. + * + * @param resource $stream + */ + public function encodeByteStream($stream, int $maxLineLength = 0): iterable; + + /** + * Gets the MIME name of this content encoding scheme. + */ + public function getName(): string; +} diff --git a/vendor/symfony/mime/Encoder/EightBitContentEncoder.php b/vendor/symfony/mime/Encoder/EightBitContentEncoder.php new file mode 100644 index 0000000..8283120 --- /dev/null +++ b/vendor/symfony/mime/Encoder/EightBitContentEncoder.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Fabien Potencier + */ +final class EightBitContentEncoder implements ContentEncoderInterface +{ + public function encodeByteStream($stream, int $maxLineLength = 0): iterable + { + while (!feof($stream)) { + yield fread($stream, 16372); + } + } + + public function getName(): string + { + return '8bit'; + } + + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + return $string; + } +} diff --git a/vendor/symfony/mime/Encoder/EncoderInterface.php b/vendor/symfony/mime/Encoder/EncoderInterface.php new file mode 100644 index 0000000..bbf6d48 --- /dev/null +++ b/vendor/symfony/mime/Encoder/EncoderInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Chris Corbyn + */ +interface EncoderInterface +{ + /** + * Encode a given string to produce an encoded string. + * + * @param int $firstLineOffset if first line needs to be shorter + * @param int $maxLineLength - 0 indicates the default length for this encoding + */ + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string; +} diff --git a/vendor/symfony/mime/Encoder/IdnAddressEncoder.php b/vendor/symfony/mime/Encoder/IdnAddressEncoder.php new file mode 100644 index 0000000..cdd5d4c --- /dev/null +++ b/vendor/symfony/mime/Encoder/IdnAddressEncoder.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +use Symfony\Component\Mime\Exception\AddressEncoderException; + +/** + * An IDN email address encoder. + * + * Encodes the domain part of an address using IDN. This is compatible will all + * SMTP servers. + * + * This encoder does not support email addresses with non-ASCII characters in + * local-part (the substring before @). + * + * @author Christian Schmidt + */ +final class IdnAddressEncoder implements AddressEncoderInterface +{ + /** + * Encodes the domain part of an address using IDN. + * + * @throws AddressEncoderException If local-part contains non-ASCII characters + */ + public function encodeString(string $address): string + { + $i = strrpos($address, '@'); + if (false !== $i) { + $local = substr($address, 0, $i); + $domain = substr($address, $i + 1); + + if (preg_match('/[^\x00-\x7F]/', $local)) { + throw new AddressEncoderException(sprintf('Non-ASCII characters not supported in local-part os "%s".', $address)); + } + + if (preg_match('/[^\x00-\x7F]/', $domain)) { + $address = sprintf('%s@%s', $local, idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46)); + } + } + + return $address; + } +} diff --git a/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php b/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php new file mode 100644 index 0000000..fff2c78 --- /dev/null +++ b/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Chris Corbyn + */ +interface MimeHeaderEncoderInterface +{ + /** + * Get the MIME name of this content encoding scheme. + */ + public function getName(): string; +} diff --git a/vendor/symfony/mime/Encoder/QpContentEncoder.php b/vendor/symfony/mime/Encoder/QpContentEncoder.php new file mode 100644 index 0000000..4703cc2 --- /dev/null +++ b/vendor/symfony/mime/Encoder/QpContentEncoder.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Lars Strojny + */ +final class QpContentEncoder implements ContentEncoderInterface +{ + public function encodeByteStream($stream, int $maxLineLength = 0): iterable + { + if (!\is_resource($stream)) { + throw new \TypeError(sprintf('Method "%s" takes a stream as a first argument.', __METHOD__)); + } + + // we don't use PHP stream filters here as the content should be small enough + yield $this->encodeString(stream_get_contents($stream), 'utf-8', 0, $maxLineLength); + } + + public function getName(): string + { + return 'quoted-printable'; + } + + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + return $this->standardize(quoted_printable_encode($string)); + } + + /** + * Make sure CRLF is correct and HT/SPACE are in valid places. + */ + private function standardize(string $string): string + { + // transform CR or LF to CRLF + $string = preg_replace('~=0D(?!=0A)|(? + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +use Symfony\Component\Mime\CharacterStream; + +/** + * @author Chris Corbyn + */ +class QpEncoder implements EncoderInterface +{ + /** + * Pre-computed QP for HUGE optimization. + */ + private static $qpMap = [ + 0 => '=00', 1 => '=01', 2 => '=02', 3 => '=03', 4 => '=04', + 5 => '=05', 6 => '=06', 7 => '=07', 8 => '=08', 9 => '=09', + 10 => '=0A', 11 => '=0B', 12 => '=0C', 13 => '=0D', 14 => '=0E', + 15 => '=0F', 16 => '=10', 17 => '=11', 18 => '=12', 19 => '=13', + 20 => '=14', 21 => '=15', 22 => '=16', 23 => '=17', 24 => '=18', + 25 => '=19', 26 => '=1A', 27 => '=1B', 28 => '=1C', 29 => '=1D', + 30 => '=1E', 31 => '=1F', 32 => '=20', 33 => '=21', 34 => '=22', + 35 => '=23', 36 => '=24', 37 => '=25', 38 => '=26', 39 => '=27', + 40 => '=28', 41 => '=29', 42 => '=2A', 43 => '=2B', 44 => '=2C', + 45 => '=2D', 46 => '=2E', 47 => '=2F', 48 => '=30', 49 => '=31', + 50 => '=32', 51 => '=33', 52 => '=34', 53 => '=35', 54 => '=36', + 55 => '=37', 56 => '=38', 57 => '=39', 58 => '=3A', 59 => '=3B', + 60 => '=3C', 61 => '=3D', 62 => '=3E', 63 => '=3F', 64 => '=40', + 65 => '=41', 66 => '=42', 67 => '=43', 68 => '=44', 69 => '=45', + 70 => '=46', 71 => '=47', 72 => '=48', 73 => '=49', 74 => '=4A', + 75 => '=4B', 76 => '=4C', 77 => '=4D', 78 => '=4E', 79 => '=4F', + 80 => '=50', 81 => '=51', 82 => '=52', 83 => '=53', 84 => '=54', + 85 => '=55', 86 => '=56', 87 => '=57', 88 => '=58', 89 => '=59', + 90 => '=5A', 91 => '=5B', 92 => '=5C', 93 => '=5D', 94 => '=5E', + 95 => '=5F', 96 => '=60', 97 => '=61', 98 => '=62', 99 => '=63', + 100 => '=64', 101 => '=65', 102 => '=66', 103 => '=67', 104 => '=68', + 105 => '=69', 106 => '=6A', 107 => '=6B', 108 => '=6C', 109 => '=6D', + 110 => '=6E', 111 => '=6F', 112 => '=70', 113 => '=71', 114 => '=72', + 115 => '=73', 116 => '=74', 117 => '=75', 118 => '=76', 119 => '=77', + 120 => '=78', 121 => '=79', 122 => '=7A', 123 => '=7B', 124 => '=7C', + 125 => '=7D', 126 => '=7E', 127 => '=7F', 128 => '=80', 129 => '=81', + 130 => '=82', 131 => '=83', 132 => '=84', 133 => '=85', 134 => '=86', + 135 => '=87', 136 => '=88', 137 => '=89', 138 => '=8A', 139 => '=8B', + 140 => '=8C', 141 => '=8D', 142 => '=8E', 143 => '=8F', 144 => '=90', + 145 => '=91', 146 => '=92', 147 => '=93', 148 => '=94', 149 => '=95', + 150 => '=96', 151 => '=97', 152 => '=98', 153 => '=99', 154 => '=9A', + 155 => '=9B', 156 => '=9C', 157 => '=9D', 158 => '=9E', 159 => '=9F', + 160 => '=A0', 161 => '=A1', 162 => '=A2', 163 => '=A3', 164 => '=A4', + 165 => '=A5', 166 => '=A6', 167 => '=A7', 168 => '=A8', 169 => '=A9', + 170 => '=AA', 171 => '=AB', 172 => '=AC', 173 => '=AD', 174 => '=AE', + 175 => '=AF', 176 => '=B0', 177 => '=B1', 178 => '=B2', 179 => '=B3', + 180 => '=B4', 181 => '=B5', 182 => '=B6', 183 => '=B7', 184 => '=B8', + 185 => '=B9', 186 => '=BA', 187 => '=BB', 188 => '=BC', 189 => '=BD', + 190 => '=BE', 191 => '=BF', 192 => '=C0', 193 => '=C1', 194 => '=C2', + 195 => '=C3', 196 => '=C4', 197 => '=C5', 198 => '=C6', 199 => '=C7', + 200 => '=C8', 201 => '=C9', 202 => '=CA', 203 => '=CB', 204 => '=CC', + 205 => '=CD', 206 => '=CE', 207 => '=CF', 208 => '=D0', 209 => '=D1', + 210 => '=D2', 211 => '=D3', 212 => '=D4', 213 => '=D5', 214 => '=D6', + 215 => '=D7', 216 => '=D8', 217 => '=D9', 218 => '=DA', 219 => '=DB', + 220 => '=DC', 221 => '=DD', 222 => '=DE', 223 => '=DF', 224 => '=E0', + 225 => '=E1', 226 => '=E2', 227 => '=E3', 228 => '=E4', 229 => '=E5', + 230 => '=E6', 231 => '=E7', 232 => '=E8', 233 => '=E9', 234 => '=EA', + 235 => '=EB', 236 => '=EC', 237 => '=ED', 238 => '=EE', 239 => '=EF', + 240 => '=F0', 241 => '=F1', 242 => '=F2', 243 => '=F3', 244 => '=F4', + 245 => '=F5', 246 => '=F6', 247 => '=F7', 248 => '=F8', 249 => '=F9', + 250 => '=FA', 251 => '=FB', 252 => '=FC', 253 => '=FD', 254 => '=FE', + 255 => '=FF', + ]; + + private static $safeMapShare = []; + + /** + * A map of non-encoded ascii characters. + * + * @var string[] + * + * @internal + */ + protected $safeMap = []; + + public function __construct() + { + $id = static::class; + if (!isset(self::$safeMapShare[$id])) { + $this->initSafeMap(); + self::$safeMapShare[$id] = $this->safeMap; + } else { + $this->safeMap = self::$safeMapShare[$id]; + } + } + + protected function initSafeMap(): void + { + foreach (array_merge([0x09, 0x20], range(0x21, 0x3C), range(0x3E, 0x7E)) as $byte) { + $this->safeMap[$byte] = \chr($byte); + } + } + + /** + * {@inheritdoc} + * + * Takes an unencoded string and produces a QP encoded string from it. + * + * QP encoded strings have a maximum line length of 76 characters. + * If the first line needs to be shorter, indicate the difference with + * $firstLineOffset. + */ + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + if ($maxLineLength > 76 || $maxLineLength <= 0) { + $maxLineLength = 76; + } + + $thisLineLength = $maxLineLength - $firstLineOffset; + + $lines = []; + $lNo = 0; + $lines[$lNo] = ''; + $currentLine = &$lines[$lNo++]; + $size = $lineLen = 0; + $charStream = new CharacterStream($string, $charset); + + // Fetching more than 4 chars at one is slower, as is fetching fewer bytes + // Conveniently 4 chars is the UTF-8 safe number since UTF-8 has up to 6 + // bytes per char and (6 * 4 * 3 = 72 chars per line) * =NN is 3 bytes + while (null !== $bytes = $charStream->readBytes(4)) { + $enc = $this->encodeByteSequence($bytes, $size); + + $i = strpos($enc, '=0D=0A'); + $newLineLength = $lineLen + (false === $i ? $size : $i); + + if ($currentLine && $newLineLength >= $thisLineLength) { + $lines[$lNo] = ''; + $currentLine = &$lines[$lNo++]; + $thisLineLength = $maxLineLength; + $lineLen = 0; + } + + $currentLine .= $enc; + + if (false === $i) { + $lineLen += $size; + } else { + // 6 is the length of '=0D=0A'. + $lineLen = $size - strrpos($enc, '=0D=0A') - 6; + } + } + + return $this->standardize(implode("=\r\n", $lines)); + } + + /** + * Encode the given byte array into a verbatim QP form. + */ + private function encodeByteSequence(array $bytes, int &$size): string + { + $ret = ''; + $size = 0; + foreach ($bytes as $b) { + if (isset($this->safeMap[$b])) { + $ret .= $this->safeMap[$b]; + ++$size; + } else { + $ret .= self::$qpMap[$b]; + $size += 3; + } + } + + return $ret; + } + + /** + * Make sure CRLF is correct and HT/SPACE are in valid places. + */ + private function standardize(string $string): string + { + $string = str_replace(["\t=0D=0A", ' =0D=0A', '=0D=0A'], ["=09\r\n", "=20\r\n", "\r\n"], $string); + switch ($end = \ord(substr($string, -1))) { + case 0x09: + case 0x20: + $string = substr_replace($string, self::$qpMap[$end], -1); + } + + return $string; + } +} diff --git a/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php b/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php new file mode 100644 index 0000000..d1d3837 --- /dev/null +++ b/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +/** + * @author Chris Corbyn + */ +final class QpMimeHeaderEncoder extends QpEncoder implements MimeHeaderEncoderInterface +{ + protected function initSafeMap(): void + { + foreach (array_merge( + range(0x61, 0x7A), range(0x41, 0x5A), + range(0x30, 0x39), [0x20, 0x21, 0x2A, 0x2B, 0x2D, 0x2F] + ) as $byte) { + $this->safeMap[$byte] = \chr($byte); + } + } + + public function getName(): string + { + return 'Q'; + } + + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + return str_replace([' ', '=20', "=\r\n"], ['_', '_', "\r\n"], + parent::encodeString($string, $charset, $firstLineOffset, $maxLineLength) + ); + } +} diff --git a/vendor/symfony/mime/Encoder/Rfc2231Encoder.php b/vendor/symfony/mime/Encoder/Rfc2231Encoder.php new file mode 100644 index 0000000..aa3e062 --- /dev/null +++ b/vendor/symfony/mime/Encoder/Rfc2231Encoder.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Encoder; + +use Symfony\Component\Mime\CharacterStream; + +/** + * @author Chris Corbyn + */ +final class Rfc2231Encoder implements EncoderInterface +{ + /** + * Takes an unencoded string and produces a string encoded according to RFC 2231 from it. + */ + public function encodeString(string $string, ?string $charset = 'utf-8', int $firstLineOffset = 0, int $maxLineLength = 0): string + { + $lines = []; + $lineCount = 0; + $lines[] = ''; + $currentLine = &$lines[$lineCount++]; + + if (0 >= $maxLineLength) { + $maxLineLength = 75; + } + + $charStream = new CharacterStream($string, $charset); + $thisLineLength = $maxLineLength - $firstLineOffset; + + while (null !== $char = $charStream->read(4)) { + $encodedChar = rawurlencode($char); + if (0 !== \strlen($currentLine) && \strlen($currentLine.$encodedChar) > $thisLineLength) { + $lines[] = ''; + $currentLine = &$lines[$lineCount++]; + $thisLineLength = $maxLineLength; + } + $currentLine .= $encodedChar; + } + + return implode("\r\n", $lines); + } +} diff --git a/vendor/symfony/mime/Exception/AddressEncoderException.php b/vendor/symfony/mime/Exception/AddressEncoderException.php new file mode 100644 index 0000000..51ee2e0 --- /dev/null +++ b/vendor/symfony/mime/Exception/AddressEncoderException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Exception; + +/** + * @author Fabien Potencier + */ +class AddressEncoderException extends RfcComplianceException +{ +} diff --git a/vendor/symfony/mime/Exception/ExceptionInterface.php b/vendor/symfony/mime/Exception/ExceptionInterface.php new file mode 100644 index 0000000..1193390 --- /dev/null +++ b/vendor/symfony/mime/Exception/ExceptionInterface.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Exception; + +/** + * @author Fabien Potencier + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/mime/Exception/InvalidArgumentException.php b/vendor/symfony/mime/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..e89ebae --- /dev/null +++ b/vendor/symfony/mime/Exception/InvalidArgumentException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Exception; + +/** + * @author Fabien Potencier + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/mime/Exception/LogicException.php b/vendor/symfony/mime/Exception/LogicException.php new file mode 100644 index 0000000..0508ee7 --- /dev/null +++ b/vendor/symfony/mime/Exception/LogicException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Exception; + +/** + * @author Fabien Potencier + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/mime/Exception/RfcComplianceException.php b/vendor/symfony/mime/Exception/RfcComplianceException.php new file mode 100644 index 0000000..26e4a50 --- /dev/null +++ b/vendor/symfony/mime/Exception/RfcComplianceException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Exception; + +/** + * @author Fabien Potencier + */ +class RfcComplianceException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/mime/Exception/RuntimeException.php b/vendor/symfony/mime/Exception/RuntimeException.php new file mode 100644 index 0000000..fb018b0 --- /dev/null +++ b/vendor/symfony/mime/Exception/RuntimeException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Exception; + +/** + * @author Fabien Potencier + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php b/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php new file mode 100644 index 0000000..fe1e0cd --- /dev/null +++ b/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\InvalidArgumentException; +use Symfony\Component\Mime\Exception\LogicException; + +/** + * Guesses the MIME type with the binary "file" (only available on *nix). + * + * @author Bernhard Schussek + */ +class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface +{ + private $cmd; + + /** + * The $cmd pattern must contain a "%s" string that will be replaced + * with the file name to guess. + * + * The command output must start with the MIME type of the file. + * + * @param string $cmd The command to run to get the MIME type of a file + */ + public function __construct(string $cmd = 'file -b --mime -- %s 2>/dev/null') + { + $this->cmd = $cmd; + } + + /** + * {@inheritdoc} + */ + public function isGuesserSupported(): bool + { + static $supported = null; + + if (null !== $supported) { + return $supported; + } + + if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('passthru') || !\function_exists('escapeshellarg')) { + return $supported = false; + } + + ob_start(); + passthru('command -v file', $exitStatus); + $binPath = trim(ob_get_clean()); + + return $supported = 0 === $exitStatus && '' !== $binPath; + } + + /** + * {@inheritdoc} + */ + public function guessMimeType(string $path): ?string + { + if (!is_file($path) || !is_readable($path)) { + throw new InvalidArgumentException(sprintf('The "%s" file does not exist or is not readable.', $path)); + } + + if (!$this->isGuesserSupported()) { + throw new LogicException(sprintf('The "%s" guesser is not supported.', __CLASS__)); + } + + ob_start(); + + // need to use --mime instead of -i. see #6641 + passthru(sprintf($this->cmd, escapeshellarg((0 === strpos($path, '-') ? './' : '').$path)), $return); + if ($return > 0) { + ob_end_clean(); + + return null; + } + + $type = trim(ob_get_clean()); + + if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\+\.]+)#i', $type, $match)) { + // it's not a type, but an error message + return null; + } + + return $match[1]; + } +} diff --git a/vendor/symfony/mime/FileinfoMimeTypeGuesser.php b/vendor/symfony/mime/FileinfoMimeTypeGuesser.php new file mode 100644 index 0000000..b91a4ff --- /dev/null +++ b/vendor/symfony/mime/FileinfoMimeTypeGuesser.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\InvalidArgumentException; +use Symfony\Component\Mime\Exception\LogicException; + +/** + * Guesses the MIME type using the PECL extension FileInfo. + * + * @author Bernhard Schussek + */ +class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface +{ + private $magicFile; + + /** + * @param string $magicFile A magic file to use with the finfo instance + * + * @see http://www.php.net/manual/en/function.finfo-open.php + */ + public function __construct(string $magicFile = null) + { + $this->magicFile = $magicFile; + } + + /** + * {@inheritdoc} + */ + public function isGuesserSupported(): bool + { + return \function_exists('finfo_open'); + } + + /** + * {@inheritdoc} + */ + public function guessMimeType(string $path): ?string + { + if (!is_file($path) || !is_readable($path)) { + throw new InvalidArgumentException(sprintf('The "%s" file does not exist or is not readable.', $path)); + } + + if (!$this->isGuesserSupported()) { + throw new LogicException(sprintf('The "%s" guesser is not supported.', __CLASS__)); + } + + if (false === $finfo = new \finfo(FILEINFO_MIME_TYPE, $this->magicFile)) { + return null; + } + + return $finfo->file($path); + } +} diff --git a/vendor/symfony/mime/Header/AbstractHeader.php b/vendor/symfony/mime/Header/AbstractHeader.php new file mode 100644 index 0000000..548c192 --- /dev/null +++ b/vendor/symfony/mime/Header/AbstractHeader.php @@ -0,0 +1,279 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Encoder\QpMimeHeaderEncoder; + +/** + * An abstract base MIME Header. + * + * @author Chris Corbyn + */ +abstract class AbstractHeader implements HeaderInterface +{ + const PHRASE_PATTERN = '(?:(?:(?:(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))*(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))|(?:(?:[ \t]*(?:\r\n))?[ \t])))?[a-zA-Z0-9!#\$%&\'\*\+\-\/=\?\^_`\{\}\|~]+(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))*(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))|(?:(?:[ \t]*(?:\r\n))?[ \t])))?)|(?:(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))*(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))|(?:(?:[ \t]*(?:\r\n))?[ \t])))?"((?:(?:[ \t]*(?:\r\n))?[ \t])?(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21\x23-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])))*(?:(?:[ \t]*(?:\r\n))?[ \t])?"(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))*(?:(?:(?:(?:[ \t]*(?:\r\n))?[ \t])?(\((?:(?:(?:[ \t]*(?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))*(?:(?:[ \t]*(?:\r\n))?[ \t])?\)))|(?:(?:[ \t]*(?:\r\n))?[ \t])))?))+?)'; + + private static $encoder; + + private $name; + private $lineLength = 76; + private $lang; + private $charset = 'utf-8'; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function setCharset(string $charset) + { + $this->charset = $charset; + } + + public function getCharset(): ?string + { + return $this->charset; + } + + /** + * Set the language used in this Header. + * + * For example, for US English, 'en-us'. + */ + public function setLanguage(string $lang) + { + $this->lang = $lang; + } + + public function getLanguage(): ?string + { + return $this->lang; + } + + public function getName(): string + { + return $this->name; + } + + public function setMaxLineLength(int $lineLength) + { + $this->lineLength = $lineLength; + } + + public function getMaxLineLength(): int + { + return $this->lineLength; + } + + public function toString(): string + { + return $this->tokensToString($this->toTokens()); + } + + /** + * Produces a compliant, formatted RFC 2822 'phrase' based on the string given. + * + * @param string $string as displayed + * @param bool $shorten the first line to make remove for header name + */ + protected function createPhrase(HeaderInterface $header, string $string, string $charset, bool $shorten = false): string + { + // Treat token as exactly what was given + $phraseStr = $string; + + // If it's not valid + if (!preg_match('/^'.self::PHRASE_PATTERN.'$/D', $phraseStr)) { + // .. but it is just ascii text, try escaping some characters + // and make it a quoted-string + if (preg_match('/^[\x00-\x08\x0B\x0C\x0E-\x7F]*$/D', $phraseStr)) { + foreach (['\\', '"'] as $char) { + $phraseStr = str_replace($char, '\\'.$char, $phraseStr); + } + $phraseStr = '"'.$phraseStr.'"'; + } else { + // ... otherwise it needs encoding + // Determine space remaining on line if first line + if ($shorten) { + $usedLength = \strlen($header->getName().': '); + } else { + $usedLength = 0; + } + $phraseStr = $this->encodeWords($header, $string, $usedLength); + } + } + + return $phraseStr; + } + + /** + * Encode needed word tokens within a string of input. + */ + protected function encodeWords(HeaderInterface $header, string $input, int $usedLength = -1): string + { + $value = ''; + $tokens = $this->getEncodableWordTokens($input); + foreach ($tokens as $token) { + // See RFC 2822, Sect 2.2 (really 2.2 ??) + if ($this->tokenNeedsEncoding($token)) { + // Don't encode starting WSP + $firstChar = substr($token, 0, 1); + switch ($firstChar) { + case ' ': + case "\t": + $value .= $firstChar; + $token = substr($token, 1); + } + + if (-1 == $usedLength) { + $usedLength = \strlen($header->getName().': ') + \strlen($value); + } + $value .= $this->getTokenAsEncodedWord($token, $usedLength); + } else { + $value .= $token; + } + } + + return $value; + } + + protected function tokenNeedsEncoding(string $token): bool + { + return (bool) preg_match('~[\x00-\x08\x10-\x19\x7F-\xFF\r\n]~', $token); + } + + /** + * Splits a string into tokens in blocks of words which can be encoded quickly. + * + * @return string[] + */ + protected function getEncodableWordTokens(string $string): array + { + $tokens = []; + $encodedToken = ''; + // Split at all whitespace boundaries + foreach (preg_split('~(?=[\t ])~', $string) as $token) { + if ($this->tokenNeedsEncoding($token)) { + $encodedToken .= $token; + } else { + if (\strlen($encodedToken) > 0) { + $tokens[] = $encodedToken; + $encodedToken = ''; + } + $tokens[] = $token; + } + } + if (\strlen($encodedToken)) { + $tokens[] = $encodedToken; + } + + return $tokens; + } + + /** + * Get a token as an encoded word for safe insertion into headers. + */ + protected function getTokenAsEncodedWord(string $token, int $firstLineOffset = 0): string + { + if (null === self::$encoder) { + self::$encoder = new QpMimeHeaderEncoder(); + } + + // Adjust $firstLineOffset to account for space needed for syntax + $charsetDecl = $this->charset; + if (null !== $this->lang) { + $charsetDecl .= '*'.$this->lang; + } + $encodingWrapperLength = \strlen('=?'.$charsetDecl.'?'.self::$encoder->getName().'??='); + + if ($firstLineOffset >= 75) { + //Does this logic need to be here? + $firstLineOffset = 0; + } + + $encodedTextLines = explode("\r\n", + self::$encoder->encodeString($token, $this->charset, $firstLineOffset, 75 - $encodingWrapperLength) + ); + + if ('iso-2022-jp' !== strtolower($this->charset)) { + // special encoding for iso-2022-jp using mb_encode_mimeheader + foreach ($encodedTextLines as $lineNum => $line) { + $encodedTextLines[$lineNum] = '=?'.$charsetDecl.'?'.self::$encoder->getName().'?'.$line.'?='; + } + } + + return implode("\r\n ", $encodedTextLines); + } + + /** + * Generates tokens from the given string which include CRLF as individual tokens. + * + * @return string[] + */ + protected function generateTokenLines(string $token): array + { + return preg_split('~(\r\n)~', $token, -1, PREG_SPLIT_DELIM_CAPTURE); + } + + /** + * Generate a list of all tokens in the final header. + */ + protected function toTokens(string $string = null): array + { + if (null === $string) { + $string = $this->getBodyAsString(); + } + + $tokens = []; + // Generate atoms; split at all invisible boundaries followed by WSP + foreach (preg_split('~(?=[ \t])~', $string) as $token) { + $newTokens = $this->generateTokenLines($token); + foreach ($newTokens as $newToken) { + $tokens[] = $newToken; + } + } + + return $tokens; + } + + /** + * Takes an array of tokens which appear in the header and turns them into + * an RFC 2822 compliant string, adding FWSP where needed. + * + * @param string[] $tokens + */ + private function tokensToString(array $tokens): string + { + $lineCount = 0; + $headerLines = []; + $headerLines[] = $this->name.': '; + $currentLine = &$headerLines[$lineCount++]; + + // Build all tokens back into compliant header + foreach ($tokens as $i => $token) { + // Line longer than specified maximum or token was just a new line + if (("\r\n" === $token) || + ($i > 0 && \strlen($currentLine.$token) > $this->lineLength) + && 0 < \strlen($currentLine)) { + $headerLines[] = ''; + $currentLine = &$headerLines[$lineCount++]; + } + + // Append token to the line + if ("\r\n" !== $token) { + $currentLine .= $token; + } + } + + // Implode with FWS (RFC 2822, 2.2.3) + return implode("\r\n", $headerLines); + } +} diff --git a/vendor/symfony/mime/Header/DateHeader.php b/vendor/symfony/mime/Header/DateHeader.php new file mode 100644 index 0000000..a7385d4 --- /dev/null +++ b/vendor/symfony/mime/Header/DateHeader.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +/** + * A Date MIME Header. + * + * @author Chris Corbyn + */ +final class DateHeader extends AbstractHeader +{ + private $dateTime; + + public function __construct(string $name, \DateTimeInterface $date) + { + parent::__construct($name); + + $this->setDateTime($date); + } + + /** + * @param \DateTimeInterface $body + */ + public function setBody($body) + { + $this->setDateTime($body); + } + + public function getBody(): \DateTimeImmutable + { + return $this->getDateTime(); + } + + public function getDateTime(): \DateTimeImmutable + { + return $this->dateTime; + } + + /** + * Set the date-time of the Date in this Header. + * + * If a DateTime instance is provided, it is converted to DateTimeImmutable. + */ + public function setDateTime(\DateTimeInterface $dateTime) + { + if ($dateTime instanceof \DateTime) { + $immutable = new \DateTimeImmutable('@'.$dateTime->getTimestamp()); + $dateTime = $immutable->setTimezone($dateTime->getTimezone()); + } + $this->dateTime = $dateTime; + } + + public function getBodyAsString(): string + { + return $this->dateTime->format(\DateTime::RFC2822); + } +} diff --git a/vendor/symfony/mime/Header/HeaderInterface.php b/vendor/symfony/mime/Header/HeaderInterface.php new file mode 100644 index 0000000..4546947 --- /dev/null +++ b/vendor/symfony/mime/Header/HeaderInterface.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +/** + * A MIME Header. + * + * @author Chris Corbyn + */ +interface HeaderInterface +{ + /** + * Sets the body. + * + * The type depends on the Header concrete class. + * + * @param mixed $body + */ + public function setBody($body); + + /** + * Gets the body. + * + * The return type depends on the Header concrete class. + * + * @return mixed + */ + public function getBody(); + + public function setCharset(string $charset); + + public function getCharset(): ?string; + + public function setLanguage(string $lang); + + public function getLanguage(): ?string; + + public function getName(): string; + + public function setMaxLineLength(int $lineLength); + + public function getMaxLineLength(): int; + + /** + * Gets this Header rendered as a compliant string. + */ + public function toString(): string; + + /** + * Gets the header's body, prepared for folding into a final header value. + * + * This is not necessarily RFC 2822 compliant since folding white space is + * not added at this stage (see {@link toString()} for that). + */ + public function getBodyAsString(): string; +} diff --git a/vendor/symfony/mime/Header/Headers.php b/vendor/symfony/mime/Header/Headers.php new file mode 100644 index 0000000..57c99c4 --- /dev/null +++ b/vendor/symfony/mime/Header/Headers.php @@ -0,0 +1,282 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Exception\LogicException; + +/** + * A collection of headers. + * + * @author Fabien Potencier + */ +final class Headers +{ + private static $uniqueHeaders = [ + 'date', 'from', 'sender', 'reply-to', 'to', 'cc', 'bcc', + 'message-id', 'in-reply-to', 'references', 'subject', + ]; + + private $headers = []; + private $lineLength = 76; + + public function __construct(HeaderInterface ...$headers) + { + foreach ($headers as $header) { + $this->add($header); + } + } + + public function __clone() + { + foreach ($this->headers as $name => $collection) { + foreach ($collection as $i => $header) { + $this->headers[$name][$i] = clone $header; + } + } + } + + public function setMaxLineLength(int $lineLength) + { + $this->lineLength = $lineLength; + foreach ($this->all() as $header) { + $header->setMaxLineLength($lineLength); + } + } + + public function getMaxLineLength(): int + { + return $this->lineLength; + } + + /** + * @param (Address|string)[] $addresses + * + * @return $this + */ + public function addMailboxListHeader(string $name, array $addresses): self + { + return $this->add(new MailboxListHeader($name, Address::createArray($addresses))); + } + + /** + * @param Address|string $address + * + * @return $this + */ + public function addMailboxHeader(string $name, $address): self + { + return $this->add(new MailboxHeader($name, Address::create($address))); + } + + /** + * @param string|array $ids + * + * @return $this + */ + public function addIdHeader(string $name, $ids): self + { + return $this->add(new IdentificationHeader($name, $ids)); + } + + /** + * @param Address|string $path + * + * @return $this + */ + public function addPathHeader(string $name, $path): self + { + return $this->add(new PathHeader($name, $path instanceof Address ? $path : new Address($path))); + } + + /** + * @return $this + */ + public function addDateHeader(string $name, \DateTimeInterface $dateTime): self + { + return $this->add(new DateHeader($name, $dateTime)); + } + + /** + * @return $this + */ + public function addTextHeader(string $name, string $value): self + { + return $this->add(new UnstructuredHeader($name, $value)); + } + + /** + * @return $this + */ + public function addParameterizedHeader(string $name, string $value, array $params = []): self + { + return $this->add(new ParameterizedHeader($name, $value, $params)); + } + + public function has(string $name): bool + { + return isset($this->headers[strtolower($name)]); + } + + /** + * @return $this + */ + public function add(HeaderInterface $header): self + { + static $map = [ + 'date' => DateHeader::class, + 'from' => MailboxListHeader::class, + 'sender' => MailboxHeader::class, + 'reply-to' => MailboxListHeader::class, + 'to' => MailboxListHeader::class, + 'cc' => MailboxListHeader::class, + 'bcc' => MailboxListHeader::class, + 'message-id' => IdentificationHeader::class, + 'in-reply-to' => IdentificationHeader::class, + 'references' => IdentificationHeader::class, + 'return-path' => PathHeader::class, + ]; + + $header->setMaxLineLength($this->lineLength); + $name = strtolower($header->getName()); + + if (isset($map[$name]) && !$header instanceof $map[$name]) { + throw new LogicException(sprintf('The "%s" header must be an instance of "%s" (got "%s").', $header->getName(), $map[$name], get_debug_type($header))); + } + + if (\in_array($name, self::$uniqueHeaders, true) && isset($this->headers[$name]) && \count($this->headers[$name]) > 0) { + throw new LogicException(sprintf('Impossible to set header "%s" as it\'s already defined and must be unique.', $header->getName())); + } + + $this->headers[$name][] = $header; + + return $this; + } + + public function get(string $name): ?HeaderInterface + { + $name = strtolower($name); + if (!isset($this->headers[$name])) { + return null; + } + + $values = array_values($this->headers[$name]); + + return array_shift($values); + } + + public function all(string $name = null): iterable + { + if (null === $name) { + foreach ($this->headers as $name => $collection) { + foreach ($collection as $header) { + yield $name => $header; + } + } + } elseif (isset($this->headers[strtolower($name)])) { + foreach ($this->headers[strtolower($name)] as $header) { + yield $header; + } + } + } + + public function getNames(): array + { + return array_keys($this->headers); + } + + public function remove(string $name): void + { + unset($this->headers[strtolower($name)]); + } + + public static function isUniqueHeader(string $name): bool + { + return \in_array($name, self::$uniqueHeaders, true); + } + + public function toString(): string + { + $string = ''; + foreach ($this->toArray() as $str) { + $string .= $str."\r\n"; + } + + return $string; + } + + public function toArray(): array + { + $arr = []; + foreach ($this->all() as $header) { + if ('' !== $header->getBodyAsString()) { + $arr[] = $header->toString(); + } + } + + return $arr; + } + + /** + * @internal + */ + public function getHeaderBody($name) + { + return $this->has($name) ? $this->get($name)->getBody() : null; + } + + /** + * @internal + */ + public function setHeaderBody(string $type, string $name, $body): void + { + if ($this->has($name)) { + $this->get($name)->setBody($body); + } else { + $this->{'add'.$type.'Header'}($name, $body); + } + } + + /** + * @internal + */ + public function getHeaderParameter(string $name, string $parameter): ?string + { + if (!$this->has($name)) { + return null; + } + + $header = $this->get($name); + if (!$header instanceof ParameterizedHeader) { + throw new LogicException(sprintf('Unable to get parameter "%s" on header "%s" as the header is not of class "%s".', $parameter, $name, ParameterizedHeader::class)); + } + + return $header->getParameter($parameter); + } + + /** + * @internal + */ + public function setHeaderParameter(string $name, string $parameter, $value): void + { + if (!$this->has($name)) { + throw new LogicException(sprintf('Unable to set parameter "%s" on header "%s" as the header is not defined.', $parameter, $name)); + } + + $header = $this->get($name); + if (!$header instanceof ParameterizedHeader) { + throw new LogicException(sprintf('Unable to set parameter "%s" on header "%s" as the header is not of class "%s".', $parameter, $name, ParameterizedHeader::class)); + } + + $header->setParameter($parameter, $value); + } +} diff --git a/vendor/symfony/mime/Header/IdentificationHeader.php b/vendor/symfony/mime/Header/IdentificationHeader.php new file mode 100644 index 0000000..8a94574 --- /dev/null +++ b/vendor/symfony/mime/Header/IdentificationHeader.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Exception\RfcComplianceException; + +/** + * An ID MIME Header for something like Message-ID or Content-ID (one or more addresses). + * + * @author Chris Corbyn + */ +final class IdentificationHeader extends AbstractHeader +{ + private $ids = []; + private $idsAsAddresses = []; + + /** + * @param string|array $ids + */ + public function __construct(string $name, $ids) + { + parent::__construct($name); + + $this->setId($ids); + } + + /** + * @param string|array $body a string ID or an array of IDs + * + * @throws RfcComplianceException + */ + public function setBody($body) + { + $this->setId($body); + } + + public function getBody(): array + { + return $this->getIds(); + } + + /** + * Set the ID used in the value of this header. + * + * @param string|array $id + * + * @throws RfcComplianceException + */ + public function setId($id) + { + $this->setIds(\is_array($id) ? $id : [$id]); + } + + /** + * Get the ID used in the value of this Header. + * + * If multiple IDs are set only the first is returned. + */ + public function getId(): ?string + { + return $this->ids[0] ?? null; + } + + /** + * Set a collection of IDs to use in the value of this Header. + * + * @param string[] $ids + * + * @throws RfcComplianceException + */ + public function setIds(array $ids) + { + $this->ids = []; + $this->idsAsAddresses = []; + foreach ($ids as $id) { + $this->idsAsAddresses[] = new Address($id); + $this->ids[] = $id; + } + } + + /** + * Get the list of IDs used in this Header. + * + * @return string[] + */ + public function getIds(): array + { + return $this->ids; + } + + public function getBodyAsString(): string + { + $addrs = []; + foreach ($this->idsAsAddresses as $address) { + $addrs[] = '<'.$address->toString().'>'; + } + + return implode(' ', $addrs); + } +} diff --git a/vendor/symfony/mime/Header/MailboxHeader.php b/vendor/symfony/mime/Header/MailboxHeader.php new file mode 100644 index 0000000..b58c825 --- /dev/null +++ b/vendor/symfony/mime/Header/MailboxHeader.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Exception\RfcComplianceException; + +/** + * A Mailbox MIME Header for something like Sender (one named address). + * + * @author Fabien Potencier + */ +final class MailboxHeader extends AbstractHeader +{ + private $address; + + public function __construct(string $name, Address $address) + { + parent::__construct($name); + + $this->setAddress($address); + } + + /** + * @param Address $body + * + * @throws RfcComplianceException + */ + public function setBody($body) + { + $this->setAddress($body); + } + + /** + * @throws RfcComplianceException + */ + public function getBody(): Address + { + return $this->getAddress(); + } + + /** + * @throws RfcComplianceException + */ + public function setAddress(Address $address) + { + $this->address = $address; + } + + public function getAddress(): Address + { + return $this->address; + } + + public function getBodyAsString(): string + { + $str = $this->address->getEncodedAddress(); + if ($name = $this->address->getName()) { + $str = $this->createPhrase($this, $name, $this->getCharset(), true).' <'.$str.'>'; + } + + return $str; + } + + /** + * Redefine the encoding requirements for an address. + * + * All "specials" must be encoded as the full header value will not be quoted + * + * @see RFC 2822 3.2.1 + */ + protected function tokenNeedsEncoding(string $token): bool + { + return preg_match('/[()<>\[\]:;@\,."]/', $token) || parent::tokenNeedsEncoding($token); + } +} diff --git a/vendor/symfony/mime/Header/MailboxListHeader.php b/vendor/symfony/mime/Header/MailboxListHeader.php new file mode 100644 index 0000000..1d00fdb --- /dev/null +++ b/vendor/symfony/mime/Header/MailboxListHeader.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Exception\RfcComplianceException; + +/** + * A Mailbox list MIME Header for something like From, To, Cc, and Bcc (one or more named addresses). + * + * @author Chris Corbyn + */ +final class MailboxListHeader extends AbstractHeader +{ + private $addresses = []; + + /** + * @param Address[] $addresses + */ + public function __construct(string $name, array $addresses) + { + parent::__construct($name); + + $this->setAddresses($addresses); + } + + /** + * @param Address[] $body + * + * @throws RfcComplianceException + */ + public function setBody($body) + { + $this->setAddresses($body); + } + + /** + * @throws RfcComplianceException + * + * @return Address[] + */ + public function getBody(): array + { + return $this->getAddresses(); + } + + /** + * Sets a list of addresses to be shown in this Header. + * + * @param Address[] $addresses + * + * @throws RfcComplianceException + */ + public function setAddresses(array $addresses) + { + $this->addresses = []; + $this->addAddresses($addresses); + } + + /** + * Sets a list of addresses to be shown in this Header. + * + * @param Address[] $addresses + * + * @throws RfcComplianceException + */ + public function addAddresses(array $addresses) + { + foreach ($addresses as $address) { + $this->addAddress($address); + } + } + + /** + * @throws RfcComplianceException + */ + public function addAddress(Address $address) + { + $this->addresses[] = $address; + } + + /** + * @return Address[] + */ + public function getAddresses(): array + { + return $this->addresses; + } + + /** + * Gets the full mailbox list of this Header as an array of valid RFC 2822 strings. + * + * @throws RfcComplianceException + * + * @return string[] + */ + public function getAddressStrings(): array + { + $strings = []; + foreach ($this->addresses as $address) { + $str = $address->getEncodedAddress(); + if ($name = $address->getName()) { + $str = $this->createPhrase($this, $name, $this->getCharset(), !$strings).' <'.$str.'>'; + } + $strings[] = $str; + } + + return $strings; + } + + public function getBodyAsString(): string + { + return implode(', ', $this->getAddressStrings()); + } + + /** + * Redefine the encoding requirements for addresses. + * + * All "specials" must be encoded as the full header value will not be quoted + * + * @see RFC 2822 3.2.1 + */ + protected function tokenNeedsEncoding(string $token): bool + { + return preg_match('/[()<>\[\]:;@\,."]/', $token) || parent::tokenNeedsEncoding($token); + } +} diff --git a/vendor/symfony/mime/Header/ParameterizedHeader.php b/vendor/symfony/mime/Header/ParameterizedHeader.php new file mode 100644 index 0000000..d8e5001 --- /dev/null +++ b/vendor/symfony/mime/Header/ParameterizedHeader.php @@ -0,0 +1,174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Encoder\Rfc2231Encoder; + +/** + * @author Chris Corbyn + */ +final class ParameterizedHeader extends UnstructuredHeader +{ + /** + * RFC 2231's definition of a token. + * + * @var string + */ + const TOKEN_REGEX = '(?:[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E]+)'; + + private $encoder; + private $parameters = []; + + public function __construct(string $name, string $value, array $parameters = []) + { + parent::__construct($name, $value); + + foreach ($parameters as $k => $v) { + $this->setParameter($k, $v); + } + + if ('content-type' !== strtolower($name)) { + $this->encoder = new Rfc2231Encoder(); + } + } + + public function setParameter(string $parameter, ?string $value) + { + $this->setParameters(array_merge($this->getParameters(), [$parameter => $value])); + } + + public function getParameter(string $parameter): string + { + return $this->getParameters()[$parameter] ?? ''; + } + + /** + * @param string[] $parameters + */ + public function setParameters(array $parameters) + { + $this->parameters = $parameters; + } + + /** + * @return string[] + */ + public function getParameters(): array + { + return $this->parameters; + } + + public function getBodyAsString(): string + { + $body = parent::getBodyAsString(); + foreach ($this->parameters as $name => $value) { + if (null !== $value) { + $body .= '; '.$this->createParameter($name, $value); + } + } + + return $body; + } + + /** + * Generate a list of all tokens in the final header. + * + * This doesn't need to be overridden in theory, but it is for implementation + * reasons to prevent potential breakage of attributes. + */ + protected function toTokens(string $string = null): array + { + $tokens = parent::toTokens(parent::getBodyAsString()); + + // Try creating any parameters + foreach ($this->parameters as $name => $value) { + if (null !== $value) { + // Add the semi-colon separator + $tokens[\count($tokens) - 1] .= ';'; + $tokens = array_merge($tokens, $this->generateTokenLines(' '.$this->createParameter($name, $value))); + } + } + + return $tokens; + } + + /** + * Render a RFC 2047 compliant header parameter from the $name and $value. + */ + private function createParameter(string $name, string $value): string + { + $origValue = $value; + + $encoded = false; + // Allow room for parameter name, indices, "=" and DQUOTEs + $maxValueLength = $this->getMaxLineLength() - \strlen($name.'=*N"";') - 1; + $firstLineOffset = 0; + + // If it's not already a valid parameter value... + if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) { + // TODO: text, or something else?? + // ... and it's not ascii + if (!preg_match('/^[\x00-\x08\x0B\x0C\x0E-\x7F]*$/D', $value)) { + $encoded = true; + // Allow space for the indices, charset and language + $maxValueLength = $this->getMaxLineLength() - \strlen($name.'*N*="";') - 1; + $firstLineOffset = \strlen($this->getCharset()."'".$this->getLanguage()."'"); + } + } + + // Encode if we need to + if ($encoded || \strlen($value) > $maxValueLength) { + if (null !== $this->encoder) { + $value = $this->encoder->encodeString($origValue, $this->getCharset(), $firstLineOffset, $maxValueLength); + } else { + // We have to go against RFC 2183/2231 in some areas for interoperability + $value = $this->getTokenAsEncodedWord($origValue); + $encoded = false; + } + } + + $valueLines = $this->encoder ? explode("\r\n", $value) : [$value]; + + // Need to add indices + if (\count($valueLines) > 1) { + $paramLines = []; + foreach ($valueLines as $i => $line) { + $paramLines[] = $name.'*'.$i.$this->getEndOfParameterValue($line, true, 0 === $i); + } + + return implode(";\r\n ", $paramLines); + } else { + return $name.$this->getEndOfParameterValue($valueLines[0], $encoded, true); + } + } + + /** + * Returns the parameter value from the "=" and beyond. + * + * @param string $value to append + */ + private function getEndOfParameterValue(string $value, bool $encoded = false, bool $firstLine = false): string + { + if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) { + $value = '"'.$value.'"'; + } + $prepend = '='; + if ($encoded) { + $prepend = '*='; + if ($firstLine) { + $prepend = '*='.$this->getCharset()."'".$this->getLanguage()."'"; + } + } + + return $prepend.$value; + } +} diff --git a/vendor/symfony/mime/Header/PathHeader.php b/vendor/symfony/mime/Header/PathHeader.php new file mode 100644 index 0000000..5101ad0 --- /dev/null +++ b/vendor/symfony/mime/Header/PathHeader.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Exception\RfcComplianceException; + +/** + * A Path Header, such a Return-Path (one address). + * + * @author Chris Corbyn + */ +final class PathHeader extends AbstractHeader +{ + private $address; + + public function __construct(string $name, Address $address) + { + parent::__construct($name); + + $this->setAddress($address); + } + + /** + * @param Address $body + * + * @throws RfcComplianceException + */ + public function setBody($body) + { + $this->setAddress($body); + } + + public function getBody(): Address + { + return $this->getAddress(); + } + + public function setAddress(Address $address) + { + $this->address = $address; + } + + public function getAddress(): Address + { + return $this->address; + } + + public function getBodyAsString(): string + { + return '<'.$this->address->toString().'>'; + } +} diff --git a/vendor/symfony/mime/Header/UnstructuredHeader.php b/vendor/symfony/mime/Header/UnstructuredHeader.php new file mode 100644 index 0000000..2085ddf --- /dev/null +++ b/vendor/symfony/mime/Header/UnstructuredHeader.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Header; + +/** + * A Simple MIME Header. + * + * @author Chris Corbyn + */ +class UnstructuredHeader extends AbstractHeader +{ + private $value; + + public function __construct(string $name, string $value) + { + parent::__construct($name); + + $this->setValue($value); + } + + /** + * @param string $body + */ + public function setBody($body) + { + $this->setValue($body); + } + + /** + * @return string + */ + public function getBody() + { + return $this->getValue(); + } + + /** + * Get the (unencoded) value of this header. + */ + public function getValue(): string + { + return $this->value; + } + + /** + * Set the (unencoded) value of this header. + */ + public function setValue(string $value) + { + $this->value = $value; + } + + /** + * Get the value of this header prepared for rendering. + */ + public function getBodyAsString(): string + { + return $this->encodeWords($this, $this->value); + } +} diff --git a/vendor/symfony/mime/LICENSE b/vendor/symfony/mime/LICENSE new file mode 100644 index 0000000..d53be68 --- /dev/null +++ b/vendor/symfony/mime/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/mime/Message.php b/vendor/symfony/mime/Message.php new file mode 100644 index 0000000..b7ddb76 --- /dev/null +++ b/vendor/symfony/mime/Message.php @@ -0,0 +1,158 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\LogicException; +use Symfony\Component\Mime\Header\Headers; +use Symfony\Component\Mime\Part\AbstractPart; +use Symfony\Component\Mime\Part\TextPart; + +/** + * @author Fabien Potencier + */ +class Message extends RawMessage +{ + private $headers; + private $body; + + public function __construct(Headers $headers = null, AbstractPart $body = null) + { + $this->headers = $headers ? clone $headers : new Headers(); + $this->body = $body; + } + + public function __clone() + { + $this->headers = clone $this->headers; + + if (null !== $this->body) { + $this->body = clone $this->body; + } + } + + /** + * @return $this + */ + public function setBody(AbstractPart $body = null) + { + $this->body = $body; + + return $this; + } + + public function getBody(): ?AbstractPart + { + return $this->body; + } + + /** + * @return $this + */ + public function setHeaders(Headers $headers) + { + $this->headers = $headers; + + return $this; + } + + public function getHeaders(): Headers + { + return $this->headers; + } + + public function getPreparedHeaders(): Headers + { + $headers = clone $this->headers; + + if (!$headers->has('From')) { + if (!$headers->has('Sender')) { + throw new LogicException('An email must have a "From" or a "Sender" header.'); + } + $headers->addMailboxListHeader('From', [$headers->get('Sender')->getAddress()]); + } + + $headers->addTextHeader('MIME-Version', '1.0'); + + if (!$headers->has('Date')) { + $headers->addDateHeader('Date', new \DateTimeImmutable()); + } + + // determine the "real" sender + if (!$headers->has('Sender') && \count($froms = $headers->get('From')->getAddresses()) > 1) { + $headers->addMailboxHeader('Sender', $froms[0]); + } + + if (!$headers->has('Message-ID')) { + $headers->addIdHeader('Message-ID', $this->generateMessageId()); + } + + // remove the Bcc field which should NOT be part of the sent message + $headers->remove('Bcc'); + + return $headers; + } + + public function toString(): string + { + if (null === $body = $this->getBody()) { + $body = new TextPart(''); + } + + return $this->getPreparedHeaders()->toString().$body->toString(); + } + + public function toIterable(): iterable + { + if (null === $body = $this->getBody()) { + $body = new TextPart(''); + } + + yield $this->getPreparedHeaders()->toString(); + yield from $body->toIterable(); + } + + public function ensureValidity() + { + if (!$this->headers->has('To') && !$this->headers->has('Cc') && !$this->headers->has('Bcc')) { + throw new LogicException('An email must have a "To", "Cc", or "Bcc" header.'); + } + + if (!$this->headers->has('From') && !$this->headers->has('Sender')) { + throw new LogicException('An email must have a "From" or a "Sender" header.'); + } + + parent::ensureValidity(); + } + + public function generateMessageId(): string + { + if ($this->headers->has('Sender')) { + $sender = $this->headers->get('Sender')->getAddress(); + } elseif ($this->headers->has('From')) { + $sender = $this->headers->get('From')->getAddresses()[0]; + } else { + throw new LogicException('An email must have a "From" or a "Sender" header.'); + } + + return bin2hex(random_bytes(16)).strstr($sender->getAddress(), '@'); + } + + public function __serialize(): array + { + return [$this->headers, $this->body]; + } + + public function __unserialize(array $data): void + { + [$this->headers, $this->body] = $data; + } +} diff --git a/vendor/symfony/mime/MessageConverter.php b/vendor/symfony/mime/MessageConverter.php new file mode 100644 index 0000000..788a5ff --- /dev/null +++ b/vendor/symfony/mime/MessageConverter.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\RuntimeException; +use Symfony\Component\Mime\Part\DataPart; +use Symfony\Component\Mime\Part\Multipart\AlternativePart; +use Symfony\Component\Mime\Part\Multipart\MixedPart; +use Symfony\Component\Mime\Part\Multipart\RelatedPart; +use Symfony\Component\Mime\Part\TextPart; + +/** + * @author Fabien Potencier + */ +final class MessageConverter +{ + /** + * @throws RuntimeException when unable to convert the message to an email + */ + public static function toEmail(Message $message): Email + { + if ($message instanceof Email) { + return $message; + } + + // try to convert to a "simple" Email instance + $body = $message->getBody(); + if ($body instanceof TextPart) { + return self::createEmailFromTextPart($message, $body); + } + + if ($body instanceof AlternativePart) { + return self::createEmailFromAlternativePart($message, $body); + } + + if ($body instanceof RelatedPart) { + return self::createEmailFromRelatedPart($message, $body); + } + + if ($body instanceof MixedPart) { + $parts = $body->getParts(); + if ($parts[0] instanceof RelatedPart) { + $email = self::createEmailFromRelatedPart($message, $parts[0]); + } elseif ($parts[0] instanceof AlternativePart) { + $email = self::createEmailFromAlternativePart($message, $parts[0]); + } elseif ($parts[0] instanceof TextPart) { + $email = self::createEmailFromTextPart($message, $parts[0]); + } else { + throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', get_debug_type($message))); + } + + return self::attachParts($email, \array_slice($parts, 1)); + } + + throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', get_debug_type($message))); + } + + private static function createEmailFromTextPart(Message $message, TextPart $part): Email + { + if ('text' === $part->getMediaType() && 'plain' === $part->getMediaSubtype()) { + return (new Email(clone $message->getHeaders()))->text($part->getBody(), $part->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8'); + } + if ('text' === $part->getMediaType() && 'html' === $part->getMediaSubtype()) { + return (new Email(clone $message->getHeaders()))->html($part->getBody(), $part->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8'); + } + + throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', get_debug_type($message))); + } + + private static function createEmailFromAlternativePart(Message $message, AlternativePart $part): Email + { + $parts = $part->getParts(); + if ( + 2 === \count($parts) && + $parts[0] instanceof TextPart && 'text' === $parts[0]->getMediaType() && 'plain' === $parts[0]->getMediaSubtype() && + $parts[1] instanceof TextPart && 'text' === $parts[1]->getMediaType() && 'html' === $parts[1]->getMediaSubtype() + ) { + return (new Email(clone $message->getHeaders())) + ->text($parts[0]->getBody(), $parts[0]->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8') + ->html($parts[1]->getBody(), $parts[1]->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8') + ; + } + + throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', get_debug_type($message))); + } + + private static function createEmailFromRelatedPart(Message $message, RelatedPart $part): Email + { + $parts = $part->getParts(); + if ($parts[0] instanceof AlternativePart) { + $email = self::createEmailFromAlternativePart($message, $parts[0]); + } elseif ($parts[0] instanceof TextPart) { + $email = self::createEmailFromTextPart($message, $parts[0]); + } else { + throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', get_debug_type($message))); + } + + return self::attachParts($email, \array_slice($parts, 1)); + } + + private static function attachParts(Email $email, array $parts): Email + { + foreach ($parts as $part) { + if (!$part instanceof DataPart) { + throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', get_debug_type($email))); + } + + $headers = $part->getPreparedHeaders(); + $method = 'inline' === $headers->getHeaderBody('Content-Disposition') ? 'embed' : 'attach'; + $name = $headers->getHeaderParameter('Content-Disposition', 'filename'); + $email->$method($part->getBody(), $name, $part->getMediaType().'/'.$part->getMediaSubtype()); + } + + return $email; + } +} diff --git a/vendor/symfony/mime/MimeTypeGuesserInterface.php b/vendor/symfony/mime/MimeTypeGuesserInterface.php new file mode 100644 index 0000000..68b0505 --- /dev/null +++ b/vendor/symfony/mime/MimeTypeGuesserInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +/** + * Guesses the MIME type of a file. + * + * @author Fabien Potencier + */ +interface MimeTypeGuesserInterface +{ + /** + * Returns true if this guesser is supported. + */ + public function isGuesserSupported(): bool; + + /** + * Guesses the MIME type of the file with the given path. + * + * @param string $path The path to the file + * + * @return string|null The MIME type or null, if none could be guessed + * + * @throws \LogicException If the guesser is not supported + * @throws \InvalidArgumentException If the file does not exist or is not readable + */ + public function guessMimeType(string $path): ?string; +} diff --git a/vendor/symfony/mime/MimeTypes.php b/vendor/symfony/mime/MimeTypes.php new file mode 100644 index 0000000..c4222b3 --- /dev/null +++ b/vendor/symfony/mime/MimeTypes.php @@ -0,0 +1,3155 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\LogicException; + +/** + * Manages MIME types and file extensions. + * + * For MIME type guessing, you can register custom guessers + * by calling the registerGuesser() method. + * Custom guessers are always called before any default ones: + * + * $guesser = new MimeTypes(); + * $guesser->registerGuesser(new MyCustomMimeTypeGuesser()); + * + * If you want to change the order of the default guessers, just re-register your + * preferred one as a custom one. The last registered guesser is preferred over + * previously registered ones. + * + * Re-registering a built-in guesser also allows you to configure it: + * + * $guesser = new MimeTypes(); + * $guesser->registerGuesser(new FileinfoMimeTypeGuesser('/path/to/magic/file')); + * + * @author Fabien Potencier + */ +final class MimeTypes implements MimeTypesInterface +{ + private $extensions = []; + private $mimeTypes = []; + + /** + * @var MimeTypeGuesserInterface[] + */ + private $guessers = []; + private static $default; + + public function __construct(array $map = []) + { + foreach ($map as $mimeType => $extensions) { + $this->extensions[$mimeType] = $extensions; + + foreach ($extensions as $extension) { + $this->mimeTypes[$extension][] = $mimeType; + } + } + $this->registerGuesser(new FileBinaryMimeTypeGuesser()); + $this->registerGuesser(new FileinfoMimeTypeGuesser()); + } + + public static function setDefault(self $default) + { + self::$default = $default; + } + + public static function getDefault(): self + { + return self::$default ?? self::$default = new self(); + } + + /** + * Registers a MIME type guesser. + * + * The last registered guesser has precedence over the other ones. + */ + public function registerGuesser(MimeTypeGuesserInterface $guesser) + { + array_unshift($this->guessers, $guesser); + } + + /** + * {@inheritdoc} + */ + public function getExtensions(string $mimeType): array + { + if ($this->extensions) { + $extensions = $this->extensions[$mimeType] ?? $this->extensions[$lcMimeType = strtolower($mimeType)] ?? null; + } + + return $extensions ?? self::$map[$mimeType] ?? self::$map[$lcMimeType ?? strtolower($mimeType)] ?? []; + } + + /** + * {@inheritdoc} + */ + public function getMimeTypes(string $ext): array + { + if ($this->mimeTypes) { + $mimeTypes = $this->mimeTypes[$ext] ?? $this->mimeTypes[$lcExt = strtolower($ext)] ?? null; + } + + return $mimeTypes ?? self::$reverseMap[$ext] ?? self::$reverseMap[$lcExt ?? strtolower($ext)] ?? []; + } + + /** + * {@inheritdoc} + */ + public function isGuesserSupported(): bool + { + foreach ($this->guessers as $guesser) { + if ($guesser->isGuesserSupported()) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + * + * The file is passed to each registered MIME type guesser in reverse order + * of their registration (last registered is queried first). Once a guesser + * returns a value that is not null, this method terminates and returns the + * value. + */ + public function guessMimeType(string $path): ?string + { + foreach ($this->guessers as $guesser) { + if (!$guesser->isGuesserSupported()) { + continue; + } + + if (null !== $mimeType = $guesser->guessMimeType($path)) { + return $mimeType; + } + } + + if (!$this->isGuesserSupported()) { + throw new LogicException('Unable to guess the MIME type as no guessers are available (have you enable the php_fileinfo extension?).'); + } + + return null; + } + + /** + * A map of MIME types and their default extensions. + * + * Updated from upstream on 2019-01-16 + * + * @see Resources/bin/update_mime_types.php + */ + private static $map = [ + 'application/acrobat' => ['pdf'], + 'application/andrew-inset' => ['ez'], + 'application/annodex' => ['anx'], + 'application/applixware' => ['aw'], + 'application/atom+xml' => ['atom'], + 'application/atomcat+xml' => ['atomcat'], + 'application/atomsvc+xml' => ['atomsvc'], + 'application/ccxml+xml' => ['ccxml'], + 'application/cdmi-capability' => ['cdmia'], + 'application/cdmi-container' => ['cdmic'], + 'application/cdmi-domain' => ['cdmid'], + 'application/cdmi-object' => ['cdmio'], + 'application/cdmi-queue' => ['cdmiq'], + 'application/cdr' => ['cdr'], + 'application/coreldraw' => ['cdr'], + 'application/cu-seeme' => ['cu'], + 'application/davmount+xml' => ['davmount'], + 'application/dbase' => ['dbf'], + 'application/dbf' => ['dbf'], + 'application/dicom' => ['dcm'], + 'application/docbook+xml' => ['dbk', 'docbook'], + 'application/dssc+der' => ['dssc'], + 'application/dssc+xml' => ['xdssc'], + 'application/ecmascript' => ['ecma', 'es'], + 'application/emf' => ['emf'], + 'application/emma+xml' => ['emma'], + 'application/epub+zip' => ['epub'], + 'application/exi' => ['exi'], + 'application/font-tdpfr' => ['pfr'], + 'application/font-woff' => ['woff'], + 'application/futuresplash' => ['swf', 'spl'], + 'application/geo+json' => ['geojson', 'geo.json'], + 'application/gml+xml' => ['gml'], + 'application/gnunet-directory' => ['gnd'], + 'application/gpx' => ['gpx'], + 'application/gpx+xml' => ['gpx'], + 'application/gxf' => ['gxf'], + 'application/gzip' => ['gz'], + 'application/hyperstudio' => ['stk'], + 'application/ico' => ['ico'], + 'application/ics' => ['vcs', 'ics'], + 'application/illustrator' => ['ai'], + 'application/inkml+xml' => ['ink', 'inkml'], + 'application/ipfix' => ['ipfix'], + 'application/java' => ['class'], + 'application/java-archive' => ['jar'], + 'application/java-byte-code' => ['class'], + 'application/java-serialized-object' => ['ser'], + 'application/java-vm' => ['class'], + 'application/javascript' => ['js', 'jsm', 'mjs'], + 'application/jrd+json' => ['jrd'], + 'application/json' => ['json'], + 'application/json-patch+json' => ['json-patch'], + 'application/jsonml+json' => ['jsonml'], + 'application/ld+json' => ['jsonld'], + 'application/lost+xml' => ['lostxml'], + 'application/lotus123' => ['123', 'wk1', 'wk3', 'wk4', 'wks'], + 'application/m3u' => ['m3u', 'm3u8', 'vlc'], + 'application/mac-binhex40' => ['hqx'], + 'application/mac-compactpro' => ['cpt'], + 'application/mads+xml' => ['mads'], + 'application/marc' => ['mrc'], + 'application/marcxml+xml' => ['mrcx'], + 'application/mathematica' => ['ma', 'nb', 'mb'], + 'application/mathml+xml' => ['mathml', 'mml'], + 'application/mbox' => ['mbox'], + 'application/mdb' => ['mdb'], + 'application/mediaservercontrol+xml' => ['mscml'], + 'application/metalink+xml' => ['metalink'], + 'application/metalink4+xml' => ['meta4'], + 'application/mets+xml' => ['mets'], + 'application/mods+xml' => ['mods'], + 'application/mp21' => ['m21', 'mp21'], + 'application/mp4' => ['mp4s'], + 'application/ms-tnef' => ['tnef', 'tnf'], + 'application/msaccess' => ['mdb'], + 'application/msexcel' => ['xls', 'xlc', 'xll', 'xlm', 'xlw', 'xla', 'xlt', 'xld'], + 'application/mspowerpoint' => ['ppz', 'ppt', 'pps', 'pot'], + 'application/msword' => ['doc', 'dot'], + 'application/msword-template' => ['dot'], + 'application/mxf' => ['mxf'], + 'application/nappdf' => ['pdf'], + 'application/octet-stream' => ['bin', 'dms', 'lrf', 'mar', 'so', 'dist', 'distz', 'pkg', 'bpk', 'dump', 'elc', 'deploy'], + 'application/oda' => ['oda'], + 'application/oebps-package+xml' => ['opf'], + 'application/ogg' => ['ogx'], + 'application/omdoc+xml' => ['omdoc'], + 'application/onenote' => ['onetoc', 'onetoc2', 'onetmp', 'onepkg'], + 'application/owl+xml' => ['owx'], + 'application/oxps' => ['oxps', 'xps'], + 'application/patch-ops-error+xml' => ['xer'], + 'application/pcap' => ['pcap', 'cap', 'dmp'], + 'application/pdf' => ['pdf'], + 'application/pgp' => ['pgp', 'gpg', 'asc'], + 'application/pgp-encrypted' => ['pgp', 'gpg', 'asc'], + 'application/pgp-keys' => ['skr', 'pkr', 'asc', 'pgp', 'gpg'], + 'application/pgp-signature' => ['asc', 'sig', 'pgp', 'gpg'], + 'application/photoshop' => ['psd'], + 'application/pics-rules' => ['prf'], + 'application/pkcs10' => ['p10'], + 'application/pkcs12' => ['p12', 'pfx'], + 'application/pkcs7-mime' => ['p7m', 'p7c'], + 'application/pkcs7-signature' => ['p7s'], + 'application/pkcs8' => ['p8'], + 'application/pkcs8-encrypted' => ['p8e'], + 'application/pkix-attr-cert' => ['ac'], + 'application/pkix-cert' => ['cer'], + 'application/pkix-crl' => ['crl'], + 'application/pkix-pkipath' => ['pkipath'], + 'application/pkixcmp' => ['pki'], + 'application/pls' => ['pls'], + 'application/pls+xml' => ['pls'], + 'application/postscript' => ['ai', 'eps', 'ps'], + 'application/powerpoint' => ['ppz', 'ppt', 'pps', 'pot'], + 'application/prs.cww' => ['cww'], + 'application/pskc+xml' => ['pskcxml'], + 'application/ram' => ['ram'], + 'application/raml+yaml' => ['raml'], + 'application/rdf+xml' => ['rdf', 'rdfs', 'owl'], + 'application/reginfo+xml' => ['rif'], + 'application/relax-ng-compact-syntax' => ['rnc'], + 'application/resource-lists+xml' => ['rl'], + 'application/resource-lists-diff+xml' => ['rld'], + 'application/rls-services+xml' => ['rs'], + 'application/rpki-ghostbusters' => ['gbr'], + 'application/rpki-manifest' => ['mft'], + 'application/rpki-roa' => ['roa'], + 'application/rsd+xml' => ['rsd'], + 'application/rss+xml' => ['rss'], + 'application/rtf' => ['rtf'], + 'application/sbml+xml' => ['sbml'], + 'application/scvp-cv-request' => ['scq'], + 'application/scvp-cv-response' => ['scs'], + 'application/scvp-vp-request' => ['spq'], + 'application/scvp-vp-response' => ['spp'], + 'application/sdp' => ['sdp'], + 'application/set-payment-initiation' => ['setpay'], + 'application/set-registration-initiation' => ['setreg'], + 'application/shf+xml' => ['shf'], + 'application/sieve' => ['siv'], + 'application/smil' => ['smil', 'smi', 'sml', 'kino'], + 'application/smil+xml' => ['smi', 'smil', 'sml', 'kino'], + 'application/sparql-query' => ['rq'], + 'application/sparql-results+xml' => ['srx'], + 'application/sql' => ['sql'], + 'application/srgs' => ['gram'], + 'application/srgs+xml' => ['grxml'], + 'application/sru+xml' => ['sru'], + 'application/ssdl+xml' => ['ssdl'], + 'application/ssml+xml' => ['ssml'], + 'application/stuffit' => ['sit'], + 'application/tei+xml' => ['tei', 'teicorpus'], + 'application/thraud+xml' => ['tfi'], + 'application/timestamped-data' => ['tsd'], + 'application/trig' => ['trig'], + 'application/vnd.3gpp.pic-bw-large' => ['plb'], + 'application/vnd.3gpp.pic-bw-small' => ['psb'], + 'application/vnd.3gpp.pic-bw-var' => ['pvb'], + 'application/vnd.3gpp2.tcap' => ['tcap'], + 'application/vnd.3m.post-it-notes' => ['pwn'], + 'application/vnd.accpac.simply.aso' => ['aso'], + 'application/vnd.accpac.simply.imp' => ['imp'], + 'application/vnd.acucobol' => ['acu'], + 'application/vnd.acucorp' => ['atc', 'acutc'], + 'application/vnd.adobe.air-application-installer-package+zip' => ['air'], + 'application/vnd.adobe.flash.movie' => ['swf', 'spl'], + 'application/vnd.adobe.formscentral.fcdt' => ['fcdt'], + 'application/vnd.adobe.fxp' => ['fxp', 'fxpl'], + 'application/vnd.adobe.illustrator' => ['ai'], + 'application/vnd.adobe.xdp+xml' => ['xdp'], + 'application/vnd.adobe.xfdf' => ['xfdf'], + 'application/vnd.ahead.space' => ['ahead'], + 'application/vnd.airzip.filesecure.azf' => ['azf'], + 'application/vnd.airzip.filesecure.azs' => ['azs'], + 'application/vnd.amazon.ebook' => ['azw'], + 'application/vnd.americandynamics.acc' => ['acc'], + 'application/vnd.amiga.ami' => ['ami'], + 'application/vnd.android.package-archive' => ['apk'], + 'application/vnd.anser-web-certificate-issue-initiation' => ['cii'], + 'application/vnd.anser-web-funds-transfer-initiation' => ['fti'], + 'application/vnd.antix.game-component' => ['atx'], + 'application/vnd.appimage' => ['appimage'], + 'application/vnd.apple.installer+xml' => ['mpkg'], + 'application/vnd.apple.keynote' => ['key'], + 'application/vnd.apple.mpegurl' => ['m3u8', 'm3u'], + 'application/vnd.aristanetworks.swi' => ['swi'], + 'application/vnd.astraea-software.iota' => ['iota'], + 'application/vnd.audiograph' => ['aep'], + 'application/vnd.blueice.multipass' => ['mpm'], + 'application/vnd.bmi' => ['bmi'], + 'application/vnd.businessobjects' => ['rep'], + 'application/vnd.chemdraw+xml' => ['cdxml'], + 'application/vnd.chess-pgn' => ['pgn'], + 'application/vnd.chipnuts.karaoke-mmd' => ['mmd'], + 'application/vnd.cinderella' => ['cdy'], + 'application/vnd.claymore' => ['cla'], + 'application/vnd.cloanto.rp9' => ['rp9'], + 'application/vnd.clonk.c4group' => ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'], + 'application/vnd.cluetrust.cartomobile-config' => ['c11amc'], + 'application/vnd.cluetrust.cartomobile-config-pkg' => ['c11amz'], + 'application/vnd.coffeescript' => ['coffee'], + 'application/vnd.comicbook+zip' => ['cbz'], + 'application/vnd.comicbook-rar' => ['cbr'], + 'application/vnd.commonspace' => ['csp'], + 'application/vnd.contact.cmsg' => ['cdbcmsg'], + 'application/vnd.corel-draw' => ['cdr'], + 'application/vnd.cosmocaller' => ['cmc'], + 'application/vnd.crick.clicker' => ['clkx'], + 'application/vnd.crick.clicker.keyboard' => ['clkk'], + 'application/vnd.crick.clicker.palette' => ['clkp'], + 'application/vnd.crick.clicker.template' => ['clkt'], + 'application/vnd.crick.clicker.wordbank' => ['clkw'], + 'application/vnd.criticaltools.wbs+xml' => ['wbs'], + 'application/vnd.ctc-posml' => ['pml'], + 'application/vnd.cups-ppd' => ['ppd'], + 'application/vnd.curl.car' => ['car'], + 'application/vnd.curl.pcurl' => ['pcurl'], + 'application/vnd.dart' => ['dart'], + 'application/vnd.data-vision.rdz' => ['rdz'], + 'application/vnd.debian.binary-package' => ['deb', 'udeb'], + 'application/vnd.dece.data' => ['uvf', 'uvvf', 'uvd', 'uvvd'], + 'application/vnd.dece.ttml+xml' => ['uvt', 'uvvt'], + 'application/vnd.dece.unspecified' => ['uvx', 'uvvx'], + 'application/vnd.dece.zip' => ['uvz', 'uvvz'], + 'application/vnd.denovo.fcselayout-link' => ['fe_launch'], + 'application/vnd.dna' => ['dna'], + 'application/vnd.dolby.mlp' => ['mlp'], + 'application/vnd.dpgraph' => ['dpg'], + 'application/vnd.dreamfactory' => ['dfac'], + 'application/vnd.ds-keypoint' => ['kpxx'], + 'application/vnd.dvb.ait' => ['ait'], + 'application/vnd.dvb.service' => ['svc'], + 'application/vnd.dynageo' => ['geo'], + 'application/vnd.ecowin.chart' => ['mag'], + 'application/vnd.emusic-emusic_package' => ['emp'], + 'application/vnd.enliven' => ['nml'], + 'application/vnd.epson.esf' => ['esf'], + 'application/vnd.epson.msf' => ['msf'], + 'application/vnd.epson.quickanime' => ['qam'], + 'application/vnd.epson.salt' => ['slt'], + 'application/vnd.epson.ssf' => ['ssf'], + 'application/vnd.eszigno3+xml' => ['es3', 'et3'], + 'application/vnd.ezpix-album' => ['ez2'], + 'application/vnd.ezpix-package' => ['ez3'], + 'application/vnd.fdf' => ['fdf'], + 'application/vnd.fdsn.mseed' => ['mseed'], + 'application/vnd.fdsn.seed' => ['seed', 'dataless'], + 'application/vnd.flatpak' => ['flatpak', 'xdgapp'], + 'application/vnd.flatpak.ref' => ['flatpakref'], + 'application/vnd.flatpak.repo' => ['flatpakrepo'], + 'application/vnd.flographit' => ['gph'], + 'application/vnd.fluxtime.clip' => ['ftc'], + 'application/vnd.framemaker' => ['fm', 'frame', 'maker', 'book'], + 'application/vnd.frogans.fnc' => ['fnc'], + 'application/vnd.frogans.ltf' => ['ltf'], + 'application/vnd.fsc.weblaunch' => ['fsc'], + 'application/vnd.fujitsu.oasys' => ['oas'], + 'application/vnd.fujitsu.oasys2' => ['oa2'], + 'application/vnd.fujitsu.oasys3' => ['oa3'], + 'application/vnd.fujitsu.oasysgp' => ['fg5'], + 'application/vnd.fujitsu.oasysprs' => ['bh2'], + 'application/vnd.fujixerox.ddd' => ['ddd'], + 'application/vnd.fujixerox.docuworks' => ['xdw'], + 'application/vnd.fujixerox.docuworks.binder' => ['xbd'], + 'application/vnd.fuzzysheet' => ['fzs'], + 'application/vnd.genomatix.tuxedo' => ['txd'], + 'application/vnd.geo+json' => ['geojson', 'geo.json'], + 'application/vnd.geogebra.file' => ['ggb'], + 'application/vnd.geogebra.tool' => ['ggt'], + 'application/vnd.geometry-explorer' => ['gex', 'gre'], + 'application/vnd.geonext' => ['gxt'], + 'application/vnd.geoplan' => ['g2w'], + 'application/vnd.geospace' => ['g3w'], + 'application/vnd.gmx' => ['gmx'], + 'application/vnd.google-earth.kml+xml' => ['kml'], + 'application/vnd.google-earth.kmz' => ['kmz'], + 'application/vnd.grafeq' => ['gqf', 'gqs'], + 'application/vnd.groove-account' => ['gac'], + 'application/vnd.groove-help' => ['ghf'], + 'application/vnd.groove-identity-message' => ['gim'], + 'application/vnd.groove-injector' => ['grv'], + 'application/vnd.groove-tool-message' => ['gtm'], + 'application/vnd.groove-tool-template' => ['tpl'], + 'application/vnd.groove-vcard' => ['vcg'], + 'application/vnd.haansoft-hwp' => ['hwp'], + 'application/vnd.haansoft-hwt' => ['hwt'], + 'application/vnd.hal+xml' => ['hal'], + 'application/vnd.handheld-entertainment+xml' => ['zmm'], + 'application/vnd.hbci' => ['hbci'], + 'application/vnd.hhe.lesson-player' => ['les'], + 'application/vnd.hp-hpgl' => ['hpgl'], + 'application/vnd.hp-hpid' => ['hpid'], + 'application/vnd.hp-hps' => ['hps'], + 'application/vnd.hp-jlyt' => ['jlt'], + 'application/vnd.hp-pcl' => ['pcl'], + 'application/vnd.hp-pclxl' => ['pclxl'], + 'application/vnd.hydrostatix.sof-data' => ['sfd-hdstx'], + 'application/vnd.ibm.minipay' => ['mpy'], + 'application/vnd.ibm.modcap' => ['afp', 'listafp', 'list3820'], + 'application/vnd.ibm.rights-management' => ['irm'], + 'application/vnd.ibm.secure-container' => ['sc'], + 'application/vnd.iccprofile' => ['icc', 'icm'], + 'application/vnd.igloader' => ['igl'], + 'application/vnd.immervision-ivp' => ['ivp'], + 'application/vnd.immervision-ivu' => ['ivu'], + 'application/vnd.insors.igm' => ['igm'], + 'application/vnd.intercon.formnet' => ['xpw', 'xpx'], + 'application/vnd.intergeo' => ['i2g'], + 'application/vnd.intu.qbo' => ['qbo'], + 'application/vnd.intu.qfx' => ['qfx'], + 'application/vnd.ipunplugged.rcprofile' => ['rcprofile'], + 'application/vnd.irepository.package+xml' => ['irp'], + 'application/vnd.is-xpr' => ['xpr'], + 'application/vnd.isac.fcs' => ['fcs'], + 'application/vnd.jam' => ['jam'], + 'application/vnd.jcp.javame.midlet-rms' => ['rms'], + 'application/vnd.jisp' => ['jisp'], + 'application/vnd.joost.joda-archive' => ['joda'], + 'application/vnd.kahootz' => ['ktz', 'ktr'], + 'application/vnd.kde.karbon' => ['karbon'], + 'application/vnd.kde.kchart' => ['chrt'], + 'application/vnd.kde.kformula' => ['kfo'], + 'application/vnd.kde.kivio' => ['flw'], + 'application/vnd.kde.kontour' => ['kon'], + 'application/vnd.kde.kpresenter' => ['kpr', 'kpt'], + 'application/vnd.kde.kspread' => ['ksp'], + 'application/vnd.kde.kword' => ['kwd', 'kwt'], + 'application/vnd.kenameaapp' => ['htke'], + 'application/vnd.kidspiration' => ['kia'], + 'application/vnd.kinar' => ['kne', 'knp'], + 'application/vnd.koan' => ['skp', 'skd', 'skt', 'skm'], + 'application/vnd.kodak-descriptor' => ['sse'], + 'application/vnd.las.las+xml' => ['lasxml'], + 'application/vnd.llamagraphics.life-balance.desktop' => ['lbd'], + 'application/vnd.llamagraphics.life-balance.exchange+xml' => ['lbe'], + 'application/vnd.lotus-1-2-3' => ['123', 'wk1', 'wk3', 'wk4', 'wks'], + 'application/vnd.lotus-approach' => ['apr'], + 'application/vnd.lotus-freelance' => ['pre'], + 'application/vnd.lotus-notes' => ['nsf'], + 'application/vnd.lotus-organizer' => ['org'], + 'application/vnd.lotus-screencam' => ['scm'], + 'application/vnd.lotus-wordpro' => ['lwp'], + 'application/vnd.macports.portpkg' => ['portpkg'], + 'application/vnd.mcd' => ['mcd'], + 'application/vnd.medcalcdata' => ['mc1'], + 'application/vnd.mediastation.cdkey' => ['cdkey'], + 'application/vnd.mfer' => ['mwf'], + 'application/vnd.mfmp' => ['mfm'], + 'application/vnd.micrografx.flo' => ['flo'], + 'application/vnd.micrografx.igx' => ['igx'], + 'application/vnd.mif' => ['mif'], + 'application/vnd.mobius.daf' => ['daf'], + 'application/vnd.mobius.dis' => ['dis'], + 'application/vnd.mobius.mbk' => ['mbk'], + 'application/vnd.mobius.mqy' => ['mqy'], + 'application/vnd.mobius.msl' => ['msl'], + 'application/vnd.mobius.plc' => ['plc'], + 'application/vnd.mobius.txf' => ['txf'], + 'application/vnd.mophun.application' => ['mpn'], + 'application/vnd.mophun.certificate' => ['mpc'], + 'application/vnd.mozilla.xul+xml' => ['xul'], + 'application/vnd.ms-access' => ['mdb'], + 'application/vnd.ms-artgalry' => ['cil'], + 'application/vnd.ms-asf' => ['asf'], + 'application/vnd.ms-cab-compressed' => ['cab'], + 'application/vnd.ms-excel' => ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw', 'xll', 'xld'], + 'application/vnd.ms-excel.addin.macroenabled.12' => ['xlam'], + 'application/vnd.ms-excel.sheet.binary.macroenabled.12' => ['xlsb'], + 'application/vnd.ms-excel.sheet.macroenabled.12' => ['xlsm'], + 'application/vnd.ms-excel.template.macroenabled.12' => ['xltm'], + 'application/vnd.ms-fontobject' => ['eot'], + 'application/vnd.ms-htmlhelp' => ['chm'], + 'application/vnd.ms-ims' => ['ims'], + 'application/vnd.ms-lrm' => ['lrm'], + 'application/vnd.ms-officetheme' => ['thmx'], + 'application/vnd.ms-outlook' => ['msg'], + 'application/vnd.ms-pki.seccat' => ['cat'], + 'application/vnd.ms-pki.stl' => ['stl'], + 'application/vnd.ms-powerpoint' => ['ppt', 'pps', 'pot', 'ppz'], + 'application/vnd.ms-powerpoint.addin.macroenabled.12' => ['ppam'], + 'application/vnd.ms-powerpoint.presentation.macroenabled.12' => ['pptm'], + 'application/vnd.ms-powerpoint.slide.macroenabled.12' => ['sldm'], + 'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => ['ppsm'], + 'application/vnd.ms-powerpoint.template.macroenabled.12' => ['potm'], + 'application/vnd.ms-project' => ['mpp', 'mpt'], + 'application/vnd.ms-publisher' => ['pub'], + 'application/vnd.ms-tnef' => ['tnef', 'tnf'], + 'application/vnd.ms-visio.drawing.macroenabled.main+xml' => ['vsdm'], + 'application/vnd.ms-visio.drawing.main+xml' => ['vsdx'], + 'application/vnd.ms-visio.stencil.macroenabled.main+xml' => ['vssm'], + 'application/vnd.ms-visio.stencil.main+xml' => ['vssx'], + 'application/vnd.ms-visio.template.macroenabled.main+xml' => ['vstm'], + 'application/vnd.ms-visio.template.main+xml' => ['vstx'], + 'application/vnd.ms-word' => ['doc'], + 'application/vnd.ms-word.document.macroenabled.12' => ['docm'], + 'application/vnd.ms-word.template.macroenabled.12' => ['dotm'], + 'application/vnd.ms-works' => ['wps', 'wks', 'wcm', 'wdb', 'xlr'], + 'application/vnd.ms-wpl' => ['wpl'], + 'application/vnd.ms-xpsdocument' => ['xps', 'oxps'], + 'application/vnd.msaccess' => ['mdb'], + 'application/vnd.mseq' => ['mseq'], + 'application/vnd.musician' => ['mus'], + 'application/vnd.muvee.style' => ['msty'], + 'application/vnd.mynfc' => ['taglet'], + 'application/vnd.neurolanguage.nlu' => ['nlu'], + 'application/vnd.nintendo.snes.rom' => ['sfc', 'smc'], + 'application/vnd.nitf' => ['ntf', 'nitf'], + 'application/vnd.noblenet-directory' => ['nnd'], + 'application/vnd.noblenet-sealer' => ['nns'], + 'application/vnd.noblenet-web' => ['nnw'], + 'application/vnd.nokia.n-gage.data' => ['ngdat'], + 'application/vnd.nokia.n-gage.symbian.install' => ['n-gage'], + 'application/vnd.nokia.radio-preset' => ['rpst'], + 'application/vnd.nokia.radio-presets' => ['rpss'], + 'application/vnd.novadigm.edm' => ['edm'], + 'application/vnd.novadigm.edx' => ['edx'], + 'application/vnd.novadigm.ext' => ['ext'], + 'application/vnd.oasis.docbook+xml' => ['dbk', 'docbook'], + 'application/vnd.oasis.opendocument.chart' => ['odc'], + 'application/vnd.oasis.opendocument.chart-template' => ['otc'], + 'application/vnd.oasis.opendocument.database' => ['odb'], + 'application/vnd.oasis.opendocument.formula' => ['odf'], + 'application/vnd.oasis.opendocument.formula-template' => ['odft', 'otf'], + 'application/vnd.oasis.opendocument.graphics' => ['odg'], + 'application/vnd.oasis.opendocument.graphics-flat-xml' => ['fodg'], + 'application/vnd.oasis.opendocument.graphics-template' => ['otg'], + 'application/vnd.oasis.opendocument.image' => ['odi'], + 'application/vnd.oasis.opendocument.image-template' => ['oti'], + 'application/vnd.oasis.opendocument.presentation' => ['odp'], + 'application/vnd.oasis.opendocument.presentation-flat-xml' => ['fodp'], + 'application/vnd.oasis.opendocument.presentation-template' => ['otp'], + 'application/vnd.oasis.opendocument.spreadsheet' => ['ods'], + 'application/vnd.oasis.opendocument.spreadsheet-flat-xml' => ['fods'], + 'application/vnd.oasis.opendocument.spreadsheet-template' => ['ots'], + 'application/vnd.oasis.opendocument.text' => ['odt'], + 'application/vnd.oasis.opendocument.text-flat-xml' => ['fodt'], + 'application/vnd.oasis.opendocument.text-master' => ['odm'], + 'application/vnd.oasis.opendocument.text-template' => ['ott'], + 'application/vnd.oasis.opendocument.text-web' => ['oth'], + 'application/vnd.olpc-sugar' => ['xo'], + 'application/vnd.oma.dd2+xml' => ['dd2'], + 'application/vnd.openofficeorg.extension' => ['oxt'], + 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => ['pptx'], + 'application/vnd.openxmlformats-officedocument.presentationml.slide' => ['sldx'], + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => ['ppsx'], + 'application/vnd.openxmlformats-officedocument.presentationml.template' => ['potx'], + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => ['xlsx'], + 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => ['xltx'], + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => ['docx'], + 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => ['dotx'], + 'application/vnd.osgeo.mapguide.package' => ['mgp'], + 'application/vnd.osgi.dp' => ['dp'], + 'application/vnd.osgi.subsystem' => ['esa'], + 'application/vnd.palm' => ['pdb', 'pqa', 'oprc', 'prc'], + 'application/vnd.pawaafile' => ['paw'], + 'application/vnd.pg.format' => ['str'], + 'application/vnd.pg.osasli' => ['ei6'], + 'application/vnd.picsel' => ['efif'], + 'application/vnd.pmi.widget' => ['wg'], + 'application/vnd.pocketlearn' => ['plf'], + 'application/vnd.powerbuilder6' => ['pbd'], + 'application/vnd.previewsystems.box' => ['box'], + 'application/vnd.proteus.magazine' => ['mgz'], + 'application/vnd.publishare-delta-tree' => ['qps'], + 'application/vnd.pvi.ptid1' => ['ptid'], + 'application/vnd.quark.quarkxpress' => ['qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb'], + 'application/vnd.rar' => ['rar'], + 'application/vnd.realvnc.bed' => ['bed'], + 'application/vnd.recordare.musicxml' => ['mxl'], + 'application/vnd.recordare.musicxml+xml' => ['musicxml'], + 'application/vnd.rig.cryptonote' => ['cryptonote'], + 'application/vnd.rim.cod' => ['cod'], + 'application/vnd.rn-realmedia' => ['rm', 'rmj', 'rmm', 'rms', 'rmx', 'rmvb'], + 'application/vnd.rn-realmedia-vbr' => ['rmvb', 'rm', 'rmj', 'rmm', 'rms', 'rmx'], + 'application/vnd.route66.link66+xml' => ['link66'], + 'application/vnd.sailingtracker.track' => ['st'], + 'application/vnd.sdp' => ['sdp'], + 'application/vnd.seemail' => ['see'], + 'application/vnd.sema' => ['sema'], + 'application/vnd.semd' => ['semd'], + 'application/vnd.semf' => ['semf'], + 'application/vnd.shana.informed.formdata' => ['ifm'], + 'application/vnd.shana.informed.formtemplate' => ['itp'], + 'application/vnd.shana.informed.interchange' => ['iif'], + 'application/vnd.shana.informed.package' => ['ipk'], + 'application/vnd.simtech-mindmapper' => ['twd', 'twds'], + 'application/vnd.smaf' => ['mmf', 'smaf'], + 'application/vnd.smart.teacher' => ['teacher'], + 'application/vnd.snap' => ['snap'], + 'application/vnd.solent.sdkm+xml' => ['sdkm', 'sdkd'], + 'application/vnd.spotfire.dxp' => ['dxp'], + 'application/vnd.spotfire.sfs' => ['sfs'], + 'application/vnd.sqlite3' => ['sqlite3'], + 'application/vnd.squashfs' => ['sqsh'], + 'application/vnd.stardivision.calc' => ['sdc'], + 'application/vnd.stardivision.chart' => ['sds'], + 'application/vnd.stardivision.draw' => ['sda'], + 'application/vnd.stardivision.impress' => ['sdd', 'sdp'], + 'application/vnd.stardivision.mail' => ['smd'], + 'application/vnd.stardivision.math' => ['smf'], + 'application/vnd.stardivision.writer' => ['sdw', 'vor', 'sgl'], + 'application/vnd.stardivision.writer-global' => ['sgl', 'sdw', 'vor'], + 'application/vnd.stepmania.package' => ['smzip'], + 'application/vnd.stepmania.stepchart' => ['sm'], + 'application/vnd.sun.xml.base' => ['odb'], + 'application/vnd.sun.xml.calc' => ['sxc'], + 'application/vnd.sun.xml.calc.template' => ['stc'], + 'application/vnd.sun.xml.draw' => ['sxd'], + 'application/vnd.sun.xml.draw.template' => ['std'], + 'application/vnd.sun.xml.impress' => ['sxi'], + 'application/vnd.sun.xml.impress.template' => ['sti'], + 'application/vnd.sun.xml.math' => ['sxm'], + 'application/vnd.sun.xml.writer' => ['sxw'], + 'application/vnd.sun.xml.writer.global' => ['sxg'], + 'application/vnd.sun.xml.writer.template' => ['stw'], + 'application/vnd.sus-calendar' => ['sus', 'susp'], + 'application/vnd.svd' => ['svd'], + 'application/vnd.symbian.install' => ['sis', 'sisx'], + 'application/vnd.syncml+xml' => ['xsm'], + 'application/vnd.syncml.dm+wbxml' => ['bdm'], + 'application/vnd.syncml.dm+xml' => ['xdm'], + 'application/vnd.tao.intent-module-archive' => ['tao'], + 'application/vnd.tcpdump.pcap' => ['pcap', 'cap', 'dmp'], + 'application/vnd.tmobile-livetv' => ['tmo'], + 'application/vnd.trid.tpt' => ['tpt'], + 'application/vnd.triscape.mxs' => ['mxs'], + 'application/vnd.trueapp' => ['tra'], + 'application/vnd.ufdl' => ['ufd', 'ufdl'], + 'application/vnd.uiq.theme' => ['utz'], + 'application/vnd.umajin' => ['umj'], + 'application/vnd.unity' => ['unityweb'], + 'application/vnd.uoml+xml' => ['uoml'], + 'application/vnd.vcx' => ['vcx'], + 'application/vnd.visio' => ['vsd', 'vst', 'vss', 'vsw'], + 'application/vnd.visionary' => ['vis'], + 'application/vnd.vsf' => ['vsf'], + 'application/vnd.wap.wbxml' => ['wbxml'], + 'application/vnd.wap.wmlc' => ['wmlc'], + 'application/vnd.wap.wmlscriptc' => ['wmlsc'], + 'application/vnd.webturbo' => ['wtb'], + 'application/vnd.wolfram.player' => ['nbp'], + 'application/vnd.wordperfect' => ['wpd', 'wp', 'wp4', 'wp5', 'wp6', 'wpp'], + 'application/vnd.wqd' => ['wqd'], + 'application/vnd.wt.stf' => ['stf'], + 'application/vnd.xara' => ['xar'], + 'application/vnd.xdgapp' => ['flatpak', 'xdgapp'], + 'application/vnd.xfdl' => ['xfdl'], + 'application/vnd.yamaha.hv-dic' => ['hvd'], + 'application/vnd.yamaha.hv-script' => ['hvs'], + 'application/vnd.yamaha.hv-voice' => ['hvp'], + 'application/vnd.yamaha.openscoreformat' => ['osf'], + 'application/vnd.yamaha.openscoreformat.osfpvg+xml' => ['osfpvg'], + 'application/vnd.yamaha.smaf-audio' => ['saf'], + 'application/vnd.yamaha.smaf-phrase' => ['spf'], + 'application/vnd.yellowriver-custom-menu' => ['cmp'], + 'application/vnd.youtube.yt' => ['yt'], + 'application/vnd.zul' => ['zir', 'zirz'], + 'application/vnd.zzazz.deck+xml' => ['zaz'], + 'application/voicexml+xml' => ['vxml'], + 'application/widget' => ['wgt'], + 'application/winhlp' => ['hlp'], + 'application/wk1' => ['123', 'wk1', 'wk3', 'wk4', 'wks'], + 'application/wmf' => ['wmf'], + 'application/wordperfect' => ['wp', 'wp4', 'wp5', 'wp6', 'wpd', 'wpp'], + 'application/wsdl+xml' => ['wsdl'], + 'application/wspolicy+xml' => ['wspolicy'], + 'application/wwf' => ['wwf'], + 'application/x-123' => ['123', 'wk1', 'wk3', 'wk4', 'wks'], + 'application/x-7z-compressed' => ['7z'], + 'application/x-abiword' => ['abw', 'abw.CRASHED', 'abw.gz', 'zabw'], + 'application/x-ace' => ['ace'], + 'application/x-ace-compressed' => ['ace'], + 'application/x-alz' => ['alz'], + 'application/x-amiga-disk-format' => ['adf'], + 'application/x-amipro' => ['sam'], + 'application/x-annodex' => ['anx'], + 'application/x-aportisdoc' => ['pdb', 'pdc'], + 'application/x-apple-diskimage' => ['dmg'], + 'application/x-applix-spreadsheet' => ['as'], + 'application/x-applix-word' => ['aw'], + 'application/x-archive' => ['a', 'ar'], + 'application/x-arj' => ['arj'], + 'application/x-asp' => ['asp'], + 'application/x-atari-2600-rom' => ['a26'], + 'application/x-atari-7800-rom' => ['a78'], + 'application/x-atari-lynx-rom' => ['lnx'], + 'application/x-authorware-bin' => ['aab', 'x32', 'u32', 'vox'], + 'application/x-authorware-map' => ['aam'], + 'application/x-authorware-seg' => ['aas'], + 'application/x-awk' => ['awk'], + 'application/x-bcpio' => ['bcpio'], + 'application/x-bittorrent' => ['torrent'], + 'application/x-blender' => ['blender', 'blend', 'BLEND'], + 'application/x-blorb' => ['blb', 'blorb'], + 'application/x-bsdiff' => ['bsdiff'], + 'application/x-bzdvi' => ['dvi.bz2'], + 'application/x-bzip' => ['bz', 'bz2'], + 'application/x-bzip-compressed-tar' => ['tar.bz2', 'tar.bz', 'tbz2', 'tbz', 'tb2'], + 'application/x-bzip2' => ['bz2', 'boz', 'bz'], + 'application/x-bzpdf' => ['pdf.bz2'], + 'application/x-bzpostscript' => ['ps.bz2'], + 'application/x-cb7' => ['cb7'], + 'application/x-cbr' => ['cbr', 'cba', 'cbt', 'cbz', 'cb7'], + 'application/x-cbt' => ['cbt'], + 'application/x-cbz' => ['cbz'], + 'application/x-ccmx' => ['ccmx'], + 'application/x-cd-image' => ['iso', 'iso9660'], + 'application/x-cdlink' => ['vcd'], + 'application/x-cdr' => ['cdr'], + 'application/x-cdrdao-toc' => ['toc'], + 'application/x-cfs-compressed' => ['cfs'], + 'application/x-chat' => ['chat'], + 'application/x-chess-pgn' => ['pgn'], + 'application/x-chm' => ['chm'], + 'application/x-cisco-vpn-settings' => ['pcf'], + 'application/x-compress' => ['Z'], + 'application/x-compressed-tar' => ['tar.gz', 'tgz'], + 'application/x-conference' => ['nsc'], + 'application/x-coreldraw' => ['cdr'], + 'application/x-cpio' => ['cpio'], + 'application/x-cpio-compressed' => ['cpio.gz'], + 'application/x-csh' => ['csh'], + 'application/x-cue' => ['cue'], + 'application/x-dar' => ['dar'], + 'application/x-dbase' => ['dbf'], + 'application/x-dbf' => ['dbf'], + 'application/x-dc-rom' => ['dc'], + 'application/x-deb' => ['deb', 'udeb'], + 'application/x-debian-package' => ['deb', 'udeb'], + 'application/x-designer' => ['ui'], + 'application/x-desktop' => ['desktop', 'kdelnk'], + 'application/x-dgc-compressed' => ['dgc'], + 'application/x-dia-diagram' => ['dia'], + 'application/x-dia-shape' => ['shape'], + 'application/x-director' => ['dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa'], + 'application/x-docbook+xml' => ['dbk', 'docbook'], + 'application/x-doom' => ['wad'], + 'application/x-doom-wad' => ['wad'], + 'application/x-dtbncx+xml' => ['ncx'], + 'application/x-dtbook+xml' => ['dtb'], + 'application/x-dtbresource+xml' => ['res'], + 'application/x-dvi' => ['dvi'], + 'application/x-e-theme' => ['etheme'], + 'application/x-egon' => ['egon'], + 'application/x-emf' => ['emf'], + 'application/x-envoy' => ['evy'], + 'application/x-eva' => ['eva'], + 'application/x-fd-file' => ['fd', 'qd'], + 'application/x-fds-disk' => ['fds'], + 'application/x-fictionbook' => ['fb2'], + 'application/x-fictionbook+xml' => ['fb2'], + 'application/x-flash-video' => ['flv'], + 'application/x-fluid' => ['fl'], + 'application/x-font-afm' => ['afm'], + 'application/x-font-bdf' => ['bdf'], + 'application/x-font-ghostscript' => ['gsf'], + 'application/x-font-linux-psf' => ['psf'], + 'application/x-font-otf' => ['otf'], + 'application/x-font-pcf' => ['pcf', 'pcf.Z', 'pcf.gz'], + 'application/x-font-snf' => ['snf'], + 'application/x-font-speedo' => ['spd'], + 'application/x-font-ttf' => ['ttf'], + 'application/x-font-ttx' => ['ttx'], + 'application/x-font-type1' => ['pfa', 'pfb', 'pfm', 'afm', 'gsf'], + 'application/x-font-woff' => ['woff'], + 'application/x-frame' => ['fm'], + 'application/x-freearc' => ['arc'], + 'application/x-futuresplash' => ['spl'], + 'application/x-gameboy-color-rom' => ['gbc', 'cgb'], + 'application/x-gameboy-rom' => ['gb', 'sgb'], + 'application/x-gamecube-iso-image' => ['iso'], + 'application/x-gamecube-rom' => ['iso'], + 'application/x-gamegear-rom' => ['gg'], + 'application/x-gba-rom' => ['gba', 'agb'], + 'application/x-gca-compressed' => ['gca'], + 'application/x-gedcom' => ['ged', 'gedcom'], + 'application/x-genesis-32x-rom' => ['32x', 'mdx'], + 'application/x-genesis-rom' => ['gen', 'smd'], + 'application/x-gettext' => ['po'], + 'application/x-gettext-translation' => ['gmo', 'mo'], + 'application/x-glade' => ['glade'], + 'application/x-glulx' => ['ulx'], + 'application/x-gnome-app-info' => ['desktop', 'kdelnk'], + 'application/x-gnucash' => ['gnucash', 'gnc', 'xac'], + 'application/x-gnumeric' => ['gnumeric'], + 'application/x-gnuplot' => ['gp', 'gplt', 'gnuplot'], + 'application/x-go-sgf' => ['sgf'], + 'application/x-gpx' => ['gpx'], + 'application/x-gpx+xml' => ['gpx'], + 'application/x-gramps-xml' => ['gramps'], + 'application/x-graphite' => ['gra'], + 'application/x-gtar' => ['gtar', 'tar', 'gem'], + 'application/x-gtk-builder' => ['ui'], + 'application/x-gz-font-linux-psf' => ['psf.gz'], + 'application/x-gzdvi' => ['dvi.gz'], + 'application/x-gzip' => ['gz'], + 'application/x-gzpdf' => ['pdf.gz'], + 'application/x-gzpostscript' => ['ps.gz'], + 'application/x-hdf' => ['hdf', 'hdf4', 'h4', 'hdf5', 'h5'], + 'application/x-hfe-file' => ['hfe'], + 'application/x-hfe-floppy-image' => ['hfe'], + 'application/x-hwp' => ['hwp'], + 'application/x-hwt' => ['hwt'], + 'application/x-ica' => ['ica'], + 'application/x-install-instructions' => ['install'], + 'application/x-ipynb+json' => ['ipynb'], + 'application/x-iso9660-appimage' => ['appimage'], + 'application/x-iso9660-image' => ['iso', 'iso9660'], + 'application/x-it87' => ['it87'], + 'application/x-iwork-keynote-sffkey' => ['key'], + 'application/x-jar' => ['jar'], + 'application/x-java' => ['class'], + 'application/x-java-archive' => ['jar'], + 'application/x-java-class' => ['class'], + 'application/x-java-jce-keystore' => ['jceks'], + 'application/x-java-jnlp-file' => ['jnlp'], + 'application/x-java-keystore' => ['jks', 'ks'], + 'application/x-java-pack200' => ['pack'], + 'application/x-java-vm' => ['class'], + 'application/x-javascript' => ['js', 'jsm', 'mjs'], + 'application/x-jbuilder-project' => ['jpr', 'jpx'], + 'application/x-karbon' => ['karbon'], + 'application/x-kchart' => ['chrt'], + 'application/x-kexi-connectiondata' => ['kexic'], + 'application/x-kexiproject-shortcut' => ['kexis'], + 'application/x-kexiproject-sqlite' => ['kexi'], + 'application/x-kexiproject-sqlite2' => ['kexi'], + 'application/x-kexiproject-sqlite3' => ['kexi'], + 'application/x-kformula' => ['kfo'], + 'application/x-killustrator' => ['kil'], + 'application/x-kivio' => ['flw'], + 'application/x-kontour' => ['kon'], + 'application/x-kpovmodeler' => ['kpm'], + 'application/x-kpresenter' => ['kpr', 'kpt'], + 'application/x-krita' => ['kra'], + 'application/x-kspread' => ['ksp'], + 'application/x-kugar' => ['kud'], + 'application/x-kword' => ['kwd', 'kwt'], + 'application/x-latex' => ['latex'], + 'application/x-lha' => ['lha', 'lzh'], + 'application/x-lhz' => ['lhz'], + 'application/x-linguist' => ['ts'], + 'application/x-lotus123' => ['123', 'wk1', 'wk3', 'wk4', 'wks'], + 'application/x-lrzip' => ['lrz'], + 'application/x-lrzip-compressed-tar' => ['tar.lrz', 'tlrz'], + 'application/x-lyx' => ['lyx'], + 'application/x-lz4' => ['lz4'], + 'application/x-lz4-compressed-tar' => ['tar.lz4'], + 'application/x-lzh-compressed' => ['lzh', 'lha'], + 'application/x-lzip' => ['lz'], + 'application/x-lzip-compressed-tar' => ['tar.lz'], + 'application/x-lzma' => ['lzma'], + 'application/x-lzma-compressed-tar' => ['tar.lzma', 'tlz'], + 'application/x-lzop' => ['lzo'], + 'application/x-lzpdf' => ['pdf.lz'], + 'application/x-m4' => ['m4'], + 'application/x-magicpoint' => ['mgp'], + 'application/x-markaby' => ['mab'], + 'application/x-mathematica' => ['nb'], + 'application/x-mdb' => ['mdb'], + 'application/x-mie' => ['mie'], + 'application/x-mif' => ['mif'], + 'application/x-mimearchive' => ['mhtml', 'mht'], + 'application/x-mobipocket-ebook' => ['prc', 'mobi'], + 'application/x-ms-application' => ['application'], + 'application/x-ms-asx' => ['asx', 'wax', 'wvx', 'wmx'], + 'application/x-ms-dos-executable' => ['exe'], + 'application/x-ms-shortcut' => ['lnk'], + 'application/x-ms-wim' => ['wim', 'swm'], + 'application/x-ms-wmd' => ['wmd'], + 'application/x-ms-wmz' => ['wmz'], + 'application/x-ms-xbap' => ['xbap'], + 'application/x-msaccess' => ['mdb'], + 'application/x-msbinder' => ['obd'], + 'application/x-mscardfile' => ['crd'], + 'application/x-msclip' => ['clp'], + 'application/x-msdownload' => ['exe', 'dll', 'com', 'bat', 'msi'], + 'application/x-msexcel' => ['xls', 'xlc', 'xll', 'xlm', 'xlw', 'xla', 'xlt', 'xld'], + 'application/x-msi' => ['msi'], + 'application/x-msmediaview' => ['mvb', 'm13', 'm14'], + 'application/x-msmetafile' => ['wmf', 'wmz', 'emf', 'emz'], + 'application/x-msmoney' => ['mny'], + 'application/x-mspowerpoint' => ['ppz', 'ppt', 'pps', 'pot'], + 'application/x-mspublisher' => ['pub'], + 'application/x-msschedule' => ['scd'], + 'application/x-msterminal' => ['trm'], + 'application/x-mswinurl' => ['url'], + 'application/x-msword' => ['doc'], + 'application/x-mswrite' => ['wri'], + 'application/x-msx-rom' => ['msx'], + 'application/x-n64-rom' => ['n64', 'z64', 'v64'], + 'application/x-navi-animation' => ['ani'], + 'application/x-neo-geo-pocket-color-rom' => ['ngc'], + 'application/x-neo-geo-pocket-rom' => ['ngp'], + 'application/x-nes-rom' => ['nes', 'nez', 'unf', 'unif'], + 'application/x-netcdf' => ['nc', 'cdf'], + 'application/x-netshow-channel' => ['nsc'], + 'application/x-nintendo-ds-rom' => ['nds'], + 'application/x-nzb' => ['nzb'], + 'application/x-object' => ['o'], + 'application/x-ogg' => ['ogx'], + 'application/x-oleo' => ['oleo'], + 'application/x-pagemaker' => ['p65', 'pm', 'pm6', 'pmd'], + 'application/x-pak' => ['pak'], + 'application/x-palm-database' => ['prc', 'pdb', 'pqa', 'oprc'], + 'application/x-par2' => ['PAR2', 'par2'], + 'application/x-partial-download' => ['wkdownload', 'crdownload', 'part'], + 'application/x-pc-engine-rom' => ['pce'], + 'application/x-pcap' => ['pcap', 'cap', 'dmp'], + 'application/x-pdf' => ['pdf'], + 'application/x-perl' => ['pl', 'PL', 'pm', 'al', 'perl', 'pod', 't'], + 'application/x-photoshop' => ['psd'], + 'application/x-php' => ['php', 'php3', 'php4', 'php5', 'phps'], + 'application/x-pkcs12' => ['p12', 'pfx'], + 'application/x-pkcs7-certificates' => ['p7b', 'spc'], + 'application/x-pkcs7-certreqresp' => ['p7r'], + 'application/x-planperfect' => ['pln'], + 'application/x-pocket-word' => ['psw'], + 'application/x-pw' => ['pw'], + 'application/x-python-bytecode' => ['pyc', 'pyo'], + 'application/x-qpress' => ['qp'], + 'application/x-qtiplot' => ['qti', 'qti.gz'], + 'application/x-quattropro' => ['wb1', 'wb2', 'wb3'], + 'application/x-quicktime-media-link' => ['qtl'], + 'application/x-quicktimeplayer' => ['qtl'], + 'application/x-qw' => ['qif'], + 'application/x-rar' => ['rar'], + 'application/x-rar-compressed' => ['rar'], + 'application/x-raw-disk-image' => ['raw-disk-image', 'img'], + 'application/x-raw-disk-image-xz-compressed' => ['raw-disk-image.xz', 'img.xz'], + 'application/x-raw-floppy-disk-image' => ['fd', 'qd'], + 'application/x-redhat-package-manager' => ['rpm'], + 'application/x-reject' => ['rej'], + 'application/x-research-info-systems' => ['ris'], + 'application/x-rnc' => ['rnc'], + 'application/x-rpm' => ['rpm'], + 'application/x-ruby' => ['rb'], + 'application/x-sami' => ['smi', 'sami'], + 'application/x-sap-file' => ['sap'], + 'application/x-saturn-rom' => ['bin', 'iso'], + 'application/x-sdp' => ['sdp'], + 'application/x-sega-cd-rom' => ['bin', 'iso'], + 'application/x-sg1000-rom' => ['sg'], + 'application/x-sh' => ['sh'], + 'application/x-shar' => ['shar'], + 'application/x-shared-library-la' => ['la'], + 'application/x-sharedlib' => ['so'], + 'application/x-shellscript' => ['sh'], + 'application/x-shockwave-flash' => ['swf', 'spl'], + 'application/x-shorten' => ['shn'], + 'application/x-siag' => ['siag'], + 'application/x-silverlight-app' => ['xap'], + 'application/x-sit' => ['sit'], + 'application/x-smaf' => ['mmf', 'smaf'], + 'application/x-sms-rom' => ['sms'], + 'application/x-snes-rom' => ['sfc', 'smc'], + 'application/x-source-rpm' => ['src.rpm', 'spm'], + 'application/x-spss-por' => ['por'], + 'application/x-spss-sav' => ['sav', 'zsav'], + 'application/x-spss-savefile' => ['sav', 'zsav'], + 'application/x-sql' => ['sql'], + 'application/x-sqlite2' => ['sqlite2'], + 'application/x-sqlite3' => ['sqlite3'], + 'application/x-srt' => ['srt'], + 'application/x-stuffit' => ['sit'], + 'application/x-stuffitx' => ['sitx'], + 'application/x-subrip' => ['srt'], + 'application/x-sv4cpio' => ['sv4cpio'], + 'application/x-sv4crc' => ['sv4crc'], + 'application/x-t3vm-image' => ['t3'], + 'application/x-t602' => ['602'], + 'application/x-tads' => ['gam'], + 'application/x-tar' => ['tar', 'gtar', 'gem'], + 'application/x-tarz' => ['tar.Z', 'taz'], + 'application/x-tcl' => ['tcl'], + 'application/x-tex' => ['tex', 'ltx', 'sty', 'cls', 'dtx', 'ins', 'latex'], + 'application/x-tex-gf' => ['gf'], + 'application/x-tex-pk' => ['pk'], + 'application/x-tex-tfm' => ['tfm'], + 'application/x-texinfo' => ['texinfo', 'texi'], + 'application/x-tgif' => ['obj'], + 'application/x-theme' => ['theme'], + 'application/x-thomson-cartridge-memo7' => ['m7'], + 'application/x-thomson-cassette' => ['k7'], + 'application/x-thomson-sap-image' => ['sap'], + 'application/x-trash' => ['bak', 'old', 'sik'], + 'application/x-trig' => ['trig'], + 'application/x-troff' => ['tr', 'roff', 't'], + 'application/x-troff-man' => ['man'], + 'application/x-tzo' => ['tar.lzo', 'tzo'], + 'application/x-ufraw' => ['ufraw'], + 'application/x-ustar' => ['ustar'], + 'application/x-virtual-boy-rom' => ['vb'], + 'application/x-vnd.kde.kexi' => ['kexi'], + 'application/x-wais-source' => ['src'], + 'application/x-wbfs' => ['iso'], + 'application/x-wia' => ['iso'], + 'application/x-wii-iso-image' => ['iso'], + 'application/x-wii-rom' => ['iso'], + 'application/x-wii-wad' => ['wad'], + 'application/x-windows-themepack' => ['themepack'], + 'application/x-wmf' => ['wmf'], + 'application/x-wonderswan-color-rom' => ['wsc'], + 'application/x-wonderswan-rom' => ['ws'], + 'application/x-wordperfect' => ['wp', 'wp4', 'wp5', 'wp6', 'wpd', 'wpp'], + 'application/x-wpg' => ['wpg'], + 'application/x-wwf' => ['wwf'], + 'application/x-x509-ca-cert' => ['der', 'crt', 'cert', 'pem'], + 'application/x-xar' => ['xar', 'pkg'], + 'application/x-xbel' => ['xbel'], + 'application/x-xfig' => ['fig'], + 'application/x-xliff' => ['xlf', 'xliff'], + 'application/x-xliff+xml' => ['xlf'], + 'application/x-xpinstall' => ['xpi'], + 'application/x-xspf+xml' => ['xspf'], + 'application/x-xz' => ['xz'], + 'application/x-xz-compressed-tar' => ['tar.xz', 'txz'], + 'application/x-xzpdf' => ['pdf.xz'], + 'application/x-yaml' => ['yaml', 'yml'], + 'application/x-zip' => ['zip'], + 'application/x-zip-compressed' => ['zip'], + 'application/x-zip-compressed-fb2' => ['fb2.zip'], + 'application/x-zmachine' => ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'], + 'application/x-zoo' => ['zoo'], + 'application/xaml+xml' => ['xaml'], + 'application/xcap-diff+xml' => ['xdf'], + 'application/xenc+xml' => ['xenc'], + 'application/xhtml+xml' => ['xhtml', 'xht'], + 'application/xliff+xml' => ['xlf', 'xliff'], + 'application/xml' => ['xml', 'xsl', 'xbl', 'xsd', 'rng'], + 'application/xml-dtd' => ['dtd'], + 'application/xml-external-parsed-entity' => ['ent'], + 'application/xop+xml' => ['xop'], + 'application/xproc+xml' => ['xpl'], + 'application/xps' => ['oxps', 'xps'], + 'application/xslt+xml' => ['xslt', 'xsl'], + 'application/xspf+xml' => ['xspf'], + 'application/xv+xml' => ['mxml', 'xhvml', 'xvml', 'xvm'], + 'application/yang' => ['yang'], + 'application/yin+xml' => ['yin'], + 'application/zip' => ['zip'], + 'application/zlib' => ['zz'], + 'audio/3gpp' => ['3gp', '3gpp', '3ga'], + 'audio/3gpp-encrypted' => ['3gp', '3gpp', '3ga'], + 'audio/3gpp2' => ['3g2', '3gp2', '3gpp2'], + 'audio/aac' => ['aac', 'adts', 'ass'], + 'audio/ac3' => ['ac3'], + 'audio/adpcm' => ['adp'], + 'audio/amr' => ['amr'], + 'audio/amr-encrypted' => ['amr'], + 'audio/amr-wb' => ['awb'], + 'audio/amr-wb-encrypted' => ['awb'], + 'audio/annodex' => ['axa'], + 'audio/basic' => ['au', 'snd'], + 'audio/flac' => ['flac'], + 'audio/imelody' => ['imy', 'ime'], + 'audio/m3u' => ['m3u', 'm3u8', 'vlc'], + 'audio/m4a' => ['m4a', 'f4a'], + 'audio/midi' => ['mid', 'midi', 'kar', 'rmi'], + 'audio/mobile-xmf' => ['xmf'], + 'audio/mp2' => ['mp2'], + 'audio/mp3' => ['mp3', 'mpga'], + 'audio/mp4' => ['m4a', 'mp4a', 'f4a'], + 'audio/mpeg' => ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'], + 'audio/mpegurl' => ['m3u', 'm3u8', 'vlc'], + 'audio/ogg' => ['oga', 'ogg', 'spx', 'opus'], + 'audio/prs.sid' => ['sid', 'psid'], + 'audio/s3m' => ['s3m'], + 'audio/scpls' => ['pls'], + 'audio/silk' => ['sil'], + 'audio/tta' => ['tta'], + 'audio/usac' => ['loas', 'xhe'], + 'audio/vnd.audible' => ['aa', 'aax'], + 'audio/vnd.audible.aax' => ['aa', 'aax'], + 'audio/vnd.dece.audio' => ['uva', 'uvva'], + 'audio/vnd.digital-winds' => ['eol'], + 'audio/vnd.dra' => ['dra'], + 'audio/vnd.dts' => ['dts'], + 'audio/vnd.dts.hd' => ['dtshd'], + 'audio/vnd.lucent.voice' => ['lvp'], + 'audio/vnd.m-realaudio' => ['ra', 'rax'], + 'audio/vnd.ms-playready.media.pya' => ['pya'], + 'audio/vnd.nuera.ecelp4800' => ['ecelp4800'], + 'audio/vnd.nuera.ecelp7470' => ['ecelp7470'], + 'audio/vnd.nuera.ecelp9600' => ['ecelp9600'], + 'audio/vnd.rip' => ['rip'], + 'audio/vnd.rn-realaudio' => ['ra', 'rax'], + 'audio/vnd.wave' => ['wav'], + 'audio/vorbis' => ['oga', 'ogg'], + 'audio/wav' => ['wav'], + 'audio/webm' => ['weba'], + 'audio/wma' => ['wma'], + 'audio/x-aac' => ['aac', 'adts', 'ass'], + 'audio/x-aifc' => ['aifc', 'aiffc'], + 'audio/x-aiff' => ['aif', 'aiff', 'aifc'], + 'audio/x-aiffc' => ['aifc', 'aiffc'], + 'audio/x-amzxml' => ['amz'], + 'audio/x-annodex' => ['axa'], + 'audio/x-ape' => ['ape'], + 'audio/x-caf' => ['caf'], + 'audio/x-dts' => ['dts'], + 'audio/x-dtshd' => ['dtshd'], + 'audio/x-flac' => ['flac'], + 'audio/x-flac+ogg' => ['oga', 'ogg'], + 'audio/x-gsm' => ['gsm'], + 'audio/x-hx-aac-adts' => ['aac', 'adts', 'ass'], + 'audio/x-imelody' => ['imy', 'ime'], + 'audio/x-iriver-pla' => ['pla'], + 'audio/x-it' => ['it'], + 'audio/x-m3u' => ['m3u', 'm3u8', 'vlc'], + 'audio/x-m4a' => ['m4a', 'f4a'], + 'audio/x-m4b' => ['m4b', 'f4b'], + 'audio/x-m4r' => ['m4r'], + 'audio/x-matroska' => ['mka'], + 'audio/x-midi' => ['mid', 'midi', 'kar'], + 'audio/x-minipsf' => ['minipsf'], + 'audio/x-mo3' => ['mo3'], + 'audio/x-mod' => ['mod', 'ult', 'uni', 'm15', 'mtm', '669', 'med'], + 'audio/x-mp2' => ['mp2'], + 'audio/x-mp3' => ['mp3', 'mpga'], + 'audio/x-mp3-playlist' => ['m3u', 'm3u8', 'vlc'], + 'audio/x-mpeg' => ['mp3', 'mpga'], + 'audio/x-mpegurl' => ['m3u', 'm3u8', 'vlc'], + 'audio/x-mpg' => ['mp3', 'mpga'], + 'audio/x-ms-asx' => ['asx', 'wax', 'wvx', 'wmx'], + 'audio/x-ms-wax' => ['wax'], + 'audio/x-ms-wma' => ['wma'], + 'audio/x-musepack' => ['mpc', 'mpp', 'mp+'], + 'audio/x-ogg' => ['oga', 'ogg', 'opus'], + 'audio/x-oggflac' => ['oga', 'ogg'], + 'audio/x-opus+ogg' => ['opus'], + 'audio/x-pn-audibleaudio' => ['aa', 'aax'], + 'audio/x-pn-realaudio' => ['ram', 'ra', 'rax'], + 'audio/x-pn-realaudio-plugin' => ['rmp'], + 'audio/x-psf' => ['psf'], + 'audio/x-psflib' => ['psflib'], + 'audio/x-rn-3gpp-amr' => ['3gp', '3gpp', '3ga'], + 'audio/x-rn-3gpp-amr-encrypted' => ['3gp', '3gpp', '3ga'], + 'audio/x-rn-3gpp-amr-wb' => ['3gp', '3gpp', '3ga'], + 'audio/x-rn-3gpp-amr-wb-encrypted' => ['3gp', '3gpp', '3ga'], + 'audio/x-s3m' => ['s3m'], + 'audio/x-scpls' => ['pls'], + 'audio/x-shorten' => ['shn'], + 'audio/x-speex' => ['spx'], + 'audio/x-speex+ogg' => ['oga', 'ogg'], + 'audio/x-stm' => ['stm'], + 'audio/x-tta' => ['tta'], + 'audio/x-voc' => ['voc'], + 'audio/x-vorbis' => ['oga', 'ogg'], + 'audio/x-vorbis+ogg' => ['oga', 'ogg'], + 'audio/x-wav' => ['wav'], + 'audio/x-wavpack' => ['wv', 'wvp'], + 'audio/x-wavpack-correction' => ['wvc'], + 'audio/x-xi' => ['xi'], + 'audio/x-xm' => ['xm'], + 'audio/x-xmf' => ['xmf'], + 'audio/xm' => ['xm'], + 'audio/xmf' => ['xmf'], + 'chemical/x-cdx' => ['cdx'], + 'chemical/x-cif' => ['cif'], + 'chemical/x-cmdf' => ['cmdf'], + 'chemical/x-cml' => ['cml'], + 'chemical/x-csml' => ['csml'], + 'chemical/x-xyz' => ['xyz'], + 'flv-application/octet-stream' => ['flv'], + 'font/collection' => ['ttc'], + 'font/otf' => ['otf'], + 'font/ttf' => ['ttf'], + 'font/woff' => ['woff', 'woff2'], + 'font/woff2' => ['woff2'], + 'image/bmp' => ['bmp', 'dib'], + 'image/cdr' => ['cdr'], + 'image/cgm' => ['cgm'], + 'image/emf' => ['emf'], + 'image/fax-g3' => ['g3'], + 'image/fits' => ['fits'], + 'image/g3fax' => ['g3'], + 'image/gif' => ['gif'], + 'image/heic' => ['heic', 'heif'], + 'image/heic-sequence' => ['heic', 'heif'], + 'image/heif' => ['heic', 'heif'], + 'image/heif-sequence' => ['heic', 'heif'], + 'image/ico' => ['ico'], + 'image/icon' => ['ico'], + 'image/ief' => ['ief'], + 'image/jp2' => ['jp2', 'jpg2'], + 'image/jpeg' => ['jpeg', 'jpg', 'jpe'], + 'image/jpeg2000' => ['jp2', 'jpg2'], + 'image/jpeg2000-image' => ['jp2', 'jpg2'], + 'image/jpm' => ['jpm', 'jpgm'], + 'image/jpx' => ['jpf', 'jpx'], + 'image/ktx' => ['ktx'], + 'image/openraster' => ['ora'], + 'image/pdf' => ['pdf'], + 'image/photoshop' => ['psd'], + 'image/pjpeg' => ['jpeg', 'jpg', 'jpe'], + 'image/png' => ['png'], + 'image/prs.btif' => ['btif'], + 'image/psd' => ['psd'], + 'image/rle' => ['rle'], + 'image/sgi' => ['sgi'], + 'image/svg' => ['svg'], + 'image/svg+xml' => ['svg', 'svgz'], + 'image/svg+xml-compressed' => ['svgz'], + 'image/tiff' => ['tiff', 'tif'], + 'image/vnd.adobe.photoshop' => ['psd'], + 'image/vnd.dece.graphic' => ['uvi', 'uvvi', 'uvg', 'uvvg'], + 'image/vnd.djvu' => ['djvu', 'djv'], + 'image/vnd.djvu+multipage' => ['djvu', 'djv'], + 'image/vnd.dvb.subtitle' => ['sub'], + 'image/vnd.dwg' => ['dwg'], + 'image/vnd.dxf' => ['dxf'], + 'image/vnd.fastbidsheet' => ['fbs'], + 'image/vnd.fpx' => ['fpx'], + 'image/vnd.fst' => ['fst'], + 'image/vnd.fujixerox.edmics-mmr' => ['mmr'], + 'image/vnd.fujixerox.edmics-rlc' => ['rlc'], + 'image/vnd.microsoft.icon' => ['ico'], + 'image/vnd.ms-modi' => ['mdi'], + 'image/vnd.ms-photo' => ['wdp'], + 'image/vnd.net-fpx' => ['npx'], + 'image/vnd.rn-realpix' => ['rp'], + 'image/vnd.wap.wbmp' => ['wbmp'], + 'image/vnd.xiff' => ['xif'], + 'image/vnd.zbrush.pcx' => ['pcx'], + 'image/webp' => ['webp'], + 'image/wmf' => ['wmf'], + 'image/x-3ds' => ['3ds'], + 'image/x-adobe-dng' => ['dng'], + 'image/x-applix-graphics' => ['ag'], + 'image/x-bmp' => ['bmp', 'dib'], + 'image/x-bzeps' => ['eps.bz2', 'epsi.bz2', 'epsf.bz2'], + 'image/x-canon-cr2' => ['cr2'], + 'image/x-canon-crw' => ['crw'], + 'image/x-cdr' => ['cdr'], + 'image/x-cmu-raster' => ['ras'], + 'image/x-cmx' => ['cmx'], + 'image/x-compressed-xcf' => ['xcf.gz', 'xcf.bz2'], + 'image/x-dds' => ['dds'], + 'image/x-djvu' => ['djvu', 'djv'], + 'image/x-emf' => ['emf'], + 'image/x-eps' => ['eps', 'epsi', 'epsf'], + 'image/x-exr' => ['exr'], + 'image/x-fits' => ['fits'], + 'image/x-freehand' => ['fh', 'fhc', 'fh4', 'fh5', 'fh7'], + 'image/x-fuji-raf' => ['raf'], + 'image/x-gimp-gbr' => ['gbr'], + 'image/x-gimp-gih' => ['gih'], + 'image/x-gimp-pat' => ['pat'], + 'image/x-gzeps' => ['eps.gz', 'epsi.gz', 'epsf.gz'], + 'image/x-icb' => ['tga', 'icb', 'tpic', 'vda', 'vst'], + 'image/x-icns' => ['icns'], + 'image/x-ico' => ['ico'], + 'image/x-icon' => ['ico'], + 'image/x-iff' => ['iff', 'ilbm', 'lbm'], + 'image/x-ilbm' => ['iff', 'ilbm', 'lbm'], + 'image/x-jng' => ['jng'], + 'image/x-jp2-codestream' => ['j2c', 'j2k', 'jpc'], + 'image/x-jpeg2000-image' => ['jp2', 'jpg2'], + 'image/x-kodak-dcr' => ['dcr'], + 'image/x-kodak-k25' => ['k25'], + 'image/x-kodak-kdc' => ['kdc'], + 'image/x-lwo' => ['lwo', 'lwob'], + 'image/x-lws' => ['lws'], + 'image/x-macpaint' => ['pntg'], + 'image/x-minolta-mrw' => ['mrw'], + 'image/x-mrsid-image' => ['sid'], + 'image/x-ms-bmp' => ['bmp', 'dib'], + 'image/x-msod' => ['msod'], + 'image/x-nikon-nef' => ['nef'], + 'image/x-olympus-orf' => ['orf'], + 'image/x-panasonic-raw' => ['raw'], + 'image/x-panasonic-raw2' => ['rw2'], + 'image/x-panasonic-rw' => ['raw'], + 'image/x-panasonic-rw2' => ['rw2'], + 'image/x-pcx' => ['pcx'], + 'image/x-pentax-pef' => ['pef'], + 'image/x-photo-cd' => ['pcd'], + 'image/x-photoshop' => ['psd'], + 'image/x-pict' => ['pic', 'pct', 'pict', 'pict1', 'pict2'], + 'image/x-portable-anymap' => ['pnm'], + 'image/x-portable-bitmap' => ['pbm'], + 'image/x-portable-graymap' => ['pgm'], + 'image/x-portable-pixmap' => ['ppm'], + 'image/x-psd' => ['psd'], + 'image/x-quicktime' => ['qtif', 'qif'], + 'image/x-rgb' => ['rgb'], + 'image/x-sgi' => ['sgi'], + 'image/x-sigma-x3f' => ['x3f'], + 'image/x-skencil' => ['sk', 'sk1'], + 'image/x-sony-arw' => ['arw'], + 'image/x-sony-sr2' => ['sr2'], + 'image/x-sony-srf' => ['srf'], + 'image/x-sun-raster' => ['sun'], + 'image/x-tga' => ['tga', 'icb', 'tpic', 'vda', 'vst'], + 'image/x-win-bitmap' => ['cur'], + 'image/x-win-metafile' => ['wmf'], + 'image/x-wmf' => ['wmf'], + 'image/x-xbitmap' => ['xbm'], + 'image/x-xcf' => ['xcf'], + 'image/x-xfig' => ['fig'], + 'image/x-xpixmap' => ['xpm'], + 'image/x-xpm' => ['xpm'], + 'image/x-xwindowdump' => ['xwd'], + 'image/x.djvu' => ['djvu', 'djv'], + 'message/rfc822' => ['eml', 'mime'], + 'model/iges' => ['igs', 'iges'], + 'model/mesh' => ['msh', 'mesh', 'silo'], + 'model/stl' => ['stl'], + 'model/vnd.collada+xml' => ['dae'], + 'model/vnd.dwf' => ['dwf'], + 'model/vnd.gdl' => ['gdl'], + 'model/vnd.gtw' => ['gtw'], + 'model/vnd.mts' => ['mts'], + 'model/vnd.vtu' => ['vtu'], + 'model/vrml' => ['wrl', 'vrml', 'vrm'], + 'model/x.stl-ascii' => ['stl'], + 'model/x.stl-binary' => ['stl'], + 'model/x3d+binary' => ['x3db', 'x3dbz'], + 'model/x3d+vrml' => ['x3dv', 'x3dvz'], + 'model/x3d+xml' => ['x3d', 'x3dz'], + 'text/cache-manifest' => ['appcache', 'manifest'], + 'text/calendar' => ['ics', 'ifb', 'vcs'], + 'text/css' => ['css'], + 'text/csv' => ['csv'], + 'text/csv-schema' => ['csvs'], + 'text/directory' => ['vcard', 'vcf', 'vct', 'gcrd'], + 'text/ecmascript' => ['es'], + 'text/gedcom' => ['ged', 'gedcom'], + 'text/google-video-pointer' => ['gvp'], + 'text/html' => ['html', 'htm'], + 'text/ico' => ['ico'], + 'text/javascript' => ['js', 'jsm', 'mjs'], + 'text/markdown' => ['md', 'mkd', 'markdown'], + 'text/mathml' => ['mml'], + 'text/n3' => ['n3'], + 'text/plain' => ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'asc'], + 'text/prs.lines.tag' => ['dsc'], + 'text/rdf' => ['rdf', 'rdfs', 'owl'], + 'text/richtext' => ['rtx'], + 'text/rss' => ['rss'], + 'text/rtf' => ['rtf'], + 'text/rust' => ['rs'], + 'text/sgml' => ['sgml', 'sgm'], + 'text/spreadsheet' => ['sylk', 'slk'], + 'text/tab-separated-values' => ['tsv'], + 'text/troff' => ['t', 'tr', 'roff', 'man', 'me', 'ms'], + 'text/turtle' => ['ttl'], + 'text/uri-list' => ['uri', 'uris', 'urls'], + 'text/vcard' => ['vcard', 'vcf', 'vct', 'gcrd'], + 'text/vnd.curl' => ['curl'], + 'text/vnd.curl.dcurl' => ['dcurl'], + 'text/vnd.curl.mcurl' => ['mcurl'], + 'text/vnd.curl.scurl' => ['scurl'], + 'text/vnd.dvb.subtitle' => ['sub'], + 'text/vnd.fly' => ['fly'], + 'text/vnd.fmi.flexstor' => ['flx'], + 'text/vnd.graphviz' => ['gv', 'dot'], + 'text/vnd.in3d.3dml' => ['3dml'], + 'text/vnd.in3d.spot' => ['spot'], + 'text/vnd.qt.linguist' => ['ts'], + 'text/vnd.rn-realtext' => ['rt'], + 'text/vnd.sun.j2me.app-descriptor' => ['jad'], + 'text/vnd.trolltech.linguist' => ['ts'], + 'text/vnd.wap.wml' => ['wml'], + 'text/vnd.wap.wmlscript' => ['wmls'], + 'text/vtt' => ['vtt'], + 'text/x-adasrc' => ['adb', 'ads'], + 'text/x-asm' => ['s', 'asm'], + 'text/x-bibtex' => ['bib'], + 'text/x-c' => ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'], + 'text/x-c++hdr' => ['hh', 'hp', 'hpp', 'h++', 'hxx'], + 'text/x-c++src' => ['cpp', 'cxx', 'cc', 'C', 'c++'], + 'text/x-chdr' => ['h'], + 'text/x-cmake' => ['cmake'], + 'text/x-cobol' => ['cbl', 'cob'], + 'text/x-comma-separated-values' => ['csv'], + 'text/x-csharp' => ['cs'], + 'text/x-csrc' => ['c'], + 'text/x-csv' => ['csv'], + 'text/x-dbus-service' => ['service'], + 'text/x-dcl' => ['dcl'], + 'text/x-diff' => ['diff', 'patch'], + 'text/x-dsl' => ['dsl'], + 'text/x-dsrc' => ['d', 'di'], + 'text/x-dtd' => ['dtd'], + 'text/x-eiffel' => ['e', 'eif'], + 'text/x-emacs-lisp' => ['el'], + 'text/x-erlang' => ['erl'], + 'text/x-fortran' => ['f', 'for', 'f77', 'f90', 'f95'], + 'text/x-genie' => ['gs'], + 'text/x-gettext-translation' => ['po'], + 'text/x-gettext-translation-template' => ['pot'], + 'text/x-gherkin' => ['feature'], + 'text/x-go' => ['go'], + 'text/x-google-video-pointer' => ['gvp'], + 'text/x-haskell' => ['hs'], + 'text/x-idl' => ['idl'], + 'text/x-imelody' => ['imy', 'ime'], + 'text/x-iptables' => ['iptables'], + 'text/x-java' => ['java'], + 'text/x-java-source' => ['java'], + 'text/x-ldif' => ['ldif'], + 'text/x-lilypond' => ['ly'], + 'text/x-literate-haskell' => ['lhs'], + 'text/x-log' => ['log'], + 'text/x-lua' => ['lua'], + 'text/x-lyx' => ['lyx'], + 'text/x-makefile' => ['mk', 'mak'], + 'text/x-markdown' => ['md', 'mkd', 'markdown'], + 'text/x-matlab' => ['m'], + 'text/x-microdvd' => ['sub'], + 'text/x-moc' => ['moc'], + 'text/x-modelica' => ['mo'], + 'text/x-mof' => ['mof'], + 'text/x-mpsub' => ['sub'], + 'text/x-mrml' => ['mrml', 'mrl'], + 'text/x-ms-regedit' => ['reg'], + 'text/x-mup' => ['mup', 'not'], + 'text/x-nfo' => ['nfo'], + 'text/x-objcsrc' => ['m'], + 'text/x-ocaml' => ['ml', 'mli'], + 'text/x-ocl' => ['ocl'], + 'text/x-octave' => ['m'], + 'text/x-ooc' => ['ooc'], + 'text/x-opencl-src' => ['cl'], + 'text/x-opml' => ['opml'], + 'text/x-opml+xml' => ['opml'], + 'text/x-pascal' => ['p', 'pas'], + 'text/x-patch' => ['diff', 'patch'], + 'text/x-perl' => ['pl', 'PL', 'pm', 'al', 'perl', 'pod', 't'], + 'text/x-po' => ['po'], + 'text/x-pot' => ['pot'], + 'text/x-python' => ['py', 'pyx', 'wsgi'], + 'text/x-python3' => ['py', 'py3', 'py3x'], + 'text/x-qml' => ['qml', 'qmltypes', 'qmlproject'], + 'text/x-reject' => ['rej'], + 'text/x-rpm-spec' => ['spec'], + 'text/x-sass' => ['sass'], + 'text/x-scala' => ['scala'], + 'text/x-scheme' => ['scm', 'ss'], + 'text/x-scss' => ['scss'], + 'text/x-setext' => ['etx'], + 'text/x-sfv' => ['sfv'], + 'text/x-sh' => ['sh'], + 'text/x-sql' => ['sql'], + 'text/x-ssa' => ['ssa', 'ass'], + 'text/x-subviewer' => ['sub'], + 'text/x-svhdr' => ['svh'], + 'text/x-svsrc' => ['sv'], + 'text/x-systemd-unit' => ['automount', 'device', 'mount', 'path', 'scope', 'service', 'slice', 'socket', 'swap', 'target', 'timer'], + 'text/x-tcl' => ['tcl', 'tk'], + 'text/x-tex' => ['tex', 'ltx', 'sty', 'cls', 'dtx', 'ins', 'latex'], + 'text/x-texinfo' => ['texi', 'texinfo'], + 'text/x-troff' => ['tr', 'roff', 't'], + 'text/x-troff-me' => ['me'], + 'text/x-troff-mm' => ['mm'], + 'text/x-troff-ms' => ['ms'], + 'text/x-twig' => ['twig'], + 'text/x-txt2tags' => ['t2t'], + 'text/x-uil' => ['uil'], + 'text/x-uuencode' => ['uu', 'uue'], + 'text/x-vala' => ['vala', 'vapi'], + 'text/x-vcalendar' => ['vcs', 'ics'], + 'text/x-vcard' => ['vcf', 'vcard', 'vct', 'gcrd'], + 'text/x-verilog' => ['v'], + 'text/x-vhdl' => ['vhd', 'vhdl'], + 'text/x-xmi' => ['xmi'], + 'text/x-xslfo' => ['fo', 'xslfo'], + 'text/x-yaml' => ['yaml', 'yml'], + 'text/x.gcode' => ['gcode'], + 'text/xml' => ['xml', 'xbl', 'xsd', 'rng'], + 'text/xml-external-parsed-entity' => ['ent'], + 'text/yaml' => ['yaml', 'yml'], + 'video/3gp' => ['3gp', '3gpp', '3ga'], + 'video/3gpp' => ['3gp', '3gpp', '3ga'], + 'video/3gpp-encrypted' => ['3gp', '3gpp', '3ga'], + 'video/3gpp2' => ['3g2', '3gp2', '3gpp2'], + 'video/annodex' => ['axv'], + 'video/avi' => ['avi', 'avf', 'divx'], + 'video/divx' => ['avi', 'avf', 'divx'], + 'video/dv' => ['dv'], + 'video/fli' => ['fli', 'flc'], + 'video/flv' => ['flv'], + 'video/h261' => ['h261'], + 'video/h263' => ['h263'], + 'video/h264' => ['h264'], + 'video/jpeg' => ['jpgv'], + 'video/jpm' => ['jpm', 'jpgm'], + 'video/mj2' => ['mj2', 'mjp2'], + 'video/mp2t' => ['m2t', 'm2ts', 'ts', 'mts', 'cpi', 'clpi', 'mpl', 'mpls', 'bdm', 'bdmv'], + 'video/mp4' => ['mp4', 'mp4v', 'mpg4', 'm4v', 'f4v', 'lrv'], + 'video/mp4v-es' => ['mp4', 'm4v', 'f4v', 'lrv'], + 'video/mpeg' => ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v', 'mp2', 'vob'], + 'video/mpeg-system' => ['mpeg', 'mpg', 'mp2', 'mpe', 'vob'], + 'video/msvideo' => ['avi', 'avf', 'divx'], + 'video/ogg' => ['ogv', 'ogg'], + 'video/quicktime' => ['qt', 'mov', 'moov', 'qtvr'], + 'video/vivo' => ['viv', 'vivo'], + 'video/vnd.dece.hd' => ['uvh', 'uvvh'], + 'video/vnd.dece.mobile' => ['uvm', 'uvvm'], + 'video/vnd.dece.pd' => ['uvp', 'uvvp'], + 'video/vnd.dece.sd' => ['uvs', 'uvvs'], + 'video/vnd.dece.video' => ['uvv', 'uvvv'], + 'video/vnd.divx' => ['avi', 'avf', 'divx'], + 'video/vnd.dvb.file' => ['dvb'], + 'video/vnd.fvt' => ['fvt'], + 'video/vnd.mpegurl' => ['mxu', 'm4u', 'm1u'], + 'video/vnd.ms-playready.media.pyv' => ['pyv'], + 'video/vnd.rn-realvideo' => ['rv', 'rvx'], + 'video/vnd.uvvu.mp4' => ['uvu', 'uvvu'], + 'video/vnd.vivo' => ['viv', 'vivo'], + 'video/webm' => ['webm'], + 'video/x-anim' => ['anim[1-9j]'], + 'video/x-annodex' => ['axv'], + 'video/x-avi' => ['avi', 'avf', 'divx'], + 'video/x-f4v' => ['f4v'], + 'video/x-fli' => ['fli', 'flc'], + 'video/x-flic' => ['fli', 'flc'], + 'video/x-flv' => ['flv'], + 'video/x-javafx' => ['fxm'], + 'video/x-m4v' => ['m4v', 'mp4', 'f4v', 'lrv'], + 'video/x-matroska' => ['mkv', 'mk3d', 'mks'], + 'video/x-matroska-3d' => ['mk3d'], + 'video/x-mjpeg' => ['mjpeg', 'mjpg'], + 'video/x-mng' => ['mng'], + 'video/x-mpeg' => ['mpeg', 'mpg', 'mp2', 'mpe', 'vob'], + 'video/x-mpeg-system' => ['mpeg', 'mpg', 'mp2', 'mpe', 'vob'], + 'video/x-mpeg2' => ['mpeg', 'mpg', 'mp2', 'mpe', 'vob'], + 'video/x-mpegurl' => ['m1u', 'm4u', 'mxu'], + 'video/x-ms-asf' => ['asf', 'asx'], + 'video/x-ms-asf-plugin' => ['asf'], + 'video/x-ms-vob' => ['vob'], + 'video/x-ms-wax' => ['asx', 'wax', 'wvx', 'wmx'], + 'video/x-ms-wm' => ['wm', 'asf'], + 'video/x-ms-wmv' => ['wmv'], + 'video/x-ms-wmx' => ['wmx', 'asx', 'wax', 'wvx'], + 'video/x-ms-wvx' => ['wvx', 'asx', 'wax', 'wmx'], + 'video/x-msvideo' => ['avi', 'avf', 'divx'], + 'video/x-nsv' => ['nsv'], + 'video/x-ogg' => ['ogv', 'ogg'], + 'video/x-ogm' => ['ogm'], + 'video/x-ogm+ogg' => ['ogm'], + 'video/x-real-video' => ['rv', 'rvx'], + 'video/x-sgi-movie' => ['movie'], + 'video/x-smv' => ['smv'], + 'video/x-theora' => ['ogg'], + 'video/x-theora+ogg' => ['ogg'], + 'x-conference/x-cooltalk' => ['ice'], + 'x-epoc/x-sisx-app' => ['sisx'], + 'zz-application/zz-winassoc-123' => ['123', 'wk1', 'wk3', 'wk4', 'wks'], + 'zz-application/zz-winassoc-cab' => ['cab'], + 'zz-application/zz-winassoc-cdr' => ['cdr'], + 'zz-application/zz-winassoc-doc' => ['doc'], + 'zz-application/zz-winassoc-hlp' => ['hlp'], + 'zz-application/zz-winassoc-mdb' => ['mdb'], + 'zz-application/zz-winassoc-uu' => ['uue'], + 'zz-application/zz-winassoc-xls' => ['xls', 'xlc', 'xll', 'xlm', 'xlw', 'xla', 'xlt', 'xld'], + ]; + + private static $reverseMap = [ + '32x' => ['application/x-genesis-32x-rom'], + '3dml' => ['text/vnd.in3d.3dml'], + '3ds' => ['image/x-3ds'], + '3g2' => ['audio/3gpp2', 'video/3gpp2'], + '3ga' => ['audio/3gpp', 'audio/3gpp-encrypted', 'audio/x-rn-3gpp-amr', 'audio/x-rn-3gpp-amr-encrypted', 'audio/x-rn-3gpp-amr-wb', 'audio/x-rn-3gpp-amr-wb-encrypted', 'video/3gp', 'video/3gpp', 'video/3gpp-encrypted'], + '3gp' => ['audio/3gpp', 'audio/3gpp-encrypted', 'audio/x-rn-3gpp-amr', 'audio/x-rn-3gpp-amr-encrypted', 'audio/x-rn-3gpp-amr-wb', 'audio/x-rn-3gpp-amr-wb-encrypted', 'video/3gp', 'video/3gpp', 'video/3gpp-encrypted'], + '3gp2' => ['audio/3gpp2', 'video/3gpp2'], + '3gpp' => ['audio/3gpp', 'audio/3gpp-encrypted', 'audio/x-rn-3gpp-amr', 'audio/x-rn-3gpp-amr-encrypted', 'audio/x-rn-3gpp-amr-wb', 'audio/x-rn-3gpp-amr-wb-encrypted', 'video/3gp', 'video/3gpp', 'video/3gpp-encrypted'], + '3gpp2' => ['audio/3gpp2', 'video/3gpp2'], + '7z' => ['application/x-7z-compressed'], + 'BLEND' => ['application/x-blender'], + 'C' => ['text/x-c++src'], + 'PAR2' => ['application/x-par2'], + 'PL' => ['application/x-perl', 'text/x-perl'], + 'Z' => ['application/x-compress'], + 'a' => ['application/x-archive'], + 'a26' => ['application/x-atari-2600-rom'], + 'a78' => ['application/x-atari-7800-rom'], + 'aa' => ['audio/vnd.audible', 'audio/vnd.audible.aax', 'audio/x-pn-audibleaudio'], + 'aab' => ['application/x-authorware-bin'], + 'aac' => ['audio/aac', 'audio/x-aac', 'audio/x-hx-aac-adts'], + 'aam' => ['application/x-authorware-map'], + 'aas' => ['application/x-authorware-seg'], + 'aax' => ['audio/vnd.audible', 'audio/vnd.audible.aax', 'audio/x-pn-audibleaudio'], + 'abw' => ['application/x-abiword'], + 'abw.CRASHED' => ['application/x-abiword'], + 'abw.gz' => ['application/x-abiword'], + 'ac' => ['application/pkix-attr-cert'], + 'ac3' => ['audio/ac3'], + 'acc' => ['application/vnd.americandynamics.acc'], + 'ace' => ['application/x-ace', 'application/x-ace-compressed'], + 'acu' => ['application/vnd.acucobol'], + 'acutc' => ['application/vnd.acucorp'], + 'adb' => ['text/x-adasrc'], + 'adf' => ['application/x-amiga-disk-format'], + 'adp' => ['audio/adpcm'], + 'ads' => ['text/x-adasrc'], + 'adts' => ['audio/aac', 'audio/x-aac', 'audio/x-hx-aac-adts'], + 'aep' => ['application/vnd.audiograph'], + 'afm' => ['application/x-font-afm', 'application/x-font-type1'], + 'afp' => ['application/vnd.ibm.modcap'], + 'ag' => ['image/x-applix-graphics'], + 'agb' => ['application/x-gba-rom'], + 'ahead' => ['application/vnd.ahead.space'], + 'ai' => ['application/illustrator', 'application/postscript', 'application/vnd.adobe.illustrator'], + 'aif' => ['audio/x-aiff'], + 'aifc' => ['audio/x-aifc', 'audio/x-aiff', 'audio/x-aiffc'], + 'aiff' => ['audio/x-aiff'], + 'aiffc' => ['audio/x-aifc', 'audio/x-aiffc'], + 'air' => ['application/vnd.adobe.air-application-installer-package+zip'], + 'ait' => ['application/vnd.dvb.ait'], + 'al' => ['application/x-perl', 'text/x-perl'], + 'alz' => ['application/x-alz'], + 'ami' => ['application/vnd.amiga.ami'], + 'amr' => ['audio/amr', 'audio/amr-encrypted'], + 'amz' => ['audio/x-amzxml'], + 'ani' => ['application/x-navi-animation'], + 'anim[1-9j]' => ['video/x-anim'], + 'anx' => ['application/annodex', 'application/x-annodex'], + 'ape' => ['audio/x-ape'], + 'apk' => ['application/vnd.android.package-archive'], + 'appcache' => ['text/cache-manifest'], + 'appimage' => ['application/vnd.appimage', 'application/x-iso9660-appimage'], + 'application' => ['application/x-ms-application'], + 'apr' => ['application/vnd.lotus-approach'], + 'aps' => ['application/postscript'], + 'ar' => ['application/x-archive'], + 'arc' => ['application/x-freearc'], + 'arj' => ['application/x-arj'], + 'arw' => ['image/x-sony-arw'], + 'as' => ['application/x-applix-spreadsheet'], + 'asc' => ['application/pgp', 'application/pgp-encrypted', 'application/pgp-keys', 'application/pgp-signature', 'text/plain'], + 'asf' => ['application/vnd.ms-asf', 'video/x-ms-asf', 'video/x-ms-asf-plugin', 'video/x-ms-wm'], + 'asm' => ['text/x-asm'], + 'aso' => ['application/vnd.accpac.simply.aso'], + 'asp' => ['application/x-asp'], + 'ass' => ['audio/aac', 'audio/x-aac', 'audio/x-hx-aac-adts', 'text/x-ssa'], + 'asx' => ['application/x-ms-asx', 'audio/x-ms-asx', 'video/x-ms-asf', 'video/x-ms-wax', 'video/x-ms-wmx', 'video/x-ms-wvx'], + 'atc' => ['application/vnd.acucorp'], + 'atom' => ['application/atom+xml'], + 'atomcat' => ['application/atomcat+xml'], + 'atomsvc' => ['application/atomsvc+xml'], + 'atx' => ['application/vnd.antix.game-component'], + 'au' => ['audio/basic'], + 'automount' => ['text/x-systemd-unit'], + 'avf' => ['video/avi', 'video/divx', 'video/msvideo', 'video/vnd.divx', 'video/x-avi', 'video/x-msvideo'], + 'avi' => ['video/avi', 'video/divx', 'video/msvideo', 'video/vnd.divx', 'video/x-avi', 'video/x-msvideo'], + 'aw' => ['application/applixware', 'application/x-applix-word'], + 'awb' => ['audio/amr-wb', 'audio/amr-wb-encrypted'], + 'awk' => ['application/x-awk'], + 'axa' => ['audio/annodex', 'audio/x-annodex'], + 'axv' => ['video/annodex', 'video/x-annodex'], + 'azf' => ['application/vnd.airzip.filesecure.azf'], + 'azs' => ['application/vnd.airzip.filesecure.azs'], + 'azw' => ['application/vnd.amazon.ebook'], + 'bak' => ['application/x-trash'], + 'bat' => ['application/x-msdownload'], + 'bcpio' => ['application/x-bcpio'], + 'bdf' => ['application/x-font-bdf'], + 'bdm' => ['application/vnd.syncml.dm+wbxml', 'video/mp2t'], + 'bdmv' => ['video/mp2t'], + 'bed' => ['application/vnd.realvnc.bed'], + 'bh2' => ['application/vnd.fujitsu.oasysprs'], + 'bib' => ['text/x-bibtex'], + 'bin' => ['application/octet-stream', 'application/x-saturn-rom', 'application/x-sega-cd-rom'], + 'blb' => ['application/x-blorb'], + 'blend' => ['application/x-blender'], + 'blender' => ['application/x-blender'], + 'blorb' => ['application/x-blorb'], + 'bmi' => ['application/vnd.bmi'], + 'bmp' => ['image/bmp', 'image/x-bmp', 'image/x-ms-bmp'], + 'book' => ['application/vnd.framemaker'], + 'box' => ['application/vnd.previewsystems.box'], + 'boz' => ['application/x-bzip2'], + 'bpk' => ['application/octet-stream'], + 'bsdiff' => ['application/x-bsdiff'], + 'btif' => ['image/prs.btif'], + 'bz' => ['application/x-bzip', 'application/x-bzip2'], + 'bz2' => ['application/x-bz2', 'application/x-bzip', 'application/x-bzip2'], + 'c' => ['text/x-c', 'text/x-csrc'], + 'c++' => ['text/x-c++src'], + 'c11amc' => ['application/vnd.cluetrust.cartomobile-config'], + 'c11amz' => ['application/vnd.cluetrust.cartomobile-config-pkg'], + 'c4d' => ['application/vnd.clonk.c4group'], + 'c4f' => ['application/vnd.clonk.c4group'], + 'c4g' => ['application/vnd.clonk.c4group'], + 'c4p' => ['application/vnd.clonk.c4group'], + 'c4u' => ['application/vnd.clonk.c4group'], + 'cab' => ['application/vnd.ms-cab-compressed', 'zz-application/zz-winassoc-cab'], + 'caf' => ['audio/x-caf'], + 'cap' => ['application/pcap', 'application/vnd.tcpdump.pcap', 'application/x-pcap'], + 'car' => ['application/vnd.curl.car'], + 'cat' => ['application/vnd.ms-pki.seccat'], + 'cb7' => ['application/x-cb7', 'application/x-cbr'], + 'cba' => ['application/x-cbr'], + 'cbl' => ['text/x-cobol'], + 'cbr' => ['application/vnd.comicbook-rar', 'application/x-cbr'], + 'cbt' => ['application/x-cbr', 'application/x-cbt'], + 'cbz' => ['application/vnd.comicbook+zip', 'application/x-cbr', 'application/x-cbz'], + 'cc' => ['text/x-c', 'text/x-c++src'], + 'ccmx' => ['application/x-ccmx'], + 'cct' => ['application/x-director'], + 'ccxml' => ['application/ccxml+xml'], + 'cdbcmsg' => ['application/vnd.contact.cmsg'], + 'cdf' => ['application/x-netcdf'], + 'cdkey' => ['application/vnd.mediastation.cdkey'], + 'cdmia' => ['application/cdmi-capability'], + 'cdmic' => ['application/cdmi-container'], + 'cdmid' => ['application/cdmi-domain'], + 'cdmio' => ['application/cdmi-object'], + 'cdmiq' => ['application/cdmi-queue'], + 'cdr' => ['application/cdr', 'application/coreldraw', 'application/vnd.corel-draw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'], + 'cdx' => ['chemical/x-cdx'], + 'cdxml' => ['application/vnd.chemdraw+xml'], + 'cdy' => ['application/vnd.cinderella'], + 'cer' => ['application/pkix-cert'], + 'cert' => ['application/x-x509-ca-cert'], + 'cfs' => ['application/x-cfs-compressed'], + 'cgb' => ['application/x-gameboy-color-rom'], + 'cgm' => ['image/cgm'], + 'chat' => ['application/x-chat'], + 'chm' => ['application/vnd.ms-htmlhelp', 'application/x-chm'], + 'chrt' => ['application/vnd.kde.kchart', 'application/x-kchart'], + 'cif' => ['chemical/x-cif'], + 'cii' => ['application/vnd.anser-web-certificate-issue-initiation'], + 'cil' => ['application/vnd.ms-artgalry'], + 'cl' => ['text/x-opencl-src'], + 'cla' => ['application/vnd.claymore'], + 'class' => ['application/java', 'application/java-byte-code', 'application/java-vm', 'application/x-java', 'application/x-java-class', 'application/x-java-vm'], + 'clkk' => ['application/vnd.crick.clicker.keyboard'], + 'clkp' => ['application/vnd.crick.clicker.palette'], + 'clkt' => ['application/vnd.crick.clicker.template'], + 'clkw' => ['application/vnd.crick.clicker.wordbank'], + 'clkx' => ['application/vnd.crick.clicker'], + 'clp' => ['application/x-msclip'], + 'clpi' => ['video/mp2t'], + 'cls' => ['application/x-tex', 'text/x-tex'], + 'cmake' => ['text/x-cmake'], + 'cmc' => ['application/vnd.cosmocaller'], + 'cmdf' => ['chemical/x-cmdf'], + 'cml' => ['chemical/x-cml'], + 'cmp' => ['application/vnd.yellowriver-custom-menu'], + 'cmx' => ['image/x-cmx'], + 'cob' => ['text/x-cobol'], + 'cod' => ['application/vnd.rim.cod'], + 'coffee' => ['application/vnd.coffeescript'], + 'com' => ['application/x-msdownload'], + 'conf' => ['text/plain'], + 'cpi' => ['video/mp2t'], + 'cpio' => ['application/x-cpio'], + 'cpio.gz' => ['application/x-cpio-compressed'], + 'cpp' => ['text/x-c', 'text/x-c++src'], + 'cpt' => ['application/mac-compactpro'], + 'cr2' => ['image/x-canon-cr2'], + 'crd' => ['application/x-mscardfile'], + 'crdownload' => ['application/x-partial-download'], + 'crl' => ['application/pkix-crl'], + 'crt' => ['application/x-x509-ca-cert'], + 'crw' => ['image/x-canon-crw'], + 'cryptonote' => ['application/vnd.rig.cryptonote'], + 'cs' => ['text/x-csharp'], + 'csh' => ['application/x-csh'], + 'csml' => ['chemical/x-csml'], + 'csp' => ['application/vnd.commonspace'], + 'css' => ['text/css'], + 'cst' => ['application/x-director'], + 'csv' => ['text/csv', 'text/x-comma-separated-values', 'text/x-csv'], + 'csvs' => ['text/csv-schema'], + 'cu' => ['application/cu-seeme'], + 'cue' => ['application/x-cue'], + 'cur' => ['image/x-win-bitmap'], + 'curl' => ['text/vnd.curl'], + 'cww' => ['application/prs.cww'], + 'cxt' => ['application/x-director'], + 'cxx' => ['text/x-c', 'text/x-c++src'], + 'd' => ['text/x-dsrc'], + 'dae' => ['model/vnd.collada+xml'], + 'daf' => ['application/vnd.mobius.daf'], + 'dar' => ['application/x-dar'], + 'dart' => ['application/vnd.dart'], + 'dataless' => ['application/vnd.fdsn.seed'], + 'davmount' => ['application/davmount+xml'], + 'dbf' => ['application/dbase', 'application/dbf', 'application/x-dbase', 'application/x-dbf'], + 'dbk' => ['application/docbook+xml', 'application/vnd.oasis.docbook+xml', 'application/x-docbook+xml'], + 'dc' => ['application/x-dc-rom'], + 'dcl' => ['text/x-dcl'], + 'dcm' => ['application/dicom'], + 'dcr' => ['application/x-director', 'image/x-kodak-dcr'], + 'dcurl' => ['text/vnd.curl.dcurl'], + 'dd2' => ['application/vnd.oma.dd2+xml'], + 'ddd' => ['application/vnd.fujixerox.ddd'], + 'dds' => ['image/x-dds'], + 'deb' => ['application/vnd.debian.binary-package', 'application/x-deb', 'application/x-debian-package'], + 'def' => ['text/plain'], + 'deploy' => ['application/octet-stream'], + 'der' => ['application/x-x509-ca-cert'], + 'desktop' => ['application/x-desktop', 'application/x-gnome-app-info'], + 'device' => ['text/x-systemd-unit'], + 'dfac' => ['application/vnd.dreamfactory'], + 'dgc' => ['application/x-dgc-compressed'], + 'di' => ['text/x-dsrc'], + 'dia' => ['application/x-dia-diagram'], + 'dib' => ['image/bmp', 'image/x-bmp', 'image/x-ms-bmp'], + 'dic' => ['text/x-c'], + 'diff' => ['text/x-diff', 'text/x-patch'], + 'dir' => ['application/x-director'], + 'dis' => ['application/vnd.mobius.dis'], + 'dist' => ['application/octet-stream'], + 'distz' => ['application/octet-stream'], + 'divx' => ['video/avi', 'video/divx', 'video/msvideo', 'video/vnd.divx', 'video/x-avi', 'video/x-msvideo'], + 'djv' => ['image/vnd.djvu', 'image/vnd.djvu+multipage', 'image/x-djvu', 'image/x.djvu'], + 'djvu' => ['image/vnd.djvu', 'image/vnd.djvu+multipage', 'image/x-djvu', 'image/x.djvu'], + 'dll' => ['application/x-msdownload'], + 'dmg' => ['application/x-apple-diskimage'], + 'dmp' => ['application/pcap', 'application/vnd.tcpdump.pcap', 'application/x-pcap'], + 'dms' => ['application/octet-stream'], + 'dna' => ['application/vnd.dna'], + 'dng' => ['image/x-adobe-dng'], + 'doc' => ['application/msword', 'application/vnd.ms-word', 'application/x-msword', 'zz-application/zz-winassoc-doc'], + 'docbook' => ['application/docbook+xml', 'application/vnd.oasis.docbook+xml', 'application/x-docbook+xml'], + 'docm' => ['application/vnd.ms-word.document.macroenabled.12'], + 'docx' => ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'], + 'dot' => ['application/msword', 'application/msword-template', 'text/vnd.graphviz'], + 'dotm' => ['application/vnd.ms-word.template.macroenabled.12'], + 'dotx' => ['application/vnd.openxmlformats-officedocument.wordprocessingml.template'], + 'dp' => ['application/vnd.osgi.dp'], + 'dpg' => ['application/vnd.dpgraph'], + 'dra' => ['audio/vnd.dra'], + 'dsc' => ['text/prs.lines.tag'], + 'dsl' => ['text/x-dsl'], + 'dssc' => ['application/dssc+der'], + 'dtb' => ['application/x-dtbook+xml'], + 'dtd' => ['application/xml-dtd', 'text/x-dtd'], + 'dts' => ['audio/vnd.dts', 'audio/x-dts'], + 'dtshd' => ['audio/vnd.dts.hd', 'audio/x-dtshd'], + 'dtx' => ['application/x-tex', 'text/x-tex'], + 'dump' => ['application/octet-stream'], + 'dv' => ['video/dv'], + 'dvb' => ['video/vnd.dvb.file'], + 'dvi' => ['application/x-dvi'], + 'dvi.bz2' => ['application/x-bzdvi'], + 'dvi.gz' => ['application/x-gzdvi'], + 'dwf' => ['model/vnd.dwf'], + 'dwg' => ['image/vnd.dwg'], + 'dxf' => ['image/vnd.dxf'], + 'dxp' => ['application/vnd.spotfire.dxp'], + 'dxr' => ['application/x-director'], + 'e' => ['text/x-eiffel'], + 'ecelp4800' => ['audio/vnd.nuera.ecelp4800'], + 'ecelp7470' => ['audio/vnd.nuera.ecelp7470'], + 'ecelp9600' => ['audio/vnd.nuera.ecelp9600'], + 'ecma' => ['application/ecmascript'], + 'edm' => ['application/vnd.novadigm.edm'], + 'edx' => ['application/vnd.novadigm.edx'], + 'efif' => ['application/vnd.picsel'], + 'egon' => ['application/x-egon'], + 'ei6' => ['application/vnd.pg.osasli'], + 'eif' => ['text/x-eiffel'], + 'el' => ['text/x-emacs-lisp'], + 'elc' => ['application/octet-stream'], + 'emf' => ['application/emf', 'application/x-emf', 'application/x-msmetafile', 'image/emf', 'image/x-emf'], + 'eml' => ['message/rfc822'], + 'emma' => ['application/emma+xml'], + 'emp' => ['application/vnd.emusic-emusic_package'], + 'emz' => ['application/x-msmetafile'], + 'ent' => ['application/xml-external-parsed-entity', 'text/xml-external-parsed-entity'], + 'eol' => ['audio/vnd.digital-winds'], + 'eot' => ['application/vnd.ms-fontobject'], + 'eps' => ['application/postscript', 'image/x-eps'], + 'eps.bz2' => ['image/x-bzeps'], + 'eps.gz' => ['image/x-gzeps'], + 'epsf' => ['image/x-eps'], + 'epsf.bz2' => ['image/x-bzeps'], + 'epsf.gz' => ['image/x-gzeps'], + 'epsi' => ['image/x-eps'], + 'epsi.bz2' => ['image/x-bzeps'], + 'epsi.gz' => ['image/x-gzeps'], + 'epub' => ['application/epub+zip'], + 'erl' => ['text/x-erlang'], + 'es' => ['application/ecmascript', 'text/ecmascript'], + 'es3' => ['application/vnd.eszigno3+xml'], + 'esa' => ['application/vnd.osgi.subsystem'], + 'esf' => ['application/vnd.epson.esf'], + 'et3' => ['application/vnd.eszigno3+xml'], + 'etheme' => ['application/x-e-theme'], + 'etx' => ['text/x-setext'], + 'eva' => ['application/x-eva'], + 'evy' => ['application/x-envoy'], + 'exe' => ['application/x-ms-dos-executable', 'application/x-msdownload'], + 'exi' => ['application/exi'], + 'exr' => ['image/x-exr'], + 'ext' => ['application/vnd.novadigm.ext'], + 'ez' => ['application/andrew-inset'], + 'ez2' => ['application/vnd.ezpix-album'], + 'ez3' => ['application/vnd.ezpix-package'], + 'f' => ['text/x-fortran'], + 'f4a' => ['audio/m4a', 'audio/mp4', 'audio/x-m4a'], + 'f4b' => ['audio/x-m4b'], + 'f4v' => ['video/mp4', 'video/mp4v-es', 'video/x-f4v', 'video/x-m4v'], + 'f77' => ['text/x-fortran'], + 'f90' => ['text/x-fortran'], + 'f95' => ['text/x-fortran'], + 'fb2' => ['application/x-fictionbook', 'application/x-fictionbook+xml'], + 'fb2.zip' => ['application/x-zip-compressed-fb2'], + 'fbs' => ['image/vnd.fastbidsheet'], + 'fcdt' => ['application/vnd.adobe.formscentral.fcdt'], + 'fcs' => ['application/vnd.isac.fcs'], + 'fd' => ['application/x-fd-file', 'application/x-raw-floppy-disk-image'], + 'fdf' => ['application/vnd.fdf'], + 'fds' => ['application/x-fds-disk'], + 'fe_launch' => ['application/vnd.denovo.fcselayout-link'], + 'feature' => ['text/x-gherkin'], + 'fg5' => ['application/vnd.fujitsu.oasysgp'], + 'fgd' => ['application/x-director'], + 'fh' => ['image/x-freehand'], + 'fh4' => ['image/x-freehand'], + 'fh5' => ['image/x-freehand'], + 'fh7' => ['image/x-freehand'], + 'fhc' => ['image/x-freehand'], + 'fig' => ['application/x-xfig', 'image/x-xfig'], + 'fits' => ['image/fits', 'image/x-fits'], + 'fl' => ['application/x-fluid'], + 'flac' => ['audio/flac', 'audio/x-flac'], + 'flatpak' => ['application/vnd.flatpak', 'application/vnd.xdgapp'], + 'flatpakref' => ['application/vnd.flatpak.ref'], + 'flatpakrepo' => ['application/vnd.flatpak.repo'], + 'flc' => ['video/fli', 'video/x-fli', 'video/x-flic'], + 'fli' => ['video/fli', 'video/x-fli', 'video/x-flic'], + 'flo' => ['application/vnd.micrografx.flo'], + 'flv' => ['video/x-flv', 'application/x-flash-video', 'flv-application/octet-stream', 'video/flv'], + 'flw' => ['application/vnd.kde.kivio', 'application/x-kivio'], + 'flx' => ['text/vnd.fmi.flexstor'], + 'fly' => ['text/vnd.fly'], + 'fm' => ['application/vnd.framemaker', 'application/x-frame'], + 'fnc' => ['application/vnd.frogans.fnc'], + 'fo' => ['text/x-xslfo'], + 'fodg' => ['application/vnd.oasis.opendocument.graphics-flat-xml'], + 'fodp' => ['application/vnd.oasis.opendocument.presentation-flat-xml'], + 'fods' => ['application/vnd.oasis.opendocument.spreadsheet-flat-xml'], + 'fodt' => ['application/vnd.oasis.opendocument.text-flat-xml'], + 'for' => ['text/x-fortran'], + 'fpx' => ['image/vnd.fpx'], + 'frame' => ['application/vnd.framemaker'], + 'fsc' => ['application/vnd.fsc.weblaunch'], + 'fst' => ['image/vnd.fst'], + 'ftc' => ['application/vnd.fluxtime.clip'], + 'fti' => ['application/vnd.anser-web-funds-transfer-initiation'], + 'fvt' => ['video/vnd.fvt'], + 'fxm' => ['video/x-javafx'], + 'fxp' => ['application/vnd.adobe.fxp'], + 'fxpl' => ['application/vnd.adobe.fxp'], + 'fzs' => ['application/vnd.fuzzysheet'], + 'g2w' => ['application/vnd.geoplan'], + 'g3' => ['image/fax-g3', 'image/g3fax'], + 'g3w' => ['application/vnd.geospace'], + 'gac' => ['application/vnd.groove-account'], + 'gam' => ['application/x-tads'], + 'gb' => ['application/x-gameboy-rom'], + 'gba' => ['application/x-gba-rom'], + 'gbc' => ['application/x-gameboy-color-rom'], + 'gbr' => ['application/rpki-ghostbusters', 'image/x-gimp-gbr'], + 'gca' => ['application/x-gca-compressed'], + 'gcode' => ['text/x.gcode'], + 'gcrd' => ['text/directory', 'text/vcard', 'text/x-vcard'], + 'gdl' => ['model/vnd.gdl'], + 'ged' => ['application/x-gedcom', 'text/gedcom'], + 'gedcom' => ['application/x-gedcom', 'text/gedcom'], + 'gem' => ['application/x-gtar', 'application/x-tar'], + 'gen' => ['application/x-genesis-rom'], + 'geo' => ['application/vnd.dynageo'], + 'geo.json' => ['application/geo+json', 'application/vnd.geo+json'], + 'geojson' => ['application/geo+json', 'application/vnd.geo+json'], + 'gex' => ['application/vnd.geometry-explorer'], + 'gf' => ['application/x-tex-gf'], + 'gg' => ['application/x-gamegear-rom'], + 'ggb' => ['application/vnd.geogebra.file'], + 'ggt' => ['application/vnd.geogebra.tool'], + 'ghf' => ['application/vnd.groove-help'], + 'gif' => ['image/gif'], + 'gih' => ['image/x-gimp-gih'], + 'gim' => ['application/vnd.groove-identity-message'], + 'glade' => ['application/x-glade'], + 'gml' => ['application/gml+xml'], + 'gmo' => ['application/x-gettext-translation'], + 'gmx' => ['application/vnd.gmx'], + 'gnc' => ['application/x-gnucash'], + 'gnd' => ['application/gnunet-directory'], + 'gnucash' => ['application/x-gnucash'], + 'gnumeric' => ['application/x-gnumeric'], + 'gnuplot' => ['application/x-gnuplot'], + 'go' => ['text/x-go'], + 'gp' => ['application/x-gnuplot'], + 'gpg' => ['application/pgp', 'application/pgp-encrypted', 'application/pgp-keys', 'application/pgp-signature'], + 'gph' => ['application/vnd.flographit'], + 'gplt' => ['application/x-gnuplot'], + 'gpx' => ['application/gpx', 'application/gpx+xml', 'application/x-gpx', 'application/x-gpx+xml'], + 'gqf' => ['application/vnd.grafeq'], + 'gqs' => ['application/vnd.grafeq'], + 'gra' => ['application/x-graphite'], + 'gram' => ['application/srgs'], + 'gramps' => ['application/x-gramps-xml'], + 'gre' => ['application/vnd.geometry-explorer'], + 'grv' => ['application/vnd.groove-injector'], + 'grxml' => ['application/srgs+xml'], + 'gs' => ['text/x-genie'], + 'gsf' => ['application/x-font-ghostscript', 'application/x-font-type1'], + 'gsm' => ['audio/x-gsm'], + 'gtar' => ['application/x-gtar', 'application/x-tar'], + 'gtm' => ['application/vnd.groove-tool-message'], + 'gtw' => ['model/vnd.gtw'], + 'gv' => ['text/vnd.graphviz'], + 'gvp' => ['text/google-video-pointer', 'text/x-google-video-pointer'], + 'gxf' => ['application/gxf'], + 'gxt' => ['application/vnd.geonext'], + 'gz' => ['application/x-gzip', 'application/gzip'], + 'h' => ['text/x-c', 'text/x-chdr'], + 'h++' => ['text/x-c++hdr'], + 'h261' => ['video/h261'], + 'h263' => ['video/h263'], + 'h264' => ['video/h264'], + 'h4' => ['application/x-hdf'], + 'h5' => ['application/x-hdf'], + 'hal' => ['application/vnd.hal+xml'], + 'hbci' => ['application/vnd.hbci'], + 'hdf' => ['application/x-hdf'], + 'hdf4' => ['application/x-hdf'], + 'hdf5' => ['application/x-hdf'], + 'heic' => ['image/heic', 'image/heic-sequence', 'image/heif', 'image/heif-sequence'], + 'heif' => ['image/heic', 'image/heic-sequence', 'image/heif', 'image/heif-sequence'], + 'hfe' => ['application/x-hfe-file', 'application/x-hfe-floppy-image'], + 'hh' => ['text/x-c', 'text/x-c++hdr'], + 'hlp' => ['application/winhlp', 'zz-application/zz-winassoc-hlp'], + 'hp' => ['text/x-c++hdr'], + 'hpgl' => ['application/vnd.hp-hpgl'], + 'hpid' => ['application/vnd.hp-hpid'], + 'hpp' => ['text/x-c++hdr'], + 'hps' => ['application/vnd.hp-hps'], + 'hqx' => ['application/stuffit', 'application/mac-binhex40'], + 'hs' => ['text/x-haskell'], + 'htke' => ['application/vnd.kenameaapp'], + 'htm' => ['text/html'], + 'html' => ['text/html'], + 'hvd' => ['application/vnd.yamaha.hv-dic'], + 'hvp' => ['application/vnd.yamaha.hv-voice'], + 'hvs' => ['application/vnd.yamaha.hv-script'], + 'hwp' => ['application/vnd.haansoft-hwp', 'application/x-hwp'], + 'hwt' => ['application/vnd.haansoft-hwt', 'application/x-hwt'], + 'hxx' => ['text/x-c++hdr'], + 'i2g' => ['application/vnd.intergeo'], + 'ica' => ['application/x-ica'], + 'icb' => ['image/x-icb', 'image/x-tga'], + 'icc' => ['application/vnd.iccprofile'], + 'ice' => ['x-conference/x-cooltalk'], + 'icm' => ['application/vnd.iccprofile'], + 'icns' => ['image/x-icns'], + 'ico' => ['application/ico', 'image/ico', 'image/icon', 'image/vnd.microsoft.icon', 'image/x-ico', 'image/x-icon', 'text/ico'], + 'ics' => ['application/ics', 'text/calendar', 'text/x-vcalendar'], + 'idl' => ['text/x-idl'], + 'ief' => ['image/ief'], + 'ifb' => ['text/calendar'], + 'iff' => ['image/x-iff', 'image/x-ilbm'], + 'ifm' => ['application/vnd.shana.informed.formdata'], + 'iges' => ['model/iges'], + 'igl' => ['application/vnd.igloader'], + 'igm' => ['application/vnd.insors.igm'], + 'igs' => ['model/iges'], + 'igx' => ['application/vnd.micrografx.igx'], + 'iif' => ['application/vnd.shana.informed.interchange'], + 'ilbm' => ['image/x-iff', 'image/x-ilbm'], + 'ime' => ['audio/imelody', 'audio/x-imelody', 'text/x-imelody'], + 'img' => ['application/x-raw-disk-image'], + 'img.xz' => ['application/x-raw-disk-image-xz-compressed'], + 'imp' => ['application/vnd.accpac.simply.imp'], + 'ims' => ['application/vnd.ms-ims'], + 'imy' => ['audio/imelody', 'audio/x-imelody', 'text/x-imelody'], + 'in' => ['text/plain'], + 'ink' => ['application/inkml+xml'], + 'inkml' => ['application/inkml+xml'], + 'ins' => ['application/x-tex', 'text/x-tex'], + 'install' => ['application/x-install-instructions'], + 'iota' => ['application/vnd.astraea-software.iota'], + 'ipfix' => ['application/ipfix'], + 'ipk' => ['application/vnd.shana.informed.package'], + 'iptables' => ['text/x-iptables'], + 'ipynb' => ['application/x-ipynb+json'], + 'irm' => ['application/vnd.ibm.rights-management'], + 'irp' => ['application/vnd.irepository.package+xml'], + 'iso' => ['application/x-cd-image', 'application/x-gamecube-iso-image', 'application/x-gamecube-rom', 'application/x-iso9660-image', 'application/x-saturn-rom', 'application/x-sega-cd-rom', 'application/x-wbfs', 'application/x-wia', 'application/x-wii-iso-image', 'application/x-wii-rom'], + 'iso9660' => ['application/x-cd-image', 'application/x-iso9660-image'], + 'it' => ['audio/x-it'], + 'it87' => ['application/x-it87'], + 'itp' => ['application/vnd.shana.informed.formtemplate'], + 'ivp' => ['application/vnd.immervision-ivp'], + 'ivu' => ['application/vnd.immervision-ivu'], + 'j2c' => ['image/x-jp2-codestream'], + 'j2k' => ['image/x-jp2-codestream'], + 'jad' => ['text/vnd.sun.j2me.app-descriptor'], + 'jam' => ['application/vnd.jam'], + 'jar' => ['application/x-java-archive', 'application/java-archive', 'application/x-jar'], + 'java' => ['text/x-java', 'text/x-java-source'], + 'jceks' => ['application/x-java-jce-keystore'], + 'jisp' => ['application/vnd.jisp'], + 'jks' => ['application/x-java-keystore'], + 'jlt' => ['application/vnd.hp-jlyt'], + 'jng' => ['image/x-jng'], + 'jnlp' => ['application/x-java-jnlp-file'], + 'joda' => ['application/vnd.joost.joda-archive'], + 'jp2' => ['image/jp2', 'image/jpeg2000', 'image/jpeg2000-image', 'image/x-jpeg2000-image'], + 'jpc' => ['image/x-jp2-codestream'], + 'jpe' => ['image/jpeg', 'image/pjpeg'], + 'jpeg' => ['image/jpeg', 'image/pjpeg'], + 'jpf' => ['image/jpx'], + 'jpg' => ['image/jpeg', 'image/pjpeg'], + 'jpg2' => ['image/jp2', 'image/jpeg2000', 'image/jpeg2000-image', 'image/x-jpeg2000-image'], + 'jpgm' => ['image/jpm', 'video/jpm'], + 'jpgv' => ['video/jpeg'], + 'jpm' => ['image/jpm', 'video/jpm'], + 'jpr' => ['application/x-jbuilder-project'], + 'jpx' => ['application/x-jbuilder-project', 'image/jpx'], + 'jrd' => ['application/jrd+json'], + 'js' => ['text/javascript', 'application/javascript', 'application/x-javascript'], + 'jsm' => ['application/javascript', 'application/x-javascript', 'text/javascript'], + 'json' => ['application/json'], + 'json-patch' => ['application/json-patch+json'], + 'jsonld' => ['application/ld+json'], + 'jsonml' => ['application/jsonml+json'], + 'k25' => ['image/x-kodak-k25'], + 'k7' => ['application/x-thomson-cassette'], + 'kar' => ['audio/midi', 'audio/x-midi'], + 'karbon' => ['application/vnd.kde.karbon', 'application/x-karbon'], + 'kdc' => ['image/x-kodak-kdc'], + 'kdelnk' => ['application/x-desktop', 'application/x-gnome-app-info'], + 'kexi' => ['application/x-kexiproject-sqlite', 'application/x-kexiproject-sqlite2', 'application/x-kexiproject-sqlite3', 'application/x-vnd.kde.kexi'], + 'kexic' => ['application/x-kexi-connectiondata'], + 'kexis' => ['application/x-kexiproject-shortcut'], + 'key' => ['application/vnd.apple.keynote', 'application/x-iwork-keynote-sffkey'], + 'kfo' => ['application/vnd.kde.kformula', 'application/x-kformula'], + 'kia' => ['application/vnd.kidspiration'], + 'kil' => ['application/x-killustrator'], + 'kino' => ['application/smil', 'application/smil+xml'], + 'kml' => ['application/vnd.google-earth.kml+xml'], + 'kmz' => ['application/vnd.google-earth.kmz'], + 'kne' => ['application/vnd.kinar'], + 'knp' => ['application/vnd.kinar'], + 'kon' => ['application/vnd.kde.kontour', 'application/x-kontour'], + 'kpm' => ['application/x-kpovmodeler'], + 'kpr' => ['application/vnd.kde.kpresenter', 'application/x-kpresenter'], + 'kpt' => ['application/vnd.kde.kpresenter', 'application/x-kpresenter'], + 'kpxx' => ['application/vnd.ds-keypoint'], + 'kra' => ['application/x-krita'], + 'ks' => ['application/x-java-keystore'], + 'ksp' => ['application/vnd.kde.kspread', 'application/x-kspread'], + 'ktr' => ['application/vnd.kahootz'], + 'ktx' => ['image/ktx'], + 'ktz' => ['application/vnd.kahootz'], + 'kud' => ['application/x-kugar'], + 'kwd' => ['application/vnd.kde.kword', 'application/x-kword'], + 'kwt' => ['application/vnd.kde.kword', 'application/x-kword'], + 'la' => ['application/x-shared-library-la'], + 'lasxml' => ['application/vnd.las.las+xml'], + 'latex' => ['application/x-latex', 'application/x-tex', 'text/x-tex'], + 'lbd' => ['application/vnd.llamagraphics.life-balance.desktop'], + 'lbe' => ['application/vnd.llamagraphics.life-balance.exchange+xml'], + 'lbm' => ['image/x-iff', 'image/x-ilbm'], + 'ldif' => ['text/x-ldif'], + 'les' => ['application/vnd.hhe.lesson-player'], + 'lha' => ['application/x-lha', 'application/x-lzh-compressed'], + 'lhs' => ['text/x-literate-haskell'], + 'lhz' => ['application/x-lhz'], + 'link66' => ['application/vnd.route66.link66+xml'], + 'list' => ['text/plain'], + 'list3820' => ['application/vnd.ibm.modcap'], + 'listafp' => ['application/vnd.ibm.modcap'], + 'lnk' => ['application/x-ms-shortcut'], + 'lnx' => ['application/x-atari-lynx-rom'], + 'loas' => ['audio/usac'], + 'log' => ['text/plain', 'text/x-log'], + 'lostxml' => ['application/lost+xml'], + 'lrf' => ['application/octet-stream'], + 'lrm' => ['application/vnd.ms-lrm'], + 'lrv' => ['video/mp4', 'video/mp4v-es', 'video/x-m4v'], + 'lrz' => ['application/x-lrzip'], + 'ltf' => ['application/vnd.frogans.ltf'], + 'ltx' => ['application/x-tex', 'text/x-tex'], + 'lua' => ['text/x-lua'], + 'lvp' => ['audio/vnd.lucent.voice'], + 'lwo' => ['image/x-lwo'], + 'lwob' => ['image/x-lwo'], + 'lwp' => ['application/vnd.lotus-wordpro'], + 'lws' => ['image/x-lws'], + 'ly' => ['text/x-lilypond'], + 'lyx' => ['application/x-lyx', 'text/x-lyx'], + 'lz' => ['application/x-lzip'], + 'lz4' => ['application/x-lz4'], + 'lzh' => ['application/x-lha', 'application/x-lzh-compressed'], + 'lzma' => ['application/x-lzma'], + 'lzo' => ['application/x-lzop'], + 'm' => ['text/x-matlab', 'text/x-objcsrc', 'text/x-octave'], + 'm13' => ['application/x-msmediaview'], + 'm14' => ['application/x-msmediaview'], + 'm15' => ['audio/x-mod'], + 'm1u' => ['video/vnd.mpegurl', 'video/x-mpegurl'], + 'm1v' => ['video/mpeg'], + 'm21' => ['application/mp21'], + 'm2a' => ['audio/mpeg'], + 'm2t' => ['video/mp2t'], + 'm2ts' => ['video/mp2t'], + 'm2v' => ['video/mpeg'], + 'm3a' => ['audio/mpeg'], + 'm3u' => ['audio/x-mpegurl', 'application/m3u', 'application/vnd.apple.mpegurl', 'audio/m3u', 'audio/mpegurl', 'audio/x-m3u', 'audio/x-mp3-playlist'], + 'm3u8' => ['application/m3u', 'application/vnd.apple.mpegurl', 'audio/m3u', 'audio/mpegurl', 'audio/x-m3u', 'audio/x-mp3-playlist', 'audio/x-mpegurl'], + 'm4' => ['application/x-m4'], + 'm4a' => ['audio/mp4', 'audio/m4a', 'audio/x-m4a'], + 'm4b' => ['audio/x-m4b'], + 'm4r' => ['audio/x-m4r'], + 'm4u' => ['video/vnd.mpegurl', 'video/x-mpegurl'], + 'm4v' => ['video/mp4', 'video/mp4v-es', 'video/x-m4v'], + 'm7' => ['application/x-thomson-cartridge-memo7'], + 'ma' => ['application/mathematica'], + 'mab' => ['application/x-markaby'], + 'mads' => ['application/mads+xml'], + 'mag' => ['application/vnd.ecowin.chart'], + 'mak' => ['text/x-makefile'], + 'maker' => ['application/vnd.framemaker'], + 'man' => ['application/x-troff-man', 'text/troff'], + 'manifest' => ['text/cache-manifest'], + 'mar' => ['application/octet-stream'], + 'markdown' => ['text/markdown', 'text/x-markdown'], + 'mathml' => ['application/mathml+xml'], + 'mb' => ['application/mathematica'], + 'mbk' => ['application/vnd.mobius.mbk'], + 'mbox' => ['application/mbox'], + 'mc1' => ['application/vnd.medcalcdata'], + 'mcd' => ['application/vnd.mcd'], + 'mcurl' => ['text/vnd.curl.mcurl'], + 'md' => ['text/markdown', 'text/x-markdown'], + 'mdb' => ['application/x-msaccess', 'application/mdb', 'application/msaccess', 'application/vnd.ms-access', 'application/vnd.msaccess', 'application/x-mdb', 'zz-application/zz-winassoc-mdb'], + 'mdi' => ['image/vnd.ms-modi'], + 'mdx' => ['application/x-genesis-32x-rom'], + 'me' => ['text/troff', 'text/x-troff-me'], + 'med' => ['audio/x-mod'], + 'mesh' => ['model/mesh'], + 'meta4' => ['application/metalink4+xml'], + 'metalink' => ['application/metalink+xml'], + 'mets' => ['application/mets+xml'], + 'mfm' => ['application/vnd.mfmp'], + 'mft' => ['application/rpki-manifest'], + 'mgp' => ['application/vnd.osgeo.mapguide.package', 'application/x-magicpoint'], + 'mgz' => ['application/vnd.proteus.magazine'], + 'mht' => ['application/x-mimearchive'], + 'mhtml' => ['application/x-mimearchive'], + 'mid' => ['audio/midi', 'audio/x-midi'], + 'midi' => ['audio/midi', 'audio/x-midi'], + 'mie' => ['application/x-mie'], + 'mif' => ['application/vnd.mif', 'application/x-mif'], + 'mime' => ['message/rfc822'], + 'minipsf' => ['audio/x-minipsf'], + 'mj2' => ['video/mj2'], + 'mjp2' => ['video/mj2'], + 'mjpeg' => ['video/x-mjpeg'], + 'mjpg' => ['video/x-mjpeg'], + 'mjs' => ['application/javascript', 'application/x-javascript', 'text/javascript'], + 'mk' => ['text/x-makefile'], + 'mk3d' => ['video/x-matroska', 'video/x-matroska-3d'], + 'mka' => ['audio/x-matroska'], + 'mkd' => ['text/markdown', 'text/x-markdown'], + 'mks' => ['video/x-matroska'], + 'mkv' => ['video/x-matroska'], + 'ml' => ['text/x-ocaml'], + 'mli' => ['text/x-ocaml'], + 'mlp' => ['application/vnd.dolby.mlp'], + 'mm' => ['text/x-troff-mm'], + 'mmd' => ['application/vnd.chipnuts.karaoke-mmd'], + 'mmf' => ['application/vnd.smaf', 'application/x-smaf'], + 'mml' => ['application/mathml+xml', 'text/mathml'], + 'mmr' => ['image/vnd.fujixerox.edmics-mmr'], + 'mng' => ['video/x-mng'], + 'mny' => ['application/x-msmoney'], + 'mo' => ['application/x-gettext-translation', 'text/x-modelica'], + 'mo3' => ['audio/x-mo3'], + 'mobi' => ['application/x-mobipocket-ebook'], + 'moc' => ['text/x-moc'], + 'mod' => ['audio/x-mod'], + 'mods' => ['application/mods+xml'], + 'mof' => ['text/x-mof'], + 'moov' => ['video/quicktime'], + 'mount' => ['text/x-systemd-unit'], + 'mov' => ['video/quicktime'], + 'movie' => ['video/x-sgi-movie'], + 'mp+' => ['audio/x-musepack'], + 'mp2' => ['audio/mp2', 'audio/mpeg', 'audio/x-mp2', 'video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2'], + 'mp21' => ['application/mp21'], + 'mp2a' => ['audio/mpeg'], + 'mp3' => ['audio/mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/x-mpeg', 'audio/x-mpg'], + 'mp4' => ['video/mp4', 'video/mp4v-es', 'video/x-m4v'], + 'mp4a' => ['audio/mp4'], + 'mp4s' => ['application/mp4'], + 'mp4v' => ['video/mp4'], + 'mpc' => ['application/vnd.mophun.certificate', 'audio/x-musepack'], + 'mpe' => ['video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2'], + 'mpeg' => ['video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2'], + 'mpg' => ['video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2'], + 'mpg4' => ['video/mp4'], + 'mpga' => ['audio/mp3', 'audio/mpeg', 'audio/x-mp3', 'audio/x-mpeg', 'audio/x-mpg'], + 'mpkg' => ['application/vnd.apple.installer+xml'], + 'mpl' => ['video/mp2t'], + 'mpls' => ['video/mp2t'], + 'mpm' => ['application/vnd.blueice.multipass'], + 'mpn' => ['application/vnd.mophun.application'], + 'mpp' => ['application/vnd.ms-project', 'audio/x-musepack'], + 'mpt' => ['application/vnd.ms-project'], + 'mpy' => ['application/vnd.ibm.minipay'], + 'mqy' => ['application/vnd.mobius.mqy'], + 'mrc' => ['application/marc'], + 'mrcx' => ['application/marcxml+xml'], + 'mrl' => ['text/x-mrml'], + 'mrml' => ['text/x-mrml'], + 'mrw' => ['image/x-minolta-mrw'], + 'ms' => ['text/troff', 'text/x-troff-ms'], + 'mscml' => ['application/mediaservercontrol+xml'], + 'mseed' => ['application/vnd.fdsn.mseed'], + 'mseq' => ['application/vnd.mseq'], + 'msf' => ['application/vnd.epson.msf'], + 'msg' => ['application/vnd.ms-outlook'], + 'msh' => ['model/mesh'], + 'msi' => ['application/x-msdownload', 'application/x-msi'], + 'msl' => ['application/vnd.mobius.msl'], + 'msod' => ['image/x-msod'], + 'msty' => ['application/vnd.muvee.style'], + 'msx' => ['application/x-msx-rom'], + 'mtm' => ['audio/x-mod'], + 'mts' => ['model/vnd.mts', 'video/mp2t'], + 'mup' => ['text/x-mup'], + 'mus' => ['application/vnd.musician'], + 'musicxml' => ['application/vnd.recordare.musicxml+xml'], + 'mvb' => ['application/x-msmediaview'], + 'mwf' => ['application/vnd.mfer'], + 'mxf' => ['application/mxf'], + 'mxl' => ['application/vnd.recordare.musicxml'], + 'mxml' => ['application/xv+xml'], + 'mxs' => ['application/vnd.triscape.mxs'], + 'mxu' => ['video/vnd.mpegurl', 'video/x-mpegurl'], + 'n-gage' => ['application/vnd.nokia.n-gage.symbian.install'], + 'n3' => ['text/n3'], + 'n64' => ['application/x-n64-rom'], + 'nb' => ['application/mathematica', 'application/x-mathematica'], + 'nbp' => ['application/vnd.wolfram.player'], + 'nc' => ['application/x-netcdf'], + 'ncx' => ['application/x-dtbncx+xml'], + 'nds' => ['application/x-nintendo-ds-rom'], + 'nef' => ['image/x-nikon-nef'], + 'nes' => ['application/x-nes-rom'], + 'nez' => ['application/x-nes-rom'], + 'nfo' => ['text/x-nfo'], + 'ngc' => ['application/x-neo-geo-pocket-color-rom'], + 'ngdat' => ['application/vnd.nokia.n-gage.data'], + 'ngp' => ['application/x-neo-geo-pocket-rom'], + 'nitf' => ['application/vnd.nitf'], + 'nlu' => ['application/vnd.neurolanguage.nlu'], + 'nml' => ['application/vnd.enliven'], + 'nnd' => ['application/vnd.noblenet-directory'], + 'nns' => ['application/vnd.noblenet-sealer'], + 'nnw' => ['application/vnd.noblenet-web'], + 'not' => ['text/x-mup'], + 'npx' => ['image/vnd.net-fpx'], + 'nsc' => ['application/x-conference', 'application/x-netshow-channel'], + 'nsf' => ['application/vnd.lotus-notes'], + 'nsv' => ['video/x-nsv'], + 'ntf' => ['application/vnd.nitf'], + 'nzb' => ['application/x-nzb'], + 'o' => ['application/x-object'], + 'oa2' => ['application/vnd.fujitsu.oasys2'], + 'oa3' => ['application/vnd.fujitsu.oasys3'], + 'oas' => ['application/vnd.fujitsu.oasys'], + 'obd' => ['application/x-msbinder'], + 'obj' => ['application/x-tgif'], + 'ocl' => ['text/x-ocl'], + 'oda' => ['application/oda'], + 'odb' => ['application/vnd.oasis.opendocument.database', 'application/vnd.sun.xml.base'], + 'odc' => ['application/vnd.oasis.opendocument.chart'], + 'odf' => ['application/vnd.oasis.opendocument.formula'], + 'odft' => ['application/vnd.oasis.opendocument.formula-template'], + 'odg' => ['application/vnd.oasis.opendocument.graphics'], + 'odi' => ['application/vnd.oasis.opendocument.image'], + 'odm' => ['application/vnd.oasis.opendocument.text-master'], + 'odp' => ['application/vnd.oasis.opendocument.presentation'], + 'ods' => ['application/vnd.oasis.opendocument.spreadsheet'], + 'odt' => ['application/vnd.oasis.opendocument.text'], + 'oga' => ['audio/ogg', 'audio/vorbis', 'audio/x-flac+ogg', 'audio/x-ogg', 'audio/x-oggflac', 'audio/x-speex+ogg', 'audio/x-vorbis', 'audio/x-vorbis+ogg'], + 'ogg' => ['audio/ogg', 'audio/vorbis', 'audio/x-flac+ogg', 'audio/x-ogg', 'audio/x-oggflac', 'audio/x-speex+ogg', 'audio/x-vorbis', 'audio/x-vorbis+ogg', 'video/ogg', 'video/x-ogg', 'video/x-theora', 'video/x-theora+ogg'], + 'ogm' => ['video/x-ogm', 'video/x-ogm+ogg'], + 'ogv' => ['video/ogg', 'video/x-ogg'], + 'ogx' => ['application/ogg', 'application/x-ogg'], + 'old' => ['application/x-trash'], + 'oleo' => ['application/x-oleo'], + 'omdoc' => ['application/omdoc+xml'], + 'onepkg' => ['application/onenote'], + 'onetmp' => ['application/onenote'], + 'onetoc' => ['application/onenote'], + 'onetoc2' => ['application/onenote'], + 'ooc' => ['text/x-ooc'], + 'opf' => ['application/oebps-package+xml'], + 'opml' => ['text/x-opml', 'text/x-opml+xml'], + 'oprc' => ['application/vnd.palm', 'application/x-palm-database'], + 'opus' => ['audio/ogg', 'audio/x-ogg', 'audio/x-opus+ogg'], + 'ora' => ['image/openraster'], + 'orf' => ['image/x-olympus-orf'], + 'org' => ['application/vnd.lotus-organizer'], + 'osf' => ['application/vnd.yamaha.openscoreformat'], + 'osfpvg' => ['application/vnd.yamaha.openscoreformat.osfpvg+xml'], + 'otc' => ['application/vnd.oasis.opendocument.chart-template'], + 'otf' => ['application/vnd.oasis.opendocument.formula-template', 'application/x-font-otf', 'font/otf'], + 'otg' => ['application/vnd.oasis.opendocument.graphics-template'], + 'oth' => ['application/vnd.oasis.opendocument.text-web'], + 'oti' => ['application/vnd.oasis.opendocument.image-template'], + 'otp' => ['application/vnd.oasis.opendocument.presentation-template'], + 'ots' => ['application/vnd.oasis.opendocument.spreadsheet-template'], + 'ott' => ['application/vnd.oasis.opendocument.text-template'], + 'owl' => ['application/rdf+xml', 'text/rdf'], + 'owx' => ['application/owl+xml'], + 'oxps' => ['application/oxps', 'application/vnd.ms-xpsdocument', 'application/xps'], + 'oxt' => ['application/vnd.openofficeorg.extension'], + 'p' => ['text/x-pascal'], + 'p10' => ['application/pkcs10'], + 'p12' => ['application/pkcs12', 'application/x-pkcs12'], + 'p65' => ['application/x-pagemaker'], + 'p7b' => ['application/x-pkcs7-certificates'], + 'p7c' => ['application/pkcs7-mime'], + 'p7m' => ['application/pkcs7-mime'], + 'p7r' => ['application/x-pkcs7-certreqresp'], + 'p7s' => ['application/pkcs7-signature'], + 'p8' => ['application/pkcs8'], + 'p8e' => ['application/pkcs8-encrypted'], + 'pack' => ['application/x-java-pack200'], + 'pak' => ['application/x-pak'], + 'par2' => ['application/x-par2'], + 'part' => ['application/x-partial-download'], + 'pas' => ['text/x-pascal'], + 'pat' => ['image/x-gimp-pat'], + 'patch' => ['text/x-diff', 'text/x-patch'], + 'path' => ['text/x-systemd-unit'], + 'paw' => ['application/vnd.pawaafile'], + 'pbd' => ['application/vnd.powerbuilder6'], + 'pbm' => ['image/x-portable-bitmap'], + 'pcap' => ['application/pcap', 'application/vnd.tcpdump.pcap', 'application/x-pcap'], + 'pcd' => ['image/x-photo-cd'], + 'pce' => ['application/x-pc-engine-rom'], + 'pcf' => ['application/x-cisco-vpn-settings', 'application/x-font-pcf'], + 'pcf.Z' => ['application/x-font-pcf'], + 'pcf.gz' => ['application/x-font-pcf'], + 'pcl' => ['application/vnd.hp-pcl'], + 'pclxl' => ['application/vnd.hp-pclxl'], + 'pct' => ['image/x-pict'], + 'pcurl' => ['application/vnd.curl.pcurl'], + 'pcx' => ['image/vnd.zbrush.pcx', 'image/x-pcx'], + 'pdb' => ['application/vnd.palm', 'application/x-aportisdoc', 'application/x-palm-database'], + 'pdc' => ['application/x-aportisdoc'], + 'pdf' => ['application/pdf', 'application/acrobat', 'application/nappdf', 'application/x-pdf', 'image/pdf'], + 'pdf.bz2' => ['application/x-bzpdf'], + 'pdf.gz' => ['application/x-gzpdf'], + 'pdf.lz' => ['application/x-lzpdf'], + 'pdf.xz' => ['application/x-xzpdf'], + 'pef' => ['image/x-pentax-pef'], + 'pem' => ['application/x-x509-ca-cert'], + 'perl' => ['application/x-perl', 'text/x-perl'], + 'pfa' => ['application/x-font-type1'], + 'pfb' => ['application/x-font-type1'], + 'pfm' => ['application/x-font-type1'], + 'pfr' => ['application/font-tdpfr'], + 'pfx' => ['application/pkcs12', 'application/x-pkcs12'], + 'pgm' => ['image/x-portable-graymap'], + 'pgn' => ['application/vnd.chess-pgn', 'application/x-chess-pgn'], + 'pgp' => ['application/pgp', 'application/pgp-encrypted', 'application/pgp-keys', 'application/pgp-signature'], + 'php' => ['application/x-php'], + 'php3' => ['application/x-php'], + 'php4' => ['application/x-php'], + 'php5' => ['application/x-php'], + 'phps' => ['application/x-php'], + 'pic' => ['image/x-pict'], + 'pict' => ['image/x-pict'], + 'pict1' => ['image/x-pict'], + 'pict2' => ['image/x-pict'], + 'pk' => ['application/x-tex-pk'], + 'pkg' => ['application/octet-stream', 'application/x-xar'], + 'pki' => ['application/pkixcmp'], + 'pkipath' => ['application/pkix-pkipath'], + 'pkr' => ['application/pgp-keys'], + 'pl' => ['application/x-perl', 'text/x-perl'], + 'pla' => ['audio/x-iriver-pla'], + 'plb' => ['application/vnd.3gpp.pic-bw-large'], + 'plc' => ['application/vnd.mobius.plc'], + 'plf' => ['application/vnd.pocketlearn'], + 'pln' => ['application/x-planperfect'], + 'pls' => ['application/pls', 'application/pls+xml', 'audio/scpls', 'audio/x-scpls'], + 'pm' => ['application/x-pagemaker', 'application/x-perl', 'text/x-perl'], + 'pm6' => ['application/x-pagemaker'], + 'pmd' => ['application/x-pagemaker'], + 'pml' => ['application/vnd.ctc-posml'], + 'png' => ['image/png'], + 'pnm' => ['image/x-portable-anymap'], + 'pntg' => ['image/x-macpaint'], + 'po' => ['application/x-gettext', 'text/x-gettext-translation', 'text/x-po'], + 'pod' => ['application/x-perl', 'text/x-perl'], + 'por' => ['application/x-spss-por'], + 'portpkg' => ['application/vnd.macports.portpkg'], + 'pot' => ['application/mspowerpoint', 'application/powerpoint', 'application/vnd.ms-powerpoint', 'application/x-mspowerpoint', 'text/x-gettext-translation-template', 'text/x-pot'], + 'potm' => ['application/vnd.ms-powerpoint.template.macroenabled.12'], + 'potx' => ['application/vnd.openxmlformats-officedocument.presentationml.template'], + 'ppam' => ['application/vnd.ms-powerpoint.addin.macroenabled.12'], + 'ppd' => ['application/vnd.cups-ppd'], + 'ppm' => ['image/x-portable-pixmap'], + 'pps' => ['application/mspowerpoint', 'application/powerpoint', 'application/vnd.ms-powerpoint', 'application/x-mspowerpoint'], + 'ppsm' => ['application/vnd.ms-powerpoint.slideshow.macroenabled.12'], + 'ppsx' => ['application/vnd.openxmlformats-officedocument.presentationml.slideshow'], + 'ppt' => ['application/vnd.ms-powerpoint', 'application/mspowerpoint', 'application/powerpoint', 'application/x-mspowerpoint'], + 'pptm' => ['application/vnd.ms-powerpoint.presentation.macroenabled.12'], + 'pptx' => ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], + 'ppz' => ['application/mspowerpoint', 'application/powerpoint', 'application/vnd.ms-powerpoint', 'application/x-mspowerpoint'], + 'pqa' => ['application/vnd.palm', 'application/x-palm-database'], + 'prc' => ['application/vnd.palm', 'application/x-mobipocket-ebook', 'application/x-palm-database'], + 'pre' => ['application/vnd.lotus-freelance'], + 'prf' => ['application/pics-rules'], + 'ps' => ['application/postscript'], + 'ps.bz2' => ['application/x-bzpostscript'], + 'ps.gz' => ['application/x-gzpostscript'], + 'psb' => ['application/vnd.3gpp.pic-bw-small'], + 'psd' => ['application/photoshop', 'application/x-photoshop', 'image/photoshop', 'image/psd', 'image/vnd.adobe.photoshop', 'image/x-photoshop', 'image/x-psd'], + 'psf' => ['application/x-font-linux-psf', 'audio/x-psf'], + 'psf.gz' => ['application/x-gz-font-linux-psf'], + 'psflib' => ['audio/x-psflib'], + 'psid' => ['audio/prs.sid'], + 'pskcxml' => ['application/pskc+xml'], + 'psw' => ['application/x-pocket-word'], + 'ptid' => ['application/vnd.pvi.ptid1'], + 'pub' => ['application/vnd.ms-publisher', 'application/x-mspublisher'], + 'pvb' => ['application/vnd.3gpp.pic-bw-var'], + 'pw' => ['application/x-pw'], + 'pwn' => ['application/vnd.3m.post-it-notes'], + 'py' => ['text/x-python', 'text/x-python3'], + 'py3' => ['text/x-python3'], + 'py3x' => ['text/x-python3'], + 'pya' => ['audio/vnd.ms-playready.media.pya'], + 'pyc' => ['application/x-python-bytecode'], + 'pyo' => ['application/x-python-bytecode'], + 'pyv' => ['video/vnd.ms-playready.media.pyv'], + 'pyx' => ['text/x-python'], + 'qam' => ['application/vnd.epson.quickanime'], + 'qbo' => ['application/vnd.intu.qbo'], + 'qd' => ['application/x-fd-file', 'application/x-raw-floppy-disk-image'], + 'qfx' => ['application/vnd.intu.qfx'], + 'qif' => ['application/x-qw', 'image/x-quicktime'], + 'qml' => ['text/x-qml'], + 'qmlproject' => ['text/x-qml'], + 'qmltypes' => ['text/x-qml'], + 'qp' => ['application/x-qpress'], + 'qps' => ['application/vnd.publishare-delta-tree'], + 'qt' => ['video/quicktime'], + 'qti' => ['application/x-qtiplot'], + 'qti.gz' => ['application/x-qtiplot'], + 'qtif' => ['image/x-quicktime'], + 'qtl' => ['application/x-quicktime-media-link', 'application/x-quicktimeplayer'], + 'qtvr' => ['video/quicktime'], + 'qwd' => ['application/vnd.quark.quarkxpress'], + 'qwt' => ['application/vnd.quark.quarkxpress'], + 'qxb' => ['application/vnd.quark.quarkxpress'], + 'qxd' => ['application/vnd.quark.quarkxpress'], + 'qxl' => ['application/vnd.quark.quarkxpress'], + 'qxt' => ['application/vnd.quark.quarkxpress'], + 'ra' => ['audio/vnd.m-realaudio', 'audio/vnd.rn-realaudio', 'audio/x-pn-realaudio'], + 'raf' => ['image/x-fuji-raf'], + 'ram' => ['application/ram', 'audio/x-pn-realaudio'], + 'raml' => ['application/raml+yaml'], + 'rar' => ['application/x-rar-compressed', 'application/vnd.rar', 'application/x-rar'], + 'ras' => ['image/x-cmu-raster'], + 'raw' => ['image/x-panasonic-raw', 'image/x-panasonic-rw'], + 'raw-disk-image' => ['application/x-raw-disk-image'], + 'raw-disk-image.xz' => ['application/x-raw-disk-image-xz-compressed'], + 'rax' => ['audio/vnd.m-realaudio', 'audio/vnd.rn-realaudio', 'audio/x-pn-realaudio'], + 'rb' => ['application/x-ruby'], + 'rcprofile' => ['application/vnd.ipunplugged.rcprofile'], + 'rdf' => ['application/rdf+xml', 'text/rdf'], + 'rdfs' => ['application/rdf+xml', 'text/rdf'], + 'rdz' => ['application/vnd.data-vision.rdz'], + 'reg' => ['text/x-ms-regedit'], + 'rej' => ['application/x-reject', 'text/x-reject'], + 'rep' => ['application/vnd.businessobjects'], + 'res' => ['application/x-dtbresource+xml'], + 'rgb' => ['image/x-rgb'], + 'rif' => ['application/reginfo+xml'], + 'rip' => ['audio/vnd.rip'], + 'ris' => ['application/x-research-info-systems'], + 'rl' => ['application/resource-lists+xml'], + 'rlc' => ['image/vnd.fujixerox.edmics-rlc'], + 'rld' => ['application/resource-lists-diff+xml'], + 'rle' => ['image/rle'], + 'rm' => ['application/vnd.rn-realmedia', 'application/vnd.rn-realmedia-vbr'], + 'rmi' => ['audio/midi'], + 'rmj' => ['application/vnd.rn-realmedia', 'application/vnd.rn-realmedia-vbr'], + 'rmm' => ['application/vnd.rn-realmedia', 'application/vnd.rn-realmedia-vbr'], + 'rmp' => ['audio/x-pn-realaudio-plugin'], + 'rms' => ['application/vnd.jcp.javame.midlet-rms', 'application/vnd.rn-realmedia', 'application/vnd.rn-realmedia-vbr'], + 'rmvb' => ['application/vnd.rn-realmedia', 'application/vnd.rn-realmedia-vbr'], + 'rmx' => ['application/vnd.rn-realmedia', 'application/vnd.rn-realmedia-vbr'], + 'rnc' => ['application/relax-ng-compact-syntax', 'application/x-rnc'], + 'rng' => ['application/xml', 'text/xml'], + 'roa' => ['application/rpki-roa'], + 'roff' => ['application/x-troff', 'text/troff', 'text/x-troff'], + 'rp' => ['image/vnd.rn-realpix'], + 'rp9' => ['application/vnd.cloanto.rp9'], + 'rpm' => ['application/x-redhat-package-manager', 'application/x-rpm'], + 'rpss' => ['application/vnd.nokia.radio-presets'], + 'rpst' => ['application/vnd.nokia.radio-preset'], + 'rq' => ['application/sparql-query'], + 'rs' => ['application/rls-services+xml', 'text/rust'], + 'rsd' => ['application/rsd+xml'], + 'rss' => ['application/rss+xml', 'text/rss'], + 'rt' => ['text/vnd.rn-realtext'], + 'rtf' => ['application/rtf', 'text/rtf'], + 'rtx' => ['text/richtext'], + 'rv' => ['video/vnd.rn-realvideo', 'video/x-real-video'], + 'rvx' => ['video/vnd.rn-realvideo', 'video/x-real-video'], + 'rw2' => ['image/x-panasonic-raw2', 'image/x-panasonic-rw2'], + 's' => ['text/x-asm'], + 's3m' => ['audio/s3m', 'audio/x-s3m'], + 'saf' => ['application/vnd.yamaha.smaf-audio'], + 'sam' => ['application/x-amipro'], + 'sami' => ['application/x-sami'], + 'sap' => ['application/x-sap-file', 'application/x-thomson-sap-image'], + 'sass' => ['text/x-sass'], + 'sav' => ['application/x-spss-sav', 'application/x-spss-savefile'], + 'sbml' => ['application/sbml+xml'], + 'sc' => ['application/vnd.ibm.secure-container'], + 'scala' => ['text/x-scala'], + 'scd' => ['application/x-msschedule'], + 'scm' => ['application/vnd.lotus-screencam', 'text/x-scheme'], + 'scope' => ['text/x-systemd-unit'], + 'scq' => ['application/scvp-cv-request'], + 'scs' => ['application/scvp-cv-response'], + 'scss' => ['text/x-scss'], + 'scurl' => ['text/vnd.curl.scurl'], + 'sda' => ['application/vnd.stardivision.draw'], + 'sdc' => ['application/vnd.stardivision.calc'], + 'sdd' => ['application/vnd.stardivision.impress'], + 'sdkd' => ['application/vnd.solent.sdkm+xml'], + 'sdkm' => ['application/vnd.solent.sdkm+xml'], + 'sdp' => ['application/sdp', 'application/vnd.sdp', 'application/vnd.stardivision.impress', 'application/x-sdp'], + 'sds' => ['application/vnd.stardivision.chart'], + 'sdw' => ['application/vnd.stardivision.writer', 'application/vnd.stardivision.writer-global'], + 'see' => ['application/vnd.seemail'], + 'seed' => ['application/vnd.fdsn.seed'], + 'sema' => ['application/vnd.sema'], + 'semd' => ['application/vnd.semd'], + 'semf' => ['application/vnd.semf'], + 'ser' => ['application/java-serialized-object'], + 'service' => ['text/x-dbus-service', 'text/x-systemd-unit'], + 'setpay' => ['application/set-payment-initiation'], + 'setreg' => ['application/set-registration-initiation'], + 'sfc' => ['application/vnd.nintendo.snes.rom', 'application/x-snes-rom'], + 'sfd-hdstx' => ['application/vnd.hydrostatix.sof-data'], + 'sfs' => ['application/vnd.spotfire.sfs'], + 'sfv' => ['text/x-sfv'], + 'sg' => ['application/x-sg1000-rom'], + 'sgb' => ['application/x-gameboy-rom'], + 'sgf' => ['application/x-go-sgf'], + 'sgi' => ['image/sgi', 'image/x-sgi'], + 'sgl' => ['application/vnd.stardivision.writer', 'application/vnd.stardivision.writer-global'], + 'sgm' => ['text/sgml'], + 'sgml' => ['text/sgml'], + 'sh' => ['application/x-sh', 'application/x-shellscript', 'text/x-sh'], + 'shape' => ['application/x-dia-shape'], + 'shar' => ['application/x-shar'], + 'shf' => ['application/shf+xml'], + 'shn' => ['application/x-shorten', 'audio/x-shorten'], + 'siag' => ['application/x-siag'], + 'sid' => ['audio/prs.sid', 'image/x-mrsid-image'], + 'sig' => ['application/pgp-signature'], + 'sik' => ['application/x-trash'], + 'sil' => ['audio/silk'], + 'silo' => ['model/mesh'], + 'sis' => ['application/vnd.symbian.install'], + 'sisx' => ['application/vnd.symbian.install', 'x-epoc/x-sisx-app'], + 'sit' => ['application/x-stuffit', 'application/stuffit', 'application/x-sit'], + 'sitx' => ['application/x-stuffitx'], + 'siv' => ['application/sieve'], + 'sk' => ['image/x-skencil'], + 'sk1' => ['image/x-skencil'], + 'skd' => ['application/vnd.koan'], + 'skm' => ['application/vnd.koan'], + 'skp' => ['application/vnd.koan'], + 'skr' => ['application/pgp-keys'], + 'skt' => ['application/vnd.koan'], + 'sldm' => ['application/vnd.ms-powerpoint.slide.macroenabled.12'], + 'sldx' => ['application/vnd.openxmlformats-officedocument.presentationml.slide'], + 'slice' => ['text/x-systemd-unit'], + 'slk' => ['text/spreadsheet'], + 'slt' => ['application/vnd.epson.salt'], + 'sm' => ['application/vnd.stepmania.stepchart'], + 'smaf' => ['application/vnd.smaf', 'application/x-smaf'], + 'smc' => ['application/vnd.nintendo.snes.rom', 'application/x-snes-rom'], + 'smd' => ['application/vnd.stardivision.mail', 'application/x-genesis-rom'], + 'smf' => ['application/vnd.stardivision.math'], + 'smi' => ['application/smil', 'application/smil+xml', 'application/x-sami'], + 'smil' => ['application/smil', 'application/smil+xml'], + 'sml' => ['application/smil', 'application/smil+xml'], + 'sms' => ['application/x-sms-rom'], + 'smv' => ['video/x-smv'], + 'smzip' => ['application/vnd.stepmania.package'], + 'snap' => ['application/vnd.snap'], + 'snd' => ['audio/basic'], + 'snf' => ['application/x-font-snf'], + 'so' => ['application/octet-stream', 'application/x-sharedlib'], + 'socket' => ['text/x-systemd-unit'], + 'spc' => ['application/x-pkcs7-certificates'], + 'spd' => ['application/x-font-speedo'], + 'spec' => ['text/x-rpm-spec'], + 'spf' => ['application/vnd.yamaha.smaf-phrase'], + 'spl' => ['application/futuresplash', 'application/vnd.adobe.flash.movie', 'application/x-futuresplash', 'application/x-shockwave-flash'], + 'spm' => ['application/x-source-rpm'], + 'spot' => ['text/vnd.in3d.spot'], + 'spp' => ['application/scvp-vp-response'], + 'spq' => ['application/scvp-vp-request'], + 'spx' => ['audio/ogg', 'audio/x-speex'], + 'sql' => ['application/sql', 'application/x-sql', 'text/x-sql'], + 'sqlite2' => ['application/x-sqlite2'], + 'sqlite3' => ['application/vnd.sqlite3', 'application/x-sqlite3'], + 'sqsh' => ['application/vnd.squashfs'], + 'sr2' => ['image/x-sony-sr2'], + 'src' => ['application/x-wais-source'], + 'src.rpm' => ['application/x-source-rpm'], + 'srf' => ['image/x-sony-srf'], + 'srt' => ['application/x-srt', 'application/x-subrip'], + 'sru' => ['application/sru+xml'], + 'srx' => ['application/sparql-results+xml'], + 'ss' => ['text/x-scheme'], + 'ssa' => ['text/x-ssa'], + 'ssdl' => ['application/ssdl+xml'], + 'sse' => ['application/vnd.kodak-descriptor'], + 'ssf' => ['application/vnd.epson.ssf'], + 'ssml' => ['application/ssml+xml'], + 'st' => ['application/vnd.sailingtracker.track'], + 'stc' => ['application/vnd.sun.xml.calc.template'], + 'std' => ['application/vnd.sun.xml.draw.template'], + 'stf' => ['application/vnd.wt.stf'], + 'sti' => ['application/vnd.sun.xml.impress.template'], + 'stk' => ['application/hyperstudio'], + 'stl' => ['application/vnd.ms-pki.stl', 'model/stl', 'model/x.stl-ascii', 'model/x.stl-binary'], + 'stm' => ['audio/x-stm'], + 'str' => ['application/vnd.pg.format'], + 'stw' => ['application/vnd.sun.xml.writer.template'], + 'sty' => ['application/x-tex', 'text/x-tex'], + 'sub' => ['image/vnd.dvb.subtitle', 'text/vnd.dvb.subtitle', 'text/x-microdvd', 'text/x-mpsub', 'text/x-subviewer'], + 'sun' => ['image/x-sun-raster'], + 'sus' => ['application/vnd.sus-calendar'], + 'susp' => ['application/vnd.sus-calendar'], + 'sv' => ['text/x-svsrc'], + 'sv4cpio' => ['application/x-sv4cpio'], + 'sv4crc' => ['application/x-sv4crc'], + 'svc' => ['application/vnd.dvb.service'], + 'svd' => ['application/vnd.svd'], + 'svg' => ['image/svg+xml', 'image/svg'], + 'svgz' => ['image/svg+xml', 'image/svg+xml-compressed'], + 'svh' => ['text/x-svhdr'], + 'swa' => ['application/x-director'], + 'swap' => ['text/x-systemd-unit'], + 'swf' => ['application/futuresplash', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash'], + 'swi' => ['application/vnd.aristanetworks.swi'], + 'swm' => ['application/x-ms-wim'], + 'sxc' => ['application/vnd.sun.xml.calc'], + 'sxd' => ['application/vnd.sun.xml.draw'], + 'sxg' => ['application/vnd.sun.xml.writer.global'], + 'sxi' => ['application/vnd.sun.xml.impress'], + 'sxm' => ['application/vnd.sun.xml.math'], + 'sxw' => ['application/vnd.sun.xml.writer'], + 'sylk' => ['text/spreadsheet'], + 't' => ['application/x-perl', 'application/x-troff', 'text/troff', 'text/x-perl', 'text/x-troff'], + 't2t' => ['text/x-txt2tags'], + 't3' => ['application/x-t3vm-image'], + 'taglet' => ['application/vnd.mynfc'], + 'tao' => ['application/vnd.tao.intent-module-archive'], + 'tar' => ['application/x-tar', 'application/x-gtar'], + 'tar.Z' => ['application/x-tarz'], + 'tar.bz' => ['application/x-bzip-compressed-tar'], + 'tar.bz2' => ['application/x-bzip-compressed-tar'], + 'tar.gz' => ['application/x-compressed-tar'], + 'tar.lrz' => ['application/x-lrzip-compressed-tar'], + 'tar.lz' => ['application/x-lzip-compressed-tar'], + 'tar.lz4' => ['application/x-lz4-compressed-tar'], + 'tar.lzma' => ['application/x-lzma-compressed-tar'], + 'tar.lzo' => ['application/x-tzo'], + 'tar.xz' => ['application/x-xz-compressed-tar'], + 'target' => ['text/x-systemd-unit'], + 'taz' => ['application/x-tarz'], + 'tb2' => ['application/x-bzip-compressed-tar'], + 'tbz' => ['application/x-bzip-compressed-tar'], + 'tbz2' => ['application/x-bzip-compressed-tar'], + 'tcap' => ['application/vnd.3gpp2.tcap'], + 'tcl' => ['application/x-tcl', 'text/x-tcl'], + 'teacher' => ['application/vnd.smart.teacher'], + 'tei' => ['application/tei+xml'], + 'teicorpus' => ['application/tei+xml'], + 'tex' => ['application/x-tex', 'text/x-tex'], + 'texi' => ['application/x-texinfo', 'text/x-texinfo'], + 'texinfo' => ['application/x-texinfo', 'text/x-texinfo'], + 'text' => ['text/plain'], + 'tfi' => ['application/thraud+xml'], + 'tfm' => ['application/x-tex-tfm'], + 'tga' => ['image/x-icb', 'image/x-tga'], + 'tgz' => ['application/x-compressed-tar'], + 'theme' => ['application/x-theme'], + 'themepack' => ['application/x-windows-themepack'], + 'thmx' => ['application/vnd.ms-officetheme'], + 'tif' => ['image/tiff'], + 'tiff' => ['image/tiff'], + 'timer' => ['text/x-systemd-unit'], + 'tk' => ['text/x-tcl'], + 'tlrz' => ['application/x-lrzip-compressed-tar'], + 'tlz' => ['application/x-lzma-compressed-tar'], + 'tmo' => ['application/vnd.tmobile-livetv'], + 'tnef' => ['application/ms-tnef', 'application/vnd.ms-tnef'], + 'tnf' => ['application/ms-tnef', 'application/vnd.ms-tnef'], + 'toc' => ['application/x-cdrdao-toc'], + 'torrent' => ['application/x-bittorrent'], + 'tpic' => ['image/x-icb', 'image/x-tga'], + 'tpl' => ['application/vnd.groove-tool-template'], + 'tpt' => ['application/vnd.trid.tpt'], + 'tr' => ['application/x-troff', 'text/troff', 'text/x-troff'], + 'tra' => ['application/vnd.trueapp'], + 'trig' => ['application/trig', 'application/x-trig'], + 'trm' => ['application/x-msterminal'], + 'ts' => ['application/x-linguist', 'text/vnd.qt.linguist', 'text/vnd.trolltech.linguist', 'video/mp2t'], + 'tsd' => ['application/timestamped-data'], + 'tsv' => ['text/tab-separated-values'], + 'tta' => ['audio/tta', 'audio/x-tta'], + 'ttc' => ['font/collection'], + 'ttf' => ['application/x-font-truetype', 'application/x-font-ttf', 'font/ttf'], + 'ttl' => ['text/turtle'], + 'ttx' => ['application/x-font-ttx'], + 'twd' => ['application/vnd.simtech-mindmapper'], + 'twds' => ['application/vnd.simtech-mindmapper'], + 'twig' => ['text/x-twig'], + 'txd' => ['application/vnd.genomatix.tuxedo'], + 'txf' => ['application/vnd.mobius.txf'], + 'txt' => ['text/plain'], + 'txz' => ['application/x-xz-compressed-tar'], + 'tzo' => ['application/x-tzo'], + 'u32' => ['application/x-authorware-bin'], + 'udeb' => ['application/vnd.debian.binary-package', 'application/x-deb', 'application/x-debian-package'], + 'ufd' => ['application/vnd.ufdl'], + 'ufdl' => ['application/vnd.ufdl'], + 'ufraw' => ['application/x-ufraw'], + 'ui' => ['application/x-designer', 'application/x-gtk-builder'], + 'uil' => ['text/x-uil'], + 'ult' => ['audio/x-mod'], + 'ulx' => ['application/x-glulx'], + 'umj' => ['application/vnd.umajin'], + 'unf' => ['application/x-nes-rom'], + 'uni' => ['audio/x-mod'], + 'unif' => ['application/x-nes-rom'], + 'unityweb' => ['application/vnd.unity'], + 'uoml' => ['application/vnd.uoml+xml'], + 'uri' => ['text/uri-list'], + 'uris' => ['text/uri-list'], + 'url' => ['application/x-mswinurl'], + 'urls' => ['text/uri-list'], + 'ustar' => ['application/x-ustar'], + 'utz' => ['application/vnd.uiq.theme'], + 'uu' => ['text/x-uuencode'], + 'uue' => ['text/x-uuencode', 'zz-application/zz-winassoc-uu'], + 'uva' => ['audio/vnd.dece.audio'], + 'uvd' => ['application/vnd.dece.data'], + 'uvf' => ['application/vnd.dece.data'], + 'uvg' => ['image/vnd.dece.graphic'], + 'uvh' => ['video/vnd.dece.hd'], + 'uvi' => ['image/vnd.dece.graphic'], + 'uvm' => ['video/vnd.dece.mobile'], + 'uvp' => ['video/vnd.dece.pd'], + 'uvs' => ['video/vnd.dece.sd'], + 'uvt' => ['application/vnd.dece.ttml+xml'], + 'uvu' => ['video/vnd.uvvu.mp4'], + 'uvv' => ['video/vnd.dece.video'], + 'uvva' => ['audio/vnd.dece.audio'], + 'uvvd' => ['application/vnd.dece.data'], + 'uvvf' => ['application/vnd.dece.data'], + 'uvvg' => ['image/vnd.dece.graphic'], + 'uvvh' => ['video/vnd.dece.hd'], + 'uvvi' => ['image/vnd.dece.graphic'], + 'uvvm' => ['video/vnd.dece.mobile'], + 'uvvp' => ['video/vnd.dece.pd'], + 'uvvs' => ['video/vnd.dece.sd'], + 'uvvt' => ['application/vnd.dece.ttml+xml'], + 'uvvu' => ['video/vnd.uvvu.mp4'], + 'uvvv' => ['video/vnd.dece.video'], + 'uvvx' => ['application/vnd.dece.unspecified'], + 'uvvz' => ['application/vnd.dece.zip'], + 'uvx' => ['application/vnd.dece.unspecified'], + 'uvz' => ['application/vnd.dece.zip'], + 'v' => ['text/x-verilog'], + 'v64' => ['application/x-n64-rom'], + 'vala' => ['text/x-vala'], + 'vapi' => ['text/x-vala'], + 'vb' => ['application/x-virtual-boy-rom'], + 'vcard' => ['text/directory', 'text/vcard', 'text/x-vcard'], + 'vcd' => ['application/x-cdlink'], + 'vcf' => ['text/x-vcard', 'text/directory', 'text/vcard'], + 'vcg' => ['application/vnd.groove-vcard'], + 'vcs' => ['application/ics', 'text/calendar', 'text/x-vcalendar'], + 'vct' => ['text/directory', 'text/vcard', 'text/x-vcard'], + 'vcx' => ['application/vnd.vcx'], + 'vda' => ['image/x-icb', 'image/x-tga'], + 'vhd' => ['text/x-vhdl'], + 'vhdl' => ['text/x-vhdl'], + 'vis' => ['application/vnd.visionary'], + 'viv' => ['video/vivo', 'video/vnd.vivo'], + 'vivo' => ['video/vivo', 'video/vnd.vivo'], + 'vlc' => ['application/m3u', 'audio/m3u', 'audio/mpegurl', 'audio/x-m3u', 'audio/x-mp3-playlist', 'audio/x-mpegurl'], + 'vob' => ['video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2', 'video/x-ms-vob'], + 'voc' => ['audio/x-voc'], + 'vor' => ['application/vnd.stardivision.writer', 'application/vnd.stardivision.writer-global'], + 'vox' => ['application/x-authorware-bin'], + 'vrm' => ['model/vrml'], + 'vrml' => ['model/vrml'], + 'vsd' => ['application/vnd.visio'], + 'vsdm' => ['application/vnd.ms-visio.drawing.macroenabled.main+xml'], + 'vsdx' => ['application/vnd.ms-visio.drawing.main+xml'], + 'vsf' => ['application/vnd.vsf'], + 'vss' => ['application/vnd.visio'], + 'vssm' => ['application/vnd.ms-visio.stencil.macroenabled.main+xml'], + 'vssx' => ['application/vnd.ms-visio.stencil.main+xml'], + 'vst' => ['application/vnd.visio', 'image/x-icb', 'image/x-tga'], + 'vstm' => ['application/vnd.ms-visio.template.macroenabled.main+xml'], + 'vstx' => ['application/vnd.ms-visio.template.main+xml'], + 'vsw' => ['application/vnd.visio'], + 'vtt' => ['text/vtt'], + 'vtu' => ['model/vnd.vtu'], + 'vxml' => ['application/voicexml+xml'], + 'w3d' => ['application/x-director'], + 'wad' => ['application/x-doom', 'application/x-doom-wad', 'application/x-wii-wad'], + 'wav' => ['audio/wav', 'audio/vnd.wave', 'audio/x-wav'], + 'wax' => ['application/x-ms-asx', 'audio/x-ms-asx', 'audio/x-ms-wax', 'video/x-ms-wax', 'video/x-ms-wmx', 'video/x-ms-wvx'], + 'wb1' => ['application/x-quattropro'], + 'wb2' => ['application/x-quattropro'], + 'wb3' => ['application/x-quattropro'], + 'wbmp' => ['image/vnd.wap.wbmp'], + 'wbs' => ['application/vnd.criticaltools.wbs+xml'], + 'wbxml' => ['application/vnd.wap.wbxml'], + 'wcm' => ['application/vnd.ms-works'], + 'wdb' => ['application/vnd.ms-works'], + 'wdp' => ['image/vnd.ms-photo'], + 'weba' => ['audio/webm'], + 'webm' => ['video/webm'], + 'webp' => ['image/webp'], + 'wg' => ['application/vnd.pmi.widget'], + 'wgt' => ['application/widget'], + 'wim' => ['application/x-ms-wim'], + 'wk1' => ['application/lotus123', 'application/vnd.lotus-1-2-3', 'application/wk1', 'application/x-123', 'application/x-lotus123', 'zz-application/zz-winassoc-123'], + 'wk3' => ['application/lotus123', 'application/vnd.lotus-1-2-3', 'application/wk1', 'application/x-123', 'application/x-lotus123', 'zz-application/zz-winassoc-123'], + 'wk4' => ['application/lotus123', 'application/vnd.lotus-1-2-3', 'application/wk1', 'application/x-123', 'application/x-lotus123', 'zz-application/zz-winassoc-123'], + 'wkdownload' => ['application/x-partial-download'], + 'wks' => ['application/lotus123', 'application/vnd.lotus-1-2-3', 'application/vnd.ms-works', 'application/wk1', 'application/x-123', 'application/x-lotus123', 'zz-application/zz-winassoc-123'], + 'wm' => ['video/x-ms-wm'], + 'wma' => ['audio/x-ms-wma', 'audio/wma'], + 'wmd' => ['application/x-ms-wmd'], + 'wmf' => ['application/wmf', 'application/x-msmetafile', 'application/x-wmf', 'image/wmf', 'image/x-win-metafile', 'image/x-wmf'], + 'wml' => ['text/vnd.wap.wml'], + 'wmlc' => ['application/vnd.wap.wmlc'], + 'wmls' => ['text/vnd.wap.wmlscript'], + 'wmlsc' => ['application/vnd.wap.wmlscriptc'], + 'wmv' => ['audio/x-ms-wmv', 'video/x-ms-wmv'], + 'wmx' => ['application/x-ms-asx', 'audio/x-ms-asx', 'video/x-ms-wax', 'video/x-ms-wmx', 'video/x-ms-wvx'], + 'wmz' => ['application/x-ms-wmz', 'application/x-msmetafile'], + 'woff' => ['application/font-woff', 'application/x-font-woff', 'font/woff'], + 'woff2' => ['font/woff', 'font/woff2'], + 'wp' => ['application/vnd.wordperfect', 'application/wordperfect', 'application/x-wordperfect'], + 'wp4' => ['application/vnd.wordperfect', 'application/wordperfect', 'application/x-wordperfect'], + 'wp5' => ['application/vnd.wordperfect', 'application/wordperfect', 'application/x-wordperfect'], + 'wp6' => ['application/vnd.wordperfect', 'application/wordperfect', 'application/x-wordperfect'], + 'wpd' => ['application/vnd.wordperfect', 'application/wordperfect', 'application/x-wordperfect'], + 'wpg' => ['application/x-wpg'], + 'wpl' => ['application/vnd.ms-wpl'], + 'wpp' => ['application/vnd.wordperfect', 'application/wordperfect', 'application/x-wordperfect'], + 'wps' => ['application/vnd.ms-works'], + 'wqd' => ['application/vnd.wqd'], + 'wri' => ['application/x-mswrite'], + 'wrl' => ['model/vrml'], + 'ws' => ['application/x-wonderswan-rom'], + 'wsc' => ['application/x-wonderswan-color-rom'], + 'wsdl' => ['application/wsdl+xml'], + 'wsgi' => ['text/x-python'], + 'wspolicy' => ['application/wspolicy+xml'], + 'wtb' => ['application/vnd.webturbo'], + 'wv' => ['audio/x-wavpack'], + 'wvc' => ['audio/x-wavpack-correction'], + 'wvp' => ['audio/x-wavpack'], + 'wvx' => ['application/x-ms-asx', 'audio/x-ms-asx', 'video/x-ms-wax', 'video/x-ms-wmx', 'video/x-ms-wvx'], + 'wwf' => ['application/wwf', 'application/x-wwf'], + 'x32' => ['application/x-authorware-bin'], + 'x3d' => ['model/x3d+xml'], + 'x3db' => ['model/x3d+binary'], + 'x3dbz' => ['model/x3d+binary'], + 'x3dv' => ['model/x3d+vrml'], + 'x3dvz' => ['model/x3d+vrml'], + 'x3dz' => ['model/x3d+xml'], + 'x3f' => ['image/x-sigma-x3f'], + 'xac' => ['application/x-gnucash'], + 'xaml' => ['application/xaml+xml'], + 'xap' => ['application/x-silverlight-app'], + 'xar' => ['application/vnd.xara', 'application/x-xar'], + 'xbap' => ['application/x-ms-xbap'], + 'xbd' => ['application/vnd.fujixerox.docuworks.binder'], + 'xbel' => ['application/x-xbel'], + 'xbl' => ['application/xml', 'text/xml'], + 'xbm' => ['image/x-xbitmap'], + 'xcf' => ['image/x-xcf'], + 'xcf.bz2' => ['image/x-compressed-xcf'], + 'xcf.gz' => ['image/x-compressed-xcf'], + 'xdf' => ['application/xcap-diff+xml'], + 'xdgapp' => ['application/vnd.flatpak', 'application/vnd.xdgapp'], + 'xdm' => ['application/vnd.syncml.dm+xml'], + 'xdp' => ['application/vnd.adobe.xdp+xml'], + 'xdssc' => ['application/dssc+xml'], + 'xdw' => ['application/vnd.fujixerox.docuworks'], + 'xenc' => ['application/xenc+xml'], + 'xer' => ['application/patch-ops-error+xml'], + 'xfdf' => ['application/vnd.adobe.xfdf'], + 'xfdl' => ['application/vnd.xfdl'], + 'xhe' => ['audio/usac'], + 'xht' => ['application/xhtml+xml'], + 'xhtml' => ['application/xhtml+xml'], + 'xhvml' => ['application/xv+xml'], + 'xi' => ['audio/x-xi'], + 'xif' => ['image/vnd.xiff'], + 'xla' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xlam' => ['application/vnd.ms-excel.addin.macroenabled.12'], + 'xlc' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xld' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xlf' => ['application/x-xliff', 'application/x-xliff+xml', 'application/xliff+xml'], + 'xliff' => ['application/x-xliff', 'application/xliff+xml'], + 'xll' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xlm' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xlr' => ['application/vnd.ms-works'], + 'xls' => ['application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xlsb' => ['application/vnd.ms-excel.sheet.binary.macroenabled.12'], + 'xlsm' => ['application/vnd.ms-excel.sheet.macroenabled.12'], + 'xlsx' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], + 'xlt' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xltm' => ['application/vnd.ms-excel.template.macroenabled.12'], + 'xltx' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.template'], + 'xlw' => ['application/msexcel', 'application/vnd.ms-excel', 'application/x-msexcel', 'zz-application/zz-winassoc-xls'], + 'xm' => ['audio/x-xm', 'audio/xm'], + 'xmf' => ['audio/mobile-xmf', 'audio/x-xmf', 'audio/xmf'], + 'xmi' => ['text/x-xmi'], + 'xml' => ['application/xml', 'text/xml'], + 'xo' => ['application/vnd.olpc-sugar'], + 'xop' => ['application/xop+xml'], + 'xpi' => ['application/x-xpinstall'], + 'xpl' => ['application/xproc+xml'], + 'xpm' => ['image/x-xpixmap', 'image/x-xpm'], + 'xpr' => ['application/vnd.is-xpr'], + 'xps' => ['application/oxps', 'application/vnd.ms-xpsdocument', 'application/xps'], + 'xpw' => ['application/vnd.intercon.formnet'], + 'xpx' => ['application/vnd.intercon.formnet'], + 'xsd' => ['application/xml', 'text/xml'], + 'xsl' => ['application/xml', 'application/xslt+xml'], + 'xslfo' => ['text/x-xslfo'], + 'xslt' => ['application/xslt+xml'], + 'xsm' => ['application/vnd.syncml+xml'], + 'xspf' => ['application/x-xspf+xml', 'application/xspf+xml'], + 'xul' => ['application/vnd.mozilla.xul+xml'], + 'xvm' => ['application/xv+xml'], + 'xvml' => ['application/xv+xml'], + 'xwd' => ['image/x-xwindowdump'], + 'xyz' => ['chemical/x-xyz'], + 'xz' => ['application/x-xz'], + 'yaml' => ['application/x-yaml', 'text/x-yaml', 'text/yaml'], + 'yang' => ['application/yang'], + 'yin' => ['application/yin+xml'], + 'yml' => ['application/x-yaml', 'text/x-yaml', 'text/yaml'], + 'yt' => ['application/vnd.youtube.yt'], + 'z1' => ['application/x-zmachine'], + 'z2' => ['application/x-zmachine'], + 'z3' => ['application/x-zmachine'], + 'z4' => ['application/x-zmachine'], + 'z5' => ['application/x-zmachine'], + 'z6' => ['application/x-zmachine'], + 'z64' => ['application/x-n64-rom'], + 'z7' => ['application/x-zmachine'], + 'z8' => ['application/x-zmachine'], + 'zabw' => ['application/x-abiword'], + 'zaz' => ['application/vnd.zzazz.deck+xml'], + 'zip' => ['application/zip', 'application/x-zip', 'application/x-zip-compressed'], + 'zir' => ['application/vnd.zul'], + 'zirz' => ['application/vnd.zul'], + 'zmm' => ['application/vnd.handheld-entertainment+xml'], + 'zoo' => ['application/x-zoo'], + 'zsav' => ['application/x-spss-sav', 'application/x-spss-savefile'], + 'zz' => ['application/zlib'], + '123' => ['application/lotus123', 'application/vnd.lotus-1-2-3', 'application/wk1', 'application/x-123', 'application/x-lotus123', 'zz-application/zz-winassoc-123'], + '602' => ['application/x-t602'], + '669' => ['audio/x-mod'], + ]; +} diff --git a/vendor/symfony/mime/MimeTypesInterface.php b/vendor/symfony/mime/MimeTypesInterface.php new file mode 100644 index 0000000..9fbd2cc --- /dev/null +++ b/vendor/symfony/mime/MimeTypesInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +/** + * @author Fabien Potencier + */ +interface MimeTypesInterface extends MimeTypeGuesserInterface +{ + /** + * Gets the extensions for the given MIME type. + * + * @return string[] an array of extensions (first one is the preferred one) + */ + public function getExtensions(string $mimeType): array; + + /** + * Gets the MIME types for the given extension. + * + * @return string[] an array of MIME types (first one is the preferred one) + */ + public function getMimeTypes(string $ext): array; +} diff --git a/vendor/symfony/mime/Part/AbstractMultipartPart.php b/vendor/symfony/mime/Part/AbstractMultipartPart.php new file mode 100644 index 0000000..685d250 --- /dev/null +++ b/vendor/symfony/mime/Part/AbstractMultipartPart.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part; + +use Symfony\Component\Mime\Header\Headers; + +/** + * @author Fabien Potencier + */ +abstract class AbstractMultipartPart extends AbstractPart +{ + private $boundary; + private $parts = []; + + public function __construct(AbstractPart ...$parts) + { + parent::__construct(); + + foreach ($parts as $part) { + $this->parts[] = $part; + } + } + + /** + * @return AbstractPart[] + */ + public function getParts(): array + { + return $this->parts; + } + + public function getMediaType(): string + { + return 'multipart'; + } + + public function getPreparedHeaders(): Headers + { + $headers = parent::getPreparedHeaders(); + $headers->setHeaderParameter('Content-Type', 'boundary', $this->getBoundary()); + + return $headers; + } + + public function bodyToString(): string + { + $parts = $this->getParts(); + $string = ''; + foreach ($parts as $part) { + $string .= '--'.$this->getBoundary()."\r\n".$part->toString()."\r\n"; + } + $string .= '--'.$this->getBoundary()."--\r\n"; + + return $string; + } + + public function bodyToIterable(): iterable + { + $parts = $this->getParts(); + foreach ($parts as $part) { + yield '--'.$this->getBoundary()."\r\n"; + yield from $part->toIterable(); + yield "\r\n"; + } + yield '--'.$this->getBoundary()."--\r\n"; + } + + public function asDebugString(): string + { + $str = parent::asDebugString(); + foreach ($this->getParts() as $part) { + $lines = explode("\n", $part->asDebugString()); + $str .= "\n â”” ".array_shift($lines); + foreach ($lines as $line) { + $str .= "\n |".$line; + } + } + + return $str; + } + + private function getBoundary(): string + { + if (null === $this->boundary) { + $this->boundary = strtr(base64_encode(random_bytes(6)), '+/', '-_'); + } + + return $this->boundary; + } +} diff --git a/vendor/symfony/mime/Part/AbstractPart.php b/vendor/symfony/mime/Part/AbstractPart.php new file mode 100644 index 0000000..93892d9 --- /dev/null +++ b/vendor/symfony/mime/Part/AbstractPart.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part; + +use Symfony\Component\Mime\Header\Headers; + +/** + * @author Fabien Potencier + */ +abstract class AbstractPart +{ + private $headers; + + public function __construct() + { + $this->headers = new Headers(); + } + + public function getHeaders(): Headers + { + return $this->headers; + } + + public function getPreparedHeaders(): Headers + { + $headers = clone $this->headers; + $headers->setHeaderBody('Parameterized', 'Content-Type', $this->getMediaType().'/'.$this->getMediaSubtype()); + + return $headers; + } + + public function toString(): string + { + return $this->getPreparedHeaders()->toString()."\r\n".$this->bodyToString(); + } + + public function toIterable(): iterable + { + yield $this->getPreparedHeaders()->toString(); + yield "\r\n"; + yield from $this->bodyToIterable(); + } + + public function asDebugString(): string + { + return $this->getMediaType().'/'.$this->getMediaSubtype(); + } + + abstract public function bodyToString(): string; + + abstract public function bodyToIterable(): iterable; + + abstract public function getMediaType(): string; + + abstract public function getMediaSubtype(): string; +} diff --git a/vendor/symfony/mime/Part/DataPart.php b/vendor/symfony/mime/Part/DataPart.php new file mode 100644 index 0000000..c6f1cb9 --- /dev/null +++ b/vendor/symfony/mime/Part/DataPart.php @@ -0,0 +1,161 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part; + +use Symfony\Component\Mime\Exception\InvalidArgumentException; +use Symfony\Component\Mime\Header\Headers; +use Symfony\Component\Mime\MimeTypes; + +/** + * @author Fabien Potencier + */ +class DataPart extends TextPart +{ + private static $mimeTypes; + + private $filename; + private $mediaType; + private $cid; + private $handle; + + /** + * @param resource|string $body + */ + public function __construct($body, string $filename = null, string $contentType = null, string $encoding = null) + { + if (null === $contentType) { + $contentType = 'application/octet-stream'; + } + list($this->mediaType, $subtype) = explode('/', $contentType); + + parent::__construct($body, null, $subtype, $encoding); + + $this->filename = $filename; + $this->setName($filename); + $this->setDisposition('attachment'); + } + + public static function fromPath(string $path, string $name = null, string $contentType = null): self + { + // FIXME: if file is not readable, exception? + + if (null === $contentType) { + $ext = strtolower(substr($path, strrpos($path, '.') + 1)); + if (null === self::$mimeTypes) { + self::$mimeTypes = new MimeTypes(); + } + $contentType = self::$mimeTypes->getMimeTypes($ext)[0] ?? 'application/octet-stream'; + } + + if (false === $handle = @fopen($path, 'r', false)) { + throw new InvalidArgumentException(sprintf('Unable to open path "%s".', $path)); + } + $p = new self($handle, $name ?: basename($path), $contentType); + $p->handle = $handle; + + return $p; + } + + /** + * @return $this + */ + public function asInline() + { + return $this->setDisposition('inline'); + } + + public function getContentId(): string + { + return $this->cid ?: $this->cid = $this->generateContentId(); + } + + public function hasContentId(): bool + { + return null !== $this->cid; + } + + public function getMediaType(): string + { + return $this->mediaType; + } + + public function getPreparedHeaders(): Headers + { + $headers = parent::getPreparedHeaders(); + + if (null !== $this->cid) { + $headers->setHeaderBody('Id', 'Content-ID', $this->cid); + } + + if (null !== $this->filename) { + $headers->setHeaderParameter('Content-Disposition', 'filename', $this->filename); + } + + return $headers; + } + + public function asDebugString(): string + { + $str = parent::asDebugString(); + if (null !== $this->filename) { + $str .= ' filename: '.$this->filename; + } + + return $str; + } + + private function generateContentId(): string + { + return bin2hex(random_bytes(16)).'@symfony'; + } + + public function __destruct() + { + if (null !== $this->handle && \is_resource($this->handle)) { + fclose($this->handle); + } + } + + /** + * @return array + */ + public function __sleep() + { + // converts the body to a string + parent::__sleep(); + + $this->_parent = []; + foreach (['body', 'charset', 'subtype', 'disposition', 'name', 'encoding'] as $name) { + $r = new \ReflectionProperty(TextPart::class, $name); + $r->setAccessible(true); + $this->_parent[$name] = $r->getValue($this); + } + $this->_headers = $this->getHeaders(); + + return ['_headers', '_parent', 'filename', 'mediaType']; + } + + public function __wakeup() + { + $r = new \ReflectionProperty(AbstractPart::class, 'headers'); + $r->setAccessible(true); + $r->setValue($this, $this->_headers); + unset($this->_headers); + + foreach (['body', 'charset', 'subtype', 'disposition', 'name', 'encoding'] as $name) { + $r = new \ReflectionProperty(TextPart::class, $name); + $r->setAccessible(true); + $r->setValue($this, $this->_parent[$name]); + } + unset($this->_parent); + } +} diff --git a/vendor/symfony/mime/Part/MessagePart.php b/vendor/symfony/mime/Part/MessagePart.php new file mode 100644 index 0000000..1b5c23e --- /dev/null +++ b/vendor/symfony/mime/Part/MessagePart.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part; + +use Symfony\Component\Mime\Message; +use Symfony\Component\Mime\RawMessage; + +/** + * @final + * + * @author Fabien Potencier + */ +class MessagePart extends DataPart +{ + private $message; + + public function __construct(RawMessage $message) + { + if ($message instanceof Message) { + $name = $message->getHeaders()->getHeaderBody('Subject').'.eml'; + } else { + $name = 'email.eml'; + } + parent::__construct('', $name); + + $this->message = $message; + } + + public function getMediaType(): string + { + return 'message'; + } + + public function getMediaSubtype(): string + { + return 'rfc822'; + } + + public function getBody(): string + { + return $this->message->toString(); + } + + public function bodyToString(): string + { + return $this->getBody(); + } + + public function bodyToIterable(): iterable + { + return $this->message->toIterable(); + } +} diff --git a/vendor/symfony/mime/Part/Multipart/AlternativePart.php b/vendor/symfony/mime/Part/Multipart/AlternativePart.php new file mode 100644 index 0000000..fd75423 --- /dev/null +++ b/vendor/symfony/mime/Part/Multipart/AlternativePart.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part\Multipart; + +use Symfony\Component\Mime\Part\AbstractMultipartPart; + +/** + * @author Fabien Potencier + */ +final class AlternativePart extends AbstractMultipartPart +{ + public function getMediaSubtype(): string + { + return 'alternative'; + } +} diff --git a/vendor/symfony/mime/Part/Multipart/DigestPart.php b/vendor/symfony/mime/Part/Multipart/DigestPart.php new file mode 100644 index 0000000..27537f1 --- /dev/null +++ b/vendor/symfony/mime/Part/Multipart/DigestPart.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part\Multipart; + +use Symfony\Component\Mime\Part\AbstractMultipartPart; +use Symfony\Component\Mime\Part\MessagePart; + +/** + * @author Fabien Potencier + */ +final class DigestPart extends AbstractMultipartPart +{ + public function __construct(MessagePart ...$parts) + { + parent::__construct(...$parts); + } + + public function getMediaSubtype(): string + { + return 'digest'; + } +} diff --git a/vendor/symfony/mime/Part/Multipart/FormDataPart.php b/vendor/symfony/mime/Part/Multipart/FormDataPart.php new file mode 100644 index 0000000..76c48e4 --- /dev/null +++ b/vendor/symfony/mime/Part/Multipart/FormDataPart.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part\Multipart; + +use Symfony\Component\Mime\Exception\InvalidArgumentException; +use Symfony\Component\Mime\Part\AbstractMultipartPart; +use Symfony\Component\Mime\Part\DataPart; +use Symfony\Component\Mime\Part\TextPart; + +/** + * Implements RFC 7578. + * + * @author Fabien Potencier + */ +final class FormDataPart extends AbstractMultipartPart +{ + private $fields = []; + + /** + * @param (string|array|DataPart)[] $fields + */ + public function __construct(array $fields = []) + { + parent::__construct(); + + foreach ($fields as $name => $value) { + if (!\is_string($value) && !\is_array($value) && !$value instanceof TextPart) { + throw new InvalidArgumentException(sprintf('A form field value can only be a string, an array, or an instance of TextPart ("%s" given).', get_debug_type($value))); + } + + $this->fields[$name] = $value; + } + // HTTP does not support \r\n in header values + $this->getHeaders()->setMaxLineLength(PHP_INT_MAX); + } + + public function getMediaSubtype(): string + { + return 'form-data'; + } + + public function getParts(): array + { + return $this->prepareFields($this->fields); + } + + private function prepareFields(array $fields): array + { + $values = []; + + $prepare = function ($item, $key, $root = null) use (&$values, &$prepare) { + $fieldName = $root ? sprintf('%s[%s]', $root, $key) : $key; + + if (\is_array($item)) { + array_walk($item, $prepare, $fieldName); + + return; + } + + $values[] = $this->preparePart($fieldName, $item); + }; + + array_walk($fields, $prepare); + + return $values; + } + + private function preparePart(string $name, $value): TextPart + { + if (\is_string($value)) { + return $this->configurePart($name, new TextPart($value, 'utf-8', 'plain', '8bit')); + } + + return $this->configurePart($name, $value); + } + + private function configurePart(string $name, TextPart $part): TextPart + { + static $r; + + if (null === $r) { + $r = new \ReflectionProperty(TextPart::class, 'encoding'); + $r->setAccessible(true); + } + + $part->setDisposition('form-data'); + $part->setName($name); + // HTTP does not support \r\n in header values + $part->getHeaders()->setMaxLineLength(PHP_INT_MAX); + $r->setValue($part, '8bit'); + + return $part; + } +} diff --git a/vendor/symfony/mime/Part/Multipart/MixedPart.php b/vendor/symfony/mime/Part/Multipart/MixedPart.php new file mode 100644 index 0000000..c8d7028 --- /dev/null +++ b/vendor/symfony/mime/Part/Multipart/MixedPart.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part\Multipart; + +use Symfony\Component\Mime\Part\AbstractMultipartPart; + +/** + * @author Fabien Potencier + */ +final class MixedPart extends AbstractMultipartPart +{ + public function getMediaSubtype(): string + { + return 'mixed'; + } +} diff --git a/vendor/symfony/mime/Part/Multipart/RelatedPart.php b/vendor/symfony/mime/Part/Multipart/RelatedPart.php new file mode 100644 index 0000000..08fdd5f --- /dev/null +++ b/vendor/symfony/mime/Part/Multipart/RelatedPart.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part\Multipart; + +use Symfony\Component\Mime\Part\AbstractMultipartPart; +use Symfony\Component\Mime\Part\AbstractPart; + +/** + * @author Fabien Potencier + */ +final class RelatedPart extends AbstractMultipartPart +{ + private $mainPart; + + public function __construct(AbstractPart $mainPart, AbstractPart $part, AbstractPart ...$parts) + { + $this->mainPart = $mainPart; + $this->prepareParts($part, ...$parts); + + parent::__construct($part, ...$parts); + } + + public function getParts(): array + { + return array_merge([$this->mainPart], parent::getParts()); + } + + public function getMediaSubtype(): string + { + return 'related'; + } + + private function generateContentId(): string + { + return bin2hex(random_bytes(16)).'@symfony'; + } + + private function prepareParts(AbstractPart ...$parts): void + { + foreach ($parts as $part) { + if (!$part->getHeaders()->has('Content-ID')) { + $part->getHeaders()->setHeaderBody('Id', 'Content-ID', $this->generateContentId()); + } + } + } +} diff --git a/vendor/symfony/mime/Part/SMimePart.php b/vendor/symfony/mime/Part/SMimePart.php new file mode 100644 index 0000000..2a6fe3d --- /dev/null +++ b/vendor/symfony/mime/Part/SMimePart.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part; + +use Symfony\Component\Mime\Header\Headers; + +/** + * @author Sebastiaan Stok + */ +class SMimePart extends AbstractPart +{ + private $body; + private $type; + private $subtype; + private $parameters; + + /** + * @param iterable|string $body + */ + public function __construct($body, string $type, string $subtype, array $parameters) + { + parent::__construct(); + + if (!\is_string($body) && !is_iterable($body)) { + throw new \TypeError(sprintf('The body of "%s" must be a string or a iterable (got "%s").', self::class, get_debug_type($body))); + } + + $this->body = $body; + $this->type = $type; + $this->subtype = $subtype; + $this->parameters = $parameters; + } + + public function getMediaType(): string + { + return $this->type; + } + + public function getMediaSubtype(): string + { + return $this->subtype; + } + + public function bodyToString(): string + { + if (\is_string($this->body)) { + return $this->body; + } + + $body = ''; + foreach ($this->body as $chunk) { + $body .= $chunk; + } + $this->body = $body; + + return $body; + } + + public function bodyToIterable(): iterable + { + if (\is_string($this->body)) { + yield $this->body; + + return; + } + + $body = ''; + foreach ($this->body as $chunk) { + $body .= $chunk; + yield $chunk; + } + $this->body = $body; + } + + public function getPreparedHeaders(): Headers + { + $headers = clone parent::getHeaders(); + + $headers->setHeaderBody('Parameterized', 'Content-Type', $this->getMediaType().'/'.$this->getMediaSubtype()); + + foreach ($this->parameters as $name => $value) { + $headers->setHeaderParameter('Content-Type', $name, $value); + } + + return $headers; + } + + public function __sleep(): array + { + // convert iterables to strings for serialization + if (is_iterable($this->body)) { + $this->body = $this->bodyToString(); + } + + $this->_headers = $this->getHeaders(); + + return ['_headers', 'body', 'type', 'subtype', 'parameters']; + } + + public function __wakeup(): void + { + $r = new \ReflectionProperty(AbstractPart::class, 'headers'); + $r->setAccessible(true); + $r->setValue($this, $this->_headers); + unset($this->_headers); + } +} diff --git a/vendor/symfony/mime/Part/TextPart.php b/vendor/symfony/mime/Part/TextPart.php new file mode 100644 index 0000000..b985272 --- /dev/null +++ b/vendor/symfony/mime/Part/TextPart.php @@ -0,0 +1,206 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Part; + +use Symfony\Component\Mime\Encoder\Base64ContentEncoder; +use Symfony\Component\Mime\Encoder\ContentEncoderInterface; +use Symfony\Component\Mime\Encoder\EightBitContentEncoder; +use Symfony\Component\Mime\Encoder\QpContentEncoder; +use Symfony\Component\Mime\Exception\InvalidArgumentException; +use Symfony\Component\Mime\Header\Headers; + +/** + * @author Fabien Potencier + */ +class TextPart extends AbstractPart +{ + private static $encoders = []; + + private $body; + private $charset; + private $subtype; + private $disposition; + private $name; + private $encoding; + private $seekable; + + /** + * @param resource|string $body + */ + public function __construct($body, ?string $charset = 'utf-8', $subtype = 'plain', string $encoding = null) + { + parent::__construct(); + + if (!\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body of "%s" must be a string or a resource (got "%s").', self::class, get_debug_type($body))); + } + + $this->body = $body; + $this->charset = $charset; + $this->subtype = $subtype; + $this->seekable = \is_resource($body) ? stream_get_meta_data($body)['seekable'] && 0 === fseek($body, 0, SEEK_CUR) : null; + + if (null === $encoding) { + $this->encoding = $this->chooseEncoding(); + } else { + if ('quoted-printable' !== $encoding && 'base64' !== $encoding && '8bit' !== $encoding) { + throw new InvalidArgumentException(sprintf('The encoding must be one of "quoted-printable", "base64", or "8bit" ("%s" given).', $encoding)); + } + $this->encoding = $encoding; + } + } + + public function getMediaType(): string + { + return 'text'; + } + + public function getMediaSubtype(): string + { + return $this->subtype; + } + + /** + * @param string $disposition one of attachment, inline, or form-data + * + * @return $this + */ + public function setDisposition(string $disposition) + { + $this->disposition = $disposition; + + return $this; + } + + /** + * Sets the name of the file (used by FormDataPart). + * + * @return $this + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + public function getBody(): string + { + if (null === $this->seekable) { + return $this->body; + } + + if ($this->seekable) { + rewind($this->body); + } + + return stream_get_contents($this->body) ?: ''; + } + + public function bodyToString(): string + { + return $this->getEncoder()->encodeString($this->getBody(), $this->charset); + } + + public function bodyToIterable(): iterable + { + if (null !== $this->seekable) { + if ($this->seekable) { + rewind($this->body); + } + yield from $this->getEncoder()->encodeByteStream($this->body); + } else { + yield $this->getEncoder()->encodeString($this->body); + } + } + + public function getPreparedHeaders(): Headers + { + $headers = parent::getPreparedHeaders(); + + $headers->setHeaderBody('Parameterized', 'Content-Type', $this->getMediaType().'/'.$this->getMediaSubtype()); + if ($this->charset) { + $headers->setHeaderParameter('Content-Type', 'charset', $this->charset); + } + if ($this->name) { + $headers->setHeaderParameter('Content-Type', 'name', $this->name); + } + $headers->setHeaderBody('Text', 'Content-Transfer-Encoding', $this->encoding); + + if (!$headers->has('Content-Disposition') && null !== $this->disposition) { + $headers->setHeaderBody('Parameterized', 'Content-Disposition', $this->disposition); + if ($this->name) { + $headers->setHeaderParameter('Content-Disposition', 'name', $this->name); + } + } + + return $headers; + } + + public function asDebugString(): string + { + $str = parent::asDebugString(); + if (null !== $this->charset) { + $str .= ' charset: '.$this->charset; + } + if (null !== $this->disposition) { + $str .= ' disposition: '.$this->disposition; + } + + return $str; + } + + private function getEncoder(): ContentEncoderInterface + { + if ('8bit' === $this->encoding) { + return self::$encoders[$this->encoding] ?? (self::$encoders[$this->encoding] = new EightBitContentEncoder()); + } + + if ('quoted-printable' === $this->encoding) { + return self::$encoders[$this->encoding] ?? (self::$encoders[$this->encoding] = new QpContentEncoder()); + } + + return self::$encoders[$this->encoding] ?? (self::$encoders[$this->encoding] = new Base64ContentEncoder()); + } + + private function chooseEncoding(): string + { + if (null === $this->charset) { + return 'base64'; + } + + return 'quoted-printable'; + } + + /** + * @return array + */ + public function __sleep() + { + // convert resources to strings for serialization + if (null !== $this->seekable) { + $this->body = $this->getBody(); + } + + $this->_headers = $this->getHeaders(); + + return ['_headers', 'body', 'charset', 'subtype', 'disposition', 'name', 'encoding']; + } + + public function __wakeup() + { + $r = new \ReflectionProperty(AbstractPart::class, 'headers'); + $r->setAccessible(true); + $r->setValue($this, $this->_headers); + unset($this->_headers); + } +} diff --git a/vendor/symfony/mime/README.md b/vendor/symfony/mime/README.md new file mode 100644 index 0000000..4d565c9 --- /dev/null +++ b/vendor/symfony/mime/README.md @@ -0,0 +1,13 @@ +MIME Component +============== + +The MIME component allows manipulating MIME messages. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/mime.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/mime/RawMessage.php b/vendor/symfony/mime/RawMessage.php new file mode 100644 index 0000000..79a27e9 --- /dev/null +++ b/vendor/symfony/mime/RawMessage.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime; + +use Symfony\Component\Mime\Exception\LogicException; + +/** + * @author Fabien Potencier + */ +class RawMessage implements \Serializable +{ + private $message; + + /** + * @param iterable|string $message + */ + public function __construct($message) + { + $this->message = $message; + } + + public function toString(): string + { + if (\is_string($this->message)) { + return $this->message; + } + + return $this->message = implode('', iterator_to_array($this->message, false)); + } + + public function toIterable(): iterable + { + if (\is_string($this->message)) { + yield $this->message; + + return; + } + + $message = ''; + foreach ($this->message as $chunk) { + $message .= $chunk; + yield $chunk; + } + $this->message = $message; + } + + /** + * @throws LogicException if the message is not valid + */ + public function ensureValidity() + { + } + + /** + * @internal + */ + final public function serialize(): string + { + return serialize($this->__serialize()); + } + + /** + * @internal + */ + final public function unserialize($serialized) + { + $this->__unserialize(unserialize($serialized)); + } + + public function __serialize(): array + { + return [$this->message]; + } + + public function __unserialize(array $data): void + { + [$this->message] = $data; + } +} diff --git a/vendor/symfony/mime/Resources/bin/update_mime_types.php b/vendor/symfony/mime/Resources/bin/update_mime_types.php new file mode 100644 index 0000000..74a9449 --- /dev/null +++ b/vendor/symfony/mime/Resources/bin/update_mime_types.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// load new map +$data = file_get_contents('https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types'); +$new = []; +foreach (explode("\n", $data) as $line) { + if (!$line || '#' == $line[0]) { + continue; + } + $mimeType = substr($line, 0, strpos($line, "\t")); + $extensions = explode(' ', substr($line, strrpos($line, "\t") + 1)); + $new[$mimeType] = $extensions; +} + +$xml = simplexml_load_string(file_get_contents('https://raw.github.com/minad/mimemagic/master/script/freedesktop.org.xml')); +foreach ($xml as $node) { + $exts = []; + foreach ($node->glob as $glob) { + $pattern = (string) $glob['pattern']; + if ('*' != $pattern[0] || '.' != $pattern[1]) { + continue; + } + + $exts[] = substr($pattern, 2); + } + + if (!$exts) { + continue; + } + + $mt = strtolower((string) $node['type']); + $new[$mt] = array_merge($new[$mt] ?? [], $exts); + foreach ($node->alias as $alias) { + $mt = strtolower((string) $alias['type']); + $new[$mt] = array_merge($new[$mt] ?? [], $exts); + } +} + +// load current map +$data = file_get_contents($output = __DIR__.'/../../MimeTypes.php'); +$current = []; +$pre = ''; +$post = ''; +foreach (explode("\n", $data) as $line) { + if (!preg_match("{^ '([^']+/[^']+)' => \['(.+)'\],$}", $line, $matches)) { + if (!$current) { + $pre .= $line."\n"; + } else { + $post .= $line."\n"; + } + continue; + } + $current[$matches[1]] = explode("', '", $matches[2]); +} + +// we merge the 2 maps (we never remove old mime types) +$map = array_replace_recursive($current, $new); +ksort($map); + +$data = $pre; +foreach ($map as $mimeType => $exts) { + $data .= sprintf(" '%s' => ['%s'],\n", $mimeType, implode("', '", array_unique($exts))); +} +$data .= $post; + +// reverse map +// we prefill the extensions with some preferences for content-types +$exts = [ + 'aif' => ['audio/x-aiff'], + 'aiff' => ['audio/x-aiff'], + 'aps' => ['application/postscript'], + 'avi' => ['video/avi'], + 'bmp' => ['image/bmp'], + 'bz2' => ['application/x-bz2'], + 'css' => ['text/css'], + 'csv' => ['text/csv'], + 'dmg' => ['application/x-apple-diskimage'], + 'doc' => ['application/msword'], + 'docx' => ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'], + 'eml' => ['message/rfc822'], + 'exe' => ['application/x-ms-dos-executable'], + 'flv' => ['video/x-flv'], + 'gif' => ['image/gif'], + 'gz' => ['application/x-gzip'], + 'hqx' => ['application/stuffit'], + 'htm' => ['text/html'], + 'html' => ['text/html'], + 'jar' => ['application/x-java-archive'], + 'jpeg' => ['image/jpeg'], + 'jpg' => ['image/jpeg'], + 'js' => ['text/javascript'], + 'm3u' => ['audio/x-mpegurl'], + 'm4a' => ['audio/mp4'], + 'mdb' => ['application/x-msaccess'], + 'mid' => ['audio/midi'], + 'midi' => ['audio/midi'], + 'mov' => ['video/quicktime'], + 'mp3' => ['audio/mpeg'], + 'mp4' => ['video/mp4'], + 'mpeg' => ['video/mpeg'], + 'mpg' => ['video/mpeg'], + 'ogg' => ['audio/ogg'], + 'pdf' => ['application/pdf'], + 'php' => ['application/x-php'], + 'php3' => ['application/x-php'], + 'php4' => ['application/x-php'], + 'php5' => ['application/x-php'], + 'png' => ['image/png'], + 'ppt' => ['application/vnd.ms-powerpoint'], + 'pptx' => ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], + 'ps' => ['application/postscript'], + 'rar' => ['application/x-rar-compressed'], + 'rtf' => ['application/rtf'], + 'sit' => ['application/x-stuffit'], + 'svg' => ['image/svg+xml'], + 'tar' => ['application/x-tar'], + 'tif' => ['image/tiff'], + 'tiff' => ['image/tiff'], + 'ttf' => ['application/x-font-truetype'], + 'txt' => ['text/plain'], + 'vcf' => ['text/x-vcard'], + 'wav' => ['audio/wav'], + 'wma' => ['audio/x-ms-wma'], + 'wmv' => ['audio/x-ms-wmv'], + 'xls' => ['application/vnd.ms-excel'], + 'xlsx' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], + 'xml' => ['application/xml'], + 'zip' => ['application/zip'], +]; +foreach ($map as $mimeType => $extensions) { + foreach ($extensions as $extension) { + $exts[$extension][] = $mimeType; + } +} +ksort($exts); + +$updated = ''; +$state = 0; +foreach (explode("\n", $data) as $line) { + if (!preg_match("{^ '([^'/]+)' => \['(.+)'\],$}", $line, $matches)) { + if (1 === $state) { + $state = 2; + foreach ($exts as $ext => $mimeTypes) { + $updated .= sprintf(" '%s' => ['%s'],\n", $ext, implode("', '", array_unique($mimeTypes))); + } + } + $updated .= $line."\n"; + continue; + } + $state = 1; +} + +$updated = preg_replace('{Updated from upstream on .+?\.}', 'Updated from upstream on '.date('Y-m-d'), $updated, -1); + +file_put_contents($output, rtrim($updated, "\n")."\n"); + +echo "Done.\n"; diff --git a/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php b/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php new file mode 100644 index 0000000..c751c3d --- /dev/null +++ b/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Mime\Header\MailboxHeader; +use Symfony\Component\Mime\Header\MailboxListHeader; +use Symfony\Component\Mime\RawMessage; + +final class EmailAddressContains extends Constraint +{ + private $headerName; + private $expectedValue; + + public function __construct(string $headerName, string $expectedValue) + { + $this->headerName = $headerName; + $this->expectedValue = $expectedValue; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('contains address "%s" with value "%s"', $this->headerName, $this->expectedValue); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function matches($message): bool + { + if (RawMessage::class === \get_class($message)) { + throw new \LogicException('Unable to test a message address on a RawMessage instance.'); + } + + $header = $message->getHeaders()->get($this->headerName); + if ($header instanceof MailboxHeader) { + return $this->expectedValue === $header->getAddress()->getAddress(); + } elseif ($header instanceof MailboxListHeader) { + foreach ($header->getAddresses() as $address) { + if ($this->expectedValue === $address->getAddress()) { + return true; + } + } + + return false; + } + + throw new \LogicException(sprintf('Unable to test a message address on a non-address header.')); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function failureDescription($message): string + { + return sprintf('the Email %s (value is %s)', $this->toString(), $message->getHeaders()->get($this->headerName)->getBodyAsString()); + } +} diff --git a/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php b/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php new file mode 100644 index 0000000..c0adbe3 --- /dev/null +++ b/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Mime\Message; +use Symfony\Component\Mime\RawMessage; + +final class EmailAttachmentCount extends Constraint +{ + private $expectedValue; + private $transport; + + public function __construct(int $expectedValue, string $transport = null) + { + $this->expectedValue = $expectedValue; + $this->transport = $transport; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('has sent "%d" attachment(s)', $this->expectedValue); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function matches($message): bool + { + if (RawMessage::class === \get_class($message) || Message::class === \get_class($message)) { + throw new \LogicException('Unable to test a message attachment on a RawMessage or Message instance.'); + } + + return $this->expectedValue === \count($message->getAttachments()); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function failureDescription($message): string + { + return 'the Email '.$this->toString(); + } +} diff --git a/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php b/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php new file mode 100644 index 0000000..a29f835 --- /dev/null +++ b/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Mime\RawMessage; + +final class EmailHasHeader extends Constraint +{ + private $headerName; + + public function __construct(string $headerName) + { + $this->headerName = $headerName; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('has header "%s"', $this->headerName); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function matches($message): bool + { + if (RawMessage::class === \get_class($message)) { + throw new \LogicException('Unable to test a message header on a RawMessage instance.'); + } + + return $message->getHeaders()->has($this->headerName); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function failureDescription($message): string + { + return 'the Email '.$this->toString(); + } +} diff --git a/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php b/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php new file mode 100644 index 0000000..bc7e330 --- /dev/null +++ b/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Mime\RawMessage; + +final class EmailHeaderSame extends Constraint +{ + private $headerName; + private $expectedValue; + + public function __construct(string $headerName, string $expectedValue) + { + $this->headerName = $headerName; + $this->expectedValue = $expectedValue; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('has header "%s" with value "%s"', $this->headerName, $this->expectedValue); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function matches($message): bool + { + if (RawMessage::class === \get_class($message)) { + throw new \LogicException('Unable to test a message header on a RawMessage instance.'); + } + + return $this->expectedValue === $message->getHeaders()->get($this->headerName)->getBodyAsString(); + } + + /** + * @param RawMessage $message + * + * {@inheritdoc} + */ + protected function failureDescription($message): string + { + return sprintf('the Email %s (value is %s)', $this->toString(), $message->getHeaders()->get($this->headerName)->getBodyAsString()); + } +} diff --git a/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php b/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php new file mode 100644 index 0000000..3c61376 --- /dev/null +++ b/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Mime\Message; +use Symfony\Component\Mime\RawMessage; + +final class EmailHtmlBodyContains extends Constraint +{ + private $expectedText; + + public function __construct(string $expectedText) + { + $this->expectedText = $expectedText; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('contains "%s"', $this->expectedText); + } + + /** + * {@inheritdoc} + * + * @param RawMessage $message + */ + protected function matches($message): bool + { + if (RawMessage::class === \get_class($message) || Message::class === \get_class($message)) { + throw new \LogicException('Unable to test a message HTML body on a RawMessage or Message instance.'); + } + + return false !== mb_strpos($message->getHtmlBody(), $this->expectedText); + } + + /** + * {@inheritdoc} + * + * @param RawMessage $message + */ + protected function failureDescription($message): string + { + return 'the Email HTML body '.$this->toString(); + } +} diff --git a/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php b/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php new file mode 100644 index 0000000..063d963 --- /dev/null +++ b/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mime\Test\Constraint; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\Mime\Message; +use Symfony\Component\Mime\RawMessage; + +final class EmailTextBodyContains extends Constraint +{ + private $expectedText; + + public function __construct(string $expectedText) + { + $this->expectedText = $expectedText; + } + + /** + * {@inheritdoc} + */ + public function toString(): string + { + return sprintf('contains "%s"', $this->expectedText); + } + + /** + * {@inheritdoc} + * + * @param RawMessage $message + */ + protected function matches($message): bool + { + if (RawMessage::class === \get_class($message) || Message::class === \get_class($message)) { + throw new \LogicException('Unable to test a message text body on a RawMessage or Message instance.'); + } + + return false !== mb_strpos($message->getTextBody(), $this->expectedText); + } + + /** + * {@inheritdoc} + * + * @param RawMessage $message + */ + protected function failureDescription($message): string + { + return 'the Email text body '.$this->toString(); + } +} diff --git a/vendor/symfony/mime/composer.json b/vendor/symfony/mime/composer.json new file mode 100644 index 0000000..2181eaf --- /dev/null +++ b/vendor/symfony/mime/composer.json @@ -0,0 +1,43 @@ +{ + "name": "symfony/mime", + "type": "library", + "description": "A library to manipulate MIME messages", + "keywords": ["mime", "mime-type"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^4.4|^5.0" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Mime\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000..58414dc --- /dev/null +++ b/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,227 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param string|int $int + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 0000000..3f853aa --- /dev/null +++ b/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 0000000..8add1ab --- /dev/null +++ b/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000..8d6fc4b --- /dev/null +++ b/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 0000000..90108c6 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": ["polyfill", "compatibility", "portable", "ctype"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-iconv/Iconv.php b/vendor/symfony/polyfill-iconv/Iconv.php new file mode 100644 index 0000000..77e7ca0 --- /dev/null +++ b/vendor/symfony/polyfill-iconv/Iconv.php @@ -0,0 +1,741 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Iconv; + +/** + * iconv implementation in pure PHP, UTF-8 centric. + * + * Implemented: + * - iconv - Convert string to requested character encoding + * - iconv_mime_decode - Decodes a MIME header field + * - iconv_mime_decode_headers - Decodes multiple MIME header fields at once + * - iconv_get_encoding - Retrieve internal configuration variables of iconv extension + * - iconv_set_encoding - Set current setting for character encoding conversion + * - iconv_mime_encode - Composes a MIME header field + * - iconv_strlen - Returns the character count of string + * - iconv_strpos - Finds position of first occurrence of a needle within a haystack + * - iconv_strrpos - Finds the last occurrence of a needle within a haystack + * - iconv_substr - Cut out part of a string + * + * Charsets available for conversion are defined by files + * in the charset/ directory and by Iconv::$alias below. + * You're welcome to send back any addition you make. + * + * @author Nicolas Grekas + * + * @internal + */ +final class Iconv +{ + const ERROR_ILLEGAL_CHARACTER = 'iconv(): Detected an illegal character in input string'; + const ERROR_WRONG_CHARSET = 'iconv(): Wrong charset, conversion from `%s\' to `%s\' is not allowed'; + + public static $inputEncoding = 'utf-8'; + public static $outputEncoding = 'utf-8'; + public static $internalEncoding = 'utf-8'; + + private static $alias = array( + 'utf8' => 'utf-8', + 'ascii' => 'us-ascii', + 'tis-620' => 'iso-8859-11', + 'cp1250' => 'windows-1250', + 'cp1251' => 'windows-1251', + 'cp1252' => 'windows-1252', + 'cp1253' => 'windows-1253', + 'cp1254' => 'windows-1254', + 'cp1255' => 'windows-1255', + 'cp1256' => 'windows-1256', + 'cp1257' => 'windows-1257', + 'cp1258' => 'windows-1258', + 'shift-jis' => 'cp932', + 'shift_jis' => 'cp932', + 'latin1' => 'iso-8859-1', + 'latin2' => 'iso-8859-2', + 'latin3' => 'iso-8859-3', + 'latin4' => 'iso-8859-4', + 'latin5' => 'iso-8859-9', + 'latin6' => 'iso-8859-10', + 'latin7' => 'iso-8859-13', + 'latin8' => 'iso-8859-14', + 'latin9' => 'iso-8859-15', + 'latin10' => 'iso-8859-16', + 'iso8859-1' => 'iso-8859-1', + 'iso8859-2' => 'iso-8859-2', + 'iso8859-3' => 'iso-8859-3', + 'iso8859-4' => 'iso-8859-4', + 'iso8859-5' => 'iso-8859-5', + 'iso8859-6' => 'iso-8859-6', + 'iso8859-7' => 'iso-8859-7', + 'iso8859-8' => 'iso-8859-8', + 'iso8859-9' => 'iso-8859-9', + 'iso8859-10' => 'iso-8859-10', + 'iso8859-11' => 'iso-8859-11', + 'iso8859-12' => 'iso-8859-12', + 'iso8859-13' => 'iso-8859-13', + 'iso8859-14' => 'iso-8859-14', + 'iso8859-15' => 'iso-8859-15', + 'iso8859-16' => 'iso-8859-16', + 'iso_8859-1' => 'iso-8859-1', + 'iso_8859-2' => 'iso-8859-2', + 'iso_8859-3' => 'iso-8859-3', + 'iso_8859-4' => 'iso-8859-4', + 'iso_8859-5' => 'iso-8859-5', + 'iso_8859-6' => 'iso-8859-6', + 'iso_8859-7' => 'iso-8859-7', + 'iso_8859-8' => 'iso-8859-8', + 'iso_8859-9' => 'iso-8859-9', + 'iso_8859-10' => 'iso-8859-10', + 'iso_8859-11' => 'iso-8859-11', + 'iso_8859-12' => 'iso-8859-12', + 'iso_8859-13' => 'iso-8859-13', + 'iso_8859-14' => 'iso-8859-14', + 'iso_8859-15' => 'iso-8859-15', + 'iso_8859-16' => 'iso-8859-16', + 'iso88591' => 'iso-8859-1', + 'iso88592' => 'iso-8859-2', + 'iso88593' => 'iso-8859-3', + 'iso88594' => 'iso-8859-4', + 'iso88595' => 'iso-8859-5', + 'iso88596' => 'iso-8859-6', + 'iso88597' => 'iso-8859-7', + 'iso88598' => 'iso-8859-8', + 'iso88599' => 'iso-8859-9', + 'iso885910' => 'iso-8859-10', + 'iso885911' => 'iso-8859-11', + 'iso885912' => 'iso-8859-12', + 'iso885913' => 'iso-8859-13', + 'iso885914' => 'iso-8859-14', + 'iso885915' => 'iso-8859-15', + 'iso885916' => 'iso-8859-16', + ); + private static $translitMap = array(); + private static $convertMap = array(); + private static $errorHandler; + private static $lastError; + + private static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); + private static $isValidUtf8; + + public static function iconv($inCharset, $outCharset, $str) + { + $str = (string) $str; + if ('' === $str) { + return ''; + } + + // Prepare for //IGNORE and //TRANSLIT + + $translit = $ignore = ''; + + $outCharset = strtolower($outCharset); + $inCharset = strtolower($inCharset); + + if ('' === $outCharset) { + $outCharset = 'iso-8859-1'; + } + if ('' === $inCharset) { + $inCharset = 'iso-8859-1'; + } + + do { + $loop = false; + + if ('//translit' === substr($outCharset, -10)) { + $loop = $translit = true; + $outCharset = substr($outCharset, 0, -10); + } + + if ('//ignore' === substr($outCharset, -8)) { + $loop = $ignore = true; + $outCharset = substr($outCharset, 0, -8); + } + } while ($loop); + + do { + $loop = false; + + if ('//translit' === substr($inCharset, -10)) { + $loop = true; + $inCharset = substr($inCharset, 0, -10); + } + + if ('//ignore' === substr($inCharset, -8)) { + $loop = true; + $inCharset = substr($inCharset, 0, -8); + } + } while ($loop); + + if (isset(self::$alias[$inCharset])) { + $inCharset = self::$alias[$inCharset]; + } + if (isset(self::$alias[$outCharset])) { + $outCharset = self::$alias[$outCharset]; + } + + // Load charset maps + + if (('utf-8' !== $inCharset && !self::loadMap('from.', $inCharset, $inMap)) + || ('utf-8' !== $outCharset && !self::loadMap('to.', $outCharset, $outMap))) { + trigger_error(sprintf(self::ERROR_WRONG_CHARSET, $inCharset, $outCharset)); + + return false; + } + + if ('utf-8' !== $inCharset) { + // Convert input to UTF-8 + $result = ''; + if (self::mapToUtf8($result, $inMap, $str, $ignore)) { + $str = $result; + } else { + $str = false; + } + self::$isValidUtf8 = true; + } else { + self::$isValidUtf8 = preg_match('//u', $str); + + if (!self::$isValidUtf8 && !$ignore) { + trigger_error(self::ERROR_ILLEGAL_CHARACTER); + + return false; + } + + if ('utf-8' === $outCharset) { + // UTF-8 validation + $str = self::utf8ToUtf8($str, $ignore); + } + } + + if ('utf-8' !== $outCharset && false !== $str) { + // Convert output to UTF-8 + $result = ''; + if (self::mapFromUtf8($result, $outMap, $str, $ignore, $translit)) { + return $result; + } + + return false; + } + + return $str; + } + + public static function iconv_mime_decode_headers($str, $mode = 0, $charset = null) + { + if (null === $charset) { + $charset = self::$internalEncoding; + } + + if (false !== strpos($str, "\r")) { + $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n"); + } + $str = explode("\n\n", $str, 2); + + $headers = array(); + + $str = preg_split('/\n(?![ \t])/', $str[0]); + foreach ($str as $str) { + $str = self::iconv_mime_decode($str, $mode, $charset); + if (false === $str) { + return false; + } + $str = explode(':', $str, 2); + + if (2 === \count($str)) { + if (isset($headers[$str[0]])) { + if (!\is_array($headers[$str[0]])) { + $headers[$str[0]] = array($headers[$str[0]]); + } + $headers[$str[0]][] = ltrim($str[1]); + } else { + $headers[$str[0]] = ltrim($str[1]); + } + } + } + + return $headers; + } + + public static function iconv_mime_decode($str, $mode = 0, $charset = null) + { + if (null === $charset) { + $charset = self::$internalEncoding; + } + if (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) { + $charset .= '//IGNORE'; + } + + if (false !== strpos($str, "\r")) { + $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n"); + } + $str = preg_split('/\n(?![ \t])/', rtrim($str), 2); + $str = preg_replace('/[ \t]*\n[ \t]+/', ' ', rtrim($str[0])); + $str = preg_split('/=\?([^?]+)\?([bqBQ])\?(.*?)\?=/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); + + $result = self::iconv('utf-8', $charset, $str[0]); + if (false === $result) { + return false; + } + + $i = 1; + $len = \count($str); + + while ($i < $len) { + $c = strtolower($str[$i]); + if ((ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) + && 'utf-8' !== $c + && !isset(self::$alias[$c]) + && !self::loadMap('from.', $c, $d)) { + $d = false; + } elseif ('B' === strtoupper($str[$i + 1])) { + $d = base64_decode($str[$i + 2]); + } else { + $d = rawurldecode(strtr(str_replace('%', '%25', $str[$i + 2]), '=_', '% ')); + } + + if (false !== $d) { + if ('' !== $d) { + if ('' === $d = self::iconv($c, $charset, $d)) { + $str[$i + 3] = substr($str[$i + 3], 1); + } else { + $result .= $d; + } + } + $d = self::iconv('utf-8', $charset, $str[$i + 3]); + if ('' !== trim($d)) { + $result .= $d; + } + } elseif (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) { + $result .= "=?{$str[$i]}?{$str[$i + 1]}?{$str[$i + 2]}?={$str[$i + 3]}"; + } else { + $result = false; + break; + } + + $i += 4; + } + + return $result; + } + + public static function iconv_get_encoding($type = 'all') + { + switch ($type) { + case 'input_encoding': return self::$inputEncoding; + case 'output_encoding': return self::$outputEncoding; + case 'internal_encoding': return self::$internalEncoding; + } + + return array( + 'input_encoding' => self::$inputEncoding, + 'output_encoding' => self::$outputEncoding, + 'internal_encoding' => self::$internalEncoding, + ); + } + + public static function iconv_set_encoding($type, $charset) + { + switch ($type) { + case 'input_encoding': self::$inputEncoding = $charset; break; + case 'output_encoding': self::$outputEncoding = $charset; break; + case 'internal_encoding': self::$internalEncoding = $charset; break; + + default: return false; + } + + return true; + } + + public static function iconv_mime_encode($fieldName, $fieldValue, $pref = null) + { + if (!\is_array($pref)) { + $pref = array(); + } + + $pref += array( + 'scheme' => 'B', + 'input-charset' => self::$internalEncoding, + 'output-charset' => self::$internalEncoding, + 'line-length' => 76, + 'line-break-chars' => "\r\n", + ); + + if (preg_match('/[\x80-\xFF]/', $fieldName)) { + $fieldName = ''; + } + + $scheme = strtoupper(substr($pref['scheme'], 0, 1)); + $in = strtolower($pref['input-charset']); + $out = strtolower($pref['output-charset']); + + if ('utf-8' !== $in && false === $fieldValue = self::iconv($in, 'utf-8', $fieldValue)) { + return false; + } + + preg_match_all('/./us', $fieldValue, $chars); + + $chars = isset($chars[0]) ? $chars[0] : array(); + + $lineBreak = (int) $pref['line-length']; + $lineStart = "=?{$pref['output-charset']}?{$scheme}?"; + $lineLength = \strlen($fieldName) + 2 + \strlen($lineStart) + 2; + $lineOffset = \strlen($lineStart) + 3; + $lineData = ''; + + $fieldValue = array(); + + $Q = 'Q' === $scheme; + + foreach ($chars as $c) { + if ('utf-8' !== $out && false === $c = self::iconv('utf-8', $out, $c)) { + return false; + } + + $o = $Q + ? $c = preg_replace_callback( + '/[=_\?\x00-\x1F\x80-\xFF]/', + array(__CLASS__, 'qpByteCallback'), + $c + ) + : base64_encode($lineData.$c); + + if (isset($o[$lineBreak - $lineLength])) { + if (!$Q) { + $lineData = base64_encode($lineData); + } + $fieldValue[] = $lineStart.$lineData.'?='; + $lineLength = $lineOffset; + $lineData = ''; + } + + $lineData .= $c; + $Q && $lineLength += \strlen($c); + } + + if ('' !== $lineData) { + if (!$Q) { + $lineData = base64_encode($lineData); + } + $fieldValue[] = $lineStart.$lineData.'?='; + } + + return $fieldName.': '.implode($pref['line-break-chars'].' ', $fieldValue); + } + + public static function iconv_strlen($s, $encoding = null) + { + static $hasXml = null; + if (null === $hasXml) { + $hasXml = \extension_loaded('xml'); + } + + if ($hasXml) { + return self::strlen1($s, $encoding); + } + + return self::strlen2($s, $encoding); + } + + public static function strlen1($s, $encoding = null) + { + if (null === $encoding) { + $encoding = self::$internalEncoding; + } + if (0 !== stripos($encoding, 'utf-8') && false === $s = self::iconv($encoding, 'utf-8', $s)) { + return false; + } + + return \strlen(utf8_decode($s)); + } + + public static function strlen2($s, $encoding = null) + { + if (null === $encoding) { + $encoding = self::$internalEncoding; + } + if (0 !== stripos($encoding, 'utf-8') && false === $s = self::iconv($encoding, 'utf-8', $s)) { + return false; + } + + $ulenMask = self::$ulenMask; + + $i = 0; + $j = 0; + $len = \strlen($s); + + while ($i < $len) { + $u = $s[$i] & "\xF0"; + $i += isset($ulenMask[$u]) ? $ulenMask[$u] : 1; + ++$j; + } + + return $j; + } + + public static function iconv_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + if (null === $encoding) { + $encoding = self::$internalEncoding; + } + + if (0 !== stripos($encoding, 'utf-8')) { + if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) { + return false; + } + if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) { + return false; + } + } + + if ($offset = (int) $offset) { + $haystack = self::iconv_substr($haystack, $offset, 2147483647, 'utf-8'); + } + $pos = strpos($haystack, $needle); + + return false === $pos ? false : ($offset + ($pos ? self::iconv_strlen(substr($haystack, 0, $pos), 'utf-8') : 0)); + } + + public static function iconv_strrpos($haystack, $needle, $encoding = null) + { + if (null === $encoding) { + $encoding = self::$internalEncoding; + } + + if (0 !== stripos($encoding, 'utf-8')) { + if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) { + return false; + } + if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) { + return false; + } + } + + $pos = isset($needle[0]) ? strrpos($haystack, $needle) : false; + + return false === $pos ? false : self::iconv_strlen($pos ? substr($haystack, 0, $pos) : $haystack, 'utf-8'); + } + + public static function iconv_substr($s, $start, $length = 2147483647, $encoding = null) + { + if (null === $encoding) { + $encoding = self::$internalEncoding; + } + if (0 !== stripos($encoding, 'utf-8')) { + $encoding = null; + } elseif (false === $s = self::iconv($encoding, 'utf-8', $s)) { + return false; + } + + $s = (string) $s; + $slen = self::iconv_strlen($s, 'utf-8'); + $start = (int) $start; + + if (0 > $start) { + $start += $slen; + } + if (0 > $start) { + return false; + } + if ($start >= $slen) { + return false; + } + + $rx = $slen - $start; + + if (0 > $length) { + $length += $rx; + } + if (0 === $length) { + return ''; + } + if (0 > $length) { + return false; + } + + if ($length > $rx) { + $length = $rx; + } + + $rx = '/^'.($start ? self::pregOffset($start) : '').'('.self::pregOffset($length).')/u'; + + $s = preg_match($rx, $s, $s) ? $s[1] : ''; + + if (null === $encoding) { + return $s; + } + + return self::iconv('utf-8', $encoding, $s); + } + + private static function loadMap($type, $charset, &$map) + { + if (!isset(self::$convertMap[$type.$charset])) { + if (false === $map = self::getData($type.$charset)) { + if ('to.' === $type && self::loadMap('from.', $charset, $map)) { + $map = array_flip($map); + } else { + return false; + } + } + + self::$convertMap[$type.$charset] = $map; + } else { + $map = self::$convertMap[$type.$charset]; + } + + return true; + } + + private static function utf8ToUtf8($str, $ignore) + { + $ulenMask = self::$ulenMask; + $valid = self::$isValidUtf8; + + $u = $str; + $i = $j = 0; + $len = \strlen($str); + + while ($i < $len) { + if ($str[$i] < "\x80") { + $u[$j++] = $str[$i++]; + } else { + $ulen = $str[$i] & "\xF0"; + $ulen = isset($ulenMask[$ulen]) ? $ulenMask[$ulen] : 1; + $uchr = substr($str, $i, $ulen); + + if (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr))) { + if ($ignore) { + ++$i; + continue; + } + + trigger_error(self::ERROR_ILLEGAL_CHARACTER); + + return false; + } else { + $i += $ulen; + } + + $u[$j++] = $uchr[0]; + + isset($uchr[1]) && 0 !== ($u[$j++] = $uchr[1]) + && isset($uchr[2]) && 0 !== ($u[$j++] = $uchr[2]) + && isset($uchr[3]) && 0 !== ($u[$j++] = $uchr[3]); + } + } + + return substr($u, 0, $j); + } + + private static function mapToUtf8(&$result, array $map, $str, $ignore) + { + $len = \strlen($str); + for ($i = 0; $i < $len; ++$i) { + if (isset($str[$i + 1], $map[$str[$i].$str[$i + 1]])) { + $result .= $map[$str[$i].$str[++$i]]; + } elseif (isset($map[$str[$i]])) { + $result .= $map[$str[$i]]; + } elseif (!$ignore) { + trigger_error(self::ERROR_ILLEGAL_CHARACTER); + + return false; + } + } + + return true; + } + + private static function mapFromUtf8(&$result, array $map, $str, $ignore, $translit) + { + $ulenMask = self::$ulenMask; + $valid = self::$isValidUtf8; + + if ($translit && !self::$translitMap) { + self::$translitMap = self::getData('translit'); + } + + $i = 0; + $len = \strlen($str); + + while ($i < $len) { + if ($str[$i] < "\x80") { + $uchr = $str[$i++]; + } else { + $ulen = $str[$i] & "\xF0"; + $ulen = isset($ulenMask[$ulen]) ? $ulenMask[$ulen] : 1; + $uchr = substr($str, $i, $ulen); + + if ($ignore && (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr)))) { + ++$i; + continue; + } else { + $i += $ulen; + } + } + + if (isset($map[$uchr])) { + $result .= $map[$uchr]; + } elseif ($translit) { + if (isset(self::$translitMap[$uchr])) { + $uchr = self::$translitMap[$uchr]; + } elseif ($uchr >= "\xC3\x80") { + $uchr = \Normalizer::normalize($uchr, \Normalizer::NFD); + + if ($uchr[0] < "\x80") { + $uchr = $uchr[0]; + } elseif ($ignore) { + continue; + } else { + return false; + } + } elseif ($ignore) { + continue; + } else { + return false; + } + + $str = $uchr.substr($str, $i); + $len = \strlen($str); + $i = 0; + } elseif (!$ignore) { + return false; + } + } + + return true; + } + + private static function qpByteCallback(array $m) + { + return '='.strtoupper(dechex(\ord($m[0]))); + } + + private static function pregOffset($offset) + { + $rx = array(); + $offset = (int) $offset; + + while ($offset > 65535) { + $rx[] = '.{65535}'; + $offset -= 65535; + } + + return implode('', $rx).'.{'.$offset.'}'; + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/charset/'.$file.'.php')) { + return require $file; + } + + return false; + } +} diff --git a/vendor/symfony/polyfill-iconv/LICENSE b/vendor/symfony/polyfill-iconv/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-iconv/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-iconv/README.md b/vendor/symfony/polyfill-iconv/README.md new file mode 100644 index 0000000..b0c8984 --- /dev/null +++ b/vendor/symfony/polyfill-iconv/README.md @@ -0,0 +1,14 @@ +Symfony Polyfill / Iconv +======================== + +This component provides a native PHP implementation of the +[php.net/iconv](https://php.net/iconv) functions +(short of [`ob_iconv_handler`](https://php.net/ob-iconv-handler)). + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php new file mode 100644 index 0000000..b119854 --- /dev/null +++ b/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php @@ -0,0 +1,13719 @@ + ' ', + '¡A' => ',', + '¡B' => 'ã€', + '¡C' => '。', + '¡D' => '.', + '¡E' => '•', + '¡F' => 'ï¼›', + '¡G' => ':', + '¡H' => '?', + '¡I' => 'ï¼', + '¡J' => '︰', + '¡K' => '…', + '¡L' => '‥', + '¡M' => 'ï¹', + '¡N' => '、', + '¡O' => 'ï¹’', + '¡P' => '·', + '¡Q' => 'ï¹”', + '¡R' => '﹕', + '¡S' => 'ï¹–', + '¡T' => 'ï¹—', + '¡U' => '|', + '¡V' => '–', + '¡W' => '︱', + '¡X' => '—', + '¡Y' => '︳', + '¡Z' => '�', + '¡[' => '︴', + '¡\\' => 'ï¹', + '¡]' => '(', + '¡^' => ')', + '¡_' => '︵', + '¡`' => '︶', + '¡a' => 'ï½›', + '¡b' => 'ï½', + '¡c' => '︷', + '¡d' => '︸', + '¡e' => '〔', + '¡f' => '〕', + '¡g' => '︹', + '¡h' => '︺', + '¡i' => 'ã€', + '¡j' => '】', + '¡k' => '︻', + '¡l' => '︼', + '¡m' => '《', + '¡n' => '》', + '¡o' => '︽', + '¡p' => '︾', + '¡q' => '〈', + '¡r' => '〉', + '¡s' => '︿', + '¡t' => 'ï¹€', + '¡u' => '「', + '¡v' => 'ã€', + '¡w' => 'ï¹', + '¡x' => '﹂', + '¡y' => '『', + '¡z' => 'ã€', + '¡{' => '﹃', + '¡|' => '﹄', + '¡}' => 'ï¹™', + '¡~' => '﹚', + '¡¡' => 'ï¹›', + '¡¢' => '﹜', + '¡£' => 'ï¹', + '¡¤' => '﹞', + '¡¥' => '‘', + '¡¦' => '’', + '¡§' => '“', + '¡¨' => 'â€', + '¡©' => 'ã€', + '¡ª' => '〞', + '¡«' => '‵', + '¡¬' => '′', + '¡­' => '#', + '¡®' => '&', + '¡¯' => '*', + '¡°' => '※', + '¡±' => '§', + '¡²' => '〃', + '¡³' => 'â—‹', + '¡´' => 'â—', + '¡µ' => 'â–³', + '¡¶' => 'â–²', + '¡·' => 'â—Ž', + '¡¸' => '☆', + '¡¹' => '★', + '¡º' => 'â—‡', + '¡»' => 'â—†', + '¡¼' => 'â–¡', + '¡½' => 'â– ', + '¡¾' => 'â–½', + '¡¿' => 'â–¼', + '¡À' => '㊣', + '¡Á' => 'â„…', + '¡Â' => '‾', + '¡Ã' => '�', + '¡Ä' => '_', + '¡Å' => '�', + '¡Æ' => '﹉', + '¡Ç' => '﹊', + '¡È' => 'ï¹', + '¡É' => '﹎', + '¡Ê' => '﹋', + '¡Ë' => '﹌', + '¡Ì' => '﹟', + '¡Í' => 'ï¹ ', + '¡Î' => '﹡', + '¡Ï' => '+', + '¡Ð' => 'ï¼', + '¡Ñ' => '×', + '¡Ò' => '÷', + '¡Ó' => '±', + '¡Ô' => '√', + '¡Õ' => '<', + '¡Ö' => '>', + '¡×' => 'ï¼', + '¡Ø' => '≦', + '¡Ù' => '≧', + '¡Ú' => '≠', + '¡Û' => '∞', + '¡Ü' => '≒', + '¡Ý' => '≡', + '¡Þ' => 'ï¹¢', + '¡ß' => 'ï¹£', + '¡à' => '﹤', + '¡á' => 'ï¹¥', + '¡â' => '﹦', + '¡ã' => '∼', + '¡ä' => '∩', + '¡å' => '∪', + '¡æ' => '⊥', + '¡ç' => '∠', + '¡è' => '∟', + '¡é' => '⊿', + '¡ê' => 'ã’', + '¡ë' => 'ã‘', + '¡ì' => '∫', + '¡í' => '∮', + '¡î' => '∵', + '¡ï' => '∴', + '¡ð' => '♀', + '¡ñ' => '♂', + '¡ò' => 'â™', + '¡ó' => '☉', + '¡ô' => '↑', + '¡õ' => '↓', + '¡ö' => 'â†', + '¡÷' => '→', + '¡ø' => '↖', + '¡ù' => '↗', + '¡ú' => '↙', + '¡û' => '↘', + '¡ü' => '∥', + '¡ý' => '∣', + '¡þ' => '�', + '¢@' => '�', + '¢A' => 'ï¼', + '¢B' => 'ï¼¼', + '¢C' => '$', + '¢D' => 'Â¥', + '¢E' => '〒', + '¢F' => '¢', + '¢G' => '£', + '¢H' => 'ï¼…', + '¢I' => 'ï¼ ', + '¢J' => '℃', + '¢K' => '℉', + '¢L' => '﹩', + '¢M' => '﹪', + '¢N' => '﹫', + '¢O' => 'ã•', + '¢P' => '㎜', + '¢Q' => 'ãŽ', + '¢R' => '㎞', + '¢S' => 'ãŽ', + '¢T' => '㎡', + '¢U' => '㎎', + '¢V' => 'ãŽ', + '¢W' => 'ã„', + '¢X' => '°', + '¢Y' => 'å…™', + '¢Z' => 'å…›', + '¢[' => 'å…ž', + '¢\\' => 'å…', + '¢]' => 'å…¡', + '¢^' => 'å…£', + '¢_' => 'å—§', + '¢`' => 'ç“©', + '¢a' => '糎', + '¢b' => 'â–', + '¢c' => 'â–‚', + '¢d' => 'â–ƒ', + '¢e' => 'â–„', + '¢f' => 'â–…', + '¢g' => 'â–†', + '¢h' => 'â–‡', + '¢i' => 'â–ˆ', + '¢j' => 'â–', + '¢k' => 'â–Ž', + '¢l' => 'â–', + '¢m' => 'â–Œ', + '¢n' => 'â–‹', + '¢o' => 'â–Š', + '¢p' => 'â–‰', + '¢q' => '┼', + '¢r' => 'â”´', + '¢s' => '┬', + '¢t' => '┤', + '¢u' => '├', + '¢v' => 'â–”', + '¢w' => '─', + '¢x' => '│', + '¢y' => 'â–•', + '¢z' => '┌', + '¢{' => 'â”', + '¢|' => 'â””', + '¢}' => '┘', + '¢~' => 'â•­', + '¢¡' => 'â•®', + '¢¢' => 'â•°', + '¢£' => '╯', + '¢¤' => 'â•', + '¢¥' => '╞', + '¢¦' => '╪', + '¢§' => 'â•¡', + '¢¨' => 'â—¢', + '¢©' => 'â—£', + '¢ª' => 'â—¥', + '¢«' => 'â—¤', + '¢¬' => '╱', + '¢­' => '╲', + '¢®' => '╳', + '¢¯' => 'ï¼', + '¢°' => '1', + '¢±' => 'ï¼’', + '¢²' => '3', + '¢³' => 'ï¼”', + '¢´' => '5', + '¢µ' => 'ï¼–', + '¢¶' => 'ï¼—', + '¢·' => '8', + '¢¸' => 'ï¼™', + '¢¹' => 'â… ', + '¢º' => 'â…¡', + '¢»' => 'â…¢', + '¢¼' => 'â…£', + '¢½' => 'â…¤', + '¢¾' => 'â…¥', + '¢¿' => 'â…¦', + '¢À' => 'â…§', + '¢Á' => 'â…¨', + '¢Â' => 'â…©', + '¢Ã' => '〡', + '¢Ä' => '〢', + '¢Å' => '〣', + '¢Æ' => '〤', + '¢Ç' => '〥', + '¢È' => '〦', + '¢É' => '〧', + '¢Ê' => '〨', + '¢Ë' => '〩', + '¢Ì' => '�', + '¢Í' => 'å„', + '¢Î' => '�', + '¢Ï' => 'A', + '¢Ð' => 'ï¼¢', + '¢Ñ' => 'ï¼£', + '¢Ò' => 'D', + '¢Ó' => 'ï¼¥', + '¢Ô' => 'F', + '¢Õ' => 'ï¼§', + '¢Ö' => 'H', + '¢×' => 'I', + '¢Ø' => 'J', + '¢Ù' => 'K', + '¢Ú' => 'L', + '¢Û' => 'ï¼­', + '¢Ü' => 'ï¼®', + '¢Ý' => 'O', + '¢Þ' => 'ï¼°', + '¢ß' => 'ï¼±', + '¢à' => 'ï¼²', + '¢á' => 'ï¼³', + '¢â' => 'ï¼´', + '¢ã' => 'ï¼µ', + '¢ä' => 'ï¼¶', + '¢å' => 'ï¼·', + '¢æ' => 'X', + '¢ç' => 'ï¼¹', + '¢è' => 'Z', + '¢é' => 'ï½', + '¢ê' => 'b', + '¢ë' => 'c', + '¢ì' => 'd', + '¢í' => 'ï½…', + '¢î' => 'f', + '¢ï' => 'g', + '¢ð' => 'h', + '¢ñ' => 'i', + '¢ò' => 'j', + '¢ó' => 'k', + '¢ô' => 'l', + '¢õ' => 'ï½', + '¢ö' => 'n', + '¢÷' => 'ï½', + '¢ø' => 'ï½', + '¢ù' => 'q', + '¢ú' => 'ï½’', + '¢û' => 's', + '¢ü' => 'ï½”', + '¢ý' => 'u', + '¢þ' => 'ï½–', + '£@' => 'ï½—', + '£A' => 'x', + '£B' => 'ï½™', + '£C' => 'z', + '£D' => 'Α', + '£E' => 'Î’', + '£F' => 'Γ', + '£G' => 'Δ', + '£H' => 'Ε', + '£I' => 'Ζ', + '£J' => 'Η', + '£K' => 'Θ', + '£L' => 'Ι', + '£M' => 'Κ', + '£N' => 'Λ', + '£O' => 'Μ', + '£P' => 'Î', + '£Q' => 'Ξ', + '£R' => 'Ο', + '£S' => 'Π', + '£T' => 'Ρ', + '£U' => 'Σ', + '£V' => 'Τ', + '£W' => 'Î¥', + '£X' => 'Φ', + '£Y' => 'Χ', + '£Z' => 'Ψ', + '£[' => 'Ω', + '£\\' => 'α', + '£]' => 'β', + '£^' => 'γ', + '£_' => 'δ', + '£`' => 'ε', + '£a' => 'ζ', + '£b' => 'η', + '£c' => 'θ', + '£d' => 'ι', + '£e' => 'κ', + '£f' => 'λ', + '£g' => 'μ', + '£h' => 'ν', + '£i' => 'ξ', + '£j' => 'ο', + '£k' => 'Ï€', + '£l' => 'Ï', + '£m' => 'σ', + '£n' => 'Ï„', + '£o' => 'Ï…', + '£p' => 'φ', + '£q' => 'χ', + '£r' => 'ψ', + '£s' => 'ω', + '£t' => 'ã„…', + '£u' => 'ㄆ', + '£v' => 'ㄇ', + '£w' => 'ㄈ', + '£x' => 'ㄉ', + '£y' => 'ㄊ', + '£z' => 'ã„‹', + '£{' => 'ㄌ', + '£|' => 'ã„', + '£}' => 'ㄎ', + '£~' => 'ã„', + '£¡' => 'ã„', + '£¢' => 'ã„‘', + '££' => 'ã„’', + '£¤' => 'ã„“', + '£¥' => 'ã„”', + '£¦' => 'ã„•', + '£§' => 'ã„–', + '£¨' => 'ã„—', + '£©' => 'ㄘ', + '£ª' => 'ã„™', + '£«' => 'ㄚ', + '£¬' => 'ã„›', + '£­' => 'ㄜ', + '£®' => 'ã„', + '£¯' => 'ㄞ', + '£°' => 'ㄟ', + '£±' => 'ã„ ', + '£²' => 'ã„¡', + '£³' => 'ã„¢', + '£´' => 'ã„£', + '£µ' => 'ㄤ', + '£¶' => 'ã„¥', + '£·' => 'ㄦ', + '£¸' => 'ã„§', + '£¹' => 'ㄨ', + '£º' => 'ã„©', + '£»' => 'Ë™', + '£¼' => 'ˉ', + '£½' => 'ËŠ', + '£¾' => 'ˇ', + '£¿' => 'Ë‹', + '¤@' => '一', + '¤A' => 'ä¹™', + '¤B' => 'ä¸', + '¤C' => '七', + '¤D' => '乃', + '¤E' => 'ä¹', + '¤F' => '了', + '¤G' => '二', + '¤H' => '人', + '¤I' => 'å„¿', + '¤J' => 'å…¥', + '¤K' => 'å…«', + '¤L' => '几', + '¤M' => '刀', + '¤N' => 'åˆ', + '¤O' => '力', + '¤P' => '匕', + '¤Q' => 'å', + '¤R' => 'åœ', + '¤S' => 'åˆ', + '¤T' => '三', + '¤U' => '下', + '¤V' => '丈', + '¤W' => '上', + '¤X' => '丫', + '¤Y' => '丸', + '¤Z' => '凡', + '¤[' => 'ä¹…', + '¤\\' => '么', + '¤]' => '也', + '¤^' => '乞', + '¤_' => '于', + '¤`' => '亡', + '¤a' => 'å…€', + '¤b' => '刃', + '¤c' => '勺', + '¤d' => 'åƒ', + '¤e' => 'å‰', + '¤f' => 'å£', + '¤g' => '土', + '¤h' => '士', + '¤i' => '夕', + '¤j' => '大', + '¤k' => '女', + '¤l' => 'å­', + '¤m' => 'å­‘', + '¤n' => 'å­“', + '¤o' => '寸', + '¤p' => 'å°', + '¤q' => 'å°¢', + '¤r' => 'å°¸', + '¤s' => 'å±±', + '¤t' => 'å·', + '¤u' => 'å·¥', + '¤v' => 'å·±', + '¤w' => 'å·²', + '¤x' => 'å·³', + '¤y' => 'å·¾', + '¤z' => 'å¹²', + '¤{' => '廾', + '¤|' => '弋', + '¤}' => '弓', + '¤~' => 'æ‰', + '¤¡' => '丑', + '¤¢' => 'ä¸', + '¤£' => 'ä¸', + '¤¤' => '中', + '¤¥' => '丰', + '¤¦' => '丹', + '¤§' => '之', + '¤¨' => 'å°¹', + '¤©' => '予', + '¤ª' => '云', + '¤«' => '井', + '¤¬' => '互', + '¤­' => '五', + '¤®' => '亢', + '¤¯' => 'ä»', + '¤°' => '什', + '¤±' => '仃', + '¤²' => '仆', + '¤³' => '仇', + '¤´' => 'ä»', + '¤µ' => '今', + '¤¶' => '介', + '¤·' => '仄', + '¤¸' => 'å…ƒ', + '¤¹' => 'å…', + '¤º' => 'å…§', + '¤»' => 'å…­', + '¤¼' => 'å…®', + '¤½' => 'å…¬', + '¤¾' => '冗', + '¤¿' => '凶', + '¤À' => '分', + '¤Á' => '切', + '¤Â' => '刈', + '¤Ã' => 'å‹»', + '¤Ä' => '勾', + '¤Å' => 'å‹¿', + '¤Æ' => '化', + '¤Ç' => '匹', + '¤È' => 'åˆ', + '¤É' => 'å‡', + '¤Ê' => 'å…', + '¤Ë' => 'åž', + '¤Ì' => '厄', + '¤Í' => 'å‹', + '¤Î' => 'åŠ', + '¤Ï' => 'å', + '¤Ð' => '壬', + '¤Ñ' => '天', + '¤Ò' => '夫', + '¤Ó' => '太', + '¤Ô' => '夭', + '¤Õ' => 'å­”', + '¤Ö' => 'å°‘', + '¤×' => 'å°¤', + '¤Ø' => 'å°º', + '¤Ù' => '屯', + '¤Ú' => 'å·´', + '¤Û' => 'å¹»', + '¤Ü' => '廿', + '¤Ý' => 'å¼”', + '¤Þ' => '引', + '¤ß' => '心', + '¤à' => '戈', + '¤á' => '戶', + '¤â' => '手', + '¤ã' => '扎', + '¤ä' => '支', + '¤å' => 'æ–‡', + '¤æ' => 'æ–—', + '¤ç' => 'æ–¤', + '¤è' => 'æ–¹', + '¤é' => 'æ—¥', + '¤ê' => 'æ›°', + '¤ë' => '月', + '¤ì' => '木', + '¤í' => '欠', + '¤î' => 'æ­¢', + '¤ï' => 'æ­¹', + '¤ð' => '毋', + '¤ñ' => '比', + '¤ò' => '毛', + '¤ó' => 'æ°', + '¤ô' => 'æ°´', + '¤õ' => 'ç«', + '¤ö' => '爪', + '¤÷' => '父', + '¤ø' => '爻', + '¤ù' => '片', + '¤ú' => '牙', + '¤û' => '牛', + '¤ü' => '犬', + '¤ý' => '王', + '¤þ' => '丙', + '¥@' => '世', + '¥A' => '丕', + '¥B' => '且', + '¥C' => '丘', + '¥D' => '主', + '¥E' => 'ä¹', + '¥F' => 'ä¹', + '¥G' => '乎', + '¥H' => '以', + '¥I' => '付', + '¥J' => 'ä»”', + '¥K' => '仕', + '¥L' => 'ä»–', + '¥M' => 'ä»—', + '¥N' => '代', + '¥O' => '令', + '¥P' => 'ä»™', + '¥Q' => '仞', + '¥R' => 'å……', + '¥S' => 'å…„', + '¥T' => '冉', + '¥U' => '冊', + '¥V' => '冬', + '¥W' => '凹', + '¥X' => '出', + '¥Y' => '凸', + '¥Z' => '刊', + '¥[' => '加', + '¥\\' => '功', + '¥]' => '包', + '¥^' => '匆', + '¥_' => '北', + '¥`' => 'åŒ', + '¥a' => '仟', + '¥b' => 'åŠ', + '¥c' => 'å‰', + '¥d' => 'å¡', + '¥e' => 'å ', + '¥f' => 'å¯', + '¥g' => 'å®', + '¥h' => '去', + '¥i' => 'å¯', + '¥j' => 'å¤', + '¥k' => 'å³', + '¥l' => 'å¬', + '¥m' => 'å®', + '¥n' => 'å©', + '¥o' => 'å¨', + '¥p' => 'å¼', + '¥q' => 'å¸', + '¥r' => 'åµ', + '¥s' => 'å«', + '¥t' => 'å¦', + '¥u' => 'åª', + '¥v' => 'å²', + '¥w' => 'å±', + '¥x' => 'å°', + '¥y' => 'å¥', + '¥z' => 'å­', + '¥{' => 'å»', + '¥|' => 'å››', + '¥}' => '囚', + '¥~' => '外', + '¥¡' => '央', + '¥¢' => '失', + '¥£' => '奴', + '¥¤' => '奶', + '¥¥' => 'å­•', + '¥¦' => '它', + '¥§' => 'å°¼', + '¥¨' => 'å·¨', + '¥©' => 'å·§', + '¥ª' => 'å·¦', + '¥«' => '市', + '¥¬' => '布', + '¥­' => 'å¹³', + '¥®' => 'å¹¼', + '¥¯' => 'å¼', + '¥°' => '弘', + '¥±' => 'å¼—', + '¥²' => 'å¿…', + '¥³' => '戊', + '¥´' => '打', + '¥µ' => '扔', + '¥¶' => '扒', + '¥·' => '扑', + '¥¸' => 'æ–¥', + '¥¹' => 'æ—¦', + '¥º' => '朮', + '¥»' => '本', + '¥¼' => '未', + '¥½' => '末', + '¥¾' => '札', + '¥¿' => 'æ­£', + '¥À' => 'æ¯', + '¥Á' => 'æ°‘', + '¥Â' => 'æ°', + '¥Ã' => 'æ°¸', + '¥Ä' => 'æ±', + '¥Å' => 'æ±€', + '¥Æ' => 'æ°¾', + '¥Ç' => '犯', + '¥È' => '玄', + '¥É' => '玉', + '¥Ê' => '瓜', + '¥Ë' => '瓦', + '¥Ì' => '甘', + '¥Í' => '生', + '¥Î' => '用', + '¥Ï' => '甩', + '¥Ð' => 'ç”°', + '¥Ñ' => 'ç”±', + '¥Ò' => '甲', + '¥Ó' => '申', + '¥Ô' => 'ç–‹', + '¥Õ' => '白', + '¥Ö' => 'çš®', + '¥×' => 'çš¿', + '¥Ø' => 'ç›®', + '¥Ù' => '矛', + '¥Ú' => '矢', + '¥Û' => '石', + '¥Ü' => '示', + '¥Ý' => '禾', + '¥Þ' => 'ç©´', + '¥ß' => 'ç«‹', + '¥à' => '丞', + '¥á' => '丟', + '¥â' => 'ä¹’', + '¥ã' => '乓', + '¥ä' => '乩', + '¥å' => '亙', + '¥æ' => '交', + '¥ç' => '亦', + '¥è' => '亥', + '¥é' => '仿', + '¥ê' => '伉', + '¥ë' => 'ä¼™', + '¥ì' => '伊', + '¥í' => '伕', + '¥î' => 'ä¼', + '¥ï' => 'ä¼', + '¥ð' => '休', + '¥ñ' => 'ä¼', + '¥ò' => '仲', + '¥ó' => 'ä»¶', + '¥ô' => 'ä»»', + '¥õ' => 'ä»°', + '¥ö' => '仳', + '¥÷' => '份', + '¥ø' => 'ä¼', + '¥ù' => '伋', + '¥ú' => 'å…‰', + '¥û' => 'å…‡', + '¥ü' => 'å…†', + '¥ý' => 'å…ˆ', + '¥þ' => 'å…¨', + '¦@' => 'å…±', + '¦A' => 'å†', + '¦B' => '冰', + '¦C' => '列', + '¦D' => '刑', + '¦E' => '划', + '¦F' => '刎', + '¦G' => '刖', + '¦H' => '劣', + '¦I' => '匈', + '¦J' => '匡', + '¦K' => '匠', + '¦L' => 'å°', + '¦M' => 'å±', + '¦N' => 'å‰', + '¦O' => 'å', + '¦P' => 'åŒ', + '¦Q' => 'åŠ', + '¦R' => 'å', + '¦S' => 'å', + '¦T' => 'å‹', + '¦U' => 'å„', + '¦V' => 'å‘', + '¦W' => 'å', + '¦X' => 'åˆ', + '¦Y' => 'åƒ', + '¦Z' => 'åŽ', + '¦[' => 'å†', + '¦\\' => 'å’', + '¦]' => 'å› ', + '¦^' => '回', + '¦_' => 'å›', + '¦`' => '圳', + '¦a' => '地', + '¦b' => '在', + '¦c' => '圭', + '¦d' => '圬', + '¦e' => '圯', + '¦f' => '圩', + '¦g' => '夙', + '¦h' => '多', + '¦i' => '夷', + '¦j' => '夸', + '¦k' => '妄', + '¦l' => '奸', + '¦m' => '妃', + '¦n' => '好', + '¦o' => '她', + '¦p' => '如', + '¦q' => 'å¦', + '¦r' => 'å­—', + '¦s' => 'å­˜', + '¦t' => '宇', + '¦u' => '守', + '¦v' => 'å®…', + '¦w' => '安', + '¦x' => '寺', + '¦y' => 'å°–', + '¦z' => 'å±¹', + '¦{' => 'å·ž', + '¦|' => '帆', + '¦}' => 'å¹¶', + '¦~' => 'å¹´', + '¦¡' => 'å¼', + '¦¢' => 'å¼›', + '¦£' => 'å¿™', + '¦¤' => 'å¿–', + '¦¥' => '戎', + '¦¦' => '戌', + '¦§' => 'æˆ', + '¦¨' => 'æˆ', + '¦©' => '扣', + '¦ª' => '扛', + '¦«' => '托', + '¦¬' => 'æ”¶', + '¦­' => 'æ—©', + '¦®' => 'æ—¨', + '¦¯' => 'æ—¬', + '¦°' => 'æ—­', + '¦±' => '曲', + '¦²' => '曳', + '¦³' => '有', + '¦´' => '朽', + '¦µ' => '朴', + '¦¶' => '朱', + '¦·' => '朵', + '¦¸' => '次', + '¦¹' => 'æ­¤', + '¦º' => 'æ­»', + '¦»' => 'æ°–', + '¦¼' => 'æ±', + '¦½' => 'æ±—', + '¦¾' => 'æ±™', + '¦¿' => '江', + '¦À' => 'æ± ', + '¦Á' => 'æ±', + '¦Â' => '汕', + '¦Ã' => '污', + '¦Ä' => 'æ±›', + '¦Å' => 'æ±', + '¦Æ' => '汎', + '¦Ç' => 'ç°', + '¦È' => '牟', + '¦É' => 'ç‰', + '¦Ê' => '百', + '¦Ë' => '竹', + '¦Ì' => 'ç±³', + '¦Í' => '糸', + '¦Î' => 'ç¼¶', + '¦Ï' => '羊', + '¦Ð' => 'ç¾½', + '¦Ñ' => 'è€', + '¦Ò' => '考', + '¦Ó' => '而', + '¦Ô' => '耒', + '¦Õ' => '耳', + '¦Ö' => 'è¿', + '¦×' => '肉', + '¦Ø' => 'è‚‹', + '¦Ù' => '肌', + '¦Ú' => '臣', + '¦Û' => '自', + '¦Ü' => '至', + '¦Ý' => '臼', + '¦Þ' => '舌', + '¦ß' => '舛', + '¦à' => '舟', + '¦á' => '艮', + '¦â' => '色', + '¦ã' => '艾', + '¦ä' => '虫', + '¦å' => 'è¡€', + '¦æ' => '行', + '¦ç' => 'è¡£', + '¦è' => '西', + '¦é' => '阡', + '¦ê' => '串', + '¦ë' => '亨', + '¦ì' => 'ä½', + '¦í' => 'ä½', + '¦î' => '佇', + '¦ï' => 'ä½—', + '¦ð' => '佞', + '¦ñ' => 'ä¼´', + '¦ò' => 'ä½›', + '¦ó' => '何', + '¦ô' => 'ä¼°', + '¦õ' => 'ä½', + '¦ö' => '佑', + '¦÷' => 'ä¼½', + '¦ø' => '伺', + '¦ù' => '伸', + '¦ú' => '佃', + '¦û' => 'ä½”', + '¦ü' => 'ä¼¼', + '¦ý' => '但', + '¦þ' => 'ä½£', + '§@' => '作', + '§A' => 'ä½ ', + '§B' => '伯', + '§C' => '低', + '§D' => 'ä¼¶', + '§E' => 'ä½™', + '§F' => 'ä½', + '§G' => '佈', + '§H' => '佚', + '§I' => 'å…Œ', + '§J' => 'å…‹', + '§K' => 'å…', + '§L' => 'å…µ', + '§M' => '冶', + '§N' => '冷', + '§O' => '別', + '§P' => '判', + '§Q' => '利', + '§R' => '刪', + '§S' => '刨', + '§T' => '劫', + '§U' => '助', + '§V' => '努', + '§W' => '劬', + '§X' => '匣', + '§Y' => 'å³', + '§Z' => 'åµ', + '§[' => 'å', + '§\\' => 'å­', + '§]' => 'åž', + '§^' => 'å¾', + '§_' => 'å¦', + '§`' => '呎', + '§a' => 'å§', + '§b' => '呆', + '§c' => '呃', + '§d' => 'å³', + '§e' => '呈', + '§f' => 'å‘‚', + '§g' => 'å›', + '§h' => 'å©', + '§i' => '告', + '§j' => 'å¹', + '§k' => 'å»', + '§l' => 'å¸', + '§m' => 'å®', + '§n' => 'åµ', + '§o' => 'å¶', + '§p' => 'å ', + '§q' => 'å¼', + '§r' => 'å‘€', + '§s' => 'å±', + '§t' => 'å«', + '§u' => 'åŸ', + '§v' => 'å¬', + '§w' => '囪', + '§x' => 'å›°', + '§y' => '囤', + '§z' => '囫', + '§{' => 'åŠ', + '§|' => 'å‘', + '§}' => 'å€', + '§~' => 'å', + '§¡' => 'å‡', + '§¢' => 'åŽ', + '§£' => '圾', + '§¤' => 'å', + '§¥' => 'å', + '§¦' => '圻', + '§§' => '壯', + '§¨' => '夾', + '§©' => 'å¦', + '§ª' => '妒', + '§«' => '妨', + '§¬' => '妞', + '§­' => '妣', + '§®' => '妙', + '§¯' => '妖', + '§°' => 'å¦', + '§±' => '妤', + '§²' => '妓', + '§³' => '妊', + '§´' => '妥', + '§µ' => 'å­', + '§¶' => 'å­œ', + '§·' => 'å­š', + '§¸' => 'å­›', + '§¹' => '完', + '§º' => '宋', + '§»' => 'å®', + '§¼' => 'å°¬', + '§½' => 'å±€', + '§¾' => 'å±', + '§¿' => 'å°¿', + '§À' => 'å°¾', + '§Á' => 'å²', + '§Â' => '岑', + '§Ã' => 'å²”', + '§Ä' => '岌', + '§Å' => 'å·«', + '§Æ' => '希', + '§Ç' => 'åº', + '§È' => '庇', + '§É' => '床', + '§Ê' => 'å»·', + '§Ë' => '弄', + '§Ì' => '弟', + '§Í' => '彤', + '§Î' => 'å½¢', + '§Ï' => 'å½·', + '§Ð' => 'å½¹', + '§Ñ' => '忘', + '§Ò' => '忌', + '§Ó' => 'å¿—', + '§Ô' => 'å¿', + '§Õ' => '忱', + '§Ö' => 'å¿«', + '§×' => '忸', + '§Ø' => '忪', + '§Ù' => '戒', + '§Ú' => '我', + '§Û' => '抄', + '§Ü' => '抗', + '§Ý' => '抖', + '§Þ' => '技', + '§ß' => '扶', + '§à' => '抉', + '§á' => '扭', + '§â' => '把', + '§ã' => '扼', + '§ä' => '找', + '§å' => '批', + '§æ' => '扳', + '§ç' => '抒', + '§è' => '扯', + '§é' => '折', + '§ê' => '扮', + '§ë' => '投', + '§ì' => '抓', + '§í' => '抑', + '§î' => '抆', + '§ï' => '改', + '§ð' => 'æ”»', + '§ñ' => '攸', + '§ò' => 'æ—±', + '§ó' => 'æ›´', + '§ô' => 'æŸ', + '§õ' => 'æŽ', + '§ö' => 'æ', + '§÷' => 'æ', + '§ø' => 'æ‘', + '§ù' => 'æœ', + '§ú' => 'æ–', + '§û' => 'æž', + '§ü' => 'æ‰', + '§ý' => 'æ†', + '§þ' => 'æ ', + '¨@' => 'æ“', + '¨A' => 'æ—', + '¨B' => 'æ­¥', + '¨C' => 'æ¯', + '¨D' => '求', + '¨E' => '汞', + '¨F' => 'æ²™', + '¨G' => 'æ²', + '¨H' => '沈', + '¨I' => '沉', + '¨J' => 'æ²…', + '¨K' => 'æ²›', + '¨L' => '汪', + '¨M' => '決', + '¨N' => 'æ²', + '¨O' => 'æ±°', + '¨P' => '沌', + '¨Q' => '汨', + '¨R' => 'æ²–', + '¨S' => 'æ²’', + '¨T' => 'æ±½', + '¨U' => '沃', + '¨V' => 'æ±²', + '¨W' => 'æ±¾', + '¨X' => 'æ±´', + '¨Y' => '沆', + '¨Z' => 'æ±¶', + '¨[' => 'æ²', + '¨\\' => 'æ²”', + '¨]' => '沘', + '¨^' => '沂', + '¨_' => 'ç¶', + '¨`' => 'ç¼', + '¨a' => 'ç½', + '¨b' => 'ç¸', + '¨c' => '牢', + '¨d' => '牡', + '¨e' => '牠', + '¨f' => 'ç‹„', + '¨g' => 'ç‹‚', + '¨h' => '玖', + '¨i' => '甬', + '¨j' => '甫', + '¨k' => 'ç”·', + '¨l' => '甸', + '¨m' => 'çš‚', + '¨n' => '盯', + '¨o' => '矣', + '¨p' => 'ç§', + '¨q' => 'ç§€', + '¨r' => '禿', + '¨s' => 'ç©¶', + '¨t' => 'ç³»', + '¨u' => '罕', + '¨v' => 'è‚–', + '¨w' => 'è‚“', + '¨x' => 'è‚', + '¨y' => '肘', + '¨z' => 'è‚›', + '¨{' => '肚', + '¨|' => '育', + '¨}' => '良', + '¨~' => '芒', + '¨¡' => '芋', + '¨¢' => 'èŠ', + '¨£' => '見', + '¨¤' => 'è§’', + '¨¥' => '言', + '¨¦' => 'è°·', + '¨§' => '豆', + '¨¨' => '豕', + '¨©' => 'è²', + '¨ª' => '赤', + '¨«' => 'èµ°', + '¨¬' => 'è¶³', + '¨­' => '身', + '¨®' => '車', + '¨¯' => 'è¾›', + '¨°' => 'è¾°', + '¨±' => 'è¿‚', + '¨²' => '迆', + '¨³' => 'è¿…', + '¨´' => 'è¿„', + '¨µ' => 'å·¡', + '¨¶' => 'é‚‘', + '¨·' => 'é‚¢', + '¨¸' => '邪', + '¨¹' => '邦', + '¨º' => 'é‚£', + '¨»' => 'é…‰', + '¨¼' => '釆', + '¨½' => '里', + '¨¾' => '防', + '¨¿' => '阮', + '¨À' => '阱', + '¨Á' => '阪', + '¨Â' => '阬', + '¨Ã' => '並', + '¨Ä' => 'ä¹–', + '¨Å' => 'ä¹³', + '¨Æ' => '事', + '¨Ç' => '些', + '¨È' => '亞', + '¨É' => '享', + '¨Ê' => '京', + '¨Ë' => '佯', + '¨Ì' => 'ä¾', + '¨Í' => 'ä¾', + '¨Î' => 'ä½³', + '¨Ï' => '使', + '¨Ð' => '佬', + '¨Ñ' => 'ä¾›', + '¨Ò' => '例', + '¨Ó' => '來', + '¨Ô' => '侃', + '¨Õ' => 'ä½°', + '¨Ö' => 'ä½µ', + '¨×' => '侈', + '¨Ø' => '佩', + '¨Ù' => 'ä½»', + '¨Ú' => 'ä¾–', + '¨Û' => 'ä½¾', + '¨Ü' => 'ä¾', + '¨Ý' => '侑', + '¨Þ' => '佺', + '¨ß' => 'å…”', + '¨à' => 'å…’', + '¨á' => 'å…•', + '¨â' => 'å…©', + '¨ã' => 'å…·', + '¨ä' => 'å…¶', + '¨å' => 'å…¸', + '¨æ' => '冽', + '¨ç' => '函', + '¨è' => '刻', + '¨é' => '券', + '¨ê' => '刷', + '¨ë' => '刺', + '¨ì' => '到', + '¨í' => '刮', + '¨î' => '制', + '¨ï' => 'å‰', + '¨ð' => '劾', + '¨ñ' => '劻', + '¨ò' => 'å’', + '¨ó' => 'å”', + '¨ô' => 'å“', + '¨õ' => 'å‘', + '¨ö' => 'å¦', + '¨÷' => 'å·', + '¨ø' => 'å¸', + '¨ù' => 'å¹', + '¨ú' => 'å–', + '¨û' => 'å”', + '¨ü' => 'å—', + '¨ý' => '味', + '¨þ' => '呵', + '©@' => 'å’–', + '©A' => '呸', + '©B' => 'å’•', + '©C' => 'å’€', + '©D' => 'å‘»', + '©E' => 'å‘·', + '©F' => 'å’„', + '©G' => 'å’’', + '©H' => 'å’†', + '©I' => '呼', + '©J' => 'å’', + '©K' => '呱', + '©L' => 'å‘¶', + '©M' => 'å’Œ', + '©N' => 'å’š', + '©O' => 'å‘¢', + '©P' => '周', + '©Q' => 'å’‹', + '©R' => '命', + '©S' => 'å’Ž', + '©T' => '固', + '©U' => '垃', + '©V' => 'å·', + '©W' => 'åª', + '©X' => 'å©', + '©Y' => 'å¡', + '©Z' => 'å¦', + '©[' => 'å¤', + '©\\' => 'å¼', + '©]' => '夜', + '©^' => '奉', + '©_' => '奇', + '©`' => '奈', + '©a' => '奄', + '©b' => '奔', + '©c' => '妾', + '©d' => '妻', + '©e' => 'å§”', + '©f' => '妹', + '©g' => '妮', + '©h' => 'å§‘', + '©i' => '姆', + '©j' => 'å§', + '©k' => 'å§', + '©l' => 'å§‹', + '©m' => 'å§“', + '©n' => 'å§Š', + '©o' => '妯', + '©p' => '妳', + '©q' => 'å§’', + '©r' => 'å§…', + '©s' => 'å­Ÿ', + '©t' => 'å­¤', + '©u' => 'å­£', + '©v' => 'å®—', + '©w' => '定', + '©x' => '官', + '©y' => '宜', + '©z' => 'å®™', + '©{' => 'å®›', + '©|' => 'å°š', + '©}' => '屈', + '©~' => 'å±…', + '©¡' => '屆', + '©¢' => 'å²·', + '©£' => '岡', + '©¤' => '岸', + '©¥' => '岩', + '©¦' => '岫', + '©§' => 'å²±', + '©¨' => 'å²³', + '©©' => '帘', + '©ª' => '帚', + '©«' => '帖', + '©¬' => '帕', + '©­' => '帛', + '©®' => '帑', + '©¯' => '幸', + '©°' => '庚', + '©±' => '店', + '©²' => '府', + '©³' => '底', + '©´' => '庖', + '©µ' => 'å»¶', + '©¶' => '弦', + '©·' => 'å¼§', + '©¸' => '弩', + '©¹' => 'å¾€', + '©º' => 'å¾', + '©»' => '彿', + '©¼' => 'å½¼', + '©½' => 'å¿', + '©¾' => 'å¿ ', + '©¿' => '忽', + '©À' => '念', + '©Á' => 'å¿¿', + '©Â' => 'æ€', + '©Ã' => '怔', + '©Ä' => '怯', + '©Å' => '怵', + '©Æ' => '怖', + '©Ç' => '怪', + '©È' => '怕', + '©É' => '怡', + '©Ê' => '性', + '©Ë' => '怩', + '©Ì' => '怫', + '©Í' => '怛', + '©Î' => '或', + '©Ï' => '戕', + '©Ð' => '房', + '©Ñ' => '戾', + '©Ò' => '所', + '©Ó' => '承', + '©Ô' => '拉', + '©Õ' => '拌', + '©Ö' => 'æ‹„', + '©×' => '抿', + '©Ø' => 'æ‹‚', + '©Ù' => '抹', + '©Ú' => 'æ‹’', + '©Û' => 'æ‹›', + '©Ü' => '披', + '©Ý' => 'æ‹“', + '©Þ' => 'æ‹”', + '©ß' => 'æ‹‹', + '©à' => '拈', + '©á' => '抨', + '©â' => '抽', + '©ã' => '押', + '©ä' => 'æ‹', + '©å' => 'æ‹™', + '©æ' => '拇', + '©ç' => 'æ‹', + '©è' => '抵', + '©é' => '拚', + '©ê' => '抱', + '©ë' => '拘', + '©ì' => 'æ‹–', + '©í' => 'æ‹—', + '©î' => '拆', + '©ï' => '抬', + '©ð' => '拎', + '©ñ' => '放', + '©ò' => 'æ–§', + '©ó' => 'æ–¼', + '©ô' => 'æ—º', + '©õ' => '昔', + '©ö' => '易', + '©÷' => '昌', + '©ø' => '昆', + '©ù' => '昂', + '©ú' => '明', + '©û' => '昀', + '©ü' => 'æ˜', + '©ý' => '昕', + '©þ' => '昊', + 'ª@' => '昇', + 'ªA' => 'æœ', + 'ªB' => '朋', + 'ªC' => 'æ­', + 'ªD' => 'æž‹', + 'ªE' => 'æž•', + 'ªF' => 'æ±', + 'ªG' => 'æžœ', + 'ªH' => 'æ³', + 'ªI' => 'æ·', + 'ªJ' => '枇', + 'ªK' => 'æž', + 'ªL' => 'æž—', + 'ªM' => 'æ¯', + 'ªN' => 'æ°', + 'ªO' => 'æ¿', + 'ªP' => '枉', + 'ªQ' => 'æ¾', + 'ªR' => 'æž', + 'ªS' => 'æµ', + 'ªT' => 'æžš', + 'ªU' => 'æž“', + 'ªV' => 'æ¼', + 'ªW' => 'æª', + 'ªX' => 'æ²', + 'ªY' => '欣', + 'ªZ' => 'æ­¦', + 'ª[' => 'æ­§', + 'ª\\' => 'æ­¿', + 'ª]' => 'æ°“', + 'ª^' => 'æ°›', + 'ª_' => 'æ³£', + 'ª`' => '注', + 'ªa' => 'æ³³', + 'ªb' => 'æ²±', + 'ªc' => '泌', + 'ªd' => 'æ³¥', + 'ªe' => 'æ²³', + 'ªf' => 'æ²½', + 'ªg' => 'æ²¾', + 'ªh' => 'æ²¼', + 'ªi' => 'æ³¢', + 'ªj' => '沫', + 'ªk' => '法', + 'ªl' => '泓', + 'ªm' => '沸', + 'ªn' => '泄', + 'ªo' => 'æ²¹', + 'ªp' => 'æ³', + 'ªq' => 'æ²®', + 'ªr' => 'æ³—', + 'ªs' => 'æ³…', + 'ªt' => 'æ³±', + 'ªu' => '沿', + 'ªv' => 'æ²»', + 'ªw' => '泡', + 'ªx' => 'æ³›', + 'ªy' => '泊', + 'ªz' => '沬', + 'ª{' => '泯', + 'ª|' => '泜', + 'ª}' => 'æ³–', + 'ª~' => 'æ³ ', + 'ª¡' => 'ç‚•', + 'ª¢' => '炎', + 'ª£' => 'ç‚’', + 'ª¤' => '炊', + 'ª¥' => 'ç‚™', + 'ª¦' => '爬', + 'ª§' => '爭', + 'ª¨' => '爸', + 'ª©' => '版', + 'ªª' => '牧', + 'ª«' => '物', + 'ª¬' => 'ç‹€', + 'ª­' => '狎', + 'ª®' => 'ç‹™', + 'ª¯' => 'ç‹—', + 'ª°' => 'ç‹', + 'ª±' => '玩', + 'ª²' => '玨', + 'ª³' => '玟', + 'ª´' => '玫', + 'ªµ' => '玥', + 'ª¶' => '甽', + 'ª·' => 'ç–', + 'ª¸' => 'ç–™', + 'ª¹' => 'ç–š', + 'ªº' => 'çš„', + 'ª»' => '盂', + 'ª¼' => '盲', + 'ª½' => 'ç›´', + 'ª¾' => '知', + 'ª¿' => '矽', + 'ªÀ' => '社', + 'ªÁ' => '祀', + 'ªÂ' => 'ç¥', + 'ªÃ' => '秉', + 'ªÄ' => '秈', + 'ªÅ' => '空', + 'ªÆ' => '穹', + 'ªÇ' => '竺', + 'ªÈ' => 'ç³¾', + 'ªÉ' => 'ç½”', + 'ªÊ' => '羌', + 'ªË' => '羋', + 'ªÌ' => '者', + 'ªÍ' => '肺', + 'ªÎ' => 'è‚¥', + 'ªÏ' => 'è‚¢', + 'ªÐ' => '肱', + 'ªÑ' => 'è‚¡', + 'ªÒ' => 'è‚«', + 'ªÓ' => 'è‚©', + 'ªÔ' => 'è‚´', + 'ªÕ' => '肪', + 'ªÖ' => '肯', + 'ª×' => '臥', + 'ªØ' => '臾', + 'ªÙ' => 'èˆ', + 'ªÚ' => '芳', + 'ªÛ' => 'èŠ', + 'ªÜ' => '芙', + 'ªÝ' => '芭', + 'ªÞ' => '芽', + 'ªß' => '芟', + 'ªà' => '芹', + 'ªá' => '花', + 'ªâ' => '芬', + 'ªã' => '芥', + 'ªä' => '芯', + 'ªå' => '芸', + 'ªæ' => '芣', + 'ªç' => '芰', + 'ªè' => '芾', + 'ªé' => '芷', + 'ªê' => '虎', + 'ªë' => 'è™±', + 'ªì' => 'åˆ', + 'ªí' => '表', + 'ªî' => '軋', + 'ªï' => '迎', + 'ªð' => 'è¿”', + 'ªñ' => 'è¿‘', + 'ªò' => '邵', + 'ªó' => '邸', + 'ªô' => '邱', + 'ªõ' => 'é‚¶', + 'ªö' => '采', + 'ª÷' => '金', + 'ªø' => 'é•·', + 'ªù' => 'é–€', + 'ªú' => '阜', + 'ªû' => '陀', + 'ªü' => '阿', + 'ªý' => '阻', + 'ªþ' => '附', + '«@' => '陂', + '«A' => 'éš¹', + '«B' => '雨', + '«C' => 'é’', + '«D' => 'éž', + '«E' => '亟', + '«F' => '亭', + '«G' => '亮', + '«H' => 'ä¿¡', + '«I' => 'ä¾µ', + '«J' => '侯', + '«K' => '便', + '«L' => 'ä¿ ', + '«M' => 'ä¿‘', + '«N' => 'ä¿', + '«O' => 'ä¿', + '«P' => '促', + '«Q' => 'ä¾¶', + '«R' => '俘', + '«S' => '俟', + '«T' => '俊', + '«U' => 'ä¿—', + '«V' => 'ä¾®', + '«W' => 'ä¿', + '«X' => 'ä¿„', + '«Y' => 'ä¿‚', + '«Z' => '俚', + '«[' => '俎', + '«\\' => '俞', + '«]' => 'ä¾·', + '«^' => 'å…—', + '«_' => '冒', + '«`' => '冑', + '«a' => '冠', + '«b' => '剎', + '«c' => '剃', + '«d' => '削', + '«e' => 'å‰', + '«f' => '剌', + '«g' => '剋', + '«h' => '則', + '«i' => '勇', + '«j' => '勉', + '«k' => '勃', + '«l' => 'å‹', + '«m' => 'åŒ', + '«n' => 'å—', + '«o' => 'å»', + '«p' => '厚', + '«q' => 'å›', + '«r' => 'å’¬', + '«s' => 'å“€', + '«t' => 'å’¨', + '«u' => '哎', + '«v' => '哉', + '«w' => 'å’¸', + '«x' => 'å’¦', + '«y' => 'å’³', + '«z' => '哇', + '«{' => 'å“‚', + '«|' => 'å’½', + '«}' => 'å’ª', + '«~' => 'å“', + '«¡' => 'å“„', + '«¢' => '哈', + '«£' => 'å’¯', + '«¤' => 'å’«', + '«¥' => 'å’±', + '«¦' => 'å’»', + '«§' => 'å’©', + '«¨' => 'å’§', + '«©' => 'å’¿', + '«ª' => '囿', + '««' => 'åž‚', + '«¬' => 'åž‹', + '«­' => 'åž ', + '«®' => '垣', + '«¯' => '垢', + '«°' => '城', + '«±' => 'åž®', + '«²' => 'åž“', + '«³' => '奕', + '«´' => '契', + '«µ' => 'å¥', + '«¶' => '奎', + '«·' => 'å¥', + '«¸' => 'å§œ', + '«¹' => '姘', + '«º' => 'å§¿', + '«»' => 'å§£', + '«¼' => '姨', + '«½' => '娃', + '«¾' => 'å§¥', + '«¿' => '姪', + '«À' => 'å§š', + '«Á' => '姦', + '«Â' => 'å¨', + '«Ã' => 'å§»', + '«Ä' => 'å­©', + '«Å' => '宣', + '«Æ' => '宦', + '«Ç' => '室', + '«È' => '客', + '«É' => '宥', + '«Ê' => 'å°', + '«Ë' => '屎', + '«Ì' => 'å±', + '«Í' => 'å±', + '«Î' => '屋', + '«Ï' => 'å³™', + '«Ð' => 'å³’', + '«Ñ' => 'å··', + '«Ò' => 'å¸', + '«Ó' => '帥', + '«Ô' => '帟', + '«Õ' => 'å¹½', + '«Ö' => '庠', + '«×' => '度', + '«Ø' => '建', + '«Ù' => '弈', + '«Ú' => 'å¼­', + '«Û' => 'å½¥', + '«Ü' => '很', + '«Ý' => 'å¾…', + '«Þ' => '徊', + '«ß' => '律', + '«à' => '徇', + '«á' => '後', + '«â' => '徉', + '«ã' => '怒', + '«ä' => 'æ€', + '«å' => '怠', + '«æ' => '急', + '«ç' => '怎', + '«è' => '怨', + '«é' => 'æ', + '«ê' => 'æ°', + '«ë' => 'æ¨', + '«ì' => 'æ¢', + '«í' => 'æ†', + '«î' => 'æƒ', + '«ï' => 'æ¬', + '«ð' => 'æ«', + '«ñ' => 'æª', + '«ò' => 'æ¤', + '«ó' => 'æ‰', + '«ô' => '拜', + '«õ' => '挖', + '«ö' => '按', + '«÷' => '拼', + '«ø' => 'æ‹­', + '«ù' => 'æŒ', + '«ú' => 'æ‹®', + '«û' => '拽', + '«ü' => '指', + '«ý' => '拱', + '«þ' => 'æ‹·', + '¬@' => '拯', + '¬A' => '括', + '¬B' => '拾', + '¬C' => 'æ‹´', + '¬D' => '挑', + '¬E' => '挂', + '¬F' => '政', + '¬G' => 'æ•…', + '¬H' => 'æ–«', + '¬I' => 'æ–½', + '¬J' => 'æ—¢', + '¬K' => '春', + '¬L' => '昭', + '¬M' => '映', + '¬N' => '昧', + '¬O' => '是', + '¬P' => '星', + '¬Q' => '昨', + '¬R' => '昱', + '¬S' => '昤', + '¬T' => 'æ›·', + '¬U' => '柿', + '¬V' => '染', + '¬W' => '柱', + '¬X' => '柔', + '¬Y' => 'æŸ', + '¬Z' => '柬', + '¬[' => 'æž¶', + '¬\\' => '枯', + '¬]' => '柵', + '¬^' => '柩', + '¬_' => '柯', + '¬`' => '柄', + '¬a' => '柑', + '¬b' => 'æž´', + '¬c' => '柚', + '¬d' => '查', + '¬e' => '枸', + '¬f' => 'æŸ', + '¬g' => '柞', + '¬h' => '柳', + '¬i' => 'æž°', + '¬j' => '柙', + '¬k' => '柢', + '¬l' => 'æŸ', + '¬m' => '柒', + '¬n' => 'æ­ª', + '¬o' => '殃', + '¬p' => '殆', + '¬q' => '段', + '¬r' => '毒', + '¬s' => '毗', + '¬t' => 'æ°Ÿ', + '¬u' => '泉', + '¬v' => 'æ´‹', + '¬w' => 'æ´²', + '¬x' => 'æ´ª', + '¬y' => 'æµ', + '¬z' => 'æ´¥', + '¬{' => 'æ´Œ', + '¬|' => 'æ´±', + '¬}' => 'æ´ž', + '¬~' => 'æ´—', + '¬¡' => 'æ´»', + '¬¢' => 'æ´½', + '¬£' => 'æ´¾', + '¬¤' => 'æ´¶', + '¬¥' => 'æ´›', + '¬¦' => 'æ³µ', + '¬§' => 'æ´¹', + '¬¨' => 'æ´§', + '¬©' => 'æ´¸', + '¬ª' => 'æ´©', + '¬«' => 'æ´®', + '¬¬' => 'æ´µ', + '¬­' => 'æ´Ž', + '¬®' => 'æ´«', + '¬¯' => 'ç‚«', + '¬°' => '為', + '¬±' => '炳', + '¬²' => '炬', + '¬³' => '炯', + '¬´' => 'ç‚­', + '¬µ' => '炸', + '¬¶' => 'ç‚®', + '¬·' => '炤', + '¬¸' => '爰', + '¬¹' => '牲', + '¬º' => '牯', + '¬»' => '牴', + '¬¼' => 'ç‹©', + '¬½' => 'ç‹ ', + '¬¾' => 'ç‹¡', + '¬¿' => '玷', + '¬À' => 'çŠ', + '¬Á' => '玻', + '¬Â' => '玲', + '¬Ã' => 'ç', + '¬Ä' => 'ç€', + '¬Å' => '玳', + '¬Æ' => '甚', + '¬Ç' => 'ç”­', + '¬È' => 'ç•', + '¬É' => '界', + '¬Ê' => '畎', + '¬Ë' => 'ç•‹', + '¬Ì' => 'ç–«', + '¬Í' => 'ç–¤', + '¬Î' => 'ç–¥', + '¬Ï' => 'ç–¢', + '¬Ð' => 'ç–£', + '¬Ñ' => '癸', + '¬Ò' => '皆', + '¬Ó' => '皇', + '¬Ô' => '皈', + '¬Õ' => '盈', + '¬Ö' => '盆', + '¬×' => '盃', + '¬Ø' => 'ç›…', + '¬Ù' => 'çœ', + '¬Ú' => '盹', + '¬Û' => '相', + '¬Ü' => '眉', + '¬Ý' => '看', + '¬Þ' => '盾', + '¬ß' => '盼', + '¬à' => '眇', + '¬á' => '矜', + '¬â' => 'ç ‚', + '¬ã' => 'ç ”', + '¬ä' => 'ç Œ', + '¬å' => 'ç ', + '¬æ' => '祆', + '¬ç' => '祉', + '¬è' => '祈', + '¬é' => '祇', + '¬ê' => '禹', + '¬ë' => '禺', + '¬ì' => 'ç§‘', + '¬í' => 'ç§’', + '¬î' => 'ç§‹', + '¬ï' => 'ç©¿', + '¬ð' => 'çª', + '¬ñ' => 'ç«¿', + '¬ò' => '竽', + '¬ó' => 'ç±½', + '¬ô' => 'ç´‚', + '¬õ' => 'ç´…', + '¬ö' => 'ç´€', + '¬÷' => 'ç´‰', + '¬ø' => 'ç´‡', + '¬ù' => 'ç´„', + '¬ú' => 'ç´†', + '¬û' => '缸', + '¬ü' => '美', + '¬ý' => '羿', + '¬þ' => '耄', + '­@' => 'è€', + '­A' => 'è€', + '­B' => '耑', + '­C' => '耶', + '­D' => '胖', + '­E' => '胥', + '­F' => '胚', + '­G' => '胃', + '­H' => '胄', + '­I' => '背', + '­J' => '胡', + '­K' => '胛', + '­L' => '胎', + '­M' => '胞', + '­N' => '胤', + '­O' => 'èƒ', + '­P' => '致', + '­Q' => '舢', + '­R' => 'è‹§', + '­S' => '范', + '­T' => '茅', + '­U' => 'è‹£', + '­V' => 'è‹›', + '­W' => '苦', + '­X' => '茄', + '­Y' => 'è‹¥', + '­Z' => '茂', + '­[' => '茉', + '­\\' => 'è‹’', + '­]' => 'è‹—', + '­^' => '英', + '­_' => 'èŒ', + '­`' => '苜', + '­a' => 'è‹”', + '­b' => 'è‹‘', + '­c' => '苞', + '­d' => 'è‹“', + '­e' => '苟', + '­f' => '苯', + '­g' => '茆', + '­h' => 'è™', + '­i' => '虹', + '­j' => 'è™»', + '­k' => '虺', + '­l' => 'è¡', + '­m' => 'è¡«', + '­n' => 'è¦', + '­o' => 'è§”', + '­p' => '計', + '­q' => '訂', + '­r' => '訃', + '­s' => '貞', + '­t' => 'è² ', + '­u' => 'èµ´', + '­v' => 'èµ³', + '­w' => 'è¶´', + '­x' => 'è»', + '­y' => '軌', + '­z' => 'è¿°', + '­{' => '迦', + '­|' => 'è¿¢', + '­}' => '迪', + '­~' => 'è¿¥', + '­¡' => 'è¿­', + '­¢' => 'è¿«', + '­£' => '迤', + '­¤' => '迨', + '­¥' => '郊', + '­¦' => '郎', + '­§' => 'éƒ', + '­¨' => '郃', + '­©' => 'é…‹', + '­ª' => 'é…Š', + '­«' => 'é‡', + '­¬' => 'é–‚', + '­­' => 'é™', + '­®' => '陋', + '­¯' => '陌', + '­°' => 'é™', + '­±' => 'é¢', + '­²' => 'é©', + '­³' => '韋', + '­´' => '韭', + '­µ' => '音', + '­¶' => 'é ', + '­·' => '風', + '­¸' => '飛', + '­¹' => '食', + '­º' => '首', + '­»' => '香', + '­¼' => '乘', + '­½' => '亳', + '­¾' => '倌', + '­¿' => 'å€', + '­À' => '倣', + '­Á' => '俯', + '­Â' => '倦', + '­Ã' => '倥', + '­Ä' => '俸', + '­Å' => '倩', + '­Æ' => '倖', + '­Ç' => '倆', + '­È' => '值', + '­É' => '借', + '­Ê' => '倚', + '­Ë' => '倒', + '­Ì' => '們', + '­Í' => '俺', + '­Î' => '倀', + '­Ï' => '倔', + '­Ð' => '倨', + '­Ñ' => '俱', + '­Ò' => '倡', + '­Ó' => '個', + '­Ô' => '候', + '­Õ' => '倘', + '­Ö' => '俳', + '­×' => 'ä¿®', + '­Ø' => '倭', + '­Ù' => '倪', + '­Ú' => '俾', + '­Û' => '倫', + '­Ü' => '倉', + '­Ý' => 'å…¼', + '­Þ' => '冤', + '­ß' => '冥', + '­à' => '冢', + '­á' => 'å‡', + '­â' => '凌', + '­ã' => '准', + '­ä' => '凋', + '­å' => '剖', + '­æ' => '剜', + '­ç' => '剔', + '­è' => '剛', + '­é' => 'å‰', + '­ê' => '匪', + '­ë' => 'å¿', + '­ì' => '原', + '­í' => 'åŽ', + '­î' => 'åŸ', + '­ï' => '哨', + '­ð' => 'å”', + '­ñ' => 'å”', + '­ò' => 'å”·', + '­ó' => '哼', + '­ô' => 'å“¥', + '­õ' => '哲', + '­ö' => '唆', + '­÷' => '哺', + '­ø' => 'å””', + '­ù' => 'å“©', + '­ú' => 'å“­', + '­û' => 'å“¡', + '­ü' => '唉', + '­ý' => 'å“®', + '­þ' => '哪', + '®@' => '哦', + '®A' => 'å”§', + '®B' => '唇', + '®C' => '哽', + '®D' => 'å”', + '®E' => '圃', + '®F' => '圄', + '®G' => '埂', + '®H' => '埔', + '®I' => '埋', + '®J' => '埃', + '®K' => 'å ‰', + '®L' => 'å¤', + '®M' => '套', + '®N' => '奘', + '®O' => '奚', + '®P' => '娑', + '®Q' => '娘', + '®R' => '娜', + '®S' => '娟', + '®T' => '娛', + '®U' => '娓', + '®V' => '姬', + '®W' => '娠', + '®X' => '娣', + '®Y' => '娩', + '®Z' => '娥', + '®[' => '娌', + '®\\' => '娉', + '®]' => 'å­«', + '®^' => '屘', + '®_' => 'å®°', + '®`' => '害', + '®a' => 'å®¶', + '®b' => 'å®´', + '®c' => 'å®®', + '®d' => '宵', + '®e' => '容', + '®f' => '宸', + '®g' => 'å°„', + '®h' => '屑', + '®i' => '展', + '®j' => 'å±', + '®k' => 'å³­', + '®l' => 'å³½', + '®m' => 'å³»', + '®n' => '峪', + '®o' => '峨', + '®p' => 'å³°', + '®q' => 'å³¶', + '®r' => 'å´', + '®s' => 'å³´', + '®t' => 'å·®', + '®u' => '席', + '®v' => '師', + '®w' => '庫', + '®x' => '庭', + '®y' => '座', + '®z' => 'å¼±', + '®{' => 'å¾’', + '®|' => '徑', + '®}' => 'å¾', + '®~' => 'æ™', + '®¡' => 'æ£', + '®¢' => 'æ¥', + '®£' => 'æ', + '®¤' => 'æ•', + '®¥' => 'æ­', + '®¦' => 'æ©', + '®§' => 'æ¯', + '®¨' => 'æ‚„', + '®©' => '悟', + '®ª' => '悚', + '®«' => 'æ‚', + '®¬' => 'æ‚”', + '®­' => '悌', + '®®' => 'æ‚…', + '®¯' => 'æ‚–', + '®°' => '扇', + '®±' => '拳', + '®²' => '挈', + '®³' => 'æ‹¿', + '®´' => 'æŽ', + '®µ' => '挾', + '®¶' => '振', + '®·' => 'æ•', + '®¸' => 'æ‚', + '®¹' => 'æ†', + '®º' => 'æ', + '®»' => 'æ‰', + '®¼' => '挺', + '®½' => 'æ', + '®¾' => '挽', + '®¿' => '挪', + '®À' => '挫', + '®Á' => '挨', + '®Â' => 'æ', + '®Ã' => 'æŒ', + '®Ä' => '效', + '®Å' => '敉', + '®Æ' => 'æ–™', + '®Ç' => 'æ—', + '®È' => 'æ—…', + '®É' => '時', + '®Ê' => '晉', + '®Ë' => 'æ™', + '®Ì' => '晃', + '®Í' => 'æ™’', + '®Î' => '晌', + '®Ï' => 'æ™…', + '®Ð' => 'æ™', + '®Ñ' => '書', + '®Ò' => '朔', + '®Ó' => '朕', + '®Ô' => '朗', + '®Õ' => 'æ ¡', + '®Ö' => 'æ ¸', + '®×' => '案', + '®Ø' => '框', + '®Ù' => 'æ¡“', + '®Ú' => 'æ ¹', + '®Û' => 'æ¡‚', + '®Ü' => 'æ¡”', + '®Ý' => 'æ ©', + '®Þ' => '梳', + '®ß' => 'æ —', + '®à' => '桌', + '®á' => 'æ¡‘', + '®â' => 'æ ½', + '®ã' => '柴', + '®ä' => 'æ¡', + '®å' => 'æ¡€', + '®æ' => 'æ ¼', + '®ç' => '桃', + '®è' => 'æ ª', + '®é' => 'æ¡…', + '®ê' => 'æ “', + '®ë' => 'æ ˜', + '®ì' => 'æ¡', + '®í' => '殊', + '®î' => '殉', + '®ï' => 'æ®·', + '®ð' => 'æ°£', + '®ñ' => 'æ°§', + '®ò' => 'æ°¨', + '®ó' => 'æ°¦', + '®ô' => 'æ°¤', + '®õ' => 'æ³°', + '®ö' => '浪', + '®÷' => 'æ¶•', + '®ø' => '消', + '®ù' => '涇', + '®ú' => '浦', + '®û' => '浸', + '®ü' => 'æµ·', + '®ý' => 'æµ™', + '®þ' => 'æ¶“', + '¯@' => '浬', + '¯A' => '涉', + '¯B' => 'æµ®', + '¯C' => '浚', + '¯D' => 'æµ´', + '¯E' => '浩', + '¯F' => 'æ¶Œ', + '¯G' => 'æ¶Š', + '¯H' => 'æµ¹', + '¯I' => 'æ¶…', + '¯J' => 'æµ¥', + '¯K' => 'æ¶”', + '¯L' => '烊', + '¯M' => '烘', + '¯N' => '烤', + '¯O' => '烙', + '¯P' => '烈', + '¯Q' => 'çƒ', + '¯R' => '爹', + '¯S' => '特', + '¯T' => '狼', + '¯U' => '狹', + '¯V' => '狽', + '¯W' => '狸', + '¯X' => 'ç‹·', + '¯Y' => '玆', + '¯Z' => 'ç­', + '¯[' => 'ç‰', + '¯\\' => 'ç®', + '¯]' => 'ç ', + '¯^' => 'çª', + '¯_' => 'çž', + '¯`' => 'ç•”', + '¯a' => 'ç•', + '¯b' => '畜', + '¯c' => '畚', + '¯d' => 'ç•™', + '¯e' => 'ç–¾', + '¯f' => 'ç—…', + '¯g' => 'ç—‡', + '¯h' => 'ç–²', + '¯i' => 'ç–³', + '¯j' => 'ç–½', + '¯k' => 'ç–¼', + '¯l' => 'ç–¹', + '¯m' => 'ç—‚', + '¯n' => 'ç–¸', + '¯o' => 'çš‹', + '¯p' => 'çš°', + '¯q' => '益', + '¯r' => 'ç›', + '¯s' => '盎', + '¯t' => '眩', + '¯u' => '真', + '¯v' => '眠', + '¯w' => '眨', + '¯x' => '矩', + '¯y' => 'ç °', + '¯z' => 'ç §', + '¯{' => 'ç ¸', + '¯|' => 'ç ', + '¯}' => 'ç ´', + '¯~' => 'ç ·', + '¯¡' => 'ç ¥', + '¯¢' => 'ç ­', + '¯£' => 'ç  ', + '¯¤' => 'ç Ÿ', + '¯¥' => 'ç ²', + '¯¦' => '祕', + '¯§' => 'ç¥', + '¯¨' => '祠', + '¯©' => '祟', + '¯ª' => '祖', + '¯«' => '神', + '¯¬' => 'ç¥', + '¯­' => '祗', + '¯®' => '祚', + '¯¯' => '秤', + '¯°' => 'ç§£', + '¯±' => 'ç§§', + '¯²' => 'ç§Ÿ', + '¯³' => '秦', + '¯´' => 'ç§©', + '¯µ' => '秘', + '¯¶' => '窄', + '¯·' => '窈', + '¯¸' => 'ç«™', + '¯¹' => '笆', + '¯º' => '笑', + '¯»' => '粉', + '¯¼' => 'ç´¡', + '¯½' => 'ç´—', + '¯¾' => 'ç´‹', + '¯¿' => 'ç´Š', + '¯À' => 'ç´ ', + '¯Á' => 'ç´¢', + '¯Â' => 'ç´”', + '¯Ã' => 'ç´', + '¯Ä' => 'ç´•', + '¯Å' => 'ç´š', + '¯Æ' => 'ç´œ', + '¯Ç' => 'ç´', + '¯È' => 'ç´™', + '¯É' => 'ç´›', + '¯Ê' => '缺', + '¯Ë' => '罟', + '¯Ì' => 'ç¾”', + '¯Í' => 'ç¿…', + '¯Î' => 'ç¿', + '¯Ï' => '耆', + '¯Ð' => '耘', + '¯Ñ' => '耕', + '¯Ò' => '耙', + '¯Ó' => '耗', + '¯Ô' => '耽', + '¯Õ' => '耿', + '¯Ö' => '胱', + '¯×' => 'è„‚', + '¯Ø' => '胰', + '¯Ù' => 'è„…', + '¯Ú' => '胭', + '¯Û' => '胴', + '¯Ü' => '脆', + '¯Ý' => '胸', + '¯Þ' => '胳', + '¯ß' => '脈', + '¯à' => '能', + '¯á' => '脊', + '¯â' => '胼', + '¯ã' => '胯', + '¯ä' => '臭', + '¯å' => '臬', + '¯æ' => '舀', + '¯ç' => 'èˆ', + '¯è' => '航', + '¯é' => '舫', + '¯ê' => '舨', + '¯ë' => '般', + '¯ì' => '芻', + '¯í' => '茫', + '¯î' => 'è’', + '¯ï' => 'è”', + '¯ð' => 'èŠ', + '¯ñ' => '茸', + '¯ò' => 'è', + '¯ó' => 'è‰', + '¯ô' => '茵', + '¯õ' => '茴', + '¯ö' => 'è', + '¯÷' => '茲', + '¯ø' => '茹', + '¯ù' => '茶', + '¯ú' => '茗', + '¯û' => 'è€', + '¯ü' => '茱', + '¯ý' => '茨', + '¯þ' => 'èƒ', + '°@' => 'è™”', + '°A' => '蚊', + '°B' => '蚪', + '°C' => 'èš“', + '°D' => '蚤', + '°E' => 'èš©', + '°F' => '蚌', + '°G' => '蚣', + '°H' => 'èšœ', + '°I' => 'è¡°', + '°J' => 'è¡·', + '°K' => 'è¢', + '°L' => '袂', + '°M' => '衽', + '°N' => '衹', + '°O' => '記', + '°P' => 'è¨', + '°Q' => '討', + '°R' => '訌', + '°S' => '訕', + '°T' => '訊', + '°U' => '託', + '°V' => '訓', + '°W' => '訖', + '°X' => 'è¨', + '°Y' => '訑', + '°Z' => '豈', + '°[' => '豺', + '°\\' => 'è±¹', + '°]' => '財', + '°^' => 'è²¢', + '°_' => 'èµ·', + '°`' => '躬', + '°a' => 'è»’', + '°b' => 'è»”', + '°c' => 'è»', + '°d' => 'è¾±', + '°e' => 'é€', + '°f' => '逆', + '°g' => 'è¿·', + '°h' => '退', + '°i' => '迺', + '°j' => 'è¿´', + '°k' => '逃', + '°l' => '追', + '°m' => '逅', + '°n' => '迸', + '°o' => 'é‚•', + '°p' => '郡', + '°q' => 'éƒ', + '°r' => '郢', + '°s' => 'é…’', + '°t' => 'é…', + '°u' => 'é…Œ', + '°v' => '釘', + '°w' => 'é‡', + '°x' => '釗', + '°y' => '釜', + '°z' => '釙', + '°{' => 'é–ƒ', + '°|' => '院', + '°}' => '陣', + '°~' => '陡', + '°¡' => 'é™›', + '°¢' => 'é™', + '°£' => '除', + '°¤' => '陘', + '°¥' => '陞', + '°¦' => 'éš»', + '°§' => '飢', + '°¨' => '馬', + '°©' => '骨', + '°ª' => '高', + '°«' => '鬥', + '°¬' => '鬲', + '°­' => '鬼', + '°®' => 'ä¹¾', + '°¯' => 'åº', + '°°' => 'å½', + '°±' => 'åœ', + '°²' => 'å‡', + '°³' => 'åƒ', + '°´' => 'åŒ', + '°µ' => 'åš', + '°¶' => 'å‰', + '°·' => 'å¥', + '°¸' => 'å¶', + '°¹' => 'åŽ', + '°º' => 'å•', + '°»' => 'åµ', + '°¼' => 'å´', + '°½' => 'å·', + '°¾' => 'å', + '°¿' => 'å€', + '°À' => 'å¯', + '°Á' => 'å­', + '°Â' => 'å…œ', + '°Ã' => '冕', + '°Ä' => '凰', + '°Å' => '剪', + '°Æ' => '副', + '°Ç' => 'å‹’', + '°È' => 'å‹™', + '°É' => '勘', + '°Ê' => 'å‹•', + '°Ë' => 'åŒ', + '°Ì' => 'åŒ', + '°Í' => '匙', + '°Î' => '匿', + '°Ï' => 'å€', + '°Ð' => '匾', + '°Ñ' => 'åƒ', + '°Ò' => '曼', + '°Ó' => '商', + '°Ô' => '啪', + '°Õ' => '啦', + '°Ö' => 'å•„', + '°×' => '啞', + '°Ø' => 'å•¡', + '°Ù' => '啃', + '°Ú' => '啊', + '°Û' => 'å”±', + '°Ü' => 'å•–', + '°Ý' => 'å•', + '°Þ' => 'å••', + '°ß' => '唯', + '°à' => '啤', + '°á' => '唸', + '°â' => 'å”®', + '°ã' => '啜', + '°ä' => '唬', + '°å' => 'å•£', + '°æ' => '唳', + '°ç' => 'å•', + '°è' => 'å•—', + '°é' => '圈', + '°ê' => '國', + '°ë' => '圉', + '°ì' => '域', + '°í' => 'å …', + '°î' => 'å Š', + '°ï' => 'å †', + '°ð' => '埠', + '°ñ' => '埤', + '°ò' => '基', + '°ó' => 'å ‚', + '°ô' => 'å µ', + '°õ' => '執', + '°ö' => '培', + '°÷' => '夠', + '°ø' => '奢', + '°ù' => '娶', + '°ú' => 'å©', + '°û' => '婉', + '°ü' => '婦', + '°ý' => '婪', + '°þ' => 'å©€', + '±@' => '娼', + '±A' => 'å©¢', + '±B' => '婚', + '±C' => '婆', + '±D' => '婊', + '±E' => 'å­°', + '±F' => '寇', + '±G' => '寅', + '±H' => '寄', + '±I' => '寂', + '±J' => '宿', + '±K' => '密', + '±L' => 'å°‰', + '±M' => 'å°ˆ', + '±N' => 'å°‡', + '±O' => 'å± ', + '±P' => '屜', + '±Q' => 'å±', + '±R' => 'å´‡', + '±S' => 'å´†', + '±T' => 'å´Ž', + '±U' => 'å´›', + '±V' => 'å´–', + '±W' => 'å´¢', + '±X' => 'å´‘', + '±Y' => 'å´©', + '±Z' => 'å´”', + '±[' => 'å´™', + '±\\' => 'å´¤', + '±]' => 'å´§', + '±^' => 'å´—', + '±_' => 'å·¢', + '±`' => '常', + '±a' => '帶', + '±b' => '帳', + '±c' => '帷', + '±d' => '康', + '±e' => '庸', + '±f' => '庶', + '±g' => '庵', + '±h' => '庾', + '±i' => 'å¼µ', + '±j' => 'å¼·', + '±k' => 'å½—', + '±l' => '彬', + '±m' => '彩', + '±n' => '彫', + '±o' => 'å¾—', + '±p' => 'å¾™', + '±q' => '從', + '±r' => '徘', + '±s' => '御', + '±t' => 'å¾ ', + '±u' => '徜', + '±v' => 'æ¿', + '±w' => 'æ‚£', + '±x' => '悉', + '±y' => 'æ‚ ', + '±z' => '您', + '±{' => '惋', + '±|' => 'æ‚´', + '±}' => '惦', + '±~' => '悽', + '±¡' => '情', + '±¢' => 'æ‚»', + '±£' => '悵', + '±¤' => '惜', + '±¥' => '悼', + '±¦' => '惘', + '±§' => '惕', + '±¨' => '惆', + '±©' => '惟', + '±ª' => '悸', + '±«' => '惚', + '±¬' => '惇', + '±­' => '戚', + '±®' => '戛', + '±¯' => '扈', + '±°' => '掠', + '±±' => '控', + '±²' => 'æ²', + '±³' => '掖', + '±´' => '探', + '±µ' => '接', + '±¶' => 'æ·', + '±·' => 'æ§', + '±¸' => '掘', + '±¹' => '措', + '±º' => 'æ±', + '±»' => '掩', + '±¼' => '掉', + '±½' => '掃', + '±¾' => '掛', + '±¿' => 'æ«', + '±À' => '推', + '±Á' => '掄', + '±Â' => '授', + '±Ã' => '掙', + '±Ä' => '採', + '±Å' => '掬', + '±Æ' => '排', + '±Ç' => 'æŽ', + '±È' => '掀', + '±É' => 'æ»', + '±Ê' => 'æ©', + '±Ë' => 'æ¨', + '±Ì' => 'æº', + '±Í' => 'æ•', + '±Î' => 'æ•–', + '±Ï' => 'æ•‘', + '±Ð' => 'æ•™', + '±Ñ' => 'æ•—', + '±Ò' => '啟', + '±Ó' => 'æ•', + '±Ô' => '敘', + '±Õ' => 'æ••', + '±Ö' => 'æ•”', + '±×' => 'æ–œ', + '±Ø' => 'æ–›', + '±Ù' => 'æ–¬', + '±Ú' => 'æ—', + '±Û' => 'æ—‹', + '±Ü' => 'æ—Œ', + '±Ý' => 'æ—Ž', + '±Þ' => 'æ™', + '±ß' => '晚', + '±à' => '晤', + '±á' => '晨', + '±â' => '晦', + '±ã' => '晞', + '±ä' => '曹', + '±å' => 'å‹—', + '±æ' => '望', + '±ç' => 'æ¢', + '±è' => '梯', + '±é' => '梢', + '±ê' => '梓', + '±ë' => '梵', + '±ì' => 'æ¡¿', + '±í' => 'æ¡¶', + '±î' => '梱', + '±ï' => '梧', + '±ð' => '梗', + '±ñ' => '械', + '±ò' => '梃', + '±ó' => '棄', + '±ô' => '梭', + '±õ' => '梆', + '±ö' => '梅', + '±÷' => '梔', + '±ø' => 'æ¢', + '±ù' => '梨', + '±ú' => '梟', + '±û' => '梡', + '±ü' => '梂', + '±ý' => '欲', + '±þ' => '殺', + '²@' => '毫', + '²A' => '毬', + '²B' => 'æ°«', + '²C' => 'æ¶Ž', + '²D' => 'æ¶¼', + '²E' => 'æ·³', + '²F' => 'æ·™', + '²G' => 'æ¶²', + '²H' => 'æ·¡', + '²I' => 'æ·Œ', + '²J' => 'æ·¤', + '²K' => 'æ·»', + '²L' => 'æ·º', + '²M' => '清', + '²N' => 'æ·‡', + '²O' => 'æ·‹', + '²P' => '涯', + '²Q' => 'æ·‘', + '²R' => 'æ¶®', + '²S' => 'æ·ž', + '²T' => 'æ·¹', + '²U' => '涸', + '²V' => 'æ··', + '²W' => 'æ·µ', + '²X' => 'æ·…', + '²Y' => 'æ·’', + '²Z' => '渚', + '²[' => 'æ¶µ', + '²\\' => 'æ·š', + '²]' => 'æ·«', + '²^' => 'æ·˜', + '²_' => 'æ·ª', + '²`' => 'æ·±', + '²a' => 'æ·®', + '²b' => 'æ·¨', + '²c' => 'æ·†', + '²d' => 'æ·„', + '²e' => '涪', + '²f' => 'æ·¬', + '²g' => 'æ¶¿', + '²h' => 'æ·¦', + '²i' => '烹', + '²j' => '焉', + '²k' => '焊', + '²l' => '烽', + '²m' => '烯', + '²n' => '爽', + '²o' => '牽', + '²p' => 'çŠ', + '²q' => '猜', + '²r' => '猛', + '²s' => '猖', + '²t' => '猓', + '²u' => '猙', + '²v' => '率', + '²w' => 'ç…', + '²x' => 'çŠ', + '²y' => 'çƒ', + '²z' => 'ç†', + '²{' => 'ç¾', + '²|' => 'ç', + '²}' => 'ç“ ', + '²~' => 'ç“¶', + '²¡' => 'ç“·', + '²¢' => '甜', + '²£' => '產', + '²¤' => 'ç•¥', + '²¥' => '畦', + '²¦' => 'ç•¢', + '²§' => 'ç•°', + '²¨' => 'ç–', + '²©' => 'ç—”', + '²ª' => 'ç—•', + '²«' => 'ç–µ', + '²¬' => 'ç—Š', + '²­' => 'ç—', + '²®' => '皎', + '²¯' => 'ç›”', + '²°' => 'ç›’', + '²±' => 'ç››', + '²²' => '眷', + '²³' => '眾', + '²´' => '眼', + '²µ' => '眶', + '²¶' => '眸', + '²·' => '眺', + '²¸' => 'ç¡«', + '²¹' => '硃', + '²º' => '硎', + '²»' => '祥', + '²¼' => '票', + '²½' => '祭', + '²¾' => 'ç§»', + '²¿' => '窒', + '²À' => '窕', + '²Á' => '笠', + '²Â' => '笨', + '²Ã' => '笛', + '²Ä' => '第', + '²Å' => '符', + '²Æ' => '笙', + '²Ç' => '笞', + '²È' => '笮', + '²É' => 'ç²’', + '²Ê' => 'ç²—', + '²Ë' => '粕', + '²Ì' => '絆', + '²Í' => '絃', + '²Î' => 'çµ±', + '²Ï' => 'ç´®', + '²Ð' => 'ç´¹', + '²Ñ' => 'ç´¼', + '²Ò' => 'çµ€', + '²Ó' => 'ç´°', + '²Ô' => 'ç´³', + '²Õ' => '組', + '²Ö' => 'ç´¯', + '²×' => '終', + '²Ø' => 'ç´²', + '²Ù' => 'ç´±', + '²Ú' => 'ç¼½', + '²Û' => '羞', + '²Ü' => '羚', + '²Ý' => '翌', + '²Þ' => '翎', + '²ß' => 'ç¿’', + '²à' => '耜', + '²á' => 'èŠ', + '²â' => 'è†', + '²ã' => '脯', + '²ä' => 'è„–', + '²å' => 'è„£', + '²æ' => 'è„«', + '²ç' => 'è„©', + '²è' => 'è„°', + '²é' => '脤', + '²ê' => '舂', + '²ë' => '舵', + '²ì' => '舷', + '²í' => '舶', + '²î' => '船', + '²ï' => '莎', + '²ð' => '莞', + '²ñ' => '莘', + '²ò' => 'è¸', + '²ó' => '莢', + '²ô' => '莖', + '²õ' => '莽', + '²ö' => '莫', + '²÷' => '莒', + '²ø' => '莊', + '²ù' => '莓', + '²ú' => '莉', + '²û' => '莠', + '²ü' => 'è·', + '²ý' => 'è»', + '²þ' => 'è¼', + '³@' => '莆', + '³A' => '莧', + '³B' => '處', + '³C' => '彪', + '³D' => '蛇', + '³E' => '蛀', + '³F' => 'èš¶', + '³G' => '蛄', + '³H' => 'èšµ', + '³I' => '蛆', + '³J' => '蛋', + '³K' => 'èš±', + '³L' => '蚯', + '³M' => '蛉', + '³N' => 'è¡“', + '³O' => '袞', + '³P' => '袈', + '³Q' => '被', + '³R' => '袒', + '³S' => '袖', + '³T' => 'è¢', + '³U' => '袋', + '³V' => '覓', + '³W' => 'è¦', + '³X' => '訪', + '³Y' => 'è¨', + '³Z' => '訣', + '³[' => '訥', + '³\\' => '許', + '³]' => '設', + '³^' => '訟', + '³_' => '訛', + '³`' => '訢', + '³a' => '豉', + '³b' => '豚', + '³c' => '販', + '³d' => '責', + '³e' => '貫', + '³f' => '貨', + '³g' => '貪', + '³h' => 'è²§', + '³i' => 'èµ§', + '³j' => '赦', + '³k' => 'è¶¾', + '³l' => '趺', + '³m' => 'è»›', + '³n' => '軟', + '³o' => '這', + '³p' => 'é€', + '³q' => '通', + '³r' => '逗', + '³s' => '連', + '³t' => '速', + '³u' => 'é€', + '³v' => 'é€', + '³w' => '逕', + '³x' => '逞', + '³y' => '造', + '³z' => 'é€', + '³{' => '逢', + '³|' => '逖', + '³}' => '逛', + '³~' => '途', + '³¡' => '部', + '³¢' => '郭', + '³£' => '都', + '³¤' => 'é…—', + '³¥' => '野', + '³¦' => '釵', + '³§' => '釦', + '³¨' => '釣', + '³©' => '釧', + '³ª' => '釭', + '³«' => '釩', + '³¬' => 'é–‰', + '³­' => '陪', + '³®' => '陵', + '³¯' => '陳', + '³°' => '陸', + '³±' => 'é™°', + '³²' => 'é™´', + '³³' => 'é™¶', + '³´' => 'é™·', + '³µ' => '陬', + '³¶' => '雀', + '³·' => '雪', + '³¸' => '雩', + '³¹' => 'ç« ', + '³º' => '竟', + '³»' => 'é ‚', + '³¼' => 'é ƒ', + '³½' => 'é­š', + '³¾' => 'é³¥', + '³¿' => 'é¹µ', + '³À' => '鹿', + '³Á' => '麥', + '³Â' => '麻', + '³Ã' => 'å‚¢', + '³Ä' => 'å‚', + '³Å' => 'å‚…', + '³Æ' => 'å‚™', + '³Ç' => 'å‚‘', + '³È' => 'å‚€', + '³É' => 'å‚–', + '³Ê' => '傘', + '³Ë' => '傚', + '³Ì' => '最', + '³Í' => '凱', + '³Î' => '割', + '³Ï' => '剴', + '³Ð' => '創', + '³Ñ' => '剩', + '³Ò' => '勞', + '³Ó' => 'å‹', + '³Ô' => 'å‹›', + '³Õ' => 'åš', + '³Ö' => '厥', + '³×' => 'å•»', + '³Ø' => 'å–€', + '³Ù' => 'å–§', + '³Ú' => '啼', + '³Û' => 'å–Š', + '³Ü' => 'å–', + '³Ý' => 'å–˜', + '³Þ' => 'å–‚', + '³ß' => 'å–œ', + '³à' => 'å–ª', + '³á' => 'å–”', + '³â' => 'å–‡', + '³ã' => 'å–‹', + '³ä' => 'å–ƒ', + '³å' => 'å–³', + '³æ' => 'å–®', + '³ç' => 'å–Ÿ', + '³è' => '唾', + '³é' => 'å–²', + '³ê' => 'å–š', + '³ë' => 'å–»', + '³ì' => 'å–¬', + '³í' => 'å–±', + '³î' => '啾', + '³ï' => 'å–‰', + '³ð' => 'å–«', + '³ñ' => 'å–™', + '³ò' => 'åœ', + '³ó' => 'å ¯', + '³ô' => 'å ª', + '³õ' => 'å ´', + '³ö' => 'å ¤', + '³÷' => 'å °', + '³ø' => 'å ±', + '³ù' => 'å ¡', + '³ú' => 'å ', + '³û' => 'å  ', + '³ü' => '壹', + '³ý' => '壺', + '³þ' => '奠', + '´@' => 'å©·', + '´A' => '媚', + '´B' => 'å©¿', + '´C' => '媒', + '´D' => '媛', + '´E' => '媧', + '´F' => 'å­³', + '´G' => 'å­±', + '´H' => '寒', + '´I' => '富', + '´J' => '寓', + '´K' => 'å¯', + '´L' => 'å°Š', + '´M' => 'å°‹', + '´N' => 'å°±', + '´O' => '嵌', + '´P' => 'åµ', + '´Q' => 'å´´', + '´R' => '嵇', + '´S' => 'å·½', + '´T' => 'å¹…', + '´U' => '帽', + '´V' => 'å¹€', + '´W' => '幃', + '´X' => 'å¹¾', + '´Y' => '廊', + '´Z' => 'å»', + '´[' => '廂', + '´\\' => '廄', + '´]' => 'å¼¼', + '´^' => 'å½­', + '´_' => '復', + '´`' => '循', + '´a' => '徨', + '´b' => '惑', + '´c' => '惡', + '´d' => '悲', + '´e' => 'æ‚¶', + '´f' => '惠', + '´g' => '愜', + '´h' => 'æ„£', + '´i' => '惺', + '´j' => 'æ„•', + '´k' => '惰', + '´l' => '惻', + '´m' => '惴', + '´n' => 'æ…¨', + '´o' => '惱', + '´p' => '愎', + '´q' => '惶', + '´r' => '愉', + '´s' => 'æ„€', + '´t' => 'æ„’', + '´u' => '戟', + '´v' => '扉', + '´w' => '掣', + '´x' => '掌', + '´y' => 'æ', + '´z' => 'æ€', + '´{' => 'æ©', + '´|' => 'æ‰', + '´}' => 'æ†', + '´~' => 'æ', + '´¡' => 'æ’', + '´¢' => 'æ£', + '´£' => 'æ', + '´¤' => 'æ¡', + '´¥' => 'æ–', + '´¦' => 'æ­', + '´§' => 'æ®', + '´¨' => 'æ¶', + '´©' => 'æ´', + '´ª' => 'æª', + '´«' => 'æ›', + '´¬' => 'æ‘’', + '´­' => 'æš', + '´®' => 'æ¹', + '´¯' => '敞', + '´°' => '敦', + '´±' => 'æ•¢', + '´²' => 'æ•£', + '´³' => 'æ–‘', + '´´' => 'æ–', + '´µ' => 'æ–¯', + '´¶' => 'æ™®', + '´·' => 'æ™°', + '´¸' => 'æ™´', + '´¹' => 'æ™¶', + '´º' => '景', + '´»' => 'æš‘', + '´¼' => '智', + '´½' => '晾', + '´¾' => 'æ™·', + '´¿' => '曾', + '´À' => '替', + '´Á' => '期', + '´Â' => 'æœ', + '´Ã' => '棺', + '´Ä' => '棕', + '´Å' => '棠', + '´Æ' => '棘', + '´Ç' => '棗', + '´È' => '椅', + '´É' => '棟', + '´Ê' => '棵', + '´Ë' => '森', + '´Ì' => '棧', + '´Í' => '棹', + '´Î' => '棒', + '´Ï' => '棲', + '´Ð' => '棣', + '´Ñ' => '棋', + '´Ò' => 'æ£', + '´Ó' => 'æ¤', + '´Ô' => '椒', + '´Õ' => '椎', + '´Ö' => '棉', + '´×' => '棚', + '´Ø' => '楮', + '´Ù' => '棻', + '´Ú' => '款', + '´Û' => '欺', + '´Ü' => '欽', + '´Ý' => '殘', + '´Þ' => 'æ®–', + '´ß' => '殼', + '´à' => '毯', + '´á' => 'æ°®', + '´â' => 'æ°¯', + '´ã' => 'æ°¬', + '´ä' => '港', + '´å' => '游', + '´æ' => 'æ¹”', + '´ç' => '渡', + '´è' => '渲', + '´é' => 'æ¹§', + '´ê' => '湊', + '´ë' => '渠', + '´ì' => '渥', + '´í' => '渣', + '´î' => '減', + '´ï' => 'æ¹›', + '´ð' => '湘', + '´ñ' => '渤', + '´ò' => 'æ¹–', + '´ó' => 'æ¹®', + '´ô' => '渭', + '´õ' => '渦', + '´ö' => '湯', + '´÷' => '渴', + '´ø' => 'æ¹', + '´ù' => '渺', + '´ú' => '測', + '´û' => '湃', + '´ü' => 'æ¸', + '´ý' => '渾', + '´þ' => '滋', + 'µ@' => '溉', + 'µA' => '渙', + 'µB' => '湎', + 'µC' => 'æ¹£', + 'µD' => '湄', + 'µE' => 'æ¹²', + 'µF' => '湩', + 'µG' => '湟', + 'µH' => 'ç„™', + 'µI' => '焚', + 'µJ' => '焦', + 'µK' => 'ç„°', + 'µL' => 'ç„¡', + 'µM' => 'ç„¶', + 'µN' => 'ç…®', + 'µO' => '焜', + 'µP' => '牌', + 'µQ' => '犄', + 'µR' => '犀', + 'µS' => '猶', + 'µT' => '猥', + 'µU' => '猴', + 'µV' => '猩', + 'µW' => 'çº', + 'µX' => 'çª', + 'µY' => 'ç³', + 'µZ' => 'ç¢', + 'µ[' => 'ç¥', + 'µ\\' => 'çµ', + 'µ]' => 'ç¶', + 'µ^' => 'ç´', + 'µ_' => 'ç¯', + 'µ`' => 'ç›', + 'µa' => 'ç¦', + 'µb' => 'ç¨', + 'µc' => '甥', + 'µd' => '甦', + 'µe' => 'ç•«', + 'µf' => '番', + 'µg' => 'ç—¢', + 'µh' => 'ç—›', + 'µi' => 'ç—£', + 'µj' => 'ç—™', + 'µk' => 'ç—˜', + 'µl' => 'ç—ž', + 'µm' => 'ç— ', + 'µn' => 'ç™»', + 'µo' => '發', + 'µp' => 'çš–', + 'µq' => 'çš“', + 'µr' => 'çš´', + 'µs' => '盜', + 'µt' => 'ç', + 'µu' => '短', + 'µv' => 'ç¡', + 'µw' => '硬', + 'µx' => '硯', + 'µy' => 'ç¨', + 'µz' => '稈', + 'µ{' => '程', + 'µ|' => '稅', + 'µ}' => '稀', + 'µ~' => '窘', + 'µ¡' => '窗', + 'µ¢' => '窖', + 'µ£' => 'ç«¥', + 'µ¤' => 'ç«£', + 'µ¥' => 'ç­‰', + 'µ¦' => 'ç­–', + 'µ§' => 'ç­†', + 'µ¨' => 'ç­', + 'µ©' => 'ç­’', + 'µª' => 'ç­”', + 'µ«' => 'ç­', + 'µ¬' => 'ç­‹', + 'µ­' => 'ç­', + 'µ®' => 'ç­‘', + 'µ¯' => '粟', + 'µ°' => 'ç²¥', + 'µ±' => '絞', + 'µ²' => 'çµ', + 'µ³' => '絨', + 'µ´' => '絕', + 'µµ' => 'ç´«', + 'µ¶' => 'çµ®', + 'µ·' => 'çµ²', + 'µ¸' => '絡', + 'µ¹' => '給', + 'µº' => 'çµ¢', + 'µ»' => 'çµ°', + 'µ¼' => 'çµ³', + 'µ½' => 'å–„', + 'µ¾' => 'ç¿”', + 'µ¿' => 'ç¿•', + 'µÀ' => '耋', + 'µÁ' => 'è’', + 'µÂ' => 'è‚…', + 'µÃ' => 'è…•', + 'µÄ' => 'è…”', + 'µÅ' => 'è…‹', + 'µÆ' => 'è…‘', + 'µÇ' => 'è…Ž', + 'µÈ' => '脹', + 'µÉ' => 'è…†', + 'µÊ' => '脾', + 'µË' => 'è…Œ', + 'µÌ' => 'è…“', + 'µÍ' => 'è…´', + 'µÎ' => '舒', + 'µÏ' => '舜', + 'µÐ' => 'è©', + 'µÑ' => 'èƒ', + 'µÒ' => 'è¸', + 'µÓ' => 'è', + 'µÔ' => 'è ', + 'µÕ' => 'è…', + 'µÖ' => 'è‹', + 'µ×' => 'è', + 'µØ' => 'è¯', + 'µÙ' => 'è±', + 'µÚ' => 'è´', + 'µÛ' => 'è‘—', + 'µÜ' => 'èŠ', + 'µÝ' => 'è°', + 'µÞ' => 'èŒ', + 'µß' => 'èŒ', + 'µà' => 'è½', + 'µá' => 'è²', + 'µâ' => 'èŠ', + 'µã' => 'è¸', + 'µä' => 'èŽ', + 'µå' => 'è„', + 'µæ' => 'èœ', + 'µç' => 'è‡', + 'µè' => 'è”', + 'µé' => 'èŸ', + 'µê' => 'è™›', + 'µë' => '蛟', + 'µì' => 'è›™', + 'µí' => 'è›­', + 'µî' => 'è›”', + 'µï' => 'è››', + 'µð' => '蛤', + 'µñ' => 'è›', + 'µò' => '蛞', + 'µó' => 'è¡—', + 'µô' => 'è£', + 'µõ' => '裂', + 'µö' => '袱', + 'µ÷' => '覃', + 'µø' => '視', + 'µù' => '註', + 'µú' => 'è© ', + 'µû' => 'è©•', + 'µü' => '詞', + 'µý' => '証', + 'µþ' => 'è©', + '¶@' => 'è©”', + '¶A' => 'è©›', + '¶B' => 'è©', + '¶C' => '詆', + '¶D' => '訴', + '¶E' => '診', + '¶F' => '訶', + '¶G' => 'è©–', + '¶H' => '象', + '¶I' => '貂', + '¶J' => '貯', + '¶K' => 'è²¼', + '¶L' => 'è²³', + '¶M' => 'è²½', + '¶N' => 'è³', + '¶O' => 'è²»', + '¶P' => 'è³€', + '¶Q' => 'è²´', + '¶R' => 'è²·', + '¶S' => 'è²¶', + '¶T' => '貿', + '¶U' => '貸', + '¶V' => 'è¶Š', + '¶W' => 'è¶…', + '¶X' => 'è¶', + '¶Y' => 'è·Ž', + '¶Z' => 'è·', + '¶[' => 'è·‹', + '¶\\' => 'è·š', + '¶]' => 'è·‘', + '¶^' => 'è·Œ', + '¶_' => 'è·›', + '¶`' => 'è·†', + '¶a' => 'è»»', + '¶b' => '軸', + '¶c' => '軼', + '¶d' => '辜', + '¶e' => '逮', + '¶f' => '逵', + '¶g' => '週', + '¶h' => '逸', + '¶i' => '進', + '¶j' => '逶', + '¶k' => 'é„‚', + '¶l' => '郵', + '¶m' => '鄉', + '¶n' => '郾', + '¶o' => 'é…£', + '¶p' => 'é…¥', + '¶q' => 'é‡', + '¶r' => '鈔', + '¶s' => '鈕', + '¶t' => '鈣', + '¶u' => '鈉', + '¶v' => '鈞', + '¶w' => 'éˆ', + '¶x' => 'éˆ', + '¶y' => '鈇', + '¶z' => '鈑', + '¶{' => 'é–”', + '¶|' => 'é–', + '¶}' => 'é–‹', + '¶~' => 'é–‘', + '¶¡' => 'é–“', + '¶¢' => 'é–’', + '¶£' => 'é–Ž', + '¶¤' => '隊', + '¶¥' => '階', + '¶¦' => 'éš‹', + '¶§' => '陽', + '¶¨' => 'éš…', + '¶©' => '隆', + '¶ª' => 'éš', + '¶«' => '陲', + '¶¬' => 'éš„', + '¶­' => 'é›', + '¶®' => 'é›…', + '¶¯' => '雄', + '¶°' => '集', + '¶±' => '雇', + '¶²' => '雯', + '¶³' => '雲', + '¶´' => '韌', + '¶µ' => 'é …', + '¶¶' => 'é †', + '¶·' => 'é ˆ', + '¶¸' => '飧', + '¶¹' => '飪', + '¶º' => '飯', + '¶»' => '飩', + '¶¼' => '飲', + '¶½' => '飭', + '¶¾' => '馮', + '¶¿' => '馭', + '¶À' => '黃', + '¶Á' => 'é»', + '¶Â' => '黑', + '¶Ã' => '亂', + '¶Ä' => 'å‚­', + '¶Å' => '債', + '¶Æ' => '傲', + '¶Ç' => '傳', + '¶È' => '僅', + '¶É' => '傾', + '¶Ê' => '催', + '¶Ë' => 'å‚·', + '¶Ì' => 'å‚»', + '¶Í' => '傯', + '¶Î' => '僇', + '¶Ï' => '剿', + '¶Ð' => '剷', + '¶Ñ' => '剽', + '¶Ò' => '募', + '¶Ó' => '勦', + '¶Ô' => '勤', + '¶Õ' => 'å‹¢', + '¶Ö' => 'å‹£', + '¶×' => '匯', + '¶Ø' => 'å—Ÿ', + '¶Ù' => 'å—¨', + '¶Ú' => 'å—“', + '¶Û' => 'å—¦', + '¶Ü' => 'å—Ž', + '¶Ý' => 'å—œ', + '¶Þ' => 'å—‡', + '¶ß' => 'å—‘', + '¶à' => 'å—£', + '¶á' => 'å—¤', + '¶â' => 'å—¯', + '¶ã' => 'å—š', + '¶ä' => 'å—¡', + '¶å' => 'å—…', + '¶æ' => 'å—†', + '¶ç' => 'å—¥', + '¶è' => 'å—‰', + '¶é' => '園', + '¶ê' => '圓', + '¶ë' => '塞', + '¶ì' => 'å¡‘', + '¶í' => '塘', + '¶î' => 'å¡—', + '¶ï' => '塚', + '¶ð' => 'å¡”', + '¶ñ' => 'å¡«', + '¶ò' => '塌', + '¶ó' => 'å¡­', + '¶ô' => '塊', + '¶õ' => 'å¡¢', + '¶ö' => 'å¡’', + '¶÷' => 'å¡‹', + '¶ø' => '奧', + '¶ù' => 'å«', + '¶ú' => '嫉', + '¶û' => '嫌', + '¶ü' => '媾', + '¶ý' => '媽', + '¶þ' => '媼', + '·@' => '媳', + '·A' => 'å«‚', + '·B' => '媲', + '·C' => '嵩', + '·D' => '嵯', + '·E' => '幌', + '·F' => 'å¹¹', + '·G' => '廉', + '·H' => '廈', + '·I' => 'å¼’', + '·J' => 'å½™', + '·K' => '徬', + '·L' => 'å¾®', + '·M' => '愚', + '·N' => 'æ„', + '·O' => 'æ…ˆ', + '·P' => '感', + '·Q' => '想', + '·R' => 'æ„›', + '·S' => '惹', + '·T' => 'æ„', + '·U' => '愈', + '·V' => 'æ…Ž', + '·W' => 'æ…Œ', + '·X' => 'æ…„', + '·Y' => 'æ…', + '·Z' => '愾', + '·[' => 'æ„´', + '·\\' => 'æ„§', + '·]' => 'æ„', + '·^' => '愆', + '·_' => 'æ„·', + '·`' => '戡', + '·a' => '戢', + '·b' => 'æ“', + '·c' => 'æ¾', + '·d' => 'æž', + '·e' => 'æª', + '·f' => 'æ­', + '·g' => 'æ½', + '·h' => 'æ¬', + '·i' => 'æ', + '·j' => 'æœ', + '·k' => 'æ”', + '·l' => 'æ', + '·m' => 'æ¶', + '·n' => 'æ–', + '·o' => 'æ—', + '·p' => 'æ†', + '·q' => '敬', + '·r' => 'æ–Ÿ', + '·s' => 'æ–°', + '·t' => 'æš—', + '·u' => '暉', + '·v' => '暇', + '·w' => '暈', + '·x' => 'æš–', + '·y' => 'æš„', + '·z' => '暘', + '·{' => 'æš', + '·|' => '會', + '·}' => '榔', + '·~' => '業', + '·¡' => '楚', + '·¢' => '楷', + '·£' => '楠', + '·¤' => '楔', + '·¥' => '極', + '·¦' => '椰', + '·§' => '概', + '·¨' => '楊', + '·©' => '楨', + '·ª' => '楫', + '·«' => '楞', + '·¬' => '楓', + '·­' => '楹', + '·®' => '榆', + '·¯' => 'æ¥', + '·°' => '楣', + '·±' => '楛', + '·²' => 'æ­‡', + '·³' => 'æ­²', + '·´' => '毀', + '·µ' => '殿', + '·¶' => '毓', + '··' => '毽', + '·¸' => '溢', + '·¹' => '溯', + '·º' => '滓', + '·»' => '溶', + '·¼' => '滂', + '·½' => 'æº', + '·¾' => 'æº', + '·¿' => '滇', + '·À' => 'æ»…', + '·Á' => '溥', + '·Â' => '溘', + '·Ã' => '溼', + '·Ä' => '溺', + '·Å' => '溫', + '·Æ' => '滑', + '·Ç' => '準', + '·È' => '溜', + '·É' => '滄', + '·Ê' => 'æ»”', + '·Ë' => '溪', + '·Ì' => '溧', + '·Í' => '溴', + '·Î' => 'ç…Ž', + '·Ï' => 'ç…™', + '·Ð' => 'ç…©', + '·Ñ' => 'ç…¤', + '·Ò' => 'ç…‰', + '·Ó' => 'ç…§', + '·Ô' => 'ç…œ', + '·Õ' => 'ç…¬', + '·Ö' => 'ç…¦', + '·×' => 'ç…Œ', + '·Ø' => 'ç…¥', + '·Ù' => 'ç…ž', + '·Ú' => 'ç…†', + '·Û' => 'ç…¨', + '·Ü' => 'ç…–', + '·Ý' => '爺', + '·Þ' => '牒', + '·ß' => '猷', + '·à' => 'ç…', + '·á' => '猿', + '·â' => '猾', + '·ã' => '瑯', + '·ä' => '瑚', + '·å' => 'ç‘•', + '·æ' => '瑟', + '·ç' => '瑞', + '·è' => 'ç‘', + '·é' => 'ç¿', + '·ê' => 'ç‘™', + '·ë' => 'ç‘›', + '·ì' => '瑜', + '·í' => 'ç•¶', + '·î' => '畸', + '·ï' => '瘀', + '·ð' => 'ç—°', + '·ñ' => 'ç˜', + '·ò' => 'ç—²', + '·ó' => 'ç—±', + '·ô' => 'ç—º', + '·õ' => 'ç—¿', + '·ö' => 'ç—´', + '·÷' => 'ç—³', + '·ø' => '盞', + '·ù' => '盟', + '·ú' => 'ç›', + '·û' => 'ç«', + '·ü' => 'ç¦', + '·ý' => 'çž', + '·þ' => 'ç£', + '¸@' => 'ç¹', + '¸A' => 'çª', + '¸B' => 'ç¬', + '¸C' => 'çœ', + '¸D' => 'ç¥', + '¸E' => 'ç¨', + '¸F' => 'ç¢', + '¸G' => '矮', + '¸H' => '碎', + '¸I' => '碰', + '¸J' => '碗', + '¸K' => '碘', + '¸L' => '碌', + '¸M' => '碉', + '¸N' => '硼', + '¸O' => '碑', + '¸P' => '碓', + '¸Q' => 'ç¡¿', + '¸R' => '祺', + '¸S' => '祿', + '¸T' => 'ç¦', + '¸U' => 'è¬', + '¸V' => '禽', + '¸W' => '稜', + '¸X' => '稚', + '¸Y' => '稠', + '¸Z' => '稔', + '¸[' => '稟', + '¸\\' => '稞', + '¸]' => '窟', + '¸^' => '窠', + '¸_' => 'ç­·', + '¸`' => '節', + '¸a' => 'ç­ ', + '¸b' => 'ç­®', + '¸c' => 'ç­§', + '¸d' => 'ç²±', + '¸e' => 'ç²³', + '¸f' => 'ç²µ', + '¸g' => 'ç¶“', + '¸h' => 'çµ¹', + '¸i' => 'ç¶‘', + '¸j' => 'ç¶', + '¸k' => 'ç¶', + '¸l' => 'çµ›', + '¸m' => 'ç½®', + '¸n' => '罩', + '¸o' => '罪', + '¸p' => 'ç½²', + '¸q' => '義', + '¸r' => '羨', + '¸s' => '群', + '¸t' => 'è–', + '¸u' => 'è˜', + '¸v' => '肆', + '¸w' => 'è‚„', + '¸x' => 'è…±', + '¸y' => 'è…°', + '¸z' => 'è…¸', + '¸{' => 'è…¥', + '¸|' => 'è…®', + '¸}' => 'è…³', + '¸~' => 'è…«', + '¸¡' => 'è…¹', + '¸¢' => 'è…º', + '¸£' => 'è…¦', + '¸¤' => '舅', + '¸¥' => '艇', + '¸¦' => 'è’‚', + '¸§' => 'è‘·', + '¸¨' => 'è½', + '¸©' => 'è±', + '¸ª' => '葵', + '¸«' => '葦', + '¸¬' => 'è‘«', + '¸­' => '葉', + '¸®' => '葬', + '¸¯' => 'è‘›', + '¸°' => 'è¼', + '¸±' => 'èµ', + '¸²' => 'è‘¡', + '¸³' => 'è‘£', + '¸´' => 'è‘©', + '¸µ' => 'è‘­', + '¸¶' => '葆', + '¸·' => '虞', + '¸¸' => '虜', + '¸¹' => '號', + '¸º' => '蛹', + '¸»' => '蜓', + '¸¼' => '蜈', + '¸½' => '蜇', + '¸¾' => '蜀', + '¸¿' => '蛾', + '¸À' => 'è›»', + '¸Á' => '蜂', + '¸Â' => '蜃', + '¸Ã' => '蜆', + '¸Ä' => '蜊', + '¸Å' => 'è¡™', + '¸Æ' => '裟', + '¸Ç' => '裔', + '¸È' => '裙', + '¸É' => '補', + '¸Ê' => '裘', + '¸Ë' => 'è£', + '¸Ì' => '裡', + '¸Í' => '裊', + '¸Î' => '裕', + '¸Ï' => '裒', + '¸Ð' => '覜', + '¸Ñ' => 'è§£', + '¸Ò' => 'è©«', + '¸Ó' => '該', + '¸Ô' => '詳', + '¸Õ' => '試', + '¸Ö' => 'è©©', + '¸×' => 'è©°', + '¸Ø' => '誇', + '¸Ù' => '詼', + '¸Ú' => 'è©£', + '¸Û' => '誠', + '¸Ü' => '話', + '¸Ý' => '誅', + '¸Þ' => 'è©­', + '¸ß' => 'è©¢', + '¸à' => 'è©®', + '¸á' => '詬', + '¸â' => '詹', + '¸ã' => 'è©»', + '¸ä' => '訾', + '¸å' => '詨', + '¸æ' => 'è±¢', + '¸ç' => '貊', + '¸è' => '貉', + '¸é' => '賊', + '¸ê' => '資', + '¸ë' => '賈', + '¸ì' => '賄', + '¸í' => 'è²²', + '¸î' => '賃', + '¸ï' => '賂', + '¸ð' => 'è³…', + '¸ñ' => 'è·¡', + '¸ò' => 'è·Ÿ', + '¸ó' => 'è·¨', + '¸ô' => 'è·¯', + '¸õ' => 'è·³', + '¸ö' => 'è·º', + '¸÷' => 'è·ª', + '¸ø' => 'è·¤', + '¸ù' => 'è·¦', + '¸ú' => '躲', + '¸û' => '較', + '¸ü' => '載', + '¸ý' => '軾', + '¸þ' => '輊', + '¹@' => '辟', + '¹A' => 'è¾²', + '¹B' => 'é‹', + '¹C' => 'éŠ', + '¹D' => 'é“', + '¹E' => 'é‚', + '¹F' => 'é”', + '¹G' => '逼', + '¹H' => 'é•', + '¹I' => 'é', + '¹J' => 'é‡', + '¹K' => 'é', + '¹L' => 'éŽ', + '¹M' => 'é', + '¹N' => 'é‘', + '¹O' => '逾', + '¹P' => 'é', + '¹Q' => 'é„’', + '¹R' => 'é„—', + '¹S' => 'é…¬', + '¹T' => 'é…ª', + '¹U' => 'é…©', + '¹V' => '釉', + '¹W' => '鈷', + '¹X' => '鉗', + '¹Y' => '鈸', + '¹Z' => '鈽', + '¹[' => '鉀', + '¹\\' => '鈾', + '¹]' => '鉛', + '¹^' => '鉋', + '¹_' => '鉤', + '¹`' => '鉑', + '¹a' => '鈴', + '¹b' => '鉉', + '¹c' => 'é‰', + '¹d' => '鉅', + '¹e' => '鈹', + '¹f' => '鈿', + '¹g' => '鉚', + '¹h' => 'é–˜', + '¹i' => '隘', + '¹j' => 'éš”', + '¹k' => 'éš•', + '¹l' => 'é›', + '¹m' => '雋', + '¹n' => '雉', + '¹o' => '雊', + '¹p' => 'é›·', + '¹q' => 'é›»', + '¹r' => '雹', + '¹s' => 'é›¶', + '¹t' => 'é–', + '¹u' => 'é´', + '¹v' => 'é¶', + '¹w' => 'é ', + '¹x' => 'é ‘', + '¹y' => 'é “', + '¹z' => 'é Š', + '¹{' => 'é ’', + '¹|' => 'é Œ', + '¹}' => '飼', + '¹~' => '飴', + '¹¡' => '飽', + '¹¢' => '飾', + '¹£' => '馳', + '¹¤' => '馱', + '¹¥' => '馴', + '¹¦' => 'é«¡', + '¹§' => '鳩', + '¹¨' => '麂', + '¹©' => '鼎', + '¹ª' => '鼓', + '¹«' => 'é¼ ', + '¹¬' => '僧', + '¹­' => '僮', + '¹®' => '僥', + '¹¯' => '僖', + '¹°' => '僭', + '¹±' => '僚', + '¹²' => '僕', + '¹³' => 'åƒ', + '¹´' => '僑', + '¹µ' => '僱', + '¹¶' => '僎', + '¹·' => '僩', + '¹¸' => 'å…¢', + '¹¹' => '凳', + '¹º' => '劃', + '¹»' => '劂', + '¹¼' => '匱', + '¹½' => '厭', + '¹¾' => 'å—¾', + '¹¿' => '嘀', + '¹À' => '嘛', + '¹Á' => '嘗', + '¹Â' => 'å—½', + '¹Ã' => '嘔', + '¹Ä' => '嘆', + '¹Å' => '嘉', + '¹Æ' => 'å˜', + '¹Ç' => '嘎', + '¹È' => 'å—·', + '¹É' => '嘖', + '¹Ê' => '嘟', + '¹Ë' => '嘈', + '¹Ì' => 'å˜', + '¹Í' => 'å—¶', + '¹Î' => '團', + '¹Ï' => '圖', + '¹Ð' => '塵', + '¹Ñ' => '塾', + '¹Ò' => '境', + '¹Ó' => '墓', + '¹Ô' => '墊', + '¹Õ' => '塹', + '¹Ö' => '墅', + '¹×' => '塽', + '¹Ø' => '壽', + '¹Ù' => '夥', + '¹Ú' => '夢', + '¹Û' => '夤', + '¹Ü' => '奪', + '¹Ý' => '奩', + '¹Þ' => 'å«¡', + '¹ß' => '嫦', + '¹à' => 'å«©', + '¹á' => 'å«—', + '¹â' => 'å«–', + '¹ã' => '嫘', + '¹ä' => 'å«£', + '¹å' => 'å­µ', + '¹æ' => '寞', + '¹ç' => '寧', + '¹è' => '寡', + '¹é' => '寥', + '¹ê' => '實', + '¹ë' => '寨', + '¹ì' => '寢', + '¹í' => '寤', + '¹î' => '察', + '¹ï' => 'å°', + '¹ð' => 'å±¢', + '¹ñ' => 'å¶„', + '¹ò' => '嶇', + '¹ó' => 'å¹›', + '¹ô' => 'å¹£', + '¹õ' => '幕', + '¹ö' => 'å¹—', + '¹÷' => 'å¹”', + '¹ø' => '廓', + '¹ù' => 'å»–', + '¹ú' => '弊', + '¹û' => '彆', + '¹ü' => 'å½°', + '¹ý' => 'å¾¹', + '¹þ' => 'æ…‡', + 'º@' => 'æ„¿', + 'ºA' => 'æ…‹', + 'ºB' => 'æ…·', + 'ºC' => 'æ…¢', + 'ºD' => 'æ…£', + 'ºE' => 'æ…Ÿ', + 'ºF' => 'æ…š', + 'ºG' => 'æ…˜', + 'ºH' => 'æ…µ', + 'ºI' => '截', + 'ºJ' => 'æ’‡', + 'ºK' => '摘', + 'ºL' => 'æ‘”', + 'ºM' => 'æ’¤', + 'ºN' => '摸', + 'ºO' => '摟', + 'ºP' => '摺', + 'ºQ' => 'æ‘‘', + 'ºR' => 'æ‘§', + 'ºS' => 'æ´', + 'ºT' => 'æ‘­', + 'ºU' => 'æ‘»', + 'ºV' => '敲', + 'ºW' => 'æ–¡', + 'ºX' => 'æ——', + 'ºY' => 'æ—–', + 'ºZ' => '暢', + 'º[' => '暨', + 'º\\' => 'æš', + 'º]' => '榜', + 'º^' => '榨', + 'º_' => '榕', + 'º`' => 'æ§', + 'ºa' => '榮', + 'ºb' => 'æ§“', + 'ºc' => 'æ§‹', + 'ºd' => '榛', + 'ºe' => '榷', + 'ºf' => '榻', + 'ºg' => '榫', + 'ºh' => '榴', + 'ºi' => 'æ§', + 'ºj' => 'æ§', + 'ºk' => '榭', + 'ºl' => 'æ§Œ', + 'ºm' => '榦', + 'ºn' => '槃', + 'ºo' => '榣', + 'ºp' => 'æ­‰', + 'ºq' => 'æ­Œ', + 'ºr' => 'æ°³', + 'ºs' => 'æ¼³', + 'ºt' => 'æ¼”', + 'ºu' => '滾', + 'ºv' => '漓', + 'ºw' => 'æ»´', + 'ºx' => '漩', + 'ºy' => 'æ¼¾', + 'ºz' => 'æ¼ ', + 'º{' => '漬', + 'º|' => 'æ¼', + 'º}' => '漂', + 'º~' => 'æ¼¢', + 'º¡' => '滿', + 'º¢' => '滯', + 'º£' => '漆', + 'º¤' => 'æ¼±', + 'º¥' => '漸', + 'º¦' => 'æ¼²', + 'º§' => 'æ¼£', + 'º¨' => '漕', + 'º©' => '漫', + 'ºª' => '漯', + 'º«' => '澈', + 'º¬' => '漪', + 'º­' => '滬', + 'º®' => 'æ¼', + 'º¯' => '滲', + 'º°' => '滌', + 'º±' => 'æ»·', + 'º²' => '熔', + 'º³' => '熙', + 'º´' => 'ç…½', + 'ºµ' => '熊', + 'º¶' => '熄', + 'º·' => '熒', + 'º¸' => '爾', + 'º¹' => '犒', + 'ºº' => '犖', + 'º»' => 'ç„', + 'º¼' => 'ç', + 'º½' => '瑤', + 'º¾' => 'ç‘£', + 'º¿' => '瑪', + 'ºÀ' => 'ç‘°', + 'ºÁ' => 'ç‘­', + 'ºÂ' => '甄', + 'ºÃ' => 'ç–‘', + 'ºÄ' => '瘧', + 'ºÅ' => 'ç˜', + 'ºÆ' => '瘋', + 'ºÇ' => '瘉', + 'ºÈ' => '瘓', + 'ºÉ' => '盡', + 'ºÊ' => '監', + 'ºË' => 'çž„', + 'ºÌ' => 'ç½', + 'ºÍ' => 'ç¿', + 'ºÎ' => 'ç¡', + 'ºÏ' => 'ç£', + 'ºÐ' => '碟', + 'ºÑ' => '碧', + 'ºÒ' => '碳', + 'ºÓ' => '碩', + 'ºÔ' => '碣', + 'ºÕ' => '禎', + 'ºÖ' => 'ç¦', + 'º×' => 'ç¦', + 'ºØ' => '種', + 'ºÙ' => '稱', + 'ºÚ' => '窪', + 'ºÛ' => '窩', + 'ºÜ' => 'ç«­', + 'ºÝ' => '端', + 'ºÞ' => '管', + 'ºß' => '箕', + 'ºà' => '箋', + 'ºá' => 'ç­µ', + 'ºâ' => 'ç®—', + 'ºã' => 'ç®', + 'ºä' => 'ç®”', + 'ºå' => 'ç®', + 'ºæ' => '箸', + 'ºç' => '箇', + 'ºè' => '箄', + 'ºé' => 'ç²¹', + 'ºê' => 'ç²½', + 'ºë' => 'ç²¾', + 'ºì' => 'ç¶»', + 'ºí' => 'ç¶°', + 'ºî' => 'ç¶œ', + 'ºï' => 'ç¶½', + 'ºð' => 'ç¶¾', + 'ºñ' => 'ç¶ ', + 'ºò' => 'ç·Š', + 'ºó' => 'ç¶´', + 'ºô' => 'ç¶²', + 'ºõ' => 'ç¶±', + 'ºö' => '綺', + 'º÷' => 'ç¶¢', + 'ºø' => 'ç¶¿', + 'ºù' => 'ç¶µ', + 'ºú' => '綸', + 'ºû' => 'ç¶­', + 'ºü' => 'ç·’', + 'ºý' => 'ç·‡', + 'ºþ' => '綬', + '»@' => 'ç½°', + '»A' => 'ç¿ ', + '»B' => 'ç¿¡', + '»C' => '翟', + '»D' => 'èž', + '»E' => 'èš', + '»F' => '肇', + '»G' => 'è…', + '»H' => '膀', + '»I' => 'è†', + '»J' => '膈', + '»K' => '膊', + '»L' => 'è…¿', + '»M' => '膂', + '»N' => '臧', + '»O' => '臺', + '»P' => '與', + '»Q' => '舔', + '»R' => '舞', + '»S' => '艋', + '»T' => '蓉', + '»U' => 'è’¿', + '»V' => '蓆', + '»W' => 'è“„', + '»X' => 'è’™', + '»Y' => 'è’ž', + '»Z' => 'è’²', + '»[' => 'è’œ', + '»\\' => 'è“‹', + '»]' => 'è’¸', + '»^' => 'è“€', + '»_' => 'è““', + '»`' => 'è’', + '»a' => 'è’¼', + '»b' => 'è“‘', + '»c' => '蓊', + '»d' => '蜿', + '»e' => '蜜', + '»f' => '蜻', + '»g' => '蜢', + '»h' => '蜥', + '»i' => '蜴', + '»j' => '蜘', + '»k' => 'è•', + '»l' => '蜷', + '»m' => '蜩', + '»n' => '裳', + '»o' => '褂', + '»p' => '裴', + '»q' => '裹', + '»r' => '裸', + '»s' => '製', + '»t' => '裨', + '»u' => '褚', + '»v' => '裯', + '»w' => '誦', + '»x' => '誌', + '»y' => '語', + '»z' => '誣', + '»{' => 'èª', + '»|' => '誡', + '»}' => '誓', + '»~' => '誤', + '»¡' => '說', + '»¢' => '誥', + '»£' => '誨', + '»¤' => '誘', + '»¥' => '誑', + '»¦' => '誚', + '»§' => '誧', + '»¨' => '豪', + '»©' => 'è²', + '»ª' => '貌', + '»«' => '賓', + '»¬' => '賑', + '»­' => 'è³’', + '»®' => '赫', + '»¯' => 'è¶™', + '»°' => 'è¶•', + '»±' => 'è·¼', + '»²' => 'è¼”', + '»³' => 'è¼’', + '»´' => '輕', + '»µ' => '輓', + '»¶' => 'è¾£', + '»·' => 'é ', + '»¸' => 'é˜', + '»¹' => 'éœ', + '»º' => 'é£', + '»»' => 'é™', + '»¼' => 'éž', + '»½' => 'é¢', + '»¾' => 'é', + '»¿' => 'é›', + '»À' => 'é„™', + '»Á' => '鄘', + '»Â' => '鄞', + '»Ã' => 'é…µ', + '»Ä' => 'é…¸', + '»Å' => 'é…·', + '»Æ' => 'é…´', + '»Ç' => '鉸', + '»È' => '銀', + '»É' => '銅', + '»Ê' => '銘', + '»Ë' => '銖', + '»Ì' => '鉻', + '»Í' => '銓', + '»Î' => '銜', + '»Ï' => '銨', + '»Ð' => '鉼', + '»Ñ' => '銑', + '»Ò' => 'é–¡', + '»Ó' => 'é–¨', + '»Ô' => 'é–©', + '»Õ' => 'é–£', + '»Ö' => 'é–¥', + '»×' => 'é–¤', + '»Ø' => 'éš™', + '»Ù' => 'éšœ', + '»Ú' => 'éš›', + '»Û' => '雌', + '»Ü' => 'é›’', + '»Ý' => '需', + '»Þ' => 'é¼', + '»ß' => 'éž…', + '»à' => '韶', + '»á' => 'é —', + '»â' => 'é ˜', + '»ã' => '颯', + '»ä' => '颱', + '»å' => '餃', + '»æ' => '餅', + '»ç' => '餌', + '»è' => '餉', + '»é' => 'é§', + '»ê' => '骯', + '»ë' => '骰', + '»ì' => '髦', + '»í' => 'é­', + '»î' => 'é­‚', + '»ï' => 'é³´', + '»ð' => 'é³¶', + '»ñ' => 'é³³', + '»ò' => '麼', + '»ó' => 'é¼»', + '»ô' => '齊', + '»õ' => 'å„„', + '»ö' => 'å„€', + '»÷' => '僻', + '»ø' => '僵', + '»ù' => '價', + '»ú' => 'å„‚', + '»û' => '儈', + '»ü' => '儉', + '»ý' => 'å„…', + '»þ' => '凜', + '¼@' => '劇', + '¼A' => '劈', + '¼B' => '劉', + '¼C' => 'åŠ', + '¼D' => '劊', + '¼E' => 'å‹°', + '¼F' => '厲', + '¼G' => '嘮', + '¼H' => '嘻', + '¼I' => '嘹', + '¼J' => '嘲', + '¼K' => '嘿', + '¼L' => '嘴', + '¼M' => '嘩', + '¼N' => '噓', + '¼O' => '噎', + '¼P' => 'å™—', + '¼Q' => 'å™´', + '¼R' => '嘶', + '¼S' => '嘯', + '¼T' => '嘰', + '¼U' => '墀', + '¼V' => '墟', + '¼W' => '增', + '¼X' => '墳', + '¼Y' => '墜', + '¼Z' => '墮', + '¼[' => '墩', + '¼\\' => '墦', + '¼]' => '奭', + '¼^' => '嬉', + '¼_' => 'å«»', + '¼`' => '嬋', + '¼a' => '嫵', + '¼b' => '嬌', + '¼c' => '嬈', + '¼d' => '寮', + '¼e' => '寬', + '¼f' => '審', + '¼g' => '寫', + '¼h' => '層', + '¼i' => 'å±¥', + '¼j' => 'å¶', + '¼k' => 'å¶”', + '¼l' => 'å¹¢', + '¼m' => '幟', + '¼n' => '幡', + '¼o' => '廢', + '¼p' => '廚', + '¼q' => '廟', + '¼r' => 'å»', + '¼s' => '廣', + '¼t' => 'å» ', + '¼u' => '彈', + '¼v' => 'å½±', + '¼w' => 'å¾·', + '¼x' => 'å¾µ', + '¼y' => 'æ…¶', + '¼z' => 'æ…§', + '¼{' => 'æ…®', + '¼|' => 'æ…', + '¼}' => 'æ…•', + '¼~' => '憂', + '¼¡' => 'æ…¼', + '¼¢' => 'æ…°', + '¼£' => 'æ…«', + '¼¤' => 'æ…¾', + '¼¥' => '憧', + '¼¦' => 'æ†', + '¼§' => '憫', + '¼¨' => '憎', + '¼©' => '憬', + '¼ª' => '憚', + '¼«' => '憤', + '¼¬' => '憔', + '¼­' => '憮', + '¼®' => '戮', + '¼¯' => 'æ‘©', + '¼°' => '摯', + '¼±' => '摹', + '¼²' => 'æ’ž', + '¼³' => 'æ’²', + '¼´' => 'æ’ˆ', + '¼µ' => 'æ’', + '¼¶' => 'æ’°', + '¼·' => 'æ’¥', + '¼¸' => 'æ’“', + '¼¹' => 'æ’•', + '¼º' => 'æ’©', + '¼»' => 'æ’’', + '¼¼' => 'æ’®', + '¼½' => 'æ’­', + '¼¾' => 'æ’«', + '¼¿' => 'æ’š', + '¼À' => 'æ’¬', + '¼Á' => 'æ’™', + '¼Â' => 'æ’¢', + '¼Ã' => 'æ’³', + '¼Ä' => '敵', + '¼Å' => 'æ•·', + '¼Æ' => '數', + '¼Ç' => 'æš®', + '¼È' => 'æš«', + '¼É' => 'æš´', + '¼Ê' => 'æš±', + '¼Ë' => '樣', + '¼Ì' => '樟', + '¼Í' => '槨', + '¼Î' => 'æ¨', + '¼Ï' => '樞', + '¼Ð' => '標', + '¼Ñ' => 'æ§½', + '¼Ò' => '模', + '¼Ó' => '樓', + '¼Ô' => '樊', + '¼Õ' => 'æ§³', + '¼Ö' => '樂', + '¼×' => '樅', + '¼Ø' => 'æ§­', + '¼Ù' => '樑', + '¼Ú' => 'æ­', + '¼Û' => 'æ­Ž', + '¼Ü' => '殤', + '¼Ý' => '毅', + '¼Þ' => '毆', + '¼ß' => '漿', + '¼à' => 'æ½¼', + '¼á' => '澄', + '¼â' => '潑', + '¼ã' => '潦', + '¼ä' => 'æ½”', + '¼å' => '澆', + '¼æ' => 'æ½­', + '¼ç' => 'æ½›', + '¼è' => '潸', + '¼é' => 'æ½®', + '¼ê' => '澎', + '¼ë' => '潺', + '¼ì' => 'æ½°', + '¼í' => '潤', + '¼î' => 'æ¾—', + '¼ï' => '潘', + '¼ð' => '滕', + '¼ñ' => '潯', + '¼ò' => 'æ½ ', + '¼ó' => '潟', + '¼ô' => '熟', + '¼õ' => '熬', + '¼ö' => '熱', + '¼÷' => '熨', + '¼ø' => '牖', + '¼ù' => '犛', + '¼ú' => 'çŽ', + '¼û' => 'ç—', + '¼ü' => 'ç‘©', + '¼ý' => 'ç’‹', + '¼þ' => 'ç’ƒ', + '½@' => '瑾', + '½A' => 'ç’€', + '½B' => 'ç•¿', + '½C' => '瘠', + '½D' => '瘩', + '½E' => '瘟', + '½F' => '瘤', + '½G' => '瘦', + '½H' => '瘡', + '½I' => '瘢', + '½J' => 'çšš', + '½K' => '皺', + '½L' => '盤', + '½M' => '瞎', + '½N' => '瞇', + '½O' => '瞌', + '½P' => 'çž‘', + '½Q' => 'çž‹', + '½R' => '磋', + '½S' => '磅', + '½T' => '確', + '½U' => '磊', + '½V' => '碾', + '½W' => '磕', + '½X' => '碼', + '½Y' => 'ç£', + '½Z' => '稿', + '½[' => '稼', + '½\\' => 'ç©€', + '½]' => '稽', + '½^' => '稷', + '½_' => '稻', + '½`' => '窯', + '½a' => '窮', + '½b' => 'ç®­', + '½c' => 'ç®±', + '½d' => '範', + '½e' => 'ç®´', + '½f' => '篆', + '½g' => '篇', + '½h' => 'ç¯', + '½i' => 'ç® ', + '½j' => '篌', + '½k' => '糊', + '½l' => 'ç· ', + '½m' => 'ç·´', + '½n' => 'ç·¯', + '½o' => 'ç·»', + '½p' => 'ç·˜', + '½q' => 'ç·¬', + '½r' => 'ç·', + '½s' => 'ç·¨', + '½t' => 'ç·£', + '½u' => 'ç·š', + '½v' => 'ç·ž', + '½w' => 'ç·©', + '½x' => 'ç¶ž', + '½y' => 'ç·™', + '½z' => 'ç·²', + '½{' => 'ç·¹', + '½|' => 'ç½µ', + '½}' => 'ç½·', + '½~' => '羯', + '½¡' => 'ç¿©', + '½¢' => '耦', + '½£' => '膛', + '½¤' => '膜', + '½¥' => 'è†', + '½¦' => '膠', + '½§' => '膚', + '½¨' => '膘', + '½©' => 'è”—', + '½ª' => '蔽', + '½«' => '蔚', + '½¬' => 'è“®', + '½­' => '蔬', + '½®' => 'è”­', + '½¯' => '蔓', + '½°' => '蔑', + '½±' => '蔣', + '½²' => '蔡', + '½³' => 'è””', + '½´' => '蓬', + '½µ' => '蔥', + '½¶' => 'è“¿', + '½·' => '蔆', + '½¸' => 'èž‚', + '½¹' => 'è´', + '½º' => 'è¶', + '½»' => 'è ', + '½¼' => 'è¦', + '½½' => 'è¸', + '½¾' => 'è¨', + '½¿' => 'è™', + '½À' => 'è—', + '½Á' => 'èŒ', + '½Â' => 'è“', + '½Ã' => 'è¡›', + '½Ä' => 'è¡', + '½Å' => 'è¤', + '½Æ' => '複', + '½Ç' => '褒', + '½È' => '褓', + '½É' => '褕', + '½Ê' => '褊', + '½Ë' => '誼', + '½Ì' => 'è«’', + '½Í' => '談', + '½Î' => 'è«„', + '½Ï' => '誕', + '½Ð' => 'è«‹', + '½Ñ' => '諸', + '½Ò' => '課', + '½Ó' => '諉', + '½Ô' => 'è«‚', + '½Õ' => '調', + '½Ö' => '誰', + '½×' => 'è«–', + '½Ø' => 'è«', + '½Ù' => '誶', + '½Ú' => '誹', + '½Û' => 'è«›', + '½Ü' => '豌', + '½Ý' => '豎', + '½Þ' => '豬', + '½ß' => 'è³ ', + '½à' => '賞', + '½á' => '賦', + '½â' => '賤', + '½ã' => '賬', + '½ä' => 'è³­', + '½å' => 'è³¢', + '½æ' => 'è³£', + '½ç' => '賜', + '½è' => '質', + '½é' => '賡', + '½ê' => 'èµ­', + '½ë' => 'è¶Ÿ', + '½ì' => 'è¶£', + '½í' => '踫', + '½î' => 'è¸', + '½ï' => 'è¸', + '½ð' => '踢', + '½ñ' => 'è¸', + '½ò' => '踩', + '½ó' => '踟', + '½ô' => '踡', + '½õ' => '踞', + '½ö' => '躺', + '½÷' => 'è¼', + '½ø' => 'è¼›', + '½ù' => '輟', + '½ú' => '輩', + '½û' => '輦', + '½ü' => '輪', + '½ý' => '輜', + '½þ' => '輞', + '¾@' => 'è¼¥', + '¾A' => 'é©', + '¾B' => 'é®', + '¾C' => 'é¨', + '¾D' => 'é­', + '¾E' => 'é·', + '¾F' => 'é„°', + '¾G' => 'é„­', + '¾H' => 'é„§', + '¾I' => '鄱', + '¾J' => '醇', + '¾K' => '醉', + '¾L' => '醋', + '¾M' => '醃', + '¾N' => 'é‹…', + '¾O' => '銻', + '¾P' => '銷', + '¾Q' => '鋪', + '¾R' => '銬', + '¾S' => '鋤', + '¾T' => 'é‹', + '¾U' => '銳', + '¾V' => '銼', + '¾W' => 'é‹’', + '¾X' => '鋇', + '¾Y' => 'é‹°', + '¾Z' => '銲', + '¾[' => 'é–­', + '¾\\' => 'é–±', + '¾]' => '霄', + '¾^' => '霆', + '¾_' => '震', + '¾`' => '霉', + '¾a' => 'é ', + '¾b' => 'éž', + '¾c' => 'éž‹', + '¾d' => 'éž', + '¾e' => 'é ¡', + '¾f' => 'é «', + '¾g' => 'é œ', + '¾h' => '颳', + '¾i' => '養', + '¾j' => '餓', + '¾k' => '餒', + '¾l' => '餘', + '¾m' => 'é§', + '¾n' => 'é§', + '¾o' => 'é§Ÿ', + '¾p' => 'é§›', + '¾q' => 'é§‘', + '¾r' => 'é§•', + '¾s' => 'é§’', + '¾t' => 'é§™', + '¾u' => '骷', + '¾v' => 'é«®', + '¾w' => '髯', + '¾x' => '鬧', + '¾y' => 'é­…', + '¾z' => 'é­„', + '¾{' => 'é­·', + '¾|' => 'é­¯', + '¾}' => 'é´†', + '¾~' => 'é´‰', + '¾¡' => 'é´ƒ', + '¾¢' => '麩', + '¾£' => '麾', + '¾¤' => '黎', + '¾¥' => '墨', + '¾¦' => 'é½’', + '¾§' => 'å„’', + '¾¨' => '儘', + '¾©' => 'å„”', + '¾ª' => 'å„', + '¾«' => 'å„•', + '¾¬' => '冀', + '¾­' => '冪', + '¾®' => 'å‡', + '¾¯' => '劑', + '¾°' => '劓', + '¾±' => '勳', + '¾²' => 'å™™', + '¾³' => '噫', + '¾´' => '噹', + '¾µ' => '噩', + '¾¶' => '噤', + '¾·' => '噸', + '¾¸' => '噪', + '¾¹' => '器', + '¾º' => '噥', + '¾»' => 'å™±', + '¾¼' => '噯', + '¾½' => '噬', + '¾¾' => '噢', + '¾¿' => 'å™¶', + '¾À' => 'å£', + '¾Á' => '墾', + '¾Â' => '壇', + '¾Ã' => '壅', + '¾Ä' => '奮', + '¾Å' => 'å¬', + '¾Æ' => '嬴', + '¾Ç' => 'å­¸', + '¾È' => '寰', + '¾É' => 'å°Ž', + '¾Ê' => '彊', + '¾Ë' => '憲', + '¾Ì' => '憑', + '¾Í' => '憩', + '¾Î' => '憊', + '¾Ï' => 'æ‡', + '¾Ð' => '憶', + '¾Ñ' => '憾', + '¾Ò' => '懊', + '¾Ó' => '懈', + '¾Ô' => '戰', + '¾Õ' => 'æ“…', + '¾Ö' => 'æ“', + '¾×' => 'æ“‹', + '¾Ø' => 'æ’»', + '¾Ù' => 'æ’¼', + '¾Ú' => '據', + '¾Û' => 'æ“„', + '¾Ü' => '擇', + '¾Ý' => 'æ“‚', + '¾Þ' => 'æ“', + '¾ß' => 'æ’¿', + '¾à' => 'æ“’', + '¾á' => 'æ“”', + '¾â' => 'æ’¾', + '¾ã' => 'æ•´', + '¾ä' => '曆', + '¾å' => '曉', + '¾æ' => 'æš¹', + '¾ç' => '曄', + '¾è' => '曇', + '¾é' => '暸', + '¾ê' => '樽', + '¾ë' => '樸', + '¾ì' => '樺', + '¾í' => 'æ©™', + '¾î' => 'æ©«', + '¾ï' => '橘', + '¾ð' => '樹', + '¾ñ' => 'æ©„', + '¾ò' => 'æ©¢', + '¾ó' => 'æ©¡', + '¾ô' => 'æ©‹', + '¾õ' => '橇', + '¾ö' => '樵', + '¾÷' => '機', + '¾ø' => '橈', + '¾ù' => 'æ­™', + '¾ú' => 'æ­·', + '¾û' => 'æ°…', + '¾ü' => 'æ¿‚', + '¾ý' => 'æ¾±', + '¾þ' => '澡', + '¿@' => '濃', + '¿A' => '澤', + '¿B' => 'æ¿', + '¿C' => 'æ¾§', + '¿D' => 'æ¾³', + '¿E' => 'æ¿€', + '¿F' => 'æ¾¹', + '¿G' => 'æ¾¶', + '¿H' => '澦', + '¿I' => 'æ¾ ', + '¿J' => 'æ¾´', + '¿K' => '熾', + '¿L' => '燉', + '¿M' => 'ç‡', + '¿N' => '燒', + '¿O' => '燈', + '¿P' => '燕', + '¿Q' => '熹', + '¿R' => '燎', + '¿S' => '燙', + '¿T' => '燜', + '¿U' => '燃', + '¿V' => '燄', + '¿W' => 'ç¨', + '¿X' => 'ç’œ', + '¿Y' => 'ç’£', + '¿Z' => 'ç’˜', + '¿[' => 'ç’Ÿ', + '¿\\' => 'ç’ž', + '¿]' => 'ç“¢', + '¿^' => '甌', + '¿_' => 'ç”', + '¿`' => '瘴', + '¿a' => '瘸', + '¿b' => '瘺', + '¿c' => 'ç›§', + '¿d' => '盥', + '¿e' => 'çž ', + '¿f' => 'çžž', + '¿g' => '瞟', + '¿h' => '瞥', + '¿i' => '磨', + '¿j' => '磚', + '¿k' => '磬', + '¿l' => '磧', + '¿m' => '禦', + '¿n' => 'ç©', + '¿o' => '穎', + '¿p' => '穆', + '¿q' => '穌', + '¿r' => 'ç©‹', + '¿s' => '窺', + '¿t' => '篙', + '¿u' => 'ç°‘', + '¿v' => '築', + '¿w' => '篤', + '¿x' => '篛', + '¿y' => '篡', + '¿z' => '篩', + '¿{' => '篦', + '¿|' => '糕', + '¿}' => 'ç³–', + '¿~' => '縊', + '¿¡' => '縑', + '¿¢' => '縈', + '¿£' => '縛', + '¿¤' => '縣', + '¿¥' => '縞', + '¿¦' => 'ç¸', + '¿§' => '縉', + '¿¨' => 'ç¸', + '¿©' => 'ç½¹', + '¿ª' => 'ç¾²', + '¿«' => 'ç¿°', + '¿¬' => '翱', + '¿­' => 'ç¿®', + '¿®' => '耨', + '¿¯' => '膳', + '¿°' => '膩', + '¿±' => '膨', + '¿²' => '臻', + '¿³' => '興', + '¿´' => '艘', + '¿µ' => '艙', + '¿¶' => '蕊', + '¿·' => 'è•™', + '¿¸' => '蕈', + '¿¹' => '蕨', + '¿º' => 'è•©', + '¿»' => '蕃', + '¿¼' => '蕉', + '¿½' => 'è•­', + '¿¾' => '蕪', + '¿¿' => '蕞', + '¿À' => '螃', + '¿Á' => '螟', + '¿Â' => 'èžž', + '¿Ã' => '螢', + '¿Ä' => 'èž', + '¿Å' => 'è¡¡', + '¿Æ' => '褪', + '¿Ç' => '褲', + '¿È' => '褥', + '¿É' => '褫', + '¿Ê' => '褡', + '¿Ë' => '親', + '¿Ì' => '覦', + '¿Í' => '諦', + '¿Î' => '諺', + '¿Ï' => 'è««', + '¿Ð' => '諱', + '¿Ñ' => '謀', + '¿Ò' => '諜', + '¿Ó' => 'è«§', + '¿Ô' => 'è«®', + '¿Õ' => '諾', + '¿Ö' => 'è¬', + '¿×' => '謂', + '¿Ø' => 'è«·', + '¿Ù' => 'è«­', + '¿Ú' => '諳', + '¿Û' => 'è«¶', + '¿Ü' => '諼', + '¿Ý' => '豫', + '¿Þ' => 'è±­', + '¿ß' => '貓', + '¿à' => 'è³´', + '¿á' => '蹄', + '¿â' => '踱', + '¿ã' => '踴', + '¿ä' => '蹂', + '¿å' => '踹', + '¿æ' => '踵', + '¿ç' => 'è¼»', + '¿è' => '輯', + '¿é' => '輸', + '¿ê' => 'è¼³', + '¿ë' => '辨', + '¿ì' => '辦', + '¿í' => 'éµ', + '¿î' => 'é´', + '¿ï' => 'é¸', + '¿ð' => 'é²', + '¿ñ' => 'é¼', + '¿ò' => 'éº', + '¿ó' => 'é„´', + '¿ô' => '醒', + '¿õ' => '錠', + '¿ö' => '錶', + '¿÷' => '鋸', + '¿ø' => '錳', + '¿ù' => '錯', + '¿ú' => '錢', + '¿û' => '鋼', + '¿ü' => '錫', + '¿ý' => '錄', + '¿þ' => '錚', + 'À@' => 'éŒ', + 'ÀA' => '錦', + 'ÀB' => '錡', + 'ÀC' => '錕', + 'ÀD' => '錮', + 'ÀE' => '錙', + 'ÀF' => 'é–»', + 'ÀG' => 'éš§', + 'ÀH' => '隨', + 'ÀI' => '險', + 'ÀJ' => '雕', + 'ÀK' => '霎', + 'ÀL' => '霑', + 'ÀM' => '霖', + 'ÀN' => 'éœ', + 'ÀO' => '霓', + 'ÀP' => 'éœ', + 'ÀQ' => 'é›', + 'ÀR' => 'éœ', + 'ÀS' => 'é¦', + 'ÀT' => '鞘', + 'ÀU' => 'é °', + 'ÀV' => 'é ¸', + 'ÀW' => 'é »', + 'ÀX' => 'é ·', + 'ÀY' => 'é ­', + 'ÀZ' => 'é ¹', + 'À[' => 'é ¤', + 'À\\' => 'é¤', + 'À]' => '館', + 'À^' => '餞', + 'À_' => '餛', + 'À`' => '餡', + 'Àa' => '餚', + 'Àb' => 'é§­', + 'Àc' => 'é§¢', + 'Àd' => 'é§±', + 'Àe' => '骸', + 'Àf' => '骼', + 'Àg' => 'é«»', + 'Àh' => 'é«­', + 'Ài' => '鬨', + 'Àj' => '鮑', + 'Àk' => 'é´•', + 'Àl' => 'é´£', + 'Àm' => 'é´¦', + 'Àn' => 'é´¨', + 'Ào' => 'é´’', + 'Àp' => 'é´›', + 'Àq' => '默', + 'Àr' => 'é»”', + 'Às' => 'é¾', + 'Àt' => '龜', + 'Àu' => '優', + 'Àv' => '償', + 'Àw' => 'å„¡', + 'Àx' => '儲', + 'Ày' => '勵', + 'Àz' => '嚎', + 'À{' => '嚀', + 'À|' => 'åš', + 'À}' => 'åš…', + 'À~' => '嚇', + 'À¡' => 'åš', + 'À¢' => '壕', + 'À£' => '壓', + 'À¤' => '壑', + 'À¥' => '壎', + 'À¦' => '嬰', + 'À§' => '嬪', + 'À¨' => '嬤', + 'À©' => 'å­º', + 'Àª' => 'å°·', + 'À«' => '屨', + 'À¬' => 'å¶¼', + 'À­' => '嶺', + 'À®' => 'å¶½', + 'À¯' => '嶸', + 'À°' => '幫', + 'À±' => '彌', + 'À²' => 'å¾½', + 'À³' => '應', + 'À´' => '懂', + 'Àµ' => '懇', + 'À¶' => '懦', + 'À·' => '懋', + 'À¸' => '戲', + 'À¹' => '戴', + 'Àº' => '擎', + 'À»' => '擊', + 'À¼' => '擘', + 'À½' => 'æ“ ', + 'À¾' => 'æ“°', + 'À¿' => '擦', + 'ÀÀ' => '擬', + 'ÀÁ' => '擱', + 'ÀÂ' => 'æ“¢', + 'ÀÃ' => 'æ“­', + 'ÀÄ' => 'æ–‚', + 'ÀÅ' => 'æ–ƒ', + 'ÀÆ' => 'æ›™', + 'ÀÇ' => 'æ›–', + 'ÀÈ' => '檀', + 'ÀÉ' => '檔', + 'ÀÊ' => '檄', + 'ÀË' => '檢', + 'ÀÌ' => '檜', + 'ÀÍ' => 'æ«›', + 'ÀÎ' => '檣', + 'ÀÏ' => '橾', + 'ÀÐ' => '檗', + 'ÀÑ' => 'æª', + 'ÀÒ' => '檠', + 'ÀÓ' => 'æ­œ', + 'ÀÔ' => 'æ®®', + 'ÀÕ' => '毚', + 'ÀÖ' => 'æ°ˆ', + 'À×' => '濘', + 'ÀØ' => '濱', + 'ÀÙ' => '濟', + 'ÀÚ' => 'æ¿ ', + 'ÀÛ' => 'æ¿›', + 'ÀÜ' => '濤', + 'ÀÝ' => 'æ¿«', + 'ÀÞ' => '濯', + 'Àß' => 'æ¾€', + 'Àà' => '濬', + 'Àá' => 'æ¿¡', + 'Àâ' => 'æ¿©', + 'Àã' => 'æ¿•', + 'Àä' => 'æ¿®', + 'Àå' => 'æ¿°', + 'Àæ' => '燧', + 'Àç' => '營', + 'Àè' => '燮', + 'Àé' => '燦', + 'Àê' => '燥', + 'Àë' => '燭', + 'Àì' => '燬', + 'Àí' => '燴', + 'Àî' => '燠', + 'Àï' => '爵', + 'Àð' => '牆', + 'Àñ' => 'ç°', + 'Àò' => 'ç²', + 'Àó' => 'ç’©', + 'Àô' => 'ç’°', + 'Àõ' => 'ç’¦', + 'Àö' => 'ç’¨', + 'À÷' => '癆', + 'Àø' => '療', + 'Àù' => '癌', + 'Àú' => '盪', + 'Àû' => 'çž³', + 'Àü' => '瞪', + 'Àý' => 'çž°', + 'Àþ' => '瞬', + 'Á@' => 'çž§', + 'ÁA' => 'çž­', + 'ÁB' => '矯', + 'ÁC' => '磷', + 'ÁD' => '磺', + 'ÁE' => '磴', + 'ÁF' => '磯', + 'ÁG' => 'ç¤', + 'ÁH' => '禧', + 'ÁI' => '禪', + 'ÁJ' => 'ç©—', + 'ÁK' => '窿', + 'ÁL' => 'ç°‡', + 'ÁM' => 'ç°', + 'ÁN' => '篾', + 'ÁO' => '篷', + 'ÁP' => 'ç°Œ', + 'ÁQ' => '篠', + 'ÁR' => 'ç³ ', + 'ÁS' => '糜', + 'ÁT' => '糞', + 'ÁU' => 'ç³¢', + 'ÁV' => '糟', + 'ÁW' => 'ç³™', + 'ÁX' => 'ç³', + 'ÁY' => '縮', + 'ÁZ' => '績', + 'Á[' => '繆', + 'Á\\' => '縷', + 'Á]' => '縲', + 'Á^' => '繃', + 'Á_' => '縫', + 'Á`' => '總', + 'Áa' => '縱', + 'Áb' => 'ç¹…', + 'Ác' => 'ç¹', + 'Ád' => '縴', + 'Áe' => '縹', + 'Áf' => '繈', + 'Ág' => '縵', + 'Áh' => '縿', + 'Ái' => '縯', + 'Áj' => '罄', + 'Ák' => '翳', + 'Ál' => '翼', + 'Ám' => 'è±', + 'Án' => 'è²', + 'Áo' => 'è°', + 'Áp' => 'è¯', + 'Áq' => 'è³', + 'Ár' => '臆', + 'Ás' => '臃', + 'Át' => '膺', + 'Áu' => '臂', + 'Áv' => '臀', + 'Áw' => '膿', + 'Áx' => '膽', + 'Áy' => '臉', + 'Áz' => '膾', + 'Á{' => '臨', + 'Á|' => '舉', + 'Á}' => '艱', + 'Á~' => 'è–ª', + 'Á¡' => 'è–„', + 'Á¢' => '蕾', + 'Á£' => 'è–œ', + 'Á¤' => 'è–‘', + 'Á¥' => 'è–”', + 'Á¦' => 'è–¯', + 'Á§' => 'è–›', + 'Á¨' => 'è–‡', + 'Á©' => 'è–¨', + 'Áª' => 'è–Š', + 'Á«' => 'è™§', + 'Á¬' => '蟀', + 'Á­' => '蟑', + 'Á®' => 'èž³', + 'Á¯' => '蟒', + 'Á°' => '蟆', + 'Á±' => 'èž«', + 'Á²' => 'èž»', + 'Á³' => '螺', + 'Á´' => '蟈', + 'Áµ' => '蟋', + 'Á¶' => '褻', + 'Á·' => '褶', + 'Á¸' => '襄', + 'Á¹' => '褸', + 'Áº' => '褽', + 'Á»' => '覬', + 'Á¼' => '謎', + 'Á½' => '謗', + 'Á¾' => '謙', + 'Á¿' => '講', + 'ÁÀ' => '謊', + 'ÁÁ' => '謠', + 'ÁÂ' => 'è¬', + 'ÁÃ' => '謄', + 'ÁÄ' => 'è¬', + 'ÁÅ' => 'è±', + 'ÁÆ' => 'è°¿', + 'ÁÇ' => 'è±³', + 'ÁÈ' => '賺', + 'ÁÉ' => 'è³½', + 'ÁÊ' => 'è³¼', + 'ÁË' => '賸', + 'ÁÌ' => 'è³»', + 'ÁÍ' => '趨', + 'ÁÎ' => '蹉', + 'ÁÏ' => '蹋', + 'ÁÐ' => '蹈', + 'ÁÑ' => '蹊', + 'ÁÒ' => '轄', + 'ÁÓ' => 'è¼¾', + 'ÁÔ' => '轂', + 'ÁÕ' => 'è½…', + 'ÁÖ' => '輿', + 'Á×' => 'é¿', + 'ÁØ' => 'é½', + 'ÁÙ' => 'é‚„', + 'ÁÚ' => 'é‚', + 'ÁÛ' => 'é‚‚', + 'ÁÜ' => 'é‚€', + 'ÁÝ' => '鄹', + 'ÁÞ' => '醣', + 'Áß' => '醞', + 'Áà' => '醜', + 'Áá' => 'é', + 'Áâ' => '鎂', + 'Áã' => '錨', + 'Áä' => 'éµ', + 'Áå' => 'éŠ', + 'Áæ' => 'é¥', + 'Áç' => 'é‹', + 'Áè' => '錘', + 'Áé' => 'é¾', + 'Áê' => 'é¬', + 'Áë' => 'é›', + 'Áì' => 'é°', + 'Áí' => 'éš', + 'Áî' => 'é”', + 'Áï' => 'é—Š', + 'Áð' => 'é—‹', + 'Áñ' => 'é—Œ', + 'Áò' => 'é—ˆ', + 'Áó' => 'é—†', + 'Áô' => 'éš±', + 'Áõ' => '隸', + 'Áö' => 'é›–', + 'Á÷' => '霜', + 'Áø' => '霞', + 'Áù' => 'éž ', + 'Áú' => '韓', + 'Áû' => '顆', + 'Áü' => '颶', + 'Áý' => '餵', + 'Áþ' => 'é¨', + 'Â@' => 'é§¿', + 'ÂA' => 'é®®', + 'ÂB' => '鮫', + 'ÂC' => '鮪', + 'ÂD' => 'é®­', + 'ÂE' => 'é´»', + 'ÂF' => 'é´¿', + 'ÂG' => '麋', + 'ÂH' => 'é»', + 'ÂI' => '點', + 'ÂJ' => '黜', + 'ÂK' => 'é»', + 'ÂL' => 'é»›', + 'ÂM' => 'é¼¾', + 'ÂN' => '齋', + 'ÂO' => 'å¢', + 'ÂP' => 'åš•', + 'ÂQ' => 'åš®', + 'ÂR' => '壙', + 'ÂS' => '壘', + 'ÂT' => '嬸', + 'ÂU' => 'å½', + 'ÂV' => '懣', + 'ÂW' => '戳', + 'ÂX' => 'æ“´', + 'ÂY' => '擲', + 'ÂZ' => '擾', + 'Â[' => '攆', + 'Â\\' => '擺', + 'Â]' => 'æ“»', + 'Â^' => 'æ“·', + 'Â_' => 'æ–·', + 'Â`' => '曜', + 'Âa' => '朦', + 'Âb' => '檳', + 'Âc' => '檬', + 'Âd' => '櫃', + 'Âe' => '檻', + 'Âf' => '檸', + 'Âg' => 'æ«‚', + 'Âh' => '檮', + 'Âi' => '檯', + 'Âj' => 'æ­Ÿ', + 'Âk' => 'æ­¸', + 'Âl' => '殯', + 'Âm' => '瀉', + 'Ân' => '瀋', + 'Âo' => '濾', + 'Âp' => '瀆', + 'Âq' => '濺', + 'Âr' => '瀑', + 'Âs' => 'ç€', + 'Ât' => '燻', + 'Âu' => '燼', + 'Âv' => '燾', + 'Âw' => '燸', + 'Âx' => 'ç·', + 'Ây' => 'çµ', + 'Âz' => 'ç’§', + 'Â{' => 'ç’¿', + 'Â|' => '甕', + 'Â}' => 'ç™–', + 'Â~' => '癘', + '¡' => 'ç™’', + '¢' => 'çž½', + '£' => 'çž¿', + '¤' => 'çž»', + 'Â¥' => 'çž¼', + '¦' => '礎', + '§' => '禮', + '¨' => 'ç©¡', + '©' => 'ç©¢', + 'ª' => 'ç© ', + '«' => 'ç«„', + '¬' => 'ç«…', + '­' => 'ç°«', + '®' => 'ç°§', + '¯' => 'ç°ª', + '°' => 'ç°ž', + '±' => 'ç°£', + '²' => 'ç°¡', + '³' => 'ç³§', + '´' => 'ç¹”', + 'µ' => '繕', + '¶' => '繞', + '·' => '繚', + '¸' => '繡', + '¹' => 'ç¹’', + 'º' => 'ç¹™', + '»' => '罈', + '¼' => '翹', + '½' => 'ç¿»', + '¾' => 'è·', + '¿' => 'è¶', + 'ÂÀ' => 'è‡', + 'ÂÁ' => 'è‡', + 'ÂÂ' => '舊', + 'ÂÃ' => 'è—', + 'ÂÄ' => 'è–©', + 'ÂÅ' => 'è—', + 'ÂÆ' => 'è—', + 'ÂÇ' => 'è—‰', + 'ÂÈ' => 'è–°', + 'ÂÉ' => 'è–º', + 'ÂÊ' => 'è–¹', + 'ÂË' => 'è–¦', + 'ÂÌ' => '蟯', + 'ÂÍ' => '蟬', + 'ÂÎ' => '蟲', + 'ÂÏ' => '蟠', + 'ÂÐ' => '覆', + 'ÂÑ' => '覲', + 'ÂÒ' => 'è§´', + 'ÂÓ' => '謨', + 'ÂÔ' => '謹', + 'ÂÕ' => '謬', + 'ÂÖ' => '謫', + 'Â×' => 'è±', + 'ÂØ' => 'è´…', + 'ÂÙ' => 'è¹™', + 'ÂÚ' => 'è¹£', + 'ÂÛ' => '蹦', + 'ÂÜ' => '蹤', + 'ÂÝ' => '蹟', + 'ÂÞ' => '蹕', + 'Âß' => '軀', + 'Âà' => '轉', + 'Âá' => 'è½', + 'Ââ' => '邇', + 'Âã' => '邃', + 'Âä' => '邈', + 'Âå' => '醫', + 'Âæ' => '醬', + 'Âç' => 'é‡', + 'Âè' => '鎔', + 'Âé' => '鎊', + 'Âê' => '鎖', + 'Âë' => '鎢', + 'Âì' => '鎳', + 'Âí' => '鎮', + 'Âî' => '鎬', + 'Âï' => '鎰', + 'Âð' => '鎘', + 'Âñ' => '鎚', + 'Âò' => '鎗', + 'Âó' => 'é—”', + 'Âô' => 'é—–', + 'Âõ' => 'é—', + 'Âö' => 'é—•', + 'Â÷' => '離', + 'Âø' => '雜', + 'Âù' => 'é›™', + 'Âú' => 'é››', + 'Âû' => '雞', + 'Âü' => '霤', + 'Âý' => '鞣', + 'Âþ' => '鞦', + 'Ã@' => 'éž­', + 'ÃA' => '韹', + 'ÃB' => 'é¡', + 'ÃC' => 'é¡', + 'ÃD' => '題', + 'ÃE' => '顎', + 'ÃF' => 'é¡“', + 'ÃG' => '颺', + 'ÃH' => '餾', + 'ÃI' => '餿', + 'ÃJ' => '餽', + 'ÃK' => '餮', + 'ÃL' => '馥', + 'ÃM' => '騎', + 'ÃN' => 'é«', + 'ÃO' => '鬃', + 'ÃP' => '鬆', + 'ÃQ' => 'é­', + 'ÃR' => 'é­Ž', + 'ÃS' => 'é­', + 'ÃT' => '鯊', + 'ÃU' => '鯉', + 'ÃV' => '鯽', + 'ÃW' => '鯈', + 'ÃX' => '鯀', + 'ÃY' => '鵑', + 'ÃZ' => 'éµ', + 'Ã[' => 'éµ ', + 'Ã\\' => 'é» ', + 'Ã]' => '鼕', + 'Ã^' => '鼬', + 'Ã_' => '儳', + 'Ã`' => '嚥', + 'Ãa' => '壞', + 'Ãb' => '壟', + 'Ãc' => '壢', + 'Ãd' => '寵', + 'Ãe' => 'é¾', + 'Ãf' => '廬', + 'Ãg' => '懲', + 'Ãh' => '懷', + 'Ãi' => '懶', + 'Ãj' => '懵', + 'Ãk' => '攀', + 'Ãl' => 'æ”', + 'Ãm' => 'æ› ', + 'Ãn' => 'æ›', + 'Ão' => 'æ«¥', + 'Ãp' => 'æ«', + 'Ãq' => '櫚', + 'Ãr' => 'æ«“', + 'Ãs' => '瀛', + 'Ãt' => '瀟', + 'Ãu' => '瀨', + 'Ãv' => '瀚', + 'Ãw' => 'ç€', + 'Ãx' => '瀕', + 'Ãy' => '瀘', + 'Ãz' => '爆', + 'Ã{' => 'çˆ', + 'Ã|' => '牘', + 'Ã}' => '犢', + 'Ã~' => 'ç¸', + 'á' => 'çº', + 'â' => 'ç’½', + 'ã' => '瓊', + 'ä' => 'ç“£', + 'Ã¥' => 'ç–‡', + 'æ' => 'ç–†', + 'ç' => '癟', + 'è' => '癡', + 'é' => '矇', + 'ê' => '礙', + 'ë' => '禱', + 'ì' => 'ç©«', + 'í' => 'ç©©', + 'î' => 'ç°¾', + 'ï' => 'ç°¿', + 'ð' => 'ç°¸', + 'ñ' => 'ç°½', + 'ò' => 'ç°·', + 'ó' => 'ç±€', + 'ô' => '繫', + 'õ' => 'ç¹­', + 'ö' => 'ç¹¹', + '÷' => '繩', + 'ø' => '繪', + 'ù' => 'ç¾…', + 'ú' => 'ç¹³', + 'û' => 'ç¾¶', + 'ü' => 'ç¾¹', + 'ý' => '羸', + 'þ' => '臘', + 'ÿ' => 'è—©', + 'ÃÀ' => 'è—', + 'ÃÁ' => 'è—ª', + 'ÃÂ' => 'è—•', + 'ÃÃ' => 'è—¤', + 'ÃÄ' => 'è—¥', + 'ÃÅ' => 'è—·', + 'ÃÆ' => '蟻', + 'ÃÇ' => 'è …', + 'ÃÈ' => 'è ', + 'ÃÉ' => '蟹', + 'ÃÊ' => '蟾', + 'ÃË' => '襠', + 'ÃÌ' => '襟', + 'ÃÍ' => '襖', + 'ÃÎ' => '襞', + 'ÃÏ' => 'è­', + 'ÃÐ' => 'è­œ', + 'ÃÑ' => 'è­˜', + 'ÃÒ' => 'è­‰', + 'ÃÓ' => 'è­š', + 'ÃÔ' => 'è­Ž', + 'ÃÕ' => 'è­', + 'ÃÖ' => 'è­†', + 'Ã×' => 'è­™', + 'ÃØ' => 'è´ˆ', + 'ÃÙ' => 'è´Š', + 'ÃÚ' => 'è¹¼', + 'ÃÛ' => 'è¹²', + 'ÃÜ' => '躇', + 'ÃÝ' => 'è¹¶', + 'ÃÞ' => '蹬', + 'Ãß' => '蹺', + 'Ãà' => 'è¹´', + 'Ãá' => 'è½”', + 'Ãâ' => '轎', + 'Ãã' => 'è¾­', + 'Ãä' => '邊', + 'Ãå' => 'é‚‹', + 'Ãæ' => '醱', + 'Ãç' => '醮', + 'Ãè' => 'é¡', + 'Ãé' => 'é‘', + 'Ãê' => 'éŸ', + 'Ãë' => 'éƒ', + 'Ãì' => 'éˆ', + 'Ãí' => 'éœ', + 'Ãî' => 'é', + 'Ãï' => 'é–', + 'Ãð' => 'é¢', + 'Ãñ' => 'é', + 'Ãò' => 'é˜', + 'Ãó' => 'é¤', + 'Ãô' => 'é—', + 'Ãõ' => 'é¨', + 'Ãö' => 'é—œ', + 'Ã÷' => 'éš´', + 'Ãø' => '難', + 'Ãù' => '霪', + 'Ãú' => '霧', + 'Ãû' => 'é¡', + 'Ãü' => '韜', + 'Ãý' => '韻', + 'Ãþ' => '類', + 'Ä@' => '願', + 'ÄA' => 'é¡›', + 'ÄB' => '颼', + 'ÄC' => '饅', + 'ÄD' => '饉', + 'ÄE' => '騖', + 'ÄF' => '騙', + 'ÄG' => 'é¬', + 'ÄH' => '鯨', + 'ÄI' => '鯧', + 'ÄJ' => '鯖', + 'ÄK' => '鯛', + 'ÄL' => '鶉', + 'ÄM' => '鵡', + 'ÄN' => 'éµ²', + 'ÄO' => '鵪', + 'ÄP' => '鵬', + 'ÄQ' => '麒', + 'ÄR' => '麗', + 'ÄS' => '麓', + 'ÄT' => '麴', + 'ÄU' => '勸', + 'ÄV' => '嚨', + 'ÄW' => 'åš·', + 'ÄX' => 'åš¶', + 'ÄY' => 'åš´', + 'ÄZ' => 'åš¼', + 'Ä[' => '壤', + 'Ä\\' => 'å­€', + 'Ä]' => 'å­ƒ', + 'Ä^' => 'å­½', + 'Ä_' => '寶', + 'Ä`' => 'å·‰', + 'Äa' => '懸', + 'Äb' => '懺', + 'Äc' => '攘', + 'Äd' => 'æ””', + 'Äe' => 'æ”™', + 'Äf' => '曦', + 'Äg' => '朧', + 'Äh' => '櫬', + 'Äi' => '瀾', + 'Äj' => '瀰', + 'Äk' => '瀲', + 'Äl' => 'çˆ', + 'Äm' => 'ç»', + 'Än' => 'ç“', + 'Äo' => '癢', + 'Äp' => '癥', + 'Äq' => '礦', + 'Är' => '礪', + 'Äs' => '礬', + 'Ät' => '礫', + 'Äu' => '竇', + 'Äv' => 'ç«¶', + 'Äw' => '籌', + 'Äx' => '籃', + 'Äy' => 'ç±', + 'Äz' => '糯', + 'Ä{' => 'ç³°', + 'Ä|' => 'è¾®', + 'Ä}' => 'ç¹½', + 'Ä~' => 'ç¹¼', + 'Ä¡' => '纂', + 'Ä¢' => '罌', + 'Ä£' => '耀', + 'Ĥ' => '臚', + 'Ä¥' => '艦', + 'Ħ' => 'è—»', + 'ħ' => 'è—¹', + 'Ĩ' => '蘑', + 'Ä©' => 'è—º', + 'Ī' => '蘆', + 'Ä«' => '蘋', + 'Ĭ' => '蘇', + 'Ä­' => '蘊', + 'Ä®' => 'è ”', + 'į' => 'è •', + 'İ' => '襤', + 'ı' => '覺', + 'IJ' => '觸', + 'ij' => 'è­°', + 'Ä´' => 'è­¬', + 'ĵ' => 'è­¦', + 'Ķ' => 'è­¯', + 'Ä·' => 'è­Ÿ', + 'ĸ' => 'è­«', + 'Ĺ' => 'è´', + 'ĺ' => 'è´', + 'Ä»' => '躉', + 'ļ' => 'èº', + 'Ľ' => '躅', + 'ľ' => '躂', + 'Ä¿' => '醴', + 'ÄÀ' => '釋', + 'ÄÁ' => 'é˜', + 'ÄÂ' => 'éƒ', + 'ÄÃ' => 'é½', + 'ÄÄ' => 'é—¡', + 'ÄÅ' => '霰', + 'ÄÆ' => '飄', + 'ÄÇ' => '饒', + 'ÄÈ' => '饑', + 'ÄÉ' => '馨', + 'ÄÊ' => '騫', + 'ÄË' => '騰', + 'ÄÌ' => '騷', + 'ÄÍ' => '騵', + 'ÄÎ' => 'é°“', + 'ÄÏ' => 'é°', + 'ÄÐ' => 'é¹¹', + 'ÄÑ' => '麵', + 'ÄÒ' => '黨', + 'ÄÓ' => '鼯', + 'ÄÔ' => '齟', + 'ÄÕ' => 'é½£', + 'ÄÖ' => '齡', + 'Ä×' => 'å„·', + 'ÄØ' => '儸', + 'ÄÙ' => 'å›', + 'ÄÚ' => '囀', + 'ÄÛ' => '囂', + 'ÄÜ' => '夔', + 'ÄÝ' => '屬', + 'ÄÞ' => 'å·', + 'Äß' => '懼', + 'Äà' => '懾', + 'Äá' => 'æ”', + 'Äâ' => '攜', + 'Äã' => 'æ–•', + 'Ää' => '曩', + 'Äå' => 'æ«»', + 'Äæ' => '欄', + 'Äç' => '櫺', + 'Äè' => '殲', + 'Äé' => 'çŒ', + 'Äê' => '爛', + 'Äë' => '犧', + 'Äì' => 'ç“–', + 'Äí' => 'ç“”', + 'Äî' => '癩', + 'Äï' => '矓', + 'Äð' => 'ç±', + 'Äñ' => 'çº', + 'Äò' => '續', + 'Äó' => 'ç¾¼', + 'Äô' => '蘗', + 'Äõ' => '蘭', + 'Äö' => '蘚', + 'Ä÷' => 'è £', + 'Äø' => 'è ¢', + 'Äù' => 'è ¡', + 'Äú' => 'è Ÿ', + 'Äû' => '襪', + 'Äü' => '襬', + 'Äý' => '覽', + 'Äþ' => 'è­´', + 'Å@' => 'è­·', + 'ÅA' => 'è­½', + 'ÅB' => 'è´“', + 'ÅC' => '躊', + 'ÅD' => 'èº', + 'ÅE' => '躋', + 'ÅF' => '轟', + 'ÅG' => '辯', + 'ÅH' => '醺', + 'ÅI' => 'é®', + 'ÅJ' => 'é³', + 'ÅK' => 'éµ', + 'ÅL' => 'éº', + 'ÅM' => 'é¸', + 'ÅN' => 'é²', + 'ÅO' => 'é«', + 'ÅP' => 'é—¢', + 'ÅQ' => '霸', + 'ÅR' => '霹', + 'ÅS' => '露', + 'ÅT' => '響', + 'ÅU' => 'é¡§', + 'ÅV' => 'é¡¥', + 'ÅW' => '饗', + 'ÅX' => 'é©…', + 'ÅY' => '驃', + 'ÅZ' => 'é©€', + 'Å[' => '騾', + 'Å\\' => 'é«', + 'Å]' => 'é­”', + 'Å^' => 'é­‘', + 'Å_' => 'é°­', + 'Å`' => 'é°¥', + 'Åa' => '鶯', + 'Åb' => 'é¶´', + 'Åc' => 'é·‚', + 'Åd' => '鶸', + 'Åe' => 'éº', + 'Åf' => '黯', + 'Åg' => 'é¼™', + 'Åh' => '齜', + 'Åi' => '齦', + 'Åj' => 'é½§', + 'Åk' => '儼', + 'Ål' => 'å„»', + 'Åm' => '囈', + 'Ån' => '囊', + 'Åo' => '囉', + 'Åp' => 'å­¿', + 'Åq' => 'å·”', + 'År' => 'å·’', + 'Ås' => '彎', + 'Åt' => '懿', + 'Åu' => '攤', + 'Åv' => '權', + 'Åw' => 'æ­¡', + 'Åx' => 'ç‘', + 'Åy' => 'ç˜', + 'Åz' => '玀', + 'Å{' => '瓤', + 'Å|' => 'ç–Š', + 'Å}' => 'ç™®', + 'Å~' => '癬', + 'Å¡' => '禳', + 'Å¢' => 'ç± ', + 'Å£' => '籟', + 'Ť' => 'è¾', + 'Å¥' => 'è½', + 'Ŧ' => '臟', + 'ŧ' => '襲', + 'Ũ' => '襯', + 'Å©' => 'è§¼', + 'Ū' => '讀', + 'Å«' => 'è´–', + 'Ŭ' => 'è´—', + 'Å­' => '躑', + 'Å®' => '躓', + 'ů' => '轡', + 'Ű' => 'é…ˆ', + 'ű' => 'é‘„', + 'Ų' => 'é‘‘', + 'ų' => 'é‘’', + 'Å´' => '霽', + 'ŵ' => '霾', + 'Ŷ' => '韃', + 'Å·' => 'éŸ', + 'Ÿ' => 'é¡«', + 'Ź' => '饕', + 'ź' => 'é©•', + 'Å»' => 'é©', + 'ż' => 'é«’', + 'Ž' => '鬚', + 'ž' => '鱉', + 'Å¿' => 'é°±', + 'ÅÀ' => 'é°¾', + 'ÅÁ' => 'é°»', + 'ÅÂ' => 'é·“', + 'ÅÃ' => 'é·—', + 'ÅÄ' => 'é¼´', + 'ÅÅ' => '齬', + 'ÅÆ' => '齪', + 'ÅÇ' => 'é¾”', + 'ÅÈ' => '囌', + 'ÅÉ' => 'å·–', + 'ÅÊ' => '戀', + 'ÅË' => '攣', + 'ÅÌ' => '攫', + 'ÅÍ' => '攪', + 'ÅÎ' => '曬', + 'ÅÏ' => 'æ¬', + 'ÅÐ' => '瓚', + 'ÅÑ' => '竊', + 'ÅÒ' => '籤', + 'ÅÓ' => 'ç±£', + 'ÅÔ' => 'ç±¥', + 'ÅÕ' => '纓', + 'ÅÖ' => '纖', + 'Å×' => '纔', + 'ÅØ' => '臢', + 'ÅÙ' => '蘸', + 'ÅÚ' => '蘿', + 'ÅÛ' => 'è ±', + 'ÅÜ' => '變', + 'ÅÝ' => 'é‚', + 'ÅÞ' => 'é‚', + 'Åß' => 'é‘£', + 'Åà' => 'é‘ ', + 'Åá' => '鑤', + 'Åâ' => 'é¨', + 'Åã' => '顯', + 'Åä' => '饜', + 'Åå' => '驚', + 'Åæ' => 'é©›', + 'Åç' => 'é©—', + 'Åè' => 'é«“', + 'Åé' => 'é«”', + 'Åê' => 'é«‘', + 'Åë' => 'é±”', + 'Åì' => 'é±—', + 'Åí' => 'é±–', + 'Åî' => 'é·¥', + 'Åï' => '麟', + 'Åð' => 'é»´', + 'Åñ' => '囑', + 'Åò' => '壩', + 'Åó' => '攬', + 'Åô' => 'çž', + 'Åõ' => 'ç™±', + 'Åö' => '癲', + 'Å÷' => '矗', + 'Åø' => 'ç½', + 'Åù' => '羈', + 'Åú' => 'è ¶', + 'Åû' => 'è ¹', + 'Åü' => 'è¡¢', + 'Åý' => '讓', + 'Åþ' => 'è®’', + 'Æ@' => 'è®–', + 'ÆA' => '艷', + 'ÆB' => 'è´›', + 'ÆC' => '釀', + 'ÆD' => '鑪', + 'ÆE' => 'é‚', + 'ÆF' => 'éˆ', + 'ÆG' => 'é„', + 'ÆH' => '韆', + 'ÆI' => 'é¡°', + 'ÆJ' => '驟', + 'ÆK' => '鬢', + 'ÆL' => 'é­˜', + 'ÆM' => '鱟', + 'ÆN' => 'é·¹', + 'ÆO' => 'é·º', + 'ÆP' => 'é¹¼', + 'ÆQ' => 'é¹½', + 'ÆR' => '鼇', + 'ÆS' => 'é½·', + 'ÆT' => 'é½²', + 'ÆU' => '廳', + 'ÆV' => '欖', + 'ÆW' => 'ç£', + 'ÆX' => '籬', + 'ÆY' => 'ç±®', + 'ÆZ' => 'è »', + 'Æ[' => 'è§€', + 'Æ\\' => '躡', + 'Æ]' => 'é‡', + 'Æ^' => '鑲', + 'Æ_' => 'é‘°', + 'Æ`' => '顱', + 'Æa' => '饞', + 'Æb' => 'é«–', + 'Æc' => '鬣', + 'Æd' => '黌', + 'Æe' => 'ç¤', + 'Æf' => '矚', + 'Æg' => '讚', + 'Æh' => 'é‘·', + 'Æi' => '韉', + 'Æj' => 'é©¢', + 'Æk' => 'é©¥', + 'Æl' => '纜', + 'Æm' => '讜', + 'Æn' => '躪', + 'Æo' => '釅', + 'Æp' => '鑽', + 'Æq' => '鑾', + 'Ær' => '鑼', + 'Æs' => 'é±·', + 'Æt' => '鱸', + 'Æu' => 'é»·', + 'Æv' => 'è±”', + 'Æw' => 'é‘¿', + 'Æx' => '鸚', + 'Æy' => '爨', + 'Æz' => '驪', + 'Æ{' => '鬱', + 'Æ|' => '鸛', + 'Æ}' => '鸞', + 'Æ~' => 'ç±²', + 'Æ¡' => 'ヾ', + 'Æ¢' => 'ã‚', + 'Æ£' => 'ゞ', + 'Ƥ' => '々', + 'Æ¥' => 'ã', + 'Ʀ' => 'ã‚', + 'Ƨ' => 'ãƒ', + 'ƨ' => 'ã„', + 'Æ©' => 'ã…', + 'ƪ' => 'ã†', + 'Æ«' => 'ã‡', + 'Ƭ' => 'ãˆ', + 'Æ­' => 'ã‰', + 'Æ®' => 'ãŠ', + 'Ư' => 'ã‹', + 'ư' => 'ãŒ', + 'Ʊ' => 'ã', + 'Ʋ' => 'ãŽ', + 'Ƴ' => 'ã', + 'Æ´' => 'ã', + 'Ƶ' => 'ã‘', + 'ƶ' => 'ã’', + 'Æ·' => 'ã“', + 'Ƹ' => 'ã”', + 'ƹ' => 'ã•', + 'ƺ' => 'ã–', + 'Æ»' => 'ã—', + 'Ƽ' => 'ã˜', + 'ƽ' => 'ã™', + 'ƾ' => 'ãš', + 'Æ¿' => 'ã›', + 'ÆÀ' => 'ãœ', + 'ÆÁ' => 'ã', + 'ÆÂ' => 'ãž', + 'ÆÃ' => 'ãŸ', + 'ÆÄ' => 'ã ', + 'ÆÅ' => 'ã¡', + 'ÆÆ' => 'ã¢', + 'ÆÇ' => 'ã£', + 'ÆÈ' => 'ã¤', + 'ÆÉ' => 'ã¥', + 'ÆÊ' => 'ã¦', + 'ÆË' => 'ã§', + 'ÆÌ' => 'ã¨', + 'ÆÍ' => 'ã©', + 'ÆÎ' => 'ãª', + 'ÆÏ' => 'ã«', + 'ÆÐ' => 'ã¬', + 'ÆÑ' => 'ã­', + 'ÆÒ' => 'ã®', + 'ÆÓ' => 'ã¯', + 'ÆÔ' => 'ã°', + 'ÆÕ' => 'ã±', + 'ÆÖ' => 'ã²', + 'Æ×' => 'ã³', + 'ÆØ' => 'ã´', + 'ÆÙ' => 'ãµ', + 'ÆÚ' => 'ã¶', + 'ÆÛ' => 'ã·', + 'ÆÜ' => 'ã¸', + 'ÆÝ' => 'ã¹', + 'ÆÞ' => 'ãº', + 'Æß' => 'ã»', + 'Æà' => 'ã¼', + 'Æá' => 'ã½', + 'Æâ' => 'ã¾', + 'Æã' => 'ã¿', + 'Æä' => 'ã‚€', + 'Æå' => 'ã‚', + 'Ææ' => 'ã‚‚', + 'Æç' => 'ゃ', + 'Æè' => 'ã‚„', + 'Æé' => 'ã‚…', + 'Æê' => 'ゆ', + 'Æë' => 'ょ', + 'Æì' => 'よ', + 'Æí' => 'ら', + 'Æî' => 'り', + 'Æï' => 'ã‚‹', + 'Æð' => 'れ', + 'Æñ' => 'ã‚', + 'Æò' => 'ゎ', + 'Æó' => 'ã‚', + 'Æô' => 'ã‚', + 'Æõ' => 'ã‚‘', + 'Æö' => 'ã‚’', + 'Æ÷' => 'ã‚“', + 'Æø' => 'ã‚¡', + 'Æù' => 'ã‚¢', + 'Æú' => 'ã‚£', + 'Æû' => 'イ', + 'Æü' => 'ã‚¥', + 'Æý' => 'ウ', + 'Æþ' => 'ã‚§', + 'Ç@' => 'エ', + 'ÇA' => 'ã‚©', + 'ÇB' => 'オ', + 'ÇC' => 'ã‚«', + 'ÇD' => 'ガ', + 'ÇE' => 'ã‚­', + 'ÇF' => 'ã‚®', + 'ÇG' => 'ク', + 'ÇH' => 'ã‚°', + 'ÇI' => 'ケ', + 'ÇJ' => 'ゲ', + 'ÇK' => 'コ', + 'ÇL' => 'ã‚´', + 'ÇM' => 'サ', + 'ÇN' => 'ã‚¶', + 'ÇO' => 'ã‚·', + 'ÇP' => 'ジ', + 'ÇQ' => 'ス', + 'ÇR' => 'ズ', + 'ÇS' => 'ã‚»', + 'ÇT' => 'ゼ', + 'ÇU' => 'ソ', + 'ÇV' => 'ゾ', + 'ÇW' => 'ã‚¿', + 'ÇX' => 'ダ', + 'ÇY' => 'ãƒ', + 'ÇZ' => 'ヂ', + 'Ç[' => 'ッ', + 'Ç\\' => 'ツ', + 'Ç]' => 'ヅ', + 'Ç^' => 'テ', + 'Ç_' => 'デ', + 'Ç`' => 'ト', + 'Ça' => 'ド', + 'Çb' => 'ナ', + 'Çc' => 'ニ', + 'Çd' => 'ヌ', + 'Çe' => 'ãƒ', + 'Çf' => 'ノ', + 'Çg' => 'ãƒ', + 'Çh' => 'ãƒ', + 'Çi' => 'パ', + 'Çj' => 'ヒ', + 'Çk' => 'ビ', + 'Çl' => 'ピ', + 'Çm' => 'フ', + 'Çn' => 'ブ', + 'Ço' => 'プ', + 'Çp' => 'ヘ', + 'Çq' => 'ベ', + 'Çr' => 'ペ', + 'Çs' => 'ホ', + 'Çt' => 'ボ', + 'Çu' => 'ãƒ', + 'Çv' => 'マ', + 'Çw' => 'ミ', + 'Çx' => 'ム', + 'Çy' => 'メ', + 'Çz' => 'モ', + 'Ç{' => 'ャ', + 'Ç|' => 'ヤ', + 'Ç}' => 'ュ', + 'Ç~' => 'ユ', + 'Ç¡' => 'ョ', + 'Ç¢' => 'ヨ', + 'Ç£' => 'ラ', + 'Ǥ' => 'リ', + 'Ç¥' => 'ル', + 'Ǧ' => 'レ', + 'ǧ' => 'ロ', + 'Ǩ' => 'ヮ', + 'Ç©' => 'ワ', + 'Ǫ' => 'ヰ', + 'Ç«' => 'ヱ', + 'Ǭ' => 'ヲ', + 'Ç­' => 'ン', + 'Ç®' => 'ヴ', + 'ǯ' => 'ヵ', + 'ǰ' => 'ヶ', + 'DZ' => 'Д', + 'Dz' => 'Е', + 'dz' => 'Ð', + 'Ç´' => 'Ж', + 'ǵ' => 'З', + 'Ƕ' => 'И', + 'Ç·' => 'Й', + 'Ǹ' => 'К', + 'ǹ' => 'Л', + 'Ǻ' => 'М', + 'Ç»' => 'У', + 'Ǽ' => 'Ф', + 'ǽ' => 'Ð¥', + 'Ǿ' => 'Ц', + 'Ç¿' => 'Ч', + 'ÇÀ' => 'Ш', + 'ÇÁ' => 'Щ', + 'ÇÂ' => 'Ъ', + 'ÇÃ' => 'Ы', + 'ÇÄ' => 'Ь', + 'ÇÅ' => 'Э', + 'ÇÆ' => 'Ю', + 'ÇÇ' => 'Я', + 'ÇÈ' => 'а', + 'ÇÉ' => 'б', + 'ÇÊ' => 'в', + 'ÇË' => 'г', + 'ÇÌ' => 'д', + 'ÇÍ' => 'е', + 'ÇÎ' => 'Ñ‘', + 'ÇÏ' => 'ж', + 'ÇÐ' => 'з', + 'ÇÑ' => 'и', + 'ÇÒ' => 'й', + 'ÇÓ' => 'к', + 'ÇÔ' => 'л', + 'ÇÕ' => 'м', + 'ÇÖ' => 'н', + 'Ç×' => 'о', + 'ÇØ' => 'п', + 'ÇÙ' => 'Ñ€', + 'ÇÚ' => 'Ñ', + 'ÇÛ' => 'Ñ‚', + 'ÇÜ' => 'у', + 'ÇÝ' => 'Ñ„', + 'ÇÞ' => 'Ñ…', + 'Çß' => 'ц', + 'Çà' => 'ч', + 'Çá' => 'ш', + 'Çâ' => 'щ', + 'Çã' => 'ÑŠ', + 'Çä' => 'Ñ‹', + 'Çå' => 'ÑŒ', + 'Çæ' => 'Ñ', + 'Çç' => 'ÑŽ', + 'Çè' => 'Ñ', + 'Çé' => 'â‘ ', + 'Çê' => 'â‘¡', + 'Çë' => 'â‘¢', + 'Çì' => 'â‘£', + 'Çí' => '⑤', + 'Çî' => 'â‘¥', + 'Çï' => '⑦', + 'Çð' => 'â‘§', + 'Çñ' => '⑨', + 'Çò' => 'â‘©', + 'Çó' => 'â‘´', + 'Çô' => '⑵', + 'Çõ' => 'â‘¶', + 'Çö' => 'â‘·', + 'Ç÷' => '⑸', + 'Çø' => '⑹', + 'Çù' => '⑺', + 'Çú' => 'â‘»', + 'Çû' => '⑼', + 'Çü' => '⑽', + 'É@' => '乂', + 'ÉA' => '乜', + 'ÉB' => '凵', + 'ÉC' => '匚', + 'ÉD' => '厂', + 'ÉE' => '万', + 'ÉF' => '丌', + 'ÉG' => '乇', + 'ÉH' => 'äº', + 'ÉI' => 'å›—', + 'ÉJ' => '兀', + 'ÉK' => 'å±®', + 'ÉL' => 'å½³', + 'ÉM' => 'ä¸', + 'ÉN' => '冇', + 'ÉO' => '与', + 'ÉP' => '丮', + 'ÉQ' => '亓', + 'ÉR' => '仂', + 'ÉS' => '仉', + 'ÉT' => '仈', + 'ÉU' => '冘', + 'ÉV' => '勼', + 'ÉW' => 'å¬', + 'ÉX' => '厹', + 'ÉY' => '圠', + 'ÉZ' => '夃', + 'É[' => '夬', + 'É\\' => 'å°', + 'É]' => 'å·¿', + 'É^' => 'æ—¡', + 'É_' => '殳', + 'É`' => '毌', + 'Éa' => 'æ°”', + 'Éb' => '爿', + 'Éc' => '丱', + 'Éd' => '丼', + 'Ée' => '仨', + 'Éf' => '仜', + 'Ég' => '仩', + 'Éh' => '仡', + 'Éi' => 'ä»', + 'Éj' => '仚', + 'Ék' => '刌', + 'Él' => '匜', + 'Ém' => 'åŒ', + 'Én' => '圢', + 'Éo' => '圣', + 'Ép' => '夗', + 'Éq' => '夯', + 'Ér' => 'å®', + 'És' => '宄', + 'Ét' => 'å°’', + 'Éu' => 'å°»', + 'Év' => 'å±´', + 'Éw' => 'å±³', + 'Éx' => '帄', + 'Éy' => '庀', + 'Éz' => '庂', + 'É{' => '忉', + 'É|' => '戉', + 'É}' => 'æ‰', + 'É~' => 'æ°•', + 'É¡' => 'æ°¶', + 'É¢' => '汃', + 'É£' => 'æ°¿', + 'ɤ' => 'æ°»', + 'É¥' => '犮', + 'ɦ' => '犰', + 'ɧ' => '玊', + 'ɨ' => '禸', + 'É©' => '肊', + 'ɪ' => '阞', + 'É«' => '伎', + 'ɬ' => '优', + 'É­' => '伬', + 'É®' => '仵', + 'ɯ' => 'ä¼”', + 'ɰ' => 'ä»±', + 'ɱ' => 'ä¼€', + 'ɲ' => 'ä»·', + 'ɳ' => '伈', + 'É´' => 'ä¼', + 'ɵ' => '伂', + 'ɶ' => 'ä¼…', + 'É·' => 'ä¼¢', + 'ɸ' => '伓', + 'ɹ' => '伄', + 'ɺ' => 'ä»´', + 'É»' => 'ä¼’', + 'ɼ' => '冱', + 'ɽ' => '刓', + 'ɾ' => '刉', + 'É¿' => 'åˆ', + 'ÉÀ' => '劦', + 'ÉÁ' => '匢', + 'ÉÂ' => '匟', + 'ÉÃ' => 'å', + 'ÉÄ' => '厊', + 'ÉÅ' => 'å‡', + 'ÉÆ' => '囡', + 'ÉÇ' => '囟', + 'ÉÈ' => '圮', + 'ÉÉ' => '圪', + 'ÉÊ' => '圴', + 'ÉË' => '夼', + 'ÉÌ' => '妀', + 'ÉÍ' => '奼', + 'ÉÎ' => '妅', + 'ÉÏ' => '奻', + 'ÉÐ' => '奾', + 'ÉÑ' => '奷', + 'ÉÒ' => '奿', + 'ÉÓ' => 'å­–', + 'ÉÔ' => 'å°•', + 'ÉÕ' => 'å°¥', + 'ÉÖ' => 'å±¼', + 'É×' => '屺', + 'ÉØ' => 'å±»', + 'ÉÙ' => 'å±¾', + 'ÉÚ' => 'å·Ÿ', + 'ÉÛ' => 'å¹µ', + 'ÉÜ' => '庄', + 'ÉÝ' => '异', + 'ÉÞ' => '弚', + 'Éß' => 'å½´', + 'Éà' => 'å¿•', + 'Éá' => 'å¿”', + 'Éâ' => 'å¿', + 'Éã' => '扜', + 'Éä' => '扞', + 'Éå' => '扤', + 'Éæ' => '扡', + 'Éç' => '扦', + 'Éè' => '扢', + 'Éé' => '扙', + 'Éê' => '扠', + 'Éë' => '扚', + 'Éì' => '扥', + 'Éí' => 'æ—¯', + 'Éî' => 'æ—®', + 'Éï' => '朾', + 'Éð' => '朹', + 'Éñ' => '朸', + 'Éò' => '朻', + 'Éó' => '机', + 'Éô' => '朿', + 'Éõ' => '朼', + 'Éö' => '朳', + 'É÷' => 'æ°˜', + 'Éø' => '汆', + 'Éù' => 'æ±’', + 'Éú' => '汜', + 'Éû' => 'æ±', + 'Éü' => '汊', + 'Éý' => 'æ±”', + 'Éþ' => '汋', + 'Ê@' => '汌', + 'ÊA' => 'ç±', + 'ÊB' => '牞', + 'ÊC' => '犴', + 'ÊD' => '犵', + 'ÊE' => '玎', + 'ÊF' => '甪', + 'ÊG' => '癿', + 'ÊH' => '穵', + 'ÊI' => '网', + 'ÊJ' => '艸', + 'ÊK' => '艼', + 'ÊL' => '芀', + 'ÊM' => '艽', + 'ÊN' => '艿', + 'ÊO' => 'è™', + 'ÊP' => '襾', + 'ÊQ' => 'é‚™', + 'ÊR' => 'é‚—', + 'ÊS' => '邘', + 'ÊT' => 'é‚›', + 'ÊU' => 'é‚”', + 'ÊV' => '阢', + 'ÊW' => '阤', + 'ÊX' => '阠', + 'ÊY' => '阣', + 'ÊZ' => 'ä½–', + 'Ê[' => 'ä¼»', + 'Ê\\' => 'ä½¢', + 'Ê]' => '佉', + 'Ê^' => '体', + 'Ê_' => '佤', + 'Ê`' => 'ä¼¾', + 'Êa' => 'ä½§', + 'Êb' => 'ä½’', + 'Êc' => '佟', + 'Êd' => 'ä½', + 'Êe' => '佘', + 'Êf' => 'ä¼­', + 'Êg' => 'ä¼³', + 'Êh' => '伿', + 'Êi' => '佡', + 'Êj' => 'å†', + 'Êk' => '冹', + 'Êl' => '刜', + 'Êm' => '刞', + 'Ên' => '刡', + 'Êo' => '劭', + 'Êp' => '劮', + 'Êq' => '匉', + 'Êr' => 'å£', + 'Ês' => 'å²', + 'Êt' => '厎', + 'Êu' => 'åŽ', + 'Êv' => 'å°', + 'Êw' => 'å·', + 'Êx' => 'åª', + 'Êy' => 'å‘”', + 'Êz' => 'å‘…', + 'Ê{' => 'å™', + 'Ê|' => 'åœ', + 'Ê}' => 'å¥', + 'Ê~' => 'å˜', + 'Ê¡' => 'å½', + 'Ê¢' => 'å‘', + 'Ê£' => 'å‘', + 'ʤ' => 'å¨', + 'Ê¥' => 'å¤', + 'ʦ' => '呇', + 'ʧ' => 'å›®', + 'ʨ' => 'å›§', + 'Ê©' => '囥', + 'ʪ' => 'å', + 'Ê«' => 'å…', + 'ʬ' => 'åŒ', + 'Ê­' => 'å‰', + 'Ê®' => 'å‹', + 'ʯ' => 'å’', + 'ʰ' => '夆', + 'ʱ' => '奀', + 'ʲ' => '妦', + 'ʳ' => '妘', + 'Ê´' => '妠', + 'ʵ' => '妗', + 'ʶ' => '妎', + 'Ê·' => '妢', + 'ʸ' => 'å¦', + 'ʹ' => 'å¦', + 'ʺ' => '妧', + 'Ê»' => '妡', + 'ʼ' => '宎', + 'ʽ' => 'å®’', + 'ʾ' => 'å°¨', + 'Ê¿' => 'å°ª', + 'ÊÀ' => 'å²', + 'ÊÁ' => 'å²', + 'ÊÂ' => '岈', + 'ÊÃ' => '岋', + 'ÊÄ' => '岉', + 'ÊÅ' => 'å²’', + 'ÊÆ' => '岊', + 'ÊÇ' => '岆', + 'ÊÈ' => '岓', + 'ÊÉ' => '岕', + 'ÊÊ' => 'å· ', + 'ÊË' => '帊', + 'ÊÌ' => '帎', + 'ÊÍ' => '庋', + 'ÊÎ' => '庉', + 'ÊÏ' => '庌', + 'ÊÐ' => '庈', + 'ÊÑ' => 'åº', + 'ÊÒ' => 'å¼…', + 'ÊÓ' => 'å¼', + 'ÊÔ' => '彸', + 'ÊÕ' => 'å½¶', + 'ÊÖ' => 'å¿’', + 'Ê×' => 'å¿‘', + 'ÊØ' => 'å¿', + 'ÊÙ' => 'å¿­', + 'ÊÚ' => '忨', + 'ÊÛ' => 'å¿®', + 'ÊÜ' => '忳', + 'ÊÝ' => 'å¿¡', + 'ÊÞ' => '忤', + 'Êß' => 'å¿£', + 'Êà' => '忺', + 'Êá' => '忯', + 'Êâ' => 'å¿·', + 'Êã' => 'å¿»', + 'Êä' => '怀', + 'Êå' => 'å¿´', + 'Êæ' => '戺', + 'Êç' => '抃', + 'Êè' => '抌', + 'Êé' => '抎', + 'Êê' => 'æŠ', + 'Êë' => '抔', + 'Êì' => '抇', + 'Êí' => '扱', + 'Êî' => '扻', + 'Êï' => '扺', + 'Êð' => '扰', + 'Êñ' => 'æŠ', + 'Êò' => '抈', + 'Êó' => '扷', + 'Êô' => '扽', + 'Êõ' => '扲', + 'Êö' => '扴', + 'Ê÷' => 'æ”·', + 'Êø' => 'æ—°', + 'Êù' => 'æ—´', + 'Êú' => 'æ—³', + 'Êû' => 'æ—²', + 'Êü' => 'æ—µ', + 'Êý' => 'æ…', + 'Êþ' => 'æ‡', + 'Ë@' => 'æ™', + 'ËA' => 'æ•', + 'ËB' => 'æŒ', + 'ËC' => 'æˆ', + 'ËD' => 'æ', + 'ËE' => 'æ', + 'ËF' => 'æš', + 'ËG' => 'æ‹', + 'ËH' => 'æ¯', + 'ËI' => 'æ°™', + 'ËJ' => 'æ°š', + 'ËK' => '汸', + 'ËL' => 'æ±§', + 'ËM' => '汫', + 'ËN' => '沄', + 'ËO' => '沋', + 'ËP' => 'æ²', + 'ËQ' => 'æ±±', + 'ËR' => '汯', + 'ËS' => '汩', + 'ËT' => '沚', + 'ËU' => 'æ±­', + 'ËV' => '沇', + 'ËW' => '沕', + 'ËX' => '沜', + 'ËY' => '汦', + 'ËZ' => 'æ±³', + 'Ë[' => 'æ±¥', + 'Ë\\' => 'æ±»', + 'Ë]' => '沎', + 'Ë^' => 'ç´', + 'Ë_' => 'çº', + 'Ë`' => '牣', + 'Ëa' => '犿', + 'Ëb' => '犽', + 'Ëc' => '狃', + 'Ëd' => '狆', + 'Ëe' => 'ç‹', + 'Ëf' => '犺', + 'Ëg' => 'ç‹…', + 'Ëh' => '玕', + 'Ëi' => '玗', + 'Ëj' => '玓', + 'Ëk' => '玔', + 'Ël' => '玒', + 'Ëm' => '町', + 'Ën' => '甹', + 'Ëo' => 'ç–”', + 'Ëp' => 'ç–•', + 'Ëq' => 'çš', + 'Ër' => '礽', + 'Ës' => '耴', + 'Ët' => 'è‚•', + 'Ëu' => 'è‚™', + 'Ëv' => 'è‚', + 'Ëw' => 'è‚’', + 'Ëx' => '肜', + 'Ëy' => 'èŠ', + 'Ëz' => 'èŠ', + 'Ë{' => '芅', + 'Ë|' => '芎', + 'Ë}' => '芑', + 'Ë~' => '芓', + 'Ë¡' => '芊', + 'Ë¢' => '芃', + 'Ë£' => '芄', + 'ˤ' => '豸', + 'Ë¥' => '迉', + '˦' => '辿', + '˧' => '邟', + '˨' => 'é‚¡', + 'Ë©' => 'é‚¥', + '˪' => '邞', + 'Ë«' => 'é‚§', + 'ˬ' => 'é‚ ', + 'Ë­' => '阰', + 'Ë®' => '阨', + '˯' => '阯', + '˰' => '阭', + '˱' => '丳', + '˲' => '侘', + '˳' => 'ä½¼', + 'Ë´' => 'ä¾…', + '˵' => 'ä½½', + '˶' => 'ä¾€', + 'Ë·' => '侇', + '˸' => 'ä½¶', + '˹' => 'ä½´', + '˺' => '侉', + 'Ë»' => '侄', + '˼' => 'ä½·', + '˽' => '佌', + '˾' => 'ä¾—', + 'Ë¿' => '佪', + 'ËÀ' => '侚', + 'ËÁ' => 'ä½¹', + 'ËÂ' => 'ä¾', + 'ËÃ' => '佸', + 'ËÄ' => 'ä¾', + 'ËÅ' => '侜', + 'ËÆ' => 'ä¾”', + 'ËÇ' => '侞', + 'ËÈ' => 'ä¾’', + 'ËÉ' => '侂', + 'ËÊ' => '侕', + 'ËË' => '佫', + 'ËÌ' => 'ä½®', + 'ËÍ' => '冞', + 'ËÎ' => '冼', + 'ËÏ' => '冾', + 'ËÐ' => '刵', + 'ËÑ' => '刲', + 'ËÒ' => '刳', + 'ËÓ' => '剆', + 'ËÔ' => '刱', + 'ËÕ' => '劼', + 'ËÖ' => '匊', + 'Ë×' => '匋', + 'ËØ' => '匼', + 'ËÙ' => '厒', + 'ËÚ' => '厔', + 'ËÛ' => 'å’‡', + 'ËÜ' => 'å‘¿', + 'ËÝ' => 'å’', + 'ËÞ' => 'å’‘', + 'Ëß' => 'å’‚', + 'Ëà' => 'å’ˆ', + 'Ëá' => 'å‘«', + 'Ëâ' => '呺', + 'Ëã' => '呾', + 'Ëä' => 'å‘¥', + 'Ëå' => '呬', + 'Ëæ' => 'å‘´', + 'Ëç' => '呦', + 'Ëè' => 'å’', + 'Ëé' => '呯', + 'Ëê' => 'å‘¡', + 'Ëë' => 'å‘ ', + 'Ëì' => 'å’˜', + 'Ëí' => 'å‘£', + 'Ëî' => 'å‘§', + 'Ëï' => '呤', + 'Ëð' => 'å›·', + 'Ëñ' => '囹', + 'Ëò' => 'å¯', + 'Ëó' => 'å²', + 'Ëô' => 'å­', + 'Ëõ' => 'å«', + 'Ëö' => 'å±', + 'Ë÷' => 'å°', + 'Ëø' => 'å¶', + 'Ëù' => '垀', + 'Ëú' => 'åµ', + 'Ëû' => 'å»', + 'Ëü' => 'å³', + 'Ëý' => 'å´', + 'Ëþ' => 'å¢', + 'Ì@' => 'å¨', + 'ÌA' => 'å½', + 'ÌB' => '夌', + 'ÌC' => '奅', + 'ÌD' => '妵', + 'ÌE' => '妺', + 'ÌF' => 'å§', + 'ÌG' => 'å§Ž', + 'ÌH' => '妲', + 'ÌI' => 'å§Œ', + 'ÌJ' => 'å§', + 'ÌK' => '妶', + 'ÌL' => '妼', + 'ÌM' => '姃', + 'ÌN' => 'å§–', + 'ÌO' => '妱', + 'ÌP' => '妽', + 'ÌQ' => 'å§€', + 'ÌR' => '姈', + 'ÌS' => '妴', + 'ÌT' => '姇', + 'ÌU' => 'å­¢', + 'ÌV' => 'å­¥', + 'ÌW' => '宓', + 'ÌX' => '宕', + 'ÌY' => '屄', + 'ÌZ' => '屇', + 'Ì[' => 'å²®', + 'Ì\\' => '岤', + 'Ì]' => 'å² ', + 'Ì^' => 'å²µ', + 'Ì_' => '岯', + 'Ì`' => '岨', + 'Ìa' => '岬', + 'Ìb' => '岟', + 'Ìc' => 'å²£', + 'Ìd' => 'å²­', + 'Ìe' => 'å²¢', + 'Ìf' => '岪', + 'Ìg' => 'å²§', + 'Ìh' => 'å²', + 'Ìi' => 'å²¥', + 'Ìj' => 'å²¶', + 'Ìk' => 'å²°', + 'Ìl' => '岦', + 'Ìm' => '帗', + 'Ìn' => '帔', + 'Ìo' => '帙', + 'Ìp' => '弨', + 'Ìq' => 'å¼¢', + 'Ìr' => 'å¼£', + 'Ìs' => '弤', + 'Ìt' => 'å½”', + 'Ìu' => '徂', + 'Ìv' => 'å½¾', + 'Ìw' => 'å½½', + 'Ìx' => '忞', + 'Ìy' => 'å¿¥', + 'Ìz' => '怭', + 'Ì{' => '怦', + 'Ì|' => '怙', + 'Ì}' => '怲', + 'Ì~' => '怋', + 'Ì¡' => '怴', + 'Ì¢' => '怊', + 'Ì£' => '怗', + '̤' => '怳', + 'Ì¥' => '怚', + '̦' => '怞', + '̧' => '怬', + '̨' => '怢', + 'Ì©' => 'æ€', + '̪' => 'æ€', + 'Ì«' => '怮', + '̬' => '怓', + 'Ì­' => '怑', + 'Ì®' => '怌', + '̯' => '怉', + '̰' => '怜', + '̱' => '戔', + '̲' => '戽', + '̳' => '抭', + 'Ì´' => '抴', + '̵' => 'æ‹‘', + '̶' => '抾', + 'Ì·' => '抪', + '̸' => '抶', + '̹' => '拊', + '̺' => '抮', + 'Ì»' => '抳', + '̼' => '抯', + '̽' => '抻', + '̾' => '抩', + 'Ì¿' => '抰', + 'ÌÀ' => '抸', + 'ÌÁ' => '攽', + 'ÌÂ' => 'æ–¨', + 'ÌÃ' => 'æ–»', + 'ÌÄ' => '昉', + 'ÌÅ' => 'æ—¼', + 'ÌÆ' => '昄', + 'ÌÇ' => '昒', + 'ÌÈ' => '昈', + 'ÌÉ' => 'æ—»', + 'ÌÊ' => '昃', + 'ÌË' => '昋', + 'ÌÌ' => 'æ˜', + 'ÌÍ' => '昅', + 'ÌÎ' => 'æ—½', + 'ÌÏ' => '昑', + 'ÌÐ' => 'æ˜', + 'ÌÑ' => 'æ›¶', + 'ÌÒ' => '朊', + 'ÌÓ' => 'æž…', + 'ÌÔ' => 'æ¬', + 'ÌÕ' => '枎', + 'ÌÖ' => 'æž’', + 'Ì×' => 'æ¶', + 'ÌØ' => 'æ»', + 'ÌÙ' => '枘', + 'ÌÚ' => '枆', + 'ÌÛ' => 'æž„', + 'ÌÜ' => 'æ´', + 'ÌÝ' => 'æž', + 'ÌÞ' => '枌', + 'Ìß' => 'æº', + 'Ìà' => '枟', + 'Ìá' => 'æž‘', + 'Ìâ' => 'æž™', + 'Ìã' => '枃', + 'Ìä' => 'æ½', + 'Ìå' => 'æž', + 'Ìæ' => 'æ¸', + 'Ìç' => 'æ¹', + 'Ìè' => 'æž”', + 'Ìé' => '欥', + 'Ìê' => '殀', + 'Ìë' => 'æ­¾', + 'Ìì' => '毞', + 'Ìí' => 'æ°', + 'Ìî' => '沓', + 'Ìï' => '泬', + 'Ìð' => '泫', + 'Ìñ' => 'æ³®', + 'Ìò' => 'æ³™', + 'Ìó' => 'æ²¶', + 'Ìô' => 'æ³”', + 'Ìõ' => 'æ²­', + 'Ìö' => 'æ³§', + 'Ì÷' => 'æ²·', + 'Ìø' => 'æ³', + 'Ìù' => '泂', + 'Ìú' => '沺', + 'Ìû' => '泃', + 'Ìü' => '泆', + 'Ìý' => 'æ³­', + 'Ìþ' => 'æ³²', + 'Í@' => 'æ³’', + 'ÍA' => 'æ³', + 'ÍB' => 'æ²´', + 'ÍC' => '沊', + 'ÍD' => 'æ²', + 'ÍE' => 'æ²€', + 'ÍF' => '泞', + 'ÍG' => 'æ³€', + 'ÍH' => 'æ´°', + 'ÍI' => 'æ³', + 'ÍJ' => '泇', + 'ÍK' => 'æ²°', + 'ÍL' => 'æ³¹', + 'ÍM' => 'æ³', + 'ÍN' => '泩', + 'ÍO' => '泑', + 'ÍP' => 'ç‚”', + 'ÍQ' => '炘', + 'ÍR' => 'ç‚…', + 'ÍS' => 'ç‚“', + 'ÍT' => '炆', + 'ÍU' => 'ç‚„', + 'ÍV' => 'ç‚‘', + 'ÍW' => 'ç‚–', + 'ÍX' => 'ç‚‚', + 'ÍY' => '炚', + 'ÍZ' => '炃', + 'Í[' => '牪', + 'Í\\' => 'ç‹–', + 'Í]' => 'ç‹‹', + 'Í^' => '狘', + 'Í_' => '狉', + 'Í`' => '狜', + 'Ía' => 'ç‹’', + 'Íb' => 'ç‹”', + 'Íc' => '狚', + 'Íd' => '狌', + 'Íe' => 'ç‹‘', + 'Íf' => '玤', + 'Íg' => '玡', + 'Íh' => '玭', + 'Íi' => '玦', + 'Íj' => '玢', + 'Ík' => '玠', + 'Íl' => '玬', + 'Ím' => 'çŽ', + 'Ín' => 'ç“', + 'Ío' => '瓨', + 'Íp' => '甿', + 'Íq' => 'ç•€', + 'Ír' => '甾', + 'Ís' => 'ç–Œ', + 'Ít' => 'ç–˜', + 'Íu' => '皯', + 'Ív' => '盳', + 'Íw' => 'ç›±', + 'Íx' => 'ç›°', + 'Íy' => '盵', + 'Íz' => '矸', + 'Í{' => '矼', + 'Í|' => '矹', + 'Í}' => '矻', + 'Í~' => '矺', + 'Í¡' => '矷', + 'Í¢' => '祂', + 'Í£' => '礿', + 'ͤ' => 'ç§…', + 'Í¥' => '穸', + 'ͦ' => 'ç©»', + 'ͧ' => 'ç«»', + 'ͨ' => 'ç±µ', + 'Í©' => 'ç³½', + 'ͪ' => '耵', + 'Í«' => 'è‚', + 'ͬ' => 'è‚®', + 'Í­' => 'è‚£', + 'Í®' => '肸', + 'ͯ' => '肵', + 'Ͱ' => 'è‚­', + 'ͱ' => '舠', + 'Ͳ' => '芠', + 'ͳ' => 'è‹€', + 'Í´' => '芫', + '͵' => '芚', + 'Ͷ' => '芘', + 'Í·' => '芛', + '͸' => '芵', + '͹' => '芧', + 'ͺ' => '芮', + 'Í»' => '芼', + 'ͼ' => '芞', + 'ͽ' => '芺', + ';' => '芴', + 'Í¿' => '芨', + 'ÍÀ' => '芡', + 'ÍÁ' => '芩', + 'ÍÂ' => 'è‹‚', + 'ÍÃ' => '芤', + 'ÍÄ' => '苃', + 'ÍÅ' => '芶', + 'ÍÆ' => '芢', + 'ÍÇ' => 'è™°', + 'ÍÈ' => '虯', + 'ÍÉ' => 'è™­', + 'ÍÊ' => 'è™®', + 'ÍË' => 'è±–', + 'ÍÌ' => 'è¿’', + 'ÍÍ' => 'è¿‹', + 'ÍÎ' => 'è¿“', + 'ÍÏ' => 'è¿', + 'ÍÐ' => 'è¿–', + 'ÍÑ' => 'è¿•', + 'ÍÒ' => 'è¿—', + 'ÍÓ' => '邲', + 'ÍÔ' => 'é‚´', + 'ÍÕ' => '邯', + 'ÍÖ' => '邳', + 'Í×' => 'é‚°', + 'ÍØ' => '阹', + 'ÍÙ' => '阽', + 'ÍÚ' => '阼', + 'ÍÛ' => '阺', + 'ÍÜ' => '陃', + 'ÍÝ' => 'ä¿', + 'ÍÞ' => 'ä¿…', + 'Íß' => 'ä¿“', + 'Íà' => 'ä¾²', + 'Íá' => '俉', + 'Íâ' => 'ä¿‹', + 'Íã' => 'ä¿', + 'Íä' => 'ä¿”', + 'Íå' => '俜', + 'Íæ' => 'ä¿™', + 'Íç' => 'ä¾»', + 'Íè' => 'ä¾³', + 'Íé' => 'ä¿›', + 'Íê' => '俇', + 'Íë' => 'ä¿–', + 'Íì' => '侺', + 'Íí' => 'ä¿€', + 'Íî' => 'ä¾¹', + 'Íï' => '俬', + 'Íð' => '剄', + 'Íñ' => '剉', + 'Íò' => 'å‹€', + 'Íó' => 'å‹‚', + 'Íô' => '匽', + 'Íõ' => 'å¼', + 'Íö' => '厗', + 'Í÷' => '厖', + 'Íø' => '厙', + 'Íù' => '厘', + 'Íú' => 'å’º', + 'Íû' => 'å’¡', + 'Íü' => 'å’­', + 'Íý' => 'å’¥', + 'Íþ' => 'å“', + 'Î@' => '哃', + 'ÎA' => 'èŒ', + 'ÎB' => 'å’·', + 'ÎC' => 'å’®', + 'ÎD' => 'å“–', + 'ÎE' => 'å’¶', + 'ÎF' => 'å“…', + 'ÎG' => '哆', + 'ÎH' => 'å’ ', + 'ÎI' => 'å‘°', + 'ÎJ' => 'å’¼', + 'ÎK' => 'å’¢', + 'ÎL' => 'å’¾', + 'ÎM' => '呲', + 'ÎN' => '哞', + 'ÎO' => 'å’°', + 'ÎP' => 'åžµ', + 'ÎQ' => 'åžž', + 'ÎR' => '垟', + 'ÎS' => '垤', + 'ÎT' => '垌', + 'ÎU' => 'åž—', + 'ÎV' => 'åž', + 'ÎW' => 'åž›', + 'ÎX' => 'åž”', + 'ÎY' => '垘', + 'ÎZ' => 'åž', + 'Î[' => 'åž™', + 'Î\\' => '垥', + 'Î]' => 'åžš', + 'Î^' => 'åž•', + 'Î_' => '壴', + 'Î`' => 'å¤', + 'Îa' => '奓', + 'Îb' => 'å§¡', + 'Îc' => 'å§ž', + 'Îd' => 'å§®', + 'Îe' => '娀', + 'Îf' => 'å§±', + 'Îg' => 'å§', + 'Îh' => '姺', + 'Îi' => 'å§½', + 'Îj' => 'å§¼', + 'Îk' => 'å§¶', + 'Îl' => '姤', + 'Îm' => 'å§²', + 'În' => 'å§·', + 'Îo' => 'å§›', + 'Îp' => 'å§©', + 'Îq' => 'å§³', + 'Îr' => 'å§µ', + 'Îs' => 'å§ ', + 'Ît' => 'å§¾', + 'Îu' => 'å§´', + 'Îv' => 'å§­', + 'Îw' => '宨', + 'Îx' => '屌', + 'Îy' => 'å³', + 'Îz' => '峘', + 'Î{' => '峌', + 'Î|' => 'å³—', + 'Î}' => '峋', + 'Î~' => 'å³›', + 'Ρ' => '峞', + '΢' => '峚', + 'Σ' => '峉', + 'Τ' => '峇', + 'Î¥' => '峊', + 'Φ' => 'å³–', + 'Χ' => '峓', + 'Ψ' => 'å³”', + 'Ω' => 'å³', + 'Ϊ' => '峈', + 'Ϋ' => '峆', + 'ά' => '峎', + 'έ' => '峟', + 'ή' => '峸', + 'ί' => 'å·¹', + 'ΰ' => '帡', + 'α' => '帢', + 'β' => '帣', + 'γ' => '帠', + 'δ' => '帤', + 'ε' => '庰', + 'ζ' => '庤', + 'η' => '庢', + 'θ' => '庛', + 'ι' => '庣', + 'κ' => '庥', + 'λ' => '弇', + 'μ' => 'å¼®', + 'ν' => 'å½–', + 'ξ' => '徆', + 'ο' => '怷', + 'ÎÀ' => '怹', + 'ÎÁ' => 'æ”', + 'ÎÂ' => 'æ²', + 'ÎÃ' => 'æž', + 'ÎÄ' => 'æ…', + 'ÎÅ' => 'æ“', + 'ÎÆ' => 'æ‡', + 'ÎÇ' => 'æ‰', + 'ÎÈ' => 'æ›', + 'ÎÉ' => 'æŒ', + 'ÎÊ' => 'æ€', + 'ÎË' => 'æ‚', + 'ÎÌ' => 'æŸ', + 'ÎÍ' => '怤', + 'ÎÎ' => 'æ„', + 'ÎÏ' => 'æ˜', + 'ÎÐ' => 'æ¦', + 'ÎÑ' => 'æ®', + 'ÎÒ' => '扂', + 'ÎÓ' => '扃', + 'ÎÔ' => 'æ‹', + 'ÎÕ' => 'æŒ', + 'ÎÖ' => '挋', + 'Î×' => '拵', + 'ÎØ' => '挎', + 'ÎÙ' => '挃', + 'ÎÚ' => 'æ‹«', + 'ÎÛ' => '拹', + 'ÎÜ' => 'æŒ', + 'ÎÝ' => '挌', + 'ÎÞ' => '拸', + 'Îß' => 'æ‹¶', + 'Îà' => '挀', + 'Îá' => '挓', + 'Îâ' => '挔', + 'Îã' => '拺', + 'Îä' => '挕', + 'Îå' => 'æ‹»', + 'Îæ' => 'æ‹°', + 'Îç' => 'æ•', + 'Îè' => '敃', + 'Îé' => 'æ–ª', + 'Îê' => 'æ–¿', + 'Îë' => '昶', + 'Îì' => '昡', + 'Îí' => '昲', + 'Îî' => '昵', + 'Îï' => '昜', + 'Îð' => '昦', + 'Îñ' => '昢', + 'Îò' => '昳', + 'Îó' => '昫', + 'Îô' => '昺', + 'Îõ' => 'æ˜', + 'Îö' => '昴', + 'Î÷' => '昹', + 'Îø' => '昮', + 'Îù' => 'æœ', + 'Îú' => 'æœ', + 'Îû' => 'æŸ', + 'Îü' => '柲', + 'Îý' => '柈', + 'Îþ' => '枺', + 'Ï@' => '柜', + 'ÏA' => 'æž»', + 'ÏB' => '柸', + 'ÏC' => '柘', + 'ÏD' => '柀', + 'ÏE' => 'æž·', + 'ÏF' => '柅', + 'ÏG' => '柫', + 'ÏH' => '柤', + 'ÏI' => '柟', + 'ÏJ' => 'æžµ', + 'ÏK' => 'æŸ', + 'ÏL' => 'æž³', + 'ÏM' => '柷', + 'ÏN' => '柶', + 'ÏO' => '柮', + 'ÏP' => '柣', + 'ÏQ' => '柂', + 'ÏR' => 'æž¹', + 'ÏS' => '柎', + 'ÏT' => '柧', + 'ÏU' => '柰', + 'ÏV' => 'æž²', + 'ÏW' => '柼', + 'ÏX' => '柆', + 'ÏY' => '柭', + 'ÏZ' => '柌', + 'Ï[' => 'æž®', + 'Ï\\' => '柦', + 'Ï]' => '柛', + 'Ï^' => '柺', + 'Ï_' => '柉', + 'Ï`' => '柊', + 'Ïa' => '柃', + 'Ïb' => '柪', + 'Ïc' => '柋', + 'Ïd' => '欨', + 'Ïe' => '殂', + 'Ïf' => '殄', + 'Ïg' => 'æ®¶', + 'Ïh' => '毖', + 'Ïi' => '毘', + 'Ïj' => '毠', + 'Ïk' => 'æ° ', + 'Ïl' => 'æ°¡', + 'Ïm' => 'æ´¨', + 'Ïn' => 'æ´´', + 'Ïo' => 'æ´­', + 'Ïp' => 'æ´Ÿ', + 'Ïq' => 'æ´¼', + 'Ïr' => 'æ´¿', + 'Ïs' => 'æ´’', + 'Ït' => 'æ´Š', + 'Ïu' => '泚', + 'Ïv' => 'æ´³', + 'Ïw' => 'æ´„', + 'Ïx' => 'æ´™', + 'Ïy' => 'æ´º', + 'Ïz' => 'æ´š', + 'Ï{' => 'æ´‘', + 'Ï|' => 'æ´€', + 'Ï}' => 'æ´', + 'Ï~' => '浂', + 'Ï¡' => 'æ´', + 'Ï¢' => 'æ´˜', + 'Ï£' => 'æ´·', + 'Ϥ' => 'æ´ƒ', + 'Ï¥' => 'æ´', + 'Ϧ' => 'æµ€', + 'ϧ' => 'æ´‡', + 'Ϩ' => 'æ´ ', + 'Ï©' => 'æ´¬', + 'Ϫ' => 'æ´ˆ', + 'Ï«' => 'æ´¢', + 'Ϭ' => 'æ´‰', + 'Ï­' => 'æ´', + 'Ï®' => 'ç‚·', + 'ϯ' => '炟', + 'ϰ' => '炾', + 'ϱ' => '炱', + 'ϲ' => 'ç‚°', + 'ϳ' => 'ç‚¡', + 'Ï´' => 'ç‚´', + 'ϵ' => '炵', + '϶' => 'ç‚©', + 'Ï·' => 'ç‰', + 'ϸ' => '牉', + 'Ϲ' => '牊', + 'Ϻ' => '牬', + 'Ï»' => '牰', + 'ϼ' => '牳', + 'Ͻ' => '牮', + 'Ͼ' => '狊', + 'Ï¿' => '狤', + 'ÏÀ' => '狨', + 'ÏÁ' => 'ç‹«', + 'ÏÂ' => '狟', + 'ÏÃ' => '狪', + 'ÏÄ' => '狦', + 'ÏÅ' => 'ç‹£', + 'ÏÆ' => '玅', + 'ÏÇ' => 'çŒ', + 'ÏÈ' => 'ç‚', + 'ÏÉ' => 'çˆ', + 'ÏÊ' => 'ç…', + 'ÏË' => '玹', + 'ÏÌ' => '玶', + 'ÏÍ' => '玵', + 'ÏÎ' => '玴', + 'ÏÏ' => 'ç«', + 'ÏÐ' => '玿', + 'ÏÑ' => 'ç‡', + 'ÏÒ' => '玾', + 'ÏÓ' => 'çƒ', + 'ÏÔ' => 'ç†', + 'ÏÕ' => '玸', + 'ÏÖ' => 'ç‹', + 'Ï×' => '瓬', + 'ÏØ' => 'ç“®', + 'ÏÙ' => 'ç”®', + 'ÏÚ' => '畇', + 'ÏÛ' => '畈', + 'ÏÜ' => 'ç–§', + 'ÏÝ' => 'ç–ª', + 'ÏÞ' => '癹', + 'Ïß' => '盄', + 'Ïà' => '眈', + 'Ïá' => '眃', + 'Ïâ' => '眄', + 'Ïã' => '眅', + 'Ïä' => '眊', + 'Ïå' => 'ç›·', + 'Ïæ' => 'ç›»', + 'Ïç' => '盺', + 'Ïè' => '矧', + 'Ïé' => '矨', + 'Ïê' => 'ç †', + 'Ïë' => 'ç ‘', + 'Ïì' => 'ç ’', + 'Ïí' => 'ç …', + 'Ïî' => 'ç ', + 'Ïï' => 'ç ', + 'Ïð' => 'ç Ž', + 'Ïñ' => 'ç ‰', + 'Ïò' => 'ç ƒ', + 'Ïó' => 'ç “', + 'Ïô' => '祊', + 'Ïõ' => '祌', + 'Ïö' => '祋', + 'Ï÷' => '祅', + 'Ïø' => '祄', + 'Ïù' => 'ç§•', + 'Ïú' => 'ç§', + 'Ïû' => 'ç§', + 'Ïü' => 'ç§–', + 'Ïý' => 'ç§Ž', + 'Ïþ' => '窀', + 'Ð@' => '穾', + 'ÐA' => 'ç«‘', + 'ÐB' => '笀', + 'ÐC' => 'ç¬', + 'ÐD' => '籺', + 'ÐE' => '籸', + 'ÐF' => 'ç±¹', + 'ÐG' => '籿', + 'ÐH' => 'ç²€', + 'ÐI' => 'ç²', + 'ÐJ' => 'ç´ƒ', + 'ÐK' => 'ç´ˆ', + 'ÐL' => 'ç´', + 'ÐM' => '罘', + 'ÐN' => '羑', + 'ÐO' => 'ç¾', + 'ÐP' => 'ç¾¾', + 'ÐQ' => '耇', + 'ÐR' => '耎', + 'ÐS' => 'è€', + 'ÐT' => '耔', + 'ÐU' => '耷', + 'ÐV' => '胘', + 'ÐW' => '胇', + 'ÐX' => '胠', + 'ÐY' => '胑', + 'ÐZ' => '胈', + 'Ð[' => '胂', + 'Ð\\' => 'èƒ', + 'Ð]' => '胅', + 'Ð^' => '胣', + 'Ð_' => '胙', + 'Ð`' => '胜', + 'Ða' => '胊', + 'Ðb' => '胕', + 'Ðc' => '胉', + 'Ðd' => 'èƒ', + 'Ðe' => '胗', + 'Ðf' => '胦', + 'Ðg' => 'èƒ', + 'Ðh' => '臿', + 'Ði' => '舡', + 'Ðj' => '芔', + 'Ðk' => 'è‹™', + 'Ðl' => '苾', + 'Ðm' => '苹', + 'Ðn' => '茇', + 'Ðo' => '苨', + 'Ðp' => '茀', + 'Ðq' => 'è‹•', + 'Ðr' => '茺', + 'Ðs' => 'è‹«', + 'Ðt' => 'è‹–', + 'Ðu' => 'è‹´', + 'Ðv' => '苬', + 'Ðw' => 'è‹¡', + 'Ðx' => '苲', + 'Ðy' => '苵', + 'Ðz' => '茌', + 'Ð{' => 'è‹»', + 'Ð|' => 'è‹¶', + 'Ð}' => 'è‹°', + 'Ð~' => '苪', + 'С' => '苤', + 'Т' => 'è‹ ', + 'У' => '苺', + 'Ф' => '苳', + 'Ð¥' => 'è‹­', + 'Ц' => 'è™·', + 'Ч' => 'è™´', + 'Ш' => '虼', + 'Щ' => '虳', + 'Ъ' => 'è¡', + 'Ы' => '衎', + 'Ь' => 'è¡§', + 'Э' => '衪', + 'Ю' => 'è¡©', + 'Я' => 'è§“', + 'а' => '訄', + 'б' => '訇', + 'в' => 'èµ²', + 'г' => 'è¿£', + 'д' => 'è¿¡', + 'е' => 'è¿®', + 'ж' => 'è¿ ', + 'з' => '郱', + 'и' => '邽', + 'й' => 'é‚¿', + 'к' => '郕', + 'л' => '郅', + 'м' => '邾', + 'н' => '郇', + 'о' => '郋', + 'п' => '郈', + 'ÐÀ' => '釔', + 'ÐÁ' => '釓', + 'ÐÂ' => 'é™”', + 'ÐÃ' => 'é™', + 'ÐÄ' => '陑', + 'ÐÅ' => '陓', + 'ÐÆ' => '陊', + 'ÐÇ' => '陎', + 'ÐÈ' => '倞', + 'ÐÉ' => '倅', + 'ÐÊ' => '倇', + 'ÐË' => '倓', + 'ÐÌ' => '倢', + 'ÐÍ' => '倰', + 'ÐÎ' => '倛', + 'ÐÏ' => '俵', + 'ÐÐ' => 'ä¿´', + 'ÐÑ' => '倳', + 'ÐÒ' => '倷', + 'ÐÓ' => '倬', + 'ÐÔ' => 'ä¿¶', + 'ÐÕ' => 'ä¿·', + 'ÐÖ' => '倗', + 'Ð×' => '倜', + 'ÐØ' => '倠', + 'ÐÙ' => '倧', + 'ÐÚ' => '倵', + 'ÐÛ' => '倯', + 'ÐÜ' => '倱', + 'ÐÝ' => '倎', + 'ÐÞ' => 'å…š', + 'Ðß' => '冔', + 'Ðà' => '冓', + 'Ðá' => '凊', + 'Ðâ' => '凄', + 'Ðã' => '凅', + 'Ðä' => '凈', + 'Ðå' => '凎', + 'Ðæ' => '剡', + 'Ðç' => '剚', + 'Ðè' => '剒', + 'Ðé' => '剞', + 'Ðê' => '剟', + 'Ðë' => '剕', + 'Ðì' => '剢', + 'Ðí' => 'å‹', + 'Ðî' => '匎', + 'Ðï' => '厞', + 'Ðð' => '唦', + 'Ðñ' => 'å“¢', + 'Ðò' => 'å”—', + 'Ðó' => 'å”’', + 'Ðô' => 'å“§', + 'Ðõ' => '哳', + 'Ðö' => '哤', + 'Ð÷' => '唚', + 'Ðø' => 'å“¿', + 'Ðù' => '唄', + 'Ðú' => '唈', + 'Ðû' => 'å“«', + 'Ðü' => '唑', + 'Ðý' => 'å”…', + 'Ðþ' => '哱', + 'Ñ@' => '唊', + 'ÑA' => 'å“»', + 'ÑB' => 'å“·', + 'ÑC' => '哸', + 'ÑD' => 'å“ ', + 'ÑE' => '唎', + 'ÑF' => '唃', + 'ÑG' => '唋', + 'ÑH' => 'åœ', + 'ÑI' => '圂', + 'ÑJ' => '埌', + 'ÑK' => 'å ²', + 'ÑL' => '埕', + 'ÑM' => '埒', + 'ÑN' => '垺', + 'ÑO' => '埆', + 'ÑP' => 'åž½', + 'ÑQ' => 'åž¼', + 'ÑR' => '垸', + 'ÑS' => 'åž¶', + 'ÑT' => 'åž¿', + 'ÑU' => '埇', + 'ÑV' => 'åŸ', + 'ÑW' => 'åž¹', + 'ÑX' => 'åŸ', + 'ÑY' => '夎', + 'ÑZ' => '奊', + 'Ñ[' => '娙', + 'Ñ\\' => '娖', + 'Ñ]' => '娭', + 'Ñ^' => '娮', + 'Ñ_' => '娕', + 'Ñ`' => 'å¨', + 'Ña' => '娗', + 'Ñb' => '娊', + 'Ñc' => '娞', + 'Ñd' => '娳', + 'Ñe' => 'å­¬', + 'Ñf' => 'å®§', + 'Ñg' => 'å®­', + 'Ñh' => '宬', + 'Ñi' => 'å°ƒ', + 'Ñj' => 'å±–', + 'Ñk' => 'å±”', + 'Ñl' => '峬', + 'Ñm' => '峿', + 'Ñn' => 'å³®', + 'Ño' => 'å³±', + 'Ñp' => 'å³·', + 'Ñq' => 'å´€', + 'Ñr' => 'å³¹', + 'Ñs' => '帩', + 'Ñt' => '帨', + 'Ñu' => '庨', + 'Ñv' => '庮', + 'Ñw' => '庪', + 'Ñx' => '庬', + 'Ñy' => 'å¼³', + 'Ñz' => 'å¼°', + 'Ñ{' => 'å½§', + 'Ñ|' => 'æ', + 'Ñ}' => 'æš', + 'Ñ~' => 'æ§', + 'Ñ¡' => 'æ', + 'Ñ¢' => 'æ‚¢', + 'Ñ£' => '悈', + 'Ѥ' => 'æ‚€', + 'Ñ¥' => 'æ‚’', + 'Ѧ' => 'æ‚', + 'ѧ' => 'æ‚', + 'Ѩ' => '悃', + 'Ñ©' => 'æ‚•', + 'Ѫ' => 'æ‚›', + 'Ñ«' => 'æ‚—', + 'Ѭ' => '悇', + 'Ñ­' => '悜', + 'Ñ®' => '悎', + 'ѯ' => '戙', + 'Ѱ' => '扆', + 'ѱ' => '拲', + 'Ѳ' => 'æŒ', + 'ѳ' => 'æ–', + 'Ñ´' => '挬', + 'ѵ' => 'æ„', + 'Ѷ' => 'æ…', + 'Ñ·' => '挶', + 'Ѹ' => 'æƒ', + 'ѹ' => 'æ¤', + 'Ѻ' => '挹', + 'Ñ»' => 'æ‹', + 'Ѽ' => 'æŠ', + 'ѽ' => '挼', + 'Ѿ' => '挩', + 'Ñ¿' => 'æ', + 'ÑÀ' => '挴', + 'ÑÁ' => 'æ˜', + 'ÑÂ' => 'æ”', + 'ÑÃ' => 'æ™', + 'ÑÄ' => '挭', + 'ÑÅ' => 'æ‡', + 'ÑÆ' => '挳', + 'ÑÇ' => 'æš', + 'ÑÈ' => 'æ‘', + 'ÑÉ' => '挸', + 'ÑÊ' => 'æ—', + 'ÑË' => 'æ€', + 'ÑÌ' => 'æˆ', + 'ÑÍ' => '敊', + 'ÑÎ' => '敆', + 'ÑÏ' => 'æ—†', + 'ÑÐ' => 'æ—ƒ', + 'ÑÑ' => 'æ—„', + 'ÑÒ' => 'æ—‚', + 'ÑÓ' => '晊', + 'ÑÔ' => '晟', + 'ÑÕ' => '晇', + 'ÑÖ' => '晑', + 'Ñ×' => '朒', + 'ÑØ' => '朓', + 'ÑÙ' => 'æ Ÿ', + 'ÑÚ' => 'æ š', + 'ÑÛ' => '桉', + 'ÑÜ' => 'æ ²', + 'ÑÝ' => 'æ ³', + 'ÑÞ' => 'æ »', + 'Ñß' => 'æ¡‹', + 'Ñà' => 'æ¡', + 'Ñá' => 'æ –', + 'Ñâ' => 'æ ±', + 'Ñã' => 'æ œ', + 'Ñä' => 'æ µ', + 'Ñå' => 'æ «', + 'Ñæ' => 'æ ­', + 'Ñç' => 'æ ¯', + 'Ñè' => '桎', + 'Ñé' => 'æ¡„', + 'Ñê' => 'æ ´', + 'Ñë' => 'æ ', + 'Ñì' => 'æ ’', + 'Ñí' => 'æ ”', + 'Ñî' => 'æ ¦', + 'Ñï' => 'æ ¨', + 'Ñð' => 'æ ®', + 'Ññ' => 'æ¡', + 'Ñò' => 'æ º', + 'Ñó' => 'æ ¥', + 'Ñô' => 'æ  ', + 'Ñõ' => '欬', + 'Ñö' => '欯', + 'Ñ÷' => '欭', + 'Ñø' => '欱', + 'Ñù' => '欴', + 'Ñú' => 'æ­­', + 'Ñû' => 'è‚‚', + 'Ñü' => '殈', + 'Ñý' => '毦', + 'Ñþ' => '毤', + 'Ò@' => '毨', + 'ÒA' => '毣', + 'ÒB' => '毢', + 'ÒC' => '毧', + 'ÒD' => 'æ°¥', + 'ÒE' => '浺', + 'ÒF' => 'æµ£', + 'ÒG' => '浤', + 'ÒH' => 'æµ¶', + 'ÒI' => 'æ´', + 'ÒJ' => '浡', + 'ÒK' => 'æ¶’', + 'ÒL' => '浘', + 'ÒM' => 'æµ¢', + 'ÒN' => 'æµ­', + 'ÒO' => '浯', + 'ÒP' => 'æ¶‘', + 'ÒQ' => 'æ¶', + 'ÒR' => 'æ·¯', + 'ÒS' => '浿', + 'ÒT' => '涆', + 'ÒU' => '浞', + 'ÒV' => 'æµ§', + 'ÒW' => 'æµ ', + 'ÒX' => 'æ¶—', + 'ÒY' => 'æµ°', + 'ÒZ' => 'æµ¼', + 'Ò[' => '浟', + 'Ò\\' => 'æ¶‚', + 'Ò]' => '涘', + 'Ò^' => 'æ´¯', + 'Ò_' => '浨', + 'Ò`' => 'æ¶‹', + 'Òa' => 'æµ¾', + 'Òb' => 'æ¶€', + 'Òc' => 'æ¶„', + 'Òd' => 'æ´–', + 'Òe' => '涃', + 'Òf' => 'æµ»', + 'Òg' => 'æµ½', + 'Òh' => 'æµµ', + 'Òi' => 'æ¶', + 'Òj' => '烜', + 'Òk' => '烓', + 'Òl' => '烑', + 'Òm' => 'çƒ', + 'Òn' => '烋', + 'Òo' => 'ç¼¹', + 'Òp' => '烢', + 'Òq' => '烗', + 'Òr' => '烒', + 'Òs' => '烞', + 'Òt' => '烠', + 'Òu' => '烔', + 'Òv' => 'çƒ', + 'Òw' => '烅', + 'Òx' => '烆', + 'Òy' => '烇', + 'Òz' => '烚', + 'Ò{' => '烎', + 'Ò|' => '烡', + 'Ò}' => '牂', + 'Ò~' => '牸', + 'Ò¡' => '牷', + 'Ò¢' => '牶', + 'Ò£' => '猀', + 'Ò¤' => '狺', + 'Ò¥' => 'ç‹´', + 'Ò¦' => '狾', + 'Ò§' => 'ç‹¶', + 'Ò¨' => '狳', + 'Ò©' => 'ç‹»', + 'Òª' => 'çŒ', + 'Ò«' => 'ç“', + 'Ò¬' => 'ç™', + 'Ò­' => 'ç¥', + 'Ò®' => 'ç–', + 'Ò¯' => '玼', + 'Ò°' => 'ç§', + 'Ò±' => 'ç£', + 'Ò²' => 'ç©', + 'Ò³' => 'çœ', + 'Ò´' => 'ç’', + 'Òµ' => 'ç›', + 'Ò¶' => 'ç”', + 'Ò·' => 'ç', + 'Ò¸' => 'çš', + 'Ò¹' => 'ç—', + 'Òº' => 'ç˜', + 'Ò»' => 'ç¨', + 'Ò¼' => '瓞', + 'Ò½' => '瓟', + 'Ò¾' => 'ç“´', + 'Ò¿' => '瓵', + 'ÒÀ' => '甡', + 'ÒÁ' => 'ç•›', + 'ÒÂ' => '畟', + 'ÒÃ' => 'ç–°', + 'ÒÄ' => 'ç—', + 'ÒÅ' => 'ç–»', + 'ÒÆ' => 'ç—„', + 'ÒÇ' => 'ç—€', + 'ÒÈ' => 'ç–¿', + 'ÒÉ' => 'ç–¶', + 'ÒÊ' => 'ç–º', + 'ÒË' => '皊', + 'ÒÌ' => '盉', + 'ÒÍ' => 'çœ', + 'ÒÎ' => '眛', + 'ÒÏ' => 'çœ', + 'ÒÐ' => '眓', + 'ÒÑ' => '眒', + 'ÒÒ' => '眣', + 'ÒÓ' => '眑', + 'ÒÔ' => '眕', + 'ÒÕ' => '眙', + 'ÒÖ' => '眚', + 'Ò×' => '眢', + 'ÒØ' => '眧', + 'ÒÙ' => 'ç £', + 'ÒÚ' => 'ç ¬', + 'ÒÛ' => 'ç ¢', + 'ÒÜ' => 'ç µ', + 'ÒÝ' => 'ç ¯', + 'ÒÞ' => 'ç ¨', + 'Òß' => 'ç ®', + 'Òà' => 'ç «', + 'Òá' => 'ç ¡', + 'Òâ' => 'ç ©', + 'Òã' => 'ç ³', + 'Òä' => 'ç ª', + 'Òå' => 'ç ±', + 'Òæ' => '祔', + 'Òç' => '祛', + 'Òè' => 'ç¥', + 'Òé' => '祜', + 'Òê' => '祓', + 'Òë' => '祒', + 'Òì' => '祑', + 'Òí' => 'ç§«', + 'Òî' => '秬', + 'Òï' => 'ç§ ', + 'Òð' => 'ç§®', + 'Òñ' => 'ç§­', + 'Òò' => '秪', + 'Òó' => 'ç§œ', + 'Òô' => 'ç§ž', + 'Òõ' => 'ç§', + 'Òö' => '窆', + 'Ò÷' => '窉', + 'Òø' => '窅', + 'Òù' => '窋', + 'Òú' => '窌', + 'Òû' => '窊', + 'Òü' => '窇', + 'Òý' => '竘', + 'Òþ' => 'ç¬', + 'Ó@' => '笄', + 'ÓA' => '笓', + 'ÓB' => '笅', + 'ÓC' => 'ç¬', + 'ÓD' => '笈', + 'ÓE' => '笊', + 'ÓF' => '笎', + 'ÓG' => '笉', + 'ÓH' => '笒', + 'ÓI' => '粄', + 'ÓJ' => '粑', + 'ÓK' => '粊', + 'ÓL' => '粌', + 'ÓM' => '粈', + 'ÓN' => 'ç²', + 'ÓO' => 'ç²…', + 'ÓP' => 'ç´ž', + 'ÓQ' => 'ç´', + 'ÓR' => 'ç´‘', + 'ÓS' => 'ç´Ž', + 'ÓT' => 'ç´˜', + 'ÓU' => 'ç´–', + 'ÓV' => 'ç´“', + 'ÓW' => 'ç´Ÿ', + 'ÓX' => 'ç´’', + 'ÓY' => 'ç´', + 'ÓZ' => 'ç´Œ', + 'Ó[' => '罜', + 'Ó\\' => '罡', + 'Ó]' => '罞', + 'Ó^' => 'ç½ ', + 'Ó_' => 'ç½', + 'Ó`' => 'ç½›', + 'Óa' => 'ç¾–', + 'Ób' => 'ç¾’', + 'Óc' => '翃', + 'Ód' => 'ç¿‚', + 'Óe' => 'ç¿€', + 'Óf' => '耖', + 'Óg' => '耾', + 'Óh' => '耹', + 'Ói' => '胺', + 'Ój' => '胲', + 'Ók' => '胹', + 'Ól' => '胵', + 'Óm' => 'è„', + 'Ón' => '胻', + 'Óo' => 'è„€', + 'Óp' => 'èˆ', + 'Óq' => '舯', + 'Ór' => '舥', + 'Ós' => '茳', + 'Ót' => '茭', + 'Óu' => 'è„', + 'Óv' => '茙', + 'Ów' => 'è‘', + 'Óx' => '茥', + 'Óy' => 'è–', + 'Óz' => '茿', + 'Ó{' => 'è', + 'Ó|' => '茦', + 'Ó}' => '茜', + 'Ó~' => '茢', + 'Ó¡' => 'è‚', + 'Ó¢' => 'èŽ', + 'Ó£' => '茛', + 'Ó¤' => '茪', + 'Ó¥' => '茈', + 'Ó¦' => '茼', + 'Ó§' => 'è', + 'Ó¨' => '茖', + 'Ó©' => '茤', + 'Óª' => '茠', + 'Ó«' => '茷', + 'Ó¬' => '茯', + 'Ó­' => '茩', + 'Ó®' => 'è‡', + 'Ó¯' => 'è…', + 'Ó°' => 'èŒ', + 'Ó±' => 'è“', + 'Ó²' => '茞', + 'Ó³' => '茬', + 'Ó´' => 'è‹', + 'Óµ' => '茧', + 'Ó¶' => 'èˆ', + 'Ó·' => '虓', + 'Ó¸' => 'è™’', + 'Ó¹' => '蚢', + 'Óº' => '蚨', + 'Ó»' => 'èš–', + 'Ó¼' => 'èš', + 'Ó½' => 'èš‘', + 'Ó¾' => 'èšž', + 'Ó¿' => '蚇', + 'ÓÀ' => 'èš—', + 'ÓÁ' => '蚆', + 'ÓÂ' => 'èš‹', + 'ÓÃ' => 'èšš', + 'ÓÄ' => 'èš…', + 'ÓÅ' => '蚥', + 'ÓÆ' => 'èš™', + 'ÓÇ' => 'èš¡', + 'ÓÈ' => 'èš§', + 'ÓÉ' => 'èš•', + 'ÓÊ' => '蚘', + 'ÓË' => '蚎', + 'ÓÌ' => 'èš', + 'ÓÍ' => 'èš', + 'ÓÎ' => 'èš”', + 'ÓÏ' => '衃', + 'ÓÐ' => 'è¡„', + 'ÓÑ' => 'è¡­', + 'ÓÒ' => '衵', + 'ÓÓ' => 'è¡¶', + 'ÓÔ' => '衲', + 'ÓÕ' => '袀', + 'ÓÖ' => '衱', + 'Ó×' => 'è¡¿', + 'ÓØ' => '衯', + 'ÓÙ' => '袃', + 'ÓÚ' => '衾', + 'ÓÛ' => 'è¡´', + 'ÓÜ' => '衼', + 'ÓÝ' => '訒', + 'ÓÞ' => '豇', + 'Óß' => 'è±—', + 'Óà' => 'è±»', + 'Óá' => '貤', + 'Óâ' => 'è²£', + 'Óã' => 'èµ¶', + 'Óä' => '赸', + 'Óå' => 'è¶µ', + 'Óæ' => 'è¶·', + 'Óç' => 'è¶¶', + 'Óè' => '軑', + 'Óé' => '軓', + 'Óê' => '迾', + 'Óë' => '迵', + 'Óì' => '适', + 'Óí' => 'è¿¿', + 'Óî' => 'è¿»', + 'Óï' => '逄', + 'Óð' => '迼', + 'Óñ' => 'è¿¶', + 'Óò' => '郖', + 'Óó' => '郠', + 'Óô' => '郙', + 'Óõ' => '郚', + 'Óö' => '郣', + 'Ó÷' => '郟', + 'Óø' => '郥', + 'Óù' => '郘', + 'Óú' => '郛', + 'Óû' => '郗', + 'Óü' => '郜', + 'Óý' => '郤', + 'Óþ' => 'é…', + 'Ô@' => 'é…Ž', + 'ÔA' => 'é…', + 'ÔB' => '釕', + 'ÔC' => '釢', + 'ÔD' => '釚', + 'ÔE' => '陜', + 'ÔF' => '陟', + 'ÔG' => 'éš¼', + 'ÔH' => '飣', + 'ÔI' => '髟', + 'ÔJ' => '鬯', + 'ÔK' => '乿', + 'ÔL' => 'å°', + 'ÔM' => 'åª', + 'ÔN' => 'å¡', + 'ÔO' => 'åž', + 'ÔP' => 'å ', + 'ÔQ' => 'å“', + 'ÔR' => 'å‹', + 'ÔS' => 'å', + 'ÔT' => 'å²', + 'ÔU' => 'åˆ', + 'ÔV' => 'å', + 'ÔW' => 'å', + 'ÔX' => 'å›', + 'ÔY' => 'åŠ', + 'ÔZ' => 'å¢', + 'Ô[' => '倕', + 'Ô\\' => 'å…', + 'Ô]' => 'åŸ', + 'Ô^' => 'å©', + 'Ô_' => 'å«', + 'Ô`' => 'å£', + 'Ôa' => 'å¤', + 'Ôb' => 'å†', + 'Ôc' => 'å€', + 'Ôd' => 'å®', + 'Ôe' => 'å³', + 'Ôf' => 'å—', + 'Ôg' => 'å‘', + 'Ôh' => 'å‡', + 'Ôi' => '剫', + 'Ôj' => '剭', + 'Ôk' => '剬', + 'Ôl' => '剮', + 'Ôm' => 'å‹–', + 'Ôn' => 'å‹“', + 'Ôo' => '匭', + 'Ôp' => '厜', + 'Ôq' => '啵', + 'Ôr' => 'å•¶', + 'Ôs' => '唼', + 'Ôt' => 'å•', + 'Ôu' => 'å•', + 'Ôv' => 'å”´', + 'Ôw' => '唪', + 'Ôx' => 'å•‘', + 'Ôy' => 'å•¢', + 'Ôz' => 'å”¶', + 'Ô{' => '唵', + 'Ô|' => 'å”°', + 'Ô}' => 'å•’', + 'Ô~' => 'å•…', + 'Ô¡' => '唌', + 'Ô¢' => '唲', + 'Ô£' => 'å•¥', + 'Ô¤' => '啎', + 'Ô¥' => '唹', + 'Ô¦' => '啈', + 'Ô§' => 'å”­', + 'Ô¨' => 'å”»', + 'Ô©' => 'å•€', + 'Ôª' => 'å•‹', + 'Ô«' => '圊', + 'Ô¬' => '圇', + 'Ô­' => '埻', + 'Ô®' => 'å ”', + 'Ô¯' => '埢', + 'Ô°' => '埶', + 'Ô±' => '埜', + 'Ô²' => '埴', + 'Ô³' => 'å €', + 'Ô´' => '埭', + 'Ôµ' => '埽', + 'Ô¶' => 'å ˆ', + 'Ô·' => '埸', + 'Ô¸' => 'å ‹', + 'Ô¹' => '埳', + 'Ôº' => 'åŸ', + 'Ô»' => 'å ‡', + 'Ô¼' => '埮', + 'Ô½' => '埣', + 'Ô¾' => '埲', + 'Ô¿' => '埥', + 'ÔÀ' => '埬', + 'ÔÁ' => '埡', + 'ÔÂ' => 'å Ž', + 'ÔÃ' => '埼', + 'ÔÄ' => 'å ', + 'ÔÅ' => '埧', + 'ÔÆ' => 'å ', + 'ÔÇ' => 'å Œ', + 'ÔÈ' => '埱', + 'ÔÉ' => '埩', + 'ÔÊ' => '埰', + 'ÔË' => 'å ', + 'ÔÌ' => 'å „', + 'ÔÍ' => '奜', + 'ÔÎ' => 'å© ', + 'ÔÏ' => '婘', + 'ÔÐ' => 'å©•', + 'ÔÑ' => 'å©§', + 'ÔÒ' => '婞', + 'ÔÓ' => '娸', + 'ÔÔ' => '娵', + 'ÔÕ' => 'å©­', + 'ÔÖ' => 'å©', + 'Ô×' => '婟', + 'ÔØ' => 'å©¥', + 'ÔÙ' => '婬', + 'ÔÚ' => 'å©“', + 'ÔÛ' => '婤', + 'ÔÜ' => 'å©—', + 'ÔÝ' => '婃', + 'ÔÞ' => 'å©', + 'Ôß' => 'å©’', + 'Ôà' => 'å©„', + 'Ôá' => 'å©›', + 'Ôâ' => '婈', + 'Ôã' => '媎', + 'Ôä' => '娾', + 'Ôå' => 'å©', + 'Ôæ' => '娹', + 'Ôç' => '婌', + 'Ôè' => 'å©°', + 'Ôé' => 'å©©', + 'Ôê' => '婇', + 'Ôë' => 'å©‘', + 'Ôì' => 'å©–', + 'Ôí' => 'å©‚', + 'Ôî' => '婜', + 'Ôï' => 'å­²', + 'Ôð' => 'å­®', + 'Ôñ' => 'å¯', + 'Ôò' => '寀', + 'Ôó' => 'å±™', + 'Ôô' => 'å´ž', + 'Ôõ' => 'å´‹', + 'Ôö' => 'å´', + 'Ô÷' => 'å´š', + 'Ôø' => 'å´ ', + 'Ôù' => 'å´Œ', + 'Ôú' => 'å´¨', + 'Ôû' => 'å´', + 'Ôü' => 'å´¦', + 'Ôý' => 'å´¥', + 'Ôþ' => 'å´', + 'Õ@' => 'å´°', + 'ÕA' => 'å´’', + 'ÕB' => 'å´£', + 'ÕC' => 'å´Ÿ', + 'ÕD' => 'å´®', + 'ÕE' => '帾', + 'ÕF' => '帴', + 'ÕG' => '庱', + 'ÕH' => '庴', + 'ÕI' => '庹', + 'ÕJ' => '庲', + 'ÕK' => '庳', + 'ÕL' => 'å¼¶', + 'ÕM' => '弸', + 'ÕN' => 'å¾›', + 'ÕO' => 'å¾–', + 'ÕP' => '徟', + 'ÕQ' => '悊', + 'ÕR' => 'æ‚', + 'ÕS' => '悆', + 'ÕT' => '悾', + 'ÕU' => 'æ‚°', + 'ÕV' => '悺', + 'ÕW' => '惓', + 'ÕX' => '惔', + 'ÕY' => 'æƒ', + 'ÕZ' => '惤', + 'Õ[' => '惙', + 'Õ\\' => 'æƒ', + 'Õ]' => '惈', + 'Õ^' => '悱', + 'Õ_' => '惛', + 'Õ`' => 'æ‚·', + 'Õa' => '惊', + 'Õb' => 'æ‚¿', + 'Õc' => '惃', + 'Õd' => 'æƒ', + 'Õe' => '惀', + 'Õf' => '挲', + 'Õg' => 'æ¥', + 'Õh' => '掊', + 'Õi' => '掂', + 'Õj' => 'æ½', + 'Õk' => '掽', + 'Õl' => '掞', + 'Õm' => '掭', + 'Õn' => 'æŽ', + 'Õo' => '掗', + 'Õp' => '掫', + 'Õq' => '掎', + 'Õr' => 'æ¯', + 'Õs' => '掇', + 'Õt' => 'æŽ', + 'Õu' => 'æ®', + 'Õv' => '掯', + 'Õw' => 'æµ', + 'Õx' => '掜', + 'Õy' => 'æ­', + 'Õz' => '掮', + 'Õ{' => 'æ¼', + 'Õ|' => '掤', + 'Õ}' => '挻', + 'Õ~' => '掟', + 'Õ¡' => 'æ¸', + 'Õ¢' => '掅', + 'Õ£' => 'æŽ', + 'Õ¤' => '掑', + 'Õ¥' => 'æŽ', + 'Õ¦' => 'æ°', + 'Õ§' => 'æ•“', + 'Õ¨' => 'æ—', + 'Õ©' => '晥', + 'Õª' => '晡', + 'Õ«' => 'æ™›', + 'Õ¬' => 'æ™™', + 'Õ­' => '晜', + 'Õ®' => '晢', + 'Õ¯' => '朘', + 'Õ°' => '桹', + 'Õ±' => '梇', + 'Õ²' => 'æ¢', + 'Õ³' => '梜', + 'Õ´' => 'æ¡­', + 'Õµ' => 'æ¡®', + 'Õ¶' => '梮', + 'Õ·' => '梫', + 'Õ¸' => '楖', + 'Õ¹' => '桯', + 'Õº' => '梣', + 'Õ»' => '梬', + 'Õ¼' => '梩', + 'Õ½' => '桵', + 'Õ¾' => 'æ¡´', + 'Õ¿' => '梲', + 'ÕÀ' => 'æ¢', + 'ÕÁ' => 'æ¡·', + 'ÕÂ' => '梒', + 'ÕÃ' => '桼', + 'ÕÄ' => 'æ¡«', + 'ÕÅ' => '桲', + 'ÕÆ' => '梪', + 'ÕÇ' => '梀', + 'ÕÈ' => '桱', + 'ÕÉ' => '桾', + 'ÕÊ' => '梛', + 'ÕË' => '梖', + 'ÕÌ' => '梋', + 'ÕÍ' => '梠', + 'ÕÎ' => '梉', + 'ÕÏ' => '梤', + 'ÕÐ' => '桸', + 'ÕÑ' => 'æ¡»', + 'ÕÒ' => '梑', + 'ÕÓ' => '梌', + 'ÕÔ' => '梊', + 'ÕÕ' => '桽', + 'ÕÖ' => '欶', + 'Õ×' => '欳', + 'ÕØ' => '欷', + 'ÕÙ' => '欸', + 'ÕÚ' => '殑', + 'ÕÛ' => 'æ®', + 'ÕÜ' => 'æ®', + 'ÕÝ' => '殎', + 'ÕÞ' => '殌', + 'Õß' => 'æ°ª', + 'Õà' => 'æ·€', + 'Õá' => 'æ¶«', + 'Õâ' => 'æ¶´', + 'Õã' => 'æ¶³', + 'Õä' => 'æ¹´', + 'Õå' => '涬', + 'Õæ' => 'æ·©', + 'Õç' => 'æ·¢', + 'Õè' => 'æ¶·', + 'Õé' => 'æ·¶', + 'Õê' => 'æ·”', + 'Õë' => '渀', + 'Õì' => 'æ·ˆ', + 'Õí' => 'æ· ', + 'Õî' => 'æ·Ÿ', + 'Õï' => 'æ·–', + 'Õð' => 'æ¶¾', + 'Õñ' => 'æ·¥', + 'Õò' => 'æ·œ', + 'Õó' => 'æ·', + 'Õô' => 'æ·›', + 'Õõ' => 'æ·´', + 'Õö' => 'æ·Š', + 'Õ÷' => 'æ¶½', + 'Õø' => 'æ·­', + 'Õù' => 'æ·°', + 'Õú' => '涺', + 'Õû' => 'æ·•', + 'Õü' => 'æ·‚', + 'Õý' => 'æ·', + 'Õþ' => 'æ·‰', + 'Ö@' => 'æ·', + 'ÖA' => 'æ·²', + 'ÖB' => 'æ·“', + 'ÖC' => 'æ·½', + 'ÖD' => 'æ·—', + 'ÖE' => 'æ·', + 'ÖF' => 'æ·£', + 'ÖG' => 'æ¶»', + 'ÖH' => '烺', + 'ÖI' => 'ç„', + 'ÖJ' => '烷', + 'ÖK' => 'ç„—', + 'ÖL' => '烴', + 'ÖM' => '焌', + 'ÖN' => '烰', + 'ÖO' => 'ç„„', + 'ÖP' => '烳', + 'ÖQ' => 'ç„', + 'ÖR' => '烼', + 'ÖS' => '烿', + 'ÖT' => '焆', + 'ÖU' => 'ç„“', + 'ÖV' => 'ç„€', + 'ÖW' => '烸', + 'ÖX' => '烶', + 'ÖY' => 'ç„‹', + 'ÖZ' => 'ç„‚', + 'Ö[' => '焎', + 'Ö\\' => '牾', + 'Ö]' => '牻', + 'Ö^' => '牼', + 'Ö_' => '牿', + 'Ö`' => 'çŒ', + 'Öa' => '猗', + 'Öb' => '猇', + 'Öc' => '猑', + 'Öd' => '猘', + 'Öe' => '猊', + 'Öf' => '猈', + 'Ög' => 'ç‹¿', + 'Öh' => 'çŒ', + 'Öi' => '猞', + 'Öj' => '玈', + 'Ök' => 'ç¶', + 'Öl' => 'ç¸', + 'Öm' => 'çµ', + 'Ön' => 'ç„', + 'Öo' => 'ç', + 'Öp' => 'ç½', + 'Öq' => 'ç‡', + 'Ör' => 'ç€', + 'Ös' => 'çº', + 'Öt' => 'ç¼', + 'Öu' => 'ç¿', + 'Öv' => 'çŒ', + 'Öw' => 'ç‹', + 'Öx' => 'ç´', + 'Öy' => 'çˆ', + 'Öz' => '畤', + 'Ö{' => 'ç•£', + 'Ö|' => 'ç—Ž', + 'Ö}' => 'ç—’', + 'Ö~' => 'ç—', + 'Ö¡' => 'ç—‹', + 'Ö¢' => 'ç—Œ', + 'Ö£' => 'ç—‘', + 'Ö¤' => 'ç—', + 'Ö¥' => 'çš', + 'Ö¦' => '皉', + 'Ö§' => '盓', + 'Ö¨' => '眹', + 'Ö©' => '眯', + 'Öª' => '眭', + 'Ö«' => '眱', + 'Ö¬' => '眲', + 'Ö­' => '眴', + 'Ö®' => '眳', + 'Ö¯' => '眽', + 'Ö°' => '眥', + 'Ö±' => '眻', + 'Ö²' => '眵', + 'Ö³' => '硈', + 'Ö´' => 'ç¡’', + 'Öµ' => '硉', + 'Ö¶' => 'ç¡', + 'Ö·' => '硊', + 'Ö¸' => '硌', + 'Ö¹' => 'ç ¦', + 'Öº' => 'ç¡…', + 'Ö»' => 'ç¡', + 'Ö¼' => '祤', + 'Ö½' => '祧', + 'Ö¾' => '祩', + 'Ö¿' => '祪', + 'ÖÀ' => '祣', + 'ÖÁ' => '祫', + 'ÖÂ' => '祡', + 'ÖÃ' => '离', + 'ÖÄ' => '秺', + 'ÖÅ' => '秸', + 'ÖÆ' => 'ç§¶', + 'ÖÇ' => 'ç§·', + 'ÖÈ' => 'çª', + 'ÖÉ' => '窔', + 'ÖÊ' => 'çª', + 'ÖË' => '笵', + 'ÖÌ' => 'ç­‡', + 'ÖÍ' => '笴', + 'ÖÎ' => '笥', + 'ÖÏ' => '笰', + 'ÖÐ' => '笢', + 'ÖÑ' => '笤', + 'ÖÒ' => '笳', + 'ÖÓ' => '笘', + 'ÖÔ' => '笪', + 'ÖÕ' => 'ç¬', + 'ÖÖ' => '笱', + 'Ö×' => '笫', + 'ÖØ' => '笭', + 'ÖÙ' => '笯', + 'ÖÚ' => '笲', + 'ÖÛ' => '笸', + 'ÖÜ' => '笚', + 'ÖÝ' => '笣', + 'ÖÞ' => 'ç²”', + 'Öß' => '粘', + 'Öà' => 'ç²–', + 'Öá' => 'ç²£', + 'Öâ' => 'ç´µ', + 'Öã' => 'ç´½', + 'Öä' => 'ç´¸', + 'Öå' => 'ç´¶', + 'Öæ' => 'ç´º', + 'Öç' => 'çµ…', + 'Öè' => 'ç´¬', + 'Öé' => 'ç´©', + 'Öê' => 'çµ', + 'Öë' => '絇', + 'Öì' => 'ç´¾', + 'Öí' => 'ç´¿', + 'Öî' => '絊', + 'Öï' => 'ç´»', + 'Öð' => 'ç´¨', + 'Öñ' => 'ç½£', + 'Öò' => '羕', + 'Öó' => '羜', + 'Öô' => 'ç¾', + 'Öõ' => 'ç¾›', + 'Öö' => '翊', + 'Ö÷' => 'ç¿‹', + 'Öø' => 'ç¿', + 'Öù' => 'ç¿', + 'Öú' => 'ç¿‘', + 'Öû' => '翇', + 'Öü' => 'ç¿', + 'Öý' => '翉', + 'Öþ' => '耟', + '×@' => '耞', + '×A' => '耛', + '×B' => 'è‡', + '×C' => 'èƒ', + '×D' => 'èˆ', + '×E' => '脘', + '×F' => 'è„¥', + '×G' => 'è„™', + '×H' => 'è„›', + '×I' => 'è„­', + '×J' => '脟', + '×K' => '脬', + '×L' => '脞', + '×M' => 'è„¡', + '×N' => 'è„•', + '×O' => 'è„§', + '×P' => 'è„', + '×Q' => 'è„¢', + '×R' => '舑', + '×S' => '舸', + '×T' => '舳', + '×U' => '舺', + '×V' => '舴', + '×W' => '舲', + '×X' => '艴', + '×Y' => 'èŽ', + '×Z' => '莣', + '×[' => '莨', + '×\\' => 'èŽ', + '×]' => 'èº', + '×^' => 'è³', + '×_' => '莤', + '×`' => 'è´', + '×a' => 'èŽ', + '×b' => 'èŽ', + '×c' => '莕', + '×d' => '莙', + '×e' => 'èµ', + '×f' => '莔', + '×g' => '莩', + '×h' => 'è½', + '×i' => '莃', + '×j' => '莌', + '×k' => 'èŽ', + '×l' => '莛', + '×m' => '莪', + '×n' => '莋', + '×o' => 'è¾', + '×p' => '莥', + '×q' => '莯', + '×r' => '莈', + '×s' => '莗', + '×t' => '莰', + '×u' => 'è¿', + '×v' => '莦', + '×w' => '莇', + '×x' => '莮', + '×y' => 'è¶', + '×z' => '莚', + '×{' => 'è™™', + '×|' => 'è™–', + '×}' => 'èš¿', + '×~' => 'èš·', + 'ס' => '蛂', + '×¢' => 'è›', + '×£' => 'è›…', + 'פ' => '蚺', + '×¥' => 'èš°', + 'צ' => '蛈', + '×§' => 'èš¹', + 'ר' => 'èš³', + 'ש' => '蚸', + 'ת' => '蛌', + '׫' => 'èš´', + '׬' => 'èš»', + '×­' => 'èš¼', + '×®' => '蛃', + 'ׯ' => 'èš½', + '×°' => 'èš¾', + '×±' => 'è¡’', + 'ײ' => '袉', + '׳' => '袕', + '×´' => '袨', + '×µ' => '袢', + '×¶' => '袪', + '×·' => '袚', + '׸' => '袑', + '×¹' => '袡', + '׺' => '袟', + '×»' => '袘', + '×¼' => '袧', + '×½' => '袙', + '×¾' => '袛', + '׿' => '袗', + '×À' => '袤', + '×Á' => '袬', + '×Â' => '袌', + '×Ã' => '袓', + '×Ä' => '袎', + '×Å' => '覂', + 'ׯ' => 'è§–', + '×Ç' => 'è§™', + '×È' => 'è§•', + '×É' => '訰', + '×Ê' => '訧', + '×Ë' => '訬', + '×Ì' => '訞', + '×Í' => 'è°¹', + '×Î' => 'è°»', + '×Ï' => '豜', + '×Ð' => 'è±', + '×Ñ' => 'è±½', + '×Ò' => 'è²¥', + '×Ó' => 'èµ½', + '×Ô' => 'èµ»', + '×Õ' => 'èµ¹', + '×Ö' => 'è¶¼', + '××' => 'è·‚', + 'ר' => 'è¶¹', + '×Ù' => 'è¶¿', + '×Ú' => 'è·', + '×Û' => '軘', + '×Ü' => '軞', + '×Ý' => 'è»', + '×Þ' => '軜', + '×ß' => 'è»—', + '×à' => 'è» ', + '×á' => '軡', + '×â' => '逤', + '×ã' => '逋', + '×ä' => '逑', + '×å' => '逜', + '׿' => '逌', + '×ç' => '逡', + '×è' => '郯', + '×é' => '郪', + '×ê' => '郰', + '×ë' => '郴', + '×ì' => '郲', + '×í' => '郳', + '×î' => '郔', + '×ï' => '郫', + '×ð' => '郬', + '×ñ' => '郩', + '×ò' => 'é…–', + '×ó' => 'é…˜', + '×ô' => 'é…š', + '×õ' => 'é…“', + '×ö' => 'é…•', + '×÷' => '釬', + '×ø' => '釴', + '×ù' => '釱', + '×ú' => '釳', + '×û' => '釸', + '×ü' => '釤', + '×ý' => '釹', + '×þ' => '釪', + 'Ø@' => '釫', + 'ØA' => '釷', + 'ØB' => '釨', + 'ØC' => '釮', + 'ØD' => '镺', + 'ØE' => 'é–†', + 'ØF' => 'é–ˆ', + 'ØG' => '陼', + 'ØH' => 'é™­', + 'ØI' => '陫', + 'ØJ' => 'é™±', + 'ØK' => '陯', + 'ØL' => 'éš¿', + 'ØM' => 'éª', + 'ØN' => 'é „', + 'ØO' => '飥', + 'ØP' => '馗', + 'ØQ' => 'å‚›', + 'ØR' => 'å‚•', + 'ØS' => 'å‚”', + 'ØT' => '傞', + 'ØU' => 'å‚‹', + 'ØV' => 'å‚£', + 'ØW' => '傃', + 'ØX' => '傌', + 'ØY' => '傎', + 'ØZ' => 'å‚', + 'Ø[' => 'å¨', + 'Ø\\' => '傜', + 'Ø]' => 'å‚’', + 'Ø^' => 'å‚‚', + 'Ø_' => '傇', + 'Ø`' => 'å…Ÿ', + 'Øa' => '凔', + 'Øb' => '匒', + 'Øc' => '匑', + 'Ød' => '厤', + 'Øe' => '厧', + 'Øf' => 'å–‘', + 'Øg' => 'å–¨', + 'Øh' => 'å–¥', + 'Øi' => 'å–­', + 'Øj' => 'å•·', + 'Øk' => 'å™…', + 'Øl' => 'å–¢', + 'Øm' => 'å–“', + 'Øn' => 'å–ˆ', + 'Øo' => 'å–', + 'Øp' => 'å–µ', + 'Øq' => 'å–', + 'Ør' => 'å–£', + 'Øs' => 'å–’', + 'Øt' => 'å–¤', + 'Øu' => '啽', + 'Øv' => 'å–Œ', + 'Øw' => 'å–¦', + 'Øx' => 'å•¿', + 'Øy' => 'å–•', + 'Øz' => 'å–¡', + 'Ø{' => 'å–Ž', + 'Ø|' => '圌', + 'Ø}' => 'å ©', + 'Ø~' => 'å ·', + 'Ø¡' => 'å ™', + 'Ø¢' => 'å ž', + 'Ø£' => 'å §', + 'ؤ' => 'å £', + 'Ø¥' => 'å ¨', + 'ئ' => '埵', + 'ا' => '塈', + 'ب' => 'å ¥', + 'Ø©' => 'å œ', + 'ت' => 'å ›', + 'Ø«' => 'å ³', + 'ج' => 'å ¿', + 'Ø­' => 'å ¶', + 'Ø®' => 'å ®', + 'د' => 'å ¹', + 'ذ' => 'å ¸', + 'ر' => 'å ­', + 'ز' => 'å ¬', + 'س' => 'å »', + 'Ø´' => '奡', + 'ص' => '媯', + 'ض' => '媔', + 'Ø·' => '媟', + 'ظ' => '婺', + 'ع' => '媢', + 'غ' => '媞', + 'Ø»' => '婸', + 'ؼ' => '媦', + 'ؽ' => '婼', + 'ؾ' => '媥', + 'Ø¿' => '媬', + 'ØÀ' => '媕', + 'ØÁ' => '媮', + 'ØÂ' => '娷', + 'ØÃ' => '媄', + 'ØÄ' => '媊', + 'ØÅ' => '媗', + 'ØÆ' => '媃', + 'ØÇ' => '媋', + 'ØÈ' => '媩', + 'ØÉ' => 'å©»', + 'ØÊ' => '婽', + 'ØË' => '媌', + 'ØÌ' => '媜', + 'ØÍ' => 'åª', + 'ØÎ' => '媓', + 'ØÏ' => 'åª', + 'ØÐ' => '寪', + 'ØÑ' => 'å¯', + 'ØÒ' => '寋', + 'ØÓ' => '寔', + 'ØÔ' => '寑', + 'ØÕ' => '寊', + 'ØÖ' => '寎', + 'Ø×' => 'å°Œ', + 'ØØ' => 'å°°', + 'ØÙ' => 'å´·', + 'ØÚ' => '嵃', + 'ØÛ' => '嵫', + 'ØÜ' => 'åµ', + 'ØÝ' => '嵋', + 'ØÞ' => 'å´¿', + 'Øß' => 'å´µ', + 'Øà' => '嵑', + 'Øá' => '嵎', + 'Øâ' => '嵕', + 'Øã' => 'å´³', + 'Øä' => 'å´º', + 'Øå' => 'åµ’', + 'Øæ' => 'å´½', + 'Øç' => 'å´±', + 'Øè' => 'åµ™', + 'Øé' => '嵂', + 'Øê' => 'å´¹', + 'Øë' => '嵉', + 'Øì' => 'å´¸', + 'Øí' => 'å´¼', + 'Øî' => 'å´²', + 'Øï' => 'å´¶', + 'Øð' => 'åµ€', + 'Øñ' => 'åµ…', + 'Øò' => '幄', + 'Øó' => 'å¹', + 'Øô' => '彘', + 'Øõ' => '徦', + 'Øö' => 'å¾¥', + 'Ø÷' => '徫', + 'Øø' => '惉', + 'Øù' => '悹', + 'Øú' => '惌', + 'Øû' => '惢', + 'Øü' => '惎', + 'Øý' => '惄', + 'Øþ' => 'æ„”', + 'Ù@' => '惲', + 'ÙA' => '愊', + 'ÙB' => 'æ„–', + 'ÙC' => 'æ„…', + 'ÙD' => '惵', + 'ÙE' => 'æ„“', + 'ÙF' => '惸', + 'ÙG' => '惼', + 'ÙH' => '惾', + 'ÙI' => 'æƒ', + 'ÙJ' => '愃', + 'ÙK' => '愘', + 'ÙL' => 'æ„', + 'ÙM' => 'æ„', + 'ÙN' => '惿', + 'ÙO' => 'æ„„', + 'ÙP' => 'æ„‹', + 'ÙQ' => '扊', + 'ÙR' => '掔', + 'ÙS' => '掱', + 'ÙT' => '掰', + 'ÙU' => 'æŽ', + 'ÙV' => 'æ¥', + 'ÙW' => 'æ¨', + 'ÙX' => 'æ¯', + 'ÙY' => 'æƒ', + 'ÙZ' => 'æ’', + 'Ù[' => 'æ³', + 'Ù\\' => 'æŠ', + 'Ù]' => 'æ ', + 'Ù^' => 'æ¶', + 'Ù_' => 'æ•', + 'Ù`' => 'æ²', + 'Ùa' => 'æµ', + 'Ùb' => 'æ‘¡', + 'Ùc' => 'æŸ', + 'Ùd' => '掾', + 'Ùe' => 'æ', + 'Ùf' => 'æœ', + 'Ùg' => 'æ„', + 'Ùh' => 'æ˜', + 'Ùi' => 'æ“', + 'Ùj' => 'æ‚', + 'Ùk' => 'æ‡', + 'Ùl' => 'æŒ', + 'Ùm' => 'æ‹', + 'Ùn' => 'æˆ', + 'Ùo' => 'æ°', + 'Ùp' => 'æ—', + 'Ùq' => 'æ™', + 'Ùr' => '攲', + 'Ùs' => 'æ•§', + 'Ùt' => '敪', + 'Ùu' => '敤', + 'Ùv' => '敜', + 'Ùw' => '敨', + 'Ùx' => 'æ•¥', + 'Ùy' => 'æ–Œ', + 'Ùz' => 'æ–', + 'Ù{' => 'æ–ž', + 'Ù|' => 'æ–®', + 'Ù}' => 'æ—', + 'Ù~' => 'æ—’', + 'Ù¡' => '晼', + 'Ù¢' => '晬', + 'Ù£' => 'æ™»', + 'Ù¤' => '暀', + 'Ù¥' => 'æ™±', + 'Ù¦' => '晹', + 'Ù§' => '晪', + 'Ù¨' => '晲', + 'Ù©' => 'æœ', + 'Ùª' => '椌', + 'Ù«' => '棓', + 'Ù¬' => '椄', + 'Ù­' => '棜', + 'Ù®' => '椪', + 'Ù¯' => '棬', + 'Ù°' => '棪', + 'Ù±' => '棱', + 'Ù²' => 'æ¤', + 'Ù³' => '棖', + 'Ù´' => '棷', + 'Ùµ' => '棫', + 'Ù¶' => '棤', + 'Ù·' => '棶', + 'Ù¸' => '椓', + 'Ù¹' => 'æ¤', + 'Ùº' => '棳', + 'Ù»' => '棡', + 'Ù¼' => '椇', + 'Ù½' => '棌', + 'Ù¾' => '椈', + 'Ù¿' => '楰', + 'ÙÀ' => '梴', + 'ÙÁ' => '椑', + 'ÙÂ' => '棯', + 'ÙÃ' => '棆', + 'ÙÄ' => '椔', + 'ÙÅ' => '棸', + 'ÙÆ' => 'æ£', + 'ÙÇ' => '棽', + 'ÙÈ' => '棼', + 'ÙÉ' => '棨', + 'ÙÊ' => '椋', + 'ÙË' => '椊', + 'ÙÌ' => '椗', + 'ÙÍ' => '棎', + 'ÙÎ' => '棈', + 'ÙÏ' => 'æ£', + 'ÙÐ' => '棞', + 'ÙÑ' => '棦', + 'ÙÒ' => '棴', + 'ÙÓ' => '棑', + 'ÙÔ' => '椆', + 'ÙÕ' => '棔', + 'ÙÖ' => '棩', + 'Ù×' => '椕', + 'ÙØ' => '椥', + 'ÙÙ' => '棇', + 'ÙÚ' => '欹', + 'ÙÛ' => '欻', + 'ÙÜ' => '欿', + 'ÙÝ' => '欼', + 'ÙÞ' => 'æ®”', + 'Ùß' => 'æ®—', + 'Ùà' => 'æ®™', + 'Ùá' => '殕', + 'Ùâ' => '殽', + 'Ùã' => '毰', + 'Ùä' => '毲', + 'Ùå' => '毳', + 'Ùæ' => 'æ°°', + 'Ùç' => 'æ·¼', + 'Ùè' => '湆', + 'Ùé' => '湇', + 'Ùê' => '渟', + 'Ùë' => '湉', + 'Ùì' => '溈', + 'Ùí' => '渼', + 'Ùî' => '渽', + 'Ùï' => 'æ¹…', + 'Ùð' => 'æ¹¢', + 'Ùñ' => '渫', + 'Ùò' => '渿', + 'Ùó' => 'æ¹', + 'Ùô' => 'æ¹', + 'Ùõ' => 'æ¹³', + 'Ùö' => '渜', + 'Ù÷' => '渳', + 'Ùø' => '湋', + 'Ùù' => 'æ¹€', + 'Ùú' => '湑', + 'Ùû' => '渻', + 'Ùü' => '渃', + 'Ùý' => '渮', + 'Ùþ' => '湞', + 'Ú@' => '湨', + 'ÚA' => '湜', + 'ÚB' => '湡', + 'ÚC' => '渱', + 'ÚD' => '渨', + 'ÚE' => 'æ¹ ', + 'ÚF' => 'æ¹±', + 'ÚG' => '湫', + 'ÚH' => '渹', + 'ÚI' => '渢', + 'ÚJ' => '渰', + 'ÚK' => '湓', + 'ÚL' => 'æ¹¥', + 'ÚM' => '渧', + 'ÚN' => '湸', + 'ÚO' => '湤', + 'ÚP' => 'æ¹·', + 'ÚQ' => '湕', + 'ÚR' => 'æ¹¹', + 'ÚS' => 'æ¹’', + 'ÚT' => '湦', + 'ÚU' => '渵', + 'ÚV' => '渶', + 'ÚW' => '湚', + 'ÚX' => 'ç„ ', + 'ÚY' => '焞', + 'ÚZ' => '焯', + 'Ú[' => '烻', + 'Ú\\' => 'ç„®', + 'Ú]' => '焱', + 'Ú^' => 'ç„£', + 'Ú_' => 'ç„¥', + 'Ú`' => 'ç„¢', + 'Úa' => '焲', + 'Úb' => '焟', + 'Úc' => '焨', + 'Úd' => '焺', + 'Úe' => 'ç„›', + 'Úf' => '牋', + 'Úg' => '牚', + 'Úh' => '犈', + 'Úi' => '犉', + 'Új' => '犆', + 'Úk' => '犅', + 'Úl' => '犋', + 'Úm' => '猒', + 'Ún' => '猋', + 'Úo' => '猰', + 'Úp' => '猢', + 'Úq' => '猱', + 'Úr' => '猳', + 'Ús' => '猧', + 'Út' => '猲', + 'Úu' => '猭', + 'Úv' => '猦', + 'Úw' => '猣', + 'Úx' => '猵', + 'Úy' => '猌', + 'Úz' => 'ç®', + 'Ú{' => 'ç¬', + 'Ú|' => 'ç°', + 'Ú}' => 'ç«', + 'Ú~' => 'ç–', + 'Ú¡' => 'çš', + 'Ú¢' => 'ç¡', + 'Ú£' => 'ç­', + 'Ú¤' => 'ç±', + 'Ú¥' => 'ç¤', + 'Ú¦' => 'ç£', + 'Ú§' => 'ç', + 'Ú¨' => 'ç©', + 'Ú©' => 'ç ', + 'Úª' => 'ç²', + 'Ú«' => 'ç“»', + 'Ú¬' => '甯', + 'Ú­' => '畯', + 'Ú®' => '畬', + 'Ú¯' => 'ç—§', + 'Ú°' => 'ç—š', + 'Ú±' => 'ç—¡', + 'Ú²' => 'ç—¦', + 'Ú³' => 'ç—', + 'Ú´' => 'ç—Ÿ', + 'Úµ' => 'ç—¤', + 'Ú¶' => 'ç——', + 'Ú·' => 'çš•', + 'Ú¸' => 'çš’', + 'Ú¹' => '盚', + 'Úº' => 'ç†', + 'Ú»' => 'ç‡', + 'Ú¼' => 'ç„', + 'Ú½' => 'ç', + 'Ú¾' => 'ç…', + 'Ú¿' => 'çŠ', + 'ÚÀ' => 'çŽ', + 'ÚÁ' => 'ç‹', + 'ÚÂ' => 'çŒ', + 'ÚÃ' => '矞', + 'ÚÄ' => '矬', + 'ÚÅ' => 'ç¡ ', + 'ÚÆ' => '硤', + 'ÚÇ' => 'ç¡¥', + 'ÚÈ' => '硜', + 'ÚÉ' => 'ç¡­', + 'ÚÊ' => '硱', + 'ÚË' => '硪', + 'ÚÌ' => 'ç¡®', + 'ÚÍ' => 'ç¡°', + 'ÚÎ' => 'ç¡©', + 'ÚÏ' => '硨', + 'ÚÐ' => '硞', + 'ÚÑ' => 'ç¡¢', + 'ÚÒ' => '祴', + 'ÚÓ' => '祳', + 'ÚÔ' => '祲', + 'ÚÕ' => '祰', + 'ÚÖ' => '稂', + 'Ú×' => '稊', + 'ÚØ' => '稃', + 'ÚÙ' => '稌', + 'ÚÚ' => '稄', + 'ÚÛ' => '窙', + 'ÚÜ' => '竦', + 'ÚÝ' => '竤', + 'ÚÞ' => 'ç­Š', + 'Úß' => '笻', + 'Úà' => 'ç­„', + 'Úá' => 'ç­ˆ', + 'Úâ' => 'ç­Œ', + 'Úã' => 'ç­Ž', + 'Úä' => 'ç­€', + 'Úå' => 'ç­˜', + 'Úæ' => 'ç­…', + 'Úç' => 'ç²¢', + 'Úè' => '粞', + 'Úé' => '粨', + 'Úê' => '粡', + 'Úë' => '絘', + 'Úì' => '絯', + 'Úí' => 'çµ£', + 'Úî' => '絓', + 'Úï' => 'çµ–', + 'Úð' => 'çµ§', + 'Úñ' => '絪', + 'Úò' => 'çµ', + 'Úó' => 'çµ­', + 'Úô' => '絜', + 'Úõ' => '絫', + 'Úö' => 'çµ’', + 'Ú÷' => 'çµ”', + 'Úø' => '絩', + 'Úù' => '絑', + 'Úú' => '絟', + 'Úû' => '絎', + 'Úü' => 'ç¼¾', + 'Úý' => '缿', + 'Úþ' => 'ç½¥', + 'Û@' => '罦', + 'ÛA' => 'ç¾¢', + 'ÛB' => 'ç¾ ', + 'ÛC' => '羡', + 'ÛD' => 'ç¿—', + 'ÛE' => 'è‘', + 'ÛF' => 'è', + 'ÛG' => 'è', + 'ÛH' => '胾', + 'ÛI' => '胔', + 'ÛJ' => 'è…ƒ', + 'ÛK' => 'è…Š', + 'ÛL' => 'è…’', + 'ÛM' => 'è…', + 'ÛN' => 'è…‡', + 'ÛO' => '脽', + 'ÛP' => 'è…', + 'ÛQ' => '脺', + 'ÛR' => '臦', + 'ÛS' => '臮', + 'ÛT' => '臷', + 'ÛU' => '臸', + 'ÛV' => '臹', + 'ÛW' => '舄', + 'ÛX' => '舼', + 'ÛY' => '舽', + 'ÛZ' => '舿', + 'Û[' => '艵', + 'Û\\' => '茻', + 'Û]' => 'è', + 'Û^' => 'è¹', + 'Û_' => 'è£', + 'Û`' => 'è€', + 'Ûa' => 'è¨', + 'Ûb' => 'è’', + 'Ûc' => 'è§', + 'Ûd' => 'è¤', + 'Ûe' => 'è¼', + 'Ûf' => 'è¶', + 'Ûg' => 'è', + 'Ûh' => 'è†', + 'Ûi' => 'èˆ', + 'Ûj' => 'è«', + 'Ûk' => 'è£', + 'Ûl' => '莿', + 'Ûm' => 'è', + 'Ûn' => 'è', + 'Ûo' => 'è¥', + 'Ûp' => 'è˜', + 'Ûq' => 'è¿', + 'Ûr' => 'è¡', + 'Ûs' => 'è‹', + 'Ût' => 'èŽ', + 'Ûu' => 'è–', + 'Ûv' => 'èµ', + 'Ûw' => 'è‰', + 'Ûx' => 'è‰', + 'Ûy' => 'è', + 'Ûz' => 'èž', + 'Û{' => 'è‘', + 'Û|' => 'è†', + 'Û}' => 'è‚', + 'Û~' => 'è³', + 'Û¡' => 'è•', + 'Û¢' => 'èº', + 'Û£' => 'è‡', + 'Û¤' => 'è‘', + 'Û¥' => 'èª', + 'Û¦' => 'è“', + 'Û§' => 'èƒ', + 'Û¨' => 'è¬', + 'Û©' => 'è®', + 'Ûª' => 'è„', + 'Û«' => 'è»', + 'Û¬' => 'è—', + 'Û­' => 'è¢', + 'Û®' => 'è›', + 'Û¯' => 'è›', + 'Û°' => 'è¾', + 'Û±' => '蛘', + 'Û²' => '蛢', + 'Û³' => '蛦', + 'Û´' => '蛓', + 'Ûµ' => '蛣', + 'Û¶' => '蛚', + 'Û·' => '蛪', + 'Û¸' => 'è›', + 'Û¹' => '蛫', + 'Ûº' => '蛜', + 'Û»' => '蛬', + 'Û¼' => '蛩', + 'Û½' => 'è›—', + 'Û¾' => '蛨', + 'Û¿' => '蛑', + 'ÛÀ' => '衈', + 'ÛÁ' => 'è¡–', + 'ÛÂ' => 'è¡•', + 'ÛÃ' => '袺', + 'ÛÄ' => '裗', + 'ÛÅ' => '袹', + 'ÛÆ' => '袸', + 'ÛÇ' => '裀', + 'ÛÈ' => '袾', + 'ÛÉ' => '袶', + 'ÛÊ' => '袼', + 'ÛË' => '袷', + 'ÛÌ' => '袽', + 'ÛÍ' => '袲', + 'ÛÎ' => 'è¤', + 'ÛÏ' => '裉', + 'ÛÐ' => '覕', + 'ÛÑ' => '覘', + 'ÛÒ' => '覗', + 'ÛÓ' => 'è§', + 'ÛÔ' => 'è§š', + 'ÛÕ' => 'è§›', + 'ÛÖ' => '詎', + 'Û×' => 'è©', + 'ÛØ' => '訹', + 'ÛÙ' => 'è©™', + 'ÛÚ' => 'è©€', + 'ÛÛ' => 'è©—', + 'ÛÜ' => '詘', + 'ÛÝ' => 'è©„', + 'ÛÞ' => 'è©…', + 'Ûß' => 'è©’', + 'Ûà' => '詈', + 'Ûá' => 'è©‘', + 'Ûâ' => '詊', + 'Ûã' => '詌', + 'Ûä' => 'è©', + 'Ûå' => '豟', + 'Ûæ' => 'è²', + 'Ûç' => 'è²€', + 'Ûè' => '貺', + 'Ûé' => 'è²¾', + 'Ûê' => 'è²°', + 'Ûë' => 'è²¹', + 'Ûì' => 'è²µ', + 'Ûí' => 'è¶„', + 'Ûî' => 'è¶€', + 'Ûï' => '趉', + 'Ûð' => 'è·˜', + 'Ûñ' => 'è·“', + 'Ûò' => 'è·', + 'Ûó' => 'è·‡', + 'Ûô' => 'è·–', + 'Ûõ' => 'è·œ', + 'Ûö' => 'è·', + 'Û÷' => 'è·•', + 'Ûø' => 'è·™', + 'Ûù' => 'è·ˆ', + 'Ûú' => 'è·—', + 'Ûû' => 'è·…', + 'Ûü' => '軯', + 'Ûý' => 'è»·', + 'Ûþ' => '軺', + 'Ü@' => '軹', + 'ÜA' => '軦', + 'ÜB' => 'è»®', + 'ÜC' => '軥', + 'ÜD' => '軵', + 'ÜE' => 'è»§', + 'ÜF' => '軨', + 'ÜG' => 'è»¶', + 'ÜH' => '軫', + 'ÜI' => 'è»±', + 'ÜJ' => '軬', + 'ÜK' => 'è»´', + 'ÜL' => '軩', + 'ÜM' => '逭', + 'ÜN' => '逴', + 'ÜO' => '逯', + 'ÜP' => '鄆', + 'ÜQ' => '鄬', + 'ÜR' => 'é„„', + 'ÜS' => '郿', + 'ÜT' => '郼', + 'ÜU' => '鄈', + 'ÜV' => '郹', + 'ÜW' => '郻', + 'ÜX' => 'é„', + 'ÜY' => 'é„€', + 'ÜZ' => '鄇', + 'Ü[' => 'é„…', + 'Ü\\' => '鄃', + 'Ü]' => 'é…¡', + 'Ü^' => 'é…¤', + 'Ü_' => 'é…Ÿ', + 'Ü`' => 'é…¢', + 'Üa' => 'é… ', + 'Üb' => 'éˆ', + 'Üc' => '鈊', + 'Üd' => '鈥', + 'Üe' => '鈃', + 'Üf' => '鈚', + 'Üg' => '鈦', + 'Üh' => 'éˆ', + 'Üi' => '鈌', + 'Üj' => '鈀', + 'Ük' => '鈒', + 'Ül' => '釿', + 'Üm' => '釽', + 'Ün' => '鈆', + 'Üo' => '鈄', + 'Üp' => '鈧', + 'Üq' => '鈂', + 'Ür' => '鈜', + 'Üs' => '鈤', + 'Üt' => '鈙', + 'Üu' => '鈗', + 'Üv' => '鈅', + 'Üw' => '鈖', + 'Üx' => 'é•»', + 'Üy' => 'é–', + 'Üz' => 'é–Œ', + 'Ü{' => 'é–', + 'Ü|' => '隇', + 'Ü}' => '陾', + 'Ü~' => '隈', + 'Ü¡' => '隉', + 'Ü¢' => '隃', + 'Ü£' => '隀', + 'ܤ' => '雂', + 'Ü¥' => '雈', + 'ܦ' => '雃', + 'ܧ' => 'é›±', + 'ܨ' => 'é›°', + 'Ü©' => 'é¬', + 'ܪ' => 'é°', + 'Ü«' => 'é®', + 'ܬ' => 'é ‡', + 'Ü­' => '颩', + 'Ü®' => '飫', + 'ܯ' => '鳦', + 'ܰ' => '黹', + 'ܱ' => '亃', + 'ܲ' => '亄', + 'ܳ' => '亶', + 'Ü´' => '傽', + 'ܵ' => 'å‚¿', + 'ܶ' => '僆', + 'Ü·' => 'å‚®', + 'ܸ' => '僄', + 'ܹ' => '僊', + 'ܺ' => 'å‚´', + 'Ü»' => '僈', + 'ܼ' => '僂', + 'ܽ' => 'å‚°', + 'ܾ' => 'åƒ', + 'Ü¿' => '傺', + 'ÜÀ' => '傱', + 'ÜÁ' => '僋', + 'ÜÂ' => '僉', + 'ÜÃ' => 'å‚¶', + 'ÜÄ' => '傸', + 'ÜÅ' => '凗', + 'ÜÆ' => '剺', + 'ÜÇ' => '剸', + 'ÜÈ' => '剻', + 'ÜÉ' => '剼', + 'ÜÊ' => 'å—ƒ', + 'ÜË' => 'å—›', + 'ÜÌ' => 'å—Œ', + 'ÜÍ' => 'å—', + 'ÜÎ' => 'å—‹', + 'ÜÏ' => 'å—Š', + 'ÜÐ' => 'å—', + 'ÜÑ' => 'å—€', + 'ÜÒ' => 'å—”', + 'ÜÓ' => 'å—„', + 'ÜÔ' => 'å—©', + 'ÜÕ' => 'å–¿', + 'ÜÖ' => 'å—’', + 'Ü×' => 'å–', + 'ÜØ' => 'å—', + 'ÜÙ' => 'å—•', + 'ÜÚ' => 'å—¢', + 'ÜÛ' => 'å—–', + 'ÜÜ' => 'å—ˆ', + 'ÜÝ' => 'å—²', + 'ÜÞ' => 'å—', + 'Üß' => 'å—™', + 'Üà' => 'å—‚', + 'Üá' => '圔', + 'Üâ' => 'å¡“', + 'Üã' => '塨', + 'Üä' => '塤', + 'Üå' => 'å¡', + 'Üæ' => 'å¡', + 'Üç' => '塉', + 'Üè' => '塯', + 'Üé' => 'å¡•', + 'Üê' => '塎', + 'Üë' => 'å¡', + 'Üì' => 'å¡™', + 'Üí' => 'å¡¥', + 'Üî' => 'å¡›', + 'Üï' => 'å ½', + 'Üð' => 'å¡£', + 'Üñ' => '塱', + 'Üò' => '壼', + 'Üó' => '嫇', + 'Üô' => 'å«„', + 'Üõ' => 'å«‹', + 'Üö' => '媺', + 'Ü÷' => '媸', + 'Üø' => '媱', + 'Üù' => '媵', + 'Üú' => '媰', + 'Üû' => '媿', + 'Üü' => '嫈', + 'Üý' => '媻', + 'Üþ' => '嫆', + 'Ý@' => '媷', + 'ÝA' => 'å«€', + 'ÝB' => '嫊', + 'ÝC' => '媴', + 'ÝD' => '媶', + 'ÝE' => 'å«', + 'ÝF' => '媹', + 'ÝG' => 'åª', + 'ÝH' => '寖', + 'ÝI' => '寘', + 'ÝJ' => '寙', + 'ÝK' => 'å°Ÿ', + 'ÝL' => 'å°³', + 'ÝM' => 'åµ±', + 'ÝN' => 'åµ£', + 'ÝO' => '嵊', + 'ÝP' => 'åµ¥', + 'ÝQ' => 'åµ²', + 'ÝR' => '嵬', + 'ÝS' => '嵞', + 'ÝT' => '嵨', + 'ÝU' => 'åµ§', + 'ÝV' => 'åµ¢', + 'ÝW' => 'å·°', + 'ÝX' => 'å¹', + 'ÝY' => '幎', + 'ÝZ' => '幊', + 'Ý[' => 'å¹', + 'Ý\\' => '幋', + 'Ý]' => 'å»…', + 'Ý^' => '廌', + 'Ý_' => '廆', + 'Ý`' => '廋', + 'Ýa' => '廇', + 'Ýb' => 'å½€', + 'Ýc' => '徯', + 'Ýd' => 'å¾­', + 'Ýe' => '惷', + 'Ýf' => 'æ…‰', + 'Ýg' => 'æ…Š', + 'Ýh' => 'æ„«', + 'Ýi' => 'æ……', + 'Ýj' => 'æ„¶', + 'Ýk' => '愲', + 'Ýl' => 'æ„®', + 'Ým' => 'æ…†', + 'Ýn' => '愯', + 'Ýo' => 'æ…', + 'Ýp' => 'æ„©', + 'Ýq' => 'æ…€', + 'Ýr' => '戠', + 'Ýs' => 'é…¨', + 'Ýt' => '戣', + 'Ýu' => '戥', + 'Ýv' => '戤', + 'Ýw' => 'æ…', + 'Ýx' => 'æ±', + 'Ýy' => 'æ«', + 'Ýz' => 'æ', + 'Ý{' => 'æ’', + 'Ý|' => 'æ‰', + 'Ý}' => 'æ ', + 'Ý~' => 'æ¤', + 'Ý¡' => 'æ³', + 'Ý¢' => '摃', + 'Ý£' => 'æŸ', + 'ݤ' => 'æ•', + 'Ý¥' => 'æ˜', + 'ݦ' => 'æ¹', + 'ݧ' => 'æ·', + 'ݨ' => 'æ¢', + 'Ý©' => 'æ£', + 'ݪ' => 'æŒ', + 'Ý«' => 'æ¦', + 'ݬ' => 'æ°', + 'Ý­' => 'æ¨', + 'Ý®' => 'æ‘', + 'ݯ' => 'æµ', + 'ݰ' => 'æ¯', + 'ݱ' => 'æŠ', + 'ݲ' => 'æš', + 'ݳ' => 'æ‘€', + 'Ý´' => 'æ¥', + 'ݵ' => 'æ§', + 'ݶ' => 'æ‹', + 'Ý·' => 'æ§', + 'ݸ' => 'æ›', + 'ݹ' => 'æ®', + 'ݺ' => 'æ¡', + 'Ý»' => 'æŽ', + 'ݼ' => '敯', + 'ݽ' => 'æ–’', + 'ݾ' => 'æ—“', + 'Ý¿' => '暆', + 'ÝÀ' => '暌', + 'ÝÁ' => 'æš•', + 'ÝÂ' => 'æš', + 'ÝÃ' => 'æš‹', + 'ÝÄ' => '暊', + 'ÝÅ' => 'æš™', + 'ÝÆ' => 'æš”', + 'ÝÇ' => '晸', + 'ÝÈ' => '朠', + 'ÝÉ' => '楦', + 'ÝÊ' => '楟', + 'ÝË' => '椸', + 'ÝÌ' => '楎', + 'ÝÍ' => '楢', + 'ÝÎ' => '楱', + 'ÝÏ' => '椿', + 'ÝÐ' => '楅', + 'ÝÑ' => '楪', + 'ÝÒ' => '椹', + 'ÝÓ' => '楂', + 'ÝÔ' => '楗', + 'ÝÕ' => '楙', + 'ÝÖ' => '楺', + 'Ý×' => '楈', + 'ÝØ' => '楉', + 'ÝÙ' => '椵', + 'ÝÚ' => '楬', + 'ÝÛ' => '椳', + 'ÝÜ' => '椽', + 'ÝÝ' => '楥', + 'ÝÞ' => '棰', + 'Ýß' => '楸', + 'Ýà' => '椴', + 'Ýá' => '楩', + 'Ýâ' => '楀', + 'Ýã' => '楯', + 'Ýä' => '楄', + 'Ýå' => '楶', + 'Ýæ' => '楘', + 'Ýç' => 'æ¥', + 'Ýè' => '楴', + 'Ýé' => '楌', + 'Ýê' => '椻', + 'Ýë' => '楋', + 'Ýì' => '椷', + 'Ýí' => '楜', + 'Ýî' => 'æ¥', + 'Ýï' => '楑', + 'Ýð' => '椲', + 'Ýñ' => '楒', + 'Ýò' => '椯', + 'Ýó' => '楻', + 'Ýô' => '椼', + 'Ýõ' => 'æ­†', + 'Ýö' => 'æ­…', + 'Ý÷' => 'æ­ƒ', + 'Ýø' => 'æ­‚', + 'Ýù' => 'æ­ˆ', + 'Ýú' => 'æ­', + 'Ýû' => 'æ®›', + 'Ýü' => 'ï¨', + 'Ýý' => '毻', + 'Ýþ' => '毼', + 'Þ@' => '毹', + 'ÞA' => '毷', + 'ÞB' => '毸', + 'ÞC' => '溛', + 'ÞD' => 'æ»–', + 'ÞE' => '滈', + 'ÞF' => 'æº', + 'ÞG' => '滀', + 'ÞH' => '溟', + 'ÞI' => '溓', + 'ÞJ' => '溔', + 'ÞK' => '溠', + 'ÞL' => '溱', + 'ÞM' => '溹', + 'ÞN' => '滆', + 'ÞO' => 'æ»’', + 'ÞP' => '溽', + 'ÞQ' => 'æ»', + 'ÞR' => '溞', + 'ÞS' => '滉', + 'ÞT' => '溷', + 'ÞU' => '溰', + 'ÞV' => 'æ»', + 'ÞW' => '溦', + 'ÞX' => 'æ»', + 'ÞY' => '溲', + 'ÞZ' => '溾', + 'Þ[' => '滃', + 'Þ\\' => '滜', + 'Þ]' => '滘', + 'Þ^' => '溙', + 'Þ_' => '溒', + 'Þ`' => '溎', + 'Þa' => 'æº', + 'Þb' => '溤', + 'Þc' => '溡', + 'Þd' => '溿', + 'Þe' => '溳', + 'Þf' => 'æ»', + 'Þg' => '滊', + 'Þh' => '溗', + 'Þi' => '溮', + 'Þj' => '溣', + 'Þk' => 'ç…‡', + 'Þl' => 'ç…”', + 'Þm' => 'ç…’', + 'Þn' => 'ç…£', + 'Þo' => 'ç… ', + 'Þp' => 'ç…', + 'Þq' => 'ç…', + 'Þr' => 'ç…¢', + 'Þs' => 'ç…²', + 'Þt' => 'ç…¸', + 'Þu' => 'ç…ª', + 'Þv' => 'ç…¡', + 'Þw' => 'ç…‚', + 'Þx' => 'ç…˜', + 'Þy' => 'ç…ƒ', + 'Þz' => 'ç…‹', + 'Þ{' => 'ç…°', + 'Þ|' => 'ç…Ÿ', + 'Þ}' => 'ç…', + 'Þ~' => 'ç…“', + 'Þ¡' => 'ç…„', + 'Þ¢' => 'ç…', + 'Þ£' => 'ç…š', + 'Þ¤' => 'ç‰', + 'Þ¥' => 'çŠ', + 'Þ¦' => '犌', + 'Þ§' => '犑', + 'Þ¨' => 'çŠ', + 'Þ©' => '犎', + 'Þª' => '猼', + 'Þ«' => 'ç‚', + 'Þ¬' => '猻', + 'Þ­' => '猺', + 'Þ®' => 'ç€', + 'Þ¯' => 'çŠ', + 'Þ°' => 'ç‰', + 'Þ±' => 'ç‘„', + 'Þ²' => '瑊', + 'Þ³' => 'ç‘‹', + 'Þ´' => 'ç‘’', + 'Þµ' => 'ç‘‘', + 'Þ¶' => 'ç‘—', + 'Þ·' => 'ç‘€', + 'Þ¸' => 'ç‘', + 'Þ¹' => 'ç‘', + 'Þº' => '瑎', + 'Þ»' => 'ç‘‚', + 'Þ¼' => '瑆', + 'Þ½' => 'ç‘', + 'Þ¾' => 'ç‘”', + 'Þ¿' => 'ç“¡', + 'ÞÀ' => 'ç“¿', + 'ÞÁ' => '瓾', + 'ÞÂ' => '瓽', + 'ÞÃ' => 'ç”', + 'ÞÄ' => '畹', + 'ÞÅ' => 'ç•·', + 'ÞÆ' => '榃', + 'ÞÇ' => 'ç—¯', + 'ÞÈ' => 'ç˜', + 'ÞÉ' => '瘃', + 'ÞÊ' => 'ç—·', + 'ÞË' => 'ç—¾', + 'ÞÌ' => 'ç—¼', + 'ÞÍ' => 'ç—¹', + 'ÞÎ' => 'ç—¸', + 'ÞÏ' => 'ç˜', + 'ÞÐ' => 'ç—»', + 'ÞÑ' => 'ç—¶', + 'ÞÒ' => 'ç—­', + 'ÞÓ' => 'ç—µ', + 'ÞÔ' => 'ç—½', + 'ÞÕ' => 'çš™', + 'ÞÖ' => 'çšµ', + 'Þ×' => 'ç›', + 'ÞØ' => 'ç•', + 'ÞÙ' => 'çŸ', + 'ÞÚ' => 'ç ', + 'ÞÛ' => 'ç’', + 'ÞÜ' => 'ç–', + 'ÞÝ' => 'çš', + 'ÞÞ' => 'ç©', + 'Þß' => 'ç§', + 'Þà' => 'ç”', + 'Þá' => 'ç™', + 'Þâ' => 'ç­', + 'Þã' => '矠', + 'Þä' => '碇', + 'Þå' => '碚', + 'Þæ' => '碔', + 'Þç' => 'ç¢', + 'Þè' => '碄', + 'Þé' => '碕', + 'Þê' => '碅', + 'Þë' => '碆', + 'Þì' => '碡', + 'Þí' => '碃', + 'Þî' => '硹', + 'Þï' => '碙', + 'Þð' => '碀', + 'Þñ' => '碖', + 'Þò' => 'ç¡»', + 'Þó' => '祼', + 'Þô' => '禂', + 'Þõ' => '祽', + 'Þö' => '祹', + 'Þ÷' => '稑', + 'Þø' => '稘', + 'Þù' => '稙', + 'Þú' => '稒', + 'Þû' => '稗', + 'Þü' => '稕', + 'Þý' => '稢', + 'Þþ' => '稓', + 'ß@' => '稛', + 'ßA' => 'ç¨', + 'ßB' => '窣', + 'ßC' => '窢', + 'ßD' => '窞', + 'ßE' => 'ç««', + 'ßF' => 'ç­¦', + 'ßG' => 'ç­¤', + 'ßH' => 'ç­­', + 'ßI' => 'ç­´', + 'ßJ' => 'ç­©', + 'ßK' => 'ç­²', + 'ßL' => 'ç­¥', + 'ßM' => 'ç­³', + 'ßN' => 'ç­±', + 'ßO' => 'ç­°', + 'ßP' => 'ç­¡', + 'ßQ' => 'ç­¸', + 'ßR' => 'ç­¶', + 'ßS' => 'ç­£', + 'ßT' => 'ç²²', + 'ßU' => 'ç²´', + 'ßV' => '粯', + 'ßW' => '綈', + 'ßX' => '綆', + 'ßY' => 'ç¶€', + 'ßZ' => 'ç¶', + 'ß[' => '絿', + 'ß\\' => 'ç¶…', + 'ß]' => '絺', + 'ß^' => 'ç¶Ž', + 'ß_' => 'çµ»', + 'ß`' => '綃', + 'ßa' => 'çµ¼', + 'ßb' => 'ç¶Œ', + 'ßc' => 'ç¶”', + 'ßd' => 'ç¶„', + 'ße' => 'çµ½', + 'ßf' => 'ç¶’', + 'ßg' => 'ç½­', + 'ßh' => '罫', + 'ßi' => 'ç½§', + 'ßj' => '罨', + 'ßk' => '罬', + 'ßl' => '羦', + 'ßm' => 'ç¾¥', + 'ßn' => 'ç¾§', + 'ßo' => 'ç¿›', + 'ßp' => '翜', + 'ßq' => '耡', + 'ßr' => 'è…¤', + 'ßs' => 'è… ', + 'ßt' => 'è…·', + 'ßu' => 'è…œ', + 'ßv' => 'è…©', + 'ßw' => 'è…›', + 'ßx' => 'è…¢', + 'ßy' => 'è…²', + 'ßz' => '朡', + 'ß{' => 'è…ž', + 'ß|' => 'è…¶', + 'ß}' => 'è…§', + 'ß~' => 'è…¯', + 'ß¡' => 'è…„', + 'ߢ' => 'è…¡', + 'ߣ' => 'èˆ', + 'ߤ' => '艉', + 'ߥ' => '艄', + 'ߦ' => '艀', + 'ß§' => '艂', + 'ߨ' => '艅', + 'ß©' => '蓱', + 'ߪ' => 'è¿', + 'ß«' => 'è‘–', + '߬' => 'è‘¶', + 'ß­' => '葹', + 'ß®' => 'è’', + '߯' => 'è’', + 'ß°' => 'è‘¥', + 'ß±' => 'è‘‘', + 'ß²' => 'è‘€', + 'ß³' => 'è’†', + 'ß´' => 'è‘§', + 'ßµ' => 'è°', + 'ß¶' => 'è‘', + 'ß·' => '葽', + '߸' => '葚', + 'ß¹' => 'è‘™', + 'ߺ' => 'è‘´', + 'ß»' => '葳', + 'ß¼' => 'è‘', + 'ß½' => '蔇', + 'ß¾' => '葞', + 'ß¿' => 'è·', + 'ßÀ' => 'èº', + 'ßÁ' => 'è´', + 'ßÂ' => '葺', + 'ßÃ' => '葃', + 'ßÄ' => '葸', + 'ßÅ' => 'è²', + '߯' => 'è‘…', + 'ßÇ' => 'è©', + 'ßÈ' => 'è™', + 'ßÉ' => 'è‘‹', + 'ßÊ' => 'è¯', + 'ßË' => 'è‘‚', + 'ßÌ' => 'è­', + 'ßÍ' => '葟', + 'ßÎ' => 'è‘°', + 'ßÏ' => 'è¹', + 'ßÐ' => '葎', + 'ßÑ' => '葌', + 'ßÒ' => 'è‘’', + 'ßÓ' => '葯', + 'ßÔ' => 'è“…', + 'ßÕ' => 'è’Ž', + 'ßÖ' => 'è»', + 'ß×' => '葇', + 'ߨ' => 'è¶', + 'ßÙ' => 'è³', + 'ßÚ' => '葨', + 'ßÛ' => '葾', + 'ßÜ' => 'è‘„', + 'ßÝ' => 'è«', + 'ßÞ' => 'è‘ ', + 'ßß' => 'è‘”', + 'ßà' => 'è‘®', + 'ßá' => 'è‘', + 'ßâ' => '蜋', + 'ßã' => '蜄', + 'ßä' => 'è›·', + 'ßå' => '蜌', + 'ßæ' => '蛺', + 'ßç' => 'è›–', + 'ßè' => '蛵', + 'ßé' => 'è', + 'ßê' => '蛸', + 'ßë' => '蜎', + 'ßì' => '蜉', + 'ßí' => 'èœ', + 'ßî' => 'è›¶', + 'ßï' => 'èœ', + 'ßð' => '蜅', + 'ßñ' => '裖', + 'ßò' => '裋', + 'ßó' => 'è£', + 'ßô' => '裎', + 'ßõ' => '裞', + 'ßö' => '裛', + 'ß÷' => '裚', + 'ßø' => '裌', + 'ßù' => 'è£', + 'ßú' => '覅', + 'ßû' => '覛', + 'ßü' => 'è§Ÿ', + 'ßý' => 'è§¥', + 'ßþ' => '觤', + 'à@' => 'è§¡', + 'àA' => 'è§ ', + 'àB' => 'è§¢', + 'àC' => 'è§œ', + 'àD' => '触', + 'àE' => 'è©¶', + 'àF' => '誆', + 'àG' => 'è©¿', + 'àH' => 'è©¡', + 'àI' => '訿', + 'àJ' => 'è©·', + 'àK' => '誂', + 'àL' => '誄', + 'àM' => '詵', + 'àN' => '誃', + 'àO' => 'èª', + 'àP' => 'è©´', + 'àQ' => '詺', + 'àR' => 'è°¼', + 'àS' => '豋', + 'àT' => '豊', + 'àU' => 'è±¥', + 'àV' => '豤', + 'àW' => '豦', + 'àX' => '貆', + 'àY' => '貄', + 'àZ' => 'è²…', + 'à[' => '賌', + 'à\\' => '赨', + 'à]' => '赩', + 'à^' => 'è¶‘', + 'à_' => 'è¶Œ', + 'à`' => 'è¶Ž', + 'àa' => 'è¶', + 'àb' => 'è¶', + 'àc' => 'è¶“', + 'àd' => 'è¶”', + 'àe' => 'è¶', + 'àf' => 'è¶’', + 'àg' => 'è·°', + 'àh' => 'è· ', + 'ài' => 'è·¬', + 'àj' => 'è·±', + 'àk' => 'è·®', + 'àl' => 'è·', + 'àm' => 'è·©', + 'àn' => 'è·£', + 'ào' => 'è·¢', + 'àp' => 'è·§', + 'àq' => 'è·²', + 'àr' => 'è·«', + 'às' => 'è·´', + 'àt' => '輆', + 'àu' => '軿', + 'àv' => 'è¼', + 'àw' => 'è¼€', + 'àx' => 'è¼…', + 'ày' => '輇', + 'àz' => '輈', + 'à{' => '輂', + 'à|' => '輋', + 'à}' => 'é’', + 'à~' => '逿', + 'à¡' => 'é„', + 'à¢' => 'é‰', + 'à£' => '逽', + 'à¤' => 'é„', + 'à¥' => 'é„', + 'à¦' => 'é„', + 'à§' => 'é„‘', + 'à¨' => 'é„–', + 'à©' => 'é„”', + 'àª' => 'é„‹', + 'à«' => '鄎', + 'à¬' => 'é…®', + 'à­' => 'é…¯', + 'à®' => '鉈', + 'à¯' => '鉒', + 'à°' => '鈰', + 'à±' => '鈺', + 'à²' => '鉦', + 'à³' => '鈳', + 'à´' => '鉥', + 'àµ' => '鉞', + 'à¶' => '銃', + 'à·' => '鈮', + 'à¸' => '鉊', + 'à¹' => '鉆', + 'àº' => '鉭', + 'à»' => '鉬', + 'à¼' => 'é‰', + 'à½' => '鉠', + 'à¾' => '鉧', + 'à¿' => '鉯', + 'àÀ' => '鈶', + 'àÁ' => '鉡', + 'àÂ' => '鉰', + 'àÃ' => '鈱', + 'àÄ' => '鉔', + 'àÅ' => '鉣', + 'àÆ' => 'é‰', + 'àÇ' => '鉲', + 'àÈ' => '鉎', + 'àÉ' => '鉓', + 'àÊ' => '鉌', + 'àË' => '鉖', + 'àÌ' => '鈲', + 'àÍ' => 'é–Ÿ', + 'àÎ' => 'é–œ', + 'àÏ' => 'é–ž', + 'àÐ' => 'é–›', + 'àÑ' => 'éš’', + 'àÒ' => 'éš“', + 'àÓ' => 'éš‘', + 'àÔ' => 'éš—', + 'àÕ' => '雎', + 'àÖ' => '雺', + 'à×' => '雽', + 'àØ' => '雸', + 'àÙ' => '雵', + 'àÚ' => 'é³', + 'àÛ' => 'é·', + 'àÜ' => 'é¸', + 'àÝ' => 'é²', + 'àÞ' => 'é ', + 'àß' => 'é ', + 'àà' => 'é Ž', + 'àá' => '颬', + 'àâ' => '飶', + 'àã' => '飹', + 'àä' => '馯', + 'àå' => '馲', + 'àæ' => '馰', + 'àç' => '馵', + 'àè' => '骭', + 'àé' => '骫', + 'àê' => 'é­›', + 'àë' => '鳪', + 'àì' => 'é³­', + 'àí' => 'é³§', + 'àî' => '麀', + 'àï' => '黽', + 'àð' => '僦', + 'àñ' => '僔', + 'àò' => '僗', + 'àó' => '僨', + 'àô' => '僳', + 'àõ' => '僛', + 'àö' => '僪', + 'à÷' => 'åƒ', + 'àø' => '僤', + 'àù' => '僓', + 'àú' => '僬', + 'àû' => '僰', + 'àü' => '僯', + 'àý' => '僣', + 'àþ' => '僠', + 'á@' => '凘', + 'áA' => '劀', + 'áB' => 'åŠ', + 'áC' => 'å‹©', + 'áD' => 'å‹«', + 'áE' => '匰', + 'áF' => '厬', + 'áG' => '嘧', + 'áH' => '嘕', + 'áI' => '嘌', + 'áJ' => '嘒', + 'áK' => 'å—¼', + 'áL' => 'å˜', + 'áM' => '嘜', + 'áN' => 'å˜', + 'áO' => '嘓', + 'áP' => '嘂', + 'áQ' => 'å—º', + 'áR' => 'å˜', + 'áS' => '嘄', + 'áT' => 'å—¿', + 'áU' => 'å—¹', + 'áV' => '墉', + 'áW' => '塼', + 'áX' => 'å¢', + 'áY' => '墘', + 'áZ' => '墆', + 'á[' => 'å¢', + 'á\\' => 'å¡¿', + 'á]' => 'å¡´', + 'á^' => '墋', + 'á_' => '塺', + 'á`' => '墇', + 'áa' => '墑', + 'áb' => '墎', + 'ác' => 'å¡¶', + 'ád' => '墂', + 'áe' => '墈', + 'áf' => 'å¡»', + 'ág' => '墔', + 'áh' => 'å¢', + 'ái' => '壾', + 'áj' => '奫', + 'ák' => '嫜', + 'ál' => 'å«®', + 'ám' => 'å«¥', + 'án' => 'å«•', + 'áo' => '嫪', + 'áp' => '嫚', + 'áq' => 'å«­', + 'ár' => 'å««', + 'ás' => '嫳', + 'át' => 'å«¢', + 'áu' => 'å« ', + 'áv' => 'å«›', + 'áw' => '嫬', + 'áx' => '嫞', + 'áy' => 'å«', + 'áz' => 'å«™', + 'á{' => '嫨', + 'á|' => '嫟', + 'á}' => 'å­·', + 'á~' => '寠', + 'á¡' => '寣', + 'á¢' => 'å±£', + 'á£' => 'å¶‚', + 'á¤' => 'å¶€', + 'á¥' => 'åµ½', + 'á¦' => '嶆', + 'á§' => '嵺', + 'á¨' => 'å¶', + 'á©' => 'åµ·', + 'áª' => 'å¶Š', + 'á«' => '嶉', + 'á¬' => '嶈', + 'á­' => 'åµ¾', + 'á®' => 'åµ¼', + 'á¯' => 'å¶', + 'á°' => 'åµ¹', + 'á±' => '嵿', + 'á²' => '幘', + 'á³' => 'å¹™', + 'á´' => '幓', + 'áµ' => '廘', + 'á¶' => '廑', + 'á·' => 'å»—', + 'á¸' => '廎', + 'á¹' => '廜', + 'áº' => '廕', + 'á»' => 'å»™', + 'á¼' => 'å»’', + 'á½' => 'å»”', + 'á¾' => '彄', + 'á¿' => '彃', + 'áÀ' => '彯', + 'áÁ' => 'å¾¶', + 'áÂ' => '愬', + 'áÃ' => '愨', + 'áÄ' => 'æ…', + 'áÅ' => 'æ…ž', + 'áÆ' => 'æ…±', + 'áÇ' => 'æ…³', + 'áÈ' => 'æ…’', + 'áÉ' => 'æ…“', + 'áÊ' => 'æ…²', + 'áË' => 'æ…¬', + 'áÌ' => '憀', + 'áÍ' => 'æ…´', + 'áÎ' => 'æ…”', + 'áÏ' => 'æ…º', + 'áÐ' => 'æ…›', + 'áÑ' => 'æ…¥', + 'áÒ' => 'æ„»', + 'áÓ' => 'æ…ª', + 'áÔ' => 'æ…¡', + 'áÕ' => 'æ…–', + 'áÖ' => '戩', + 'á×' => '戧', + 'áØ' => '戫', + 'áÙ' => 'æ«', + 'áÚ' => 'æ‘', + 'áÛ' => 'æ‘›', + 'áÜ' => 'æ‘', + 'áÝ' => 'æ‘´', + 'áÞ' => 'æ‘¶', + 'áß' => '摲', + 'áà' => '摳', + 'áá' => '摽', + 'áâ' => '摵', + 'áã' => '摦', + 'áä' => 'æ’¦', + 'áå' => '摎', + 'áæ' => 'æ’‚', + 'áç' => '摞', + 'áè' => '摜', + 'áé' => 'æ‘‹', + 'áê' => 'æ‘“', + 'áë' => 'æ‘ ', + 'áì' => 'æ‘', + 'áí' => 'æ‘¿', + 'áî' => 'æ¿', + 'áï' => '摬', + 'áð' => 'æ‘«', + 'áñ' => 'æ‘™', + 'áò' => 'æ‘¥', + 'áó' => 'æ‘·', + 'áô' => '敳', + 'áõ' => 'æ– ', + 'áö' => 'æš¡', + 'á÷' => 'æš ', + 'áø' => '暟', + 'áù' => '朅', + 'áú' => '朄', + 'áû' => '朢', + 'áü' => '榱', + 'áý' => '榶', + 'áþ' => '槉', + 'â@' => '榠', + 'âA' => 'æ§Ž', + 'âB' => '榖', + 'âC' => '榰', + 'âD' => '榬', + 'âE' => '榼', + 'âF' => '榑', + 'âG' => '榙', + 'âH' => '榎', + 'âI' => '榧', + 'âJ' => 'æ¦', + 'âK' => '榩', + 'âL' => '榾', + 'âM' => '榯', + 'âN' => '榿', + 'âO' => 'æ§„', + 'âP' => '榽', + 'âQ' => '榤', + 'âR' => 'æ§”', + 'âS' => '榹', + 'âT' => 'æ§Š', + 'âU' => '榚', + 'âV' => 'æ§', + 'âW' => '榳', + 'âX' => '榓', + 'âY' => '榪', + 'âZ' => '榡', + 'â[' => '榞', + 'â\\' => 'æ§™', + 'â]' => '榗', + 'â^' => 'æ¦', + 'â_' => 'æ§‚', + 'â`' => '榵', + 'âa' => '榥', + 'âb' => '槆', + 'âc' => 'æ­Š', + 'âd' => 'æ­', + 'âe' => 'æ­‹', + 'âf' => '殞', + 'âg' => '殟', + 'âh' => 'æ® ', + 'âi' => '毃', + 'âj' => '毄', + 'âk' => '毾', + 'âl' => '滎', + 'âm' => '滵', + 'ân' => 'æ»±', + 'âo' => '漃', + 'âp' => 'æ¼¥', + 'âq' => '滸', + 'âr' => 'æ¼·', + 'âs' => 'æ»»', + 'ât' => 'æ¼®', + 'âu' => '漉', + 'âv' => '潎', + 'âw' => 'æ¼™', + 'âx' => '漚', + 'ây' => 'æ¼§', + 'âz' => '漘', + 'â{' => 'æ¼»', + 'â|' => 'æ¼’', + 'â}' => 'æ»­', + 'â~' => '漊', + 'â¡' => 'æ¼¶', + 'â¢' => 'æ½³', + 'â£' => '滹', + 'â¤' => 'æ»®', + 'â¥' => 'æ¼­', + 'â¦' => 'æ½€', + 'â§' => 'æ¼°', + 'â¨' => 'æ¼¼', + 'â©' => 'æ¼µ', + 'âª' => '滫', + 'â«' => '漇', + 'â¬' => '漎', + 'â­' => '潃', + 'â®' => 'æ¼…', + 'â¯' => '滽', + 'â°' => 'æ»¶', + 'â±' => 'æ¼¹', + 'â²' => '漜', + 'â³' => '滼', + 'â´' => '漺', + 'âµ' => '漟', + 'â¶' => 'æ¼', + 'â·' => '漞', + 'â¸' => '漈', + 'â¹' => '漡', + 'âº' => '熇', + 'â»' => 'ç†', + 'â¼' => '熉', + 'â½' => '熀', + 'â¾' => '熅', + 'â¿' => '熂', + 'âÀ' => 'ç†', + 'âÁ' => 'ç…»', + 'âÂ' => '熆', + 'âÃ' => 'ç†', + 'âÄ' => '熗', + 'âÅ' => '牄', + 'âÆ' => '牓', + 'âÇ' => '犗', + 'âÈ' => '犕', + 'âÉ' => '犓', + 'âÊ' => 'çƒ', + 'âË' => 'ç', + 'âÌ' => 'ç‘', + 'âÍ' => 'çŒ', + 'âÎ' => 'ç‘¢', + 'âÏ' => '瑳', + 'âÐ' => '瑱', + 'âÑ' => '瑵', + 'âÒ' => '瑲', + 'âÓ' => 'ç‘§', + 'âÔ' => 'ç‘®', + 'âÕ' => '甀', + 'âÖ' => '甂', + 'â×' => '甃', + 'âØ' => '畽', + 'âÙ' => 'ç–', + 'âÚ' => '瘖', + 'âÛ' => '瘈', + 'âÜ' => '瘌', + 'âÝ' => '瘕', + 'âÞ' => '瘑', + 'âß' => '瘊', + 'âà' => '瘔', + 'âá' => '皸', + 'ââ' => 'çž', + 'âã' => 'ç¼', + 'âä' => 'çž…', + 'âå' => 'çž‚', + 'âæ' => 'ç®', + 'âç' => '瞀', + 'âè' => 'ç¯', + 'âé' => 'ç¾', + 'âê' => '瞃', + 'âë' => '碲', + 'âì' => '碪', + 'âí' => '碴', + 'âî' => '碭', + 'âï' => '碨', + 'âð' => '硾', + 'âñ' => '碫', + 'âò' => '碞', + 'âó' => '碥', + 'âô' => '碠', + 'âõ' => '碬', + 'âö' => '碢', + 'â÷' => '碤', + 'âø' => '禘', + 'âù' => '禊', + 'âú' => '禋', + 'âû' => '禖', + 'âü' => '禕', + 'âý' => '禔', + 'âþ' => '禓', + 'ã@' => '禗', + 'ãA' => '禈', + 'ãB' => '禒', + 'ãC' => 'ç¦', + 'ãD' => '稫', + 'ãE' => '穊', + 'ãF' => '稰', + 'ãG' => '稯', + 'ãH' => '稨', + 'ãI' => '稦', + 'ãJ' => '窨', + 'ãK' => '窫', + 'ãL' => '窬', + 'ãM' => 'ç«®', + 'ãN' => '箈', + 'ãO' => '箜', + 'ãP' => '箊', + 'ãQ' => '箑', + 'ãR' => 'ç®', + 'ãS' => 'ç®–', + 'ãT' => 'ç®', + 'ãU' => '箌', + 'ãV' => 'ç®›', + 'ãW' => '箎', + 'ãX' => 'ç®…', + 'ãY' => '箘', + 'ãZ' => '劄', + 'ã[' => 'ç®™', + 'ã\\' => '箤', + 'ã]' => '箂', + 'ã^' => 'ç²»', + 'ã_' => '粿', + 'ã`' => 'ç²¼', + 'ãa' => '粺', + 'ãb' => 'ç¶§', + 'ãc' => 'ç¶·', + 'ãd' => 'ç·‚', + 'ãe' => 'ç¶£', + 'ãf' => '綪', + 'ãg' => 'ç·', + 'ãh' => 'ç·€', + 'ãi' => 'ç·…', + 'ãj' => 'ç¶', + 'ãk' => 'ç·Ž', + 'ãl' => 'ç·„', + 'ãm' => 'ç·†', + 'ãn' => 'ç·‹', + 'ão' => 'ç·Œ', + 'ãp' => '綯', + 'ãq' => 'ç¶¹', + 'ãr' => 'ç¶–', + 'ãs' => 'ç¶¼', + 'ãt' => 'ç¶Ÿ', + 'ãu' => '綦', + 'ãv' => 'ç¶®', + 'ãw' => 'ç¶©', + 'ãx' => 'ç¶¡', + 'ãy' => 'ç·‰', + 'ãz' => 'ç½³', + 'ã{' => 'ç¿¢', + 'ã|' => 'ç¿£', + 'ã}' => 'ç¿¥', + 'ã~' => '翞', + 'ã¡' => '耤', + 'ã¢' => 'è', + 'ã£' => 'èœ', + 'ã¤' => '膉', + 'ã¥' => '膆', + 'ã¦' => '膃', + 'ã§' => '膇', + 'ã¨' => 'è†', + 'ã©' => '膌', + 'ãª' => '膋', + 'ã«' => '舕', + 'ã¬' => 'è’—', + 'ã­' => 'è’¤', + 'ã®' => 'è’¡', + 'ã¯' => 'è’Ÿ', + 'ã°' => 'è’º', + 'ã±' => '蓎', + 'ã²' => 'è“‚', + 'ã³' => 'è’¬', + 'ã´' => 'è’®', + 'ãµ' => 'è’«', + 'ã¶' => 'è’¹', + 'ã·' => 'è’´', + 'ã¸' => 'è“', + 'ã¹' => 'è“', + 'ãº' => 'è’ª', + 'ã»' => 'è’š', + 'ã¼' => 'è’±', + 'ã½' => 'è“', + 'ã¾' => 'è’', + 'ã¿' => 'è’§', + 'ãÀ' => 'è’»', + 'ãÁ' => 'è’¢', + 'ãÂ' => 'è’”', + 'ãÃ' => '蓇', + 'ãÄ' => '蓌', + 'ãÅ' => 'è’›', + 'ãÆ' => 'è’©', + 'ãÇ' => 'è’¯', + 'ãÈ' => 'è’¨', + 'ãÉ' => 'è“–', + 'ãÊ' => 'è’˜', + 'ãË' => 'è’¶', + 'ãÌ' => 'è“', + 'ãÍ' => 'è’ ', + 'ãÎ' => 'è“—', + 'ãÏ' => 'è“”', + 'ãÐ' => 'è“’', + 'ãÑ' => 'è“›', + 'ãÒ' => 'è’°', + 'ãÓ' => 'è’‘', + 'ãÔ' => '虡', + 'ãÕ' => '蜳', + 'ãÖ' => '蜣', + 'ã×' => '蜨', + 'ãØ' => 'è«', + 'ãÙ' => 'è€', + 'ãÚ' => '蜮', + 'ãÛ' => '蜞', + 'ãÜ' => '蜡', + 'ãÝ' => '蜙', + 'ãÞ' => '蜛', + 'ãß' => 'èƒ', + 'ãà' => '蜬', + 'ãá' => 'è', + 'ãâ' => '蜾', + 'ãã' => 'è†', + 'ãä' => '蜠', + 'ãå' => '蜲', + 'ãæ' => '蜪', + 'ãç' => '蜭', + 'ãè' => '蜼', + 'ãé' => '蜒', + 'ãê' => '蜺', + 'ãë' => '蜱', + 'ãì' => '蜵', + 'ãí' => 'è‚', + 'ãî' => '蜦', + 'ãï' => '蜧', + 'ãð' => '蜸', + 'ãñ' => '蜤', + 'ãò' => '蜚', + 'ãó' => '蜰', + 'ãô' => '蜑', + 'ãõ' => '裷', + 'ãö' => '裧', + 'ã÷' => '裱', + 'ãø' => '裲', + 'ãù' => '裺', + 'ãú' => '裾', + 'ãû' => '裮', + 'ãü' => '裼', + 'ãý' => '裶', + 'ãþ' => '裻', + 'ä@' => '裰', + 'äA' => '裬', + 'äB' => '裫', + 'äC' => 'è¦', + 'äD' => '覡', + 'äE' => '覟', + 'äF' => '覞', + 'äG' => 'è§©', + 'äH' => 'è§«', + 'äI' => '觨', + 'äJ' => '誫', + 'äK' => '誙', + 'äL' => '誋', + 'äM' => '誒', + 'äN' => 'èª', + 'äO' => '誖', + 'äP' => 'è°½', + 'äQ' => '豨', + 'äR' => '豩', + 'äS' => '賕', + 'äT' => 'è³', + 'äU' => 'è³—', + 'äV' => 'è¶–', + 'äW' => '踉', + 'äX' => '踂', + 'äY' => 'è·¿', + 'äZ' => 'è¸', + 'ä[' => 'è·½', + 'ä\\' => '踊', + 'ä]' => '踃', + 'ä^' => '踇', + 'ä_' => '踆', + 'ä`' => '踅', + 'äa' => 'è·¾', + 'äb' => '踀', + 'äc' => '踄', + 'äd' => 'è¼', + 'äe' => '輑', + 'äf' => '輎', + 'äg' => 'è¼', + 'äh' => 'é„£', + 'äi' => '鄜', + 'äj' => 'é„ ', + 'äk' => 'é„¢', + 'äl' => '鄟', + 'äm' => 'é„', + 'än' => '鄚', + 'äo' => '鄤', + 'äp' => 'é„¡', + 'äq' => 'é„›', + 'är' => 'é…º', + 'äs' => 'é…²', + 'ät' => 'é…¹', + 'äu' => 'é…³', + 'äv' => '銥', + 'äw' => '銤', + 'äx' => '鉶', + 'äy' => '銛', + 'äz' => '鉺', + 'ä{' => '銠', + 'ä|' => '銔', + 'ä}' => '銪', + 'ä~' => 'éŠ', + 'ä¡' => '銦', + 'ä¢' => '銚', + 'ä£' => '銫', + 'ä¤' => '鉹', + 'ä¥' => '銗', + 'ä¦' => '鉿', + 'ä§' => '銣', + 'ä¨' => 'é‹®', + 'ä©' => '銎', + 'äª' => '銂', + 'ä«' => '銕', + 'ä¬' => '銢', + 'ä­' => '鉽', + 'ä®' => '銈', + 'ä¯' => '銡', + 'ä°' => '銊', + 'ä±' => '銆', + 'ä²' => '銌', + 'ä³' => '銙', + 'ä´' => '銧', + 'äµ' => '鉾', + 'ä¶' => '銇', + 'ä·' => '銩', + 'ä¸' => 'éŠ', + 'ä¹' => '銋', + 'äº' => '鈭', + 'ä»' => 'éšž', + 'ä¼' => 'éš¡', + 'ä½' => '雿', + 'ä¾' => 'é˜', + 'ä¿' => 'é½', + 'äÀ' => 'éº', + 'äÁ' => 'é¾', + 'äÂ' => '鞃', + 'äÃ' => '鞀', + 'äÄ' => 'éž‚', + 'äÅ' => 'é»', + 'äÆ' => 'éž„', + 'äÇ' => 'éž', + 'äÈ' => 'é¿', + 'äÉ' => '韎', + 'äÊ' => 'éŸ', + 'äË' => 'é –', + 'äÌ' => '颭', + 'äÍ' => '颮', + 'äÎ' => '餂', + 'äÏ' => '餀', + 'äÐ' => '餇', + 'äÑ' => 'é¦', + 'äÒ' => '馜', + 'äÓ' => '駃', + 'äÔ' => '馹', + 'äÕ' => '馻', + 'äÖ' => '馺', + 'ä×' => 'é§‚', + 'äØ' => '馽', + 'äÙ' => '駇', + 'äÚ' => '骱', + 'äÛ' => 'é«£', + 'äÜ' => 'é«§', + 'äÝ' => '鬾', + 'äÞ' => '鬿', + 'äß' => 'é­ ', + 'äà' => 'é­¡', + 'äá' => 'é­Ÿ', + 'äâ' => 'é³±', + 'äã' => 'é³²', + 'ää' => 'é³µ', + 'äå' => '麧', + 'äæ' => '僿', + 'äç' => '儃', + 'äè' => 'å„°', + 'äé' => '僸', + 'äê' => '儆', + 'äë' => '儇', + 'äì' => '僶', + 'äí' => '僾', + 'äî' => 'å„‹', + 'äï' => '儌', + 'äð' => '僽', + 'äñ' => '儊', + 'äò' => '劋', + 'äó' => '劌', + 'äô' => '勱', + 'äõ' => '勯', + 'äö' => '噈', + 'ä÷' => '噂', + 'äø' => '噌', + 'äù' => '嘵', + 'äú' => 'å™', + 'äû' => '噊', + 'äü' => '噉', + 'äý' => '噆', + 'äþ' => '噘', + 'å@' => '噚', + 'åA' => '噀', + 'åB' => '嘳', + 'åC' => '嘽', + 'åD' => '嘬', + 'åE' => '嘾', + 'åF' => '嘸', + 'åG' => '嘪', + 'åH' => '嘺', + 'åI' => '圚', + 'åJ' => '墫', + 'åK' => 'å¢', + 'åL' => '墱', + 'åM' => '墠', + 'åN' => '墣', + 'åO' => '墯', + 'åP' => '墬', + 'åQ' => '墥', + 'åR' => '墡', + 'åS' => '壿', + 'åT' => 'å«¿', + 'åU' => 'å«´', + 'åV' => '嫽', + 'åW' => 'å«·', + 'åX' => 'å«¶', + 'åY' => '嬃', + 'åZ' => '嫸', + 'å[' => '嬂', + 'å\\' => '嫹', + 'å]' => 'å¬', + 'å^' => '嬇', + 'å_' => '嬅', + 'å`' => 'å¬', + 'åa' => 'å±§', + 'åb' => 'å¶™', + 'åc' => 'å¶—', + 'åd' => 'å¶Ÿ', + 'åe' => 'å¶’', + 'åf' => 'å¶¢', + 'åg' => 'å¶“', + 'åh' => 'å¶•', + 'åi' => 'å¶ ', + 'åj' => 'å¶œ', + 'åk' => 'å¶¡', + 'ål' => 'å¶š', + 'åm' => 'å¶ž', + 'ån' => '幩', + 'åo' => 'å¹', + 'åp' => 'å¹ ', + 'åq' => '幜', + 'år' => 'ç·³', + 'ås' => 'å»›', + 'åt' => '廞', + 'åu' => '廡', + 'åv' => '彉', + 'åw' => 'å¾²', + 'åx' => '憋', + 'åy' => '憃', + 'åz' => 'æ…¹', + 'å{' => '憱', + 'å|' => '憰', + 'å}' => '憢', + 'å~' => '憉', + 'å¡' => '憛', + 'å¢' => '憓', + 'å£' => '憯', + 'å¤' => '憭', + 'å¥' => '憟', + 'å¦' => '憒', + 'å§' => '憪', + 'å¨' => '憡', + 'å©' => 'æ†', + 'åª' => 'æ…¦', + 'å«' => '憳', + 'å¬' => '戭', + 'å­' => 'æ‘®', + 'å®' => 'æ‘°', + 'å¯' => 'æ’–', + 'å°' => 'æ’ ', + 'å±' => 'æ’…', + 'å²' => 'æ’—', + 'å³' => 'æ’œ', + 'å´' => 'æ’', + 'åµ' => 'æ’‹', + 'å¶' => 'æ’Š', + 'å·' => 'æ’Œ', + 'å¸' => 'æ’£', + 'å¹' => 'æ’Ÿ', + 'åº' => '摨', + 'å»' => 'æ’±', + 'å¼' => 'æ’˜', + 'å½' => 'æ•¶', + 'å¾' => '敺', + 'å¿' => '敹', + 'åÀ' => 'æ•»', + 'åÁ' => 'æ–²', + 'åÂ' => 'æ–³', + 'åÃ' => 'æšµ', + 'åÄ' => 'æš°', + 'åÅ' => 'æš©', + 'åÆ' => 'æš²', + 'åÇ' => 'æš·', + 'åÈ' => '暪', + 'åÉ' => '暯', + 'åÊ' => '樀', + 'åË' => '樆', + 'åÌ' => '樗', + 'åÍ' => 'æ§¥', + 'åÎ' => '槸', + 'åÏ' => '樕', + 'åÐ' => 'æ§±', + 'åÑ' => '槤', + 'åÒ' => '樠', + 'åÓ' => 'æ§¿', + 'åÔ' => '槬', + 'åÕ' => 'æ§¢', + 'åÖ' => '樛', + 'å×' => 'æ¨', + 'åØ' => 'æ§¾', + 'åÙ' => '樧', + 'åÚ' => 'æ§²', + 'åÛ' => 'æ§®', + 'åÜ' => '樔', + 'åÝ' => 'æ§·', + 'åÞ' => 'æ§§', + 'åß' => 'æ©€', + 'åà' => '樈', + 'åá' => '槦', + 'åâ' => 'æ§»', + 'åã' => 'æ¨', + 'åä' => 'æ§¼', + 'åå' => 'æ§«', + 'åæ' => '樉', + 'åç' => '樄', + 'åè' => '樘', + 'åé' => '樥', + 'åê' => 'æ¨', + 'åë' => 'æ§¶', + 'åì' => '樦', + 'åí' => '樇', + 'åî' => 'æ§´', + 'åï' => '樖', + 'åð' => 'æ­‘', + 'åñ' => '殥', + 'åò' => '殣', + 'åó' => '殢', + 'åô' => '殦', + 'åõ' => 'æ°', + 'åö' => 'æ°€', + 'å÷' => '毿', + 'åø' => 'æ°‚', + 'åù' => 'æ½', + 'åú' => '漦', + 'åû' => 'æ½¾', + 'åü' => '澇', + 'åý' => '濆', + 'åþ' => 'æ¾’', + 'æ@' => 'æ¾', + 'æA' => '澉', + 'æB' => '澌', + 'æC' => 'æ½¢', + 'æD' => 'æ½', + 'æE' => 'æ¾…', + 'æF' => '潚', + 'æG' => 'æ¾–', + 'æH' => 'æ½¶', + 'æI' => '潬', + 'æJ' => '澂', + 'æK' => '潕', + 'æL' => 'æ½²', + 'æM' => 'æ½’', + 'æN' => 'æ½', + 'æO' => 'æ½—', + 'æP' => 'æ¾”', + 'æQ' => '澓', + 'æR' => 'æ½', + 'æS' => 'æ¼€', + 'æT' => '潡', + 'æU' => '潫', + 'æV' => 'æ½½', + 'æW' => 'æ½§', + 'æX' => 'æ¾', + 'æY' => '潓', + 'æZ' => '澋', + 'æ[' => '潩', + 'æ\\' => '潿', + 'æ]' => '澕', + 'æ^' => 'æ½£', + 'æ_' => 'æ½·', + 'æ`' => '潪', + 'æa' => 'æ½»', + 'æb' => '熲', + 'æc' => '熯', + 'æd' => '熛', + 'æe' => '熰', + 'æf' => '熠', + 'æg' => '熚', + 'æh' => '熩', + 'æi' => '熵', + 'æj' => 'ç†', + 'æk' => '熥', + 'æl' => '熞', + 'æm' => '熤', + 'æn' => '熡', + 'æo' => '熪', + 'æp' => '熜', + 'æq' => '熧', + 'ær' => '熳', + 'æs' => '犘', + 'æt' => '犚', + 'æu' => 'ç˜', + 'æv' => 'ç’', + 'æw' => 'çž', + 'æx' => 'çŸ', + 'æy' => 'ç ', + 'æz' => 'ç', + 'æ{' => 'ç›', + 'æ|' => 'ç¡', + 'æ}' => 'çš', + 'æ~' => 'ç™', + 'æ¡' => 'ç¢', + 'æ¢' => 'ç’‡', + 'æ£' => 'ç’‰', + 'æ¤' => 'ç’Š', + 'æ¥' => 'ç’†', + 'æ¦' => 'ç’', + 'æ§' => '瑽', + 'æ¨' => 'ç’…', + 'æ©' => 'ç’ˆ', + 'æª' => '瑼', + 'æ«' => '瑹', + 'æ¬' => '甈', + 'æ­' => '甇', + 'æ®' => '畾', + 'æ¯' => '瘥', + 'æ°' => '瘞', + 'æ±' => '瘙', + 'æ²' => 'ç˜', + 'æ³' => '瘜', + 'æ´' => '瘣', + 'æµ' => '瘚', + 'æ¶' => '瘨', + 'æ·' => '瘛', + 'æ¸' => 'çšœ', + 'æ¹' => 'çš', + 'æº' => 'çšž', + 'æ»' => 'çš›', + 'æ¼' => 'çž', + 'æ½' => 'çž', + 'æ¾' => '瞉', + 'æ¿' => '瞈', + 'æÀ' => 'ç£', + 'æÁ' => '碻', + 'æÂ' => 'ç£', + 'æÃ' => '磌', + 'æÄ' => '磑', + 'æÅ' => '磎', + 'æÆ' => '磔', + 'æÇ' => '磈', + 'æÈ' => '磃', + 'æÉ' => '磄', + 'æÊ' => '磉', + 'æË' => '禚', + 'æÌ' => '禡', + 'æÍ' => '禠', + 'æÎ' => '禜', + 'æÏ' => '禢', + 'æÐ' => '禛', + 'æÑ' => 'æ­¶', + 'æÒ' => '稹', + 'æÓ' => '窲', + 'æÔ' => '窴', + 'æÕ' => '窳', + 'æÖ' => 'ç®·', + 'æ×' => '篋', + 'æØ' => '箾', + 'æÙ' => '箬', + 'æÚ' => '篎', + 'æÛ' => '箯', + 'æÜ' => '箹', + 'æÝ' => '篊', + 'æÞ' => '箵', + 'æß' => 'ç³…', + 'æà' => '糈', + 'æá' => '糌', + 'æâ' => '糋', + 'æã' => 'ç··', + 'æä' => 'ç·›', + 'æå' => 'ç·ª', + 'ææ' => 'ç·§', + 'æç' => 'ç·—', + 'æè' => 'ç·¡', + 'æé' => '縃', + 'æê' => 'ç·º', + 'æë' => 'ç·¦', + 'æì' => 'ç·¶', + 'æí' => 'ç·±', + 'æî' => 'ç·°', + 'æï' => 'ç·®', + 'æð' => 'ç·Ÿ', + 'æñ' => 'ç½¶', + 'æò' => '羬', + 'æó' => 'ç¾°', + 'æô' => 'ç¾­', + 'æõ' => 'ç¿­', + 'æö' => 'ç¿«', + 'æ÷' => '翪', + 'æø' => '翬', + 'æù' => '翦', + 'æú' => '翨', + 'æû' => 'è¤', + 'æü' => 'è§', + 'æý' => '膣', + 'æþ' => '膟', + 'ç@' => '膞', + 'çA' => '膕', + 'çB' => '膢', + 'çC' => '膙', + 'çD' => '膗', + 'çE' => '舖', + 'çF' => 'è‰', + 'çG' => '艓', + 'çH' => '艒', + 'çI' => 'è‰', + 'çJ' => '艎', + 'çK' => '艑', + 'çL' => '蔤', + 'çM' => 'è”»', + 'çN' => 'è”', + 'çO' => '蔀', + 'çP' => '蔩', + 'çQ' => '蔎', + 'çR' => '蔉', + 'çS' => 'è”', + 'çT' => '蔟', + 'çU' => '蔊', + 'çV' => 'è”§', + 'çW' => '蔜', + 'çX' => 'è“»', + 'çY' => '蔫', + 'çZ' => '蓺', + 'ç[' => '蔈', + 'ç\\' => '蔌', + 'ç]' => 'è“´', + 'ç^' => '蔪', + 'ç_' => '蓲', + 'ç`' => '蔕', + 'ça' => 'è“·', + 'çb' => 'è“«', + 'çc' => '蓳', + 'çd' => '蓼', + 'çe' => 'è”’', + 'çf' => '蓪', + 'çg' => 'è“©', + 'çh' => 'è”–', + 'çi' => '蓾', + 'çj' => '蔨', + 'çk' => 'è”', + 'çl' => 'è”®', + 'çm' => '蔂', + 'çn' => '蓽', + 'ço' => '蔞', + 'çp' => 'è“¶', + 'çq' => 'è”±', + 'çr' => '蔦', + 'çs' => 'è“§', + 'çt' => '蓨', + 'çu' => 'è“°', + 'çv' => '蓯', + 'çw' => '蓹', + 'çx' => '蔘', + 'çy' => 'è” ', + 'çz' => 'è”°', + 'ç{' => '蔋', + 'ç|' => 'è”™', + 'ç}' => '蔯', + 'ç~' => '虢', + 'ç¡' => 'è–', + 'ç¢' => 'è£', + 'ç£' => 'è¤', + 'ç¤' => 'è·', + 'ç¥' => '蟡', + 'ç¦' => 'è³', + 'ç§' => 'è˜', + 'ç¨' => 'è”', + 'ç©' => 'è›', + 'çª' => 'è’', + 'ç«' => 'è¡', + 'ç¬' => 'èš', + 'ç­' => 'è‘', + 'ç®' => 'èž', + 'ç¯' => 'è­', + 'ç°' => 'èª', + 'ç±' => 'è', + 'ç²' => 'èŽ', + 'ç³' => 'èŸ', + 'ç´' => 'è', + 'çµ' => 'è¯', + 'ç¶' => 'è¬', + 'ç·' => 'èº', + 'ç¸' => 'è®', + 'ç¹' => 'èœ', + 'çº' => 'è¥', + 'ç»' => 'è', + 'ç¼' => 'è»', + 'ç½' => 'èµ', + 'ç¾' => 'è¢', + 'ç¿' => 'è§', + 'çÀ' => 'è©', + 'çÁ' => '衚', + 'çÂ' => '褅', + 'çÃ' => '褌', + 'çÄ' => '褔', + 'çÅ' => '褋', + 'çÆ' => '褗', + 'çÇ' => '褘', + 'çÈ' => '褙', + 'çÉ' => '褆', + 'çÊ' => '褖', + 'çË' => '褑', + 'çÌ' => '褎', + 'çÍ' => '褉', + 'çÎ' => '覢', + 'çÏ' => '覤', + 'çÐ' => '覣', + 'çÑ' => 'è§­', + 'çÒ' => 'è§°', + 'çÓ' => '觬', + 'çÔ' => 'è«', + 'çÕ' => '諆', + 'çÖ' => '誸', + 'ç×' => 'è«“', + 'çØ' => 'è«‘', + 'çÙ' => 'è«”', + 'çÚ' => 'è«•', + 'çÛ' => '誻', + 'çÜ' => 'è«—', + 'çÝ' => '誾', + 'çÞ' => 'è«€', + 'çß' => 'è«…', + 'çà' => '諘', + 'çá' => '諃', + 'çâ' => '誺', + 'çã' => '誽', + 'çä' => 'è«™', + 'çå' => 'è°¾', + 'çæ' => 'è±', + 'çç' => 'è²', + 'çè' => 'è³¥', + 'çé' => '賟', + 'çê' => 'è³™', + 'çë' => '賨', + 'çì' => '賚', + 'çí' => 'è³', + 'çî' => 'è³§', + 'çï' => 'è¶ ', + 'çð' => 'è¶œ', + 'çñ' => 'è¶¡', + 'çò' => 'è¶›', + 'çó' => '踠', + 'çô' => '踣', + 'çõ' => '踥', + 'çö' => '踤', + 'ç÷' => '踮', + 'çø' => '踕', + 'çù' => '踛', + 'çú' => '踖', + 'çû' => '踑', + 'çü' => '踙', + 'çý' => '踦', + 'çþ' => '踧', + 'è@' => '踔', + 'èA' => '踒', + 'èB' => '踘', + 'èC' => '踓', + 'èD' => '踜', + 'èE' => '踗', + 'èF' => '踚', + 'èG' => '輬', + 'èH' => '輤', + 'èI' => '輘', + 'èJ' => '輚', + 'èK' => 'è¼ ', + 'èL' => 'è¼£', + 'èM' => 'è¼–', + 'èN' => 'è¼—', + 'èO' => 'é³', + 'èP' => 'é°', + 'èQ' => 'é¯', + 'èR' => 'é§', + 'èS' => 'é«', + 'èT' => '鄯', + 'èU' => 'é„«', + 'èV' => 'é„©', + 'èW' => '鄪', + 'èX' => '鄲', + 'èY' => '鄦', + 'èZ' => 'é„®', + 'è[' => '醅', + 'è\\' => '醆', + 'è]' => '醊', + 'è^' => 'é†', + 'è_' => '醂', + 'è`' => '醄', + 'èa' => '醀', + 'èb' => 'é‹', + 'èc' => '鋃', + 'èd' => 'é‹„', + 'èe' => 'é‹€', + 'èf' => 'é‹™', + 'èg' => '銶', + 'èh' => 'é‹', + 'èi' => '鋱', + 'èj' => '鋟', + 'èk' => '鋘', + 'èl' => 'é‹©', + 'èm' => 'é‹—', + 'èn' => 'é‹', + 'èo' => '鋌', + 'èp' => '鋯', + 'èq' => 'é‹‚', + 'èr' => '鋨', + 'ès' => '鋊', + 'èt' => '鋈', + 'èu' => '鋎', + 'èv' => '鋦', + 'èw' => 'é‹', + 'èx' => 'é‹•', + 'èy' => '鋉', + 'èz' => 'é‹ ', + 'è{' => '鋞', + 'è|' => 'é‹§', + 'è}' => 'é‹‘', + 'è~' => 'é‹“', + 'è¡' => '銵', + 'è¢' => 'é‹¡', + 'è£' => '鋆', + 'è¤' => '銴', + 'è¥' => '镼', + 'è¦' => 'é–¬', + 'è§' => 'é–«', + 'è¨' => 'é–®', + 'è©' => 'é–°', + 'èª' => '隤', + 'è«' => '隢', + 'è¬' => '雓', + 'è­' => '霅', + 'è®' => '霈', + 'è¯' => '霂', + 'è°' => 'éš', + 'è±' => '鞊', + 'è²' => '鞎', + 'è³' => '鞈', + 'è´' => 'éŸ', + 'èµ' => 'éŸ', + 'è¶' => 'é ž', + 'è·' => 'é ', + 'è¸' => 'é ¦', + 'è¹' => 'é ©', + 'èº' => 'é ¨', + 'è»' => 'é  ', + 'è¼' => 'é ›', + 'è½' => 'é §', + 'è¾' => '颲', + 'è¿' => '餈', + 'èÀ' => '飺', + 'èÁ' => '餑', + 'èÂ' => '餔', + 'èÃ' => '餖', + 'èÄ' => '餗', + 'èÅ' => '餕', + 'èÆ' => 'é§œ', + 'èÇ' => 'é§', + 'èÈ' => 'é§', + 'èÉ' => 'é§“', + 'èÊ' => 'é§”', + 'èË' => 'é§Ž', + 'èÌ' => '駉', + 'èÍ' => 'é§–', + 'èÎ' => '駘', + 'èÏ' => 'é§‹', + 'èÐ' => 'é§—', + 'èÑ' => 'é§Œ', + 'èÒ' => '骳', + 'èÓ' => '髬', + 'èÔ' => 'é««', + 'èÕ' => '髳', + 'èÖ' => '髲', + 'è×' => '髱', + 'èØ' => 'é­†', + 'èÙ' => 'é­ƒ', + 'èÚ' => 'é­§', + 'èÛ' => 'é­´', + 'èÜ' => 'é­±', + 'èÝ' => 'é­¦', + 'èÞ' => 'é­¶', + 'èß' => 'é­µ', + 'èà' => 'é­°', + 'èá' => 'é­¨', + 'èâ' => 'é­¤', + 'èã' => 'é­¬', + 'èä' => 'é³¼', + 'èå' => '鳺', + 'èæ' => 'é³½', + 'èç' => '鳿', + 'èè' => 'é³·', + 'èé' => 'é´‡', + 'èê' => 'é´€', + 'èë' => 'é³¹', + 'èì' => 'é³»', + 'èí' => 'é´ˆ', + 'èî' => 'é´…', + 'èï' => 'é´„', + 'èð' => '麃', + 'èñ' => '黓', + 'èò' => 'é¼', + 'èó' => 'é¼', + 'èô' => '儜', + 'èõ' => 'å„“', + 'èö' => 'å„—', + 'è÷' => '儚', + 'èø' => 'å„‘', + 'èù' => '凞', + 'èú' => '匴', + 'èû' => 'å¡', + 'èü' => 'å™°', + 'èý' => 'å™ ', + 'èþ' => 'å™®', + 'é@' => '噳', + 'éA' => '噦', + 'éB' => '噣', + 'éC' => 'å™­', + 'éD' => '噲', + 'éE' => '噞', + 'éF' => 'å™·', + 'éG' => '圜', + 'éH' => '圛', + 'éI' => '壈', + 'éJ' => '墽', + 'éK' => '壉', + 'éL' => '墿', + 'éM' => '墺', + 'éN' => '壂', + 'éO' => '墼', + 'éP' => '壆', + 'éQ' => '嬗', + 'éR' => '嬙', + 'éS' => '嬛', + 'éT' => '嬡', + 'éU' => '嬔', + 'éV' => '嬓', + 'éW' => 'å¬', + 'éX' => '嬖', + 'éY' => '嬨', + 'éZ' => '嬚', + 'é[' => '嬠', + 'é\\' => '嬞', + 'é]' => '寯', + 'é^' => '嶬', + 'é_' => 'å¶±', + 'é`' => 'å¶©', + 'éa' => 'å¶§', + 'éb' => 'å¶µ', + 'éc' => 'å¶°', + 'éd' => 'å¶®', + 'ée' => '嶪', + 'éf' => '嶨', + 'ég' => 'å¶²', + 'éh' => 'å¶­', + 'éi' => '嶯', + 'éj' => 'å¶´', + 'ék' => 'å¹§', + 'él' => '幨', + 'ém' => '幦', + 'én' => '幯', + 'éo' => '廩', + 'ép' => 'å»§', + 'éq' => '廦', + 'ér' => '廨', + 'és' => '廥', + 'ét' => '彋', + 'éu' => 'å¾¼', + 'év' => 'æ†', + 'éw' => '憨', + 'éx' => '憖', + 'éy' => '懅', + 'éz' => '憴', + 'é{' => '懆', + 'é|' => 'æ‡', + 'é}' => '懌', + 'é~' => '憺', + 'é¡' => '憿', + 'é¢' => '憸', + 'é£' => '憌', + 'é¤' => 'æ“—', + 'é¥' => 'æ“–', + 'é¦' => 'æ“', + 'é§' => 'æ“', + 'é¨' => '擉', + 'é©' => 'æ’½', + 'éª' => 'æ’‰', + 'é«' => '擃', + 'é¬' => 'æ“›', + 'é­' => '擳', + 'é®' => 'æ“™', + 'é¯' => '攳', + 'é°' => 'æ•¿', + 'é±' => '敼', + 'é²' => 'æ–¢', + 'é³' => '曈', + 'é´' => 'æš¾', + 'éµ' => '曀', + 'é¶' => '曊', + 'é·' => '曋', + 'é¸' => 'æ›', + 'é¹' => 'æš½', + 'éº' => 'æš»', + 'é»' => '暺', + 'é¼' => '曌', + 'é½' => '朣', + 'é¾' => '樴', + 'é¿' => '橦', + 'éÀ' => '橉', + 'éÁ' => 'æ©§', + 'éÂ' => '樲', + 'éÃ' => '橨', + 'éÄ' => '樾', + 'éÅ' => 'æ©', + 'éÆ' => 'æ©­', + 'éÇ' => 'æ©¶', + 'éÈ' => 'æ©›', + 'éÉ' => 'æ©‘', + 'éÊ' => '樨', + 'éË' => '橚', + 'éÌ' => '樻', + 'éÍ' => '樿', + 'éÎ' => 'æ©', + 'éÏ' => '橪', + 'éÐ' => '橤', + 'éÑ' => 'æ©', + 'éÒ' => 'æ©', + 'éÓ' => 'æ©”', + 'éÔ' => '橯', + 'éÕ' => 'æ©©', + 'éÖ' => 'æ© ', + 'é×' => '樼', + 'éØ' => '橞', + 'éÙ' => 'æ©–', + 'éÚ' => 'æ©•', + 'éÛ' => 'æ©', + 'éÜ' => '橎', + 'éÝ' => '橆', + 'éÞ' => 'æ­•', + 'éß' => 'æ­”', + 'éà' => 'æ­–', + 'éá' => 'æ®§', + 'éâ' => '殪', + 'éã' => '殫', + 'éä' => '毈', + 'éå' => '毇', + 'éæ' => 'æ°„', + 'éç' => 'æ°ƒ', + 'éè' => 'æ°†', + 'éé' => 'æ¾­', + 'éê' => 'æ¿‹', + 'éë' => 'æ¾£', + 'éì' => '濇', + 'éí' => 'æ¾¼', + 'éî' => '濎', + 'éï' => '濈', + 'éð' => '潞', + 'éñ' => 'æ¿„', + 'éò' => 'æ¾½', + 'éó' => '澞', + 'éô' => '濊', + 'éõ' => '澨', + 'éö' => '瀄', + 'é÷' => 'æ¾¥', + 'éø' => 'æ¾®', + 'éù' => '澺', + 'éú' => '澬', + 'éû' => '澪', + 'éü' => 'æ¿', + 'éý' => '澿', + 'éþ' => '澸', + 'ê@' => 'æ¾¢', + 'êA' => '濉', + 'êB' => '澫', + 'êC' => 'æ¿', + 'êD' => '澯', + 'êE' => 'æ¾²', + 'êF' => 'æ¾°', + 'êG' => '燅', + 'êH' => '燂', + 'êI' => '熿', + 'êJ' => '熸', + 'êK' => '燖', + 'êL' => '燀', + 'êM' => 'ç‡', + 'êN' => '燋', + 'êO' => '燔', + 'êP' => '燊', + 'êQ' => '燇', + 'êR' => 'ç‡', + 'êS' => '熽', + 'êT' => '燘', + 'êU' => '熼', + 'êV' => '燆', + 'êW' => '燚', + 'êX' => '燛', + 'êY' => 'çŠ', + 'êZ' => '犞', + 'ê[' => 'ç©', + 'ê\\' => 'ç¦', + 'ê]' => 'ç§', + 'ê^' => 'ç¬', + 'ê_' => 'ç¥', + 'ê`' => 'ç«', + 'êa' => 'çª', + 'êb' => 'ç‘¿', + 'êc' => 'ç’š', + 'êd' => 'ç’ ', + 'êe' => 'ç’”', + 'êf' => 'ç’’', + 'êg' => 'ç’•', + 'êh' => 'ç’¡', + 'êi' => '甋', + 'êj' => 'ç–€', + 'êk' => '瘯', + 'êl' => '瘭', + 'êm' => '瘱', + 'ên' => '瘽', + 'êo' => '瘳', + 'êp' => '瘼', + 'êq' => '瘵', + 'êr' => '瘲', + 'ês' => '瘰', + 'êt' => 'çš»', + 'êu' => '盦', + 'êv' => 'çžš', + 'êw' => 'çž', + 'êx' => 'çž¡', + 'êy' => 'çžœ', + 'êz' => 'çž›', + 'ê{' => '瞢', + 'ê|' => '瞣', + 'ê}' => 'çž•', + 'ê~' => 'çž™', + 'ê¡' => 'çž—', + 'ê¢' => 'ç£', + 'ê£' => '磩', + 'ê¤' => '磥', + 'ê¥' => '磪', + 'ê¦' => '磞', + 'ê§' => '磣', + 'ê¨' => '磛', + 'ê©' => '磡', + 'êª' => '磢', + 'ê«' => '磭', + 'ê¬' => '磟', + 'ê­' => '磠', + 'ê®' => '禤', + 'ê¯' => 'ç©„', + 'ê°' => '穈', + 'ê±' => '穇', + 'ê²' => '窶', + 'ê³' => '窸', + 'ê´' => '窵', + 'êµ' => '窱', + 'ê¶' => '窷', + 'ê·' => '篞', + 'ê¸' => '篣', + 'ê¹' => '篧', + 'êº' => 'ç¯', + 'ê»' => '篕', + 'ê¼' => '篥', + 'ê½' => '篚', + 'ê¾' => '篨', + 'ê¿' => '篹', + 'êÀ' => '篔', + 'êÁ' => '篪', + 'êÂ' => '篢', + 'êÃ' => '篜', + 'êÄ' => '篫', + 'êÅ' => '篘', + 'êÆ' => '篟', + 'êÇ' => 'ç³’', + 'êÈ' => 'ç³”', + 'êÉ' => 'ç³—', + 'êÊ' => 'ç³', + 'êË' => '糑', + 'êÌ' => '縒', + 'êÍ' => '縡', + 'êÎ' => '縗', + 'êÏ' => '縌', + 'êÐ' => '縟', + 'êÑ' => '縠', + 'êÒ' => '縓', + 'êÓ' => '縎', + 'êÔ' => '縜', + 'êÕ' => '縕', + 'êÖ' => '縚', + 'ê×' => '縢', + 'êØ' => '縋', + 'êÙ' => 'ç¸', + 'êÚ' => '縖', + 'êÛ' => 'ç¸', + 'êÜ' => '縔', + 'êÝ' => '縥', + 'êÞ' => '縤', + 'êß' => '罃', + 'êà' => 'ç½»', + 'êá' => 'ç½¼', + 'êâ' => '罺', + 'êã' => 'ç¾±', + 'êä' => '翯', + 'êå' => '耪', + 'êæ' => '耩', + 'êç' => 'è¬', + 'êè' => '膱', + 'êé' => '膦', + 'êê' => '膮', + 'êë' => '膹', + 'êì' => '膵', + 'êí' => '膫', + 'êî' => '膰', + 'êï' => '膬', + 'êð' => '膴', + 'êñ' => '膲', + 'êò' => '膷', + 'êó' => '膧', + 'êô' => '臲', + 'êõ' => '艕', + 'êö' => '艖', + 'ê÷' => '艗', + 'êø' => 'è•–', + 'êù' => 'è•…', + 'êú' => 'è•«', + 'êû' => 'è•', + 'êü' => 'è•“', + 'êý' => 'è•¡', + 'êþ' => '蕘', + 'ë@' => 'è•€', + 'ëA' => '蕆', + 'ëB' => '蕤', + 'ëC' => 'è•', + 'ëD' => 'è•¢', + 'ëE' => 'è•„', + 'ëF' => 'è•‘', + 'ëG' => '蕇', + 'ëH' => 'è•£', + 'ëI' => '蔾', + 'ëJ' => 'è•›', + 'ëK' => '蕱', + 'ëL' => '蕎', + 'ëM' => 'è•®', + 'ëN' => '蕵', + 'ëO' => 'è••', + 'ëP' => 'è•§', + 'ëQ' => 'è• ', + 'ëR' => 'è–Œ', + 'ëS' => '蕦', + 'ëT' => 'è•', + 'ëU' => 'è•”', + 'ëV' => 'è•¥', + 'ëW' => '蕬', + 'ëX' => '虣', + 'ëY' => '虥', + 'ëZ' => '虤', + 'ë[' => 'èž›', + 'ë\\' => 'èž', + 'ë]' => 'èž—', + 'ë^' => 'èž“', + 'ë_' => 'èž’', + 'ë`' => '螈', + 'ëa' => 'èž', + 'ëb' => 'èž–', + 'ëc' => '螘', + 'ëd' => 'è¹', + 'ëe' => '螇', + 'ëf' => '螣', + 'ëg' => 'èž…', + 'ëh' => 'èž', + 'ëi' => 'èž‘', + 'ëj' => 'èž', + 'ëk' => 'èž„', + 'ël' => 'èž”', + 'ëm' => 'èžœ', + 'ën' => 'èžš', + 'ëo' => '螉', + 'ëp' => '褞', + 'ëq' => '褦', + 'ër' => '褰', + 'ës' => '褭', + 'ët' => '褮', + 'ëu' => '褧', + 'ëv' => '褱', + 'ëw' => '褢', + 'ëx' => '褩', + 'ëy' => '褣', + 'ëz' => '褯', + 'ë{' => '褬', + 'ë|' => '褟', + 'ë}' => 'è§±', + 'ë~' => 'è« ', + 'ë¡' => 'è«¢', + 'ë¢' => '諲', + 'ë£' => 'è«´', + 'ë¤' => '諵', + 'ë¥' => 'è«', + 'ë¦' => '謔', + 'ë§' => '諤', + 'ë¨' => '諟', + 'ë©' => 'è«°', + 'ëª' => '諈', + 'ë«' => '諞', + 'ë¬' => 'è«¡', + 'ë­' => '諨', + 'ë®' => 'è«¿', + 'ë¯' => '諯', + 'ë°' => 'è«»', + 'ë±' => '貑', + 'ë²' => 'è²’', + 'ë³' => 'è²', + 'ë´' => 'è³µ', + 'ëµ' => 'è³®', + 'ë¶' => 'è³±', + 'ë·' => 'è³°', + 'ë¸' => 'è³³', + 'ë¹' => '赬', + 'ëº' => 'èµ®', + 'ë»' => 'è¶¥', + 'ë¼' => 'è¶§', + 'ë½' => '踳', + 'ë¾' => '踾', + 'ë¿' => '踸', + 'ëÀ' => 'è¹€', + 'ëÁ' => 'è¹…', + 'ëÂ' => '踶', + 'ëÃ' => '踼', + 'ëÄ' => '踽', + 'ëÅ' => 'è¹', + 'ëÆ' => '踰', + 'ëÇ' => '踿', + 'ëÈ' => '躽', + 'ëÉ' => 'è¼¶', + 'ëÊ' => 'è¼®', + 'ëË' => 'è¼µ', + 'ëÌ' => 'è¼²', + 'ëÍ' => 'è¼¹', + 'ëÎ' => 'è¼·', + 'ëÏ' => 'è¼´', + 'ëÐ' => 'é¶', + 'ëÑ' => 'é¹', + 'ëÒ' => 'é»', + 'ëÓ' => '邆', + 'ëÔ' => '郺', + 'ëÕ' => '鄳', + 'ëÖ' => '鄵', + 'ë×' => 'é„¶', + 'ëØ' => '醓', + 'ëÙ' => 'é†', + 'ëÚ' => '醑', + 'ëÛ' => 'é†', + 'ëÜ' => 'é†', + 'ëÝ' => '錧', + 'ëÞ' => '錞', + 'ëß' => '錈', + 'ëà' => '錟', + 'ëá' => '錆', + 'ëâ' => 'éŒ', + 'ëã' => 'éº', + 'ëä' => '錸', + 'ëå' => '錼', + 'ëæ' => '錛', + 'ëç' => '錣', + 'ëè' => '錒', + 'ëé' => 'éŒ', + 'ëê' => 'é†', + 'ëë' => '錭', + 'ëì' => '錎', + 'ëí' => 'éŒ', + 'ëî' => 'é‹‹', + 'ëï' => 'éŒ', + 'ëð' => '鋺', + 'ëñ' => '錥', + 'ëò' => '錓', + 'ëó' => '鋹', + 'ëô' => 'é‹·', + 'ëõ' => '錴', + 'ëö' => '錂', + 'ë÷' => '錤', + 'ëø' => 'é‹¿', + 'ëù' => '錩', + 'ëú' => '錹', + 'ëû' => '錵', + 'ëü' => '錪', + 'ëý' => '錔', + 'ëþ' => '錌', + 'ì@' => '錋', + 'ìA' => '鋾', + 'ìB' => '錉', + 'ìC' => '錀', + 'ìD' => 'é‹»', + 'ìE' => '錖', + 'ìF' => 'é–¼', + 'ìG' => 'é—', + 'ìH' => 'é–¾', + 'ìI' => 'é–¹', + 'ìJ' => 'é–º', + 'ìK' => 'é–¶', + 'ìL' => 'é–¿', + 'ìM' => 'é–µ', + 'ìN' => 'é–½', + 'ìO' => 'éš©', + 'ìP' => 'é›”', + 'ìQ' => '霋', + 'ìR' => '霒', + 'ìS' => 'éœ', + 'ìT' => 'éž™', + 'ìU' => 'éž—', + 'ìV' => 'éž”', + 'ìW' => '韰', + 'ìX' => '韸', + 'ìY' => 'é µ', + 'ìZ' => 'é ¯', + 'ì[' => 'é ²', + 'ì\\' => '餤', + 'ì]' => '餟', + 'ì^' => '餧', + 'ì_' => '餩', + 'ì`' => '馞', + 'ìa' => 'é§®', + 'ìb' => '駬', + 'ìc' => 'é§¥', + 'ìd' => '駤', + 'ìe' => 'é§°', + 'ìf' => 'é§£', + 'ìg' => '駪', + 'ìh' => 'é§©', + 'ìi' => 'é§§', + 'ìj' => '骹', + 'ìk' => '骿', + 'ìl' => '骴', + 'ìm' => '骻', + 'ìn' => 'é«¶', + 'ìo' => '髺', + 'ìp' => '髹', + 'ìq' => 'é«·', + 'ìr' => '鬳', + 'ìs' => '鮀', + 'ìt' => 'é®…', + 'ìu' => '鮇', + 'ìv' => 'é­¼', + 'ìw' => 'é­¾', + 'ìx' => 'é­»', + 'ìy' => '鮂', + 'ìz' => '鮓', + 'ì{' => 'é®’', + 'ì|' => 'é®', + 'ì}' => 'é­º', + 'ì~' => '鮕', + 'ì¡' => 'é­½', + 'ì¢' => '鮈', + 'ì£' => 'é´¥', + 'ì¤' => 'é´—', + 'ì¥' => 'é´ ', + 'ì¦' => 'é´ž', + 'ì§' => 'é´”', + 'ì¨' => 'é´©', + 'ì©' => 'é´', + 'ìª' => 'é´˜', + 'ì«' => 'é´¢', + 'ì¬' => 'é´', + 'ì­' => 'é´™', + 'ì®' => 'é´Ÿ', + 'ì¯' => '麈', + 'ì°' => '麆', + 'ì±' => '麇', + 'ì²' => '麮', + 'ì³' => '麭', + 'ì´' => '黕', + 'ìµ' => 'é»–', + 'ì¶' => '黺', + 'ì·' => 'é¼’', + 'ì¸' => 'é¼½', + 'ì¹' => '儦', + 'ìº' => 'å„¥', + 'ì»' => 'å„¢', + 'ì¼' => '儤', + 'ì½' => 'å„ ', + 'ì¾' => 'å„©', + 'ì¿' => 'å‹´', + 'ìÀ' => 'åš“', + 'ìÁ' => '嚌', + 'ìÂ' => 'åš', + 'ìÃ' => '嚆', + 'ìÄ' => 'åš„', + 'ìÅ' => '嚃', + 'ìÆ' => '噾', + 'ìÇ' => 'åš‚', + 'ìÈ' => '噿', + 'ìÉ' => 'åš', + 'ìÊ' => '壖', + 'ìË' => '壔', + 'ìÌ' => 'å£', + 'ìÍ' => '壒', + 'ìÎ' => '嬭', + 'ìÏ' => '嬥', + 'ìÐ' => '嬲', + 'ìÑ' => '嬣', + 'ìÒ' => '嬬', + 'ìÓ' => '嬧', + 'ìÔ' => '嬦', + 'ìÕ' => '嬯', + 'ìÖ' => '嬮', + 'ì×' => 'å­»', + 'ìØ' => '寱', + 'ìÙ' => '寲', + 'ìÚ' => 'å¶·', + 'ìÛ' => '幬', + 'ìÜ' => '幪', + 'ìÝ' => 'å¾¾', + 'ìÞ' => 'å¾»', + 'ìß' => '懃', + 'ìà' => '憵', + 'ìá' => '憼', + 'ìâ' => '懧', + 'ìã' => '懠', + 'ìä' => '懥', + 'ìå' => '懤', + 'ìæ' => '懨', + 'ìç' => '懞', + 'ìè' => '擯', + 'ìé' => 'æ“©', + 'ìê' => 'æ“£', + 'ìë' => 'æ“«', + 'ìì' => '擤', + 'ìí' => '擨', + 'ìî' => 'æ–', + 'ìï' => 'æ–€', + 'ìð' => 'æ–¶', + 'ìñ' => 'æ—š', + 'ìò' => 'æ›’', + 'ìó' => 'æª', + 'ìô' => '檖', + 'ìõ' => 'æª', + 'ìö' => '檥', + 'ì÷' => '檉', + 'ìø' => '檟', + 'ìù' => '檛', + 'ìú' => '檡', + 'ìû' => '檞', + 'ìü' => '檇', + 'ìý' => '檓', + 'ìþ' => '檎', + 'í@' => '檕', + 'íA' => '檃', + 'íB' => '檨', + 'íC' => '檤', + 'íD' => '檑', + 'íE' => 'æ©¿', + 'íF' => '檦', + 'íG' => '檚', + 'íH' => '檅', + 'íI' => '檌', + 'íJ' => '檒', + 'íK' => 'æ­›', + 'íL' => 'æ®­', + 'íM' => 'æ°‰', + 'íN' => '濌', + 'íO' => '澩', + 'íP' => 'æ¿´', + 'íQ' => 'æ¿”', + 'íR' => 'æ¿£', + 'íS' => '濜', + 'íT' => 'æ¿­', + 'íU' => 'æ¿§', + 'íV' => '濦', + 'íW' => '濞', + 'íX' => '濲', + 'íY' => 'æ¿', + 'íZ' => 'æ¿¢', + 'í[' => '濨', + 'í\\' => '燡', + 'í]' => '燱', + 'í^' => '燨', + 'í_' => '燲', + 'í`' => '燤', + 'ía' => '燰', + 'íb' => '燢', + 'íc' => 'ç³', + 'íd' => 'ç®', + 'íe' => 'ç¯', + 'íf' => 'ç’—', + 'íg' => 'ç’²', + 'íh' => 'ç’«', + 'íi' => 'ç’', + 'íj' => 'ç’ª', + 'ík' => 'ç’­', + 'íl' => 'ç’±', + 'ím' => 'ç’¥', + 'ín' => 'ç’¯', + 'ío' => 'ç”', + 'íp' => '甑', + 'íq' => 'ç”’', + 'ír' => 'ç”', + 'ís' => 'ç–„', + 'ít' => '癃', + 'íu' => '癈', + 'ív' => '癉', + 'íw' => '癇', + 'íx' => '皤', + 'íy' => '盩', + 'íz' => 'çžµ', + 'í{' => 'çž«', + 'í|' => 'çž²', + 'í}' => 'çž·', + 'í~' => 'çž¶', + 'í¡' => 'çž´', + 'í¢' => 'çž±', + 'í£' => '瞨', + 'í¤' => '矰', + 'í¥' => '磳', + 'í¦' => '磽', + 'í§' => '礂', + 'í¨' => '磻', + 'í©' => '磼', + 'íª' => '磲', + 'í«' => '礅', + 'í¬' => '磹', + 'í­' => '磾', + 'í®' => '礄', + 'í¯' => '禫', + 'í°' => '禨', + 'í±' => '穜', + 'í²' => 'ç©›', + 'í³' => 'ç©–', + 'í´' => '穘', + 'íµ' => 'ç©”', + 'í¶' => '穚', + 'í·' => '窾', + 'í¸' => 'ç«€', + 'í¹' => 'ç«', + 'íº' => 'ç°…', + 'í»' => 'ç°', + 'í¼' => '篲', + 'í½' => 'ç°€', + 'í¾' => '篿', + 'í¿' => '篻', + 'íÀ' => 'ç°Ž', + 'íÁ' => '篴', + 'íÂ' => 'ç°‹', + 'íÃ' => '篳', + 'íÄ' => 'ç°‚', + 'íÅ' => 'ç°‰', + 'íÆ' => 'ç°ƒ', + 'íÇ' => 'ç°', + 'íÈ' => '篸', + 'íÉ' => '篽', + 'íÊ' => 'ç°†', + 'íË' => '篰', + 'íÌ' => '篱', + 'íÍ' => 'ç°', + 'íÎ' => 'ç°Š', + 'íÏ' => '糨', + 'íÐ' => '縭', + 'íÑ' => '縼', + 'íÒ' => '繂', + 'íÓ' => '縳', + 'íÔ' => '顈', + 'íÕ' => '縸', + 'íÖ' => '縪', + 'í×' => '繉', + 'íØ' => 'ç¹€', + 'íÙ' => '繇', + 'íÚ' => '縩', + 'íÛ' => '繌', + 'íÜ' => '縰', + 'íÝ' => '縻', + 'íÞ' => '縶', + 'íß' => '繄', + 'íà' => '縺', + 'íá' => 'ç½…', + 'íâ' => '罿', + 'íã' => 'ç½¾', + 'íä' => 'ç½½', + 'íå' => 'ç¿´', + 'íæ' => '翲', + 'íç' => '耬', + 'íè' => '膻', + 'íé' => '臄', + 'íê' => '臌', + 'íë' => '臊', + 'íì' => '臅', + 'íí' => '臇', + 'íî' => '膼', + 'íï' => '臩', + 'íð' => '艛', + 'íñ' => '艚', + 'íò' => '艜', + 'íó' => 'è–ƒ', + 'íô' => 'è–€', + 'íõ' => 'è–', + 'íö' => 'è–§', + 'í÷' => 'è–•', + 'íø' => 'è– ', + 'íù' => 'è–‹', + 'íú' => 'è–£', + 'íû' => 'è•»', + 'íü' => 'è–¤', + 'íý' => 'è–š', + 'íþ' => 'è–ž', + 'î@' => 'è•·', + 'îA' => '蕼', + 'îB' => 'è–‰', + 'îC' => 'è–¡', + 'îD' => '蕺', + 'îE' => '蕸', + 'îF' => 'è•—', + 'îG' => 'è–Ž', + 'îH' => 'è––', + 'îI' => 'è–†', + 'îJ' => 'è–', + 'îK' => 'è–™', + 'îL' => 'è–', + 'îM' => 'è–', + 'îN' => 'è–¢', + 'îO' => 'è–‚', + 'îP' => 'è–ˆ', + 'îQ' => 'è–…', + 'îR' => '蕹', + 'îS' => 'è•¶', + 'îT' => 'è–˜', + 'îU' => 'è–', + 'îV' => 'è–Ÿ', + 'îW' => '虨', + 'îX' => 'èž¾', + 'îY' => '螪', + 'îZ' => 'èž­', + 'î[' => '蟅', + 'î\\' => 'èž°', + 'î]' => '螬', + 'î^' => 'èž¹', + 'î_' => 'èžµ', + 'î`' => 'èž¼', + 'îa' => 'èž®', + 'îb' => '蟉', + 'îc' => '蟃', + 'îd' => '蟂', + 'îe' => '蟌', + 'îf' => 'èž·', + 'îg' => '螯', + 'îh' => '蟄', + 'îi' => '蟊', + 'îj' => 'èž´', + 'îk' => 'èž¶', + 'îl' => 'èž¿', + 'îm' => '螸', + 'în' => 'èž½', + 'îo' => '蟞', + 'îp' => 'èž²', + 'îq' => '褵', + 'îr' => '褳', + 'îs' => '褼', + 'ît' => '褾', + 'îu' => 'è¥', + 'îv' => '襒', + 'îw' => '褷', + 'îx' => '襂', + 'îy' => '覭', + 'îz' => '覯', + 'î{' => '覮', + 'î|' => 'è§²', + 'î}' => 'è§³', + 'î~' => '謞', + 'î¡' => '謘', + 'î¢' => '謖', + 'î£' => '謑', + 'î¤' => '謅', + 'î¥' => '謋', + 'î¦' => '謢', + 'î§' => 'è¬', + 'î¨' => '謒', + 'î©' => '謕', + 'îª' => '謇', + 'î«' => 'è¬', + 'î¬' => '謈', + 'î­' => '謆', + 'î®' => '謜', + 'î¯' => '謓', + 'î°' => '謚', + 'î±' => 'è±', + 'î²' => 'è±°', + 'î³' => 'è±²', + 'î´' => 'è±±', + 'îµ' => '豯', + 'î¶' => '貕', + 'î·' => 'è²”', + 'î¸' => 'è³¹', + 'î¹' => '赯', + 'îº' => '蹎', + 'î»' => 'è¹', + 'î¼' => '蹓', + 'î½' => 'è¹', + 'î¾' => '蹌', + 'î¿' => '蹇', + 'îÀ' => '轃', + 'îÁ' => 'è½€', + 'îÂ' => 'é‚…', + 'îÃ' => 'é¾', + 'îÄ' => '鄸', + 'îÅ' => '醚', + 'îÆ' => '醢', + 'îÇ' => '醛', + 'îÈ' => '醙', + 'îÉ' => '醟', + 'îÊ' => '醡', + 'îË' => 'é†', + 'îÌ' => '醠', + 'îÍ' => '鎡', + 'îÎ' => '鎃', + 'îÏ' => '鎯', + 'îÐ' => 'é¤', + 'îÑ' => 'é–', + 'îÒ' => 'é‡', + 'îÓ' => 'é¼', + 'îÔ' => 'é˜', + 'îÕ' => 'éœ', + 'îÖ' => 'é¶', + 'î×' => 'é‰', + 'îØ' => 'é', + 'îÙ' => 'é‘', + 'îÚ' => 'é ', + 'îÛ' => 'é­', + 'îÜ' => 'éŽ', + 'îÝ' => 'éŒ', + 'îÞ' => 'éª', + 'îß' => 'é¹', + 'îà' => 'é—', + 'îá' => 'é•', + 'îâ' => 'é’', + 'îã' => 'é', + 'îä' => 'é±', + 'îå' => 'é·', + 'îæ' => 'é»', + 'îç' => 'é¡', + 'îè' => 'éž', + 'îé' => 'é£', + 'îê' => 'é§', + 'îë' => '鎀', + 'îì' => 'éŽ', + 'îí' => 'é™', + 'îî' => 'é—‡', + 'îï' => 'é—€', + 'îð' => 'é—‰', + 'îñ' => 'é—ƒ', + 'îò' => 'é—…', + 'îó' => 'é–·', + 'îô' => 'éš®', + 'îõ' => 'éš°', + 'îö' => '隬', + 'î÷' => '霠', + 'îø' => '霟', + 'îù' => '霘', + 'îú' => 'éœ', + 'îû' => '霙', + 'îü' => 'éžš', + 'îý' => 'éž¡', + 'îþ' => 'éžœ', + 'ï@' => 'éžž', + 'ïA' => 'éž', + 'ïB' => '韕', + 'ïC' => '韔', + 'ïD' => '韱', + 'ïE' => 'é¡', + 'ïF' => 'é¡„', + 'ïG' => '顊', + 'ïH' => '顉', + 'ïI' => 'é¡…', + 'ïJ' => '顃', + 'ïK' => '餥', + 'ïL' => '餫', + 'ïM' => '餬', + 'ïN' => '餪', + 'ïO' => '餳', + 'ïP' => '餲', + 'ïQ' => '餯', + 'ïR' => '餭', + 'ïS' => '餱', + 'ïT' => '餰', + 'ïU' => '馘', + 'ïV' => '馣', + 'ïW' => '馡', + 'ïX' => '騂', + 'ïY' => '駺', + 'ïZ' => 'é§´', + 'ï[' => 'é§·', + 'ï\\' => 'é§¹', + 'ï]' => '駸', + 'ï^' => 'é§¶', + 'ï_' => 'é§»', + 'ï`' => 'é§½', + 'ïa' => 'é§¾', + 'ïb' => 'é§¼', + 'ïc' => '騃', + 'ïd' => '骾', + 'ïe' => '髾', + 'ïf' => '髽', + 'ïg' => 'é¬', + 'ïh' => '髼', + 'ïi' => 'é­ˆ', + 'ïj' => '鮚', + 'ïk' => '鮨', + 'ïl' => '鮞', + 'ïm' => 'é®›', + 'ïn' => '鮦', + 'ïo' => '鮡', + 'ïp' => '鮥', + 'ïq' => '鮤', + 'ïr' => '鮆', + 'ïs' => '鮢', + 'ït' => 'é® ', + 'ïu' => '鮯', + 'ïv' => 'é´³', + 'ïw' => 'éµ', + 'ïx' => 'éµ§', + 'ïy' => 'é´¶', + 'ïz' => 'é´®', + 'ï{' => 'é´¯', + 'ï|' => 'é´±', + 'ï}' => 'é´¸', + 'ï~' => 'é´°', + 'ï¡' => 'éµ…', + 'ï¢' => '鵂', + 'ï£' => '鵃', + 'ï¤' => 'é´¾', + 'ï¥' => 'é´·', + 'ï¦' => 'éµ€', + 'ï§' => 'é´½', + 'ï¨' => '翵', + 'ï©' => 'é´­', + 'ïª' => '麊', + 'ï«' => '麉', + 'ï¬' => 'éº', + 'ï­' => '麰', + 'ï®' => '黈', + 'ï¯' => '黚', + 'ï°' => 'é»»', + 'ï±' => '黿', + 'ï²' => '鼤', + 'ï³' => 'é¼£', + 'ï´' => 'é¼¢', + 'ïµ' => 'é½”', + 'ï¶' => 'é¾ ', + 'ï·' => '儱', + 'ï¸' => 'å„­', + 'ï¹' => 'å„®', + 'ïº' => '嚘', + 'ï»' => 'åšœ', + 'ï¼' => 'åš—', + 'ï½' => 'åšš', + 'ï¾' => 'åš', + 'ï¿' => 'åš™', + 'ïÀ' => '奰', + 'ïÁ' => '嬼', + 'ïÂ' => '屩', + 'ïÃ' => '屪', + 'ïÄ' => 'å·€', + 'ïÅ' => 'å¹­', + 'ïÆ' => 'å¹®', + 'ïÇ' => '懘', + 'ïÈ' => '懟', + 'ïÉ' => '懭', + 'ïÊ' => '懮', + 'ïË' => '懱', + 'ïÌ' => '懪', + 'ïÍ' => '懰', + 'ïÎ' => '懫', + 'ïÏ' => '懖', + 'ïÐ' => '懩', + 'ïÑ' => 'æ“¿', + 'ïÒ' => '攄', + 'ïÓ' => '擽', + 'ïÔ' => '擸', + 'ïÕ' => 'æ”', + 'ïÖ' => '攃', + 'ï×' => '擼', + 'ïØ' => 'æ–”', + 'ïÙ' => 'æ—›', + 'ïÚ' => '曚', + 'ïÛ' => 'æ››', + 'ïÜ' => '曘', + 'ïÝ' => 'æ«…', + 'ïÞ' => '檹', + 'ïß' => '檽', + 'ïà' => 'æ«¡', + 'ïá' => '櫆', + 'ïâ' => '檺', + 'ïã' => '檶', + 'ïä' => '檷', + 'ïå' => '櫇', + 'ïæ' => '檴', + 'ïç' => '檭', + 'ïè' => 'æ­ž', + 'ïé' => '毉', + 'ïê' => 'æ°‹', + 'ïë' => '瀇', + 'ïì' => '瀌', + 'ïí' => 'ç€', + 'ïî' => 'ç€', + 'ïï' => '瀅', + 'ïð' => '瀔', + 'ïñ' => '瀎', + 'ïò' => 'æ¿¿', + 'ïó' => '瀀', + 'ïô' => 'æ¿»', + 'ïõ' => '瀦', + 'ïö' => '濼', + 'ï÷' => 'æ¿·', + 'ïø' => '瀊', + 'ïù' => 'çˆ', + 'ïú' => '燿', + 'ïû' => '燹', + 'ïü' => '爃', + 'ïý' => '燽', + 'ïþ' => 'ç¶', + 'ð@' => 'ç’¸', + 'ðA' => 'ç“€', + 'ðB' => 'ç’µ', + 'ðC' => 'ç“', + 'ðD' => 'ç’¾', + 'ðE' => 'ç’¶', + 'ðF' => 'ç’»', + 'ðG' => 'ç“‚', + 'ðH' => 'ç””', + 'ðI' => '甓', + 'ðJ' => '癜', + 'ðK' => '癤', + 'ðL' => 'ç™™', + 'ðM' => 'ç™', + 'ðN' => '癓', + 'ðO' => 'ç™—', + 'ðP' => '癚', + 'ðQ' => '皦', + 'ðR' => 'çš½', + 'ðS' => '盬', + 'ðT' => '矂', + 'ðU' => '瞺', + 'ðV' => '磿', + 'ðW' => '礌', + 'ðX' => '礓', + 'ðY' => '礔', + 'ðZ' => '礉', + 'ð[' => 'ç¤', + 'ð\\' => '礒', + 'ð]' => '礑', + 'ð^' => '禭', + 'ð_' => '禬', + 'ð`' => '穟', + 'ða' => 'ç°œ', + 'ðb' => 'ç°©', + 'ðc' => 'ç°™', + 'ðd' => 'ç° ', + 'ðe' => 'ç°Ÿ', + 'ðf' => 'ç°­', + 'ðg' => 'ç°', + 'ðh' => 'ç°¦', + 'ði' => 'ç°¨', + 'ðj' => 'ç°¢', + 'ðk' => 'ç°¥', + 'ðl' => 'ç°°', + 'ðm' => '繜', + 'ðn' => 'ç¹', + 'ðo' => 'ç¹–', + 'ðp' => 'ç¹£', + 'ðq' => '繘', + 'ðr' => 'ç¹¢', + 'ðs' => '繟', + 'ðt' => '繑', + 'ðu' => 'ç¹ ', + 'ðv' => 'ç¹—', + 'ðw' => '繓', + 'ðx' => 'ç¾µ', + 'ðy' => 'ç¾³', + 'ðz' => 'ç¿·', + 'ð{' => '翸', + 'ð|' => 'èµ', + 'ð}' => '臑', + 'ð~' => '臒', + 'ð¡' => 'è‡', + 'ð¢' => '艟', + 'ð£' => '艞', + 'ð¤' => 'è–´', + 'ð¥' => 'è—†', + 'ð¦' => 'è—€', + 'ð§' => 'è—ƒ', + 'ð¨' => 'è—‚', + 'ð©' => 'è–³', + 'ðª' => 'è–µ', + 'ð«' => 'è–½', + 'ð¬' => 'è—‡', + 'ð­' => 'è—„', + 'ð®' => 'è–¿', + 'ð¯' => 'è—‹', + 'ð°' => 'è—Ž', + 'ð±' => 'è—ˆ', + 'ð²' => 'è—…', + 'ð³' => 'è–±', + 'ð´' => 'è–¶', + 'ðµ' => 'è—’', + 'ð¶' => '蘤', + 'ð·' => 'è–¸', + 'ð¸' => 'è–·', + 'ð¹' => 'è–¾', + 'ðº' => '虩', + 'ð»' => '蟧', + 'ð¼' => '蟦', + 'ð½' => '蟢', + 'ð¾' => '蟛', + 'ð¿' => '蟫', + 'ðÀ' => '蟪', + 'ðÁ' => '蟥', + 'ðÂ' => '蟟', + 'ðÃ' => '蟳', + 'ðÄ' => '蟤', + 'ðÅ' => '蟔', + 'ðÆ' => '蟜', + 'ðÇ' => '蟓', + 'ðÈ' => '蟭', + 'ðÉ' => '蟘', + 'ðÊ' => '蟣', + 'ðË' => '螤', + 'ðÌ' => '蟗', + 'ðÍ' => '蟙', + 'ðÎ' => 'è ', + 'ðÏ' => '蟴', + 'ðÐ' => '蟨', + 'ðÑ' => 'èŸ', + 'ðÒ' => '襓', + 'ðÓ' => '襋', + 'ðÔ' => 'è¥', + 'ðÕ' => '襌', + 'ðÖ' => '襆', + 'ð×' => 'è¥', + 'ðØ' => '襑', + 'ðÙ' => '襉', + 'ðÚ' => '謪', + 'ðÛ' => '謧', + 'ðÜ' => '謣', + 'ðÝ' => '謳', + 'ðÞ' => '謰', + 'ðß' => '謵', + 'ðà' => 'è­‡', + 'ðá' => '謯', + 'ðâ' => '謼', + 'ðã' => '謾', + 'ðä' => '謱', + 'ðå' => '謥', + 'ðæ' => '謷', + 'ðç' => '謦', + 'ðè' => '謶', + 'ðé' => '謮', + 'ðê' => '謤', + 'ðë' => '謻', + 'ðì' => '謽', + 'ðí' => '謺', + 'ðî' => '豂', + 'ðï' => 'è±µ', + 'ðð' => 'è²™', + 'ðñ' => '貘', + 'ðò' => 'è²—', + 'ðó' => 'è³¾', + 'ðô' => 'è´„', + 'ðõ' => 'è´‚', + 'ðö' => 'è´€', + 'ð÷' => '蹜', + 'ðø' => 'è¹¢', + 'ðù' => 'è¹ ', + 'ðú' => 'è¹—', + 'ðû' => 'è¹–', + 'ðü' => '蹞', + 'ðý' => 'è¹¥', + 'ðþ' => 'è¹§', + 'ñ@' => 'è¹›', + 'ñA' => '蹚', + 'ñB' => '蹡', + 'ñC' => 'è¹', + 'ñD' => '蹩', + 'ñE' => 'è¹”', + 'ñF' => '轆', + 'ñG' => '轇', + 'ñH' => '轈', + 'ñI' => '轋', + 'ñJ' => '鄨', + 'ñK' => '鄺', + 'ñL' => 'é„»', + 'ñM' => '鄾', + 'ñN' => '醨', + 'ñO' => '醥', + 'ñP' => '醧', + 'ñQ' => '醯', + 'ñR' => '醪', + 'ñS' => '鎵', + 'ñT' => '鎌', + 'ñU' => '鎒', + 'ñV' => '鎷', + 'ñW' => '鎛', + 'ñX' => 'éŽ', + 'ñY' => '鎉', + 'ñZ' => '鎧', + 'ñ[' => '鎎', + 'ñ\\' => '鎪', + 'ñ]' => '鎞', + 'ñ^' => '鎦', + 'ñ_' => '鎕', + 'ñ`' => '鎈', + 'ña' => '鎙', + 'ñb' => '鎟', + 'ñc' => 'éŽ', + 'ñd' => '鎱', + 'ñe' => '鎑', + 'ñf' => '鎲', + 'ñg' => '鎤', + 'ñh' => '鎨', + 'ñi' => '鎴', + 'ñj' => '鎣', + 'ñk' => '鎥', + 'ñl' => 'é—’', + 'ñm' => 'é—“', + 'ñn' => 'é—‘', + 'ño' => 'éš³', + 'ñp' => 'é›—', + 'ñq' => '雚', + 'ñr' => 'å·‚', + 'ñs' => '雟', + 'ñt' => '雘', + 'ñu' => 'é›', + 'ñv' => '霣', + 'ñw' => '霢', + 'ñx' => '霥', + 'ñy' => '鞬', + 'ñz' => 'éž®', + 'ñ{' => '鞨', + 'ñ|' => 'éž«', + 'ñ}' => '鞤', + 'ñ~' => '鞪', + 'ñ¡' => '鞢', + 'ñ¢' => '鞥', + 'ñ£' => '韗', + 'ñ¤' => '韙', + 'ñ¥' => '韖', + 'ñ¦' => '韘', + 'ñ§' => '韺', + 'ñ¨' => 'é¡', + 'ñ©' => 'é¡‘', + 'ñª' => 'é¡’', + 'ñ«' => '颸', + 'ñ¬' => 'é¥', + 'ñ­' => '餼', + 'ñ®' => '餺', + 'ñ¯' => 'é¨', + 'ñ°' => '騋', + 'ñ±' => '騉', + 'ñ²' => 'é¨', + 'ñ³' => '騄', + 'ñ´' => '騑', + 'ñµ' => '騊', + 'ñ¶' => '騅', + 'ñ·' => '騇', + 'ñ¸' => '騆', + 'ñ¹' => 'é«€', + 'ñº' => '髜', + 'ñ»' => '鬈', + 'ñ¼' => '鬄', + 'ñ½' => '鬅', + 'ñ¾' => '鬩', + 'ñ¿' => '鬵', + 'ñÀ' => 'é­Š', + 'ñÁ' => 'é­Œ', + 'ñÂ' => 'é­‹', + 'ñÃ' => '鯇', + 'ñÄ' => '鯆', + 'ñÅ' => '鯃', + 'ñÆ' => '鮿', + 'ñÇ' => 'é¯', + 'ñÈ' => '鮵', + 'ñÉ' => '鮸', + 'ñÊ' => '鯓', + 'ñË' => 'é®¶', + 'ñÌ' => '鯄', + 'ñÍ' => '鮹', + 'ñÎ' => '鮽', + 'ñÏ' => '鵜', + 'ñÐ' => '鵓', + 'ñÑ' => 'éµ', + 'ñÒ' => '鵊', + 'ñÓ' => 'éµ›', + 'ñÔ' => '鵋', + 'ñÕ' => 'éµ™', + 'ñÖ' => 'éµ–', + 'ñ×' => '鵌', + 'ñØ' => 'éµ—', + 'ñÙ' => 'éµ’', + 'ñÚ' => 'éµ”', + 'ñÛ' => '鵟', + 'ñÜ' => '鵘', + 'ñÝ' => '鵚', + 'ñÞ' => '麎', + 'ñß' => '麌', + 'ñà' => '黟', + 'ñá' => 'é¼', + 'ñâ' => 'é¼€', + 'ñã' => 'é¼–', + 'ñä' => 'é¼¥', + 'ñå' => '鼫', + 'ñæ' => '鼪', + 'ñç' => '鼩', + 'ñè' => '鼨', + 'ñé' => '齌', + 'ñê' => '齕', + 'ñë' => 'å„´', + 'ñì' => '儵', + 'ñí' => '劖', + 'ñî' => 'å‹·', + 'ñï' => '厴', + 'ñð' => 'åš«', + 'ññ' => 'åš­', + 'ñò' => '嚦', + 'ñó' => 'åš§', + 'ñô' => '嚪', + 'ñõ' => '嚬', + 'ñö' => '壚', + 'ñ÷' => 'å£', + 'ñø' => '壛', + 'ñù' => '夒', + 'ñú' => '嬽', + 'ñû' => '嬾', + 'ñü' => '嬿', + 'ñý' => 'å·ƒ', + 'ñþ' => 'å¹°', + 'ò@' => '徿', + 'òA' => '懻', + 'òB' => '攇', + 'òC' => 'æ”', + 'òD' => 'æ”', + 'òE' => '攉', + 'òF' => '攌', + 'òG' => '攎', + 'òH' => 'æ–„', + 'òI' => 'æ—ž', + 'òJ' => 'æ—', + 'òK' => '曞', + 'òL' => 'æ«§', + 'òM' => 'æ« ', + 'òN' => '櫌', + 'òO' => 'æ«‘', + 'òP' => 'æ«™', + 'òQ' => 'æ«‹', + 'òR' => '櫟', + 'òS' => '櫜', + 'òT' => 'æ«', + 'òU' => 'æ««', + 'òV' => 'æ«', + 'òW' => 'æ«', + 'òX' => '櫞', + 'òY' => 'æ­ ', + 'òZ' => 'æ®°', + 'ò[' => 'æ°Œ', + 'ò\\' => '瀙', + 'ò]' => '瀧', + 'ò^' => '瀠', + 'ò_' => '瀖', + 'ò`' => '瀫', + 'òa' => '瀡', + 'òb' => '瀢', + 'òc' => '瀣', + 'òd' => '瀩', + 'òe' => '瀗', + 'òf' => '瀤', + 'òg' => '瀜', + 'òh' => '瀪', + 'òi' => '爌', + 'òj' => '爊', + 'òk' => '爇', + 'òl' => '爂', + 'òm' => '爅', + 'òn' => '犥', + 'òo' => '犦', + 'òp' => '犤', + 'òq' => '犣', + 'òr' => '犡', + 'òs' => 'ç“‹', + 'òt' => 'ç“…', + 'òu' => 'ç’·', + 'òv' => '瓃', + 'òw' => 'ç”–', + 'òx' => 'ç™ ', + 'òy' => '矉', + 'òz' => '矊', + 'ò{' => '矄', + 'ò|' => '矱', + 'ò}' => 'ç¤', + 'ò~' => '礛', + 'ò¡' => '礡', + 'ò¢' => '礜', + 'ò£' => '礗', + 'ò¤' => '礞', + 'ò¥' => '禰', + 'ò¦' => 'ç©§', + 'ò§' => '穨', + 'ò¨' => 'ç°³', + 'ò©' => 'ç°¼', + 'òª' => 'ç°¹', + 'ò«' => 'ç°¬', + 'ò¬' => 'ç°»', + 'ò­' => '糬', + 'ò®' => '糪', + 'ò¯' => 'ç¹¶', + 'ò°' => 'ç¹µ', + 'ò±' => '繸', + 'ò²' => 'ç¹°', + 'ò³' => 'ç¹·', + 'ò´' => '繯', + 'òµ' => '繺', + 'ò¶' => 'ç¹²', + 'ò·' => 'ç¹´', + 'ò¸' => '繨', + 'ò¹' => '罋', + 'òº' => '罊', + 'ò»' => '羃', + 'ò¼' => '羆', + 'ò½' => 'ç¾·', + 'ò¾' => '翽', + 'ò¿' => '翾', + 'òÀ' => 'è¸', + 'òÁ' => '臗', + 'òÂ' => '臕', + 'òÃ' => '艤', + 'òÄ' => '艡', + 'òÅ' => '艣', + 'òÆ' => 'è—«', + 'òÇ' => 'è—±', + 'òÈ' => 'è—­', + 'òÉ' => 'è—™', + 'òÊ' => 'è—¡', + 'òË' => 'è—¨', + 'òÌ' => 'è—š', + 'òÍ' => 'è——', + 'òÎ' => 'è—¬', + 'òÏ' => 'è—²', + 'òÐ' => 'è—¸', + 'òÑ' => 'è—˜', + 'òÒ' => 'è—Ÿ', + 'òÓ' => 'è—£', + 'òÔ' => 'è—œ', + 'òÕ' => 'è—‘', + 'òÖ' => 'è—°', + 'ò×' => 'è—¦', + 'òØ' => 'è—¯', + 'òÙ' => 'è—ž', + 'òÚ' => 'è—¢', + 'òÛ' => 'è €', + 'òÜ' => '蟺', + 'òÝ' => 'è ƒ', + 'òÞ' => '蟶', + 'òß' => '蟷', + 'òà' => 'è ‰', + 'òá' => 'è Œ', + 'òâ' => 'è ‹', + 'òã' => 'è †', + 'òä' => '蟼', + 'òå' => 'è ˆ', + 'òæ' => '蟿', + 'òç' => 'è Š', + 'òè' => 'è ‚', + 'òé' => '襢', + 'òê' => '襚', + 'òë' => '襛', + 'òì' => '襗', + 'òí' => '襡', + 'òî' => '襜', + 'òï' => '襘', + 'òð' => 'è¥', + 'òñ' => '襙', + 'òò' => '覈', + 'òó' => '覷', + 'òô' => '覶', + 'òõ' => 'è§¶', + 'òö' => 'è­', + 'ò÷' => 'è­ˆ', + 'òø' => 'è­Š', + 'òù' => 'è­€', + 'òú' => 'è­“', + 'òû' => 'è­–', + 'òü' => 'è­”', + 'òý' => 'è­‹', + 'òþ' => 'è­•', + 'ó@' => 'è­‘', + 'óA' => 'è­‚', + 'óB' => 'è­’', + 'óC' => 'è­—', + 'óD' => '豃', + 'óE' => 'è±·', + 'óF' => 'è±¶', + 'óG' => '貚', + 'óH' => 'è´†', + 'óI' => 'è´‡', + 'óJ' => 'è´‰', + 'óK' => '趬', + 'óL' => '趪', + 'óM' => 'è¶­', + 'óN' => 'è¶«', + 'óO' => 'è¹­', + 'óP' => '蹸', + 'óQ' => 'è¹³', + 'óR' => '蹪', + 'óS' => '蹯', + 'óT' => 'è¹»', + 'óU' => '軂', + 'óV' => 'è½’', + 'óW' => '轑', + 'óX' => 'è½', + 'óY' => 'è½', + 'óZ' => '轓', + 'ó[' => 'è¾´', + 'ó\\' => 'é…€', + 'ó]' => 'é„¿', + 'ó^' => '醰', + 'ó_' => '醭', + 'ó`' => 'éž', + 'óa' => 'é‡', + 'ób' => 'é', + 'óc' => 'é‚', + 'ód' => 'éš', + 'óe' => 'é', + 'óf' => 'é¹', + 'óg' => 'é¬', + 'óh' => 'éŒ', + 'ói' => 'é™', + 'ój' => '鎩', + 'ók' => 'é¦', + 'ól' => 'éŠ', + 'óm' => 'é”', + 'ón' => 'é®', + 'óo' => 'é£', + 'óp' => 'é•', + 'óq' => 'é„', + 'ór' => 'éŽ', + 'ós' => 'é€', + 'ót' => 'é’', + 'óu' => 'é§', + 'óv' => '镽', + 'ów' => 'é—š', + 'óx' => 'é—›', + 'óy' => '雡', + 'óz' => '霩', + 'ó{' => '霫', + 'ó|' => '霬', + 'ó}' => '霨', + 'ó~' => '霦', + 'ó¡' => 'éž³', + 'ó¢' => 'éž·', + 'ó£' => 'éž¶', + 'ó¤' => 'éŸ', + 'ó¥' => '韞', + 'ó¦' => '韟', + 'ó§' => '顜', + 'ó¨' => 'é¡™', + 'ó©' => 'é¡', + 'óª' => 'é¡—', + 'ó«' => '颿', + 'ó¬' => '颽', + 'ó­' => '颻', + 'ó®' => '颾', + 'ó¯' => '饈', + 'ó°' => '饇', + 'ó±' => '饃', + 'ó²' => '馦', + 'ó³' => '馧', + 'ó´' => '騚', + 'óµ' => '騕', + 'ó¶' => '騥', + 'ó·' => 'é¨', + 'ó¸' => '騤', + 'ó¹' => '騛', + 'óº' => '騢', + 'ó»' => '騠', + 'ó¼' => '騧', + 'ó½' => '騣', + 'ó¾' => '騞', + 'ó¿' => '騜', + 'óÀ' => '騔', + 'óÁ' => 'é«‚', + 'óÂ' => '鬋', + 'óÃ' => '鬊', + 'óÄ' => '鬎', + 'óÅ' => '鬌', + 'óÆ' => '鬷', + 'óÇ' => '鯪', + 'óÈ' => '鯫', + 'óÉ' => '鯠', + 'óÊ' => '鯞', + 'óË' => '鯤', + 'óÌ' => '鯦', + 'óÍ' => '鯢', + 'óÎ' => '鯰', + 'óÏ' => '鯔', + 'óÐ' => '鯗', + 'óÑ' => '鯬', + 'óÒ' => '鯜', + 'óÓ' => '鯙', + 'óÔ' => '鯥', + 'óÕ' => '鯕', + 'óÖ' => '鯡', + 'ó×' => '鯚', + 'óØ' => 'éµ·', + 'óÙ' => 'é¶', + 'óÚ' => 'é¶Š', + 'óÛ' => 'é¶„', + 'óÜ' => '鶈', + 'óÝ' => 'éµ±', + 'óÞ' => 'é¶€', + 'óß' => '鵸', + 'óà' => '鶆', + 'óá' => 'é¶‹', + 'óâ' => 'é¶Œ', + 'óã' => 'éµ½', + 'óä' => '鵫', + 'óå' => 'éµ´', + 'óæ' => 'éµµ', + 'óç' => 'éµ°', + 'óè' => '鵩', + 'óé' => 'é¶…', + 'óê' => 'éµ³', + 'óë' => 'éµ»', + 'óì' => 'é¶‚', + 'óí' => '鵯', + 'óî' => 'éµ¹', + 'óï' => '鵿', + 'óð' => '鶇', + 'óñ' => '鵨', + 'óò' => '麔', + 'óó' => '麑', + 'óô' => '黀', + 'óõ' => '黼', + 'óö' => 'é¼­', + 'ó÷' => 'é½€', + 'óø' => 'é½', + 'óù' => 'é½', + 'óú' => 'é½–', + 'óû' => 'é½—', + 'óü' => '齘', + 'óý' => '匷', + 'óþ' => 'åš²', + 'ô@' => 'åšµ', + 'ôA' => 'åš³', + 'ôB' => '壣', + 'ôC' => 'å­…', + 'ôD' => 'å·†', + 'ôE' => 'å·‡', + 'ôF' => 'å»®', + 'ôG' => '廯', + 'ôH' => 'å¿€', + 'ôI' => 'å¿', + 'ôJ' => '懹', + 'ôK' => 'æ”—', + 'ôL' => 'æ”–', + 'ôM' => '攕', + 'ôN' => '攓', + 'ôO' => 'æ—Ÿ', + 'ôP' => '曨', + 'ôQ' => '曣', + 'ôR' => '曤', + 'ôS' => '櫳', + 'ôT' => 'æ«°', + 'ôU' => '櫪', + 'ôV' => '櫨', + 'ôW' => '櫹', + 'ôX' => '櫱', + 'ôY' => 'æ«®', + 'ôZ' => '櫯', + 'ô[' => '瀼', + 'ô\\' => '瀵', + 'ô]' => '瀯', + 'ô^' => '瀷', + 'ô_' => '瀴', + 'ô`' => '瀱', + 'ôa' => 'ç‚', + 'ôb' => '瀸', + 'ôc' => '瀿', + 'ôd' => '瀺', + 'ôe' => '瀹', + 'ôf' => 'ç€', + 'ôg' => '瀻', + 'ôh' => '瀳', + 'ôi' => 'ç', + 'ôj' => '爓', + 'ôk' => '爔', + 'ôl' => '犨', + 'ôm' => 'ç½', + 'ôn' => 'ç¼', + 'ôo' => 'ç’º', + 'ôp' => 'çš«', + 'ôq' => '皪', + 'ôr' => 'çš¾', + 'ôs' => 'ç›­', + 'ôt' => '矌', + 'ôu' => '矎', + 'ôv' => 'çŸ', + 'ôw' => 'çŸ', + 'ôx' => '矲', + 'ôy' => '礥', + 'ôz' => '礣', + 'ô{' => '礧', + 'ô|' => '礨', + 'ô}' => '礤', + 'ô~' => '礩', + 'ô¡' => '禲', + 'ô¢' => 'ç©®', + 'ô£' => '穬', + 'ô¤' => 'ç©­', + 'ô¥' => 'ç«·', + 'ô¦' => '籉', + 'ô§' => '籈', + 'ô¨' => '籊', + 'ô©' => '籇', + 'ôª' => 'ç±…', + 'ô«' => 'ç³®', + 'ô¬' => 'ç¹»', + 'ô­' => 'ç¹¾', + 'ô®' => 'çº', + 'ô¯' => '纀', + 'ô°' => '羺', + 'ô±' => 'ç¿¿', + 'ô²' => 'è¹', + 'ô³' => '臛', + 'ô´' => '臙', + 'ôµ' => '舋', + 'ô¶' => '艨', + 'ô·' => '艩', + 'ô¸' => '蘢', + 'ô¹' => 'è—¿', + 'ôº' => 'è˜', + 'ô»' => 'è—¾', + 'ô¼' => '蘛', + 'ô½' => '蘀', + 'ô¾' => 'è—¶', + 'ô¿' => '蘄', + 'ôÀ' => '蘉', + 'ôÁ' => '蘅', + 'ôÂ' => '蘌', + 'ôÃ' => 'è—½', + 'ôÄ' => 'è ™', + 'ôÅ' => 'è ', + 'ôÆ' => 'è ‘', + 'ôÇ' => 'è —', + 'ôÈ' => 'è “', + 'ôÉ' => 'è –', + 'ôÊ' => '襣', + 'ôË' => '襦', + 'ôÌ' => '覹', + 'ôÍ' => 'è§·', + 'ôÎ' => 'è­ ', + 'ôÏ' => 'è­ª', + 'ôÐ' => 'è­', + 'ôÑ' => 'è­¨', + 'ôÒ' => 'è­£', + 'ôÓ' => 'è­¥', + 'ôÔ' => 'è­§', + 'ôÕ' => 'è­­', + 'ôÖ' => 'è¶®', + 'ô×' => '躆', + 'ôØ' => '躈', + 'ôÙ' => '躄', + 'ôÚ' => 'è½™', + 'ôÛ' => 'è½–', + 'ôÜ' => 'è½—', + 'ôÝ' => '轕', + 'ôÞ' => '轘', + 'ôß' => '轚', + 'ôà' => 'é‚', + 'ôá' => 'é…ƒ', + 'ôâ' => 'é…', + 'ôã' => '醷', + 'ôä' => '醵', + 'ôå' => '醲', + 'ôæ' => '醳', + 'ôç' => 'é‹', + 'ôè' => 'é“', + 'ôé' => 'é»', + 'ôê' => 'é ', + 'ôë' => 'é', + 'ôì' => 'é”', + 'ôí' => 'é¾', + 'ôî' => 'é•', + 'ôï' => 'é', + 'ôð' => 'é¨', + 'ôñ' => 'é™', + 'ôò' => 'é', + 'ôó' => 'éµ', + 'ôô' => 'é€', + 'ôõ' => 'é·', + 'ôö' => 'é‡', + 'ô÷' => 'éŽ', + 'ôø' => 'é–', + 'ôù' => 'é’', + 'ôú' => 'éº', + 'ôû' => 'é‰', + 'ôü' => 'é¸', + 'ôý' => 'éŠ', + 'ôþ' => 'é¿', + 'õ@' => 'é¼', + 'õA' => 'éŒ', + 'õB' => 'é¶', + 'õC' => 'é‘', + 'õD' => 'é†', + 'õE' => 'é—ž', + 'õF' => 'é— ', + 'õG' => 'é—Ÿ', + 'õH' => '霮', + 'õI' => '霯', + 'õJ' => 'éž¹', + 'õK' => 'éž»', + 'õL' => '韽', + 'õM' => '韾', + 'õN' => 'é¡ ', + 'õO' => 'é¡¢', + 'õP' => 'é¡£', + 'õQ' => '顟', + 'õR' => 'é£', + 'õS' => '飂', + 'õT' => 'é¥', + 'õU' => '饎', + 'õV' => '饙', + 'õW' => '饌', + 'õX' => '饋', + 'õY' => '饓', + 'õZ' => '騲', + 'õ[' => '騴', + 'õ\\' => '騱', + 'õ]' => '騬', + 'õ^' => '騪', + 'õ_' => '騶', + 'õ`' => '騩', + 'õa' => '騮', + 'õb' => '騸', + 'õc' => '騭', + 'õd' => '髇', + 'õe' => '髊', + 'õf' => '髆', + 'õg' => 'é¬', + 'õh' => '鬒', + 'õi' => '鬑', + 'õj' => 'é°‹', + 'õk' => 'é°ˆ', + 'õl' => '鯷', + 'õm' => 'é°…', + 'õn' => 'é°’', + 'õo' => '鯸', + 'õp' => 'é±€', + 'õq' => 'é°‡', + 'õr' => 'é°Ž', + 'õs' => 'é°†', + 'õt' => 'é°—', + 'õu' => 'é°”', + 'õv' => 'é°‰', + 'õw' => 'é¶Ÿ', + 'õx' => 'é¶™', + 'õy' => '鶤', + 'õz' => 'é¶', + 'õ{' => 'é¶’', + 'õ|' => '鶘', + 'õ}' => 'é¶', + 'õ~' => 'é¶›', + 'õ¡' => 'é¶ ', + 'õ¢' => 'é¶”', + 'õ£' => 'é¶œ', + 'õ¤' => '鶪', + 'õ¥' => 'é¶—', + 'õ¦' => 'é¶¡', + 'õ§' => 'é¶š', + 'õ¨' => 'é¶¢', + 'õ©' => '鶨', + 'õª' => 'é¶ž', + 'õ«' => 'é¶£', + 'õ¬' => 'é¶¿', + 'õ­' => 'é¶©', + 'õ®' => 'é¶–', + 'õ¯' => '鶦', + 'õ°' => 'é¶§', + 'õ±' => '麙', + 'õ²' => '麛', + 'õ³' => '麚', + 'õ´' => '黥', + 'õµ' => '黤', + 'õ¶' => 'é»§', + 'õ·' => '黦', + 'õ¸' => 'é¼°', + 'õ¹' => 'é¼®', + 'õº' => 'é½›', + 'õ»' => 'é½ ', + 'õ¼' => '齞', + 'õ½' => 'é½', + 'õ¾' => 'é½™', + 'õ¿' => '龑', + 'õÀ' => '儺', + 'õÁ' => '儹', + 'õÂ' => '劘', + 'õÃ' => '劗', + 'õÄ' => '囃', + 'õÅ' => 'åš½', + 'õÆ' => 'åš¾', + 'õÇ' => 'å­ˆ', + 'õÈ' => 'å­‡', + 'õÉ' => 'å·‹', + 'õÊ' => 'å·', + 'õË' => 'å»±', + 'õÌ' => '懽', + 'õÍ' => 'æ”›', + 'õÎ' => '欂', + 'õÏ' => '櫼', + 'õÐ' => '欃', + 'õÑ' => '櫸', + 'õÒ' => '欀', + 'õÓ' => 'çƒ', + 'õÔ' => 'ç„', + 'õÕ' => 'çŠ', + 'õÖ' => 'çˆ', + 'õ×' => 'ç‰', + 'õØ' => 'ç…', + 'õÙ' => 'ç†', + 'õÚ' => 'çˆ', + 'õÛ' => '爚', + 'õÜ' => '爙', + 'õÝ' => 'ç¾', + 'õÞ' => 'ç”—', + 'õß' => '癪', + 'õà' => 'çŸ', + 'õá' => '礭', + 'õâ' => '礱', + 'õã' => '礯', + 'õä' => 'ç±”', + 'õå' => '籓', + 'õæ' => 'ç³²', + 'õç' => '纊', + 'õè' => '纇', + 'õé' => '纈', + 'õê' => '纋', + 'õë' => '纆', + 'õì' => 'çº', + 'õí' => 'ç½', + 'õî' => 'ç¾»', + 'õï' => '耰', + 'õð' => 'è‡', + 'õñ' => '蘘', + 'õò' => '蘪', + 'õó' => '蘦', + 'õô' => '蘟', + 'õõ' => '蘣', + 'õö' => '蘜', + 'õ÷' => '蘙', + 'õø' => '蘧', + 'õù' => '蘮', + 'õú' => '蘡', + 'õû' => '蘠', + 'õü' => '蘩', + 'õý' => '蘞', + 'õþ' => '蘥', + 'ö@' => 'è ©', + 'öA' => 'è ', + 'öB' => 'è ›', + 'öC' => 'è  ', + 'öD' => 'è ¤', + 'öE' => 'è œ', + 'öF' => 'è «', + 'öG' => '衊', + 'öH' => '襭', + 'öI' => '襩', + 'öJ' => '襮', + 'öK' => '襫', + 'öL' => '觺', + 'öM' => 'è­¹', + 'öN' => 'è­¸', + 'öO' => 'è­…', + 'öP' => 'è­º', + 'öQ' => 'è­»', + 'öR' => 'è´', + 'öS' => 'è´”', + 'öT' => '趯', + 'öU' => '躎', + 'öV' => '躌', + 'öW' => '轞', + 'öX' => 'è½›', + 'öY' => 'è½', + 'öZ' => 'é…†', + 'ö[' => 'é…„', + 'ö\\' => 'é……', + 'ö]' => '醹', + 'ö^' => 'é¿', + 'ö_' => 'é»', + 'ö`' => 'é¶', + 'öa' => 'é©', + 'öb' => 'é½', + 'öc' => 'é¼', + 'öd' => 'é°', + 'öe' => 'é¹', + 'öf' => 'éª', + 'ög' => 'é·', + 'öh' => 'é¬', + 'öi' => 'é‘€', + 'öj' => 'é±', + 'ök' => 'é—¥', + 'öl' => 'é—¤', + 'öm' => 'é—£', + 'ön' => '霵', + 'öo' => '霺', + 'öp' => 'éž¿', + 'öq' => '韡', + 'ör' => '顤', + 'ös' => '飉', + 'öt' => '飆', + 'öu' => '飀', + 'öv' => '饘', + 'öw' => '饖', + 'öx' => '騹', + 'öy' => '騽', + 'öz' => '驆', + 'ö{' => 'é©„', + 'ö|' => 'é©‚', + 'ö}' => 'é©', + 'ö~' => '騺', + 'ö¡' => '騿', + 'ö¢' => 'é«', + 'ö£' => '鬕', + 'ö¤' => '鬗', + 'ö¥' => '鬘', + 'ö¦' => '鬖', + 'ö§' => '鬺', + 'ö¨' => 'é­’', + 'ö©' => 'é°«', + 'öª' => 'é°', + 'ö«' => 'é°œ', + 'ö¬' => 'é°¬', + 'ö­' => 'é°£', + 'ö®' => 'é°¨', + 'ö¯' => 'é°©', + 'ö°' => 'é°¤', + 'ö±' => 'é°¡', + 'ö²' => 'é¶·', + 'ö³' => 'é¶¶', + 'ö´' => 'é¶¼', + 'öµ' => 'é·', + 'ö¶' => 'é·‡', + 'ö·' => 'é·Š', + 'ö¸' => 'é·', + 'ö¹' => 'é¶¾', + 'öº' => 'é·…', + 'ö»' => 'é·ƒ', + 'ö¼' => 'é¶»', + 'ö½' => 'é¶µ', + 'ö¾' => 'é·Ž', + 'ö¿' => 'é¶¹', + 'öÀ' => '鶺', + 'öÁ' => '鶬', + 'öÂ' => 'é·ˆ', + 'öÃ' => 'é¶±', + 'öÄ' => 'é¶­', + 'öÅ' => 'é·Œ', + 'öÆ' => 'é¶³', + 'öÇ' => 'é·', + 'öÈ' => 'é¶²', + 'öÉ' => '鹺', + 'öÊ' => '麜', + 'öË' => '黫', + 'öÌ' => 'é»®', + 'öÍ' => 'é»­', + 'öÎ' => 'é¼›', + 'öÏ' => '鼘', + 'öÐ' => '鼚', + 'öÑ' => 'é¼±', + 'öÒ' => '齎', + 'öÓ' => 'é½¥', + 'öÔ' => '齤', + 'öÕ' => 'é¾’', + 'öÖ' => '亹', + 'ö×' => '囆', + 'öØ' => 'å›…', + 'öÙ' => '囋', + 'öÚ' => '奱', + 'öÛ' => 'å­‹', + 'öÜ' => 'å­Œ', + 'öÝ' => 'å·•', + 'öÞ' => 'å·‘', + 'öß' => '廲', + 'öà' => '攡', + 'öá' => 'æ” ', + 'öâ' => '攦', + 'öã' => '攢', + 'öä' => '欋', + 'öå' => '欈', + 'öæ' => '欉', + 'öç' => 'æ°', + 'öè' => 'ç•', + 'öé' => 'ç–', + 'öê' => 'ç—', + 'öë' => 'ç’', + 'öì' => '爞', + 'öí' => '爟', + 'öî' => '犩', + 'öï' => 'ç¿', + 'öð' => '瓘', + 'öñ' => 'ç“•', + 'öò' => 'ç“™', + 'öó' => 'ç“—', + 'öô' => 'ç™­', + 'öõ' => 'çš­', + 'öö' => '礵', + 'ö÷' => '禴', + 'öø' => 'ç©°', + 'öù' => '穱', + 'öú' => 'ç±—', + 'öû' => '籜', + 'öü' => 'ç±™', + 'öý' => 'ç±›', + 'öþ' => '籚', + '÷@' => 'ç³´', + '÷A' => 'ç³±', + '÷B' => '纑', + '÷C' => 'ç½', + '÷D' => '羇', + '÷E' => '臞', + '÷F' => '艫', + '÷G' => '蘴', + '÷H' => '蘵', + '÷I' => '蘳', + '÷J' => '蘬', + '÷K' => '蘲', + '÷L' => '蘶', + '÷M' => 'è ¬', + '÷N' => 'è ¨', + '÷O' => 'è ¦', + '÷P' => 'è ª', + '÷Q' => 'è ¥', + '÷R' => '襱', + '÷S' => '覿', + '÷T' => '覾', + '÷U' => 'è§»', + '÷V' => 'è­¾', + '÷W' => '讄', + '÷X' => '讂', + '÷Y' => '讆', + '÷Z' => 'è®…', + '÷[' => 'è­¿', + '÷\\' => 'è´•', + '÷]' => '躕', + '÷^' => '躔', + '÷_' => '躚', + '÷`' => '躒', + '÷a' => 'èº', + '÷b' => '躖', + '÷c' => '躗', + '÷d' => 'è½ ', + '÷e' => 'è½¢', + '÷f' => 'é…‡', + '÷g' => '鑌', + '÷h' => 'é‘', + '÷i' => '鑊', + '÷j' => 'é‘‹', + '÷k' => 'é‘', + '÷l' => '鑇', + '÷m' => 'é‘…', + '÷n' => '鑈', + '÷o' => '鑉', + '÷p' => '鑆', + '÷q' => '霿', + '÷r' => '韣', + '÷s' => '顪', + '÷t' => 'é¡©', + '÷u' => '飋', + '÷v' => '饔', + '÷w' => '饛', + '÷x' => '驎', + '÷y' => 'é©“', + '÷z' => 'é©”', + '÷{' => '驌', + '÷|' => 'é©', + '÷}' => '驈', + '÷~' => '驊', + '÷¡' => '驉', + '÷¢' => 'é©’', + '÷£' => 'é©', + '÷¤' => 'é«', + '÷¥' => '鬙', + '÷¦' => '鬫', + '÷§' => '鬻', + '÷¨' => 'é­–', + '÷©' => 'é­•', + '÷ª' => '鱆', + '÷«' => '鱈', + '÷¬' => 'é°¿', + '÷­' => '鱄', + '÷®' => 'é°¹', + '÷¯' => 'é°³', + '÷°' => 'é±', + '÷±' => 'é°¼', + '÷²' => 'é°·', + '÷³' => 'é°´', + '÷´' => 'é°²', + '÷µ' => 'é°½', + '÷¶' => 'é°¶', + '÷·' => 'é·›', + '÷¸' => 'é·’', + '÷¹' => 'é·ž', + '÷º' => 'é·š', + '÷»' => 'é·‹', + '÷¼' => 'é·', + '÷½' => 'é·œ', + '÷¾' => 'é·‘', + '÷¿' => 'é·Ÿ', + '÷À' => 'é·©', + '÷Á' => 'é·™', + '÷Â' => 'é·˜', + '÷Ã' => 'é·–', + '÷Ä' => 'é·µ', + '÷Å' => 'é·•', + '÷Æ' => 'é·', + '÷Ç' => '麶', + '÷È' => 'é»°', + '÷É' => 'é¼µ', + '÷Ê' => 'é¼³', + '÷Ë' => 'é¼²', + '÷Ì' => '齂', + '÷Í' => '齫', + '÷Î' => '龕', + '÷Ï' => 'é¾¢', + '÷Ð' => '儽', + '÷Ñ' => '劙', + '÷Ò' => '壨', + '÷Ó' => '壧', + '÷Ô' => '奲', + '÷Õ' => 'å­', + '÷Ö' => 'å·˜', + '÷×' => 'è ¯', + '÷Ø' => 'å½', + '÷Ù' => 'æˆ', + '÷Ú' => '戃', + '÷Û' => '戄', + '÷Ü' => '攩', + '÷Ý' => '攥', + '÷Þ' => 'æ––', + '÷ß' => '曫', + '÷à' => '欑', + '÷á' => '欒', + '÷â' => 'æ¬', + '÷ã' => '毊', + '÷ä' => 'ç›', + '÷å' => 'çš', + '÷æ' => '爢', + '÷ç' => '玂', + '÷è' => 'çŽ', + '÷é' => '玃', + '÷ê' => 'ç™°', + '÷ë' => '矔', + '÷ì' => 'ç±§', + '÷í' => '籦', + '÷î' => '纕', + '÷ï' => '艬', + '÷ð' => '蘺', + '÷ñ' => '虀', + '÷ò' => '蘹', + '÷ó' => '蘼', + '÷ô' => '蘱', + '÷õ' => '蘻', + '÷ö' => '蘾', + '÷÷' => 'è °', + '÷ø' => 'è ²', + '÷ù' => 'è ®', + '÷ú' => 'è ³', + '÷û' => '襶', + '÷ü' => '襴', + '÷ý' => '襳', + '÷þ' => 'è§¾', + 'ø@' => '讌', + 'øA' => '讎', + 'øB' => '讋', + 'øC' => '讈', + 'øD' => 'è±…', + 'øE' => 'è´™', + 'øF' => '躘', + 'øG' => '轤', + 'øH' => 'è½£', + 'øI' => '醼', + 'øJ' => 'é‘¢', + 'øK' => 'é‘•', + 'øL' => 'é‘', + 'øM' => 'é‘—', + 'øN' => '鑞', + 'øO' => '韄', + 'øP' => '韅', + 'øQ' => 'é €', + 'øR' => 'é©–', + 'øS' => 'é©™', + 'øT' => '鬞', + 'øU' => '鬟', + 'øV' => '鬠', + 'øW' => 'é±’', + 'øX' => '鱘', + 'øY' => 'é±', + 'øZ' => '鱊', + 'ø[' => 'é±', + 'ø\\' => '鱋', + 'ø]' => '鱕', + 'ø^' => 'é±™', + 'ø_' => '鱌', + 'ø`' => '鱎', + 'øa' => 'é·»', + 'øb' => 'é··', + 'øc' => 'é·¯', + 'ød' => 'é·£', + 'øe' => 'é·«', + 'øf' => 'é·¸', + 'øg' => 'é·¤', + 'øh' => 'é·¶', + 'øi' => 'é·¡', + 'øj' => 'é·®', + 'øk' => 'é·¦', + 'øl' => 'é·²', + 'øm' => 'é·°', + 'øn' => 'é·¢', + 'øo' => 'é·¬', + 'øp' => 'é·´', + 'øq' => 'é·³', + 'ør' => 'é·¨', + 'øs' => 'é·­', + 'øt' => '黂', + 'øu' => 'é»', + 'øv' => '黲', + 'øw' => '黳', + 'øx' => '鼆', + 'øy' => '鼜', + 'øz' => '鼸', + 'ø{' => 'é¼·', + 'ø|' => 'é¼¶', + 'ø}' => '齃', + 'ø~' => 'é½', + 'ø¡' => 'é½±', + 'ø¢' => 'é½°', + 'ø£' => 'é½®', + 'ø¤' => '齯', + 'ø¥' => '囓', + 'ø¦' => 'å›', + 'ø§' => 'å­Ž', + 'ø¨' => 'å±­', + 'ø©' => 'æ”­', + 'øª' => 'æ›­', + 'ø«' => 'æ›®', + 'ø¬' => '欓', + 'ø­' => 'çŸ', + 'ø®' => 'ç¡', + 'ø¯' => 'ç', + 'ø°' => 'ç ', + 'ø±' => '爣', + 'ø²' => 'ç“›', + 'ø³' => 'ç“¥', + 'ø´' => '矕', + 'øµ' => '礸', + 'ø¶' => '禷', + 'ø·' => '禶', + 'ø¸' => '籪', + 'ø¹' => '纗', + 'øº' => '羉', + 'ø»' => '艭', + 'ø¼' => '虃', + 'ø½' => 'è ¸', + 'ø¾' => 'è ·', + 'ø¿' => 'è µ', + 'øÀ' => 'è¡‹', + 'øÁ' => 'è®”', + 'øÂ' => '讕', + 'øÃ' => '躞', + 'øÄ' => '躟', + 'øÅ' => '躠', + 'øÆ' => 'èº', + 'øÇ' => '醾', + 'øÈ' => '醽', + 'øÉ' => '釂', + 'øÊ' => 'é‘«', + 'øË' => '鑨', + 'øÌ' => 'é‘©', + 'øÍ' => '雥', + 'øÎ' => 'é†', + 'øÏ' => 'éƒ', + 'øÐ' => 'é‡', + 'øÑ' => '韇', + 'øÒ' => '韥', + 'øÓ' => '驞', + 'øÔ' => 'é«•', + 'øÕ' => 'é­™', + 'øÖ' => 'é±£', + 'ø×' => 'é±§', + 'øØ' => '鱦', + 'øÙ' => 'é±¢', + 'øÚ' => '鱞', + 'øÛ' => 'é± ', + 'øÜ' => '鸂', + 'øÝ' => 'é·¾', + 'øÞ' => '鸇', + 'øß' => '鸃', + 'øà' => '鸆', + 'øá' => '鸅', + 'øâ' => '鸀', + 'øã' => 'é¸', + 'øä' => '鸉', + 'øå' => 'é·¿', + 'øæ' => 'é·½', + 'øç' => '鸄', + 'øè' => '麠', + 'øé' => '鼞', + 'øê' => '齆', + 'øë' => 'é½´', + 'øì' => 'é½µ', + 'øí' => 'é½¶', + 'øî' => 'å›”', + 'øï' => 'æ”®', + 'øð' => 'æ–¸', + 'øñ' => '欘', + 'øò' => '欙', + 'øó' => '欗', + 'øô' => '欚', + 'øõ' => 'ç¢', + 'øö' => '爦', + 'ø÷' => '犪', + 'øø' => '矘', + 'øù' => '矙', + 'øú' => '礹', + 'øû' => '籩', + 'øü' => '籫', + 'øý' => 'ç³¶', + 'øþ' => '纚', + 'ù@' => '纘', + 'ùA' => '纛', + 'ùB' => '纙', + 'ùC' => '臠', + 'ùD' => '臡', + 'ùE' => '虆', + 'ùF' => '虇', + 'ùG' => '虈', + 'ùH' => '襹', + 'ùI' => '襺', + 'ùJ' => '襼', + 'ùK' => '襻', + 'ùL' => 'è§¿', + 'ùM' => '讘', + 'ùN' => 'è®™', + 'ùO' => '躥', + 'ùP' => '躤', + 'ùQ' => '躣', + 'ùR' => 'é‘®', + 'ùS' => 'é‘­', + 'ùT' => '鑯', + 'ùU' => '鑱', + 'ùV' => '鑳', + 'ùW' => 'é‰', + 'ùX' => '顲', + 'ùY' => '饟', + 'ùZ' => '鱨', + 'ù[' => 'é±®', + 'ù\\' => 'é±­', + 'ù]' => '鸋', + 'ù^' => 'é¸', + 'ù_' => 'é¸', + 'ù`' => 'é¸', + 'ùa' => '鸒', + 'ùb' => '鸑', + 'ùc' => '麡', + 'ùd' => '黵', + 'ùe' => '鼉', + 'ùf' => '齇', + 'ùg' => '齸', + 'ùh' => 'é½»', + 'ùi' => '齺', + 'ùj' => 'é½¹', + 'ùk' => '圞', + 'ùl' => 'ç¦', + 'ùm' => '籯', + 'ùn' => 'è ¼', + 'ùo' => 'è¶²', + 'ùp' => '躦', + 'ùq' => '釃', + 'ùr' => 'é‘´', + 'ùs' => '鑸', + 'ùt' => 'é‘¶', + 'ùu' => '鑵', + 'ùv' => 'é© ', + 'ùw' => 'é±´', + 'ùx' => 'é±³', + 'ùy' => 'é±±', + 'ùz' => 'é±µ', + 'ù{' => '鸔', + 'ù|' => '鸓', + 'ù}' => 'é»¶', + 'ù~' => '鼊', + 'ù¡' => '龤', + 'ù¢' => 'ç¨', + 'ù£' => 'ç¥', + 'ù¤' => 'ç³·', + 'ù¥' => '虪', + 'ù¦' => 'è ¾', + 'ù§' => 'è ½', + 'ù¨' => 'è ¿', + 'ù©' => '讞', + 'ùª' => '貜', + 'ù«' => '躩', + 'ù¬' => '軉', + 'ù­' => 'é‹', + 'ù®' => '顳', + 'ù¯' => 'é¡´', + 'ù°' => '飌', + 'ù±' => '饡', + 'ù²' => '馫', + 'ù³' => '驤', + 'ù´' => '驦', + 'ùµ' => 'é©§', + 'ù¶' => '鬤', + 'ù·' => '鸕', + 'ù¸' => '鸗', + 'ù¹' => '齈', + 'ùº' => '戇', + 'ù»' => '欞', + 'ù¼' => '爧', + 'ù½' => '虌', + 'ù¾' => '躨', + 'ù¿' => 'é’‚', + 'ùÀ' => 'é’€', + 'ùÁ' => 'é’', + 'ùÂ' => 'é©©', + 'ùÃ' => '驨', + 'ùÄ' => '鬮', + 'ùÅ' => '鸙', + 'ùÆ' => '爩', + 'ùÇ' => '虋', + 'ùÈ' => '讟', + 'ùÉ' => 'é’ƒ', + 'ùÊ' => 'é±¹', + 'ùË' => '麷', + 'ùÌ' => '癵', + 'ùÍ' => 'é©«', + 'ùÎ' => '鱺', + 'ùÏ' => 'é¸', + 'ùÐ' => 'ç©', + 'ùÑ' => 'çª', + 'ùÒ' => '麤', + 'ùÓ' => 'é½¾', + 'ùÔ' => '齉', + 'ùÕ' => '龘', +); + +$result =& $data; +unset($data); + +return $result; diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php new file mode 100644 index 0000000000000000000000000000000000000000..a014e4b4595544e94b92b16655ec45eb6616c1a8 GIT binary patch literal 3779 zcmXZfbyyT_6o&E7*0H;FRAfQ1+hxJ-?!Z`K6%-LSRP4kq1e8$h?(UfRy1To(yJ7C< zFZOpmXV|%R&wI{nbZly3s$m3z-e6L^8J6G;dQFe%_4~bPW`tpyu7_NvC#L96RFR6I zVyHMOj!K{ss3fxTVJTP+l~$Mz%fJ<=tis)}oVXPl;x*k zp+=}NYK%-|t%Oa)Rj{eJ8a5Nxz%X$wYz_?+j%uSg7pxB>bmayZDQ<)<#7(fJxEV%? zTVN|#3bjV1Q5#goQCp{FtsM^9ft?Q8JE-Nn?m)21K}V43pcBY)&>3Vq=;ENH^SUd+ z9tYh(jssVB-FPl^i+L~_)<7Oq6UC@>AB=_dP!D9Ho+{lBdqMjk>@6OKeMA-a6%Ua1 z6A!`u;t@DNJO&4f7vLah>3s*o)`UY)G#ZK`&@j{z4M$7S2o#P+BKrg!C7y(%#Zz#M zcpQ!u&%klwSvX!i2PcT9;Y6_jPJ&I)WE6(t;$RCn1x2E%$c?5UOK&nAwj%VRHfRR2 zbtvOSox%iB2ihm6p%fH@=Al@W zitOufzNksy7c~h2q9#F5)D#Jc+6fCp?SzG*=H(($QzQ*e=Pnkb?q~^WhL)lpXc;OT zZ_XxM4n1fEYKm4Oo6+D}1-*o;(G0W(#iO+-0j)zml#XVi^=KB_fD+M0l!P`ROUGlg zc#Cukw9mt>;vKk6ybHJMTAlnIqORQuXH%Pj=Ad0D8D*lmC<~>aY%~w;MyY5InvZgj zALSxTLm^MRNtzFBHS}JkYQ=p@(bQp!u5wrjuMGMg} zv)7u^A%D1;;ML+;%nkh=UPZ&vYiI;|9gRe9pi$^eWZi&oL0edg<~Xu^-s81yk3i#|c)(5GlT`V37#pQDNB z3p5FRi7b6VUqL&Q^lLF2ej{eUZ$%zSUEhgWq~F7~=m*pe{fOG5pHK(%GwO(bL7mXA zs5ANvbwR(QuILZc4gHBM_1$04&LjO>%!mJoIq+XG7ybvWfn>il`#0gesxRs4}X8s-UWK5EO#yqxvWmg`)T{c<<^m5)Q*r1d2cnPy^Hu zHAImp5;a1NP-D~>H9<|Bn!0>8b#*gWH*EQ&*Mr~~SNI--uK6Y7LIqt2)c z>VmqWuBaR8hPtEfs0ZqSdZM1F7wUz2qu!_w>Vx{CzNjDShx()bXaE|32BLvz5E_IA zqrqqh8iIzRp=cNyhK8fzXapL8Mxv2u6dHv_qtPfn9^SjUOpk$M&{#AUjYH$mcr+gQ zkPl5j6Ho$5KoikKl!y}1Bs2+4Mw8JLGzBH0Bs3LGMbpqUl#G(mbTl2MpcFI%%|NLr z70pC5kstX{8cIU}6hP@H9nC_s&}=jt%|UZe2FgHl(OfhS%|r9ie6#>9Knu}AveBJsLjT>ft8V{K@{+nif9uLcz+5Emo%-3}T!#Ed9^fx!(Qf?OYjs!K_ri zXjTqiGAns6o0YX!%sKqMSIsx@Yv!BybvZ}*dc&+W_oi8^>y}yf|CU+H>us~1|F&6q zeaEc4zH3%K-!p52y>C`tKQJqgADWfNkIc&B$7bd26SMO6sT|Z!{LHK^___5fk6)OT z$1ly=Kwp`azpu^8-#2nl`|MjgS02AJE01^NY|Z0)J6GO*kb`>Pel+WS`^l_4|7dP-ViAl!Y~&1>){2Gad0UiC$J{sW=Ke9`~_ literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php new file mode 100644 index 0000000000000000000000000000000000000000..aba455b5ec97b2e9987a607421d5b571f3cea32e GIT binary patch literal 3779 zcmXZfbzBsC6vp9e>)72oDzc#1?XqBZcVMir3W|suDt2NQf(qE(-Ffc}+-uzK?(XiA z`M!U#&*we6%yE84Oj!!L^V+@m1e-&;$~O})Y%lQYR=;}1lt_61(^=ofh-5@!FC57929jP zcO=;9pcBY;;OeXk&w*|+7e>P>$b+h)7?tjUv9K2Ef=tv^rTbtvXdi&x#Y3=%sN$aD ze$rmzLD*Y74Ew+ZsIS8Fu%D>5?hl(24nWapAc{bPP*XG*H9$j9I2wxV<8YXG0uC2X z!V%&zI8rC@BVmrHBVn$nbvaMe5=n!3YTx;=GZ(c$wG6v! zAi9S>>O{C8 z>O{CGUgf1OiCWN?#iOKGM15XY#apD;#M|(?cn97PwUKYag@m^hYJ1-nwfXOemngmq zZGEeJT+}r_0lQLbp>D`V-BBLuf$~vL^d#zqoY({M4h z&nUbApA|2{=R~#Y^Ds|~`~}#L+80rO^b#6?UPc4aD`*gU6%9tOp&{sXG!(sohM_l+ zbsfG1ZEc~q;iF^JS+4IWRq?x`rujWlP5-{Amij(2uA!`U$l` zKclwj7t{{@irS;!PzUro>WKb8ozS1iQs4ar?Of8oVMFwf!fg1jm;?WVRzZ(Ox(y@D k?+b*IgQh2(pQCOgloId-Bb?u+1qFUzFyv1$Rp&PT2Vg`sAOHXW literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php new file mode 100644 index 0000000000000000000000000000000000000000..e8e2370303b50cecec4043f3e0a324155eee90e5 GIT binary patch literal 3210 zcmXZfS6CER7{>9~aje+8qaXu{y}K;f#e%&dSXNjCMZ{%E#NK;i7klp|Rup5+kfv9u zu6ku}SLy90k@J7Ac7D(M&9n2J=X__LiA%`I$g!;4pf8x2W=E#`f&`VW zMqCS9itAu2aXpL`H^A1g9BPBgqqeAmQ9H9`-AxAV!DfRF26fDJM}n;eoxnDO&S1Mi z7qG*it3g?F-Hl+UL3gmr!0Dj}-wi$D9vBB}Aupp`i>J1@JHjtgD_b<1Sh~|CR#x4TI3tTF-^gmS~sd<0%x+Lp{)Z6oD3?o@gO@e+row)*|Rd zi&1m56#39HG!-pJX=nvXM=OyZtwPh#YBU|KK^bT*%0%msdj_r-Z@`V>MYu`405`)K zXbYN&wxTSw4b4K^Q8wCvW}^a>gLa}hXcr2geaJ0>2SjbdgJL1+A-D(~M!Dz+3ZkPZ z4;@1vqT}czbOOyqCs95+h3292$o&*vfRoTgg&LW98U{n6KG0Qv?cqI+l{x{us*@LRYLeTN32@6llN0~&&UL`mo;G!#8R!%zqfM-R~m z^azbakCA&FK7sGgb8~(?g~i$h&)_J+=V&x~fySVhXe@e##-Z0}JbHtY(OWbDy+iIL z_%m#WenIWguc!n14Ru7nqfY1#)EWJWx}d*MSM)dPhWKRu(&%c5F!xVNkVXUcUVXufe^xG0|a-HHf@n4xVt+PD{azJCw14< z-CZb|_kTX!^Lx(By>sWBx%+HnbW&WB$CDiJ1>&cBgJOIEpEt_u^ZR|N-cXO%8**QW zH>yj)CA>g|P$5(p6-Gr+5mXcvMa57tR2&sYB~S@e5|u=yP$}d=9#k5YMrBYLR2G#* zTM2%1*6oi6MW7HT0qhK^K1m3&49tnk^C=7+6Ca4K& zikhNu6posqW~e!8j#{7=PAy%3wsdhT7q@b8YZte6aT^!6adBH0w{>wl7q@e9dl$EN zaR(Q7aB)W$cXV+l7k6@TNM}~j8AYH76p12H6pBJ!P!|-9qET1W6?H@1Pl!y}1Tr?LY zp(Hd9%|m|VN69D|1yBH`pcFJ8%|{E+0<;h)}fA23#c`gR8~;aE*8nt`+yfb>bnoUOWQR#N#ksJOS?)kHQDUGcZFu4IdOw z!iU5)@L_Q++#sgIjpAXrNn8gvix*+0co}Ai=V7*Z9c~e?!mZ*hxJ}H4+r^!52h7nv z?-UP^-6d*ccfCq=d4DN*lmT2!-~5w-DWVScujdCsg2Id9&~vo6S)tMEm$ z+WL~5rKevut2$TAs^uf*Ebe#JtnytmYkk+vTNr=CybIqnt2rJu?;w9m&eYC6X3ix4 zxLIACW7gK^nsxst%qy7xq*=wdEobc}|CD(Te%ibpKV#NT?ME@i~ktrY3?V=s#QN#b~P*e z4CY*dpDU|%exbQ4>h%ZCIZOIarPI_-e<`ime_L9o;~#mY zzLWoIxPDarQ#xB~yQ_2o!y-JMAb)IfN>f{j)6?;ExTY_!GSv H7vcFIjh|ty literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php new file mode 100644 index 0000000000000000000000000000000000000000..3771c8f624117ef901a2e0a79449a865ae717aef GIT binary patch literal 3779 zcmXZfbyQSq6vp9e>)73LRAfN0+hM@&?!Xvf6ciCBRP4kq1eCVByW^bO-QAsfy9>_m z{cGk~@BU_;1^e53CMqT+A;sbF2RwnqI3qOP6Yv;r!{hULQjKtjVK^Ug8t&-gm&jt3 zKqXK~R1%d!rBG>P=D{+s0xGL84VHr|QF(=XU9C==12%$ zH9<{K2ns<4GFQQ-;%eATTmzenYhkFk4z_>}6o%@eSSM@_Q3RTXTxdF)hGwAF$b;IVnaI+W zj1zSS<3(L(uc+%hOVs_HEow3)h?+%-B6q|&2bxECjJYrpC7~8*9-5AlQ8b#5Vo(aQ zuE7PO=73Ms9Po>p0|8MpBq(YlEEKg77Kxgci$%?lR5*jDSb}<>rKmYthI*pqsA#y^ zdvFDGqm`%`T7@hIgL5_X5UxQp(OMLT)}eT`9(hq3nuRu?*=Qq5K$}n^+Kf!yjxFL% z(yh=s2e*m0;db#3+@Z6&_d7+M-38}Rn~vt9-6#oVpm``0C8I1fAMHUYXfIlTvXKwv zAX76TSG+-*2Q4*pzEZVffzmXJ3zcec?h`MQ?uRST0pv#qQ2-r6L39``L`TpfbQCQ{ z$51Ldj+USk$kfxdPXdOXLVMS@SLdaabDCyxFBjFTokYJQI|x` z=gXqj#TD@i#aG2!@S3QWyDqBbZipJlH{mjl-cqRHeOuJvzaw6v_%5{crScwJN_Zdj zLMG~sEYt@*iu$6*P(SoI>W`j41JILbAbJW7LQf-8E9x0&>A{~B_2+v|yujJ##f$I- zQO)`yTu%5B8jM~>L(nT|D0&qQL$9IX=yfy#y@5ueH_<5c78;G-M&@<+4zx6g-WAmq z?};jYU(|K}Kvdg*2#Z#*J(@pKs^!SBR$_(0?+jN%}o(hkiiq(T}JD`U!PJKci0Q7t|U3in^fR zP*?Oj>W2P6-O-=ORNwsttz6Q-#XR_rm<|6GbKrl_EG%M#%i#$1dHunpfZ-0~=cvmO YO!j*N;r4IS;sT#H5cDM*s&hI12mJdrGXMYp literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php new file mode 100644 index 0000000000000000000000000000000000000000..2d67d33f9ed9e1f8650061e59b0b04ee9942c21c GIT binary patch literal 3834 zcmXxnbyyT@6vy#v>)PEqDiVs_Qg(L-#tJAXA}+fsHYV7ytliz+buZoyxZTO^?hdcK z-{1S!oX>OKnK?V}IkV41#-t{ux?E{qw>K%y35s`n-AUqLLLcmqM{29 z;RPy$3ZcTNFe-wIprWWKDu#-o;;1+(fl8o~s3aT8xyxNaa$9&HE}x=w=;2j6Sp^U2NQQN zaYqw(G;t>rcQSEEXR7FoB2Wa1M3E>8MWJXEjbcy?>VmqUuBa>OhPt8ds5|O`dZ3=D zC+dZIq28!B>Vx{AzNjzihx(!Zs6QHj2B3jxAR2@Qp}}Y{8iIzPp=c-?hK8ZxXgC^y zMxc>sBpQWAq0wkG8iU55v1lwBhsL4tXgrFIg%6LWrzgM(Xd;@3CZS1aGMbFs$c?6; zDJTxbp?DOJ5>Nt~il(AzXc|gHi6{vrq3LKknt^7ZWR#3%qM0ZKrJz}87D`2_Xf~RS zJjjF6P#W?gFY+NDnuF$`xo9q$hvuPll#b@3`Dg)JfEJ>KXc1b37Nf;z30i`dqTJ0e zL)-$FiCf`v(GORM*>I&8fUCr9aJ9G{W{NvtmbeqH5qH70;%>N3+ymE(d*KFgAKWPJ zhnvI$aI<&_ZV?Z|t>O{r7mvbh@fZw<$Kf{d1l%rOfIGyCaHn_)?h-G<-QpFvN4yI6 zir3&i@jBcu-hc`yAsOM2@&FEv+>ZKg()2zR5t?NH-t$lpL zT0QZkoULhl%39<0w6!Mr8Ee(^thMIiIcp8o^VXWz7p(RBa;;T=p0%d%MQe@WOV--Y zm#sC^uUP9v^s2SqQ?FU8e_pp%|GZ&+is$*J^-27e?AP_)wq8g69XX)>eb-vE@Se5S zzi+MQ@qxAW>qDHE#pOSOxq4dp;u*3Zi)Y~{I(H5HRM~UzGi6oC=i+*@Ux;hrm*NKa z70lHLe=X`ae=%+%KiiAoafemDxIlL`b%k@{kKhPF#eG<^#1%;%k_`&pV9%%!2_iW7#87j n1$h$Ee92xXDwwa>2$wG9nb?j~(6$!;|5wN>EFh)Q@5pft)Ol;iMT?4SY*6xnooteAc-7(wU z9j=_;bN-t5`+47c=iGCi3!mv0pOKQ`a%K8FzSKl_Sdz!*amTtnUau$H9qDqrBkqfE z$HoHzs)Q<|%BTvef~umbs2ZwZAIo0cwC6qK3$g+^7+1gc_s9s0nIVx{CzNjDShx()bXaE|32BLvz5E_IAqrqqh8iIzRp=cNyhK8fzXapL8Mxv2u z6dHv_qtR##8iU57v1l9`hsLAvXabsmCZdUG5}Je(65zd0lj+HDGMa*>ps8ponuew! z5AvYtXgW$ni6{vrp=6YdW}q2pCYp&-Pzp*#sc06Og=VAKC=I2dIcN?_N9kxTnu{_} z2AYTFAusZxOq7Xy$cM5}7MhRdqXlRIT8I{+Y?O@_p+#shT8x&UC1@#Hik6{eXgOMr za!_zBTmb{O;7aj0T&3X^aJ9OJ;Tm-h!L{lhf$P*=2Xmpb60TQwE4*Lb0{DQq4Q|lz zNw`tn>+nGsSPdT%*T7BUdbn9U3b%;bjjhnxNH*YbzfX6`kYa8HP`Yr{GEPHasQji%&yGu{)!#j{mHvMW2JAg3a9Py!94* z!CFzfDCa4Om#npcmvK;Wx*~4iZdXN}#WhjKdL4%Hb#gbXwYHnqI=fre+S1!Ns7<>A zo&9|GBbv_Jgdere!;e{C!hUOQdcaz#3tB5Hjs zN8S*XzBk1?48H|Kc?!ha*2>E}azQTh?^-Kf?^$d9eQWK)2i7{H4{<Ba=`}v)^ zI>_%~C`U*41NNWhn|>6}!=LQ5BK@=4I-Orct@>B-7#IHr1A2(xVJK%W?LRbq4*scj zt`_!}+PeC0QU8?w5f!3;MZHS@!BBy+e^>27M#Z>XVcz7-tTdlHHk_ZVF|Mri%w%7r T`Tbfr;7#^rdDGpRi*fxA$_!4T literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php new file mode 100644 index 0000000000000000000000000000000000000000..0b314c80bf4cb090e3973d71286a54e5d00cdf3f GIT binary patch literal 3809 zcmXxnWport6o%o&VQ_b7AVeUzGZEa~CCHEj5(ptoCP2{O?n!WWcemXcmUVaEoppzG zXGy(Z{p$OiTRm0X_g3|psMxfmG?y#g=kX=SJ0S@kpT~)IJYKIS(+PJuPS|5%PIOG( zB{EO>P(G9&s*9MS9lR1?)i zwNNco8`VY*a!?&q2h~M&Q9V=-g`f~rAJs>pC=|to!ADoqBjGR{MW6`O05w1jQ9~4o zB2gpM2sK8HQ4`d}sHy4CrY3G?;$|jpZsO)9ZeijUCT?lsmL_gx;#MYZZQ|A@Ze!v$ zCT?ruwkB?8;&vtuYtJg$BR6uRC=`XFQ8bD{F(?+rq7JA7>WDg`PN);=j5?z(s0-?f zx}t8V8|sd_qaLUS>WO-yUZ@x9je4U#s1NFk`l5cQAL@_#qXB3D8i)p>L1+*fj0U42 zXb2jLhN59;7#fa-qY-EX8i_`tQD_tzjYgxmIQZyldU^~TgT|tK?Q7W2-rlB;HhNh$G z$cwxv9i<~5@}Ufrfo7l?XeOG8W}#Uq6J?^=Xf~RI=AgM~E}Dntq4{V&T7VXyEEHG{ z7m7FGBJmhpEbfO(#Dj3DxEC%H55eW)5x7D;4p)jN;41MbTrHk~YsAxVt#}fy6PLjC z;!?OlTnRUdhv6o18Qd&hgxTU{m?NHtx#A7DMZ5;Lig(~PF&AzZcfuXwRk#!S55Qf@ zZiTzWEpQLKw+Zf5b|2g)o`UQJbPl{^7Q=%T>w5V1&BkHxEg~42{@|?Ba$9e0`%ymJ|UW6}NtEn&Hz(UfOMUB29 zW|6%L{n{?qU@%98yKb$u-LO{aZd&i+=Wb!Yw%ct{8|scmXK!HihXZ<;r^Lm~_OwRlY{$=7Yc)kwOt)2J0wN8&0to3v+T5I($ zVZX}sG7Ow$_E$vR{HnN$>}%p`_`0|Pz5(y5>)%v%E!nrkb?|L*J$wfSv$Z$hwO&L1 zJvmo%y>G3<>I3Z8OZgB6boWPgv?}zm(rV>T#68Rv6jgvvMeT#n#7hkRT+D%AK)}avhS%*)NpM0E-Cnm7WR2-E+B~VFJ5|u)wP-#>el|f~Y3%O8PR2G#(r zcQSEj6L&Uo7ZZ0eaadQrqAQ9*Q79TkqZkx}Vo@xLLvg4Z>V~?b?x+XqfqJ5zs2A#m zdZXT`59)*ZqQ0mf>WBKH{%8OifCi$0Xb>8N2BX1f2pWQhqM>LQ8it0W;b;UJfkvW{ zXcQWSMx)Va3>t&RqOoWk8i&TC@n`~?fF`1eC_WzE|1~{52~I+j(PT6QO+i!9ROCi( zG!0Ed2`B+2qC}L0lF)QC9nC;9P%=tJDJTWaL^IJWGz+DoR5TmSMrkMw%|UZeI!Z@# z(Ol#~9+ZJHkQaGTCdx$f&^$CB%|{E+0+fZa&_c8jEkcXXVzd}7K}*n5v=l8v%g}P< zUk6u+x8X|hG+ZU-!PVk1xCRCMU{KRP zDQfzsRJ@zw)8ZcZ5cHjeXEavtJ*(nPWX~yk2%gtiwaNwY7TJriAXmL|$$AI*hpl(w z%W}3F@rt$9{t@igVqXySKVoz3XSt<}9gYc0CpT1^+QUe5TSwchsx4ruC6imRx8O4T`9il?phHP2Y< zD#^D#!T4vb598;oHM{4n_4O}cpSI~m7|_bTBx>->;ufC$3iNM;uPVD0z6OK3w_aDV z&eI#B9`&Zi>R7)83$oSrZ(FOC-;s0I^R9QTb;RDo!93FMi@NAOu+`e353ygZ{E?`0 zQXpyrK88W<*C(Q0{Hdt#`b^Yjd@kw|`9jo_zl476{8!56Fo&(=;IRL6g( zVjY<8p-&zBgQ&~vN0_g%KZ)9kpG9rsFQPW)SLoAUqu-$a8Xx()ve)4sqNebtc#7;_ zFke^O-!OQI>_4L3`>&|t|6oC`7Wy9c6*3~qA^BQC*ble=%f9FaQ7m literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php new file mode 100644 index 0000000000000000000000000000000000000000..48440ba1acf8727aa87bb9faa657f640dc2ec98a GIT binary patch literal 3809 zcmXxnby!qe6vp9e>)73TR3sF;rR?qwj1f>!M4TB^?7(gX?C$PvZuiXXj=A04Df{>B zzh=G9w@%GoXU{Xyap}qFE|=Hm_N62^A&G9E+lg`99*;ZI33oY8*dt+1OlC@PAIp<<{wDvnB^63B&Is3a;s*0+iYN$G@j%uJ9s3xk3YN1-FHmZ&4pgO27 zs*4=tpn9kts*mcU2B-lFK_RFiYKTHnD2fk*4?oR}gu`$Yfg(^N)Ce_3jZq|uL`_f= z)D$&E%}_I==4L*do4SRmTbR0~sau-5m8n~qy0xiWo4Spu+nBnosoR>movGWIy1l8} zo4SLkJD57GBX`jeMWHAZjiONuib1g`7R8}B)CqM$ol$4h1$9APQCHLrbwk}zchm#* zKs`}U)C=`Oy-{z}2lYXHQD4*#^+Wwpe>4CMKm*Z0GzbksgVA6#1Pwt$(NHuD4MW4x za5MsqKqJveGzyJEqtR$I28}^u(O4884LFsn5 zQRynUN$C!_S?OxHMd?nsRp}a-t#lX6QMwl9D%}mYDP0G*E8PosDBS>eD%}TnDcuNn zD^>FzrDsX^D%DNyQ+kqgzjz)V5I4bt;stm})Pf#{0e$U9lpdw|sCXG36SdsO#Ve#I zL@oD87|<}BQhJ!?)8Zv~M${0Vg?Xn)&xyC-c^J&qGhDFNfM2xM*)GZ1n)u7sx|b_B zpuxNf{YSXkHSs#UE^72{z+lcH;+xjGw_Da4o{)>?rF z)>@!E>(iX>QELtCW7dnwAGf}ZpTPc`@JUgx%2Vpjk)O8K-8^G`g2SJ+)-*k5y`TJf zYdzfy*1G!_ah{gR5B-{gfT%b1B~efEvZx1tMZCk6Ulp|ouZed_Ul;WrzaicueG>+= zH34r~YZrK1&ed-8j(prE`6c z^UiRtA9S!b;2(9cHinRtOq$7&&dReGG}-;}P0zbn;s|4^zQjX#xYvj0-5 zpQFE(9^+L1z&!C^7|hiw{iise5m7Ezh$qRLk?M0|Liw{A<;qC&Ci%k6KiB*QPm(Xg Kljf)|%Jn}O%1rG5 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php new file mode 100644 index 0000000000000000000000000000000000000000..c9cac0c35d7c8d46246383d6a092ba47f0422fbb GIT binary patch literal 3194 zcmXxnRd7^S9LMqEaB+9IK!`waXR`_J?h<5477_>{tN=j+rMRM#LZwk@R0fqnWl>pF4wXaYQF&AWRX`O{MN|n@LJo3JWmFke zK~+#yR25Z2)lhX*9o0ZJP)$@5)k3vUZB!f8L3L1FR2S7l^-z6OA2mP?P(#!ZHA0P0 zW7HTmK}}Fo)D$&C%}{gH9J$CvEl>;8617CFP%9LN;!tbU8pWe{l%4?JK247#!bFsW zl29Ae2DL?PQ8G$K?NB?^9<@guPzR%qrawEH+{xrlCU-Wuv&mgd?qYIRle?PS&E#$- zcQ?7a$vsT&VRBECdz#$Klkq3ED3Q9p<&ZMRUD1(R?%?EkFxU4$46b(L$7qa?v8R z2<4$Xv=}W$0Te(%6ht8uLSYm}OVARu6fH%|&@z;d^3ig%9IZer&`PuttwO8NYP1@y zL2FO}`f(RrEAEEt#69p`aW7miM&Ns5A>1HF;YM*E+$8RYo5cfgi+B)j6%WB};$gU5 zJOX!!N8wKK7~CZuhr7l1;U4h=xL5oTM#PU`p?CsD#glNKcnaJo zyVeDazh|wj{8}zllYV2Z?|o~n)qiKL2KnAvt@wkr=6~N>^Lv0}+S{L0j_3wGwBE*a zAIZ^8__6hR`~=4|o1bl2tNlggPZ<4Fya=C(+R9(WkE#A9UWU(MaeG5I{Z_-1pg9s$^I7g?myxU2LCHwh5w0H;A>bM)#y76x!sCQfm~PPJkI|K395bo literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php new file mode 100644 index 0000000000000000000000000000000000000000..3e7770ad59374f6dff41ea47271b3e5399323c66 GIT binary patch literal 3763 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 H7vcFI$@E|M literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php new file mode 100644 index 0000000000000000000000000000000000000000..4ba6573c397be67ff55c276c542c146876bcd4b5 GIT binary patch literal 3841 zcmXxnb#zom6vy%6u(&%c5F!xViQ(=pL6#(tKnP*80fHx3(uNjEg1cKAoTBZfrB3Ru zsk^&S^1i?O*WS;$_syF(b7#)k@TlbYWS1+&=kX=PxC3H6K94)X?eTg&Y3^W`+Z}XY zkUJu>_$RbjB~S@e5|u=yP$^Uzl}2Sy8B`XPMdeUAR34Q_6;K7_LM~JhRYa9gB~%$z zMpaN1R25Z4)lfB59aTp)Pz_WQ)kL*WEmRxTMs-jfR2S7n^-w)jAJs<7Il ziMu*+Hz)4q#NC~^yA$_t;vP;M)RS5CL}4flg`;p3fg(^OibPQ;3iU$0P;b;5^+A15 zU(^@%L;X;H)E^B%1JFP;5Dh|u&|owe4M9WDP&5<`L&MN;G#rgUBhW}R5{*Km&}cLo zjX`73STq)mL*vkRG#*Vr6VOC75lupq&}1|jO+i!8R5TSuN5gx+PESvR)6jG@9nC;9 z&`dNFd5{OqLbFf|ib1g`7R8}BG#kxEbI=?VkK$1RN~OLy0I6%}4W55=ue~ z&;pcr65P6XorJxk#Lq3#>Qqdx`2rWj7(Gs)-rJ*#m6fH%|&@!|fEk`TR3bYcf zM61v$v>Fv`fa&6Om?55kYs71@9M+!w1AoFk8%r z8^yiwL2)g7NL&XuiCJ*7coc3C*Tb#i1(+jVg1O>Nm?vI?+r&L^yLbcc5cA+paW~v0 zUV*!z{}9}x>~^>p7G-E<_u<=HNbgtm0eC<>0}qPl;UV!VJS?WeBjQGQRNM-Wi96wO z=)VO|z@lvJ;Yp=WlRhPCc}|OJ!!x43;bBqD@`$K~&xb{Mn;H77SqpN`ta+c8b26yE zU{+gSlymj=OJ<#d%VzE66>~1*J!;nWT{UZd*Ua0fziw9N+%T&-Zkl&de@o8M%06b! zA^*5pUFbyN=-bek@W;MbyX3ghWvo4kA%sPY5n{|)8 zVAl8DF>C&XX7&GzW?ddHnYEuUn{_e0V&1|0Up4D|y=GSbylz(iykS;5zG>Fg_LiKZ z@!mFP^S*cFyiEMASr^!QX4SuM)_Qzk)_#46@0?}0k6?jzr$|{%{$p6EXFpL^t@^35 zYZ&S?=)VX*S61` z{)qirfuAg`4gcA!hWJI!R>S>j)^NY!g3EmN@AkO%>ksVDC;g|=nQEuMl-ARKTUw{% zA30t3W%4&KK-(b6KNOY%!)E~q57ykYJeJ`hNvNG zgc_m7s4;4SnxLkrDe@vOYKEGj=BPPpfm)y-6ogu$mM9nnqu3C5`|5fm6o#TO6oy)% zR;V>A+ z+||Y1T-?pY-Cf+>#XVfy!^I&zsiG%}KoKYsMWQGag`!b3ia{}`7wUz2qu!_w>Vx{C zzNjDShx()bXaE|32BLvz5E_IAqrqqh8iIzRp=cNyhK8fzXapL8Mxv2u6dHv_qtR## z8iU57v1l9`hsLAvXabsmCZdUG5}Jf2qseFrnu4aHsVFuU-oCn?o(89(>1aBdfo7nY zXeRO@ADV?`p*R$W;!!+GKnZ9znvLe5IVce&q9l}r=AyZ19-4=eQ8Jp3=A#spf)=0! zC>5omg=iu2BR@(*X()gKC>^DvMQ9OPj25FMXbH+d8E7e5ik6{eXgOMrR-hGVC0dDA zp;c%#y0sCm5jVk1aWh;iZh`B>9C)Xg3)hQz@GfyH%o4Z34dQlqx3~k|BkqLR;x2fv zxEtOl?t%AtpoqbtcLhm&Q`B#|aR4{*LBRuITX$gT)_s_O?fj=RT?oaV* HU4-XB?|aU@&okjs$??f9SBlT$ONem?#Cm)lcZA#H^?K6W!7jHu=%FBY zL}cMlXrYRrBB&@Tii)9Ps5mN)N}v*`Br1tYp;D+cDvipZGRTEos4Oar%AsY;k5 zKB|uzpa!TRYKYv(jT)gws4;4cnxG~q00p3?s3{6Wfhal%KKONJBp3#x5EO!%p=PK# zYK}rtC~ARPpq8j5YK2-kYVFKtYbS2w#BH3otrNF(;&x8l&WYPQaeF83;KUuAxT6zy zbmC4<+{uYMJ8@?x?&8EVx{AzNjzihx(!Zs6QHj2B3jxAR2@Qp}}Y{8iIzPp=c-?hK8ZxXgC^y zMxc>sBpQWAq0wkG8iU55v1lwBhsL4tXgr#LCZLIEB8rZN4}P7Qo&+bM$!Ic~f~KIU zXe#m`51NLip%@f{Vo@xLLvd(2nvQ0m87LmbqXd+IW}=yB7Mg_;Q6id+W}_sOgyx_* zC>bTAxo9r(A}>loDaeO>C>5omd1xM*kLIHVXaPz?X=ou@h!&wmXfaxhmY^kQDO!q_ zp=Br?<*k9s#hY-2cpR=255QI83izkE< z2rNk7iq|Wh4mUu*ZoE<1OtPEA47gcb3%7_DVYavq=7<|$u6P4(6|cc<(0>SSS2i2& z5O=|yD%L^o5)YEyt>W!)kGK==g?Bf@eOh}2?ick$2ekGA*@NPBcu2)+!(s6%*(0LX z9u?K3V=!+$#m8Ym)<%3n)u-S|@fJKKY78G0Z<9SOYFN&QI`^}%Aa@hh=gc~g^X4t& zFUZ*%>XMwZpZd#YHRp;sm;6<84!&kq_pY0@zZ+(a?@jY=*55K~Hg22M?>lm~ zPWCagM(c62TJAUN==03F{u5@sKTn#~jJtBq9`^T?c`tt2yaPXD)_$Hf>!b3VSrhua zS>KTt%zD0iX6--UtQY)6v!?bXv-}$pn{^%^nANWj@x5~_{|M%(I|a&W^B==}t^Gt< zjq0b$uH;gmLH{NAxw6{l7h0<}ektmyzY^8-uSLz|H?SZ>GxaUbU(KDqQ?+jVy;bXC zKggMSLx046oxo3)R>OZbYao7+vovtOnsvF~aNZR*^Sdoqzy84fv!wr2Iz!|1m(p7O zx25%V{39>F!}5Psejfg(bguSxU+F@Igt=S+-nf+1M4vk%kUz6wuGFNIIA5^y&$h6@ O8|O>)Cb?A?=K3GlBw-Z* literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php new file mode 100644 index 0000000000000000000000000000000000000000..953e4635060777745fefbcedb6c16a49f7605388 GIT binary patch literal 3779 zcmXxnby(GR6vy$|dhKq#DkBuTrR?qwj4Pm^h#ni^`#Ls5~lY;k5KB|uzpa!TRYKR)4 zMyN4rjGCY(s3~fS+{lfZp=PK#YK~f<7AOb>q5Dz6DHsfcQEUjjcXbv?C=5kmC=9hk zEm14f3WcL^)Ec!$ZBQH37PWQM&RL-CoVdLcw|C+WPTawXJ34VkC+_6Lot(I{6L)sv zE>7IViMu*+S10b~#NC{@yAyYJ;*cJEMGq8#B2XlXL{TUTMWbjGgJMum)D!hWy-;t| z8}&hbP+!y+^+Wwof7BlhKm*V~G!P9!gV10!7!5%~&`>lK4MW4wa5Nl^KqJsdG!l(M zqtIwH8jV3?&{#AUjYH$mcr+eOKoihJG!acglh9-|8BIY`P;4x`cXihER5%q)L(|Z7 zG#$-AGmr;)&`dNF#i2M9kK$1RNXg52c_K zG#|}JsVEgKKnsu;c~KflLq6m~=_nm7L<`X(vX$qyurK%KVZIrGtI|vmiY|cXnqK9 zGGE4<&D-%7^Jcu&oQ=1c_u}pN&PBLG>CA(8C%(G@?t*~}Fk8F{cZ(WY4lK;dB)v!J z({Qiohx=fWUya{yzE1vtS@j3adfOo!I7Inj@hm)|>O4)uQKgTPJ|=1sj$8FQ(kIMY z@k#SGe9F8VpEhgJoWc2;le3mSK>1_l!}y%}I6jXHG_(t%sxOL1D83|WWS2#a?24!- zUlkwW-fQBc@Va;c=87j_9xU?jzc##LrlM6Mojb1wUuj;GQ?{BL9MU4}Q_C(Z6KYa9%cRTJD(D z>bqt&_Z71?%d2Ls=hw{Vc>n9>OZW}5cGH_??Vh*Hx2S(x_N$-yX7#VYtbV;?)(&_V z2egph6LpBa4{z&ZJ`mNr4`Go%i*NY|7ig+KwzOJbXx8nYnAQ4E&1(H;X0`rvvs(X! zS*`xktX6+zR;#}@tJUAgc{&BZwY+xwcV-B&BKR4{)>BV6ezX$ihi=f7!jfj7aI?oDy4F2eOceLHQ_ literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php new file mode 100644 index 0000000000000000000000000000000000000000..2668bcc4e583f4fc5a97336648ffc0a17d767f16 GIT binary patch literal 3841 zcmXxnby$^26vy$k_1fKfRTS(_K52 zoig9w`RhHO=giDI@64IG&kc)6j7{`-k^;U!T$DE`+86M7!@WMg-8ilU;Z7%GN}qvEIpDuGI(lBg6ag*?cEN~6-K3@U@lqOzzQ zDu>FW@~8r;fGVPjs1mA#Dx=D%3aWytqN=DGs)nkg>Zk^)foh_fs1~Y)YNOhy4yuFd zqPnOas)y>M`pApCr~zt#8lr}%5o&~jP!MX28lxtt35pDc_nxjsLSP7LikhNks2OUG znxht|1!{>}qE@ICYK>YuwQ=>?#>H)2+}6eIT-?sZ?Ooj7#T{JS!Nnb2+|k9IT-?dU zon747#a&$7#l>A++||Xw-Izr;6pBJo7z#t-C>(W1-BARJKs`_o)D!hYy-+XI8}&wg zP#@G6^+o+qKhz)fM+49RG!P9$gU}!}7!5{4&=52f4MoGyFf<$uMm3(Z2YC>F(`I5Zp0Msv^{6p!N3Tr?LYpae7z%|nSO z5zR;QkstX{5=ue=6hO%+87)8y&_c8jEkcV>3Q9qX(PFd&EkR4sQnU;$L(9=}v;wU_ zD^c!xxJtYUQ^jL&wYVRy5f8$(;$FB;JOtN^M_`(G9HxsW;QiuJ_<(o@W{9WZgW^f} zkhlguEUtwc#B{h(JPbF9>)>YbBFq#o!z}SU%ocCJE#ft}RlE(iiP>{hrN=BH|9_uxC5NbgnaeQ=+63hoy#zysoScu+hC4~ZM$VVI*WJR+*^QBfa! z4CZHSp!0F1wP`2BTVzj)D#KHvzTvc}VmTwK49~*+Y)$i=SqpOByqR}hkTX;9MYG1c zBxmXEm(4l_SIpYWtL7}myJpt*T{mlfH_TgTf784R-!iK>9x?AAe_PJf%06n&B>$LM zRh(ni(&w5r{^RDA^nb#v&A20H?I!=Ec@KWdyd6Jn)_k5Z>r#2vtTXtWS@+2EW_{mX zv*w>?R{g(V*5&b{S^N2tSr^mG=55UP6|>IQt7g^DYi8BY>t>bX8)lu0H|0!?_m(+> z_q{D=r{QiudF8j5zJHHkCj!aexmGZX7(w} zxdcB`R`dK^eYK5Wi2CX;MQ!?5qH6MMn4hMa`UdCe9{yIX_2TcWwFdiMPS*+j0q1B1 zezdeU{3o*t;%7NS1^0_t!~KeLukhKwS$FN%?>Ofy=|7ZCQ#t*qw0i$#X`PP0T z|50=OsQjyRw&wPq(gkc9>hT2mW0I2N1K#i^{Fx2)Bqt=r1VY?D+kyuEm_V{W!K-$m Gp8o+}M`57= literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php new file mode 100644 index 0000000000000000000000000000000000000000..a7b47f8f39f67571b0eb53559cc2bd10135a41e4 GIT binary patch literal 3831 zcmXxnWport6o%o&VQ_b7AVeUzGZEa~CCHErBoIOv0fI|_;Fb*T?(VkBx`%a_th>9C zdcXSB_c^zxr>pC`eNM;3rzfYoT>gM3kdo+xC3ylKC)V-!e4Y#^(&ac24@Ee!aruYn zd=)?iP(f4>6+(qjVN@6uK}AqeR1_6M#ZYln9F;&NkPEp`NmLS*LZwh?R2r2*Wl&jE z7L`NgPVY7dgm5^-w)jAJs<~ln?lkh zCa4K&ikhNksF_i7lh5X+Zei*crfzBKmZolH>Q<(1ZR*yhZe!{;rfzHMwx(`p>UO4X zZ|e4@?qKQ;rjF>yU35flu1P$$$Gbw*uK7t|GXMcq(0)E#w4 zJx~wS6ZJ&BP%qRQ^+tVAAJiB1Mg34e)F1Un1JD385Di3w&>%Dz4Ms!I5Hu7GMZ?fA zG#m{_BhUym5{*Qo&?qz-jYeb87&I1*MF|P;!O>)T92|$nqw#10nt&#viO7RIXcC%) z5>X;bLP^Mryl66-jHaL|C>bTA6qJIdqN!*anubzQDw>X_qcoI;W}q1;9i^k0XeRO@ zAMztV3ZMWAq9B@uW}(?=HkyOxpbV6O=AyZ19-4>dqxon7T7VX!g=i64gchURjc|#$ z2`&{k!)4+Ym?>t%%~2AgSZ!N z6!*bR;(oYUJOHdX}Cu` z1NVw&;Xd&k+%KMo2gD2Tpm-4;5--8S;$?V5yaJDkSK%@78aysuhbP1v@T7PXo)T}t z)8cJ-M!W;hig)2Tm={ul&s!_P7p#@xi*oi-et*eYn|xW$Q9`a*Dnu6=r z%FqpK-QP`X&BZNirTMnC!hXkEvv60=)&M_jt)YCxTAO&!T48$BTGxNfdNI%AacgbH z6LOBm>q%?P*HhLS-KVW}KhIbz`OjKwY@V~$fIe@n^}S%N`+w0|bCzqZLA!6Q{d~z< zQ~R>D-aM~Z>&5h{wes_twes`2wPy7VYmM@oa<;Dbmi1bm@7r=H3%_HXiQl!>`R`fl zdAx6}{rUjk7e5r2aJ4*9VgE>6M)zY;fBlKLobIRM3iz405`Hdf8DEI2=zb}#hF^(m z;Mby-_>H)Z?ziH4_?@@`eh+iCz#r7rbp5EVR`ip)%Hq%JY6-unt4aJ-UH$KG>MHlY z!+UzK{sHr{6r(@Y*4ywe+tyV4EobVj@sCbdNdHwkq#^iE?R-YLU9K>n*B?v`II-b; c!n$3-G`}|xX})LkPw;sIL0_7q^W3ig0aT-0AOHXW literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php new file mode 100644 index 0000000000000000000000000000000000000000..0f040548b5fb5c26eff8859380f744574ca5c0c0 GIT binary patch literal 3676 zcmXxnWq1==6o>J}A-FpXP%2Q|sp0M}MM4{Bp_G!OK=Cyew{45t;_hy{S-0uBYu4Re z>3#qA)12RP&YhgOGV>%pDJw0@;|T=4!Soa-BGnu8Ith-~@Au|7(H_T%x+}^_NG!a> z7ODs;f{LP|s2D1SilgGF1S)|_qLQc-Duqg;(x?n7gFMKC%A&HU94d#(qw=T%s(>n@ zil`E*ges%Ts0ylrs-mi>8mfk>qw1&zs)1^vny414g=(YPs1B-w>Y}=+9;%1xqxz@; zYJeJ|hR8tk?uCNQn6L&Ci2NQQRaYqw(GI1vp zcQ$cn6L&Fj7ZXQyrHig84#lB(6ps>60!l=QCWliKeyAVnkNTqlXaE|B2BJY|5E_gIqakPr8j6OZVQ3f{j)tQVXapLGMxs$@ z6dH|2qcLa<8jHrFacCSGkH(`3XabsuCZgnIc;{;N^dvY5O-7T^6f^}*MN^R%dC@d9 z4W*zIl!{W35Bbn^G#$-AGf)~zL+L0T%|tWNEHn#cpbRt{%|@9h6U{+$P!`HUbJ1Mn zM}8DQ0Te_*l#Q~{JTwo@NAuAFv;gIx9JCNEM2pZOv=}W$OVARu6fH%|&@!|FxhvpG z7`hBsi6`J{@eo`C!^^kgwbtA4I_$25>uov@Z%}#_+$gSwo5W*qv$z)KiR)p$cpPql zp`&oCvK!zwWzWIw;(543#d_qO%I+t-OWBifw|ENf5l_Rtus~0=PuY!RA5vCNv|n6D z_JE2v!Gq#vcu0H@9u{-q5mEDeRLm!POxyyG!_ZB5LRl^8Nl`0$O2wMz)8ci;o`K;E_fA&^R#f+tkv6fYfZxqYmL8& z-QC>ombeGrR&}n{@?mSOz$4Zds1I3dS3PR2<{z_OPW|K7H}DhK-3y--_ra%Bou`R< z+FIQ_W3BV>thLVZbJn{3^VWJg*IL~dU{_Q7f~Zw{Q9MX!J?s8=?;Gn=qWKt^1a>4%pjrzFtS~Sl`Fp-^H$$>^<=!+4pU=R_FtzFOmLG z)O#~5ULpIDcolvuUW1>AIz^v~TKdmKozKt3Ta5ieybZsE1#0pu@outTi}%8BM4i5G zMNP+d&=tRjA-(v15VbNtYV7^o`6p2ym7m22$o`_S+5*2St7Z8Oy1LcxDn7&5KSb@9 zKQ&gLkiWz=6#orfjr~VieKY=r;e74-|8S^~F>xMGgx?p)&ImdQk^E1L^JHfRe8Fh* Sr?IfW?+a%8Gac2%dHx3%T`Zaa literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php new file mode 100644 index 0000000000000000000000000000000000000000..479945691cebc26afca2bf4ff9f1b3c3da49644c GIT binary patch literal 3410 zcmXxnRd^I<7>42EFt|Gm5F!xV*=&Nly98O1g#;bG!}~GX88%(p;*Wd`k_c9ROlyrzMphck{?Vj zy`+|^3@U@lqOzzQDu>FW@~8r;fGVPjs1mA#Dx=D%3aWxUY%!)E~q57ykYJeJ`hNvNGgc_m7s4;4SnxLkrDQbqAq2{PL zYJpmymZ&B2k&jxTR;V>3=;9Z*Nq5p_bHoI1Pn+1c$bZg+9JtJ_`O?&fwkx4XOD-R&N3_i($X+dbXx<#sQ( zd%NA+?LKbzaXYCmzoIV+pa4okX()(-C>^Dv43vTTp?;`8>W>DX0cao^hz6lSXfPU# zhM*y6C>n}}pb$D8jmKR31}jkh$f*) zXfm3Nrl2WkDw>L>p=oG3nvQ0m8E7V&i83?cjjKD;v*0W=8_h;@&>S=u%|#&;Li5l( zl!dZTHp)g}6h`yWe6#>9KshJ}<)U1)5G_QD&?1zF^3YFNBtwrn5I#h(NZ#a%O znu`wNE%JSMt9(D+CO?F?%Marn@?N}C-iCL{+wpFEbvN7tuNAMyd*uyypL{dkFW-U> z$Q$uN`Br>Lz6~FiH{m1lW_(n>9UqhLz{lk~@d^1Zd{Vv}pOWvvr{#O`8F>pnD{sZ; zWcxeM%l3C(kazI>MR_N_B=5q-vc2vS*#xKc7@XPX1{EB=Gzbac! zugNF4|GIn*2!>nPyG^P}NdvinpjeIOE!#UuH?Js0r)2ggbZAOHXW literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php new file mode 100644 index 0000000000000000000000000000000000000000..856164536ef82f4e77209da0e67af9350b42677b GIT binary patch literal 3776 zcmY+{Wn2_n7{~Ez>)NeYqap)}-7X7ucL&A_tDuOup<<$!Dr z-6`|?-xt2x{eGV3%${?0&hyN~#HA&rxmwG^(j!7OVwpq1vc63RCJ9SV!Cl z>%zLI9;%1xqxz@;YJd!6Wx$5wGT2C54jYRrV7QnGn?M(eKs8ak3G2W}ja&_*#5J&~ zxE3}O*THCUJ!}q3pcbekYKclYYUSLr)+Pt7!Da_-9Mo{WwK?ktI zK}QG0o$s9p>~hc<>~>&w(Zu&ax40L^z-q{Ys-sw?9)NK$40S~Y>V|AqW_A~K)ASHo zp4n4mfo3m}C7QiO7HReobprc}tkmo$YOVd@1ST~AwLk+=3>t(Y(O}dJ4M7djP!xfN zAzQmST-0uk5LIYKiaL^`MD6Ej@gP?oBOZcd#lvu%cm$4z6VU_|j^g8CQ#cVtp-IS% zCZkDc3TlqLs3n?;?4vM2JO&fR9Ox5s;WY6$oG#|UB=H1H7Ei(%a1ok`qEQNJf@Yz~ zC>6z`*(eUBAxra_18p?`zo;S+5LG0C8moUPq^N4fTv0`0o~ZsXUsUZ(hf|o;0@MX9 zM2*oR)D3}mYbEQ4Nx%h6P{0wthKl!#U$A6kW`p)52Vtwu>` z4N699k$oPn6EDE^;zgJ(UVTr?jYN9iaJEkGxbeH)$>@4!>yU3ePiXTUR}+WlEk{rw!YRO-${`xIj@h^OI2 z@eI5K^K~9CD|(jb6-9MCuZr13uZe2-*F_!P8={^`Zi<HUV}Bkm=9gYT{n3kP0D1`xL@%R3=oK^=y^4mQ*U(V(IvR%FK*Q0S z$WkqOOVrK$HVh;89c1g@dlwdD=$Yd^jm;tZeR!`4JJtCEs7n=~5yU=3Bhg1_6#5vA zMxUTD=uv;FR@5Q<4z}Vt-=o&(2h;}r zh}xo`P&@Q9YL9+F9ni0+Bl-<>LcgQV=nrJ6ar`Of5&a8ljep;#f0U|f`>$B|JQn44 mxx)RvKqw_>cp`Wgb-O~T0belEc`+?a@cV)xf2yH8x9dMXG%%O| literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php new file mode 100644 index 0000000000000000000000000000000000000000..0bf828ffdbfbe208e5ee725770fb17a3560e8717 GIT binary patch literal 134095 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%0Dsv?L$y5;b4PJ= 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 AWdHyG literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php new file mode 100644 index 0000000000000000000000000000000000000000..a593d05deb2677f456f5d87d26c555034c244ac8 GIT binary patch literal 372283 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 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php new file mode 100644 index 0000000000000000000000000000000000000000..d4e99f1f4310365ba3d0a8c27678f3f720f4c6b2 GIT binary patch literal 291504 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php new file mode 100644 index 0000000000000000000000000000000000000000..267b190668f43dad5d1129cde15c033ed9e26597 GIT binary patch literal 231436 zcmYJccYKsro0$EjC!5}T@+R42H_4{=vf0pk@34^2d+!hk#$W@+#(r(U82h!6rm2iH zGa6}{Btq}KLm&Y(BZ($@4g5lQuFKzF=DvKN^PF?{XAqhm!-4dN1L=Evp^p^wauLROx38cRoNPjhu z{#qdYwLtpof%Mk{>2Czm-w33?8AyLKkbV(JzX+ti6-a+8kp6Zc{p~>dJAw3f0_oQS z>DL44?*`J}4Wz#pNPjPoe)l&5@%?{4#K><3;%^4h-w&j}A4vZokp4j+{lh@|hk^84 zf%IE}^p67R9|h7s4y1n^NdF{|{>caFpMHqXfBNCi|Lnt`|JjE>|ML%j{^uY5{4YNI z`Coka^S}J?=YRR(&;RPfpa0c|KmY3wfBx4W{`_w~{Q2K}`18O0@aKQ~;m`l>!=L}% zhd=+uzYk9F?*r*S1k!&9r2iO5|1pq$JCJ@mkp5F3{ii_sok04XK>E*t^q&K%Qy_H; zq|SlVIgq*pQkOvL8c1COsaqg*3#9IW)IE@T1X7Pc>KRBq1F2Ua^$Mikfz&&Y`UFy+ zKf) z3#8$JG(3<-1k#8=8W~6<18GzsjS8gEfiyah#st!sK>FR^4aE2V{Seb*195C1jSHl4 zf%IPj>AwWhe+{Jn8c5>DbZu z1%QmawI&K6DLWc>0?5mb#_s^6W=G?X0J5{A(Z`aY9oYmLH-vh|uTWh`s zkj5R^B!Eo5wZ_Mi%pKV}G|1;$Thjnix+5zvt2=UAP$9278aDt)?T*Hc0J6IyTMr0!t_Y9oa?zb>Q}zO#n*4?KPhPs0JO`CIAJYBijt1Cfr`5O(_ev z*Jx8JLq~QuODGNuslpgF;MPM&wkr+|XMC5?b>yU=J7`~+wg82h^g z=Fk5K!0k=tEZKv`I?u5;0DEgu*cZqhyIrv#&}ecT2*5ET{~!uE)9H{vryLfz0l2-z+ujw}Nbb2u z6_33yr~y0>SZq23HsgnY9cx(fNMHef4A^83d?K(cJ_UT@!JY}6Bc2OviZ29S?xnzK z<(0rFeJ${@Zv@us{{z^d)!z#A{<{ElG*aZs7&AK>DIH~atORTwIUy%SH=m_+?`Rp35<_xZb0WRmFpi6A&L|jG4vl6s0o8%+{~9>G)tt zYn^wQ5P)0TKEf{(1td_}B!QlrEbz8d1bTm}fUa0JO+eo)n=W9yE1MzErZWYebe4cV zP&QjYw<((=pmmhZ70}bl<_QeC`G9XspalXdOxZ#~H3nKFpahpK78rC(0NcJ{$x=0_ zQf12o8hN=(jN}z+c)67VYET(t=B;mh$|^M|C}pbwTjQK#m!JkvCNNOT1xyxYA%Tw# z3k=kVz%-2tjMErkJ8iA3LSW!l3amj@0*zb^*h*I~iwjcRrAENOS5_N>`mrwnx7T>E{Q?hmK;Xd+3Ov{$fd@M*@L)#- z9_*;VgB=riu;T$Jer_E*Ay`LzoD^84P6eQ&(Yu@$c$YH*?{Ze)UCs%-%Xxu!xghW^ z7X{wslEAxM7MM|21U9~_0*lf$fvL{0+0kgKUsuD-z9BI89X1H1;S=ipHVPShGps9K* zawf`?O}b*WXeSOTx6<5`8;Hb zMEQJVYDD=0WJ*N&LS!mL`JzC+?MFG~iv{kuMBtW71@5^_;HJw3l%4Vw0?JPLN&#i3 zoayoQI?7J@Dm5rO<*Nmho$_4*%1(Kiz-%rTn9d=A`5YFQ&=G+d9Tk|;F@ZTc z1!i@Xz_hLwnAdTEiCrTwvug#Wc0yooCj};VN?>-^2^c8K(*pCoUSPsE2+a75z?9Dl z%=w(aq|Xb?`a%GXX&;8iW5!Pt|KIRwMm7SO9FG}I%mKI7GJb?;4J}#HEJSN)@gwgL zt)V4L;)Q4pEm<-zL~CgAbMz3sp(Te)LNte#JgE|*JGA79>JaUrB~LjC(I1NIs0Se$ zL~%X#4bdTr>zS=Ww20!TxHUwNC~oj_G>PH{??RU-ZX&!ww29(oqB=yM_<1}H(I|?a z6M!K)MR5yR9->vWWbsmnUeS`p4I!FEOV%ZHi*yp3#yc6GAkNmK?bfqHDC|DJCJ>MoZqu&^LV}8&| ziWy^@R#MEkgjQ0_(C$ODl48co(MpOL8fu7EQp~x8R#GgeK`SZxiG7GxQf&14w35xcWL-ilY01WeP9LI`wD=d-AzDd`f4TYIgCBm>&`OF4 zrjHPcElBcDGXeBLqT}dlxDOfLPB`pPmpH|XR zFtlkUEd@&*t)!(uO%BmYS_&G7R?<>1`DrCB1+PylX(=$=glHwj^*)wXQe5vzX(dHJ zA_&n+itBX)y`;FF7tIjOq`2PZKsPCVLIV%cPKuv0G=~01;HcsTZ@Wj}ZTAXv)IPvx z42q%s0>kovz|wyZu$jpsbVy)090q*uQ;rBc$5DaR@tDBUcO3AAMm_=9q8m;Mbkr$< zt~?DW*Mw&P?*sP3PZEXB3an%21eIu<7wD)9fVgpb5s)y}F9{e%LYD=W;46S6A0mXV z0y4ZGgsuT{`sIHD3cBGspwV;O5SU{B3$WX;{NDj6ZO|__1xC;yhHzH_M-O)c)Kv;$c3N+9l0Yxc1H~_`|Yv#2TI~@TgM+RFv>k z0j)4R4e*6QHXX3VB{Ky2a;AWREIdn~*=GxU${YdBAv{+=i3!gW@F_}ozCgz;5Yz{G z8eS-%8iW@KB4{iYP#(fd1WbzIr2@v!@G=3_F}z%02CWd#wZba}n$T%;Cj}(D3XPrL zaj?~ZkSVoGpvB4r9;_S?rWl4p0!m#t42YY!5kL)1DjWqQG;$1((G3-XC?~BHXwxb{ zb}bs!0-q8Gy>ZX7)LOQFtD(jiw#G0NBw)Bwqx4r*AI_7!1Rg z0Xx;W0{GEXzbard3SSd=4yMi4kS*vs8WG)a15jbAGi|n3d32`DmaN_LX0W6st4(hK z{PE`SZGq|0BGAZ1K;9l*5?J|L1^Tv4V7{~i9Hql|0REhD_^!aG+!NU6?hCAA4+LgI zhrr-}C@_&937m``0}95+6M^OPslYP+OkmJG7wF0t0wd@p;OD~jN}%Un2cWp#1bQQ2 z9t|^X7T145SiV(b1K^#2e2Fk^7T1#vkxpoQg2f`81>7al1+akv8|f;*gpqCns%50R z;EUiKksboNSfnSwp9+oi0&M2!k=_DEmPj7~BTJ+&;B!yfPvGVH1HQzBkpTjn9T_Ot z%t;3ch_T3E0TC1#BA{AEh6?apWSD??G%{SE#YPCU`bdG-A0?nyMn(&?=@FbGAa3o<-qhJZE}nF)w!_E~`U&HBR!4UySuXw*4skd~3T0$u|m^IXCZ z6PYj2{R;qb^JAfaHWpa~s3CD9iv@aniGZ0UvQ%K?E(6rk3nI$_2~%nXAnDOp0x~+= zX)|lYtU@D4Ws9s9&`%<}0RE6>q)b2?i$#A?gM|Z7+F;~H1SVZnU^>JECS3(! zBXdurQs6nN1X{fs@Qs&?1GXD7gOE-f&|>IE9P zL15j=2zY^sWC7I{!yF(^!;Rzx^rT1u@N;}PZ6;0iCNz=;ZnHpFI&CJI6(UZXNejvz zm*}Xy0$OrppTMK<7wEYI0=<7wV89#-KQT9_)y~%N+&mU{s1615}wF#{o$_ zcLGpnxi|@EG=fe6nr#lJ1^V_(0NVVAaFMeDOU^lg!GB(0)xIF`U>5-&F~jvZG*04+HBjPUv9EwV+|$v zmcRtMEznUdfE`sVDFSx!HWDcbJV&d*%e4W*TC6<)?cW-OcLLCo^&EErd5gh4K$Bs4 zU*PcYKww?(5SUR91(x7PfJSrwu^O82iNFMU>Jo$hnHuKYbAjW<3zry{F9mjwR{~@G zwR;$+Zv@}q2Bysxe>^|(Rt?+9I{|KpGHtf_j~b($)S!MuI|CY-45D4sAortP)gTF@ z-PE8;MY{{g{b&yX?KRp{z%UW*6@cP;A}HEhKmtYk2=IQiuYj5y?Fab8gY_3Mp+pA& z{5KHMfdZ;_bdZ3S6df!eE2BdMgk^LnU=!&P9VT#(;R5#q8664OtfNK&J}391 zqXph}4B$(R{Qpmz^v38|RS5RzI0300b=v$g!a|UBahI(FuUB2(suz0f8Ew z!14X3+=N*|q}2JIs{Q&8Y8vjn76bhd!n7o8)}sB;B| z&^&?pF<(FpjxGRvMKO#nRD*hoLn@>O#V{HcP^F_0m*}V{pxl}h1BBeP z0uV9SD+ToEXqCXUtQHvjae+BjBd~7O3bqkJ34!)V3bcAk@HI>71X?{U;B%H}Js|E~ z8U%a}7tIK)j#+`}kpt9NF7pD*WkI0TnKp|FW2^~{q~329@FEpu+AJn$+EJ#>VnV;{ zVM$77?-dwh`vi2Y=zf7mKLE%WxCa4QH4Xvt-sP~suskBr>PG>1lyA=nP;t?>y170`GE8z(f)~FEGX~2&^9$1sdp*z`}M}V7a&w zfYJuj|`E|J_Y<>oIVp+f}aaaj~4>7@}g8-eAMX|wc$ zzJ05P*MBGYDM+yx(`M-hOc?8=1~C@v42V-4V_g8X+$Gi(kYrSdbrW!~Sa(2*G9K$8 zppM0Q3Yb4)y#(AP)?2{GJ+VFlDsHSVAW4eF`U#leWBpx%)nfzHNMMhFYETSfgVdmD z#RjW^8)8EQgm!GGOPbhpm>P^}*cdgaQZc8^ zQi{SJ8>k?(g=U`)_@){g&Ja+8V>1Qxg4is9C!G!W&Zo=)?4&Bi<^q0XB8kld zM2+0}0!nUd0U$z4jx7XKXwyZ2I%-aAF`$Xc7F!a4wzb}NslYs4CSXK~Ef?t96$0~P zrGS|w#Hrqe-q)ljiYVB(Vd~19# zZMJ_)OO7#Zwtq`+jO}rW2iq$!P4@+$CF@D|1N@$+*a3l#Ita)cQilZk<*>kxb3~wT zj|x1;F+h{CejLzjNSzQE+9zG&!A=QG_0s~Ma>hM8=~;nyIVaE!=LL3)3xFnr?xKKq z;@BmZ*gY?+!Ml0vil9JzTy=>R=9(I|Ag0ZhX8Zhgml&2eTw;G^+AOZO;V^9$*PHt{ zgC)iFCh{$TC%rAO7_X2VkSk;vry@Mt&slV2=TxYq2K+ZTeJTD|jZ*FV6+0*b9M|dnxexuLR7+vDbht z#>X3h=V00_ZrM&qy+z|I)8n0hIIUpXEdG*BD>|vcIVw5>eo1^(bP>=jD!RG^i&b;uA-NFFy&PAR^!Xyaut2lpwdkVklrIaau79@GI&^#c;q68fb)oB3&_3KoVAr z63~(=Mhgh3iZKHEZH3cj@ds@<7L^chFcsqfVP^UYrp;oQ4+$!mHj7~jS;csl=*tNL z!mwf@z@P7_m?SVjCIg}_nW6^4UNKcbCRa>z2`N=EU0}q_5Evjc1$2vwSpt1ITR`Gg z%n@uN$mRkf^rVV;0#d4CzDo?{1p>y4iiLnUFQXNU1bS+*fYG303802du2?ECa+e9d z<)q66`gVnYSG+ZlC9twp3oK-Df%d2o7-O}7oJUUp@;)Ug&`~LYZm1LZ*tEcd z)dLFFtp-4&shtt<_X!nQfhNoWnk~wC0gbMr0BB+|s$kkIHd!5-(AdqmRnaW?iGX3+ zEbg}UF>Mxi+fVkm#HZ{HK*{fBtk@?o_xB4-u>%4(Jt)v(hXj_(!vc+bL|_yi6==d^ z0!?^aU=*GZ7#}AA8$8D;fsZ{c@cL&2j29JW0ULGHIe|;g13t4RUl7>FE($EcmjIjG z;m{99^AIFE8tgZbQAE{ z%I+?~m6bizpe9%LRD*U>*-JndtL*I(PufR7ajfhs!26Z`+=Dt+*^1XYd@P(CY13Q`z(6rh@cq;fPM zPD`pBBOp#Ioi zKYB2x%~pTHp>hvP!Wwz6zu~z|1})FmKNa^!_=45p-Ul8!iZJ4i^O` z@+H8h9_+F}dt3o*u&rMOY_bGj6BuJmn{AtnvFmD>l{W;21Jh=k|17nVX|rvUp1bK1 z4RlLj?%x)8mllDyEeb3KC4o(=RbZcQ6KIcif#by;zz&PSU4bXP7l7gh4RjxkU8ed2 zfZrui*#X$?rVj-ShLw*5Uy*Z<1JJ(KY2t~%+ddU|uxEk>_IM8X)KTe$z^A+fZ1wuD z0Nc#l*MM*B4Q~K`iF75?X8X4`t+y_*X}xm^HK>Ydvwa6OsHzhh-w_{GodG+sX;l}% z544l2u7Y0$x2@_HfR;Q3wyL{;IIZd-s9{M@z;3d#su!Rct5@|F5Oh_21l+c&uY1rM ztNIBra#er979Kl5Km=6{6nu=vAV4#&tQxGww`dFzc-x@@+H2J?0ZprFIH1|L?9Kh$=W3GSxHS^)SZ^|NXr;A=9uYLObI)M7O>;Szy&S?UsM zPSr92FB?_M1+{F0-ur*SRS%~D81nQKXv)=ol(W8RVgpf9tDAy zW7;f6jlw20V&+S;OKAL6Oq<21@xioNjG7I5Tw+-6byFi~pBg%QKOnBN4*+UB=|O>; z9ukDG`eA{NIwJ7sM*#`XaSV{u$j1e`;e^2Ia8h6dodVP`kX4-)SU%4HGFIHPfUF(o zoWPTw7uZiO0CJ}3ML^!by(G{;mjML^<*F+Hf7eshRe>$}8lcH@Fl`o_&Ft%FG_S|% zHw4yorp;or24dPQHd}*ky2L_%OJJqD9e|R*#-XZ3pv8&;uU`^)^j3ksZ4(&l?SPN; z?HvIFYSmqVOYRAbvHOBgu*U;|3DhC56+9GJ3m*y0sK)|B`w76mjjwtN_{`jY2Jj2Q zs-6q9=?j-Ma?+Oqz5mK3rpIeFENpKCMj_K?X|uk4tA=&`oq*u4X4))$MsKL@qy`46 z?kwQ7pt_5IcdzQMfX$T8>TUuGeRX%hHyi4@<1fOd>OjLswR6R+crzX3E*{OPp8e4*NsGcfdP_CXPV3?|&?jDqf>KSTK z`m1LOC=b=M1k|nS*#eqF^&CK)E$akkR9aw}suy^d27yP<2rMyKzy^aq2iRzQ>}uxHe0{2vN3J8ZeiZ2-op~VsH}Rgz=Q1rY@yFr?-#7$DFQcI$Tx56uTzyq)eNwewjk` zb@$L>H(X+>Gi|o+WU8rV+HC#a%iUzjkBmyyw*WsmE8G^?`C0_JvM4ZuN`SETXcbsb z+XR}hUEsm)03zDsuE12k2Z-AE?h7pR4+I*h15jb(e+a154UYitU*tY~O-l7+f%WtW zASrkXNNcfY0-gO_U`D+VXpffyum4J5n}03Prf&d^#s|}8YqJ^k7L8`_@-6^vYuGf- zwAtqGgpGGn16Rg73ovrLi-7JC?+W;MTVSzxHvw50?=GNR#Cr%xk9bdk2kRvu#^SvN zl)iW$0Zl93SHSh-{RA}6cz*%)BR)XD{1G1r_>`I)9|YJyL5U9rd=}-lLjaq-%TNK{ zj}LPRH7Gt@;L%42B5XR+J+#LtHMHqyH3+)+7y%&_ciL?GjC6>PbrXh%_&5RcMx1H0 zZ8PZ*XWDG@O)5U#B~*j>1c3oEQJ~o;2^g;9lLd@h@hJj&V|*%LGr=C82H3&09iJ|s zJj7=R7=+?81=Nf9EWj>fd$xdSB0dKY@%nQC{)B0K9w0{Diq9A5hXn%TVId%;Jr)UQ z>+!{adZTWMfQB1i3TRMc8Nlxdk1rRPFe?DNnMmR*1qK<@X4`IKdzBiDu<_Lbqi&ag zKL7rUj6Zy+*0x&{mJ7_WkRV2EhXc_5F(b}tR^9Tf-s98xs`H?0+D(}ciHlYk#IVM@RZ7q0{S=%#6bCaf3e>;}M3 zUOxjU(}Y<-xdkLAFr)H-h();|*nu0EHd}Jv0-6Gimb~X^4nWagvi<%ia)M7#{UzIR zrp@9SE88CS*li;3b%{Z@Phd#xcL{AQen1UPcu?S74hgIdhXsr|@goB5aa3RnIwr6< z9v4{0P6VK3xAo(s8g%jaDS@@{v_MClaSsdZSv7WH^>YH_71}XwJ8V)4^BW%1?pkLYq=1aT4#(xK}Sp(e#e9r6?zX$ljkh(8$ zj|YG)YIFd;HXI%TzOjov5}4|b1-#J3pSXuse=5+(&jh^C#h<%}CVZiWk^E8(4fIM4 zbMCdk2znzhaG5rX-#Bl)Rl_KJC%~pPOq<28DF!v2(D;U7s;0AmF}S9SdoXO*bX9{F z%bIS0@97OS-381}H9Y`7Qu%9o3b=kvF99)D(_7%CeE>gk+nTkiaE_1%!6Z5CJh(GgLrm*9;SU9VBwia6q&gFhULHkD8GJ%6QEv z0pUz_=_E7>4Bn_Xr7eR9N8ABLZVP zDqv=*i2>Fc4iy5Eu2NtoR|!5RKB@(ln7F`%sS&JaNv(js_C6~D^4V@SO#?pv0#NS~8vpyu3YKj4`WcsK!mPmhnG?`pYVrb$VL@OqVA?Eg zrUlhBsiEhZ0h`Sirp=NqxrS-8wAnb_;}Y{_ubb+IeFCk%AFy=;_BbH$qz3`pjKV{J z?WWjafu1`8@F&D-jtboLm_P#^7uaA<2+Wt00*`)5;A2k9Fb-i5; zJ$FY94RlvvYrN+YeS05Jvx)0J5Ex?}0!GK0hk%6T^O3-+{a9cEJrOveJrywH*E|E% zB{;`(K)ttp0cbGBUJ4ADR|2QJ*Y4qC-v|skrp;2lmwT&*Y5LAhv1u*SW~sh9IB9Js zHLzH1XZN5r)^-t4*K4~9h>zNC0>ZMkJD`D}tL-7cQMEl?Lh#r2QiE`)?X5 zYG(*E>P&%tm?h8;vjN+wu(fm4&<}F~-|^B@J5NAr*Uks*G?W(z=&!X41&kN9ivZu7 zABzRdPPIz}I%=taB2>E!@S}Sy2mIv0RtP9$wJQZ)j%l;?CtbNp4KsPQz%bk;Fbm5B zhGDtDqlW}uE-cWM5r9A1SQ{14U}|FmH?0u3X{CU{u(nEIBv%W(ZCtRONUjkWxV3<& z^&%mlTht~68aXBKV08k@c5Paq=jsKPsRlqLvvqAoU{%Tjs?4YypxW|~7tq#g3xL!{ zZp*aUnr4WpZ9*fhJ(>juKhtJw+E{1WY)$KzJuWHZDSHLhk9`7tyI(*ntUVym4F?5Q zm_q_n?65$491-xwUwahLnCD=}08KjTIH1{+o&fl3p=wVGm^W%q1)yz>RzEG!m1hKA z?ySI*o)c*G^8)MG1;K8Pei86-5^xEy&N_Bk4U54QH7u}K)i7_b3Cw+_&9-%3?z$S* zj~fC@Fw|y$|qJtM&oFZ!fCt5ExPq1z!J=duY?gYIyV~0`vB% zOX~6dGl8Ca?hUkdDmuLOK%Qu|t9SiS*#zJ|v#ZMJPT3g5a!6TWi^Lw|y4 zvuy|VNOVHuJM59@EWlBTE&?XjL{|YdInhl(Jxz2MFl{D!2&meLo&pL=q8DHn`I6`@ z$ON}d^Z}HS`-#2+axT%&CB%B7zW^gA1^{AIhr~bu&Q1&xFe)Sl3%tt^0R<&7RG@8OCJH?JBtSE9nV1}ac7MZ0Vv2yumYB+t-FkbP8U%Y{ zx*A@0hJd6?%yfytK1&VbVYV97;KUp?NdClJH2gQ%iFtsJHQ{{055(mHfi_(T@Jr_s ziv%>w#A1OlwFK~~ak*6BQI7OnEzsHZg71i+ z1_2G`{r8Z5IC}9T?~)bJ9Nz!_cr+|id4W}_AfQRT|E-`bF<+Vl=3KMDL}uD7`gKML zrp@91n@_M5{CuG`VoQQa8%%9 zj{!DY>5mJ%?FoUKo)j?lB~AhCz=_jp7(r(MTlD_f0F-tbbm!36YUw*K@cI`75sZ9M zz}raTlE93*EHH1c2t3DCflcZf;2VoH(`Iq2J?XkjG|&x!Hf7o@`YX*7Oq<267K58U zCCgoI3HU@LaobG|m=-n6{h}IHsgfE@y@^&eKH@2D0;^>^z~6$NxFg`rDsfj}65a#+ z$m>bsKHw+2#{+>j?GWhOhwj1KS>lmE13ea4a-O)yTJG{xU?M+riFx~6;F$9Q5c07v z0bvX5D?rSG@)}T~3Ev2`2h(P;!mxa+hJpJ|K+jGxZ5H2u*YAf9!;_uV;2g=$0%~Eh zivSZQy9zLJvKt^y{YZ8P)KY?zJp?!^*;7CQC3^`la_J=NJI+H?JiJ3W)XOAOYPpIT(<3k0AojF;qb1PYx5%qLae~Byw_uK&y`wFkB`_ z2`X^ZXaPfBa*TlDm~`4KrU~WbSXH8IGEP7iCYd&i84tp=Sh zqJZd6P6FfwlLc-%Mc}4W1*BARnt(cK&4ME5YXt73k8(^XrncUskGLRs#3$cRV^@aI_Jz(FM>z(51Qx=pLzVfDH3Ts=I(BO!aUHH96H&4epZaB_P&Qy#)krs*iwzlIkn) za{T~Vte)zx1`Q`QKtPJ61_Bxg%hVt>C@87HYVb0a8lnd2ks2x>JyOG5LMKcOSA%wv z8X+LGQzHc)eUyNTn;H$slG&*-fCl$)+AL*M8S5tca-4w5mSWm0W$0Qdrp;1@3`&i6 ziT9r%AW%~i1w?;pl7NIsO$IdhlqqT$byL+KwNum7pem)N2cY$1tvmy;j_#S7Dc~(A zHOnQ;PN~@fy*&r8L5;b9je>cAO&^gk^8uTw^r-~`YF}!hfF_k%B%rdT77NUeC4ess z)TMwgjfZ6dFSlGknM$n?=!TVmEez}_rp?wb`HVHS3XQKBrc$c~6x8=0ihr1$TE8}O z%K+ba{c-_yJQV_L4P&veKvzZtE{O`L!KoNv8@(}A0oYFcOjQbK$*C%rm=4uyXtB7! z>(>Cjv$E9!cKVcrz${D(bao2xy#}fiX!W$fa#=6X$PEJPMMhv{%K~YN(J`gwuf^MXq(pBL4zY+X`=#-F;ZMv9!fBJk)}0gV>6Yk+2L%Cy_PO?Wi-vD_sdoZ`zm93M%^wG>>*S`4<8_?@ zJIKnqE&(VuRR+$k>x#xsT4P-|0U1@-9q=7~sq3Kz2~^ip4SZYIOAVs1uD9Sb9^1zy zBv4&n0dZQ_&m~x_u0LQGHmw@~D8u`80|gs+${+!rs~ar9b9F-mc)xC_fG$=yOyJRn z10tSdgn({ZHxdxj$fE>5aInz=a;|QSfOb;nwAmKZLSt2-pVW;L@CH-IwAmJ;7t}Fr zw!Qxqg&$r=>c+DqsZl2gs7iGc0q;kGV96u_{iJTPK%-6((39$>3cUX`fpIw-VnU4V~uRGGk#Di=`u z>Oug&)3q)P_>>x47ZI5JQGu?E2{d7aK<`%yJV%wlD69r-GjQX89mZIVz;o0JX#DSg z4*$cj-R>9K)FlP9vAUEXjpynF*1oiWD*gU@pV-v&XaMZAer5!oG%N6Oxd60Q>HWOG z7%Q;EubQc2+HC*nV@}$HM%+kl2E6xJkjPA%?Kus^wAr59jm939>VRN9OAZQ5!b5_u&^Rp6Vn+mq_E73jD$fySqn&yxVZW~%O# zKxdy8XrMC!9d#D)nR$CoVD6t6n1mMqpL^1afG;%iCBRmVd>P=Eb=O@Hm@ijd;v{fQ zjZN5;X|w3B6sWtdh9*_*}p!UH3v@m3k@g=&uBP+E@2lU|7BpSYenpi{;GLb#Kuq z&*RE>fG|taOq<0DN?*DY8kJZ*-5KC_My0!`!MK&~Dj+@5-2{Yox;xHY#AI{;AcQw9p$bPynoE7OD3 zAU)DU02$hAdMF@AwM-8KWYrk128As>LO@2PM+yks^eBM8!#O=#z=v$Ww?X+1e zFw>{UqS8o-Nsj|G(WBE$o5g0TW14BR*i3Av$FroFc_Td`0Hu$=!nqR#L~eQ#z~9H6 zo-CjPr>D5YxSR@D$4hZ~nt*vDJ>4b5c6x>yTRF!}HOR5_ECB^1JzJo2=K$7wxw&c> zG4lZH7?slV)$lG0)S$$q7Yg+DB7qsS7_form|gJ+6kOu0}xpOxFUoG8&{40>$IwjB^ zb%1TAM_QnP>IL+ZbOT_A*Ut!yIWTRO zcB;X&S@Jve(|cI*y^*|EK-Ws|1K5+&`vvCh0fEKfpnx$aeMrCyUHUK}WXV0EhUYjc zU=B zBl$8Q?B%YgVd=XHsMeL&1cn3CW~th)bsdcw-Ec!-A~S84YV0peo26Q#@Fq*%|BQ4n z3EUE>aa+Jpmu>-M)hG(G>`?;bz5%qVVaaI|=%{v==kI zz>?De$O#?_G~pwcFc_vEtD#Mw2(;K!msl;I2`oy_U82QasA0KysfI!KN)5gLTA&-= zxa4Du%(PkZ_Y|bxy2Oxr2k>_*)iZ6D@&s;uCzmj6*LU_Q#Cm-f0Y3Rc&>hc8Voh{ z0|6Up;`M_7o4nj$0ZqJq2w<~M87d$w>xT(&cKvXH_80;95@*+s6wo~DM+q3%>qiUd zbM<2cKGtco^-C&j{a95z>NtTXW7=%}l0dCz+HC!jgsC6z68$hiz=T#m5%7%%nIv$@ zWWZKl@#?1tyzW%Mc5gRL;5nuX48s`$LujUe)UKZ;_*IZF^|J+3l=?Y<9R)Pz3aFp; z^8nvb4eI9$cnhjuAkd}@0Xq${MSvf+@RY@XA1NU9O8~p*(e+COB!B%ffsR@Zh*3c5 zR|q!nl$8QHUp>=iYivCltJE;IR|6_F;VuDvzP?PLJ<0*^e`U~zeo`M2=%_FtZq11Z z+#@RZggs&cCbaqr0WJCcmwkK~`Qu%t?$J*ov>KQ7P>H39~*`dUEBGL;Z`xg?<8 zkV*+WX`R6INDG**>gxe%v!Ou^%Tz{SLCp#*bvc14mKT^n1%c&~X|uK7iqaHl6t`LG znpv`2n=);-?)K7HOo+ei9kFJP@Pwhyr0J@yNH$^n6!9u(-8Ljrr!VZb^D z!}=p?7(qwXpcU31Q^QJsTwo%f5SYj(0UNyBDS?@N8nDH}eg^O*J-Ys^8jMQy=hQGx z&#Pfkx**Vm7hR%(E~)Vm!GBp`b+{r(qH$H=<*os~GP9XB+rDJ}s=w|MBj^U;OHIhM z*|tT%wAr?WiM9Twdl<>L1U}`qn`)pIfzB=pjMI{P=!RA`_(Z6_O$}qLU0`P40qn59 z+y(4ZmV}S+b31F9gc?u}k+0O)P+4MP}OlQ9U zM2y0h0xRw-K+MMX8c<;rz7d$WOq*>Lp7gDI*el<;gp)QfZMIclpoUIrV4#N10_@Sy zML;4qbOpo++=gxfW~YYkf`-5z4L#h0+cxwBy#HqiA9_?nFF*={Q+uVj2YgBqMR+x)rBhOw$pwj0I?C=U%xn{650&$QW=(c9x$ zQqW`*1m134ehjHil82oO%;$Z4bucZWx9a6)i6V#A7%plUXX@a zfRBC3Y&DpB8s?}$PimM8SkI``Fi*g|(J&wIDKksM0>B1SYN3EUZCE65)5QYMu|z;7 zH!KydUh zdQjj=4+*UFhXEh!xg%-cejh3$ku6P^Totg}x6Hd^UV3*7XKz(_s| z_>3W@;hZ4C!OjbqNE$8(cyVaBD6oE90{8{34VMAieaaO9?>r4x1t#(}f#+b_EN(YV zud87hzah{bOq<2+I-6;;xZRW9bcvU{CD6#X1$@lZ&?0a&C<=6TNnpOT3c}d5O<;j- z2YmlaH0}tr$6dfKOYl8`m%A_cmOUN_7z`Ua1m5MLz!LmOP{kgP1y+YA0@LHEz~SMU z!1#DB@NzE%7TA}7u=V2=pvqeKTA;<=2s{|mX0g%~dy7V;vHniLAdq3&ELM`YnNDs> zG01dw38|jx0(k%V!iT{y(^WvgWV!)z94ymaz^iAb2cW=RGCc*<(@ZZwBNof_1~l<% zk?8|yrha7l3Mh`5egP=0!`Yesf-M|<0ARh39jFFrni&N6SOX1KgLy17L=7)DR1G|r z87A;4!vX6_CyyXrX}51Tu>N-?`~x zf$6YBKpoF46&OOx1fF!cz=&BPpcrOW3cNnkX35{ekXeOBM2oEkg!RiVfhkocFks3B zycB0b0yhl{m?kn2Ku7~c0TGK(%q3LVOobpuI#dcM+nFkXL02s>PU8X-w+0Z=x3y~g zz*7t%Poxu8;2GsIGo2du*Z5x>eH9ToXU^Zj{c^XV6C$I+R z0R{Ics9~%#ZI%iexk(LPU^2}Dug|nuDtI}j%~FBJpV{LQ`g~@uz$n}&um$ZG|_91e=ggn1oouU0(;{b z0n=6HtiV)1C-AZ71>WU?zzTCw5aD2#1h$XM0^M*$U^ZM880*&rW)#zA>w1lR9gPh- z>IPt=J(_8=b+g5QX|wfnw*)qe+kmf(8(9U)f5V+ay0*Yg{2jE8r!)#AL8S_`RmjJ(HdkbjM***g5 zShlZ#oXhqTklES(fL)D&)w2WCppIn+3MkUqK`z0S*};G?&dv@Is4*1auRqKV3qaeK znsB%pbdT%^KunvC6p&)sQ39HHcC>)rwAB8vQq&K`e7QN-awtMhOV0-AaS!Z z1hbPz|#40sf?Gc7ed?UnrpCWETaX?IY@VcCo-v zUIJK4FUT$x&^@!u0PD5sa)Al6LO|`yt`wN3Oq*@~U`ckB8v13mfD)74CD09J0@I;f zKoQD@02}By*)YIg$dio#e#zXEjRL+h3S)pTO_&OS*ROPm5mY7c9MuBv5*Jt=Y6RwK zt-ydu0KT+@bnD0_#OiU}on5 zes4^+0QlaFV%lu;D+k~IRC(}Nf2no0SwOSQGHtf`bDLSF&9pcB0lyEAgcGz0xFEca{>#>d4WlIL0}|b6c|C51m^x_KqapQ*(+)oxK{-p?3zog z>r9(%6{gsAHB96i?qT3EZMId|=b1L!DlD)!U1Eye5?D}f3k<0iK&+VvDym_DEdi1~ zwiS@lb8P}sy&X`e#vOqcyDQkhWA6zp!S?|vJ@-HjW4%LQHarw)!bgCNLHAf-tUnQW z+ouA?@$55!0rOm7O@1M$n@-=GW!h}tNEqgrHrqF9vhhBb7pL3=_wX_k1)6=5fE>$Bb`MHSZi-+xR-Wn-rtRD` zz&5%?ZaUyQ!3=>xHdA0s%>wN7V6z2Ye~!Sr%oP~y^8|WozJThOTOjaq3kAFb=N18e zVA{+r7HHEY0+%cW{A4;T6X=)a0<&<1z@x7e7|KkW?LTeC>Z{NwH!W8SJlHOQQCB7~ z#>xQ^YF{oSpljvA0ym8Sswla+D4@=Si2?lU*IWgl(Oj<-c>O8?-7{Amfa1rz1m)ra zT4An65XK(00v(kQ&|h;&fpMA=7<6?4%T!vR=jsI-s6pW6G6L<91+1sP=5l~fwR#?~ ziRO?i2rSA>n?-*YNUjNuFT7kcV7tC$+AR86O^#`^_^kzH4@5$p!Qd2vYc2`o9!1seHGC*>y#jHxLCEi_e7#nGn;wDNR7 zl;)71At1H$GhLz|W~sq+m7lE!B_=;d4SGR-t{TSnJb?eiB|l%_rV9Y?e~ZkApESuY z1T+d32@KT50N)DpOVrS&OV#lD%haHb=a&oUYxxxd#;yEH0k1`Qrp;0#gHV2z8f!WF zYJowv3sA6LlnHp#&X>D{s+1227^dETIZp7m&y8kbL|{5Z1zJ5OFf1zs#z&>Vb5sGE znI_)YO={!?){6q*b2nw$Z2jB>YC_{H%Vo1bH!y9sex(VS zHe0`<Zn8@b^p7a7B!fc(tC@^m? z3AET{K+Gb2MPL$M1yt(FYXZ-~wAosvE3czbWs2PZ)MyW;&DI*zlxefIM$g@3iIZaf zmV4OfZVPN$Edn#DDDe6vfd!>i;H=Ol(An*P6q8Z@jzI6<6m#KQ(Bch5mp~$^F6r0e&eA z1Z?o6g9OBSVX(m44gqW=qY6U-UsDSU!vMeZV8hj*BNs*p$cDm5m(ZgMqXa&7w1A*1 zj1ds)1*grnuRYmVRS2QNIKbDMooTb}Ysz+kX|wH@dTP9T@cCC^f_pHJ7bXgH%p}0~ z-hZ;dqfQZ!$%Ux`@}n?Kz{_Z1x_~S!%n*D_2+aiiK_gTh`|3aDf*E-Vu;_Y{^343HH9 zx>jMOfSy!f+H9*dwO6U3_g4!-*mReGCRHdC=$CSVmkSB>OITpQL{E3J?aIX zv;okp=Q06k|Hz`86=>6(z>LZZ+@m1yE=-&4KbP$$HO#qY0geCtE5?VZxBVkt8w*UE z?S7R=VGkPXJlI}=VYv^mp1xMtFEC#Y2u#z10(0&VV53V812$R5jtJJ{%A*1gc1*xH zUN{ceXbn1{hJHCI(8#9*#`@`b)WZEolV!CSVgvKT|ZR{+-QH@;$6#B-l z0h7syC(*9o#%Of{Z#i?y3aX%CWOo^!HdoY{w83m<_N@T)m*{Xp9dtf`&ILW z8;PB(S|Cu9s}>4GVbvnRom(upgi8e9)^0PBOp8*rlp+47kE&%rj+;xj8Oe4Z=r$uc zbgWg&nUYPQR;}h4$%|q30 zAmEDa5vZ_Ldx0P)aMeD+ZP=fH=r6|Q0fCmS>Y(5@&}~M4@ktLk;xFFzFz_oirz*)2 z6vL`y!C+4j+__XC$VJnDUwyEf!tabo7raJ>V4h|QMo^aEzGMpqOpahU1}vEXKx2)=%);F^{R#(KG6A-gTOa}|P*UMbK#{P>%@ ziJ$fU>DvYbetJQUR1RUZgz*@>vwvM0N3bpgcYV+ za4UNRkJDbS;fnP+!mR8UIOnSdoZ?mvI)bjZY6!?R=Jbp|!5#}9TEl{Q8}S<6HtGo9HYQx@gi3hxDz z@PlBie-w=5Pr%8GyxeEtlq>cHIO}?R6?{3m&Dj5n<2Oe9d76uU7x-8Zpxcc7!BG$x z=HQW0=orcdyl{| z7T7D8WBY(oN9=b52VLNRK${adD9{-N=r&^k&iTM0Mg$Cp!$8pWNCK*Tj^qTye=?I( zfM2OwfmGodIhH24KsN>VC0%emG6YvW6SzR_`|-tQ|MgDs3x;;K;5Bl9^9F9NBiy+> z!AQ;*=mdWJ3lMj)JQNCUWszVZyCrZ~28x06-nPUM^pb&6N0{1WjxasSf$Q`ef!n}8 zMskI~hmSy|;3Cs)#{EB~fq)}8k^@1(z@^)a|6`2NZN~p`8)}_m64nVWVLgy!d^8A# zLnDxCscRA}26qHH=fGXTyMzP_YFMxaHv?Ig%N8Kpi?#~hwoR~(wR;Wk(%}dXhfcvY z?Q)7)+3kpvq(_h7-u61haOe~0djkDVp?L@l2xqzIpi>NoA;DsB&nfN;-DbSdt-Q~O zLXXo2f{{$O8NX$W(QU?WS*0E_<;VAj{rBlT@JR5`ek^#=VZp472(|`M!6b|cmYled z#cf9f)AR{Y;$5Bsr8Y6o1n=@3D9`4iF9ZYkrC?~k5`6U6!f#yTjbMR&EBGAm1Rwpq z;39tjDr`VL0#!c8C&A7BEO?hMg3s|)aOdbY<5jNdH%GYY-vu5lNVgfUqS6INB}R-K z;V!|^0!2DFMxX`-#|mszaGb!Q6&w%zOnL+-2u_(Oq$gHAI7y&o2~GxnCHI3<1kyA( zRUp-a(}ZJObUJXF#xOVoI917rnSzf#%PFjBaJD1JhTt4WkT1cx0*z5{o>Ta68k{ds z>4FQKLZu5X6nxu7f=jsAYf!d=OMr{6somztMb~gCL#|OSgUbYtu^`>%i2pA&NVhq1 z%~f8`lz*rw!4<&uv#jAt!F^aIkW#_bz`rC+aE(CX2G>92IQaL_?8w5_A z;6}kk-6YVn1UCceWMOcNK)ncV70ANiHi0}1ZWm}kf;$9`px{oy=h!81Xa{!#Sw`I+ zAlszdE70}@_W?O3%zhx(*ghb**#`yhLbo}R>qQSSqS$aaEV%ngf+>{@R9G)kgdpLN z3RH4P1=A7`Nw$F8WJJIPN@s-sHSfpwR{huIMf?ZaAAbMc z6U-G%?L6SP;gAoUa&HR+W2_K3ZCDlom)+Z2f}ve3aLxxy1edT>u%eU+^en-0!AHL> zxTY0?g}qX+7|?A-F1z~yM_Ac{0%v28ZZmS3o+U`P8SxhvgSAXacK7Rm6bo6sV4OAp ze(z1N5y){Hngm+u;2j{>^|%Y`F%wJ1ddi&7N0 zVn)Rr;k(2I-(|!pM$i)=BfvI16&&$Qpoa@S2Qp3d7lNt&Quv#TzVaGA>1#*$q;CXs z?ycZi`A%@N-wVFn2Oy(_+kSL}r`RXKp!*Eu`YvAt4~wrrfl)}e8Lc)PzA++bh50V< z=+$(a(P~bQ>QRoM(p8TJstN7tF^))2yi4_1fr?u_&M7}JV!R_*M03`{YsoxPX+v+-qq6tPN3@P0>NKBLtxdbX9}EA)w6(Kee~ImppI3~ z5!k5exdNS1^*q5vo-Yt%)eC^L92V6Jfj_;*A|Zt}T`UmE)k_3Is@iTd=D+GyFJ;Ji zLb-YwaN!JBrQ3{Mpnz1b3xxzW!Fh-QFfp`>MAKF5wP=YEZos z$Z~;p0r^JEZlHjJu6mCnD5%wY1=Dh$K-XKnUof=~2ppEx2L<1jZZmevU_Zo&TNl}e z!$3J_V|9|?lO_vhP>SG#r3yxFn&4*N6lgE1(*<8YLokywfgeBA`|oEY)mealOQSj) zsOHeF&Jiev)wx0**T_pi{3k;yANbYERv@^hg@RLxfa9F=)wh5XE>JOW(!?zh42M$S zFIT-xa74M_MQ;l}M}^>%Rtgp&y3P1sE^@#TxvWP}$O7m#<9?H8HQi?Xx)-fw%60R$ zPH?m91#3`)V9qrHNk(!Lkm_^X5$F`F?+R9jkifxT9TvQ3GjP+3wg{$2E8s8cRksNy za=YMNIs{{^6Ugx>>~e&Ky<4y-^$3P#ui!z~2jqAp_X`~S)dNnUSEwEo+}k0+(7q>l zB-3rivuRMP?=zy%w|yXZQM%1|(Rl)fZZqyLE>=He%56`+M?kqN_E_-18Fq><7jcBS z9~J1Xs$+n^>sTEZ_+(W*B6x~D5nPX_fZxzu{Y)@Eo+n`Bh_`(q_~-z6hr2SFhod(ru2MF&w@* z#l8J5a3a^xZH}CwjMt2E1Z!F|S|Ckp#t58IHDd+Rqh_2yajY2+T%-ioOaQKsVl@*5 zs%6b2fnrcI8Mx|grvTSz1Zt)VoP;&g1P;%d=>mnVW`;m|)XWrqOXN$-R&L11wv>i z5H#v`35L+_1Vnx|*!Kt=+BJIxw_%?^-KyCSoTm2G900DE9|r|az8bpC$Q6_SkR$l~ zT60)9&buTD=0`G+;v%OArc|onzN860*i9hE{74sEj|{=s&IEEP$~9R)feDih6uOl; zz>hD{`L98($rZdtp1{vHYVrl+v;eqGg{>(B0({n}DFT9C<5mKqeg>{77C1d?N(2|V zR4^>dgws5FIdH<=zb$Yk)l>lIUF1sP6xX2JjGi}e1CHR-stF423*Bb)ybngV8TGdU zYHFQgs@Dk?gL=V4ZU8R29*qJmY)unz)$`DBsF%pOhfcAMJrej-RP$J{ zpbQJHM?^3zqX~%lpMPs&f^QoayvB%NBtH@Oyi)U2FixKdzRPpLoO>a-rZ0gL*5p^f z$zNHI*T7ld<&9uwzXkquf!+yDc`x`b9|TL^N8qxz{Un%kp9SmK7vQQT_$zRo2DOH6 zGj`n(-yGqCeHU1KsD3cA0Z1?6q{8F@G1OmToil<8MFzS1)RpdkqR%?Fz3!i&DE%aC28V z#dugP&?(ohaSHXbcC91G)7o`{yS-j8rZxZp&Xd}Wz>gmkk4)UG*WsMZPC^Te{7Wqvp$fM)+m)wGV(_>Aq{}Hb;KF&b!cUj{Isd zc*vBq9?6e@bKdqbaK=?1c8W(qL~u=`0-a)QOmJV~z!}={+7U;%>Q4mIc3^j5IsyaTRSq~8lh@(185AI54w0@vJzPl6lu z8Sq~lYrgw=yB4tZUJzD z@>#bKI8TFCw@9E5s#`3OFLg_R3xq?R-DdPWHMnl6bKIC^0{v(m-DdQnK(`sa>as6q z%C(!U&gN5 zx(Ud0%H{;be&YD3+aeesTbWYrDsOXytGwM2F7ggX(8Sd36pZa%fdATBw_B*<(f0`6 zcCX;O>;ulaQTqjQz3u?;C+$|*bgz{GG(gnu<$nzmL$-B)g=ShIoIk^ z1n-h6xY=ofZ+jC+rSGXr2mFHWx(pyQiRZ`^Ox!GiHm5Ed$mV>l%Mm!V>vDktD_fr6 ziscKIx&pzfR4ACqMS@Ry3%KP)i-FsmNp&TH+fXWamokBKt*%_~F1H2ur9!YwRRaFq zgF3p+ST!H{>H>_YcB6s`h#xV=>^6^Zz|`4o`iqNowM;o~tk(f2IB@IgflH2P04`>- zw~daVBdKc==tt}B2dn|ZZ3=8yMbrIlKUq33i zKr!IB>k$XenR6q8VfjR`^gR` z^ml?!`d;vDKM3y2N8qaO@=5Si|120EUxceX$5+9kWVdxR^Kfsm@V+q_Pv zSU-vpH;DE6(LfUMQ9nkYT-1*h&LkeJew@JRQ9oXwQLdi=_}{kcCjzM)ul17z4z2ph z0>@hY6oJjIp9k^)rARLc4yZKr>N43&{0tXA53*j^F~#1@ejH z`gsC5S3h6yT^0yrRQ*DMyscjZl+eS}FBWKF>z4?WzIwaOkxFGLL#hbF`eg$7QBSuS z`I(fer`wENaZ#5irbJSRy80CYMW}wIKy25q0`f};kktto36dZ6YZ&1l+OA)lfar0m zbp1Mkldpcgz{yv?LGUgcfeWtTCc(Yj3|w`Awg@ijRv_Eg-zGR>yFk6D-ys<6I};H5 ziNvknCAea{1wPN$?-9J{UcuY$6Wq%E0)?#p0C2)kJ}4NdcANeNVf`USoO0(517~S+ z>yrdd@%m)o&j5Ry0-QJcQw54peHw7_I8$y4K505|*#*iF=&tHBfg4^U3rMA0)@K7Z z`4K>U4&ZkN*5?YeIrVu!fkh}^um}|hu1BHZ>lX>e=`EnpC@cp2*ZBGp!5UmDScA(1 zpR`=aVhL{pLE4M@3P+g8m5wl9>^A-CkNSWke7Rr(;>QgsyUj~Jhu!8S!?Knsmwd1~ z!8olKIHc+u1XHY0a0#1$8??docYuF=+q;6H9de3G7#7^yW+2VnZxIZ-R)J%^zD=<7 zwFCae#rh6`Q@p-Ya0$Bv&w_5jRPPZyV0s11R-a(L^a}?608s3CGANjpL%?l5^3~rH zthjcY6{gsIM;Jj51WymU&D&N7yUpA5*7XmW5}Z8D~rg}`s;~H_`H|xiU;BopyaQB}Iwg%4x*YvsIX1@^3hL?g7^h&V6z7`DJ zH-Z84Rxn@Q3G}1&?*&hf55OfK>?3f+ZTJLSwI+WCu9>%A1U@9!e+B+=3GFs-c$aUC z_+OfS2a?E_2D{B9Uan!3BRCoxMgz%&Wy2UCjZ|+KE0919s} z-7rU>yJ(mzu(u8K5)kp1bQ|UaSA5$A0tL2Vp+IIgEE2rvV!?e`0;CX@4R)K6Tn@U1 zr3}d>gBq3z9F`4soB7_?ZnMlqU7nZ{Jzma&tPm(M4J&~Q#?&f-64S6+Fdo(bS8sCB zwZJvEe;ttR#;i|3>?e+oh7AHABpWsg?)E0&1Wj(kX5cKxSi=_JJcYesD{z_e(6CM5 zY;4#Lr26PP1Y>Ha;G^#n_;B8^8_1@xH|!DIhP{A)j-+9q;8yMzOsNCFt$fz>px^@0 zZN`HX<%UCy`0*u%|5f^i!-7GU1XLVlL^9wnE;ghjApVmf zx6)2^@tD<$@7(8z?q#D+I%#5~whd={DmPN7%}MBP{Ge z!Of=I9QoBEM7KF|+(oWUOd0vz+^-Xi(|X`HW2^zVWR-3NuDN1OK+4ZN=^Y@=qI_2{ zK0?4vD{L6ZaK)Mh@6sYzgIfhYzBaT01y=fY!A0%>eteT?B7r)AA72=ifG(iY2kQo^ z-0U78;AZy>v*A7?3Ju%`K$)*k zw;4TdxuDyO9=Aw8OiYPhpdo8`BwS;G9s?K6xnbaHCLF8ib}0slF=;T7Nyp&MQU73S?5!3TQ_ z1YOg235fgUunq5pT;An_V8#6i{A&b#5y1+c61j1zK#Vm`6Ue#7=>kF5I76TYHO>Ssu?>y0fNNf3wm?B? zoFjPAxxkI;#O^oF1Cj{b#`yv*OXC6{?GjTK0-03)#zg{EyK%8VxoBJhWRTg7cAF#F zgmU9jhUAhTjmre8bR*s7NCA=CNVhps;G-^QN-5Q`afM(^tpv)bTaBw6;To<6DyTV) zYk*2Gx)!LSA8lL*1gJ`l>jlo}#tnk2yfFchpUKn4O#)p_<7VLM36_0}U~F#{IHMc4 z0l9AOcA(5P-63!kHtqxhe0*=*m4N7Rudy4rKoirr2k`gd8utRZRD;HS35XqW=k^PK z^DYN~a|Xyk;JkOC+l*cGZ4WWxvPpMXprSM;0e%a5V=_?qFSkt*C{vB835XvtF4F`{ z%uV39Q__JnQz}C+J~DxH_cja2^KG+%Vh)GK9KjsR1u9&^Ji$_z4+LEGf&`5GV!#vv ze{j$>771STmS8v(1J`{062S#31#Xz@WdglIV>ysy-MS5=aYi>*0GUFiV3nrZ9P#f< zHU=1x!y(le1PTp)yUl_^HrsB~p9VM9GNr&2s{_hh(|W;eXaK6LAB{l3plcGcxa}Pv zXwKbDK*TS?X$%2n?tVA{(G$i;GjM?uxUofWOG}?539pNruglsjgNqT=)M~t14*X(Fpy^Dj{uo2a#WyG zY>WxUSRBZ92}cB1?1^CBJ_QOL@l5cd&jq*P1yJVBy#y*OY_EXIVglxM0wPzv?HeG4 zj7l5TUP+|)kg zMcv!OT(pq*2vIMFZ~>c#MFmM}!Uh#cobV2FAVIm45Ns236cV?c;{FXUPKExwL{d4*a25#A{87LA?iiMf3^rwFCx_jD)l1j|0)boFQO+680tl|fX_Igq(lLU7SObWl7Yfw zY(t7842M*KgDsSnfY>P$_ohH^5K0Hm(HMs^fSXjaQ|dz52^g+2 zwQ~fsFjp{P@_y?%xr-=w0BNAr%rhEJIkmp zxrFzC+Xnyt0V)is`#_a(`arPa^6514;~P)@`++o7?yFtupANi>1XJP;Q9Jg@a3KfZo_lnl9m63U=+RtuDR;31dsLC zf`#pk;Lg1j+}n485%gX#96ksh79W8EOW!A;kdJ4f&w|zAi{LhV72K%*Cs?Gv3GVH8 zfq$h4(``om7ya<4#E6*xtv@^(ILT&*#{j1Ysqk2VI1P^j&Qa*YV|$0$UlLD_l)vLwKIRHiYK`e-r%S1p)~aUMLX!;Y9*%Pk3c4ssrrR9$e`bc4J0+bFD+B^Hyi%Z$g;xpm zU*Xk)OST56;-6r`YXuS}yiRcI)_V;~On5^ABEOOj;f(^R9o__-AcMl21!H@Q;6=9r zr+lz&0u?2^9XR8f?f}lZQ#*wsR%{pWzx>!O_~?6p-|4@?dj(Fd@IJwm+7J9;kR1>> z8^Z^kVkpyXMt*la4mpB?8a^zzQAvU+l??phqo)XNcB)hO*c?t1jIo^FCs-Zx1w*?4NTo`L3xPCRlyDK?pL`DA5?sP! z!PG7htSF^|^|MSck;?@>7KCpLZbOCOid71Rw%ul)cL^{e&$kT%1@4^PW`RLxw^?NU ztYu1(&rv7PY=`Rw7r8-j8yW?lqej<5lVGU9}Hi2#u=RmaR8}5%kt6F3>x{68v5$Vog5?F3?Bdg4g&2T=F?S3r_hWcmRJDyo=rDC0n*{ zjQGdU{w}a$&32o9cVY7=N06q?qXjmqd5pk%G>;X?m*#N-Db_q*xRO|p<_Q8Nr+Fff zPkJ;@0tz@9ndfY=d&teI{zc7*(BrrV62q<}OpXUZwszUCDI(ciohI8ClMuM#*MnpX?tSo0dM z;ceGCg2-)N2b^<-)(f1`%^L(xoaT)J^`d!`K$ULZ3|#QGTLc=^=B>a*udz+=Ikp2= ze3ueMX1a8h3%=H4nOfF2oaJgAn1O#a=n{NSrwS052 zBix1(M;I`rj-Z8YE)%R5b!>OQSS)Lc7r1f+(yCBZW2twJA#{iS1>(7!cm?yESPi6 zK)}PHMWEekZcRYMzyHU{pZ)_`;Krc9|)EUyUjmcb-T?!?G+v} zlTIM)~MQ)kv2=caN9+2y*&lgCbmIZ*nBGs}`pg6WH0tz`S zS{4i5WeHG3wQRB5j1&> z3tLtRSmTf?l>#<$%U3Lh*{!YPd*ai3>xm$Jv!K1v~9!F4eTlNaZ4Gtq zA-Kqy0>?*7mO#(ak}a4HIl_4sIalDYY{?U>Ir#!DTT6j(jcXJFCk&V(!Hv2F_|x&0 zV!H$Y^p0or7K1a9EZAMR- zQFNQpQ?!mPwM@C->(>Dn&6j$?yEFiQyU2~eCF^*TBdmRQ1bU~IyMjeIbI3H$`0<(}Xo(``ooF;4G0!UcLDm@jmj(SJPn={BQ&6IQ73G{F+ai^H3BS4PT@(JMo6KQ!0B+im79*lN>>4w@w!5u3D!6MNXOO2x6>tnn07=I$fZAw$2a; z{??fZh#h4sTW1NRY3po(>d-nz;1p|}E3gf%^8^yPb-v(j7YG*jiqJ)(rw3N$W;|-nw;@K=QY47L432z+!b`flI~2Y>4x;3};_>t3Od0NE!P{rd$z zIJ6!BZcu|;4+@;(t#q3)|2kspAxCgXwH_9zIju(tu1K z?55yt(*ggNdTRzy=*wjSw*st3Rs!NbIU*Z4YVzj@6!z9!A%$z?2|if9;6)1rqp%P- zVT=_4r-WO;Y2%~V5u7-!C4%`wwe7N4+CV^#(^+$Qm8N`P$kfnAvxL%Le~l!2}8k zZd6!sJ(__+i(?DmzfZTe3RcTD!AjpQct~{!UbIvAi=FEd_%PPmoq&;}9?3m|tKKX4 za(#l;p2hy{&DsBUsb6DFQX9ZK}XA-!{!_ zkjQP*f%6pDwi!+#P1|My*D2#|vjnHi7Wh$K+Z=)N*)~_8yJ(vyu={QE1)7?+1p>j} zwoo9&+7=0fL)&73)3j}gKm@hfZAPxM{cTGfa)pgqCQuC9=r$uMl)5&$%}A>8u$(Dr zRFt+AKssUAwo-7(RtZMTY9NC=ZCm3AnyI$6f-AI6Ao|VyD1b1q) zV1R594EC*p8?#N|IBnZ5P{`VL2!_y3!Pwp<7^u4iSACB_Cb#Vc@;K+)_5uFFb=!X6 z*6-}?0l|nlC>WP?n~___7Eh{|((nw;8E2D+7%1H^JM2K+q+m+l>BX zdeCh~f8u;?t4&Oa9&w}U1XHYDFoGHc4~Is<-ER_%pgV#wc2{scLV~d#7A!f<0;hOe zi(ojk0zbJ8ZI1Yv_-GeQu?~Tcz-^s^i`)gA^tRoCCvXpN+R*L={&ytz38rbkQ!F_H zjxg2-1@AKClx*JRp5Ru}ZAQ=d9QVD3Yx=+`<_q0s^t2V1ZZmquRe$I;+}lTj0rS|4 zTIh!z;TaWiL?w?N6-=NQ@E09xTU_whGr`<{E*RP`1h?U( zKwsSUN-#cN3ug8k!QI%?IM&-Y0tLb*fqK!t87QWQYu_S}r|nw>mwlUH zTy7WKx*Y;_t9_^NCy%~Ma7}jux2`Z^k0T7_y@Ct0Pq@sK{eoM0K=7gm1%9I3PPZ8? zHgOL*g1Xgy7$|Y0k{m(JX-^j1h7`f1OBD>5G=a+2eiJD1Ino_Ld(oaDxRseg4zHgj zQ0m&V1?qTvjzEjjo-0sL+w&3-JL;q73vPCSz~_YaLV=G-?L~sQeoHXuiUnh=MBtEW zFBSMi(_RLgbk)lR-{rPoNL2_fP^I95(QU>~8e;)RSU`fnX)j8*89Qy2rrV62Hi2rL zVqvcnT*7+6a?v1Ir5Xima1(IO9U&{N=~? zs9?_$6Rd@C;D+xqA{e+&fPY=}r-Ie;nP3@zF8HJ`1PjVb!Akc^I7iufEttq}1Q+P7 zaGojefHc?Ry9q9iUj)0WuY&JFw;4RoU+z1QMP2Wp z+l*xr{2ikhk9NW@3S zJb_cJV?J=q2U{R`mxThyYsVtNM_(-X`bz{VZin4w{20;SvD6_%UB@yZg-4~^j31+k z>7d(;ALHX$$8x6->>Vov0<~kMKn8WJ5?rCx!X<9IM&QKhSSz?O>j3|zZO3}xL=xB7 z0Gx8!Hv*@9mra73yIC+Uw*Y6{hpmpFDs^mggn_!<5x)KoN0<&f9l@E@u}dINJ9Y~k zV;y@0j*pJLf^WM|-~&s?eu1;G;{b4mBGhrv5ftSPy3M#his(4x2s)CE!vd{AN0LCl z(UB||s40T4pDNJRbfgJ%@EtdS%jQSA;Cf^TwDcXBf)~vKl1%<=!92|oIB`011z#>t zpv&vX2hyqZ9R)xJRl1{4Fkp&+68Gg6;Q!O@C>Gqx5+RRBE)`tUvILAAD`Z4DaFieH zcia{%s1;5zEGq?bpKf#HsM!#3gzpj*IJG+HHb;(GbLcilj+=9}OgZj~)d80sQ7>2w z8U!m_qu@1~1WV2x!M(kkfXGkRS)h>M+lB>Su37LdEdn1;I$8y@p-te!dPjQ#hO5oF z4#B|fbjmFrtV=M~y9HCd$7|5_cJvBP>2r$ZvtO`C4+uukpkVM12|oHgA)hCu+l>5V z(A{^0tNsA^szcUtQ#fOgZjWJ`&8R$AUXIEEseV!RLqqC(Wps;Df~l zI>n9=!GL)p@TsWdsbB&<6O51Nz-iB@7r+@G>?Lr{ySxG}c+R~B&U?`}j&N_^3O@Qf zr?{2x1!L@kV3GdlHC&HRj<8&Oc7)sTMR3)>I>l3rZZmShy#3}Bcka7Wh@eio&Bz6I zzjKr$IFdR?3&eWo7=d20bF4sUca8%tuYNVvqutIKj^Gnb=S)XX#ye*ToO7MC1z&%TKy~PxE3lQF z^8mk=vva;c8`!zPDYQME3mxHlECT%Q`Od|FA8|UD02wq_opzfMzXPswsY5vDJC_N0 ziF(mVw;9QB4e2%`85|Cs%bh|xbgmE#p_KwT*11X`9XeM7xm4KBH9#I2)VWshN!JNZ zSq~H#QyTz(5vy~fK<(??1o%taotp)BYK!1{Y!ytHZG!2r9q}vNJ`XOm(ITKk?{kf@yhE@S^F050)Xg*_ncInkCQ)bY=_2X^wE5=g1W} zqdW5i>sCH+!jvii{13#Pg}`ZxP!Vv()V>9r<)cMsu_N5M5=T(!J4*%1c4wJWEHUMd za6N7Vzj45HRyf5dtaOScmu@q9*1Qck#Zng(3|zX+=vg<4ZZmp@?y9rayYM->vraGx z>jl@e!Mm91jgD}mnjB$h-*JR-dRO4&>kK)?Djjx&;m|A?mMwyT+Y0>U0<{UA7VW?# zp+j(AItBN(OYmIl1}=M-9)Z56vsZ9E`UKy$AGl^l4G8Cn^+DiYFFGW+g!h0Xen!wq zw;BE4`Fh_eZo>n?UV&~inq-X8ZAOzkJsvv6Y^%+<*-n~yF>)~p3bOX1jPh8 z=gv5gWM+>D?#mOW7|BlsYtS>nMSdn@b$j{xlZ|-fcQ}Zmu@qfXTE%6O1`iEU7#p+(QQWa zS&yz!jz~$oT-RuUkoTW%s+LI)X~qHBIo*rwc4$*9?Ju>6!_YlE_`N1fOFzQ0A05UW1mUYpzqML0$74 zLHpG;UvLQ*2t-iVLa#w_>{{dqdWWvX0%t?l5`lu!Ww#kEB|y5CdR13w8BpxY&}~Lb zj0d{SXekAxYq_@xvJWe~C}q2Ar9dWkt@19En6A~1peT2(0ZOP_U26rp{;qWbHK%L6 z*Wg(1+K_;lKZWhuC{S{{HVJO-W`T;*wMFo4w*plh+FjcmVN7io+^HRcak*1)`*#WM z_HKc?)wM@3>h=mWAYJ2d5Ef|Fr zf~j69nAvojF@K4@E5L~J7LcIeM$v7?&YOgEo3RT=w2(Cbm)yBV zN4U35j_;T%nHK;={=sE>A zyGt-&x&@0;kH811u3o{w?GxPne!-$NAQ-2EfZui6H6+lYblnrY2Hj@tUpM={BRnh~ z2!<5hX6#>@sV=(B*uOM}T@RgNz&sMnm&bysJ}hKWav}n)Qdbm6GhbqY8x^JskmcF% zQ82VW2_7e(1rNS2!WmZVt6;v+ZN{=ZaK14j+miDg@T>W{={942C2{vCN3iPMqXizU zdyK%&b&nNJBp$4LoWO&1j~6)Sx+e&{e)mLyz3rX^_@^h6A4E)SN*S*CN z9CY1V9pRI115P+)yFd-@-XYM$bngVtP(QnO36z-b-N0Fn)9yWv;DG7g>j zen+^32OPl(+bF+(gDA3raQwCzFelj$JOpE!AQ;)=!?5^1UD*I;GpZy1I|)EyYmIhLxEt@6$)l@ z5pc#7yCvlCa>Y)euy>a@g4UqB)DbRF8F1OVlndtEZQzO+e*PDq}z;Nu^0v% zVT=U@--T{7e#Hf%+l*hK$?dLn3I|YvJg4u9Kpl9j6E4YLq zftIa1ELfDA1p~K5u=KSG^pf3e0$ojaJCJ0h>kv%jPQg^~60AYpLMa>7BUs0Jfn;k? zpCbyH(l40m1A?(W=rw%OAxBtX?+JXg=%(9@Cz+M^8IfVoJpc*~2fEF8q2WNc8TT(f zcRyr`f0VELkwEv|{TL{5J%)vH-Zlc1x`a`|RF4T>BMwv=+9QG)^#rJPJ)R2Q=@i4^l_Ol!*Md*_hAGD`^0sdU3)?%vYUx29B`RKt7p8x+xAQVuCVGo6M+;KsAm$8?Uczt4hhsVB>}^?+3cRF35XowQ*+NW zfpe~Bx)XP&_6(KBD5(Dy75Xasr| z3T$@IB7xqzXR+WmECGIUqwF>#N2udHOP%AQE)zI#d+0VJN3s*a-b1$;@jG~XmOF)* z>RBOh!1SyXsE$3Wggh>~TDS$Q5eVg;wF2d#XB}|d$XySd^hq}e6!xBt0_S|sCc)>} z4EQIadbSAe_EzAG7u^P&Gq$$_e^Hfsb_f)Zo}Iu2gMF7H-2UByFSo}jl>VN*f}y<6 zDK5}{!FV{}6rbau;FHpAMlP5zhr9;oNzY-y2ukuAv|ByNg2A5R6be~Ss$hvpa|)jV zdTu(x{783%tDYfH$9poJVvJ=8re!wZA2#gC5jY!ra)BFOG!OWfZlWjO5w2;0;F=Z+ zhC`9y&fNn3^+}5z;mef>0kWagDXvGEBRFt-${pd`-gbl;RUuf%E1lx&(``m>m<<7^ zSc8LtdrP+&x#8Z@ZANaGVzo}O!q$0PcfZ~dW@`fn7J=5Frxi$ZZ`*)O4~KSvGrFfkum*PuzDt+jiPH^axVJrmY1-=) z1Ex=K#rg&7`heg@4GM15kYJ^|Cs^0%HY1tVYB zo@ZGV1a!m&bq{y?nfy;ik@$dFzCJu)SzCv&4_>JvUijt2$a^!1hiBsyGUIrwJr-?{pwYtoP0kh@jq? zf-g5K0a3q@xp%fes`t(j=(c+23cmh4fmrXIFH|J9vUdS+jNI>CC~)xgE)v|i#RAo# zcZon)_S$Vmj}djfOC3UL_bvmDx({@l(POR<-DcGPr`x;SYtZ)guJ9Vwyv#~RP?dUD z2?T2IYJrsMT?3qPbJqfAiQL|GfZwLvyIvsIdp9_RL%VmQBZN%?mA-egKppShBDi8( z1xjx3Hi0I$ce_A!?A-yJ`yJuC z9B_meJ?IF|`ChussDI_O_Yfn_(0}zF_8O)`lGiY$k{$62yPqOZKYLRJ%64y>U^v_a z&YBCG05(*_rVZc;4#j;%~&~Nn8ZAOzhaC-w@!x#$+ z7G=84XtHTaw;4^gD%CorjBu#)ww@>TjxY)v1YfRE@GebWgO6IhcLeLlU8h*bLV`6o z>=eVHS#Swk1P<-qR)HhAw@o<7%e4#E;0_?k^yn1Ks4l0N4c!9gd~c6nf$jAg*0DYy z$Ahk4@F*M*+=fBH2O9$Ne2#m9TS>PW%`@ljJK`L#|3L83={BQ&vuQ8gX0*(WddQSg zH~W!bj6D{7mto+xBO;D4lA}PGksK3Dgiizy+^0afkN(UN9-hwyQ9xazwF-*%7JFmm?_ZvQ@~80`BU;p-m&{^BU?J1Cfi zbepkDM$92bT%tATJ1n^BNrKOjEcm1;g1et8m_cd46)$>IuqvekS524<;2K?CU#5_s zIQjar1nOsBwou539Kp(#E4YMtg2|sRxY-2)heKbXU`7=QhSV(}$$cpnT;vkL*Dn>U zePx3AQZBgaw}F58K|^1KBlr~1S1Gs+bepj><0HU`v~*T1C~%7R(QU@kvKT?P8A~&y zYMnwi(N`z%DWI<&xao>D0O_VjqhOjg2`2I#!L#5lkYz}PgbO@rSn&0mfgCrg1;{m# zTODD1v+qdb|OG ze=*{%K>OMEPB0wa3s;%)0jTylJ_=UtPl6TZvtW9B5iH|h1=oXaGgfWReRG6$?0W*@ zKix-BKgtn2djDwP2zTipBOK!zV+HDI|2W`hg06qOK$`YX5coMm|3tyt zP7=tM{>g%mK1Cpc`lkx?AN|t=Dqa6{fvxPHA*AyzGX=J?f0jV~=${RoU>o}92xLS5 zT!DhpKTjYV`sWMOvHk@Dx!=DKIO&K*z&XO9f3ZNE_Ae2L1^tH@amD92 zEO4y%CjnRajMJYixceyrmA*gKYZ!ECg0FwmDXv($BWN!BGX&!_Q!weWyoS4dA6ZJ z;4@EuBXH9gYXbbse*Jd@pY*QaB8PwsV=OHAw#|Z1+9G&-v;qZ2VVhtCwF8B80{tC= zC8tv`g1Uer>qj?G;)ou>yYvb^M;}mX;PwOln5loj5l$Ht% z+;@a8_dxLV={Dn)#s}SIypkXP^*?lqar!6$BmN2f{>OqPcvvvjBZ9Y$3dUGW@Gf!S zm_>R-FvXq-2Fz2z`teNgjD9XylwJs)VlM?g1@ylX47%5X=iD3M7i;oc!F_orSPb3^ zX4D74Z1@Nq_qLw|U+%L|NLGFke7UcJ6_;*vDY76Wpowf)TR; z_{+%M2wbM`8QA0$j`e}f0(m;HMKDme3iQ?k+k_HAXuCk!9@rtcxjO|HXqP~q4(ta0 z;=~!);|RBZuR!}bu+J$R9|QXxVO$;%D7ga%1w)8#Gjh$l9Ad=3)V_hkf@_*2T;}zY z1%o|BaBouu*CS1EZ*KxOT+?*Gp9cP31raV zX2IRwBG7FPZWY|iZ30K(;C6vRHn;=0;EL@8{-XaH+$CfYm%D{jV2|K>>=g`Z zBTSf^0;O&+U2uUi1lKeZ@bB{uW&x@0Z8nf%eB?O7kjiz0i=5{OZ=3H3U#>uKM4{lj z6nPC=l)+n$uznT`9Q=bN0%yTssbDyi38rZ|km}3b7TmcCr&tXt1=EynGn#681RUWK z2EC}+K(`r9GaKkOqshhWeyvmf0P4J`g{)rSM-hV!PO+diI>OVUN$}jNh1yig;FvU6rI)TA1!4>NkT(KS?)dlKxgbUOs z&|44oJH@I!AXps+o#JK>0XgQ}J;A)C+l=OTSl)Mpi~In{^TFsgqj@eN-DWh;;`q=h zKItRDt$YmR8)L(QxgQY>?I=*-lo(Lvlg5GDuIY&2dOQKjJ+z)Wf`)AH8BpQwKX;0E zc_H{NFTIAX(kp?MZSb{I%>6fltNzw0HbU zc)=+X1QvN{qSqk!hb9T^%g|(jkQ$oeHO?p2bZDwTiVaP33dj7=bVpFfhGq!V^`V&p zN5Rl6f%F)fE%>B!1Wx3kxdIhtXdX~bgEll@;Pe<;;1qs3KD00av7cSSMS?rGSfGp# zEdh=Z4nuaEv7g!gp{34oAC?IztRdZI>}S`IZZr0?`>@<8B>&I~fjk{rDHso{1U{V( ztro6w+cm&RqJLjkR8&<25uGPF@3*M~L<-eoi3k7b9p2#(k)7<|s2n)u&Q%D$ex=~+UliQAD#3TT zBv>!ig6mNuaA?2144k$J)e82UI^c{CRu7!D8X5%7*SAcY!Pz4eVWScJ9PVwCU;#00 z24|Vj-ZE_lXBo)eUhxtO=&E2^UIWhC$gT^n`VAn8K(_?D)NR32>yBU+-WANk zdjek^-rg6imj{C7@lY@e9|?B4$AT~SM6g{v1#+1--#!y;7taMV`Gw$fyaWpV!_K`D z+?Uq^lfc_Ig4^&`aQB;mA_l{^Oq)TmncPZ5vD**tm=)eI171RhZ9Zs( zWy!P|{_L6_@)C}*=EDLRxnTN1e3pB;7n?65L`m0&F~B-PIIFXE>M$TsWWYcXWUAr&CtK{(0qkU zvdrYGf(dgCxM0Fu2eSRx8%EfaZVL9#TV7&Qx^0B}a!0VC+!bs&_XNB2eZda*9C-}V`h?^Zq+-2E4VS@;qtw12!3Jhff}1uo$mBmSh* zy%k)-X2Azz+6)VQ^j0G*v53Hw*UYpT`Wuj%nKr{hn{4!K6zHCQO&WNZ;HoxP(1|J-HXCaXnIkAKNFGAN{~(*K|Oz84L<; zWm>SG4hfc6MzGX}1y}5yU|PNxOotDG8}(5z9X<(eHq&OeV-ZDnu0B#v8unjHa1jdb)@d9nDWr9F6XqhO`En6lDl_T%cGFhNo zwoDQDme?{?pnbMX8-e6kd@X31E_lfdffZ|+2^`@7ZkZ+cv9kqotYr@1AJ4bU6=-ZN z^Sp$uY?*I_tG+0dr*SxU$^3_>l-gdA3x zX*20x(`;edOn$@Z*|OYA{^pVufWPm&Wu-s^X;~$hF{=fpiIz129kykyU>dFysGyeh z0$r(PgWw8n6c~eBHUa)$>n)oF4w#lLUgGv|72NG@g1Nn2U_xuzAyE7+I|Ubcmq4wz z>=r2PmOX-dxmTdYwCn?ZH)Hk#CuvhH2Lu=Bpuhy*!nB$6mvy%sBH~YaaLZxfw3(YF z&_7!)2ySJz;5Os{{==e{T)~^>3Em@Lu=ooE&VrUg;H+g?Bp6XF*tbf6zb%+jz+VB> zQU+w(gvx;`v#QUm1(7M%@#b;acts*2@FIdU+`La*qU8 z{jtF4*z!cM8lDRL6s6^v;8s2tJjPxCC(VzSM%dV18DZ_eHo|WCMqu7(c`Ml0n*}=z z(`NjX3Dar>(|1cm@MD=a^Cc$OKI4Kfmk@l8 zKrrb-!E-(-xE@^s6MRdz;8ykszFe>1v6d1{sXpLu&zF89vU#}y!A>^_WSh8YpxCxG zB$zN6!L%F(imaD+g7xxV@MAv+&TtiSjj#y60LApNR;JB(5%Xy4 zC?hD3*3kkL)jGzT(#KlI3iOZGabCjiw~jZ0>8f>tKq0qI1j@pX!8 zrFFhQskbfwF0;3-3xPT+s&$b-HMA}keDo!PtM0TJuOkgxmlD#z5YxI$pu@H@ZN?i+ z5T?y|gZEhOC1ii=3ZT)9SqU^z+O4aEQdVg72qgY%)~x})p*^&&6@0sOz>#9^vEB&Z zWrGo>;YPu&+az#kw{G?xzU>wxeDtkGxDVTm;4Em}ZiKJD133OSPr7pilHZsQyNoam zcME3S9)S+qx)=D#x7{b0+xrC<=m6l4hg%N{98#@Jn+bnD+Iq+cAN{c4b7TqD*ahGh zPVv@kBP`1tfyUmND_Gijg6$z+Fh2?e3#L$T35x_Xxmd_!8%hLgtW4~v5_A2T5e#Il&jp6<))#{7@ls%#XniGc@VCAe?5A&l95eZ?5gudBMp)TQn~5Ao zrPfw2F>xb6wiU&+naFibnKlzS&I%pg!}i%JSRPTq5{n5;SFLfuMxPLDD1l%hhl0&L0?KSTOq+cL&KsYJDECRf2s~+oX){qy@<&D) z!J0-!3uI7a3{cO-{3G*AwarG`+Jk!9Y5Miyb(Ow_v|Oq+>% zdT?a9m-y@}1SXQmN`ZqevPz&SM^+1Tw#XWwfio$xR^SMVtn(6jaAdu}`5M_EFn~lh zjzI7Yb8%#oUz(!L8gcxcvtN+GXURU>Y)Q2L2#Ba>xj`;jmy8W(l`LW=Sy&-h>y^MS zuE#~eOR5C7;gVp|RSUjtjbN@{7JRT;!8NTDT%dZv1!@pn52nrF7Y?aNqY>^)lVH6t zZ3e%YmQ0($Z&vmdF8R%_bXBmSUIR{8FV}(J?b0^{`{&IONaUH?w}?1ZK5~jjZUcX~ z9(M#Ux$7m~^q%08-WSZE2Z9gwP_S+v0e`sakBus!Ib)-0HoOq;=3kM&j~tn7%u=on$z49@bcD8jTE zoHc_wyu^3u6kLxeaNY-t0saRHk+|SxWqjs3#4}26oEs$ZK}X`ueNCdLrvRsfqArThETz$ z%oIqewpjulrfs%B|7e>dxIlA(i$2&q!FQQ2&@I~*05#0#Z3_i*y={>|p0+I(I2+oQ z0M&Hy&9T{Kiy1WQ4DOSTIqu1h?{n;HP8*$2s}ha)57{(AshZ?~x~%+xY^MQCopv zCKm#~S;@3cgE~_pp*L z8Q~&V1O8*Jwi+Y+*vo?TQY&!aw$%xo7H#!{J*Ppi88U5#zqnD2M4UKAYBza_3B$A* z{%qnhZH7PFP_A&v&wlJx?_tC>!G>~Ou*2T)9%k}QBi#L4Mpz!VfuDT+J6^(!-*(qa z%;bAUm}B>iu;n~3f(fndq2Oup$V<$i$41ysp9nU`r-GgCnc#yx2Y&NyUjV;))0e={ zHtAR1!<~C=gt`7kaQEMOiQTeUVES%j+6?_7)z<1gY{3yPv9U32hQHYPnKr{;%1EgW zFLAu+1pacPqJrHa2AnbJ;zqcp2_ww0K(O{hf%&{G37oaWx{NRjyMe!4^&Y`K)+>C? z%cZ=BtKMgXpVBY5w*x@7PdX^L9%;dQ3<*A1MzBnW1rLjNg6-nH;1Yfi+?S6)o=^Ho z@TN?gVZP<@nTY&c*5ix7N!ZS`8Rm0Xw2v}^3~C=OaICeD5jYy##|q4n?c;z#R=s^Z zP(;UVpI`)ML;FO*=a>W(7%|xhlCFIUP(-_EpDK{2?bE!39BZF$1f8yZhCsr!&-4glTv|pa-{SdkK?Kdk%2KRnHYnm^{Ih$`?$_0)eL7 zUMQGSMS|~AESR_@z&EBtslYkkUIu*Yij@nlM+I=af~2byY!4T`#7eF*f^)w8k`Z=; zYJtVvDI0OsRUIlqYQvtQV%uq(5_RZ#2RZYZAHj`()N2?JoPz3nfx@Fo-{%vJ5Z6^Qr(L1>0f?3!JWSc=zfeF4n z2IQG^alz+E2dtioRYhz=kKjFe15<9|bq+li(sVZN~kL`R$*L zux`HyG?Wge&G@lDM%J`r6cOLCVjZIe4!({t!1o-{9b*M{u45eVKOU@OJn$or-Z26A zgN^E#DE!WIOcLl09g_v>wqpu#im|U_su3iA$25WN&@o-`U1kU@a>q=86S-p+aEi+A zm~8|**D*)n0PdLUB^=Qm^8^a0V?N-2IMT5I$nsql8bO2YSR}Yniv`Y?jwOOG=d>Bm z@u1|Zio+z1rA{hNd`K4r7O!QZh(Fb%f~6mG{h;WYQy zF3^NJb_hPlPJ#B&u}fft?bt0?mU{#mNXK5m3fd=d&~@w=%*z7;Kkw-{DA2b$m^S0Z z9H$+Jh$!X6={O9O`(RlD9i`&}P$^^sHEwo}U`NRX{NGbL@{BN*^NlbI3yd(g3ytte zi;Q6Y>L?Z%gF8wDldjZzm_cQNRaovNoSq#OMp(&}f+cnlsIyM11h?UmV9%)r{9jx; zY6MH{vcM74Q7c$;b%MEGFPO;$mHX32gH35xwHm1#Z<9|thrp3emFbl5(-?+Co1XKH_z<}CuOR%DD3%<)8!9~6+Frswa6MV4yz)|z` zff07ghk^_ANH9+y3)bxu!4C5jIAW)JW`rH)xsb&ozYv&ci#_~=ZV34iw8(Q1V25fR*Mrp?4JE;7?*;ukln!%LXIIywag!;YxHK-Lih zeih6?t9!cSQ7P(6>VY&rdUytCC+$&i7DZoEp>F6`U9P1a{h5^B< z9288Lv|y(j0)BT*Gr&oobQm~o2E7xEcrV!bKLCGy!+Lxato=`dhZfUjBG0P)OhlgP z@CC@H1$Q!SCh~ZW&QV6Nm7Sx#2f5xkMqrlg94oMV39i~3V!S) zfdcBBEKnYuQv_vjyGqMexv%Q3t(>ce8 zIwIy8!NJ!#&j==z&iO_#I(05Ef(+_hD3JV}iv*fd=VF1B>RcjFVx3N#iF{XisUe(N zoy!C&sFP_kkx$`vGHoXE=mwq3y@Yb;Tmj@WD|D^|{55Qys|2@hwLqKyO;1IfX*F8&>lK> z8o>e6xyy($GG@16S?&QEebT)~xRv_^b85d}!5k2ndpZvaJ_plg;vdfF&O<~rl=5JQ zy~I?`66h$M7l1}HH`{wy4mpBvo9jLNlsxb86(5^#ge|5(u%i?T?pzVjKp*ccHsTmJ zEfHMPQoz}%v&;xuZf7~*&n7x61Yf_>OMKgl0_R$1m6!PFmyBRU>8uva^%}u?xhz;7 zwE~lKXPsa-s2_pgsIT83Sn5oh!BLa0(FnJpNpL-wHiM&f2d2&7sEzCjmwaQ6UG*Mz zhik&u?8|k*rgQ`N)A$U2`1*6nk_dU*kya9>^uZo@0VmwOHPpObaI0ZzL6Z-GBN z)|&-WifJ?W!`E*$!bOeEj1S77??ObIr&K7nsmo&7+TA3I=#ZEH}l z)YF0o&XDjoX_*n6zlH_#^qt@k^B&0aZ1^C!a~}nd=ud(P!?YRr+rBzK8{uYu5h%ha z(`MlR)EFIQ1W6YiEpQ}7#|R{DbSzN7ibcl(g*(ADt+$FVRT?-)N$f zfg&TO2!8BTfmM%A1B%JQ=yagWmzyDQHbiF%KKd+yii*w_eEm5B+Yp^A(8r?l1nM?A zU*LOWbb-K07+ok(V$nqc`4L?_0`c$Y$NL6xxX9rUW!elb zGLJ`@HiL^4e{{K*a9BoH05!DB=t_ZcE4m8szwwQ(HX?hZV4`aTDml8=OK3vTbpj0} zx?XUFHh2$yxEI}Mgp0aKaLG0c9EH&>0yP%hD!6sqfEqJ*yTH5=-65C{I|Y|;m%w-t z-7T2xdjvCgufSKU=stn*BDx>A%1-owt;WYdd*L9Z?6k( zfJKhvb{#$}Ycw6vrxC8uV5#BYz{&`QRp$FaflAnMFMsTc09~xl>JraDm$AX9D z6Tx?R3jFF(_)PGCc@F$(7QO)fVy2D06s+4GU4BOEG!5%aySf**ggc%Y{m<*8Z zc{?olvF`-m<-On%eh_^9kAnO1NiboUHbZ|`Q}nYDR@4`P?hs?z4E-eru~9~lAF2@X_Z0RUB)vxq_cEPoPW1<^wf;>;j;cQ6aWa zAd_Q@fXj@5vBgGkzQmRo;iEfkhP8~&v87%^H;640X#Fv!&9IhQk1=hAwG4H!<$erl z7+c{zXk@XK0z+MF74Q$oSZuXG!Nk@G9NMw9f^WBO1d>PSu(9<5Q%!7xKv#-w6gc@} zn*{T6vtTN35vcXpR)KC1+a{Ro+XY%~YzOcSg&W%`P};Fw0@Flnx4?N4+XH;Z*caO? z_#FFyZz=8Aej|L214j592aRxnm^PE&aahI<8A02Q9Twb%EP;j^yCAq?*@AVN1AOb- z<{Du+7XaVW>SBdPm@q|x1yd|omL-DePzro&!IT+soZ>GR-0TX$imDW> zmx}_kQ>;p`OBiyJrM)+WFfg%QwSTj&;%`t5zi_OzkB1+ubh~TO-Z6-_Y zFie}tQVXbqOG?jEVx2&h&k+^umN9`TFBS*teXzs`#Qlxeu>kNFO~*okku8?=62`t* zmk}0nx8REPc!?diS8zR2USbjU2{wa%FL7T6jIf~$0^fO$wBS94fbU(gjKFuV*f8*? zee9iJe!LgF=?CBs7x|+Rme?o3CuQ1<|LM%~*$9{Li$MQ~Gi}EI#2Sfger8=L;_30)ek5@r44Z z9bW{L(3Ikfjc`qu7(q(Koi^je^sV?(Lr9_cGJ%qcGi}C87%t;XoADAx=lF6isifB9 zD}Wk~)A&k(X(GN#pvA;j3w#ZTuMsY=mum%n2p?Z3Fg(Q93vTWPfj%DJD7aIb1aoS$ zaE_1N0@QJ=$F~Y5**3wC-7fgCJ4PV5Y{Bd#qJcRuzDw|9cMCr09-xs*j_(DU=)v)Q zBak>sSBmc!OppV>H}3vHBdiam&BRf9aQu)FZo^^0=g1O#mkWX$l`U9OIRdA6JXbIs z@&wZ%U$8wC2rf{e!0-?+0={7kju#u@Hk1I)U-44Fe=r*_6I_pS;8!M+c!l8ZR|?k4 zMZx5+63mZFf)!OQxRo^mjXi!@;Bbi73O2Gj!8NT1e&Jhkyuk=}pJ_Akt7kzY5x?7W zngp9N(`Le7RupI2O!$8c#IJD4N%Qoo;5J+XPIIosuM4jF4Z$M3DR|Rcg6;CQV8YxH z%)+}s!B>>}J%O_^eqV6s9svFu+xSDlmix#{Y)X%faFL$~d`pZ!^%67anGv2A&jpX5 z7lKv!(tB8huLQf)YcKHxeq)4P`>heKX|up=9cS816!2X%-fD!a9ud4L(`KU3MP}Me z6fpP1JG{g)?GzZL<59q0;~0+_@eex}7n}qVUSgLD1iqfcL&0263LfiSf>qfKHxf`@0yOFZZMjIe+71Es(4E(1WB&oL-i*=fPu9};|y3{c^zJ}kHm?|^c1?7b2H z;W<74jo#xU@QwhNV-=p003(!PgPcUsJn&{ezQAV(HiO~X`E-?mZ z(BQZmu!z5+`O_W$-mcVJ6nC&H0c47|j4||)KYXnDQVxB;GB<2fDn~4Pib(>fS zH2I{9jPN-Y8^IZsSYiZCI^ndLXe7xJOTES=Tjn+7c7ka$(MU&0Fl{Cp>EnszUP60F ztQdjdsLQ@mpwlN-33SKAYJmeLu|}W=C)NsP%sRohTQ6{GB{m3d%tnDqPHYmG@)DZ` z&Vs}i!L8dW`1;!fhKIykt@)Z5_tlxE|CxX zVto`CVMi$xIK~o1Uc#A_C>9vD6D7b2FDVs#^fKUg8fu~(_`?jU5Zs1J!3DY~xaw7c z33ExX=Bfo(y+&YCOk5V+xmw_~H?0%=*m}VyZ4kT%(`Ina*563PIs15%;8rqi2IpKt zrp+MRdtBj?3k`JGt3b9ly(V~`To*Wj6E_5YE}6I~*pzPxKF4k0zkKW+fq5fwSMXi# z0ePLnI(#7k_!Oq)TKWy-V}RJlq?UV*O`iIm{6 z)+aE*C;A1u_5jf6O$UJ{H!3Z7(;=ahC(Qu=3d4f)#yi0kdoTDY9|Yg_qhJsEGy>t* zo|R0S;n%MEXCjW;*uDt7ZNRh{9;GP-ql{o62}TQ4R4_)M!3JXm_BI#?96vd-9>I9P zU$zlU5SX2Ui2}!KFiBwC3MLDbM=(X8O9fMb6RbxtO`!D!(*;^zFhgKc3}y-pHNh;w zkDV>hwt_hV9XFUOxXAMa$~2fSuu;JRfj$;21b*|;7a2hY1&fWKJc1=gP}zagW_W_e z9xU}58dU@X*2wd-WM=!h9}I2<=%sC5UdbaI zv4?>_E&eRPU-=wd5NI($wqOg8iaOup3+wOv`G)Rj&~^3xdmnwO%Wj$#sGa zq+Vc94jKe|AJb-d))v!f1j9qnB)I!bo1wqGJ7C%j&swHexFpL(z6#_pfCSeBo6>c` zy}corr#A%;m|KGRaa%Bx?+ARO3GNE^k9&fv>&-xs>AzM+IAO%uC$cI8fnpB!Eg!-~hPj5{5vP)sPgd z$}YiA=@x9#J%Xv-D_F=W!A9Q))Yy~z1pg}9b1WnHa>IgY`A)E1 zycgX44}u^2QLtV<38s|OX00ps*$5B5F9PckI&IdHh2bb8=-T0EfrJUi2&8s6R$vLk zaRPZ7ju+Uda02iTB^FK;SfFr{;KxoDyvG!QZ3w3dY(qFrV8z1ef)6%h1d?BK&V@4t znn5^A;3x=Z3ohXtfoUt83moy1d4du11)6lYK;RS$7Ya;$;Ua;p3>OPzP`Cs*N~woV zo5`cJsc@+w-;K1XaGCHmz_gk4U!8_bo5`a`h*<6=w3u)O@I41^xKf~_gsTMav0CsR zYXmYkTnl{1P#3N;w`Yz!(kG@;rpbPg1?)F}Rh8pe@=ojIBfwM6@AXpy<1%|1RX*2n~seH%? zI!bt0u-3DH@0du!3r5f`!)(E%%kh#+ylpP13+?R5}y{!Pw+Jq{BbMEa$!L6(kyy+$2y!BEonA$bK-)_`p z!L+Ou%#S+3)UFrI!Un-~VA@Rn%>ffO8euv#0sgbxkZCiSV+LIn zJYcQ~Hs$MrMR-FnwQmCX9x%5AtKqib65bKq?7M=`aZhlg?h6*s1HmVKDA-UQ3CzXe zW5IWMBG^Bk0!5xU&wyf+|G8lDzYx6SrQqT4O0XBc2K>(q!#9FG`K{n)Hw%_2(`K^N zo3=dlqsNj0UfGXQXTrlYp0t0Fo2>+6np>P>U z0+)^fU4lnax0lor(IYU9hrM26HKYVj;6A~FuOFy)8wP*|^K=mS$4pKOwu_+=h##>U zGJ^LQ7RRT3>P!kj+*mCj%EqspJ$R z=nl!LMv!C4X##1PobDx@9?2O-kjcrJMsQXpX8|SbTynO+V3eFA_~>&5_9Zz_pwlJi z3*<*~fj~+n7YcN`HkDi<&|;D+1=29NN-*nI3k=uEHG*%qRxqd531;1T!FSmpP#?*SK%Gyz zN$^uP3nu#(!JBRc8hrh2f;ZhRc#j=|pR!ZnyJvD2(8wW`+zm9DhI>XJag^~QxmWO} z`venYKX8mzmpovE>v7NsbDL>1ag6U8$wNkPHYN{y4=X53u*NP3wIfYAnJsva9N;%A zC|B^&^8~X$U!dhC3j}Mu5ct(@P$U>p>?JhzWQky%mJ0U1GQrX=2TmAK0sQXkR|@Xj zMc^buZn6qEbDRab1e|UHs*T{FOV$XCu*u7U2~#V$Ky|=r*P~wGY)m!?ZY9%Z;*1;B zNW@=u`X->j3}V_$6q@Tyn~6eK{R)>9S{_%uhlPC22s8P*5w6D#BTW9Ag0+83V9ZJ0 z7TnuA0>^3cE>Pgd-ZR4fdEW?E?1A8BKlBpo<&j_?dn_{>0j>}!NyM;b`iT7gE^wN7A!?^+L>a4$CiC*A&yz#r!2CV>{y zwOL@c?%E=_ms z*f0FW5*`ptp@V|8&a@evqoH;kGQw3qEHHm{WeJRqT^E3CA1qri4RZujDpxRr@&r>k zU+}>S1mC4l@b!xXU#?hivrB~YEKsRnT9yHM%nDuQKp}0rt3u%T=&BTK4;O(V2BEGh z!M=4#Fkz|%v#>_s%X!yjpxgzj6O3og(L!JT_4xKXbJ7x}ed zb9^IsYP}UaJ(~rOb*9b0KlbcuHNu362-XYJX5eqI?PA&t8trr)T+(R!>=f#$$|%re zHN=2_ZR7C~2){DN5`rx!0KWEE3xT8FG%46|y9DO1u5Q6x?-8uqUctmo2{!sZ!RP1~ zF7dVlf``SRVC|;`D|-ky<|P^6Tk~UBaBtrUChmLScOyOs-|%1`1z+xyV16)dhQFK1 zpN+6yz6ca@H`8YLJ4bZ)C?gnzxyZcR9xIUR-QxtBboY3H%I=;Z(4@O3 z3bfDeNx+FFK4r2I95~%m1Tv_5szBX#PZP+X?&$&v(>+6Aqq=7b>}~fffp*b78#qaa z>7HW*iQ7F_pwV~F6X=EA^9Aa*dx1b&b}t0}bUhXcUb0wlUzPypTp*{-(7*QIz0?r0 zu6vn4#&k1nhUaLx-AtRI|1h9?xtF;8D+DsPd!=BKtpd(cxZSIbaQoK?zV2Fq?C)MD za9VV)7tE;*g3G>9Fby{e?!#t*#@@X}ppSQN75MViy$#6W;P2ipxcxf>dQSIFfw`x9 zmtbD*7RkgxKX!(dhc-u_{WdEE4Uu_1h?V7U?x8hY+DZnCV}opg1P>91d?C-u}=i= z@l-H_o&o>yzp&5!i<-g zg~P&sc+z)*{q()}uz)@o;c@a&@MAv-CLPme@_!8d-JgxHjeijsm3o*qlmBCZdPWiP zJsqZJw3l$+_KXqeFg;_vgaYarXT-^ox9u4ZoFqSbCIF|{sGf;N__31&-nM75z((~< z5h$^qsRB#bGfiNDdZr6BrJfnUX%@L>CUAxo>zM`ouKtY;}9ju$=41R6*W(`GWq z1!3Au=Fw4lmUBryZM$cMz(LouQlNr*RtY}GYQfiCBhVgt)(WI@&pN>eTQB(N8-OA+ zW}{#}Y!WETp3Q=py9FpVr?v`a-8R8b*)CB0Jv)FB4u_tdK$!)zOW;WE*)1F+WA*^0 z7R+A3`q(G<==;3~EvDyyK;P;)D44lSo5?aW_mDUBZ4Z0N?>tzR5mwLzBRF7svVlwP zevV-F=L(FlJ$ZsTmM>Tz1%kU@DA31yiUhvm^b`xs#XTj0Z(Ax@r)2_XV^29y@5@yP zoJl>Ef;)Fnuso^+POY9xK!a;qE!Zw=1h?Tb;D7qmQ!BU)bt4czlE+5X3vNS$;Ce7^ z#*bK)jYhaHO@gb=v>E^20%F>XpEk#?aLH*8n5%-F{+i$tUKft==r@G_0ylv_P5xU( znCrKVu+;Au!8Flx7sz&z?+NDEeSx{B=Ye3oJOoPI%145W{8+FDKM`zfPX)W>Gr>Og zTyQI22zL6Hf;sjID76{92Fm%q((^{}!QKKjwykEM&Ie=KjMv$MTZw3L8zO=q%e0v| z=FTx~CXRY)b&On+IBH|-1djRoQNb*X2`+M6FmV$CUmJS@!G;n7zqy1-!PM>&+^BAW zAMW+^2!3p@;K!zblO|oCVCU}_JYNQYQ>V%GLEwx@mj;R~pdrCb&Io?&u;7Zl6TanB z-V1iR55gHDJ_=dDC&4vk+DsJL`aTf%y`zjEVR}aktZDBUfmQDv zEATa`cN|bi?e~s1f&%KDAh5{26NPU^UaohNK-=n_EU*o|Q-D$ysCOz*MlYXi+mc4U?zj*Yyg3mEeprU%`3$DikfvxOaD9{~x z7YQ7%y^94-kKQGM8|Aba93x|TmyU!4$7n*m%LK1s+6??LeJ|5yaLnCa?j=l$y(>;z680d@g@T4TF~<3#Kc%-p>KrQN#^@L$FB?g!48 z$_IdRbo$8Ju&G4;jG`)O%QQoXrAw)v4KFgx|; z1O6KA-U1^y*Ln*DPOaV|!FMV49(I%xBlw=sTPkpR_Lg~x8&wYExndQ9FINc^TKpFU zyHb_F;m~_YU@q>h7Hly!g5B{lP~?-=0>vC-y>$X7PH#O>;p;aDrX|y6Q0|H~8sSZw z0DnziFVkjF?lv%O1{IzsSG>ghxav*6C$+B`;qG5Ig3+<}hG6pF6s(t9f^T~pDCf(0 z?;XLEy6YtjxxM#{u#epr%;X1NV(mW^zT;gU0ad2MW1!ZS^F%ODp8|Eh?K2}>kLM$h z%(5B0Fv6F6DcI>=0d=m}Yr(C2BiKLQdJo%0vk{(+Oq)Ti3)Jc*?tVnDJ1}hqbrulQ zW>Cxbrrr)NX*4Z61!sk*V6Mjmw=xd=YmOxZGdUQ6@GBvs!o zc8}nr_X@6Q3UHL}?K8qf?gzfLI}8Yx`k-J#NdqTM{vpA=%?MWZu;9G$PH@V5FZ@j= ze-JFwkAh>)C%|8=+sm{Wp3LDMpS{F)`64jYq?k6t-#K4Wqr55Qks9qKWO8bZzzmZb z>m{UAYMelMq{a*Ucq28zd(fp)69sy5YLY;ANKF=g7Qv9C@H4R@SORu+)Ef8Q!D&j z6J(`8eWX?iuJUSu(oU@b&Y6a51;)PAIxnF;q}B^`gVY8up$Vln3U16MfzFoNESRWU z1Ug%4D{$U|*=7WtEwvrUVW>;(5I8CDHG`QsdC{rwxL3xp{6Q4pe7Qy=Y*S5wWy-V}*15<` zo1uSEFLi}W8aWD6S4SZEA9w#6@U_W*9XMhU-T;oe$TtP^g(U>i>g3{$Btfe9_u4g6>(_ZVSC^$I3k3OME7_6gpjUvQ%a z1XF5IuwK%@N#Aw|IBgrx2)3MI!DId%@RytYUa&kq2qxV}!SeVd__j=&N&js@>N64N zT=g#kiQC7tnLNif^o=rtPw5*CoF_l}#t5{&zOe%7&^Hdq`g){E_l*}A75XL!j0$}d z1-7AYlEA9>O%~Xfz9~RXE}t@0;3pA%(*#z%Z@NHv^vw`BUi)SWoDF@m1R6@;Y=Nrm znf>SNkW=2N(ROqf0jlL+8G&f*Z3j2sdx=|lK%gu29TfZ&rp@FfGxv}Y z=Eq^dRL%mbEz1jniJC3A`#Ijj&CV4})I2YtDfi_YVLB9yK=5xhwO(k1RagYn+fj-I zJ4%VbxYbuG_;O`HgDF)mm{Jvj+GC0Og11k<4!Xtbf$08Qq{^&2Od2oxKVwA-LhYB zUj~F9xyRrLB>pvF(neSwLq^zxGDdi44I5!Pyc1l)_g-SR`~V#H(LVyme2!0o!vxc2 zaNI2XY=pc21^9uj>}T2xekHa0M-lNGFV{aB_?1TAKgI|itbeQ#94Gzb1V3fGzykG8 z@E)8|{S$!`Y(xJffp6aZlYu|!mi?q4YQq>BU>Xt6-O^e+*7 zTc^z+hwqL3OAYyj1z8681F?Rl%^=U0VcHA|>Er#&xun8eZ9 zc7dkczeDgjb_%}jF2QZsEx15?1oLvQU_R^vnk>uxLKQ1^0Qi>{(|=H~)|ocLuf4~i zk%;h^4|Z5EgR%q{=mPMqFPAOQ*!y#Ulbi+pxxgt-oc=t)o|7-o$odNeOR5k!>Dv|w zzDu!SotAhHj*tFQfrG!l%uD`d3CoS(2TU{_=`F!(xGmT}?g&=pUBSA&2b}X`?;Byw zJrL|;4}rfu`5qZzYCjfiN>2p)*i#_aM}H=mW6uSCxYz$e@Njr3SU|4?tMavAA-@qk zE#3kp?p(8AelTr@C9YVj5$;?>u%9w*h9wpu(`Hy|&2@MQ-+22wg@35Is9+|?1PdrG zm}3dSY6t{VI~1(Bq`;St{w~3E=oXw=dITFvui&ws0xIoNeS+)J4_q{*1_bkTP%sPA zK$Yt;1YA18ie&^pc37~Vz61XMoO>@=>K_D8ppSyj@k#I`WZDetZ1kUva9_R%q|^Y@ zW>`l<85m^*#GnGVbWek7#^<_dI& zfq4SQ$-sPp@)%ekxD5*h7kQCDyBJt3_@qk&PQn4F&E$_h>QX~Ukbz|aWjVmKnf&p0 zcAIH4`J)@N+)F5!ffWMh$-qj1?|cKR1p39mYJp}rutvDZ$F3D9{(*IZTen`I(+_MA z=#B#$1vhsSaLRqyEYSJ~wg^7hR^T)pc3>NDhAJG`E?6)-Mj(Ef;vd*)gbTDwpv4UA z7ToPUfWP{1V6Q-X7}zKHa{GaEd`}oSAka_;4hk+I(`ND(F3E*E>7$^mDIOqn- z1V6SMDB$29s1WQ*m4an?Q84+d1P+IROM;JHEquq5)(GDKmj&Bptzbi~1N@7e1N8zE z+CT$PVj(kaCQE#_Drz#KNnoF7lH-!Qm}wt39kBU!6JMkSRQW$&*)~sF2%H&thOp!jj+>2 zfO=0Hrp;u%&%v~rZ1AQXT=I`Q*C{X=4MYWBE+*Jv;(~1}A=sq?!Nd&(TVE1r^hvt} z55DdZh#&EM=@HDaUf?^QGzEO`vEB##=so&@(?0ruz}KXKLBSI_EqKlk3BGMcC?QXW zfowPGo#6TMUNGrC0RCWV;3H6Cu7467rkFP4C06BUA}(9EUw}HkjSMnv#+$fgaMVad z;us^_;Ar3k-C=NyK<6JEE6`vE#|gCH!SMonJ2*igPX{Lg{!5C%Nx&%vqru4nD>gU< zIAg?ApqPCboF*`^4^9_+ju`@-e{iNiWe?60sQtm&0tGZUN1){l&J|psc>*~$IA5R# z4K5H|!i9n_w+JZpT^0jnZsii7!k2T}48HPZmX3r3U%5id1n zGNqU{gC?fD!A2u|(k9?vPMkre&EVfA)`Mv?{My&QGIB|H%-z2#aEcFJ1HQF@t_!Br z4Z(`K37oPA-4aaP+X9F7;2pu%cUSOJ?g=j8eStH2@PXjFJQPfrM}iymSa3a_2#jol zPX&*UXM%70T(F{E2p&=|1#|3`V3&F=m}74Qi}0;r*KP*>X6zee+6>Q|maRsZK@s4* z<-xQWo;QP-Hp9PdN*&(AuH7lv9HWA18S_&t^|%qo$-;yY4l#idCVwc{`IA7duiquO z``v=AuSYN)dIeJ|CAf2ag1g@@*kA_)^K=l%^X1ZlYdR#j>KPzk7zRpzW`W)b-t@iT z0(}tN{f`3Qn+87#C%GxpX6Uc-AN*{DTlqzx_R~z8VJVrM9%Tgkk{&JattdT4VAa!O zfl9J4Jx*YO(&GizBRv7Q$lj(W0+-0K^dx~%Aw5|jann-({~w(6RDr`HJx!norKbzD zt@I4Qzao^LDbOy`vjon$^lZUTnIlly>A3>OT6!MP;F`_{8eP)`g4?iAU>;2`63C$R zVu5r>F9Di3lG09_$!|!Z^wN=#xFD#6`eE%-8P1ZIWwT7kx%UMJ9|((484G`#`%k(oBV(Fl5QdXqqnr8f&FMk*-1 zMd0Uw>8%21L3*2D1#K6Y;nF( ze&7tfFMR;`%k?-YnEgzf$-i9WLq>1{rw)C>}o&%hx!=`fuQz}p3 z1WxAzS+wnRf#7Br3f{Cxuqzb<7tHk%!8I)vtkW`qVJck?III|bc66Wxz4niEbze^jWE}n1UHIl zGg;uiFl{CaETAh~Qf%#C1xh%A($@rw@Va2V+z>4Fn}RuZ3n;e--xf^mJA!X}SMXi# z2`=G%!JT^`xP%V{yX7On*MBUSg---a?5W@qJ`+ss=YqTcLNGsG3YPjS!IXLpRJ&qt zfSRw_{kMYK&@9-;m^PC&CV#6pWyViOyu`-Fw3)2-^kmvh)*R(yJG{hn=oH-SsGnk) z#sv2^E_l!-glaw|5ZtIxuootQ8ouzSyNs~0bqjWf9xpMqdyVkmPYIr4eS$rx-+S0U z28^)d4g&S2R9bK}7y=qx^^EWjuRjd@<01YI@ZavG-wUS02jK_q@ljy7On(wgZKlm+ zBcpWs^GHPee#hO5cKg>FL9Gw16I|u>USfi50FJx48wCn?XcO?A%f1=-fzCFxMQ{zb0>Ap` z+W`M8WN5qK=I#)fS%!83XDI%mUBG!d?9gt319xbT@DnSxSD+gV?Gvoz{eb^yZs>qu z<{lInFNT;lgB;i6kP+tgVSz3^lm+DZu@`_s^DzUWeEnRY*rdw?D!=7z^M&I; zfxy`~R4CYDiUhk-F;L}$l>l|7RH@)bl>zmpRJmYURsc<=LnYu}>L0o|0^!%Db`@}p zIdJHb@Fy=<4IJkL9;yMpbzd$EZbL2b2ZPX19dOE;t2e@TX)waKW!en?@WC3r#J6qo z623SLF>Qu_Fp&%~ZH9lib632F+i+Dd*ROd~YwkMmx9f33;JfJ1O@RY<=$2sXzb#n% zcLdLZyFjkha8F>k9J&wWxpNPIeDm}n;GZuIJrb<_#{ypqhMov+m(C-7^*0(v93b8mr0SG`$q#h5n3Mi;r&2#?c7%s^$t00 z{>Qe}F>*=roB#5*oq~B91&+GvF~L(TF4%(-f@ebj{A@*qg87jIezF;K8Sys{)-BkA zdjyY@UhiQ=rHpWa`UEq%Uoag81h-*OaK+NVPrm+;5teDj2v=;_2%Fc+HIR61qcXw3pCwGGmOO_A_Gz zay>H+@K3=r;{~=dGeKa=%S;6RqJT1!1O}tbWZ)dlATvcEVKP&J^YpRIG=X%;Ob4=j zju`@7J2O+D8DwS&KIv>AoASua5g5NRbAeoPEHh7FvorGraxAkzaMc$I)JtZOK)qxZ z0|nGvW{JR{m~q-n7BDGhmKwq&kXa_sE;CG<$pUwqX){^CL6=$XCGOM;fvn4{6zGnb zRX{P>pII%Cmzgz!DYOa@!{8xpUjRGw` zUgFDb11hQY%yuvF<#q_}_D;c<+a=J)GrI*ES!RzwX=nBVHKyS{!4%prFezpZ2%LPG zgMu%|w3)2ow8$JX!c{*kFp*@k1S{x*;G<^?e~t95OpaiVv_fDK$W#LLZo@^v6{`|_mrFnc<3*-g zaOY|SKjpIEbJPO=RPbPRf>l`$H2NG3f;-2wne_i`&NLcf!ZZoK9Mfj9$(m!@j341l z%3K+_Bz~lh2fGS}J6{W!emmyZfy~{NOf30Ds<-VcHD-wA7h4gY!0& z4lc>@Z0Ho+hN$4d9|J1wFmb`7FacC~6b695pdu3r=0{R+3A+Rnrdx2udIaXcOfS$V zq=2RdlD}^R!mljTe&Cp^J^=h-c?=3JVOp^EhXjv;j9{l57Hq-q1h?|NV2Al2*grlB z_T*23{ex*U{KNM7*$7+k7lBSU%(NN)%_YO5i1?fJ7#=N9bHif4EE{7KYcK+dof~&qra96Y4aQ3ZYd#0U65tK&z!)+PMbgbx=x!vGky*)_YyZ|h0w_6t`z9O!>a^} zZg{oebF2}lvEj7>gW>QxfkAnAJ@5-{dw7Ep^sV8Iz$ue`lVGB57O2zVEx=!VksRJC zm=D{4bFSES;5=nHyaUMcQ+5K`-?Biv1h;Ot;JfSra%n=tdj$re;e9}XOSoTf8x8=4 ze#$|?1aaCdNyjfrP@{*w>zOAdrdke!tF-d~)9Rp7)&RdCv1TrMGA}>;Z<2puK_z z%s#=1?FU9I$_E4^`Jk|YR6iv6w1Bl{zXIW5<9oga3F27mIGgi3~~`P4$z4 zyMIdf7ZW=TbULv!K))mCHcS48uZgpa$eY>cgeGoEw^Y`&BM6R z#XT+vyjV_L1pHl$iIQMQl?4lI1sF6wsu@%ooO(^LlCw5C{VLfgOPV5fQVp!ev%WvLVoIR)&~Ic$^VKd~A3EC=ycPNnn&p7oGyfD30Oj z45};Gm+%a*lFSa1f%Sgu6oEdi7N!b>c9TXo7JKLLbq8hl5}B?m(Xp8w*?Y6%oPaKFb^1|#Dw_* z6(zirLG2%g(7QkrCr)@z@MGT>IDx|gfpQr>5De6Xf}irC;2JIxC}iOyfkGBO7TkwV zfUjNlI-r#%CM*Wpjj4KpsuY$09ZvmIpwoT%OdylPQlN)ZD=ZUu;}4$;-s20wHT|R8 zbb-Efgpa>maFN>u*JG1ld~^tI)MlVp=mh#GQ=v<+Jah{*Lg8DW-x%u=jO6ctocq!% z_$+v%(&R1WVmE!MgRmzHEA85w?7HINraz)q6_p3Fg(b_eg#In>2HEtxkqpt_5!1p+`{0QSm##KZI(B>Vs@K-M$maK=`(Q01#8d+V2dT^ zVg{84gTEvg+GU{8ZKweMb}Orbd0P{F{7XQK5p)@7wR~Oya&FXB!RFx_@W=6bJ%j2> z8;~2o`XU>36KLV*4B?g|tUq0wl=rtdMc{~z&t_2bTcF}|KocPqrwZhLoF-6|;`0J+Pkce3CdcVOD=8LV6nvJK z0RO9Ad>QB=#o{Z1Px~t17qG~m zYdN=WwnJR9w*==-w^_>>4|JQgobfP+OY+2ad|TjrjdKNRUz{hnx$_08QhY}!WLX&B z6%3H~1cE)jFYwwN7YHOw{6L@@#DxMm7C#io!njB<$UYLN7x80(9E+a_=4|B&4S_3nL%me8aBI2Fmk(reuM5?AmFHi$Iqbe+5?1Z^Yk#CQHs9!8F|~&|SrS zz(#j&Kk$t?cR-+Li3bJVXX7EDRX8ko(<4BS>v0t5b;XVW{TAutK+d2$Ao#1XrDIvsQ2k&oUzKs-FW2J{;XAjlZPp5|*m*DUd>t45MlrY`&=|&x zf{|PT^8ewIvf%Dlyu@R@3KV^~8ZhGHUjqCijq$Qzp}!&+{8t6D@>&L^jRybq49d;c zpc}wCQ|u9HxZzq68cRv8DEEf@I^<$IZ$KC@r?_gs0 z0l%gp(rs39X4C^l47nZ;0e^Ir=r$|%f$4EaP%YCF0`o{uW>8(h&ZVaWigbD!Xd%YZ zGXi0mCJS_|X$sKE!=+~h-U8Bd0zH13D$w?%X+Sqon4Sj)Skv@^;Im8zisXKJQJ~97 zF9~FJdO3qy6A_eN5h&y7Re|F*y(Vx(rx^mhLwX(fhKx#Y0PVCJX(rG~O-{3b9Mv+t zDLAqJcbm>^HbV*=4(To7t1PCH-DZKlC)sTl=r__FFQG9`ZwtJ?rnx}Tc$fzalc#Au zFyiCB1B@CV?+T=4dQWh--xmy!1%e^;K?bF-sVHe-29*Y~FntK*+^IzwRND-)kAUs& z!^c3;dwh~XZ3PuJ)d5YEskB(|S?UGSGA$8YpihAwbL=x9=S`OihR`y>Ap2bKre6RB ziea+bEYN?YFBviH#Fhgiywaq0V9fm3ltHDzFzgUasm;I;Jxl7$pz3dTr7ob2V=Q$G z93Sah!PM>n2He~4fUPv!sTU~HJfuEg*r4mrp!SW~FaWf>rdtG8eGus2Wh~`@PGfy5 z;8&}sA)v<<+a?%6-wX5#X*9W4qlN+BffLhMiB)ZMoYI=pVGrOd=nqDF80(#tr9|UjuBhY8v+6@$}(m!QT zY4jdHXHac%=Y9bOtd75OkJV=7Z$QrKum>m_mU}a(w3sjZ7}3LVn)Z7SOU?nHKpUJ6 za*qaQdPv}$Plvgr=-wUyMh*U>f^m8b81ooAoAGNny&+f}Zwl*p z+FOE=d|NOI?+7%P>8@bDObDh}5G;;S@XStv=l(sx-r>Grn$m5KujS_q>476WO&K;8WMC3TA)VccVr F{tLg)Cfxu4 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php new file mode 100644 index 0000000000000000000000000000000000000000..d7a217c9306874e5ef39c99ac566a70c695120c4 GIT binary patch literal 3779 zcmXZfMRXNO07l`#;o_P+F80 zr9WR2-E+B~VFJ5`|G1 zl|rRZX;d1OL1j=Bib7>kSyT>{Lj$7W{WG{DF)#*|N99okQ~^~)6;UNr2~|dwQ594L zRYg?;RSWKCwP05dcJ*M_2zHHN*9>;eVAl$Etzg#W;dj9;gTEiF%@5 zs2A#udZRw559*8hqJF3!>W})P0R!OuGq}?O;XpJ94MKy_U^D~`LGdUa4MjuIFfcdi1f`%9G#O1sQ_vJN6-`Cc&@?n1O-D1(3^WtXM6=K=G#kxEbI=?#7u}r;=gE0+ zzMKyi$OUkrTnHD*MR2iP4423yaH(7hm&s*txm*rc$Q5vnc^47bQFaI4%3x5;gAyW9?U$Q^K}+zEHdU2wPD4fn`B zaIf48_sM;5zuXTG$OG`8JO~fTL-4RX43Eeo@TfcrkI7^3xI7L|$P@6SJPA+9Q}DDr z4bR9k@T@!w&&hM}ygUyt$P4hIya+GJOYpM146n#5@T$BDugPohy1Wi=$Q$scya{i~ zTky8L4e!W1@IiRbejk$ddso`;J!!uWOZ$C9+V7*%ejk(e`?$2utI~d7llJ?%wBI+R{k|#f_bq9^ zZ%g}qN80bZ(th8Q_WQoH-w&kyekkqtBWb@MOZ)vq+V7{*em|4;`?<8=FQol`DedhllJ?&wBJ9Z{r)NK z_b+L`e@pxQN80bd(tiJwsr{CZ4TYkT5|UHKMZ$6Ac#g(~QWBFBA~C_+H1&g|gh)zK KV%YCuL;nN!8Z|Qj literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php new file mode 100644 index 0000000000000000000000000000000000000000..d60f6473addc9e2f2663c09326734ca5a91c2315 GIT binary patch literal 3780 zcmXZfb#xSG6vkmZFt|Gm5F!xV*=&Nly98O1g#6Yd7xqK;!c6gG@=dzu)%j0on*in{kN9KsM zopIS8G1GilSnu7%Gm6qY|hDDv3&>Qm7OvjY^|3s0=EL%A#_p94e2>qY9`3s)#D0N~jX5 zj4Gols0ylzsv;ZNs2ZwV~FnWa>tyZfxqtrfy>DCZ=v`>ZYb{ zX6k09Zf@%4rfy;C7N(AD$rLS-136GEibYQ3L~$q%#iMxC3bjJ5QESu&wLxuBThtD< zL+w#})B$xs9Z^Tr33Wo9QD@WzbwOQGSJVx4L)}q#)C2WEJyB283-v<1QE$`-^+A16 zU(^rvL;X>IGyn}i1JOV<2n|Am(O@(L4M9WEP?V4WpMRR29tMY@;b=G-fkvQ_Xe4qW z7aD~|p+uC3l28(IBR3k2Mx!xk3`$1HC1aBdfo7nYXeOG4W}!?J z$b_@S*>H|H2WE*`aIQEP&J*Xs`Qm)IKwJP9iVNW)aS>cBE{03QC2*;@6fP5&!R6v| zxI$b3SBfj)DsdHDEv|-Z#5HiOxE8Jx*TMDTdbmN{05^&o;U;kt+$?T}Tf{AJtGE?z z6Su+b;&!-0+yQrrJK-)E)Faz1>U#HxyE(j9JPh}V2jPD4EIa@M2jD?gtLzu>-AFVqyRR910 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php new file mode 100644 index 0000000000000000000000000000000000000000..d69220bff7d2555652dffb45b4e2223c11278da2 GIT binary patch literal 3746 zcmXxnRd7{T7{&48aB+7yK!`waC%Fmk?h@pZ1QG}#Tmgc+ySuwP2^CuE?)p;d?%uwX z?Em_n_WI47hcmPGIx{CRIVU5>=L>}c;mlMoDlHHWcz!Ps3WR2-E+B~VFJ5|u)wkPrD#X;d1OL1j=`R2G#(C9VnMhPeZC89*+M}Cxql29^AMqN-B)D?9_-B35w9d$=NP!H4-^+df; zFVq|LMtx8p)ED(d{ZK#DAN5BA&;T?L4Mc;`AT$^aMnljLG!zX*!_Y7^91TY!&Eh2l!da;Of(Z^qii$_%|baS2hB#aQ4j@D z2!&7>g;4}W&>S=e%|&z3JTwpGqFgi|%|{E+0<;hnj?SKJHtiTmJwaX&mD9)JhMgYb}e2p$#> z!z1DmcvL(JkHH6dD)_ir4WBTp;*(}|e9EknPn*^98MA6WYgW(a%qsf4SxsLstLlqp zb$!XKvM-y}_7$`0zG_zA*UT#Xx>=3iFst&LW_5nctkQ3r)%qQ?YR@yP_k6R8ziU?W zkD68eV`g>#xLM^tVOIP1%&PxMv-*F^e2n{W-+UZDZ9ajYF`vZGnor^9%%}15<}>&O z^I80&`5b=9d>+4SzJOmbU&ODPFX7kBm+|Z7EBFobRs5#;8h*=s9lve9f!{IT#P6DK z;rGn9@%!dG_ycnu{?MF{KQiCNADi#t2Xel?&!3pJ-%rij?`LN1_j9xM`-NHi{nD)c zer48vzcy>X-KRaB+9IK!`waXR`_J?h<5477_>{tN=k5cXxLvZpEc7H(P@ise7Bc zJJcze_uo(V{GKy&Gc)&`$+K|@87Uc-F+$cB7gYuxfC@;!~@}c}FKPrF#ni^`#Ls5~lSnns1B-w>Y}Z1mzfl)(KpAAji$i$6I+}Om8P29x9O-$U>#7#}y%*4%1+}y;?P29r7 zElk|f#4SzS%EYZq9Mzgtv_>xELUAY#xse;iqj;2n5>Ok|2DL?PQ9INQwMXqy2h;&| zL>*Bl)CqM)olzIm1$9MTQ8&~Lbw}M%57YzoL_JY2)C=`Sy-^?32lYjLQ9slV^+)~D z05kv%L<7+vGzbkwgV7K)1Pw()(J(X&4M)RKVj_I}G&MZ}jzA;PNHhwKLZi`WKZ_N=4(*cr*b`KxrrqO+*t>I!Z^A&?J$5Pyhu{5KTc-&{Q-PO+(XACdx$9(R4He%|J8JOf(D4LbK6qGzZN=A#^hY z=ZbUTJaHbJFV2Sx#07AnxDYN97s18iVz@+H0+)(Q;WBX9dM_( z6Ydgs!QJ9+xJTRr_rmOuCht>vAL;$#et1AU01y5@S%2z~(uYVN77xQGp`#riQT7Pg zqcE(~I;QL~vd6{a@Pv2*o)k~QQ_xYNomTcV*)!r9cvd_M&xz;YQ!qQEqdu?ndD0ie z3-F?N5nh7MC3soc%kT;es~)Z@dzI`p@fy4?UWYft8}Mo9=-i)yS!%;)MV-z~Q4Q{h zI;W&vgwc(4Js}_CEb3ri5s$LpJEG3& zE)1)r?}@sU?u**OtI$ykzox9#{JOGg;WtDr@=Z~n>@Cez>AWrKs(eRO3%@IB3-3Wk zb@jfo+R+E1KKF+jtQP(VW@$$si>El8Y*EYjMAS9=DRk7qpNR*V`?&_|7WzWeS$!$$ zUj0gQ)xclF@D*P5jRxziz7=(md?%_?z8BT)KZq*+A7OYeZ~jSCiT*6AfPaCG8u(Xb zwdUWHRsTK^Rb~%Gt?GBp)vNvx^}p{=QFroRqPFlibhL$klokIK)xVEmb|~lEV_cRM l;q&@~X#v|E$xl+36-@Vg1JUO9Y0dzjHxTrt+ZyMx{sU@pHv<3w literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php new file mode 100644 index 0000000000000000000000000000000000000000..65a48ee397f58fc7835c9f5007dd118001523bba GIT binary patch literal 3801 zcmXxnb#zln7{=knA-FqSpj4o^lcvSpU5bP@&_XFC0u*<5cXwSpX<^wd&APkqcHP~L zZRhvizwY;(Z|2@PGxO%0#3f{;WH=l?zuTXhWJM&q{cg);xxHR@rWNh5tf+^gELVKN zBep<=P$5(p6-Gr+5mXcvMa57tR2&sYB~S@e5|u=yP$}d<4pbVIMrBYLR2G#*z3-w05Q6JO?^+kPAKhzKPNBz+NGyn}m1JNKf2n|Mq(GWBQ4MjuIFfYlhI`4Ms73( zO+iU02_>Us9Knu}Avv2Dgjb;SO;J+$rvayTn~^x40Yb5%<8o;$FB<+z0oI`{4oc06ZujgongK z@UVCo9ubegqvBC`4CV!OqQ`CPNKa_^35K79xjKhaqR!#8Jz4EDntX=IXVuQq-8!fC zIojv#ww7{14(ja}7iwJTR`Yg?}2Ty4vB@ffpjXmm&` zziC^sxP^0WG5ogO*3k#$EDaCYecgpDyRS{pw)_tW1?1*BWm04i&{&rs85AOed%#gnSMf4rk@m*>8C_x`e{*@=lRl`YAe)li3;`G zqC)+Ss8GKvD%9_Z3ibOitQ+=$y1Km|in=d(qK^L~@i>e8SX87x5l_ zMJ4(R@hsghMFsjRQJeF%c!9y+h!^3vqSE}Gs5E~sUSaSLFnkmKsP0wxlc?W`pGAe| z7g3kvS5dF}P1HXB4)a1<^dD;LSLIJJ#E1V9v*6!iHvC7t1OFB8!vA3SHhiG&y?n+v n9gYaE#}`QRTdqj{q&gjebf3o`ZT_(q4DfpV0dKmcaZbno0Z>I1 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php new file mode 100644 index 0000000000000000000000000000000000000000..42e50e0fd412fe7dae7061749d94bb216f38235b GIT binary patch literal 3780 zcmXZfWpGnz7(n60A-FpPD73h1DemrW1&UKj1$TFMcXxMoVOe)~Vcp%8-gAECedfJ4 zH$XqloRDdxlk^Y z8|6lMP#%;Q7!^iEP!UuV6-C8RF;pBCM+tFbb7N=dtzfPl%(a8LPB7OA=DNXLH<;@M zbG=}$AI$ZGIkEwtq5+CV(WoJ6h+XIckAgpq8j5 zYK2;%)~GdVgW90Bs4Z%T+M)KSJ?eluppK{`>V!I>&Zsl$g1Vrts4MD*x}olVIqK6nkz^guWe4MKy^U^EyFK|@e1ibX@w zP&5n;L&MQ<6o=x_2s8qXL?h8CGzyJIqtO^N28~5y(Ks{?jYs2AJc>sX&;*o#63|36 z5hbETl!TH{GD=1%CoTWBp1QOaxq*Ym%ycRDO@I(!R2x}Tp?G$m2xFqC0D`K zay48d*TA)MEnFwp!S!-I+#ol=jdCO0Bsam$ax>f_x4^A(E8Hfx!R>N8+#z?sopLAK zC3nHyayQ%~_rSe!FWe{h!ToYSJOJ;{JAn_nJ_rxNd%pEyw};staqE+gx;@JFm^=oL z%j58b^tmVHNw%ltDR^3*hG*m%cvhZ;=j1tfUY>^+;JushqT7q`lDq^j%ggYJ_uhh6 z-Cl*)llNX~1`-0Y54Y_?|T2$D{#2 zE)DnzX~0iP1Aa;x@YB+OpOFUqtTf=~qyaxK4fq9Vz%NPzeo6XGzAXJFUy%mjFAex3X}}-L100o4 zr2T#>53&7B+VAJ`2-`2D{eCI!_bX|?UrYP_M%wSU(tf{__WQlG-yfv?{wVGDCuzSw z%L{zwU!?v1D(&|-X}`ZqEBiy*@1N3s|C09mx4gk~|B?QT{44!s_)n(xTRu7zib#x0 lN*R|Njw#3g(dbZ0d{SI;RPg6C^@7B>6+(qjVN@6uK}AqeR1_6M#gK(8R2&sYB~S@e5|u=yP$^Uz zl}2Sy8B`XPMdeUAR34Q_6;K6K5miK$P$g6uRYp}%6;u^fMb%I>R2@}EHBb#y6V*hu zP%Ts&)kZe5Q5{qV)kSqtJyZ{cp)gb*)kond9K}b#+^6Z0NEnHtP!wu_8lZ-#A&N%P zs1a&}8l%Rj32I{0)bwXl6E`z)GZQyAadQ*5FmVeLw={7}6Sp#PD-*XiacdK|F>xCc zw>5EF6Sp&QI}=B==UcQ#F62TnC*Bl)CqM)olzIm1$9MT zQ8&~Lbw}M%57YzoL_JY2)C=`Sy-^?32lYjLQ9slV^+)~D05kv%L<7+vGzbkwgV7K) z1Pw()(J(X&4M)S#2s8qXL?h8CGzyJIqfvZ3%zc`k9s|dqv1lwBhsL4tXgu;D51N1` zpahhF5>X=ZA}^YVCZb7b5=ufzC>bTA$!Ic~f~KGpl!B(BsVEhtqG@OvN<(RAI+~7r z$cOyMj{+!wf+&b)pc!Z;nu%tiStuQ)quFRSnuF$`xo9q$hvuRAXg*qi7N882l>rxu z3t^_12^Wcr;9_wxTp})kOU0#dnYaut7nj2o;tIG@TnSf+tKe#JHC!XEfosLJaGkgg zt{2zC4dMp4QQQbOiJRbNaWmW^Zh>3Ht#F&T4Q>~=!yV!dxKrE-cZs{;ZgDr)l6T)={dDDSH4OSN1qO z0Ylo4lggeXdrE7s!_&&1hG&$$0ndsz;W-tbgXhKb@B(zyI~TQ94Sq?yP4Q)zlcBA? zg0rrWzA9dY*R=Q!ybc|;gM=f)Brye&#?B9cozNu9o@-4!fdtZPb$7Z@z3H#_=|W6 z{;IWl)o;pbet%b1XY_}to8nIu>kj%$)TQ&csQLXz)JXmd9reb4Fr*K9tm3=5Uoy&N mSz$h}KbR7*-QoNrby>kwzc&zR{+{L)_`HFjFV$9^%laSmz%=>* literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php new file mode 100644 index 0000000000000000000000000000000000000000..5f23f515c40cad0483fe085c94b215b720765e7d GIT binary patch literal 3779 zcmXZfb$Aq46o&Cqd~tVJAduj$A-KD{1qe=n2=4Cgt_4c5LUCwIl3MES?(S}6-uJIP zzvnx5_s+~clPAquOdCHf6iQ5rO`0$|95E&~DK;Dvj!j62ogIz}g~O5eM22IUXM9x8 zP$rZK-HYx;nNenx1!X~5QC5@{Ltzv~Q?Vzp`)OCWoZcx_^>Uu$4FR1GWb^V}j5Y!EVx?xZ^4C+Qf z-6*IV2X*71ZW7c@f;zG(yJ(7{Q8a3XnxPmJgPNn}s0C_)TB4Sy6>5cAqt>VmYJ=LM zwx}IyhuWj|r~~SNI--uK6Y7LIqt2)c>VmqWuBaR8hPtEfs0ZqSdZM1F7wUz2qu!_w z>Vx{CzNjDShx()bXaE|32BLvz5E_IAqrqqh8iIxng?B%LGd&CrL&MQBs3XKMpMuf6p!N3R5TS$ zL(|Z7G#w?N1eAypQ4&f*$tW4kKr_%xG!xB2v(Rib8_hv;&|EYZ%|r9hd^8^|Knu`9 zv=A*qcNW3Laxq*Ym%ycRDO@I(!R2x}Tp?G$m2xFqC0D`Kay48d*TA)MEnFwp!S!-I z+#ol=jdCO0Bsam$ax>f_x4^A(E8Hfx!R>N8+#z?sopLAKC3nHyayQ%~_rSe!FWe{h z!ToYSJRlFigYqCeBoD#EFx5wP1g5*IqcF{o$8uZ^*Meg*R>XirzBy5Wa2d z{JtZ7zVF(6gs*zf)T8pgsV|uiOg&d0O4oh_Q@tA>n>tpXn0m}UmENn*Y(Bv@J~#ED zd|`Tu^h;A;UtgJ?CjHvfN%_Xq`TbUU>%Ozu_w)DC7xE7<%_I7w^smNGFy$h@`?GX@ zf3exG`qlI@&A-Vj@OPWNqCez0(m!qX*8OFAf%I=vNAe%(3+i8+kJ9`fOwahCD$$`( oL_%C*^5mp&OlAHZjSeNpC&nd31^=67G$h0&B`3s(?TZfm53l_*NB{r; literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php new file mode 100644 index 0000000000000000000000000000000000000000..b31bb83f400bd1597d5e5b1024755c27ae92eb04 GIT binary patch literal 3674 zcmXZfb#PQy7{=k^aB+9IK!`waXR`_J?h<5477_>{tN_8?-QC^Y8ECo-EurlcT4-?? zTBty$1})Uc`MrPL@0ssAchBB?-ksT~n3RMR%kuhMzQi~?B;Mt7*-qQ#@wig$aLcyC zJ_xg&(HWP>3}r%@P-c`FWkFd`R+JTGL)lPvlpW7!^iEP!UuV6-C8RF;pBCMeui1yli5L={mbR0)Nk5L6jeMxiJa#fHK6S93zlfPsT-KOp{X01x{;|HnL4a7yJ(CY$bq6z6mlXbibl~W2F0Kzs0nI{nxbZ?8ETH2 zqZX(IYKdB+R;U$fjas8Ns10h1+M;%-9cqu-qYkJ8>WDg`PN);=j5?z(s0-?fx}t8V z8|sd_qaLUS>WO-yUZ@x9je4U#s1NFk`l5cQAL@_#qu5yZ{%X$j05|{*L<7+vGzbkw zgOLll&=52P#i2M9kK&OVxzSKG6b(bePy$Loi6{{bN5jzwGy)}|Bs3C@M9C-_jY6YP z3Q9qv(P-pB9^^${B>M}9O0jX`74STqieL#ZegjYs3r1T+CnL=({@Gzm>clhG73 z1x-b1Q{gmm8k{aphcm<(aHcpD&Jt(A+2U+CN1OxaigV#SaUPs6&W8)c1#qFb5H1oI z!NuZYxI|n6mx@c_GI1GPE-r^F#1(L*xDu`sSHacdYPd#R1J{ac;W}|0TraMN8^jH8 zqqq@n5;wuk;%2x-+yb|XTj4es*bTSCbnR+~hIi22Dei>3wN~7t?jE{(#l3K!hL6Ji zFsMx)P**%Co@DqCOgjXRXzc}fR9)TqnAU0=$JIT~@Coq*JSpmfPKl@Jo`!*4@Qk`= z;92o3Jg4Df@H`Cav0qSEyeR5}F2S@*ti7zY7vUB7ks|q_s7R)Xiex}k27@r5;9M1z zvTGVv20s?n{X|p-uZy}>x~L4^5S77CMP=|aQ5pPPR0h8g6}p?ELU&74=)M#cy02hB z=lQm}3f&!1q5E3H3eGp`Ds*>6h3=lH(A^ic_5lnYKnZj6}ngAVTOMekHB9< z9sXZMh3+>|q5EA_=>C8KJ&o7up61SPM1}584ePh=FLlo`{8l^<---I6_*+!0{((V# z!GA^F`9GMRaW*0xmKEZ0d;Lj1+ZoEgM2F>1_PTxH<}YK$fXD6gdy;LOG`?#EPucgNKUZB5zs)Q<|%BTve zf~umb$VN7*hN_|Js5+{FYM?L_hH9dkC>({O_z3vy)67UDj6_i=3e`fjP;FEjMWbj` z2h~A!QC(CI)ibJZ=Ci(u8<@C(i5r@@p@|!rxRHq)o4B!wo0zzXiJO|ZsfnAJxS5HY zo4C1&TbQ_oi6dHaik8TQTqp*`AUATOSQLxmP#kK7TA|jcHEM&}pth(jYKPjP_NYDT zfI6U#s3YoxI-$;}GwOo6psuJZ>V~?Z?x;KJfqI~xs3+=$dZFH^H|m4>puVUt>WBKF z{-{41fCiv}XdoJd2BE=dFdBk}prL3eijRlSKFv%IgTv5pG#rgUBhW}R5_ymZjY6YP z0!l!MC=q#)7mY@v(HJxaC7~pgjFQnS>){4*1KcQXgqy@oaI?4>ZV|V@t>RX=P22{zi`(H2aR=Nf z?u5IcY*Jf-X@cv?IS&%lso@+{2KjXeh)J)`sLJx}ii^&Wv2#q01A z%+fqxRJ1fNr1wpjsr`LR)c(FL>QwKDnvHiwUD12cIm15so4 zp{V`+NWEH(k40VJCo0zdehNc+pr0wLxq2XKaUP1AtItL4?-$|$&itjQE&B?Fv`1fy zdMMwhSiA78vU+`er|dDl`Fmw`>wZvH`};`LAU#&GdVdu4LjDOl8p5ANo$41AU*dOv zg_+vl-^2@Ke-||je~9Y+Q`G+c1)X#B{;lj)_>ZVp-@l^X4F9QD_v(L97x)BbW#76e nmt}?dy#8QHz;=i8chqGCQ~lmRr1@`}UEuQug1%H+buQ~EguyeV literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php new file mode 100644 index 0000000000000000000000000000000000000000..fd038823053f32e5358a44934fe6fa62c5d43f67 GIT binary patch literal 3780 zcmXZfWpES;07T)#VR3g@Aduj$A-KD{1qe=n2=4Cg?(Xi~<=o-ig>!dTGVlGG{%WSS zcDJXeY8p14IBH@jl$aEoG8PkQ3+H6l|&^` z7==+OR0@?wrBNAF21TF z1yw;+QPn`zg8Q>tkgEr|dXQ@bxkiv{2DxUCYX!MhkZT9Ic981?xlWMl2DxsK>jk-9 zkn0Dzevl&@@GTmkXcUbaqJ}62#h^y05o(MYqb8^cYKoeoW~dozj+&zus0C_?TB25{ z6>5!Iqc*4wYKz*UcBma{kJ_USr~~SVI-*Xf6Y7jQqb{fm>WaFeZm1jTj=G~Bs0Zqa zdZJ#a7wV0Aqduq)>WliKeyAVnkNTql1K@*Wa8D0}1JNKf2n|Mq(GWBQ#iCd=6b(hg z&@eO{4M%Y(4vjz~&`2~AjY6Z)Xfzs)L1WNZG!~6Rt@0GyzRO6VXI82~9!? zC;=s+M3jV*P%=tJlhI@}1x-Oy(Nr`IO+(YsbTk9aKr_)yGz-l_v(aoc2hBlqQOaC6 zPtJq$<$Sn6E`ST=LbymSf{W#1xI`|2OXX6yOfG}V<#M<}u7E4$O1Mg{f~)0fxJIsl zYvo$FPOgLN<$Ab5Zh#x*Mz~3Cf}7=LxJ7P(Tjf@`O>TqR<#xD3?tnYxPPj|%g1hBz zxJT}Rd*xoZ58k!k{nCC9Nc%k~?e~zh-^0>=k4XDHD(&}}wBO^>eosjIJt^(?6ihkA zPdM#a`#mG=_pG$vbJBj#OZ&Yb?f0Uz-%HYdFH8HqBJKC8wBKveey>aWy&>)QrnKK% z(tdAC`@JLW_hD(jkH~%eS1EEod{iEQkI94Zad`+nArHeR$@B1Kc>%s6FTz*lCHR`W3}2U5;2ZKPd{bV7 zZ^`TMZFvK}BX7cYExt^S9Fdeka}U_wfEgXZC}q9q^CR0skZ&@Xyi#{~{gm zuhLKcO*-J;r33y$I^aL01O7`o;J>8<{s*Qwm47|!fd7-J11=vO3PmKuB_@wc3dfY= deKb0h9G@7M6cxOjre2T`mz10kANIQF(EqUyHw^#) literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php new file mode 100644 index 0000000000000000000000000000000000000000..ed6f72f362f7e68ceb8f5964cc783aa0e198283f GIT binary patch literal 3104 zcmXZe)l*eb9K~@PJ$8$ER3sD=`*Oj=E-X-tD_jLd#2YGhw_taR-CYlk-Q7Of-G70y zzw2qQ&;0hBn!RRDWORCRx@CENE?-Kb9hBtqxooHH@_1YscBp0BA-O_qXH?D-o}=6- zH_C(Zpu8wA%7^ly{3t&vfC``h6o3k%f~XKGge+vC!l*DRf{LJ`s3Zm%Zfoh8$jq0E}C>({Ox~MLy zhw7pFsJ>AHb3PlG+|cBPCO0ya-t{{g`!b3YK2;%)~GdVgW90Bs4Z%T+M)KSJ&Hjwr~~SN zI--uK6Y7LIqt2)c>VmqWuBaR8hPtEfs0ZqSdZM1F7wUy#Q7r0>dZRw559*8hqJF3! z>W})PI24ECQ9K%e2B3jxAWBGp|5tOS2f;yTFdB@8pdn}|8j4)Vg@&PFC=n&1B$R~Q z$c=`h;b;UJfs#=&NV+{Wfh;&ymh+ySqMy6;tSC(~=hA|p{rxDazn?_)_p_+}ei7B* zucG?q}kf%u>JuP5rh^1 literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php new file mode 100644 index 0000000000000000000000000000000000000000..cf723ac686da214bb81f7ec12f1a1e039af4acf1 GIT binary patch literal 3692 zcmXxnb#N6|7(nsj@Njo{Kp??gLvVL@3lN+Tk{4WpySqbakpjitTIvSv)V-zd?lL8N zPXF5PH+T2V&d#}W=QVAfG%hI=N{Pfr#*Yd|jgF7RhvUNW$;t6E!!e<7IQqWma9p$W zOSN=mKp9X*lo4e@nNVhw8D&9PP*#)`WkcCec9b3EKsitdg-}kE6Xim=P;QhPWR2-E+B~VFJ5|u)wP-#>e zl|f}tSyUEF({rl={3Lvg4XYKEGl=BNc~fm))Ls1<63TBFve z4QhkhqPD0VYKPjR_NW8ufI6a%s1xdhI-}003+jTpqOPbL>V~?b?x+XqfqJ5zs2A#m zdZXT`59)*ZqQ0mf>WBKH{%8OifCi$0Xb>8N2BX1f$Pjq%8Z!(G)ZV zC7~oV6-`CSC>f=o6cj-bl!{W(G&BuON7K;^Gy}~nc^47bQFaI4%3x5;gAyW9?U$Q^K}+zEHdU2wPD z4fn`BaIf48_sM;5zuXTGz`JR_$Nm4?7dhzd2f6)_JOmHR!|;ea0*}h0@R&RXkIUom zgggOH!nHUUJneFH5t$BF*xu z&tB!(Yp$B*byu&mdc#$-yeZA{5owl>O0&Er&GIp6mXAxbd_wvqpOj|#lr+nyr8zt! zt>IZ|md{DEd|sO63(_oaOS8Nq&GJQQmM_Tze5;qG6}}=LVD(k`Abd^Q=G>>tt%`=@ln{v|y}{+4dof28NgzcPKpR*nsYqLLF*QYS^i gah3Sr7#m7WOi75u1b-saZ%9svq$VeZy)QQOA7qLkyZ`_I literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php new file mode 100644 index 0000000000000000000000000000000000000000..c978731a429f57aa8383c20fd27a66ddd4519af6 GIT binary patch literal 3242 zcmXxn)l(H=0ETf3W5vKiu~tDsF)%O=2NVlCutntvM?nGcgo*_gb_aGBcDG*WAK|5n z-JLT!%J;lp?faW=XU>_OXLe@e5^^(gEz9e3`7+b&uymKtWjk$`$K%SgBQ4vGC=+2j z<4Z5mr7DZcqH?GlDv!#e3aA1KKmn*Cs)#C~N~kibjH;k2$U+vXimIYO6o{&!YN$G@ zj%uJ9s3xk3f>02ug=(SNs5YvD>Y%!)E~pZAIo0cwCkPzY*>8lpz15o(MY zqb8^cYKod78`-ECYKEGl<|q_}qA(POTA&sv9EGEl2>9=68i|CFC<;ZPmZ&9ag<7F# z6pdP=)~F3?gW96DM(s?W?aYobJI3txX16!HgV`O-?r3&LvpbpH$?RCOW6kbtc4xD@ znBB$fu4Z>NJE9x^q8oA`2Z}>+$cdaN9>t>slz_UU?x+Xqff7+7>WO-yUZ@x9je4U# zs1NFk`l2M1g!-X=s6XnD2A~0GAR34Up+RUc8jOaZA!sNXiiV+KXgC^qDg2HN=2#2gyP# z;6`yH+$3&-o5js=i?{`D6}Q4|;xDeI@U(au zo)OQ$v*KBJPCN(Ci|645@dCUkUWAv#OYpLI8D0^uz^md_cul+puZ!2=4R}vC-_+?% zPH%~~;BE0Xyd&O$4`4}wp4~%yUj;uBRd9)@f**@2_=%{3pNcB@nW%!Fi~8Lcq6&T~ zs^C|m3VtoB;5VWQek-crccKb@FRI`Vq6+>f9^mPG5*74kQ9*wZ74%n8L4Ok!^mkD~ z{}2`QPfN0qe#4Riy><%3)by9=F$@<+GjPe04Z1e~#Dfi!`4gr8juo MKEEf&)_o4^FR)&yX8-^I literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php new file mode 100644 index 0000000000000000000000000000000000000000..2a3e36a486511cdabe21a6bd873b37694f642d57 GIT binary patch literal 3779 zcmXZfW0)3u0EY3C>&v(^2Bk%5 zQ96_krAO&e29yD1L>W;glnG@K9mpTNBL0!Q~(u31yLbX2o*+!Q4v%G6-7l+F;ol{N5xSIR05SmB~ciK zQ7Kdkl}4pe8B_*Epa@hJl||)HIW!;=KDY*FBnn2M@~AwjfGVJhs3NL_Dxu1#GOB{A zpsJ{9plZSStQPF*!LAD|J?7G3O8|-?)t{3e3 z!LA?d$OgPc0~C#-QA5-a#h@6}2sJ{DQDf8uH9<{LQ`8JKL(Nfh)B?3YEm2F<3bjJ5 zQESu&wLxuBThtDIG++RHa1GA%KsXQ$LW9s?G#Cv*Lr^S=MMKe0Gz<+x z!_jaQhvLu(Gy;u8Bhe@{3XMji(HJxajYVV8I5ZB8N8?dEiboUB1T+y%M3c}YlzcequdBL$xU#x+zhwKEpV&c3b)B^aJ$?NcgP)Zr`!p5$z5=_+zt20 zJ#eqw3-`%=aKGFS56A=Xpgaf<$wTn4JPeP>Bk-s^3XjQS@VGn_?>%Y1DbjxLOZ$CP+V5l1ejk_i`-HULC#C&9CGGcV zX}`}%`+Zj0?{m_ApNA=)_7}Wszb{JreM#Ey%hG;dk@owlwBOgH{k|^k_YG;kZ%X@p zOWN<-(th88DIU>x;eEg8Js-B;_oe-QAno@>7`~6wk?=RARf0g$8o3!8G zrTzXP?e|Ye|u?ripySuw~bvt3Z!|m=4SMK*c zfBnwqIcJ#5{oVII&qTIQicj)*k^{a#LX0;k))(-3qr5)9-L3vSLln>=Y`B8pU02M$5Q9)D)6+(qkVN?VaK_28mMNv^y3>8DgQE^lPl|Us? zNmL4zLZwk@R0fqnWl>pF4wXaYQF&AWRX`O{MN|n@LX}ZvR0UN*RZ&$`4OK(cQFT-U z)j%~-P2@#hR14KYwNY(U2h~AACbx|-1M$sYg;nSUwP#B8BP#CI*>Y@6mJ_<+S zr~zt#8lr}%5o+Yr*qzVDu5RM$Ca!Mk>ZY!4=IUmyZtm*lu5RJ#7OrmT>Xxo<VmqW zuBaR8hPtEfs0ZqSdZM1F7wUz2qu!_w>Vx{CzNjDShx()bXaE|32BLvz5E_IAqrqqh z8iIzRp=cNyhK8fzXapL8Mxv2u6dHv_qtPfj8a{lwGd%{5L1WQaG!BhJS=u%|-LjJTxE8M+?vbv=A*sY3P1N z8eU{xj2D~J@e=a}ywse5mzlTX<>sAuh4~;}X+DWpnJ?ni=9_qpoTc@qo0rmGYhH=h znYI4)X03mNc_Z^1&71Hh^JctRPTz|&tS@KEE4R_lGH=IQm1z`&(Xc7;pOmgbrsPk#7lIa)UX2il)4w_KCSLD_>8(&;j`j3_?&nhJ}=&Y zFNnGsUKDT9eM!6xv&B0w2j;AYFNL`99D#)LT%JFBS z&h_V_ZhU!tzKzePp*AMq56{8v;${}Xi|JP>o^9v0#8 n1o`8VQ>F&IQNjF-jqs!-CdUOr-EZ350e@T|#h>WaT!iO;WL94R literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php new file mode 100644 index 0000000000000000000000000000000000000000..dbbf96be1470ea7d188775080050f13815ddba11 GIT binary patch literal 3827 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 nSyqJ4>kp;{Y|1AN{<(3fs&oXh$jw@N_P literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php new file mode 100644 index 0000000000000000000000000000000000000000..ba6d203dcabee1831ae4ceaf3a3037340ffe7d3c GIT binary patch literal 3721 zcmXxnb#xS09L4eCFt|Gm5F!xV*=&Nly98O1g#0v` z0rI|g{+jzazj>3*&b#lNjfzQ0NUK9mpTNBL0!Q~+7XLIqJlR0tJ9g;8Nt1QkI= zQBhP36+^{Qaa018KqXO0R0@?srBP{A29-f&QCU z1yw;+QB`Ck8&yNqP<2!t)j%~+2nsS$sCCybwk}ychnvAKs``T)D!hWy-;t|8}&hbP+!y+^+Wwo zf7BlhKm*V~G!P9!gV10!7!5%~&`>lK#m2&CSF@*w!C`1P8jePw5ojbDi9E=IMxjwC z4#lB(6py^fi$Nt4M2ToD8jHrEaVQBTq48)uN=C_O0-AtQPzsueCL$m5 zAwTk?01BWW3ZhA95}J%AqbX<#N=2z?Dw>L>p=oG3nvQ0m8E7V&iDsc$C=ESMKZ4Wc zv`u&pzOxEuIOA=2uH$`pp5q;OzT=&E0nVBS7dqn;coELj>c!6ZBI6|*>%%M)uQFZf z+`R#>a=a0*cDx0zal93;b-W9&bG#a_cf1B~z*&0SMvXJHd=t*pf4J45NFSGWFcm-Y+wK=bedcW7j>)d<;-cExz#o6$dm=14?bKvu02Fw)a!aJf0 z_kuW|>5Jk5_>#B~-W3;%!j}#5Z-QO2=czhu0T>Mbn&f1Se_4i{@ z{e3K|zn_Te@28^r`hF)D`umfp{{AegzrTp;@2{fz`eFG?=yeR^EtnH=gggX-Z|$+#iS&pSe8HF2_(kZA@QDo$9CHupU;zOhg-HC z_EMPbj?O+rW-ABEfpVgpC>P3wa--ZR56Xk`qP!>{%7^l!{HOpbfGlL8f~X)WgbJa; zs4yymilCyXC@O}Eq2j1GDuGI%lBgsqg-W5)s5B~r%Am5SEGmb}q4KCas(>n>il`#0 zgesxRs4}X8s-UW#2DL$LQCrjw zwL|Sud(;7SKpjy>)CqM$ol$4h1$9APQCHLrbwk}zchm#*Ks`}U)C=`Oy-{z}2lYXH zQD4*#^+Wwpe>4CMKm*Z0GzbksgVA6#1Pwt$(NGi{3tt>fr-#8|XgC^QNXgo?r$!G$afKpHj znusPMAMznT@}mF>pdbpONoW$9j3%QgXbMV2sc0&iil(7yXgZpXW}q2pCYp(6p;;&m zWu@=J>2lgzcs9PY1ZFtnxA7duTku@R>+n3s>+yWY`|v`?$MIsvZ{j76SK+0O*WhK2 z*W%@lH{cbHm*SO_$;6d>qJOnc{ z;9*S?2gJQ3d`+JjU85qCR9#MSVxU z6;2ooA!$!C)E5zsZ2a^J}JCuKDE-RSq_Xfhv S-?i)$eBMCNmu%}im-Rn3-~){S literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php new file mode 100644 index 0000000000000000000000000000000000000000..1cfadcf2b45b964117e92888b6cd54a1c501f1bb GIT binary patch literal 3691 zcmXxnb#&BN9L4d)A-FpPC>1E~OsB=&U5X6tKntam5uj+d6lZr2?(XjHFvCh$VBLjv zcQ@$!-u#vOIlsI#Y2M8_6PJ*Yl3`i?fG3ceWJe@>0v_9Kdwf1mrX6kBcGP20wmUxW z5SyobC?Cp?@}mN%04j(IqC%(;DvS!FBB%%|ii)CQs2H-4g^Hu%s01p3N}`ge6e@*E zqtd7hDuc?RvZx#?hsvY!r~;~hDx!+05~_qMqspiXs)DMbs;C;OhN`3Ls0ONmYNDE` z7OI76quR(uHmZZ_pt`6os)y>K2o!Z%NHmN_F(?K#Kn+ks)DXp@ zSkwqLLXA;l)C4s#YHIdpQ^g~=^UZfSB$lUteG%H-B2w>G(r$!$z- zYjRtY+nLsNC;@dq9Z*Nq5p_bHP-oN`bwOQFSJV}C zL)}n!)E)IeJy1{76ZJy9P;b;5^+A15U(^@%L;X;H)E^B%1JFP;5Dh|u&|owe4M9WD zP&5<`L&MN;G#rgUBhW}R5{*Km&}cLoB__g0N3*BLz%ghn8jHrEacDdmk37hOCZGu@ z2_>Oql#IN{izcFpXcC%)Qcwy?MX6{qnvABPDJTu4p{ZypN=NBv8k&YOPzIWgrXwHn zAwTk?01BWW3ZfZk2AYXxqFHDb%0!uHHkys*pgCwRnv3S4d1yYGj~1W>C<{HvK8myD ztj%~KzPlRcIOFYjk>mY%vE!Y1iQ`>(Db8ICmpS8;csUMh^$KTviSbH}bu+7+@kYk0 z9dE*G9B;*I9dE0Po)%BTGvXO|Ry+&OiRa*X@jSdBUVs-x{o5~z+F+MOy|OFf z71mxAufl8MHF#aT4sVDz;7xcZ3*HhRhquLSct>0aLt+jLi;Li0QI&dHT*CAjaVdOO zTn3*Lm&06f1$(q!k5IS;5``9cjCULtC+qls>rX1s>Z9LYWJGBj){*X2Kc6^Pr_TGz6fuN`nbI#Zei`aqWb+F3~7tL55sz*4|MVl)_y3ezaNR}?*mc& z{a93gKM~d6Pet|jGg1BhTvUI*5Y^u=MfLY9QT_c|RDZt_)!%PL_4hkb{rz54e}8}> zJ^qiHs=q&p>hI5@`umHh{{AYezrTs<@9(1e`-iCh{wb=ze~Iev-=g~akEs6s3q!i+ z|6o{8^uJEd>u-$9vLbw5e=sdzyCeD8=(2+8es3V!{D#as!RHMGed)H&b6F1ozXvC= literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php new file mode 100644 index 0000000000000000000000000000000000000000..f73cbb6ffd844dcc04e7ec63775f611166299b26 GIT binary patch literal 3454 zcmXxnWpGqi7{>A9aB+9Ife?Y<&Snz=!QCy$k}M<;LRbNUh7f2OW^k7lcXzk6v`lEx zLO-^tA}zE~fthxiod0t_-RC#&Id}Ixd+$55(Xr{t>6YaWcmgSjc4(3(;IZAd$LI58 z*b$a(hkp=myJHG2Q3Wc53ZcTNFe-wIprWWKDu#-o;;1+(fl8o~s3an7^Dvv6l3aBEgh$^8YzHPE~<;_p?au3s*h}BqYxB=8lVQKA!>+1Q7CGJ8lf;0h7!VI{?$Aq5ikNp zqDa&jHAYQP6BLD_P*cS*+8AJhl+MSW2})DQJX{m}q401ZR~(I7Mk z4Mu~}5Hti0MMKdrGz<+#!_f#d0*yo?(I_+ujYgx<7&HbYB*6Tud8Wt0v1l9`hsLAv zXabsmJjjD4qKPOGC88vhguKX$CZS1aGMbE%Q8G$FDQF6sf~KOWC>5omX=oZsLuqI_ znvT*@I+}rIARqD}Kk}mh3ZNhgqM2wWnuTVe*=RP(KpAKbnuF$|xo94mhvuXCXaQP) z7NUhH6Xj(c!C7+V7Q7hWUIVk8^2d0I<9&Fk;~n@z$2;*yICm*r=9Ew1<&H1n)s8pe zHI6sqwT`#pb&j{=^^SMp4UX61jgHshO*mJ#+pKc7wr_QoUt;+Vd`r#l6xHi4QJZ&* zyV<)3=4BnidsW^G_lY{!{o;PA2gC#Lpm-1-f;k)EVO0;qBcgurqvBDj$HZgsxOg0% z5cPAN6i-q;C7yz(#nbSNcm|#o&%$%!Ie1h zOHmDeC91)Dq8hvppJvkU191_2C}zP&;$rw%)Zu(B>TsTjI-IAX4(A(Dhx4ttiaUQN zu7-J{X3+Pd-r*lay~00=>)HF0xB>nw>ecu~)OdL&YPviZH40ydTe;OsQM2M#QIqF4 zQFHQ@_z8Poiy9oiiy9n%h#DMkL=BF&;vR1Gr>ME{m#De%x2U=CkEprvPSo6ZFKQzF z3-dBp@JatUUYYMmmt}?ey#8Qnz;=i6Ps(Kl)BN5*g!x-lu)yaH1bu0?*14?z0cX+f ArvLx| literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php new file mode 100644 index 0000000000000000000000000000000000000000..953704f6e5af289f97294f99980d3a2e651609bb GIT binary patch literal 3800 zcmXxnbzBsA9LDjpb?t5)6$!;|VZrY1z*u1w6cLwQ6%!G=+ zJo$Z|`D?!K*YlfU*ylI1uZ@mPO-yw-(!4HjQoI$C;PSdGr{(f^T98kIq1 zP+3$Kl|$uFc~l-%Kow9$R1sA|l~83=8C5}5P*qeFRYTQKbyOYIKs8WJR1?)gwNPzT z8`VK|P+e3PS;#{5P(4&1)kh6b0~CTnP(#!Zg`!Xt7X}|6%^nGd;V1${phl<>YK$7A zNEC^hpeCp(YKoenW=74;{%mgM7G`c?=9Xq|Y35dDZe`}yW^QffHfC;P=C)>TYvy)l zZfEB9W^Qlh4rcCP=CF?3MMo5cqEIx7Mo#2JF(?MbqFB@kbwZs{XVe9CL0wT-)D3k* z-BEYc1NA^XQBTwh^+LT-Z`23%L48qQ)DQJT{ZW5301ZF`(Lgi^4MKy_U^D~`K||3{ zGz<+x!_jaw0*yc;(MU83jY6Z*Xfy_mL1WQa6c+~{AI+W~2gjlDXgr#LCZLIEB61-Y znuI2ycodHkPy%uzH=2wlqbX<#N<@h$2_>PaXeye9rlDk%jHaXMCdqxon7T7VX!g=i64gfdWG z=4reb2kyd5#Th&C68vBj%(COXc&Y89c$w|}c)9HZcm;mA46d}}^LP~w+<>d?SYCs( zbu(*WP#0S#Zs+9n;tIGyJO?+zybP`0WP1nsX4|{*7TbI9leQ1yt+qGgZML`I?KpS> z?ogbi(|0P~NW9BF`zGFvvvu)3cD#moukE#X9}ep5{qVjzIRJBX@i2=DexDW9?{lL1eO^?*FNi0(tB0cceNj}u zFNx~+Wl{aUBC6k4MfLldsD57;)$bdk`h8PWzi)}^_ia)Az61T+_!n}Ns_uZOx`U$X z&K30xz6%2xTRKMTAz)Jqmx8f@JoffO#??v_dgBGu5@sFb3S3ik**ZnN6 zWAQK0uYP}3x}NkmaRdBai&f|!O7#-{Q>hC5OR2tm{#L5z_a9Nu@4qlFL$~#xZQaNt uoST2Kh$x36#N$r$C3`JrD8Eso9KMt^w>RAUV9j6PaeIB96ie%(9RCC6c1dpl literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php new file mode 100644 index 0000000000000000000000000000000000000000..78580ece01bbaeb2477c97dbae88eafe2579e4a8 GIT binary patch literal 3616 zcmXxnb#PQy6vy%6@Njo{K!`waXR`_J?h<5477_>{tN=mNG{7(|?ch!+P~6=Md0A+i zy1P(!cP01xdw=cu%sKbXm2>aRCM0F0Wm#4*-I+yqDRvXeyeDrlDzQI+~7r z$cJX287Kv%pj4EK{K$`HqM2wGnuXF(8cIj$Xf~RS=Abz!17)DOXfDb`nP?uGhq6!> znvdqA01BWW3Zf7Sp)d-g1!w_Uh!&znXc5Xr*=R9ZjFzA!XenBXmZ4>6Ia-cZpcN%u6N;0uJ_{2t~cNU) z6z>=J!vmsr`Ji}^>>=oA8xAXbnCuZ4*$j^=dlViMb>7Ft<77{WC*Vowtb(VM)mfev zPm?_(o`Gk@v+$gF4xSg!!wcdCcu~9vFF{9ba9LTk&=nZjLh)5)ufl8MHF#aT4sVDz z;1kf%w%>#Wd1P;i+MIkbhpZ!NuL_`}u@P}4#kWb-pWV8Xt*z znm&e(F6<}b<9zv373*R8Ow?X|F0Q5c3yszN{Srp>$b6+@?bX+!-i>cW-IQ-dUH0!p zHUIZ8qPO`6Q7!tTs0RKCI=a6hQ$h1}G GvHk~;j}(jm literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php b/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php new file mode 100644 index 0000000000000000000000000000000000000000..de1609d85ab469a8d4fe3e139a502b66b0c10c5e GIT binary patch literal 3662 zcmXxnb#xS09L4eCu(&%65F!xV*=&Nly98O1g#y^lnjT%=Xd*4ldOnjx8H5KEVtL|&a|Q(mKF6- zl;w&qIK&pH5GsTUqr#{NDuRllqNo@uhKi%&s01p3N}`ge6e@)r$bm|u(x?n7gUX_^ zs2nPX%A@kA0;+&2qKc>zs)Q<|%BTvef~umbs2ZwZAI|LKbR(8lZ-#A!>vgp$HU#8l%Q25=ElKDEQ!L_DD30MlmP`H9<{K zQ`8j2qFB@nHABr&bJPO0FluS`XG=4;GIJ|4w>EQYGq*8w8#A{xb6YdFGjlsLw>NWp zGj}j^2Qzmxb4N3GGIJ+0M|I{dIwL1?qBs z2kL=(qMoQ1>VqJd}-8iWR;!Dt8?f`+1@Xc!uX zhNIzV1R8-xqLFA68ihuq(P#`BgT|tKZ_N=4JrbTk9aKxrrq%|tU%I!Z^g&@7aJ zGSF-^8+nlz`H&C!ksk$60L?*j&|EYZ%|r80Cdx$f(R{Q3EkFy=LbM1iLW|L2v;-|d zStvjIIL?-{p2SOWXg$oa3!lp&fPEWhX=$1@Sv!7a7a8vdRRORkBCR$QSm4|CLV*wMQx4~;tA4| z;z@W)JOxjSdbMZ7Go)w5v+$gF4xSg!!wcdCcu~9vFNv4nWl@j)il`lRRn#lHCSK#* z>*95IL%acRiZ|gc@fLgv-pPVbix0!wVm7=3gJMu=4r#8q42DFN<{5DX>9gWW_?);3 zJ}*83^TgFK48ywT7nH6ceNkKsUlJdKFT>#D@D-)&;HxmK+jvc>s`0w0p1lD>s>Yj2 zH*u-A#Le(+QQv@fM12C@74`XgPu#}2?~5w*2QZ`^`ymW3W${N^ybFFT>Lx!C)!%$k z{rwaMb*ayks=uF$>hBk#`unA*{@xYU-+Q9^`<1Bvel4oM-@vdo;kQcF-|s~A_j^%K z;|Cbj3;j{4`uh_M>jU+(QuX&2QT_cDhV-m{Q>y;{E~>wOi0bd3qWb%nsQ&&fs=xn; z>hHfWq)*U)Fh5&Q=e|}K6gbA|a71`LzCfDaaz*mb(CG-I`#k<=^Ea_zf!E^?c+)Md Hb2|P9YmgvV literal 0 HcmV?d00001 diff --git a/vendor/symfony/polyfill-iconv/Resources/charset/translit.php b/vendor/symfony/polyfill-iconv/Resources/charset/translit.php new file mode 100644 index 0000000..ed59858 --- /dev/null +++ b/vendor/symfony/polyfill-iconv/Resources/charset/translit.php @@ -0,0 +1,4098 @@ + 'μ', + '¼' => ' 1â„4 ', + '½' => ' 1â„2 ', + '¾' => ' 3â„4 ', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'Ä¿' => 'L·', + 'Å€' => 'l·', + 'ʼn' => 'ʼn', + 'Å¿' => 's', + 'Ç„' => 'DŽ', + 'Ç…' => 'Dž', + 'dž' => 'dž', + 'LJ' => 'LJ', + 'Lj' => 'Lj', + 'lj' => 'lj', + 'ÇŠ' => 'NJ', + 'Ç‹' => 'Nj', + 'ÇŒ' => 'nj', + 'DZ' => 'DZ', + 'Dz' => 'Dz', + 'dz' => 'dz', + 'Ï' => 'β', + 'Ï‘' => 'θ', + 'Ï’' => 'Î¥', + 'Ï•' => 'φ', + 'Ï–' => 'Ï€', + 'ϰ' => 'κ', + 'ϱ' => 'Ï', + 'ϲ' => 'Ï‚', + 'Ï´' => 'Θ', + 'ϵ' => 'ε', + 'Ϲ' => 'Σ', + 'Ö‡' => 'Õ¥Ö‚', + 'Ùµ' => 'اٴ', + 'Ù¶' => 'وٴ', + 'Ù·' => 'Û‡Ù´', + 'Ù¸' => 'يٴ', + 'ำ' => 'à¹à¸²', + 'ຳ' => 'à»àº²', + 'ໜ' => 'ຫນ', + 'à»' => 'ຫມ', + 'ཷ' => 'ྲà¾', + 'ཹ' => 'ླà¾', + 'ẚ' => 'aʾ', + '․' => '.', + '‥' => '..', + '…' => '...', + '″' => '′′', + '‴' => '′′′', + '‶' => '‵‵', + '‷' => '‵‵‵', + '‼' => '!!', + 'â‡' => '??', + 'âˆ' => '?!', + 'â‰' => '!?', + 'â—' => '′′′′', + '₨' => 'Rs', + 'â„€' => 'a/c', + 'â„' => 'a/s', + 'â„‚' => 'C', + '℃' => '°C', + 'â„…' => 'c/o', + '℆' => 'c/u', + 'ℇ' => 'Æ', + '℉' => '°F', + 'ℊ' => 'g', + 'â„‹' => 'H', + 'ℌ' => 'H', + 'â„' => 'H', + 'ℎ' => 'h', + 'â„' => 'ħ', + 'â„' => 'I', + 'â„‘' => 'I', + 'â„’' => 'L', + 'â„“' => 'l', + 'â„•' => 'N', + 'â„–' => 'No', + 'â„™' => 'P', + 'ℚ' => 'Q', + 'â„›' => 'R', + 'ℜ' => 'R', + 'â„' => 'R', + 'â„¡' => 'TEL', + 'ℤ' => 'Z', + 'ℨ' => 'Z', + 'ℬ' => 'B', + 'â„­' => 'C', + 'ℯ' => 'e', + 'â„°' => 'E', + 'ℱ' => 'F', + 'ℳ' => 'M', + 'â„´' => 'o', + 'ℵ' => '×', + 'â„¶' => 'ב', + 'â„·' => '×’', + 'ℸ' => 'ד', + 'ℹ' => 'i', + 'â„»' => 'FAX', + 'ℼ' => 'Ï€', + 'ℽ' => 'γ', + 'ℾ' => 'Γ', + 'â„¿' => 'Π', + 'â…€' => '∑', + 'â……' => 'D', + 'â…†' => 'd', + 'â…‡' => 'e', + 'â…ˆ' => 'i', + 'â…‰' => 'j', + 'â…' => ' 1â„7 ', + 'â…‘' => ' 1â„9 ', + 'â…’' => ' 1â„10 ', + 'â…“' => ' 1â„3 ', + 'â…”' => ' 2â„3 ', + 'â…•' => ' 1â„5 ', + 'â…–' => ' 2â„5 ', + 'â…—' => ' 3â„5 ', + 'â…˜' => ' 4â„5 ', + 'â…™' => ' 1â„6 ', + 'â…š' => ' 5â„6 ', + 'â…›' => ' 1â„8 ', + 'â…œ' => ' 3â„8 ', + 'â…' => ' 5â„8 ', + 'â…ž' => ' 7â„8 ', + 'â…Ÿ' => ' 1â„ ', + 'â… ' => 'I', + 'â…¡' => 'II', + 'â…¢' => 'III', + 'â…£' => 'IV', + 'â…¤' => 'V', + 'â…¥' => 'VI', + 'â…¦' => 'VII', + 'â…§' => 'VIII', + 'â…¨' => 'IX', + 'â…©' => 'X', + 'â…ª' => 'XI', + 'â…«' => 'XII', + 'â…¬' => 'L', + 'â…­' => 'C', + 'â…®' => 'D', + 'â…¯' => 'M', + 'â…°' => 'i', + 'â…±' => 'ii', + 'â…²' => 'iii', + 'â…³' => 'iv', + 'â…´' => 'v', + 'â…µ' => 'vi', + 'â…¶' => 'vii', + 'â…·' => 'viii', + 'â…¸' => 'ix', + 'â…¹' => 'x', + 'â…º' => 'xi', + 'â…»' => 'xii', + 'â…¼' => 'l', + 'â…½' => 'c', + 'â…¾' => 'd', + 'â…¿' => 'm', + '↉' => ' 0â„3 ', + '∬' => '∫∫', + '∭' => '∫∫∫', + '∯' => '∮∮', + '∰' => '∮∮∮', + 'â‘ ' => '(1)', + 'â‘¡' => '(2)', + 'â‘¢' => '(3)', + 'â‘£' => '(4)', + '⑤' => '(5)', + 'â‘¥' => '(6)', + '⑦' => '(7)', + 'â‘§' => '(8)', + '⑨' => '(9)', + 'â‘©' => '(10)', + '⑪' => '(11)', + 'â‘«' => '(12)', + '⑬' => '(13)', + 'â‘­' => '(14)', + 'â‘®' => '(15)', + '⑯' => '(16)', + 'â‘°' => '(17)', + '⑱' => '(18)', + '⑲' => '(19)', + '⑳' => '(20)', + 'â‘´' => '(1)', + '⑵' => '(2)', + 'â‘¶' => '(3)', + 'â‘·' => '(4)', + '⑸' => '(5)', + '⑹' => '(6)', + '⑺' => '(7)', + 'â‘»' => '(8)', + '⑼' => '(9)', + '⑽' => '(10)', + '⑾' => '(11)', + 'â‘¿' => '(12)', + 'â’€' => '(13)', + 'â’' => '(14)', + 'â’‚' => '(15)', + 'â’ƒ' => '(16)', + 'â’„' => '(17)', + 'â’…' => '(18)', + 'â’†' => '(19)', + 'â’‡' => '(20)', + 'â’ˆ' => '1.', + 'â’‰' => '2.', + 'â’Š' => '3.', + 'â’‹' => '4.', + 'â’Œ' => '5.', + 'â’' => '6.', + 'â’Ž' => '7.', + 'â’' => '8.', + 'â’' => '9.', + 'â’‘' => '10.', + 'â’’' => '11.', + 'â’“' => '12.', + 'â’”' => '13.', + 'â’•' => '14.', + 'â’–' => '15.', + 'â’—' => '16.', + 'â’˜' => '17.', + 'â’™' => '18.', + 'â’š' => '19.', + 'â’›' => '20.', + 'â’œ' => '(a)', + 'â’' => '(b)', + 'â’ž' => '(c)', + 'â’Ÿ' => '(d)', + 'â’ ' => '(e)', + 'â’¡' => '(f)', + 'â’¢' => '(g)', + 'â’£' => '(h)', + 'â’¤' => '(i)', + 'â’¥' => '(j)', + 'â’¦' => '(k)', + 'â’§' => '(l)', + 'â’¨' => '(m)', + 'â’©' => '(n)', + 'â’ª' => '(o)', + 'â’«' => '(p)', + 'â’¬' => '(q)', + 'â’­' => '(r)', + 'â’®' => '(s)', + 'â’¯' => '(t)', + 'â’°' => '(u)', + 'â’±' => '(v)', + 'â’²' => '(w)', + 'â’³' => '(x)', + 'â’´' => '(y)', + 'â’µ' => '(z)', + 'â’¶' => '(A)', + 'â’·' => '(B)', + 'â’¸' => '(C)', + 'â’¹' => '(D)', + 'â’º' => '(E)', + 'â’»' => '(F)', + 'â’¼' => '(G)', + 'â’½' => '(H)', + 'â’¾' => '(I)', + 'â’¿' => '(J)', + 'â“€' => '(K)', + 'â“' => '(L)', + 'â“‚' => '(M)', + 'Ⓝ' => '(N)', + 'â“„' => '(O)', + 'â“…' => '(P)', + 'Ⓠ' => '(Q)', + 'Ⓡ' => '(R)', + 'Ⓢ' => '(S)', + 'Ⓣ' => '(T)', + 'Ⓤ' => '(U)', + 'â“‹' => '(V)', + 'Ⓦ' => '(W)', + 'â“' => '(X)', + 'Ⓨ' => '(Y)', + 'â“' => '(Z)', + 'â“' => '(a)', + 'â“‘' => '(b)', + 'â“’' => '(c)', + 'â““' => '(d)', + 'â“”' => '(e)', + 'â“•' => '(f)', + 'â“–' => '(g)', + 'â“—' => '(h)', + 'ⓘ' => '(i)', + 'â“™' => '(j)', + 'ⓚ' => '(k)', + 'â“›' => '(l)', + 'ⓜ' => '(m)', + 'â“' => '(n)', + 'ⓞ' => '(o)', + 'ⓟ' => '(p)', + 'â“ ' => '(q)', + 'â“¡' => '(r)', + 'â“¢' => '(s)', + 'â“£' => '(t)', + 'ⓤ' => '(u)', + 'â“¥' => '(v)', + 'ⓦ' => '(w)', + 'â“§' => '(x)', + 'ⓨ' => '(y)', + 'â“©' => '(z)', + '⓪' => '(0)', + '⨌' => '∫∫∫∫', + 'â©´' => '::=', + '⩵' => '==', + 'â©¶' => '===', + '⺟' => 'æ¯', + '⻳' => '龟', + 'â¼€' => '一', + 'â¼' => '丨', + '⼂' => '丶', + '⼃' => '丿', + '⼄' => 'ä¹™', + 'â¼…' => '亅', + '⼆' => '二', + '⼇' => '亠', + '⼈' => '人', + '⼉' => 'å„¿', + '⼊' => 'å…¥', + '⼋' => 'å…«', + '⼌' => '冂', + 'â¼' => '冖', + '⼎' => '冫', + 'â¼' => '几', + 'â¼' => '凵', + '⼑' => '刀', + 'â¼’' => '力', + '⼓' => '勹', + 'â¼”' => '匕', + '⼕' => '匚', + 'â¼–' => '匸', + 'â¼—' => 'å', + '⼘' => 'åœ', + 'â¼™' => 'å©', + '⼚' => '厂', + 'â¼›' => '厶', + '⼜' => 'åˆ', + 'â¼' => 'å£', + '⼞' => 'å›—', + '⼟' => '土', + 'â¼ ' => '士', + '⼡' => '夂', + 'â¼¢' => '夊', + 'â¼£' => '夕', + '⼤' => '大', + 'â¼¥' => '女', + '⼦' => 'å­', + 'â¼§' => '宀', + '⼨' => '寸', + '⼩' => 'å°', + '⼪' => 'å°¢', + '⼫' => 'å°¸', + '⼬' => 'å±®', + 'â¼­' => 'å±±', + 'â¼®' => 'å·›', + '⼯' => 'å·¥', + 'â¼°' => 'å·±', + 'â¼±' => 'å·¾', + 'â¼²' => 'å¹²', + 'â¼³' => '幺', + 'â¼´' => '广', + 'â¼µ' => 'å»´', + 'â¼¶' => '廾', + 'â¼·' => '弋', + '⼸' => '弓', + 'â¼¹' => 'å½', + '⼺' => '彡', + 'â¼»' => 'å½³', + 'â¼¼' => '心', + 'â¼½' => '戈', + 'â¼¾' => '戶', + '⼿' => '手', + 'â½€' => '支', + 'â½' => 'æ”´', + '⽂' => 'æ–‡', + '⽃' => 'æ–—', + '⽄' => 'æ–¤', + 'â½…' => 'æ–¹', + '⽆' => 'æ— ', + '⽇' => 'æ—¥', + '⽈' => 'æ›°', + '⽉' => '月', + '⽊' => '木', + '⽋' => '欠', + '⽌' => 'æ­¢', + 'â½' => 'æ­¹', + '⽎' => '殳', + 'â½' => '毋', + 'â½' => '比', + '⽑' => '毛', + 'â½’' => 'æ°', + '⽓' => 'æ°”', + 'â½”' => 'æ°´', + '⽕' => 'ç«', + 'â½–' => '爪', + 'â½—' => '父', + '⽘' => '爻', + 'â½™' => '爿', + '⽚' => '片', + 'â½›' => '牙', + '⽜' => '牛', + 'â½' => '犬', + '⽞' => '玄', + '⽟' => '玉', + 'â½ ' => '瓜', + '⽡' => '瓦', + 'â½¢' => '甘', + 'â½£' => '生', + '⽤' => '用', + 'â½¥' => 'ç”°', + '⽦' => 'ç–‹', + 'â½§' => 'ç–’', + '⽨' => 'ç™¶', + '⽩' => '白', + '⽪' => 'çš®', + '⽫' => 'çš¿', + '⽬' => 'ç›®', + 'â½­' => '矛', + 'â½®' => '矢', + '⽯' => '石', + 'â½°' => '示', + 'â½±' => '禸', + 'â½²' => '禾', + 'â½³' => 'ç©´', + 'â½´' => 'ç«‹', + 'â½µ' => '竹', + 'â½¶' => 'ç±³', + 'â½·' => '糸', + '⽸' => 'ç¼¶', + 'â½¹' => '网', + '⽺' => '羊', + 'â½»' => 'ç¾½', + 'â½¼' => 'è€', + 'â½½' => '而', + 'â½¾' => '耒', + '⽿' => '耳', + 'â¾€' => 'è¿', + 'â¾' => '肉', + '⾂' => '臣', + '⾃' => '自', + '⾄' => '至', + 'â¾…' => '臼', + '⾆' => '舌', + '⾇' => '舛', + '⾈' => '舟', + '⾉' => '艮', + '⾊' => '色', + '⾋' => '艸', + '⾌' => 'è™', + 'â¾' => '虫', + '⾎' => 'è¡€', + 'â¾' => '行', + 'â¾' => 'è¡£', + '⾑' => '襾', + 'â¾’' => '見', + '⾓' => 'è§’', + 'â¾”' => '言', + '⾕' => 'è°·', + 'â¾–' => '豆', + 'â¾—' => '豕', + '⾘' => '豸', + 'â¾™' => 'è²', + '⾚' => '赤', + 'â¾›' => 'èµ°', + '⾜' => 'è¶³', + 'â¾' => '身', + '⾞' => '車', + '⾟' => 'è¾›', + 'â¾ ' => 'è¾°', + '⾡' => 'è¾µ', + 'â¾¢' => 'é‚‘', + 'â¾£' => 'é…‰', + '⾤' => '釆', + 'â¾¥' => '里', + '⾦' => '金', + 'â¾§' => 'é•·', + '⾨' => 'é–€', + '⾩' => '阜', + '⾪' => 'éš¶', + '⾫' => 'éš¹', + '⾬' => '雨', + 'â¾­' => 'é‘', + 'â¾®' => 'éž', + '⾯' => 'é¢', + 'â¾°' => 'é©', + 'â¾±' => '韋', + 'â¾²' => '韭', + 'â¾³' => '音', + 'â¾´' => 'é ', + 'â¾µ' => '風', + 'â¾¶' => '飛', + 'â¾·' => '食', + '⾸' => '首', + 'â¾¹' => '香', + '⾺' => '馬', + 'â¾»' => '骨', + 'â¾¼' => '高', + 'â¾½' => '髟', + 'â¾¾' => '鬥', + '⾿' => '鬯', + 'â¿€' => '鬲', + 'â¿' => '鬼', + 'â¿‚' => 'é­š', + '⿃' => 'é³¥', + 'â¿„' => 'é¹µ', + 'â¿…' => '鹿', + '⿆' => '麥', + '⿇' => '麻', + '⿈' => '黃', + '⿉' => 'é»', + '⿊' => '黑', + 'â¿‹' => '黹', + '⿌' => '黽', + 'â¿' => '鼎', + '⿎' => '鼓', + 'â¿' => 'é¼ ', + 'â¿' => 'é¼»', + 'â¿‘' => '齊', + 'â¿’' => 'é½’', + 'â¿“' => 'é¾', + 'â¿”' => '龜', + 'â¿•' => 'é¾ ', + ' ' => ' ', + '〶' => '〒', + '〸' => 'å', + '〹' => 'å„', + '〺' => 'å…', + 'ㄱ' => 'á„€', + 'ㄲ' => 'á„', + 'ㄳ' => 'ᆪ', + 'ã„´' => 'á„‚', + 'ㄵ' => 'ᆬ', + 'ã„¶' => 'ᆭ', + 'ã„·' => 'ᄃ', + 'ㄸ' => 'á„„', + 'ㄹ' => 'á„…', + 'ㄺ' => 'ᆰ', + 'ã„»' => 'ᆱ', + 'ㄼ' => 'ᆲ', + 'ㄽ' => 'ᆳ', + 'ㄾ' => 'ᆴ', + 'ã„¿' => 'ᆵ', + 'ã…€' => 'ᄚ', + 'ã…' => 'ᄆ', + 'ã…‚' => 'ᄇ', + 'ã…ƒ' => 'ᄈ', + 'ã…„' => 'á„¡', + 'ã……' => 'ᄉ', + 'ã…†' => 'ᄊ', + 'ã…‡' => 'á„‹', + 'ã…ˆ' => 'ᄌ', + 'ã…‰' => 'á„', + 'ã…Š' => 'ᄎ', + 'ã…‹' => 'á„', + 'ã…Œ' => 'á„', + 'ã…' => 'á„‘', + 'ã…Ž' => 'á„’', + 'ã…' => 'á…¡', + 'ã…' => 'á…¢', + 'ã…‘' => 'á…£', + 'ã…’' => 'á…¤', + 'ã…“' => 'á…¥', + 'ã…”' => 'á…¦', + 'ã…•' => 'á…§', + 'ã…–' => 'á…¨', + 'ã…—' => 'á…©', + 'ã…˜' => 'á…ª', + 'ã…™' => 'á…«', + 'ã…š' => 'á…¬', + 'ã…›' => 'á…­', + 'ã…œ' => 'á…®', + 'ã…' => 'á…¯', + 'ã…ž' => 'á…°', + 'ã…Ÿ' => 'á…±', + 'ã… ' => 'á…²', + 'ã…¡' => 'á…³', + 'ã…¢' => 'á…´', + 'ã…£' => 'á…µ', + 'ã…¤' => 'á… ', + 'ã…¥' => 'á„”', + 'ã…¦' => 'á„•', + 'ã…§' => 'ᇇ', + 'ã…¨' => 'ᇈ', + 'ã…©' => 'ᇌ', + 'ã…ª' => 'ᇎ', + 'ã…«' => 'ᇓ', + 'ã…¬' => 'ᇗ', + 'ã…­' => 'ᇙ', + 'ã…®' => 'ᄜ', + 'ã…¯' => 'á‡', + 'ã…°' => 'ᇟ', + 'ã…±' => 'á„', + 'ã…²' => 'ᄞ', + 'ã…³' => 'á„ ', + 'ã…´' => 'á„¢', + 'ã…µ' => 'á„£', + 'ã…¶' => 'á„§', + 'ã…·' => 'á„©', + 'ã…¸' => 'á„«', + 'ã…¹' => 'ᄬ', + 'ã…º' => 'á„­', + 'ã…»' => 'á„®', + 'ã…¼' => 'ᄯ', + 'ã…½' => 'ᄲ', + 'ã…¾' => 'á„¶', + 'ã…¿' => 'á…€', + 'ㆀ' => 'á…‡', + 'ã†' => 'á…Œ', + 'ㆂ' => 'ᇱ', + 'ㆃ' => 'ᇲ', + 'ㆄ' => 'á…—', + 'ㆅ' => 'á…˜', + 'ㆆ' => 'á…™', + 'ㆇ' => 'ᆄ', + 'ㆈ' => 'ᆅ', + 'ㆉ' => 'ᆈ', + 'ㆊ' => 'ᆑ', + 'ㆋ' => 'ᆒ', + 'ㆌ' => 'ᆔ', + 'ã†' => 'ᆞ', + 'ㆎ' => 'ᆡ', + '㈀' => '(á„€)', + 'ãˆ' => '(á„‚)', + '㈂' => '(ᄃ)', + '㈃' => '(á„…)', + '㈄' => '(ᄆ)', + '㈅' => '(ᄇ)', + '㈆' => '(ᄉ)', + '㈇' => '(á„‹)', + '㈈' => '(ᄌ)', + '㈉' => '(ᄎ)', + '㈊' => '(á„)', + '㈋' => '(á„)', + '㈌' => '(á„‘)', + 'ãˆ' => '(á„’)', + '㈎' => '(가)', + 'ãˆ' => '(á„‚á…¡)', + 'ãˆ' => '(다)', + '㈑' => '(á„…á…¡)', + '㈒' => '(마)', + '㈓' => '(바)', + '㈔' => '(사)', + '㈕' => '(á„‹á…¡)', + '㈖' => '(자)', + '㈗' => '(차)', + '㈘' => '(á„á…¡)', + '㈙' => '(á„á…¡)', + '㈚' => '(á„‘á…¡)', + '㈛' => '(á„’á…¡)', + '㈜' => '(주)', + 'ãˆ' => '(오전)', + '㈞' => '(á„‹á…©á„’á…®)', + '㈠' => '(一)', + '㈡' => '(二)', + '㈢' => '(三)', + '㈣' => '(å››)', + '㈤' => '(五)', + '㈥' => '(å…­)', + '㈦' => '(七)', + '㈧' => '(å…«)', + '㈨' => '(ä¹)', + '㈩' => '(å)', + '㈪' => '(月)', + '㈫' => '(ç«)', + '㈬' => '(æ°´)', + '㈭' => '(木)', + '㈮' => '(金)', + '㈯' => '(土)', + '㈰' => '(æ—¥)', + '㈱' => '(æ ª)', + '㈲' => '(有)', + '㈳' => '(社)', + '㈴' => '(å)', + '㈵' => '(特)', + '㈶' => '(財)', + '㈷' => '(ç¥)', + '㈸' => '(労)', + '㈹' => '(代)', + '㈺' => '(呼)', + '㈻' => '(å­¦)', + '㈼' => '(監)', + '㈽' => '(ä¼)', + '㈾' => '(資)', + '㈿' => '(å”)', + '㉀' => '(祭)', + 'ã‰' => '(休)', + '㉂' => '(自)', + '㉃' => '(至)', + '㉄' => '(å•)', + '㉅' => '(å¹¼)', + '㉆' => '(æ–‡)', + '㉇' => '(ç®)', + 'ã‰' => 'PTE', + '㉑' => '(21)', + '㉒' => '(22)', + '㉓' => '(23)', + '㉔' => '(24)', + '㉕' => '(25)', + '㉖' => '(26)', + '㉗' => '(27)', + '㉘' => '(28)', + '㉙' => '(29)', + '㉚' => '(30)', + '㉛' => '(31)', + '㉜' => '(32)', + 'ã‰' => '(33)', + '㉞' => '(34)', + '㉟' => '(35)', + '㉠' => '(á„€)', + '㉡' => '(á„‚)', + '㉢' => '(ᄃ)', + '㉣' => '(á„…)', + '㉤' => '(ᄆ)', + '㉥' => '(ᄇ)', + '㉦' => '(ᄉ)', + '㉧' => '(á„‹)', + '㉨' => '(ᄌ)', + '㉩' => '(ᄎ)', + '㉪' => '(á„)', + '㉫' => '(á„)', + '㉬' => '(á„‘)', + '㉭' => '(á„’)', + '㉮' => '(가)', + '㉯' => '(á„‚á…¡)', + '㉰' => '(다)', + '㉱' => '(á„…á…¡)', + '㉲' => '(마)', + '㉳' => '(바)', + '㉴' => '(사)', + '㉵' => '(á„‹á…¡)', + '㉶' => '(자)', + '㉷' => '(차)', + '㉸' => '(á„á…¡)', + '㉹' => '(á„á…¡)', + '㉺' => '(á„‘á…¡)', + '㉻' => '(á„’á…¡)', + '㉼' => '(참고)', + '㉽' => '(주의)', + '㉾' => '(á„‹á…®)', + '㊀' => '(一)', + 'ãŠ' => '(二)', + '㊂' => '(三)', + '㊃' => '(å››)', + '㊄' => '(五)', + '㊅' => '(å…­)', + '㊆' => '(七)', + '㊇' => '(å…«)', + '㊈' => '(ä¹)', + '㊉' => '(å)', + '㊊' => '(月)', + '㊋' => '(ç«)', + '㊌' => '(æ°´)', + 'ãŠ' => '(木)', + '㊎' => '(金)', + 'ãŠ' => '(土)', + 'ãŠ' => '(æ—¥)', + '㊑' => '(æ ª)', + '㊒' => '(有)', + '㊓' => '(社)', + '㊔' => '(å)', + '㊕' => '(特)', + '㊖' => '(財)', + '㊗' => '(ç¥)', + '㊘' => '(労)', + '㊙' => '(秘)', + '㊚' => '(ç”·)', + '㊛' => '(女)', + '㊜' => '(é©)', + 'ãŠ' => '(優)', + '㊞' => '(å°)', + '㊟' => '(注)', + '㊠' => '(é …)', + '㊡' => '(休)', + '㊢' => '(写)', + '㊣' => '(æ­£)', + '㊤' => '(上)', + '㊥' => '(中)', + '㊦' => '(下)', + '㊧' => '(å·¦)', + '㊨' => '(å³)', + '㊩' => '(医)', + '㊪' => '(å®—)', + '㊫' => '(å­¦)', + '㊬' => '(監)', + '㊭' => '(ä¼)', + '㊮' => '(資)', + '㊯' => '(å”)', + '㊰' => '(夜)', + '㊱' => '(36)', + '㊲' => '(37)', + '㊳' => '(38)', + '㊴' => '(39)', + '㊵' => '(40)', + '㊶' => '(41)', + '㊷' => '(42)', + '㊸' => '(43)', + '㊹' => '(44)', + '㊺' => '(45)', + '㊻' => '(46)', + '㊼' => '(47)', + '㊽' => '(48)', + '㊾' => '(49)', + '㊿' => '(50)', + 'ã‹€' => '1月', + 'ã‹' => '2月', + 'ã‹‚' => '3月', + '㋃' => '4月', + 'ã‹„' => '5月', + 'ã‹…' => '6月', + '㋆' => '7月', + '㋇' => '8月', + '㋈' => '9月', + '㋉' => '10月', + '㋊' => '11月', + 'ã‹‹' => '12月', + '㋌' => 'Hg', + 'ã‹' => 'erg', + '㋎' => 'eV', + 'ã‹' => 'LTD', + 'ã‹' => '(ã‚¢)', + 'ã‹‘' => '(イ)', + 'ã‹’' => '(ウ)', + 'ã‹“' => '(エ)', + 'ã‹”' => '(オ)', + 'ã‹•' => '(ã‚«)', + 'ã‹–' => '(ã‚­)', + 'ã‹—' => '(ク)', + '㋘' => '(ケ)', + 'ã‹™' => '(コ)', + '㋚' => '(サ)', + 'ã‹›' => '(ã‚·)', + '㋜' => '(ス)', + 'ã‹' => '(ã‚»)', + '㋞' => '(ソ)', + '㋟' => '(ã‚¿)', + 'ã‹ ' => '(ãƒ)', + 'ã‹¡' => '(ツ)', + 'ã‹¢' => '(テ)', + 'ã‹£' => '(ト)', + '㋤' => '(ナ)', + 'ã‹¥' => '(ニ)', + '㋦' => '(ヌ)', + 'ã‹§' => '(ãƒ)', + '㋨' => '(ノ)', + 'ã‹©' => '(ãƒ)', + '㋪' => '(ヒ)', + 'ã‹«' => '(フ)', + '㋬' => '(ヘ)', + 'ã‹­' => '(ホ)', + 'ã‹®' => '(マ)', + '㋯' => '(ミ)', + 'ã‹°' => '(ム)', + '㋱' => '(メ)', + '㋲' => '(モ)', + '㋳' => '(ヤ)', + 'ã‹´' => '(ユ)', + '㋵' => '(ヨ)', + 'ã‹¶' => '(ラ)', + 'ã‹·' => '(リ)', + '㋸' => '(ル)', + '㋹' => '(レ)', + '㋺' => '(ロ)', + 'ã‹»' => '(ワ)', + '㋼' => '(ヰ)', + '㋽' => '(ヱ)', + '㋾' => '(ヲ)', + 'ã‹¿' => '令和', + '㌀' => 'アパート', + 'ãŒ' => 'アルファ', + '㌂' => 'アンペア', + '㌃' => 'アール', + '㌄' => 'イニング', + '㌅' => 'インãƒ', + '㌆' => 'ウォン', + '㌇' => 'エスクード', + '㌈' => 'エーカー', + '㌉' => 'オンス', + '㌊' => 'オーム', + '㌋' => 'カイリ', + '㌌' => 'カラット', + 'ãŒ' => 'カロリー', + '㌎' => 'ガロン', + 'ãŒ' => 'ガンマ', + 'ãŒ' => 'ギガ', + '㌑' => 'ギニー', + '㌒' => 'キュリー', + '㌓' => 'ギルダー', + '㌔' => 'キロ', + '㌕' => 'キログラム', + '㌖' => 'キロメートル', + '㌗' => 'キロワット', + '㌘' => 'グラム', + '㌙' => 'グラムトン', + '㌚' => 'クルゼイロ', + '㌛' => 'クローãƒ', + '㌜' => 'ケース', + 'ãŒ' => 'コルナ', + '㌞' => 'コーãƒ', + '㌟' => 'サイクル', + '㌠' => 'サンãƒãƒ¼ãƒ ', + '㌡' => 'シリング', + '㌢' => 'センãƒ', + '㌣' => 'セント', + '㌤' => 'ダース', + '㌥' => 'デシ', + '㌦' => 'ドル', + '㌧' => 'トン', + '㌨' => 'ナノ', + '㌩' => 'ノット', + '㌪' => 'ãƒã‚¤ãƒ„', + '㌫' => 'パーセント', + '㌬' => 'パーツ', + '㌭' => 'ãƒãƒ¼ãƒ¬ãƒ«', + '㌮' => 'ピアストル', + '㌯' => 'ピクル', + '㌰' => 'ピコ', + '㌱' => 'ビル', + '㌲' => 'ファラッド', + '㌳' => 'フィート', + '㌴' => 'ブッシェル', + '㌵' => 'フラン', + '㌶' => 'ヘクタール', + '㌷' => 'ペソ', + '㌸' => 'ペニヒ', + '㌹' => 'ヘルツ', + '㌺' => 'ペンス', + '㌻' => 'ページ', + '㌼' => 'ベータ', + '㌽' => 'ãƒã‚¤ãƒ³ãƒˆ', + '㌾' => 'ボルト', + '㌿' => 'ホン', + 'ã€' => 'ãƒãƒ³ãƒ‰', + 'ã' => 'ホール', + 'ã‚' => 'ホーン', + 'ãƒ' => 'マイクロ', + 'ã„' => 'マイル', + 'ã…' => 'マッãƒ', + 'ã†' => 'マルク', + 'ã‡' => 'マンション', + 'ãˆ' => 'ミクロン', + 'ã‰' => 'ミリ', + 'ãŠ' => 'ミリãƒãƒ¼ãƒ«', + 'ã‹' => 'メガ', + 'ãŒ' => 'メガトン', + 'ã' => 'メートル', + 'ãŽ' => 'ヤード', + 'ã' => 'ヤール', + 'ã' => 'ユアン', + 'ã‘' => 'リットル', + 'ã’' => 'リラ', + 'ã“' => 'ルピー', + 'ã”' => 'ルーブル', + 'ã•' => 'レム', + 'ã–' => 'レントゲン', + 'ã—' => 'ワット', + 'ã˜' => '0点', + 'ã™' => '1点', + 'ãš' => '2点', + 'ã›' => '3点', + 'ãœ' => '4点', + 'ã' => '5点', + 'ãž' => '6点', + 'ãŸ' => '7点', + 'ã ' => '8点', + 'ã¡' => '9点', + 'ã¢' => '10点', + 'ã£' => '11点', + 'ã¤' => '12点', + 'ã¥' => '13点', + 'ã¦' => '14点', + 'ã§' => '15点', + 'ã¨' => '16点', + 'ã©' => '17点', + 'ãª' => '18点', + 'ã«' => '19点', + 'ã¬' => '20点', + 'ã­' => '21点', + 'ã®' => '22点', + 'ã¯' => '23点', + 'ã°' => '24点', + 'ã±' => 'hPa', + 'ã²' => 'da', + 'ã³' => 'AU', + 'ã´' => 'bar', + 'ãµ' => 'oV', + 'ã¶' => 'pc', + 'ã·' => 'dm', + 'ã¸' => 'dm²', + 'ã¹' => 'dm³', + 'ãº' => 'IU', + 'ã»' => 'å¹³æˆ', + 'ã¼' => '昭和', + 'ã½' => '大正', + 'ã¾' => '明治', + 'ã¿' => 'æ ªå¼ä¼šç¤¾', + '㎀' => 'pA', + 'ãŽ' => 'nA', + '㎂' => 'μA', + '㎃' => 'mA', + '㎄' => 'kA', + '㎅' => 'KB', + '㎆' => 'MB', + '㎇' => 'GB', + '㎈' => 'cal', + '㎉' => 'kcal', + '㎊' => 'pF', + '㎋' => 'nF', + '㎌' => 'μF', + 'ãŽ' => 'μg', + '㎎' => 'mg', + 'ãŽ' => 'kg', + 'ãŽ' => 'Hz', + '㎑' => 'kHz', + '㎒' => 'MHz', + '㎓' => 'GHz', + '㎔' => 'THz', + '㎕' => 'μℓ', + '㎖' => 'mâ„“', + '㎗' => 'dâ„“', + '㎘' => 'kâ„“', + '㎙' => 'fm', + '㎚' => 'nm', + '㎛' => 'μm', + '㎜' => 'mm', + 'ãŽ' => 'cm', + '㎞' => 'km', + '㎟' => 'mm²', + '㎠' => 'cm²', + '㎡' => 'm²', + '㎢' => 'km²', + '㎣' => 'mm³', + '㎤' => 'cm³', + '㎥' => 'm³', + '㎦' => 'km³', + '㎧' => 'm∕s', + '㎨' => 'm∕s²', + '㎩' => 'Pa', + '㎪' => 'kPa', + '㎫' => 'MPa', + '㎬' => 'GPa', + '㎭' => 'rad', + '㎮' => 'rad∕s', + '㎯' => 'rad∕s²', + '㎰' => 'ps', + '㎱' => 'ns', + '㎲' => 'μs', + '㎳' => 'ms', + '㎴' => 'pV', + '㎵' => 'nV', + '㎶' => 'μV', + '㎷' => 'mV', + '㎸' => 'kV', + '㎹' => 'MV', + '㎺' => 'pW', + '㎻' => 'nW', + '㎼' => 'μW', + '㎽' => 'mW', + '㎾' => 'kW', + '㎿' => 'MW', + 'ã€' => 'kΩ', + 'ã' => 'MΩ', + 'ã‚' => 'a.m.', + 'ãƒ' => 'Bq', + 'ã„' => 'cc', + 'ã…' => 'cd', + 'ã†' => 'C∕kg', + 'ã‡' => 'Co.', + 'ãˆ' => 'dB', + 'ã‰' => 'Gy', + 'ãŠ' => 'ha', + 'ã‹' => 'HP', + 'ãŒ' => 'in', + 'ã' => 'KK', + 'ãŽ' => 'KM', + 'ã' => 'kt', + 'ã' => 'lm', + 'ã‘' => 'ln', + 'ã’' => 'log', + 'ã“' => 'lx', + 'ã”' => 'mb', + 'ã•' => 'mil', + 'ã–' => 'mol', + 'ã—' => 'PH', + 'ã˜' => 'p.m.', + 'ã™' => 'PPM', + 'ãš' => 'PR', + 'ã›' => 'sr', + 'ãœ' => 'Sv', + 'ã' => 'Wb', + 'ãž' => 'V∕m', + 'ãŸ' => 'A∕m', + 'ã ' => '1æ—¥', + 'ã¡' => '2æ—¥', + 'ã¢' => '3æ—¥', + 'ã£' => '4æ—¥', + 'ã¤' => '5æ—¥', + 'ã¥' => '6æ—¥', + 'ã¦' => '7æ—¥', + 'ã§' => '8æ—¥', + 'ã¨' => '9æ—¥', + 'ã©' => '10æ—¥', + 'ãª' => '11æ—¥', + 'ã«' => '12æ—¥', + 'ã¬' => '13æ—¥', + 'ã­' => '14æ—¥', + 'ã®' => '15æ—¥', + 'ã¯' => '16æ—¥', + 'ã°' => '17æ—¥', + 'ã±' => '18æ—¥', + 'ã²' => '19æ—¥', + 'ã³' => '20æ—¥', + 'ã´' => '21æ—¥', + 'ãµ' => '22æ—¥', + 'ã¶' => '23æ—¥', + 'ã·' => '24æ—¥', + 'ã¸' => '25æ—¥', + 'ã¹' => '26æ—¥', + 'ãº' => '27æ—¥', + 'ã»' => '28æ—¥', + 'ã¼' => '29æ—¥', + 'ã½' => '30æ—¥', + 'ã¾' => '31æ—¥', + 'ã¿' => 'gal', + '豈' => '豈', + 'ï¤' => 'æ›´', + '車' => '車', + '賈' => '賈', + '滑' => '滑', + '串' => '串', + '句' => 'å¥', + '龜' => '龜', + '龜' => '龜', + '契' => '契', + '金' => '金', + '喇' => 'å–‡', + '奈' => '奈', + 'ï¤' => '懶', + '癩' => '癩', + 'ï¤' => 'ç¾…', + 'ï¤' => '蘿', + '螺' => '螺', + '裸' => '裸', + '邏' => 'é‚', + '樂' => '樂', + '洛' => 'æ´›', + '烙' => '烙', + '珞' => 'çž', + '落' => 'è½', + '酪' => 'é…ª', + '駱' => 'é§±', + '亂' => '亂', + '卵' => 'åµ', + 'ï¤' => '欄', + '爛' => '爛', + '蘭' => '蘭', + '鸞' => '鸞', + '嵐' => 'åµ', + '濫' => 'æ¿«', + '藍' => 'è—', + '襤' => '襤', + '拉' => '拉', + '臘' => '臘', + '蠟' => 'è Ÿ', + '廊' => '廊', + '朗' => '朗', + '浪' => '浪', + '狼' => '狼', + '郎' => '郎', + '來' => '來', + '冷' => '冷', + '勞' => '勞', + '擄' => 'æ“„', + '櫓' => 'æ«“', + '爐' => 'çˆ', + '盧' => 'ç›§', + '老' => 'è€', + '蘆' => '蘆', + '虜' => '虜', + '路' => 'è·¯', + '露' => '露', + '魯' => 'é­¯', + '鷺' => 'é·º', + '碌' => '碌', + '祿' => '祿', + '綠' => 'ç¶ ', + '菉' => 'è‰', + '錄' => '錄', + '鹿' => '鹿', + 'ï¥' => 'è«–', + '壟' => '壟', + '弄' => '弄', + '籠' => 'ç± ', + '聾' => 'è¾', + '牢' => '牢', + '磊' => '磊', + '賂' => '賂', + '雷' => 'é›·', + '壘' => '壘', + '屢' => 'å±¢', + '樓' => '樓', + 'ï¥' => 'æ·š', + '漏' => 'æ¼', + 'ï¥' => 'ç´¯', + 'ï¥' => '縷', + '陋' => '陋', + '勒' => 'å‹’', + '肋' => 'è‚‹', + '凜' => '凜', + '凌' => '凌', + '稜' => '稜', + '綾' => 'ç¶¾', + '菱' => 'è±', + '陵' => '陵', + '讀' => '讀', + '拏' => 'æ‹', + '樂' => '樂', + 'ï¥' => '諾', + '丹' => '丹', + '寧' => '寧', + '怒' => '怒', + '率' => '率', + '異' => 'ç•°', + '北' => '北', + '磻' => '磻', + '便' => '便', + '復' => '復', + '不' => 'ä¸', + '泌' => '泌', + '數' => '數', + '索' => 'ç´¢', + '參' => 'åƒ', + '塞' => '塞', + '省' => 'çœ', + '葉' => '葉', + '說' => '說', + '殺' => '殺', + '辰' => 'è¾°', + '沈' => '沈', + '拾' => '拾', + '若' => 'è‹¥', + '掠' => '掠', + '略' => 'ç•¥', + '亮' => '亮', + '兩' => 'å…©', + '凉' => '凉', + '梁' => 'æ¢', + '糧' => 'ç³§', + '良' => '良', + '諒' => 'è«’', + '量' => 'é‡', + '勵' => '勵', + '呂' => 'å‘‚', + 'ï¦' => '女', + '廬' => '廬', + '旅' => 'æ—…', + '濾' => '濾', + '礪' => '礪', + '閭' => 'é–­', + '驪' => '驪', + '麗' => '麗', + '黎' => '黎', + '力' => '力', + '曆' => '曆', + '歷' => 'æ­·', + 'ï¦' => 'è½¢', + '年' => 'å¹´', + 'ï¦' => 'æ†', + 'ï¦' => '戀', + '撚' => 'æ’š', + '漣' => 'æ¼£', + '煉' => 'ç…‰', + '璉' => 'ç’‰', + '秊' => 'ç§Š', + '練' => 'ç·´', + '聯' => 'è¯', + '輦' => '輦', + '蓮' => 'è“®', + '連' => '連', + '鍊' => 'éŠ', + '列' => '列', + 'ï¦' => '劣', + '咽' => 'å’½', + '烈' => '烈', + '裂' => '裂', + '說' => '說', + '廉' => '廉', + '念' => '念', + '捻' => 'æ»', + '殮' => 'æ®®', + '簾' => 'ç°¾', + '獵' => 'çµ', + '令' => '令', + '囹' => '囹', + '寧' => '寧', + '嶺' => '嶺', + '怜' => '怜', + '玲' => '玲', + '瑩' => 'ç‘©', + '羚' => '羚', + '聆' => 'è†', + '鈴' => '鈴', + '零' => 'é›¶', + '靈' => 'éˆ', + '領' => 'é ˜', + '例' => '例', + '禮' => '禮', + '醴' => '醴', + '隸' => '隸', + '惡' => '惡', + '了' => '了', + '僚' => '僚', + '寮' => '寮', + '尿' => 'å°¿', + '料' => 'æ–™', + '樂' => '樂', + 'ï§€' => '燎', + 'ï§' => '療', + 'ï§‚' => '蓼', + '遼' => 'é¼', + 'ï§„' => 'é¾', + 'ï§…' => '暈', + '阮' => '阮', + '劉' => '劉', + '杻' => 'æ»', + '柳' => '柳', + 'ï§Š' => 'æµ', + 'ï§‹' => '溜', + 'ï§Œ' => 'ç‰', + 'ï§' => 'ç•™', + 'ï§Ž' => 'ç¡«', + 'ï§' => 'ç´', + 'ï§' => '類', + 'ï§‘' => 'å…­', + 'ï§’' => '戮', + 'ï§“' => '陸', + 'ï§”' => '倫', + 'ï§•' => 'å´™', + 'ï§–' => 'æ·ª', + 'ï§—' => '輪', + '律' => '律', + 'ï§™' => 'æ…„', + 'ï§š' => 'æ —', + 'ï§›' => '率', + 'ï§œ' => '隆', + 'ï§' => '利', + 'ï§ž' => 'å', + 'ï§Ÿ' => 'å±¥', + 'ï§ ' => '易', + 'ï§¡' => 'æŽ', + 'ï§¢' => '梨', + 'ï§£' => 'æ³¥', + '理' => 'ç†', + 'ï§¥' => 'ç—¢', + '罹' => 'ç½¹', + 'ï§§' => 'è£', + '裡' => '裡', + 'ï§©' => '里', + '離' => '離', + 'ï§«' => '匿', + '溺' => '溺', + 'ï§­' => 'å', + 'ï§®' => 'ç‡', + '璘' => 'ç’˜', + 'ï§°' => 'è—º', + 'ï§±' => '隣', + 'ï§²' => 'é±—', + 'ï§³' => '麟', + 'ï§´' => 'æž—', + 'ï§µ' => 'æ·‹', + 'ï§¶' => '臨', + 'ï§·' => 'ç«‹', + '笠' => '笠', + 'ï§¹' => 'ç²’', + '狀' => 'ç‹€', + 'ï§»' => 'ç‚™', + 'ï§¼' => 'è­˜', + 'ï§½' => '什', + 'ï§¾' => '茶', + 'ï§¿' => '刺', + '切' => '切', + 'ï¨' => '度', + '拓' => 'æ‹“', + '糖' => 'ç³–', + '宅' => 'å®…', + '洞' => 'æ´ž', + '暴' => 'æš´', + '輻' => 'è¼»', + '行' => '行', + '降' => 'é™', + '見' => '見', + '廓' => '廓', + '兀' => 'å…€', + 'ï¨' => 'å—€', + '﨎' => '', + 'ï¨' => '', + 'ï¨' => '塚', + '﨑' => '', + '晴' => 'æ™´', + '﨓' => '', + '﨔' => '', + '凞' => '凞', + '猪' => '猪', + '益' => '益', + '礼' => '礼', + '神' => '神', + '祥' => '祥', + '福' => 'ç¦', + '靖' => 'é–', + 'ï¨' => 'ç²¾', + '羽' => 'ç¾½', + '﨟' => '', + '蘒' => '蘒', + '﨡' => '', + '諸' => '諸', + '﨣' => '', + '﨤' => '', + '逸' => '逸', + '都' => '都', + '﨧' => '', + '﨨' => '', + '﨩' => '', + '飯' => '飯', + '飼' => '飼', + '館' => '館', + '鶴' => 'é¶´', + '郞' => '郞', + '隷' => 'éš·', + '侮' => 'ä¾®', + '僧' => '僧', + '免' => 'å…', + '勉' => '勉', + '勤' => '勤', + '卑' => 'å‘', + '喝' => 'å–', + '嘆' => '嘆', + '器' => '器', + '塀' => 'å¡€', + '墨' => '墨', + '層' => '層', + '屮' => 'å±®', + '悔' => 'æ‚”', + '慨' => 'æ…¨', + '憎' => '憎', + 'ï©€' => '懲', + 'ï©' => 'æ•', + 'ï©‚' => 'æ—¢', + '暑' => 'æš‘', + 'ï©„' => '梅', + 'ï©…' => 'æµ·', + '渚' => '渚', + '漢' => 'æ¼¢', + '煮' => 'ç…®', + '爫' => '爫', + '琢' => 'ç¢', + 'ï©‹' => '碑', + '社' => '社', + 'ï©' => '祉', + '祈' => '祈', + 'ï©' => 'ç¥', + 'ï©' => '祖', + 'ï©‘' => 'ç¥', + 'ï©’' => 'ç¦', + 'ï©“' => '禎', + 'ï©”' => 'ç©€', + 'ï©•' => 'çª', + 'ï©–' => '節', + 'ï©—' => 'ç·´', + '縉' => '縉', + 'ï©™' => 'ç¹', + '署' => 'ç½²', + 'ï©›' => '者', + '臭' => '臭', + 'ï©' => '艹', + '艹' => '艹', + '著' => 'è‘—', + 'ï© ' => 'è¤', + 'ï©¡' => '視', + 'ï©¢' => 'è¬', + 'ï©£' => '謹', + '賓' => '賓', + 'ï©¥' => 'è´ˆ', + '辶' => 'è¾¶', + 'ï©§' => '逸', + '難' => '難', + 'ï©©' => '響', + '頻' => 'é »', + 'ï©«' => 'æµ', + '𤋮' => '𤋮', + 'ï©­' => '舘', + 'ï©°' => '並', + '况' => '况', + '全' => 'å…¨', + '侀' => 'ä¾€', + 'ï©´' => 'å……', + '冀' => '冀', + 'ï©¶' => '勇', + 'ï©·' => '勺', + '喝' => 'å–', + '啕' => 'å••', + '喙' => 'å–™', + 'ï©»' => 'å—¢', + '塚' => '塚', + '墳' => '墳', + '奄' => '奄', + 'ï©¿' => '奔', + '婢' => 'å©¢', + 'ïª' => '嬨', + '廒' => 'å»’', + '廙' => 'å»™', + '彩' => '彩', + '徭' => 'å¾­', + '惘' => '惘', + '慎' => 'æ…Ž', + '愈' => '愈', + '憎' => '憎', + '慠' => 'æ… ', + '懲' => '懲', + '戴' => '戴', + 'ïª' => 'æ„', + '搜' => 'æœ', + 'ïª' => 'æ‘’', + 'ïª' => 'æ•–', + '晴' => 'æ™´', + '朗' => '朗', + '望' => '望', + '杖' => 'æ–', + '歹' => 'æ­¹', + '殺' => '殺', + '流' => 'æµ', + '滛' => 'æ»›', + '滋' => '滋', + '漢' => 'æ¼¢', + '瀞' => '瀞', + '煮' => 'ç…®', + 'ïª' => 'çž§', + '爵' => '爵', + '犯' => '犯', + '猪' => '猪', + '瑱' => '瑱', + '甆' => '甆', + '画' => 'ç”»', + '瘝' => 'ç˜', + '瘟' => '瘟', + '益' => '益', + '盛' => 'ç››', + '直' => 'ç›´', + '睊' => 'çŠ', + '着' => 'ç€', + '磌' => '磌', + '窱' => '窱', + '節' => '節', + '类' => 'ç±»', + '絛' => 'çµ›', + '練' => 'ç·´', + '缾' => 'ç¼¾', + '者' => '者', + '荒' => 'è’', + '華' => 'è¯', + '蝹' => 'è¹', + '襁' => 'è¥', + '覆' => '覆', + '視' => '視', + '調' => '調', + '諸' => '諸', + '請' => 'è«‹', + '謁' => 'è¬', + '諾' => '諾', + '諭' => 'è«­', + '謹' => '謹', + 'ï«€' => '變', + 'ï«' => 'è´ˆ', + 'ï«‚' => '輸', + '遲' => 'é²', + 'ï«„' => '醙', + 'ï«…' => '鉶', + '陼' => '陼', + '難' => '難', + '靖' => 'é–', + '韛' => '韛', + '響' => '響', + 'ï«‹' => 'é ‹', + '頻' => 'é »', + 'ï«' => '鬒', + '龜' => '龜', + 'ï«' => '𢡊', + 'ï«' => '𢡄', + 'ï«‘' => 'ð£•', + 'ï«’' => 'ã®', + 'ï«“' => '䀘', + 'ï«”' => '䀹', + 'ï«•' => '𥉉', + 'ï«–' => 'ð¥³', + 'ï«—' => '𧻓', + '齃' => '齃', + 'ï«™' => '龎', + 'ff' => 'ff', + 'ï¬' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'Å¿t', + 'st' => 'st', + 'ﬓ' => 'Õ´Õ¶', + 'ﬔ' => 'Õ´Õ¥', + 'ﬕ' => 'Õ´Õ«', + 'ﬖ' => 'Õ¾Õ¶', + 'ﬗ' => 'Õ´Õ­', + 'ﬠ' => '×¢', + 'ﬡ' => '×', + 'ﬢ' => 'ד', + 'ﬣ' => '×”', + 'ﬤ' => '×›', + 'ﬥ' => 'ל', + 'ﬦ' => '×', + 'ﬧ' => 'ר', + 'ﬨ' => 'ת', + '﬩' => '+', + 'ï­' => '×ל', + '﹉' => '‾', + '﹊' => '‾', + '﹋' => '‾', + '﹌' => '‾', + 'ï¹' => '_', + '﹎' => '_', + 'ï¹' => '_', + 'ï¹' => ',', + '﹑' => 'ã€', + 'ï¹’' => '.', + 'ï¹”' => ';', + '﹕' => ':', + 'ï¹–' => '?', + 'ï¹—' => '!', + '﹘' => '—', + 'ï¹™' => '(', + '﹚' => ')', + 'ï¹›' => '{', + '﹜' => '}', + 'ï¹' => '〔', + '﹞' => '〕', + '﹟' => '#', + 'ï¹ ' => '&', + '﹡' => '*', + 'ï¹¢' => '+', + 'ï¹£' => '-', + '﹤' => '<', + 'ï¹¥' => '>', + '﹦' => '=', + '﹨' => '\\', + '﹩' => '$', + '﹪' => '%', + '﹫' => '@', + 'ï¼' => '!', + '"' => '"', + '#' => '#', + '$' => '$', + 'ï¼…' => '%', + '&' => '&', + ''' => '\'', + '(' => '(', + ')' => ')', + '*' => '*', + '+' => '+', + ',' => ',', + 'ï¼' => '-', + '.' => '.', + 'ï¼' => '/', + 'ï¼' => '0', + '1' => '1', + 'ï¼’' => '2', + '3' => '3', + 'ï¼”' => '4', + '5' => '5', + 'ï¼–' => '6', + 'ï¼—' => '7', + '8' => '8', + 'ï¼™' => '9', + ':' => ':', + 'ï¼›' => ';', + '<' => '<', + 'ï¼' => '=', + '>' => '>', + '?' => '?', + 'ï¼ ' => '@', + 'A' => 'A', + 'ï¼¢' => 'B', + 'ï¼£' => 'C', + 'D' => 'D', + 'ï¼¥' => 'E', + 'F' => 'F', + 'ï¼§' => 'G', + 'H' => 'H', + 'I' => 'I', + 'J' => 'J', + 'K' => 'K', + 'L' => 'L', + 'ï¼­' => 'M', + 'ï¼®' => 'N', + 'O' => 'O', + 'ï¼°' => 'P', + 'ï¼±' => 'Q', + 'ï¼²' => 'R', + 'ï¼³' => 'S', + 'ï¼´' => 'T', + 'ï¼µ' => 'U', + 'ï¼¶' => 'V', + 'ï¼·' => 'W', + 'X' => 'X', + 'ï¼¹' => 'Y', + 'Z' => 'Z', + 'ï¼»' => '[', + 'ï¼¼' => '\\', + 'ï¼½' => ']', + 'ï¼¾' => '^', + '_' => '_', + 'ï½€' => '`', + 'ï½' => 'a', + 'b' => 'b', + 'c' => 'c', + 'd' => 'd', + 'ï½…' => 'e', + 'f' => 'f', + 'g' => 'g', + 'h' => 'h', + 'i' => 'i', + 'j' => 'j', + 'k' => 'k', + 'l' => 'l', + 'ï½' => 'm', + 'n' => 'n', + 'ï½' => 'o', + 'ï½' => 'p', + 'q' => 'q', + 'ï½’' => 'r', + 's' => 's', + 'ï½”' => 't', + 'u' => 'u', + 'ï½–' => 'v', + 'ï½—' => 'w', + 'x' => 'x', + 'ï½™' => 'y', + 'z' => 'z', + 'ï½›' => '{', + '|' => '|', + 'ï½' => '}', + '~' => '~', + '⦅' => '⦅', + 'ï½ ' => '⦆', + '。' => '。', + 'ï½¢' => '「', + 'ï½£' => 'ã€', + '、' => 'ã€', + 'ï½¥' => '・', + 'ヲ' => 'ヲ', + 'ï½§' => 'ã‚¡', + 'ィ' => 'ã‚£', + 'ゥ' => 'ã‚¥', + 'ェ' => 'ã‚§', + 'ォ' => 'ã‚©', + 'ャ' => 'ャ', + 'ï½­' => 'ュ', + 'ï½®' => 'ョ', + 'ッ' => 'ッ', + 'ï½°' => 'ー', + 'ï½±' => 'ã‚¢', + 'ï½²' => 'イ', + 'ï½³' => 'ウ', + 'ï½´' => 'エ', + 'ï½µ' => 'オ', + 'ï½¶' => 'ã‚«', + 'ï½·' => 'ã‚­', + 'ク' => 'ク', + 'ï½¹' => 'ケ', + 'コ' => 'コ', + 'ï½»' => 'サ', + 'ï½¼' => 'ã‚·', + 'ï½½' => 'ス', + 'ï½¾' => 'ã‚»', + 'ソ' => 'ソ', + 'ï¾€' => 'ã‚¿', + 'ï¾' => 'ãƒ', + 'ツ' => 'ツ', + 'テ' => 'テ', + 'ト' => 'ト', + 'ï¾…' => 'ナ', + 'ニ' => 'ニ', + 'ヌ' => 'ヌ', + 'ネ' => 'ãƒ', + 'ノ' => 'ノ', + 'ハ' => 'ãƒ', + 'ヒ' => 'ヒ', + 'フ' => 'フ', + 'ï¾' => 'ヘ', + 'ホ' => 'ホ', + 'ï¾' => 'マ', + 'ï¾' => 'ミ', + 'ム' => 'ム', + 'ï¾’' => 'メ', + 'モ' => 'モ', + 'ï¾”' => 'ヤ', + 'ユ' => 'ユ', + 'ï¾–' => 'ヨ', + 'ï¾—' => 'ラ', + 'リ' => 'リ', + 'ï¾™' => 'ル', + 'レ' => 'レ', + 'ï¾›' => 'ロ', + 'ワ' => 'ワ', + 'ï¾' => 'ン', + '゙' => 'ã‚™', + '゚' => '゚', + 'ï¾ ' => 'ã…¤', + 'ᄀ' => 'ㄱ', + 'ï¾¢' => 'ㄲ', + 'ï¾£' => 'ㄳ', + 'ᄂ' => 'ã„´', + 'ï¾¥' => 'ㄵ', + 'ᆭ' => 'ã„¶', + 'ï¾§' => 'ã„·', + 'ᄄ' => 'ㄸ', + 'ᄅ' => 'ㄹ', + 'ᆰ' => 'ㄺ', + 'ᆱ' => 'ã„»', + 'ᆲ' => 'ㄼ', + 'ï¾­' => 'ㄽ', + 'ï¾®' => 'ㄾ', + 'ᆵ' => 'ã„¿', + 'ï¾°' => 'ã…€', + 'ï¾±' => 'ã…', + 'ï¾²' => 'ã…‚', + 'ï¾³' => 'ã…ƒ', + 'ï¾´' => 'ã…„', + 'ï¾µ' => 'ã……', + 'ï¾¶' => 'ã…†', + 'ï¾·' => 'ã…‡', + 'ᄌ' => 'ã…ˆ', + 'ï¾¹' => 'ã…‰', + 'ᄎ' => 'ã…Š', + 'ï¾»' => 'ã…‹', + 'ï¾¼' => 'ã…Œ', + 'ï¾½' => 'ã…', + 'ï¾¾' => 'ã…Ž', + 'ï¿‚' => 'ã…', + 'ᅢ' => 'ã…', + 'ï¿„' => 'ã…‘', + 'ï¿…' => 'ã…’', + 'ᅥ' => 'ã…“', + 'ᅦ' => 'ã…”', + 'ᅧ' => 'ã…•', + 'ï¿‹' => 'ã…–', + 'ᅩ' => 'ã…—', + 'ï¿' => 'ã…˜', + 'ᅫ' => 'ã…™', + 'ï¿' => 'ã…š', + 'ï¿’' => 'ã…›', + 'ï¿“' => 'ã…œ', + 'ï¿”' => 'ã…', + 'ï¿•' => 'ã…ž', + 'ï¿–' => 'ã…Ÿ', + 'ï¿—' => 'ã… ', + 'ᅳ' => 'ã…¡', + 'ï¿›' => 'ã…¢', + 'ᅵ' => 'ã…£', + 'ï¿ ' => '¢', + 'ï¿¡' => '£', + 'ï¿¢' => '¬', + 'ï¿£' => '¯', + '¦' => '¦', + 'ï¿¥' => 'Â¥', + '₩' => 'â‚©', + '│' => '│', + 'ï¿©' => 'â†', + '↑' => '↑', + 'ï¿«' => '→', + '↓' => '↓', + 'ï¿­' => 'â– ', + 'ï¿®' => 'â—‹', + 'ð€' => 'A', + 'ð' => 'B', + 'ð‚' => 'C', + 'ðƒ' => 'D', + 'ð„' => 'E', + 'ð…' => 'F', + 'ð†' => 'G', + 'ð‡' => 'H', + 'ðˆ' => 'I', + 'ð‰' => 'J', + 'ðŠ' => 'K', + 'ð‹' => 'L', + 'ðŒ' => 'M', + 'ð' => 'N', + 'ðŽ' => 'O', + 'ð' => 'P', + 'ð' => 'Q', + 'ð‘' => 'R', + 'ð’' => 'S', + 'ð“' => 'T', + 'ð”' => 'U', + 'ð•' => 'V', + 'ð–' => 'W', + 'ð—' => 'X', + 'ð˜' => 'Y', + 'ð™' => 'Z', + 'ðš' => 'a', + 'ð›' => 'b', + 'ðœ' => 'c', + 'ð' => 'd', + 'ðž' => 'e', + 'ðŸ' => 'f', + 'ð ' => 'g', + 'ð¡' => 'h', + 'ð¢' => 'i', + 'ð£' => 'j', + 'ð¤' => 'k', + 'ð¥' => 'l', + 'ð¦' => 'm', + 'ð§' => 'n', + 'ð¨' => 'o', + 'ð©' => 'p', + 'ðª' => 'q', + 'ð«' => 'r', + 'ð¬' => 's', + 'ð­' => 't', + 'ð®' => 'u', + 'ð¯' => 'v', + 'ð°' => 'w', + 'ð±' => 'x', + 'ð²' => 'y', + 'ð³' => 'z', + 'ð´' => 'A', + 'ðµ' => 'B', + 'ð¶' => 'C', + 'ð·' => 'D', + 'ð¸' => 'E', + 'ð¹' => 'F', + 'ðº' => 'G', + 'ð»' => 'H', + 'ð¼' => 'I', + 'ð½' => 'J', + 'ð¾' => 'K', + 'ð¿' => 'L', + 'ð‘€' => 'M', + 'ð‘' => 'N', + 'ð‘‚' => 'O', + 'ð‘ƒ' => 'P', + 'ð‘„' => 'Q', + 'ð‘…' => 'R', + 'ð‘†' => 'S', + 'ð‘‡' => 'T', + 'ð‘ˆ' => 'U', + 'ð‘‰' => 'V', + 'ð‘Š' => 'W', + 'ð‘‹' => 'X', + 'ð‘Œ' => 'Y', + 'ð‘' => 'Z', + 'ð‘Ž' => 'a', + 'ð‘' => 'b', + 'ð‘' => 'c', + 'ð‘‘' => 'd', + 'ð‘’' => 'e', + 'ð‘“' => 'f', + 'ð‘”' => 'g', + 'ð‘–' => 'i', + 'ð‘—' => 'j', + 'ð‘˜' => 'k', + 'ð‘™' => 'l', + 'ð‘š' => 'm', + 'ð‘›' => 'n', + 'ð‘œ' => 'o', + 'ð‘' => 'p', + 'ð‘ž' => 'q', + 'ð‘Ÿ' => 'r', + 'ð‘ ' => 's', + 'ð‘¡' => 't', + 'ð‘¢' => 'u', + 'ð‘£' => 'v', + 'ð‘¤' => 'w', + 'ð‘¥' => 'x', + 'ð‘¦' => 'y', + 'ð‘§' => 'z', + 'ð‘¨' => 'A', + 'ð‘©' => 'B', + 'ð‘ª' => 'C', + 'ð‘«' => 'D', + 'ð‘¬' => 'E', + 'ð‘­' => 'F', + 'ð‘®' => 'G', + 'ð‘¯' => 'H', + 'ð‘°' => 'I', + 'ð‘±' => 'J', + 'ð‘²' => 'K', + 'ð‘³' => 'L', + 'ð‘´' => 'M', + 'ð‘µ' => 'N', + 'ð‘¶' => 'O', + 'ð‘·' => 'P', + 'ð‘¸' => 'Q', + 'ð‘¹' => 'R', + 'ð‘º' => 'S', + 'ð‘»' => 'T', + 'ð‘¼' => 'U', + 'ð‘½' => 'V', + 'ð‘¾' => 'W', + 'ð‘¿' => 'X', + 'ð’€' => 'Y', + 'ð’' => 'Z', + 'ð’‚' => 'a', + 'ð’ƒ' => 'b', + 'ð’„' => 'c', + 'ð’…' => 'd', + 'ð’†' => 'e', + 'ð’‡' => 'f', + 'ð’ˆ' => 'g', + 'ð’‰' => 'h', + 'ð’Š' => 'i', + 'ð’‹' => 'j', + 'ð’Œ' => 'k', + 'ð’' => 'l', + 'ð’Ž' => 'm', + 'ð’' => 'n', + 'ð’' => 'o', + 'ð’‘' => 'p', + 'ð’’' => 'q', + 'ð’“' => 'r', + 'ð’”' => 's', + 'ð’•' => 't', + 'ð’–' => 'u', + 'ð’—' => 'v', + 'ð’˜' => 'w', + 'ð’™' => 'x', + 'ð’š' => 'y', + 'ð’›' => 'z', + 'ð’œ' => 'A', + 'ð’ž' => 'C', + 'ð’Ÿ' => 'D', + 'ð’¢' => 'G', + 'ð’¥' => 'J', + 'ð’¦' => 'K', + 'ð’©' => 'N', + 'ð’ª' => 'O', + 'ð’«' => 'P', + 'ð’¬' => 'Q', + 'ð’®' => 'S', + 'ð’¯' => 'T', + 'ð’°' => 'U', + 'ð’±' => 'V', + 'ð’²' => 'W', + 'ð’³' => 'X', + 'ð’´' => 'Y', + 'ð’µ' => 'Z', + 'ð’¶' => 'a', + 'ð’·' => 'b', + 'ð’¸' => 'c', + 'ð’¹' => 'd', + 'ð’»' => 'f', + 'ð’½' => 'h', + 'ð’¾' => 'i', + 'ð’¿' => 'j', + 'ð“€' => 'k', + 'ð“' => 'l', + 'ð“‚' => 'm', + 'ð“ƒ' => 'n', + 'ð“…' => 'p', + 'ð“†' => 'q', + 'ð“‡' => 'r', + 'ð“ˆ' => 's', + 'ð“‰' => 't', + 'ð“Š' => 'u', + 'ð“‹' => 'v', + 'ð“Œ' => 'w', + 'ð“' => 'x', + 'ð“Ž' => 'y', + 'ð“' => 'z', + 'ð“' => 'A', + 'ð“‘' => 'B', + 'ð“’' => 'C', + 'ð““' => 'D', + 'ð“”' => 'E', + 'ð“•' => 'F', + 'ð“–' => 'G', + 'ð“—' => 'H', + 'ð“˜' => 'I', + 'ð“™' => 'J', + 'ð“š' => 'K', + 'ð“›' => 'L', + 'ð“œ' => 'M', + 'ð“' => 'N', + 'ð“ž' => 'O', + 'ð“Ÿ' => 'P', + 'ð“ ' => 'Q', + 'ð“¡' => 'R', + 'ð“¢' => 'S', + 'ð“£' => 'T', + 'ð“¤' => 'U', + 'ð“¥' => 'V', + 'ð“¦' => 'W', + 'ð“§' => 'X', + 'ð“¨' => 'Y', + 'ð“©' => 'Z', + 'ð“ª' => 'a', + 'ð“«' => 'b', + 'ð“¬' => 'c', + 'ð“­' => 'd', + 'ð“®' => 'e', + 'ð“¯' => 'f', + 'ð“°' => 'g', + 'ð“±' => 'h', + 'ð“²' => 'i', + 'ð“³' => 'j', + 'ð“´' => 'k', + 'ð“µ' => 'l', + 'ð“¶' => 'm', + 'ð“·' => 'n', + 'ð“¸' => 'o', + 'ð“¹' => 'p', + 'ð“º' => 'q', + 'ð“»' => 'r', + 'ð“¼' => 's', + 'ð“½' => 't', + 'ð“¾' => 'u', + 'ð“¿' => 'v', + 'ð”€' => 'w', + 'ð”' => 'x', + 'ð”‚' => 'y', + 'ð”ƒ' => 'z', + 'ð”„' => 'A', + 'ð”…' => 'B', + 'ð”‡' => 'D', + 'ð”ˆ' => 'E', + 'ð”‰' => 'F', + 'ð”Š' => 'G', + 'ð”' => 'J', + 'ð”Ž' => 'K', + 'ð”' => 'L', + 'ð”' => 'M', + 'ð”‘' => 'N', + 'ð”’' => 'O', + 'ð”“' => 'P', + 'ð””' => 'Q', + 'ð”–' => 'S', + 'ð”—' => 'T', + 'ð”˜' => 'U', + 'ð”™' => 'V', + 'ð”š' => 'W', + 'ð”›' => 'X', + 'ð”œ' => 'Y', + 'ð”ž' => 'a', + 'ð”Ÿ' => 'b', + 'ð” ' => 'c', + 'ð”¡' => 'd', + 'ð”¢' => 'e', + 'ð”£' => 'f', + 'ð”¤' => 'g', + 'ð”¥' => 'h', + 'ð”¦' => 'i', + 'ð”§' => 'j', + 'ð”¨' => 'k', + 'ð”©' => 'l', + 'ð”ª' => 'm', + 'ð”«' => 'n', + 'ð”¬' => 'o', + 'ð”­' => 'p', + 'ð”®' => 'q', + 'ð”¯' => 'r', + 'ð”°' => 's', + 'ð”±' => 't', + 'ð”²' => 'u', + 'ð”³' => 'v', + 'ð”´' => 'w', + 'ð”µ' => 'x', + 'ð”¶' => 'y', + 'ð”·' => 'z', + 'ð”¸' => 'A', + 'ð”¹' => 'B', + 'ð”»' => 'D', + 'ð”¼' => 'E', + 'ð”½' => 'F', + 'ð”¾' => 'G', + 'ð•€' => 'I', + 'ð•' => 'J', + 'ð•‚' => 'K', + 'ð•ƒ' => 'L', + 'ð•„' => 'M', + 'ð•†' => 'O', + 'ð•Š' => 'S', + 'ð•‹' => 'T', + 'ð•Œ' => 'U', + 'ð•' => 'V', + 'ð•Ž' => 'W', + 'ð•' => 'X', + 'ð•' => 'Y', + 'ð•’' => 'a', + 'ð•“' => 'b', + 'ð•”' => 'c', + 'ð••' => 'd', + 'ð•–' => 'e', + 'ð•—' => 'f', + 'ð•˜' => 'g', + 'ð•™' => 'h', + 'ð•š' => 'i', + 'ð•›' => 'j', + 'ð•œ' => 'k', + 'ð•' => 'l', + 'ð•ž' => 'm', + 'ð•Ÿ' => 'n', + 'ð• ' => 'o', + 'ð•¡' => 'p', + 'ð•¢' => 'q', + 'ð•£' => 'r', + 'ð•¤' => 's', + 'ð•¥' => 't', + 'ð•¦' => 'u', + 'ð•§' => 'v', + 'ð•¨' => 'w', + 'ð•©' => 'x', + 'ð•ª' => 'y', + 'ð•«' => 'z', + 'ð•¬' => 'A', + 'ð•­' => 'B', + 'ð•®' => 'C', + 'ð•¯' => 'D', + 'ð•°' => 'E', + 'ð•±' => 'F', + 'ð•²' => 'G', + 'ð•³' => 'H', + 'ð•´' => 'I', + 'ð•µ' => 'J', + 'ð•¶' => 'K', + 'ð•·' => 'L', + 'ð•¸' => 'M', + 'ð•¹' => 'N', + 'ð•º' => 'O', + 'ð•»' => 'P', + 'ð•¼' => 'Q', + 'ð•½' => 'R', + 'ð•¾' => 'S', + 'ð•¿' => 'T', + 'ð–€' => 'U', + 'ð–' => 'V', + 'ð–‚' => 'W', + 'ð–ƒ' => 'X', + 'ð–„' => 'Y', + 'ð–…' => 'Z', + 'ð–†' => 'a', + 'ð–‡' => 'b', + 'ð–ˆ' => 'c', + 'ð–‰' => 'd', + 'ð–Š' => 'e', + 'ð–‹' => 'f', + 'ð–Œ' => 'g', + 'ð–' => 'h', + 'ð–Ž' => 'i', + 'ð–' => 'j', + 'ð–' => 'k', + 'ð–‘' => 'l', + 'ð–’' => 'm', + 'ð–“' => 'n', + 'ð–”' => 'o', + 'ð–•' => 'p', + 'ð––' => 'q', + 'ð–—' => 'r', + 'ð–˜' => 's', + 'ð–™' => 't', + 'ð–š' => 'u', + 'ð–›' => 'v', + 'ð–œ' => 'w', + 'ð–' => 'x', + 'ð–ž' => 'y', + 'ð–Ÿ' => 'z', + 'ð– ' => 'A', + 'ð–¡' => 'B', + 'ð–¢' => 'C', + 'ð–£' => 'D', + 'ð–¤' => 'E', + 'ð–¥' => 'F', + 'ð–¦' => 'G', + 'ð–§' => 'H', + 'ð–¨' => 'I', + 'ð–©' => 'J', + 'ð–ª' => 'K', + 'ð–«' => 'L', + 'ð–¬' => 'M', + 'ð–­' => 'N', + 'ð–®' => 'O', + 'ð–¯' => 'P', + 'ð–°' => 'Q', + 'ð–±' => 'R', + 'ð–²' => 'S', + 'ð–³' => 'T', + 'ð–´' => 'U', + 'ð–µ' => 'V', + 'ð–¶' => 'W', + 'ð–·' => 'X', + 'ð–¸' => 'Y', + 'ð–¹' => 'Z', + 'ð–º' => 'a', + 'ð–»' => 'b', + 'ð–¼' => 'c', + 'ð–½' => 'd', + 'ð–¾' => 'e', + 'ð–¿' => 'f', + 'ð—€' => 'g', + 'ð—' => 'h', + 'ð—‚' => 'i', + 'ð—ƒ' => 'j', + 'ð—„' => 'k', + 'ð—…' => 'l', + 'ð—†' => 'm', + 'ð—‡' => 'n', + 'ð—ˆ' => 'o', + 'ð—‰' => 'p', + 'ð—Š' => 'q', + 'ð—‹' => 'r', + 'ð—Œ' => 's', + 'ð—' => 't', + 'ð—Ž' => 'u', + 'ð—' => 'v', + 'ð—' => 'w', + 'ð—‘' => 'x', + 'ð—’' => 'y', + 'ð—“' => 'z', + 'ð—”' => 'A', + 'ð—•' => 'B', + 'ð—–' => 'C', + 'ð——' => 'D', + 'ð—˜' => 'E', + 'ð—™' => 'F', + 'ð—š' => 'G', + 'ð—›' => 'H', + 'ð—œ' => 'I', + 'ð—' => 'J', + 'ð—ž' => 'K', + 'ð—Ÿ' => 'L', + 'ð— ' => 'M', + 'ð—¡' => 'N', + 'ð—¢' => 'O', + 'ð—£' => 'P', + 'ð—¤' => 'Q', + 'ð—¥' => 'R', + 'ð—¦' => 'S', + 'ð—§' => 'T', + 'ð—¨' => 'U', + 'ð—©' => 'V', + 'ð—ª' => 'W', + 'ð—«' => 'X', + 'ð—¬' => 'Y', + 'ð—­' => 'Z', + 'ð—®' => 'a', + 'ð—¯' => 'b', + 'ð—°' => 'c', + 'ð—±' => 'd', + 'ð—²' => 'e', + 'ð—³' => 'f', + 'ð—´' => 'g', + 'ð—µ' => 'h', + 'ð—¶' => 'i', + 'ð—·' => 'j', + 'ð—¸' => 'k', + 'ð—¹' => 'l', + 'ð—º' => 'm', + 'ð—»' => 'n', + 'ð—¼' => 'o', + 'ð—½' => 'p', + 'ð—¾' => 'q', + 'ð—¿' => 'r', + 'ð˜€' => 's', + 'ð˜' => 't', + 'ð˜‚' => 'u', + 'ð˜ƒ' => 'v', + 'ð˜„' => 'w', + 'ð˜…' => 'x', + 'ð˜†' => 'y', + 'ð˜‡' => 'z', + 'ð˜ˆ' => 'A', + 'ð˜‰' => 'B', + 'ð˜Š' => 'C', + 'ð˜‹' => 'D', + 'ð˜Œ' => 'E', + 'ð˜' => 'F', + 'ð˜Ž' => 'G', + 'ð˜' => 'H', + 'ð˜' => 'I', + 'ð˜‘' => 'J', + 'ð˜’' => 'K', + 'ð˜“' => 'L', + 'ð˜”' => 'M', + 'ð˜•' => 'N', + 'ð˜–' => 'O', + 'ð˜—' => 'P', + 'ð˜˜' => 'Q', + 'ð˜™' => 'R', + 'ð˜š' => 'S', + 'ð˜›' => 'T', + 'ð˜œ' => 'U', + 'ð˜' => 'V', + 'ð˜ž' => 'W', + 'ð˜Ÿ' => 'X', + 'ð˜ ' => 'Y', + 'ð˜¡' => 'Z', + 'ð˜¢' => 'a', + 'ð˜£' => 'b', + 'ð˜¤' => 'c', + 'ð˜¥' => 'd', + 'ð˜¦' => 'e', + 'ð˜§' => 'f', + 'ð˜¨' => 'g', + 'ð˜©' => 'h', + 'ð˜ª' => 'i', + 'ð˜«' => 'j', + 'ð˜¬' => 'k', + 'ð˜­' => 'l', + 'ð˜®' => 'm', + 'ð˜¯' => 'n', + 'ð˜°' => 'o', + 'ð˜±' => 'p', + 'ð˜²' => 'q', + 'ð˜³' => 'r', + 'ð˜´' => 's', + 'ð˜µ' => 't', + 'ð˜¶' => 'u', + 'ð˜·' => 'v', + 'ð˜¸' => 'w', + 'ð˜¹' => 'x', + 'ð˜º' => 'y', + 'ð˜»' => 'z', + 'ð˜¼' => 'A', + 'ð˜½' => 'B', + 'ð˜¾' => 'C', + 'ð˜¿' => 'D', + 'ð™€' => 'E', + 'ð™' => 'F', + 'ð™‚' => 'G', + 'ð™ƒ' => 'H', + 'ð™„' => 'I', + 'ð™…' => 'J', + 'ð™†' => 'K', + 'ð™‡' => 'L', + 'ð™ˆ' => 'M', + 'ð™‰' => 'N', + 'ð™Š' => 'O', + 'ð™‹' => 'P', + 'ð™Œ' => 'Q', + 'ð™' => 'R', + 'ð™Ž' => 'S', + 'ð™' => 'T', + 'ð™' => 'U', + 'ð™‘' => 'V', + 'ð™’' => 'W', + 'ð™“' => 'X', + 'ð™”' => 'Y', + 'ð™•' => 'Z', + 'ð™–' => 'a', + 'ð™—' => 'b', + 'ð™˜' => 'c', + 'ð™™' => 'd', + 'ð™š' => 'e', + 'ð™›' => 'f', + 'ð™œ' => 'g', + 'ð™' => 'h', + 'ð™ž' => 'i', + 'ð™Ÿ' => 'j', + 'ð™ ' => 'k', + 'ð™¡' => 'l', + 'ð™¢' => 'm', + 'ð™£' => 'n', + 'ð™¤' => 'o', + 'ð™¥' => 'p', + 'ð™¦' => 'q', + 'ð™§' => 'r', + 'ð™¨' => 's', + 'ð™©' => 't', + 'ð™ª' => 'u', + 'ð™«' => 'v', + 'ð™¬' => 'w', + 'ð™­' => 'x', + 'ð™®' => 'y', + 'ð™¯' => 'z', + 'ð™°' => 'A', + 'ð™±' => 'B', + 'ð™²' => 'C', + 'ð™³' => 'D', + 'ð™´' => 'E', + 'ð™µ' => 'F', + 'ð™¶' => 'G', + 'ð™·' => 'H', + 'ð™¸' => 'I', + 'ð™¹' => 'J', + 'ð™º' => 'K', + 'ð™»' => 'L', + 'ð™¼' => 'M', + 'ð™½' => 'N', + 'ð™¾' => 'O', + 'ð™¿' => 'P', + 'ðš€' => 'Q', + 'ðš' => 'R', + 'ðš‚' => 'S', + 'ðšƒ' => 'T', + 'ðš„' => 'U', + 'ðš…' => 'V', + 'ðš†' => 'W', + 'ðš‡' => 'X', + 'ðšˆ' => 'Y', + 'ðš‰' => 'Z', + 'ðšŠ' => 'a', + 'ðš‹' => 'b', + 'ðšŒ' => 'c', + 'ðš' => 'd', + 'ðšŽ' => 'e', + 'ðš' => 'f', + 'ðš' => 'g', + 'ðš‘' => 'h', + 'ðš’' => 'i', + 'ðš“' => 'j', + 'ðš”' => 'k', + 'ðš•' => 'l', + 'ðš–' => 'm', + 'ðš—' => 'n', + 'ðš˜' => 'o', + 'ðš™' => 'p', + 'ðšš' => 'q', + 'ðš›' => 'r', + 'ðšœ' => 's', + 'ðš' => 't', + 'ðšž' => 'u', + 'ðšŸ' => 'v', + 'ðš ' => 'w', + 'ðš¡' => 'x', + 'ðš¢' => 'y', + 'ðš£' => 'z', + 'ðš¤' => 'ı', + 'ðš¥' => 'È·', + 'ðš¨' => 'Α', + 'ðš©' => 'Î’', + 'ðšª' => 'Γ', + 'ðš«' => 'Δ', + 'ðš¬' => 'Ε', + 'ðš­' => 'Ζ', + 'ðš®' => 'Η', + 'ðš¯' => 'Θ', + 'ðš°' => 'Ι', + 'ðš±' => 'Κ', + 'ðš²' => 'Λ', + 'ðš³' => 'Μ', + 'ðš´' => 'Î', + 'ðšµ' => 'Ξ', + 'ðš¶' => 'Ο', + 'ðš·' => 'Π', + 'ðš¸' => 'Ρ', + 'ðš¹' => 'Ï´', + 'ðšº' => 'Σ', + 'ðš»' => 'Τ', + 'ðš¼' => 'Î¥', + 'ðš½' => 'Φ', + 'ðš¾' => 'Χ', + 'ðš¿' => 'Ψ', + 'ð›€' => 'Ω', + 'ð›' => '∇', + 'ð›‚' => 'α', + 'ð›ƒ' => 'β', + 'ð›„' => 'γ', + 'ð›…' => 'δ', + 'ð›†' => 'ε', + 'ð›‡' => 'ζ', + 'ð›ˆ' => 'η', + 'ð›‰' => 'θ', + 'ð›Š' => 'ι', + 'ð›‹' => 'κ', + 'ð›Œ' => 'λ', + 'ð›' => 'μ', + 'ð›Ž' => 'ν', + 'ð›' => 'ξ', + 'ð›' => 'ο', + 'ð›‘' => 'Ï€', + 'ð›’' => 'Ï', + 'ð›“' => 'Ï‚', + 'ð›”' => 'σ', + 'ð›•' => 'Ï„', + 'ð›–' => 'Ï…', + 'ð›—' => 'φ', + 'ð›˜' => 'χ', + 'ð›™' => 'ψ', + 'ð›š' => 'ω', + 'ð››' => '∂', + 'ð›œ' => 'ϵ', + 'ð›' => 'Ï‘', + 'ð›ž' => 'ϰ', + 'ð›Ÿ' => 'Ï•', + 'ð› ' => 'ϱ', + 'ð›¡' => 'Ï–', + 'ð›¢' => 'Α', + 'ð›£' => 'Î’', + 'ð›¤' => 'Γ', + 'ð›¥' => 'Δ', + 'ð›¦' => 'Ε', + 'ð›§' => 'Ζ', + 'ð›¨' => 'Η', + 'ð›©' => 'Θ', + 'ð›ª' => 'Ι', + 'ð›«' => 'Κ', + 'ð›¬' => 'Λ', + 'ð›­' => 'Μ', + 'ð›®' => 'Î', + 'ð›¯' => 'Ξ', + 'ð›°' => 'Ο', + 'ð›±' => 'Π', + 'ð›²' => 'Ρ', + 'ð›³' => 'Ï´', + 'ð›´' => 'Σ', + 'ð›µ' => 'Τ', + 'ð›¶' => 'Î¥', + 'ð›·' => 'Φ', + 'ð›¸' => 'Χ', + 'ð›¹' => 'Ψ', + 'ð›º' => 'Ω', + 'ð›»' => '∇', + 'ð›¼' => 'α', + 'ð›½' => 'β', + 'ð›¾' => 'γ', + 'ð›¿' => 'δ', + 'ðœ€' => 'ε', + 'ðœ' => 'ζ', + 'ðœ‚' => 'η', + 'ðœƒ' => 'θ', + 'ðœ„' => 'ι', + 'ðœ…' => 'κ', + 'ðœ†' => 'λ', + 'ðœ‡' => 'μ', + 'ðœˆ' => 'ν', + 'ðœ‰' => 'ξ', + 'ðœŠ' => 'ο', + 'ðœ‹' => 'Ï€', + 'ðœŒ' => 'Ï', + 'ðœ' => 'Ï‚', + 'ðœŽ' => 'σ', + 'ðœ' => 'Ï„', + 'ðœ' => 'Ï…', + 'ðœ‘' => 'φ', + 'ðœ’' => 'χ', + 'ðœ“' => 'ψ', + 'ðœ”' => 'ω', + 'ðœ•' => '∂', + 'ðœ–' => 'ϵ', + 'ðœ—' => 'Ï‘', + 'ðœ˜' => 'ϰ', + 'ðœ™' => 'Ï•', + 'ðœš' => 'ϱ', + 'ðœ›' => 'Ï–', + 'ðœœ' => 'Α', + 'ðœ' => 'Î’', + 'ðœž' => 'Γ', + 'ðœŸ' => 'Δ', + 'ðœ ' => 'Ε', + 'ðœ¡' => 'Ζ', + 'ðœ¢' => 'Η', + 'ðœ£' => 'Θ', + 'ðœ¤' => 'Ι', + 'ðœ¥' => 'Κ', + 'ðœ¦' => 'Λ', + 'ðœ§' => 'Μ', + 'ðœ¨' => 'Î', + 'ðœ©' => 'Ξ', + 'ðœª' => 'Ο', + 'ðœ«' => 'Π', + 'ðœ¬' => 'Ρ', + 'ðœ­' => 'Ï´', + 'ðœ®' => 'Σ', + 'ðœ¯' => 'Τ', + 'ðœ°' => 'Î¥', + 'ðœ±' => 'Φ', + 'ðœ²' => 'Χ', + 'ðœ³' => 'Ψ', + 'ðœ´' => 'Ω', + 'ðœµ' => '∇', + 'ðœ¶' => 'α', + 'ðœ·' => 'β', + 'ðœ¸' => 'γ', + 'ðœ¹' => 'δ', + 'ðœº' => 'ε', + 'ðœ»' => 'ζ', + 'ðœ¼' => 'η', + 'ðœ½' => 'θ', + 'ðœ¾' => 'ι', + 'ðœ¿' => 'κ', + 'ð€' => 'λ', + 'ð' => 'μ', + 'ð‚' => 'ν', + 'ðƒ' => 'ξ', + 'ð„' => 'ο', + 'ð…' => 'Ï€', + 'ð†' => 'Ï', + 'ð‡' => 'Ï‚', + 'ðˆ' => 'σ', + 'ð‰' => 'Ï„', + 'ðŠ' => 'Ï…', + 'ð‹' => 'φ', + 'ðŒ' => 'χ', + 'ð' => 'ψ', + 'ðŽ' => 'ω', + 'ð' => '∂', + 'ð' => 'ϵ', + 'ð‘' => 'Ï‘', + 'ð’' => 'ϰ', + 'ð“' => 'Ï•', + 'ð”' => 'ϱ', + 'ð•' => 'Ï–', + 'ð–' => 'Α', + 'ð—' => 'Î’', + 'ð˜' => 'Γ', + 'ð™' => 'Δ', + 'ðš' => 'Ε', + 'ð›' => 'Ζ', + 'ðœ' => 'Η', + 'ð' => 'Θ', + 'ðž' => 'Ι', + 'ðŸ' => 'Κ', + 'ð ' => 'Λ', + 'ð¡' => 'Μ', + 'ð¢' => 'Î', + 'ð£' => 'Ξ', + 'ð¤' => 'Ο', + 'ð¥' => 'Π', + 'ð¦' => 'Ρ', + 'ð§' => 'Ï´', + 'ð¨' => 'Σ', + 'ð©' => 'Τ', + 'ðª' => 'Î¥', + 'ð«' => 'Φ', + 'ð¬' => 'Χ', + 'ð­' => 'Ψ', + 'ð®' => 'Ω', + 'ð¯' => '∇', + 'ð°' => 'α', + 'ð±' => 'β', + 'ð²' => 'γ', + 'ð³' => 'δ', + 'ð´' => 'ε', + 'ðµ' => 'ζ', + 'ð¶' => 'η', + 'ð·' => 'θ', + 'ð¸' => 'ι', + 'ð¹' => 'κ', + 'ðº' => 'λ', + 'ð»' => 'μ', + 'ð¼' => 'ν', + 'ð½' => 'ξ', + 'ð¾' => 'ο', + 'ð¿' => 'Ï€', + 'ðž€' => 'Ï', + 'ðž' => 'Ï‚', + 'ðž‚' => 'σ', + 'ðžƒ' => 'Ï„', + 'ðž„' => 'Ï…', + 'ðž…' => 'φ', + 'ðž†' => 'χ', + 'ðž‡' => 'ψ', + 'ðžˆ' => 'ω', + 'ðž‰' => '∂', + 'ðžŠ' => 'ϵ', + 'ðž‹' => 'Ï‘', + 'ðžŒ' => 'ϰ', + 'ðž' => 'Ï•', + 'ðžŽ' => 'ϱ', + 'ðž' => 'Ï–', + 'ðž' => 'Α', + 'ðž‘' => 'Î’', + 'ðž’' => 'Γ', + 'ðž“' => 'Δ', + 'ðž”' => 'Ε', + 'ðž•' => 'Ζ', + 'ðž–' => 'Η', + 'ðž—' => 'Θ', + 'ðž˜' => 'Ι', + 'ðž™' => 'Κ', + 'ðžš' => 'Λ', + 'ðž›' => 'Μ', + 'ðžœ' => 'Î', + 'ðž' => 'Ξ', + 'ðžž' => 'Ο', + 'ðžŸ' => 'Π', + 'ðž ' => 'Ρ', + 'ðž¡' => 'Ï´', + 'ðž¢' => 'Σ', + 'ðž£' => 'Τ', + 'ðž¤' => 'Î¥', + 'ðž¥' => 'Φ', + 'ðž¦' => 'Χ', + 'ðž§' => 'Ψ', + 'ðž¨' => 'Ω', + 'ðž©' => '∇', + 'ðžª' => 'α', + 'ðž«' => 'β', + 'ðž¬' => 'γ', + 'ðž­' => 'δ', + 'ðž®' => 'ε', + 'ðž¯' => 'ζ', + 'ðž°' => 'η', + 'ðž±' => 'θ', + 'ðž²' => 'ι', + 'ðž³' => 'κ', + 'ðž´' => 'λ', + 'ðžµ' => 'μ', + 'ðž¶' => 'ν', + 'ðž·' => 'ξ', + 'ðž¸' => 'ο', + 'ðž¹' => 'Ï€', + 'ðžº' => 'Ï', + 'ðž»' => 'Ï‚', + 'ðž¼' => 'σ', + 'ðž½' => 'Ï„', + 'ðž¾' => 'Ï…', + 'ðž¿' => 'φ', + 'ðŸ€' => 'χ', + 'ðŸ' => 'ψ', + 'ðŸ‚' => 'ω', + 'ðŸƒ' => '∂', + 'ðŸ„' => 'ϵ', + 'ðŸ…' => 'Ï‘', + 'ðŸ†' => 'ϰ', + 'ðŸ‡' => 'Ï•', + 'ðŸˆ' => 'ϱ', + 'ðŸ‰' => 'Ï–', + 'ðŸŠ' => 'Ïœ', + 'ðŸ‹' => 'Ï', + 'ðŸŽ' => '0', + 'ðŸ' => '1', + 'ðŸ' => '2', + 'ðŸ‘' => '3', + 'ðŸ’' => '4', + 'ðŸ“' => '5', + 'ðŸ”' => '6', + 'ðŸ•' => '7', + 'ðŸ–' => '8', + 'ðŸ—' => '9', + 'ðŸ˜' => '0', + 'ðŸ™' => '1', + 'ðŸš' => '2', + 'ðŸ›' => '3', + 'ðŸœ' => '4', + 'ðŸ' => '5', + 'ðŸž' => '6', + 'ðŸŸ' => '7', + 'ðŸ ' => '8', + 'ðŸ¡' => '9', + 'ðŸ¢' => '0', + 'ðŸ£' => '1', + 'ðŸ¤' => '2', + 'ðŸ¥' => '3', + 'ðŸ¦' => '4', + 'ðŸ§' => '5', + 'ðŸ¨' => '6', + 'ðŸ©' => '7', + 'ðŸª' => '8', + 'ðŸ«' => '9', + 'ðŸ¬' => '0', + 'ðŸ­' => '1', + 'ðŸ®' => '2', + 'ðŸ¯' => '3', + 'ðŸ°' => '4', + 'ðŸ±' => '5', + 'ðŸ²' => '6', + 'ðŸ³' => '7', + 'ðŸ´' => '8', + 'ðŸµ' => '9', + 'ðŸ¶' => '0', + 'ðŸ·' => '1', + 'ðŸ¸' => '2', + 'ðŸ¹' => '3', + 'ðŸº' => '4', + 'ðŸ»' => '5', + 'ðŸ¼' => '6', + 'ðŸ½' => '7', + 'ðŸ¾' => '8', + 'ðŸ¿' => '9', + '𞸀' => 'ا', + 'ðž¸' => 'ب', + '𞸂' => 'ج', + '𞸃' => 'د', + '𞸅' => 'Ùˆ', + '𞸆' => 'ز', + '𞸇' => 'Ø­', + '𞸈' => 'Ø·', + '𞸉' => 'ÙŠ', + '𞸊' => 'Ùƒ', + '𞸋' => 'Ù„', + '𞸌' => 'Ù…', + 'ðž¸' => 'Ù†', + '𞸎' => 'س', + 'ðž¸' => 'ع', + 'ðž¸' => 'Ù', + '𞸑' => 'ص', + '𞸒' => 'Ù‚', + '𞸓' => 'ر', + '𞸔' => 'Ø´', + '𞸕' => 'ت', + '𞸖' => 'Ø«', + '𞸗' => 'Ø®', + '𞸘' => 'ذ', + '𞸙' => 'ض', + '𞸚' => 'ظ', + '𞸛' => 'غ', + '𞸜' => 'Ù®', + 'ðž¸' => 'Úº', + '𞸞' => 'Ú¡', + '𞸟' => 'Ù¯', + '𞸡' => 'ب', + '𞸢' => 'ج', + '𞸤' => 'Ù‡', + '𞸧' => 'Ø­', + '𞸩' => 'ÙŠ', + '𞸪' => 'Ùƒ', + '𞸫' => 'Ù„', + '𞸬' => 'Ù…', + '𞸭' => 'Ù†', + '𞸮' => 'س', + '𞸯' => 'ع', + '𞸰' => 'Ù', + '𞸱' => 'ص', + '𞸲' => 'Ù‚', + '𞸴' => 'Ø´', + '𞸵' => 'ت', + '𞸶' => 'Ø«', + '𞸷' => 'Ø®', + '𞸹' => 'ض', + '𞸻' => 'غ', + '𞹂' => 'ج', + '𞹇' => 'Ø­', + '𞹉' => 'ÙŠ', + '𞹋' => 'Ù„', + 'ðž¹' => 'Ù†', + '𞹎' => 'س', + 'ðž¹' => 'ع', + '𞹑' => 'ص', + 'ðž¹’' => 'Ù‚', + 'ðž¹”' => 'Ø´', + 'ðž¹—' => 'Ø®', + 'ðž¹™' => 'ض', + 'ðž¹›' => 'غ', + 'ðž¹' => 'Úº', + '𞹟' => 'Ù¯', + '𞹡' => 'ب', + 'ðž¹¢' => 'ج', + '𞹤' => 'Ù‡', + 'ðž¹§' => 'Ø­', + '𞹨' => 'Ø·', + '𞹩' => 'ÙŠ', + '𞹪' => 'Ùƒ', + '𞹬' => 'Ù…', + 'ðž¹­' => 'Ù†', + 'ðž¹®' => 'س', + '𞹯' => 'ع', + 'ðž¹°' => 'Ù', + 'ðž¹±' => 'ص', + 'ðž¹²' => 'Ù‚', + 'ðž¹´' => 'Ø´', + 'ðž¹µ' => 'ت', + 'ðž¹¶' => 'Ø«', + 'ðž¹·' => 'Ø®', + 'ðž¹¹' => 'ض', + '𞹺' => 'ظ', + 'ðž¹»' => 'غ', + 'ðž¹¼' => 'Ù®', + 'ðž¹¾' => 'Ú¡', + '𞺀' => 'ا', + 'ðžº' => 'ب', + '𞺂' => 'ج', + '𞺃' => 'د', + '𞺄' => 'Ù‡', + '𞺅' => 'Ùˆ', + '𞺆' => 'ز', + '𞺇' => 'Ø­', + '𞺈' => 'Ø·', + '𞺉' => 'ÙŠ', + '𞺋' => 'Ù„', + '𞺌' => 'Ù…', + 'ðžº' => 'Ù†', + '𞺎' => 'س', + 'ðžº' => 'ع', + 'ðžº' => 'Ù', + '𞺑' => 'ص', + '𞺒' => 'Ù‚', + '𞺓' => 'ر', + '𞺔' => 'Ø´', + '𞺕' => 'ت', + '𞺖' => 'Ø«', + '𞺗' => 'Ø®', + '𞺘' => 'ذ', + '𞺙' => 'ض', + '𞺚' => 'ظ', + '𞺛' => 'غ', + '𞺡' => 'ب', + '𞺢' => 'ج', + '𞺣' => 'د', + '𞺥' => 'Ùˆ', + '𞺦' => 'ز', + '𞺧' => 'Ø­', + '𞺨' => 'Ø·', + '𞺩' => 'ÙŠ', + '𞺫' => 'Ù„', + '𞺬' => 'Ù…', + '𞺭' => 'Ù†', + '𞺮' => 'س', + '𞺯' => 'ع', + '𞺰' => 'Ù', + '𞺱' => 'ص', + '𞺲' => 'Ù‚', + '𞺳' => 'ر', + '𞺴' => 'Ø´', + '𞺵' => 'ت', + '𞺶' => 'Ø«', + '𞺷' => 'Ø®', + '𞺸' => 'ذ', + '𞺹' => 'ض', + '𞺺' => 'ظ', + '𞺻' => 'غ', + '🄀' => '0.', + 'ðŸ„' => '0,', + '🄂' => '1,', + '🄃' => '2,', + '🄄' => '3,', + '🄅' => '4,', + '🄆' => '5,', + '🄇' => '6,', + '🄈' => '7,', + '🄉' => '8,', + '🄊' => '9,', + 'ðŸ„' => '(A)', + '🄑' => '(B)', + '🄒' => '(C)', + '🄓' => '(D)', + '🄔' => '(E)', + '🄕' => '(F)', + '🄖' => '(G)', + '🄗' => '(H)', + '🄘' => '(I)', + '🄙' => '(J)', + '🄚' => '(K)', + '🄛' => '(L)', + '🄜' => '(M)', + 'ðŸ„' => '(N)', + '🄞' => '(O)', + '🄟' => '(P)', + '🄠' => '(Q)', + '🄡' => '(R)', + '🄢' => '(S)', + '🄣' => '(T)', + '🄤' => '(U)', + '🄥' => '(V)', + '🄦' => '(W)', + '🄧' => '(X)', + '🄨' => '(Y)', + '🄩' => '(Z)', + '🄪' => '〔S〕', + '🄫' => '(C)', + '🄬' => '(R)', + '🄭' => '(CD)', + '🄮' => '(WZ)', + '🄰' => 'A', + '🄱' => 'B', + '🄲' => 'C', + '🄳' => 'D', + '🄴' => 'E', + '🄵' => 'F', + '🄶' => 'G', + '🄷' => 'H', + '🄸' => 'I', + '🄹' => 'J', + '🄺' => 'K', + '🄻' => 'L', + '🄼' => 'M', + '🄽' => 'N', + '🄾' => 'O', + '🄿' => 'P', + '🅀' => 'Q', + 'ðŸ…' => 'R', + '🅂' => 'S', + '🅃' => 'T', + '🅄' => 'U', + '🅅' => 'V', + '🅆' => 'W', + '🅇' => 'X', + '🅈' => 'Y', + '🅉' => 'Z', + '🅊' => 'HV', + '🅋' => 'MV', + '🅌' => 'SD', + 'ðŸ…' => 'SS', + '🅎' => 'PPV', + 'ðŸ…' => 'WC', + 'ðŸ†' => 'DJ', + '🈀' => 'ã»ã‹', + 'ðŸˆ' => 'ココ', + '🈂' => 'サ', + 'ðŸˆ' => '手', + '🈑' => 'å­—', + '🈒' => 'åŒ', + '🈓' => 'デ', + '🈔' => '二', + '🈕' => '多', + '🈖' => 'è§£', + '🈗' => '天', + '🈘' => '交', + '🈙' => '映', + '🈚' => 'ç„¡', + '🈛' => 'æ–™', + '🈜' => 'å‰', + 'ðŸˆ' => '後', + '🈞' => 'å†', + '🈟' => 'æ–°', + '🈠' => 'åˆ', + '🈡' => '終', + '🈢' => '生', + '🈣' => '販', + '🈤' => '声', + '🈥' => 'å¹', + '🈦' => 'æ¼”', + '🈧' => '投', + '🈨' => 'æ•', + '🈩' => '一', + '🈪' => '三', + '🈫' => 'éŠ', + '🈬' => 'å·¦', + '🈭' => '中', + '🈮' => 'å³', + '🈯' => '指', + '🈰' => 'èµ°', + '🈱' => '打', + '🈲' => 'ç¦', + '🈳' => '空', + '🈴' => 'åˆ', + '🈵' => '満', + '🈶' => '有', + '🈷' => '月', + '🈸' => '申', + '🈹' => '割', + '🈺' => 'å–¶', + '🈻' => 'é…', + '🉀' => '〔本〕', + 'ðŸ‰' => '〔三〕', + '🉂' => '〔二〕', + '🉃' => '〔安〕', + '🉄' => '〔点〕', + '🉅' => '〔打〕', + '🉆' => '〔盗〕', + '🉇' => '〔å‹ã€•', + '🉈' => '〔敗〕', + 'ðŸ‰' => '(å¾—)', + '🉑' => '(å¯)', + '丽' => '丽', + 'ð¯ ' => '丸', + '乁' => 'ä¹', + '𠄢' => 'ð „¢', + '你' => 'ä½ ', + '侮' => 'ä¾®', + '侻' => 'ä¾»', + '倂' => '倂', + '偺' => 'åº', + '備' => 'å‚™', + '僧' => '僧', + '像' => 'åƒ', + '㒞' => 'ã’ž', + 'ð¯ ' => '𠘺', + '免' => 'å…', + 'ð¯ ' => 'å…”', + 'ð¯ ' => 'å…¤', + '具' => 'å…·', + '𠔜' => '𠔜', + '㒹' => 'ã’¹', + '內' => 'å…§', + '再' => 'å†', + '𠕋' => 'ð •‹', + '冗' => '冗', + '冤' => '冤', + '仌' => '仌', + '冬' => '冬', + '况' => '况', + '𩇟' => '𩇟', + 'ð¯ ' => '凵', + '刃' => '刃', + '㓟' => '㓟', + '刻' => '刻', + '剆' => '剆', + '割' => '割', + '剷' => '剷', + '㔕' => '㔕', + '勇' => '勇', + '勉' => '勉', + '勤' => '勤', + '勺' => '勺', + '包' => '包', + '匆' => '匆', + '北' => '北', + '卉' => 'å‰', + '卑' => 'å‘', + '博' => 'åš', + '即' => 'å³', + '卽' => 'å½', + '卿' => 'å¿', + '卿' => 'å¿', + '卿' => 'å¿', + '𠨬' => '𠨬', + '灰' => 'ç°', + '及' => 'åŠ', + '叟' => 'åŸ', + '𠭣' => 'ð ­£', + '叫' => 'å«', + '叱' => 'å±', + '吆' => 'å†', + '咞' => 'å’ž', + '吸' => 'å¸', + '呈' => '呈', + '周' => '周', + '咢' => 'å’¢', + 'ð¯¡' => 'å“¶', + '唐' => 'å”', + '啓' => 'å•“', + '啣' => 'å•£', + '善' => 'å–„', + '善' => 'å–„', + '喙' => 'å–™', + '喫' => 'å–«', + '喳' => 'å–³', + '嗂' => 'å—‚', + '圖' => '圖', + '嘆' => '嘆', + 'ð¯¡' => '圗', + '噑' => '噑', + 'ð¯¡' => 'å™´', + 'ð¯¡' => '切', + '壮' => '壮', + '城' => '城', + '埴' => '埴', + '堍' => 'å ', + '型' => 'åž‹', + '堲' => 'å ²', + '報' => 'å ±', + '墬' => '墬', + '𡓤' => '𡓤', + '売' => '売', + '壷' => '壷', + '夆' => '夆', + 'ð¯¡' => '多', + '夢' => '夢', + '奢' => '奢', + '𡚨' => '𡚨', + '𡛪' => '𡛪', + '姬' => '姬', + '娛' => '娛', + '娧' => '娧', + '姘' => '姘', + '婦' => '婦', + '㛮' => 'ã›®', + '㛼' => '㛼', + '嬈' => '嬈', + '嬾' => '嬾', + '嬾' => '嬾', + '𡧈' => '𡧈', + '寃' => '寃', + '寘' => '寘', + '寧' => '寧', + '寳' => '寳', + '𡬘' => '𡬘', + '寿' => '寿', + '将' => 'å°†', + '当' => '当', + '尢' => 'å°¢', + '㞁' => 'ãž', + '屠' => 'å± ', + '屮' => 'å±®', + '峀' => 'å³€', + '岍' => 'å²', + '𡷤' => 'ð¡·¤', + '嵃' => '嵃', + '𡷦' => 'ð¡·¦', + '嵮' => 'åµ®', + '嵫' => '嵫', + '嵼' => 'åµ¼', + 'ð¯¢' => 'å·¡', + '巢' => 'å·¢', + '㠯' => 'ã ¯', + '巽' => 'å·½', + '帨' => '帨', + '帽' => '帽', + '幩' => '幩', + '㡢' => 'ã¡¢', + '𢆃' => '𢆃', + '㡼' => '㡼', + '庰' => '庰', + '庳' => '庳', + 'ð¯¢' => '庶', + '廊' => '廊', + 'ð¯¢' => '𪎒', + 'ð¯¢' => '廾', + '𢌱' => '𢌱', + '𢌱' => '𢌱', + '舁' => 'èˆ', + '弢' => 'å¼¢', + '弢' => 'å¼¢', + '㣇' => '㣇', + '𣊸' => '𣊸', + '𦇚' => '𦇚', + '形' => 'å½¢', + '彫' => '彫', + '㣣' => '㣣', + '徚' => '徚', + 'ð¯¢' => 'å¿', + '志' => 'å¿—', + '忹' => '忹', + '悁' => 'æ‚', + '㤺' => '㤺', + '㤜' => '㤜', + '悔' => 'æ‚”', + '𢛔' => '𢛔', + '惇' => '惇', + '慈' => 'æ…ˆ', + '慌' => 'æ…Œ', + '慎' => 'æ…Ž', + '慌' => 'æ…Œ', + '慺' => 'æ…º', + '憎' => '憎', + '憲' => '憲', + '憤' => '憤', + '憯' => '憯', + '懞' => '懞', + '懲' => '懲', + '懶' => '懶', + '成' => 'æˆ', + '戛' => '戛', + '扝' => 'æ‰', + '抱' => '抱', + '拔' => 'æ‹”', + '捐' => 'æ', + '𢬌' => '𢬌', + '挽' => '挽', + '拼' => '拼', + '捨' => 'æ¨', + '掃' => '掃', + '揤' => 'æ¤', + '𢯱' => '𢯱', + '搢' => 'æ¢', + '揅' => 'æ…', + 'ð¯£' => '掩', + '㨮' => '㨮', + '摩' => 'æ‘©', + '摾' => '摾', + '撝' => 'æ’', + '摷' => 'æ‘·', + '㩬' => '㩬', + '敏' => 'æ•', + '敬' => '敬', + '𣀊' => '𣀊', + '旣' => 'æ—£', + '書' => '書', + 'ð¯£' => '晉', + '㬙' => '㬙', + 'ð¯£' => 'æš‘', + 'ð¯£' => '㬈', + '㫤' => '㫤', + '冒' => '冒', + '冕' => '冕', + '最' => '最', + '暜' => 'æšœ', + '肭' => 'è‚­', + '䏙' => 'ä™', + '朗' => '朗', + '望' => '望', + '朡' => '朡', + '杞' => 'æž', + '杓' => 'æ“', + 'ð¯£' => 'ð£ƒ', + '㭉' => 'ã­‰', + '柺' => '柺', + '枅' => 'æž…', + '桒' => 'æ¡’', + '梅' => '梅', + '𣑭' => '𣑭', + '梎' => '梎', + '栟' => 'æ Ÿ', + '椔' => '椔', + '㮝' => 'ã®', + '楂' => '楂', + '榣' => '榣', + '槪' => '槪', + '檨' => '檨', + '𣚣' => '𣚣', + '櫛' => 'æ«›', + '㰘' => 'ã°˜', + '次' => '次', + '𣢧' => '𣢧', + '歔' => 'æ­”', + '㱎' => '㱎', + '歲' => 'æ­²', + '殟' => '殟', + '殺' => '殺', + '殻' => 'æ®»', + '𣪍' => 'ð£ª', + '𡴋' => 'ð¡´‹', + '𣫺' => '𣫺', + '汎' => '汎', + '𣲼' => '𣲼', + '沿' => '沿', + '泍' => 'æ³', + '汧' => 'æ±§', + '洖' => 'æ´–', + '派' => 'æ´¾', + 'ð¯¤' => 'æµ·', + '流' => 'æµ', + '浩' => '浩', + '浸' => '浸', + '涅' => 'æ¶…', + '𣴞' => '𣴞', + '洴' => 'æ´´', + '港' => '港', + '湮' => 'æ¹®', + '㴳' => 'ã´³', + '滋' => '滋', + '滇' => '滇', + 'ð¯¤' => '𣻑', + '淹' => 'æ·¹', + 'ð¯¤' => 'æ½®', + 'ð¯¤' => '𣽞', + '𣾎' => '𣾎', + '濆' => '濆', + '瀹' => '瀹', + '瀞' => '瀞', + '瀛' => '瀛', + '㶖' => 'ã¶–', + '灊' => 'çŠ', + '災' => 'ç½', + '灷' => 'ç·', + '炭' => 'ç‚­', + '𠔥' => '𠔥', + '煅' => 'ç……', + 'ð¯¤' => '𤉣', + '熜' => '熜', + '𤎫' => '𤎫', + '爨' => '爨', + '爵' => '爵', + '牐' => 'ç‰', + '𤘈' => '𤘈', + '犀' => '犀', + '犕' => '犕', + '𤜵' => '𤜵', + '𤠔' => '𤠔', + '獺' => 'çº', + '王' => '王', + '㺬' => '㺬', + '玥' => '玥', + '㺸' => '㺸', + '㺸' => '㺸', + '瑇' => '瑇', + '瑜' => '瑜', + '瑱' => '瑱', + '璅' => 'ç’…', + '瓊' => '瓊', + '㼛' => 'ã¼›', + '甤' => '甤', + '𤰶' => '𤰶', + '甾' => '甾', + '𤲒' => '𤲒', + '異' => 'ç•°', + '𢆟' => '𢆟', + '瘐' => 'ç˜', + '𤾡' => '𤾡', + '𤾸' => '𤾸', + '𥁄' => 'ð¥„', + '㿼' => '㿼', + '䀈' => '䀈', + '直' => 'ç›´', + 'ð¯¥' => '𥃳', + '𥃲' => '𥃲', + '𥄙' => '𥄙', + '𥄳' => '𥄳', + '眞' => '眞', + '真' => '真', + '真' => '真', + '睊' => 'çŠ', + '䀹' => '䀹', + '瞋' => 'çž‹', + '䁆' => 'ä†', + '䂖' => 'ä‚–', + 'ð¯¥' => 'ð¥', + '硎' => '硎', + 'ð¯¥' => '碌', + 'ð¯¥' => '磌', + '䃣' => '䃣', + '𥘦' => '𥘦', + '祖' => '祖', + '𥚚' => '𥚚', + '𥛅' => '𥛅', + '福' => 'ç¦', + '秫' => 'ç§«', + '䄯' => '䄯', + '穀' => 'ç©€', + '穊' => '穊', + '穏' => 'ç©', + '𥥼' => '𥥼', + 'ð¯¥' => '𥪧', + '𥪧' => '𥪧', + '竮' => 'ç«®', + '䈂' => '䈂', + '𥮫' => '𥮫', + '篆' => '篆', + '築' => '築', + '䈧' => '䈧', + '𥲀' => '𥲀', + '糒' => 'ç³’', + '䊠' => '䊠', + '糨' => '糨', + '糣' => 'ç³£', + '紀' => 'ç´€', + '𥾆' => '𥾆', + '絣' => 'çµ£', + '䌁' => 'äŒ', + '緇' => 'ç·‡', + '縂' => '縂', + '繅' => 'ç¹…', + '䌴' => '䌴', + '𦈨' => '𦈨', + '𦉇' => '𦉇', + '䍙' => 'ä™', + '𦋙' => '𦋙', + '罺' => '罺', + '𦌾' => '𦌾', + '羕' => '羕', + '翺' => '翺', + '者' => '者', + '𦓚' => '𦓚', + '𦔣' => '𦔣', + '聠' => 'è ', + '𦖨' => '𦖨', + '聰' => 'è°', + '𣍟' => 'ð£Ÿ', + 'ð¯¦' => 'ä•', + '育' => '育', + '脃' => '脃', + '䐋' => 'ä‹', + '脾' => '脾', + '媵' => '媵', + '𦞧' => '𦞧', + '𦞵' => '𦞵', + '𣎓' => '𣎓', + '𣎜' => '𣎜', + '舁' => 'èˆ', + '舄' => '舄', + 'ð¯¦' => '辞', + '䑫' => 'ä‘«', + 'ð¯¦' => '芑', + 'ð¯¦' => '芋', + '芝' => 'èŠ', + '劳' => '劳', + '花' => '花', + '芳' => '芳', + '芽' => '芽', + '苦' => '苦', + '𦬼' => '𦬼', + '若' => 'è‹¥', + '茝' => 'èŒ', + '荣' => 'è£', + '莭' => '莭', + '茣' => '茣', + 'ð¯¦' => '莽', + '菧' => 'è§', + '著' => 'è‘—', + '荓' => 'è“', + '菊' => 'èŠ', + '菌' => 'èŒ', + '菜' => 'èœ', + '𦰶' => '𦰶', + '𦵫' => '𦵫', + '𦳕' => '𦳕', + '䔫' => '䔫', + '蓱' => '蓱', + '蓳' => '蓳', + '蔖' => 'è”–', + '𧏊' => 'ð§Š', + '蕤' => '蕤', + '𦼬' => '𦼬', + '䕝' => 'ä•', + '䕡' => 'ä•¡', + '𦾱' => '𦾱', + '𧃒' => '𧃒', + '䕫' => 'ä•«', + '虐' => 'è™', + '虜' => '虜', + '虧' => 'è™§', + '虩' => '虩', + '蚩' => 'èš©', + '蚈' => '蚈', + '蜎' => '蜎', + '蛢' => '蛢', + '蝹' => 'è¹', + '蜨' => '蜨', + '蝫' => 'è«', + '螆' => '螆', + '䗗' => 'ä——', + '蟡' => '蟡', + 'ð¯§' => 'è ', + '䗹' => 'ä—¹', + '衠' => 'è¡ ', + '衣' => 'è¡£', + '𧙧' => 'ð§™§', + '裗' => '裗', + '裞' => '裞', + '䘵' => '䘵', + '裺' => '裺', + '㒻' => 'ã’»', + '𧢮' => 'ð§¢®', + '𧥦' => '𧥦', + 'ð¯§' => 'äš¾', + '䛇' => '䛇', + 'ð¯§' => '誠', + 'ð¯§' => 'è«­', + '變' => '變', + '豕' => '豕', + '𧲨' => '𧲨', + '貫' => '貫', + '賁' => 'è³', + '贛' => 'è´›', + '起' => 'èµ·', + '𧼯' => '𧼯', + '𠠄' => 'ð  „', + '跋' => 'è·‹', + '趼' => 'è¶¼', + '跰' => 'è·°', + 'ð¯§' => '𠣞', + '軔' => 'è»”', + '輸' => '輸', + '𨗒' => '𨗒', + '𨗭' => '𨗭', + '邔' => 'é‚”', + '郱' => '郱', + '鄑' => 'é„‘', + '𨜮' => '𨜮', + '鄛' => 'é„›', + '鈸' => '鈸', + '鋗' => 'é‹—', + '鋘' => '鋘', + '鉼' => '鉼', + '鏹' => 'é¹', + '鐕' => 'é•', + '𨯺' => '𨯺', + '開' => 'é–‹', + '䦕' => '䦕', + '閷' => 'é–·', + '𨵷' => '𨵷', + '䧦' => '䧦', + '雃' => '雃', + '嶲' => 'å¶²', + '霣' => '霣', + '𩅅' => 'ð©……', + '𩈚' => '𩈚', + '䩮' => 'ä©®', + '䩶' => 'ä©¶', + '韠' => '韠', + '𩐊' => 'ð©Š', + '䪲' => '䪲', + '𩒖' => 'ð©’–', + '頋' => 'é ‹', + '頋' => 'é ‹', + '頩' => 'é ©', + 'ð¯¨' => 'ð©–¶', + '飢' => '飢', + '䬳' => '䬳', + '餩' => '餩', + '馧' => '馧', + '駂' => 'é§‚', + '駾' => 'é§¾', + '䯎' => '䯎', + '𩬰' => '𩬰', + '鬒' => '鬒', + '鱀' => 'é±€', + '鳽' => 'é³½', + 'ð¯¨' => '䳎', + '䳭' => 'ä³­', + 'ð¯¨' => 'éµ§', + 'ð¯¨' => '𪃎', + '䳸' => '䳸', + '𪄅' => '𪄅', + '𪈎' => '𪈎', + '𪊑' => '𪊑', + '麻' => '麻', + '䵖' => 'äµ–', + '黹' => '黹', + '黾' => '黾', + '鼅' => 'é¼…', + '鼏' => 'é¼', + '鼖' => 'é¼–', + '鼻' => 'é¼»', + 'ð¯¨' => '𪘀', + 'Æ' => 'AE', + 'Ã' => 'D', + 'Ø' => 'O', + 'Þ' => 'TH', + 'ß' => 'ss', + 'æ' => 'ae', + 'ð' => 'd', + 'ø' => 'o', + 'þ' => 'th', + 'Ä' => 'D', + 'Ä‘' => 'd', + 'Ħ' => 'H', + 'ħ' => 'h', + 'ı' => 'i', + 'ĸ' => 'q', + 'Å' => 'L', + 'Å‚' => 'l', + 'ÅŠ' => 'N', + 'Å‹' => 'n', + 'Å’' => 'OE', + 'Å“' => 'oe', + 'Ŧ' => 'T', + 'ŧ' => 't', + 'Æ€' => 'b', + 'Æ' => 'B', + 'Æ‚' => 'B', + 'ƃ' => 'b', + 'Ƈ' => 'C', + 'ƈ' => 'c', + 'Ɖ' => 'D', + 'ÆŠ' => 'D', + 'Æ‹' => 'D', + 'ÆŒ' => 'd', + 'Æ' => 'E', + 'Æ‘' => 'F', + 'Æ’' => 'f', + 'Æ“' => 'G', + 'Æ•' => 'hv', + 'Æ–' => 'I', + 'Æ—' => 'I', + 'Ƙ' => 'K', + 'Æ™' => 'k', + 'Æš' => 'l', + 'Æ' => 'N', + 'Æž' => 'n', + 'Æ¢' => 'OI', + 'Æ£' => 'oi', + 'Ƥ' => 'P', + 'Æ¥' => 'p', + 'Æ«' => 't', + 'Ƭ' => 'T', + 'Æ­' => 't', + 'Æ®' => 'T', + 'Ʋ' => 'V', + 'Ƴ' => 'Y', + 'Æ´' => 'y', + 'Ƶ' => 'Z', + 'ƶ' => 'z', + 'Ǥ' => 'G', + 'Ç¥' => 'g', + 'È¡' => 'd', + 'Ȥ' => 'Z', + 'È¥' => 'z', + 'È´' => 'l', + 'ȵ' => 'n', + 'ȶ' => 't', + 'È·' => 'j', + 'ȸ' => 'db', + 'ȹ' => 'qp', + 'Ⱥ' => 'A', + 'È»' => 'C', + 'ȼ' => 'c', + 'Ƚ' => 'L', + 'Ⱦ' => 'T', + 'È¿' => 's', + 'É€' => 'z', + 'Ƀ' => 'B', + 'É„' => 'U', + 'Ɇ' => 'E', + 'ɇ' => 'e', + 'Ɉ' => 'J', + 'ɉ' => 'j', + 'ÉŒ' => 'R', + 'É' => 'r', + 'ÉŽ' => 'Y', + 'É' => 'y', + 'É“' => 'b', + 'É•' => 'c', + 'É–' => 'd', + 'É—' => 'd', + 'É›' => 'e', + 'ÉŸ' => 'j', + 'É ' => 'g', + 'É¡' => 'g', + 'É¢' => 'G', + 'ɦ' => 'h', + 'ɧ' => 'h', + 'ɨ' => 'i', + 'ɪ' => 'I', + 'É«' => 'l', + 'ɬ' => 'l', + 'É­' => 'l', + 'ɱ' => 'm', + 'ɲ' => 'n', + 'ɳ' => 'n', + 'É´' => 'N', + 'ɶ' => 'OE', + 'ɼ' => 'r', + 'ɽ' => 'r', + 'ɾ' => 'r', + 'Ê€' => 'R', + 'Ê‚' => 's', + 'ʈ' => 't', + 'ʉ' => 'u', + 'Ê‹' => 'v', + 'Ê' => 'Y', + 'Ê' => 'z', + 'Ê‘' => 'z', + 'Ê™' => 'B', + 'Ê›' => 'G', + 'Êœ' => 'H', + 'Ê' => 'j', + 'ÊŸ' => 'L', + 'Ê ' => 'q', + 'Ê£' => 'dz', + 'Ê¥' => 'dz', + 'ʦ' => 'ts', + 'ʪ' => 'ls', + 'Ê«' => 'lz', + 'á´€' => 'A', + 'á´' => 'AE', + 'á´ƒ' => 'B', + 'á´„' => 'C', + 'á´…' => 'D', + 'á´†' => 'D', + 'á´‡' => 'E', + 'á´Š' => 'J', + 'á´‹' => 'K', + 'á´Œ' => 'L', + 'á´' => 'M', + 'á´' => 'O', + 'á´˜' => 'P', + 'á´›' => 'T', + 'á´œ' => 'U', + 'á´ ' => 'V', + 'á´¡' => 'W', + 'á´¢' => 'Z', + 'ᵫ' => 'ue', + 'ᵬ' => 'b', + 'áµ­' => 'd', + 'áµ®' => 'f', + 'ᵯ' => 'm', + 'áµ°' => 'n', + 'áµ±' => 'p', + 'áµ²' => 'r', + 'áµ³' => 'r', + 'áµ´' => 's', + 'áµµ' => 't', + 'áµ¶' => 'z', + 'ᵺ' => 'th', + 'áµ»' => 'I', + 'áµ½' => 'p', + 'áµ¾' => 'U', + 'á¶€' => 'b', + 'á¶' => 'd', + 'á¶‚' => 'f', + 'ᶃ' => 'g', + 'á¶„' => 'k', + 'á¶…' => 'l', + 'ᶆ' => 'm', + 'ᶇ' => 'n', + 'ᶈ' => 'p', + 'ᶉ' => 'r', + 'á¶Š' => 's', + 'á¶Œ' => 'v', + 'á¶' => 'x', + 'á¶Ž' => 'z', + 'á¶' => 'a', + 'á¶‘' => 'd', + 'á¶’' => 'e', + 'á¶“' => 'e', + 'á¶–' => 'i', + 'á¶™' => 'u', + 'ẜ' => 's', + 'áº' => 's', + 'ẞ' => 'SS', + 'Ỻ' => 'LL', + 'á»»' => 'll', + 'Ỽ' => 'V', + 'ỽ' => 'v', + 'Ỿ' => 'Y', + 'ỿ' => 'y', + 'â± ' => 'L', + 'ⱡ' => 'l', + 'â±¢' => 'L', + 'â±£' => 'P', + 'Ɽ' => 'R', + 'â±¥' => 'a', + 'ⱦ' => 't', + 'â±§' => 'H', + 'ⱨ' => 'h', + 'Ⱪ' => 'K', + 'ⱪ' => 'k', + 'Ⱬ' => 'Z', + 'ⱬ' => 'z', + 'â±®' => 'M', + 'â±±' => 'v', + 'â±²' => 'W', + 'â±³' => 'w', + 'â±´' => 'v', + 'ⱸ' => 'e', + 'ⱺ' => 'o', + 'â±¾' => 'S', + 'Ɀ' => 'Z', + 'ꜰ' => 'F', + 'ꜱ' => 'S', + 'Ꜳ' => 'AA', + 'ꜳ' => 'aa', + 'Ꜵ' => 'AO', + 'ꜵ' => 'ao', + 'Ꜷ' => 'AU', + 'ꜷ' => 'au', + 'Ꜹ' => 'AV', + 'ꜹ' => 'av', + 'Ꜻ' => 'AV', + 'ꜻ' => 'av', + 'Ꜽ' => 'AY', + 'ꜽ' => 'ay', + 'ê€' => 'K', + 'ê' => 'k', + 'ê‚' => 'K', + 'êƒ' => 'k', + 'ê„' => 'K', + 'ê…' => 'k', + 'ê†' => 'L', + 'ê‡' => 'l', + 'êˆ' => 'L', + 'ê‰' => 'l', + 'êŠ' => 'O', + 'ê‹' => 'o', + 'êŒ' => 'O', + 'ê' => 'o', + 'êŽ' => 'OO', + 'ê' => 'oo', + 'ê' => 'P', + 'ê‘' => 'p', + 'ê’' => 'P', + 'ê“' => 'p', + 'ê”' => 'P', + 'ê•' => 'p', + 'ê–' => 'Q', + 'ê—' => 'q', + 'ê˜' => 'Q', + 'ê™' => 'q', + 'êž' => 'V', + 'êŸ' => 'v', + 'ê ' => 'VY', + 'ê¡' => 'vy', + 'ê¤' => 'TH', + 'ê¥' => 'th', + 'ê¦' => 'TH', + 'ê§' => 'th', + 'ê±' => 'd', + 'ê²' => 'l', + 'ê³' => 'm', + 'ê´' => 'n', + 'êµ' => 'r', + 'ê¶' => 'R', + 'ê·' => 't', + 'ê¹' => 'D', + 'êº' => 'd', + 'ê»' => 'F', + 'ê¼' => 'f', + 'Ꞇ' => 'T', + 'ꞇ' => 't', + 'êž' => 'N', + 'êž‘' => 'n', + 'êž’' => 'C', + 'êž“' => 'c', + 'êž ' => 'G', + 'êž¡' => 'g', + 'Ꞣ' => 'K', + 'ꞣ' => 'k', + 'Ꞥ' => 'N', + 'ꞥ' => 'n', + 'Ꞧ' => 'R', + 'êž§' => 'r', + 'Ꞩ' => 'S', + 'êž©' => 's', + 'Ɦ' => 'H', + '©' => '(C)', + '®' => '(R)', + 'â‚ ' => 'CE', + 'â‚¢' => 'Cr', + 'â‚£' => 'Fr.', + '₤' => 'L.', + 'â‚§' => 'Pts', + '₺' => 'TL', + '₹' => 'Rs', + 'â„—' => '(P)', + '℘' => 'P', + '℞' => 'Rx', + '〇' => '0', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + 'âŸ' => ' ', + 'ʹ' => '\'', + 'ʺ' => '"', + 'Ê»' => '\'', + 'ʼ' => '\'', + 'ʽ' => '\'', + 'ˈ' => '\'', + 'Ë‹' => '`', + '‘' => '\'', + '’' => '\'', + '‚' => ',', + '‛' => '\'', + '“' => '"', + 'â€' => '"', + '„' => ',,', + '‟' => '"', + '′' => '\'', + 'ã€' => '"', + '〞' => '"', + '«' => '<<', + '»' => '>>', + '‹' => '<', + '›' => '>', + '­' => '-', + 'â€' => '-', + '‑' => '-', + '‒' => '-', + '–' => '-', + '—' => '-', + '―' => '-', + '︱' => '-', + '︲' => '-', + 'Ë‚' => '<', + '˃' => '>', + 'Ë„' => '^', + 'ˆ' => '^', + 'Ë' => ':', + 'Ëœ' => '~', + '‖' => '||', + 'â„' => '/', + 'â…' => '[', + 'â†' => ']', + 'âŽ' => '*', + 'ã€' => ',', + '。' => '.', + '〈' => '<', + '〉' => '>', + '《' => '<<', + '》' => '>>', + '〔' => '[', + '〕' => ']', + '〘' => '[', + '〙' => ']', + '〚' => '[', + '〛' => ']', + 'ï¸' => ',', + '︑' => ',', + '︒' => '.', + '︓' => ':', + '︔' => ';', + '︕' => '!', + '︖' => '?', + '︙' => '...', + '︰' => '..', + '︵' => '(', + '︶' => ')', + '︷' => '{', + '︸' => '}', + '︹' => '[', + '︺' => ']', + '︽' => '<<', + '︾' => '>>', + '︿' => '<', + 'ï¹€' => '>', + '﹇' => '[', + '﹈' => ']', + '×' => '*', + '÷' => '/', + 'Ë–' => '+', + 'Ë—' => '-', + '−' => '-', + '∕' => '/', + '∖' => '\\', + '∣' => '|', + '∥' => '||', + '≪' => '<<', + '≫' => '>>', + '⦅' => '((', + '⦆' => '))', +); + +$result =& $data; +unset($data); + +return $result; diff --git a/vendor/symfony/polyfill-iconv/bootstrap.php b/vendor/symfony/polyfill-iconv/bootstrap.php new file mode 100644 index 0000000..14b5003 --- /dev/null +++ b/vendor/symfony/polyfill-iconv/bootstrap.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Iconv as p; + +if (extension_loaded('iconv')) { + return; +} + +if (!defined('ICONV_IMPL')) { + define('ICONV_IMPL', 'Symfony'); +} +if (!defined('ICONV_VERSION')) { + define('ICONV_VERSION', '1.0'); +} +if (!defined('ICONV_MIME_DECODE_STRICT')) { + define('ICONV_MIME_DECODE_STRICT', 1); +} +if (!defined('ICONV_MIME_DECODE_CONTINUE_ON_ERROR')) { + define('ICONV_MIME_DECODE_CONTINUE_ON_ERROR', 2); +} + +if (!function_exists('iconv')) { + function iconv($from, $to, $s) { return p\Iconv::iconv($from, $to, $s); } +} +if (!function_exists('iconv_get_encoding')) { + function iconv_get_encoding($type = 'all') { return p\Iconv::iconv_get_encoding($type); } +} +if (!function_exists('iconv_set_encoding')) { + function iconv_set_encoding($type, $charset) { return p\Iconv::iconv_set_encoding($type, $charset); } +} +if (!function_exists('iconv_mime_encode')) { + function iconv_mime_encode($name, $value, $pref = null) { return p\Iconv::iconv_mime_encode($name, $value, $pref); } +} +if (!function_exists('iconv_mime_decode_headers')) { + function iconv_mime_decode_headers($encodedHeaders, $mode = 0, $enc = null) { return p\Iconv::iconv_mime_decode_headers($encodedHeaders, $mode, $enc); } +} + +if (extension_loaded('mbstring')) { + if (!function_exists('iconv_strlen')) { + function iconv_strlen($s, $enc = null) { null === $enc and $enc = p\Iconv::$internalEncoding; return mb_strlen($s, $enc); } + } + if (!function_exists('iconv_strpos')) { + function iconv_strpos($s, $needle, $offset = 0, $enc = null) { null === $enc and $enc = p\Iconv::$internalEncoding; return mb_strpos($s, $needle, $offset, $enc); } + } + if (!function_exists('iconv_strrpos')) { + function iconv_strrpos($s, $needle, $enc = null) { null === $enc and $enc = p\Iconv::$internalEncoding; return mb_strrpos($s, $needle, 0, $enc); } + } + if (!function_exists('iconv_substr')) { + function iconv_substr($s, $start, $length = 2147483647, $enc = null) { null === $enc and $enc = p\Iconv::$internalEncoding; return mb_substr($s, $start, $length, $enc); } + } + if (!function_exists('iconv_mime_decode')) { + function iconv_mime_decode($encodedHeaders, $mode = 0, $enc = null) { null === $enc and $enc = p\Iconv::$internalEncoding; return mb_decode_mimeheader($encodedHeaders, $mode, $enc); } + } +} else { + if (!function_exists('iconv_strlen')) { + if (extension_loaded('xml')) { + function iconv_strlen($s, $enc = null) { return p\Iconv::strlen1($s, $enc); } + } else { + function iconv_strlen($s, $enc = null) { return p\Iconv::strlen2($s, $enc); } + } + } + + if (!function_exists('iconv_strpos')) { + function iconv_strpos($s, $needle, $offset = 0, $enc = null) { return p\Iconv::iconv_strpos($s, $needle, $offset, $enc); } + } + if (!function_exists('iconv_strrpos')) { + function iconv_strrpos($s, $needle, $enc = null) { return p\Iconv::iconv_strrpos($s, $needle, $enc); } + } + if (!function_exists('iconv_substr')) { + function iconv_substr($s, $start, $length = 2147483647, $enc = null) { return p\Iconv::iconv_substr($s, $start, $length, $enc); } + } + if (!function_exists('iconv_mime_decode')) { + function iconv_mime_decode($encodedHeaders, $mode = 0, $enc = null) { return p\Iconv::iconv_mime_decode($encodedHeaders, $mode, $enc); } + } +} diff --git a/vendor/symfony/polyfill-iconv/composer.json b/vendor/symfony/polyfill-iconv/composer.json new file mode 100644 index 0000000..3df179e --- /dev/null +++ b/vendor/symfony/polyfill-iconv/composer.json @@ -0,0 +1,34 @@ +{ + "name": "symfony/polyfill-iconv", + "type": "library", + "description": "Symfony polyfill for the Iconv extension", + "keywords": ["polyfill", "shim", "compatibility", "portable", "iconv"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Iconv\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + } +} diff --git a/vendor/symfony/polyfill-intl-grapheme/Grapheme.php b/vendor/symfony/polyfill-intl-grapheme/Grapheme.php new file mode 100644 index 0000000..5f4167e --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/Grapheme.php @@ -0,0 +1,211 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Grapheme; + +\define('SYMFONY_GRAPHEME_CLUSTER_RX', PCRE_VERSION >= '8.32' ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX); + +/** + * Partial intl implementation in pure PHP. + * + * Implemented: + * - grapheme_extract - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8 + * - grapheme_stripos - Find position (in grapheme units) of first occurrence of a case-insensitive string + * - grapheme_stristr - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack + * - grapheme_strlen - Get string length in grapheme units + * - grapheme_strpos - Find position (in grapheme units) of first occurrence of a string + * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string + * - grapheme_strrpos - Find position (in grapheme units) of last occurrence of a string + * - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack + * - grapheme_substr - Return part of a string + * + * @author Nicolas Grekas + * + * @internal + */ +final class Grapheme +{ + // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control]) + // This regular expression is a work around for http://bugs.exim.org/1279 + const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[á„€-á…Ÿ]*(?:[가개갸걔거게겨계고과괘괴êµêµ¬ê¶ˆê¶¤ê·€ê·œê·¸ê¸”기까깨꺄꺠꺼께껴ê¼ê¼¬ê½ˆê½¤ê¾€ê¾œê¾¸ê¿”꿰뀌뀨ë„ë ë¼ë‚˜ë‚´ëƒëƒ¬ë„ˆë„¤ë…€ë…œë…¸ë†”놰뇌뇨누눠눼뉘뉴ëŠëŠ¬ë‹ˆë‹¤ëŒ€ëŒœëŒ¸ë”ë°ëŽŒëŽ¨ë„ë ë¼ë˜ë´ë‘둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴ë˜ë˜¬ë™ˆë™¤ëš€ëšœëš¸ë›”뛰뜌뜨ë„ë ë¼ëž˜ëž´ëŸëŸ¬ë ˆë ¤ë¡€ë¡œë¡¸ë¢”뢰료루뤄뤠뤼류르ë¦ë¦¬ë§ˆë§¤ë¨€ë¨œë¨¸ë©”며몌모뫄뫠뫼묘무ë­ë­¬ë®ˆë®¤ë¯€ë¯œë¯¸ë°”배뱌뱨버베벼볘보ë´ë´¬ëµˆëµ¤ë¶€ë¶œë¶¸ë·”뷰브븨비빠빼뺘뺴ë»ë»¬ë¼ˆë¼¤ë½€ë½œë½¸ë¾”뾰뿌뿨쀄쀠쀼ì˜ì´ì‚사새샤섀서세셔셰소솨쇄쇠쇼수숴ì‰ì‰¬ìŠˆìŠ¤ì‹€ì‹œì‹¸ìŒ”ìŒ°ìŒì¨ìŽ„ìŽ ìŽ¼ì˜ì´ìì¬ì‘ˆì‘¤ì’€ì’œì’¸ì“”쓰씌씨아애야얘어ì—여예오와왜외요우워웨위유으ì˜ì´ìžìž¬ìŸˆìŸ¤ì €ì œì ¸ì¡”조좌좨죄죠주줘줴ì¥ì¥¬ì¦ˆì¦¤ì§€ì§œì§¸ì¨”쨰쩌쩨쪄쪠쪼쫘쫴ì¬ì¬¬ì­ˆì­¤ì®€ì®œì®¸ì¯”쯰찌차채챠챼처체ì³ì³¬ì´ˆì´¤ìµ€ìµœìµ¸ì¶”춰췌취츄츠츼치카ìºìº¬ì»ˆì»¤ì¼€ì¼œì¼¸ì½”콰쾌쾨쿄쿠쿼퀘퀴íí¬í‚ˆí‚¤íƒ€íƒœíƒ¸í„”터테텨톄토톼퇘퇴íˆíˆ¬í‰ˆí‰¤íŠ€íŠœíŠ¸í‹”í‹°íŒŒíŒ¨í„í í¼íŽ˜íŽ´íí¬íˆí¤í‘€í‘œí‘¸í’”풰퓌퓨프픠피하해í–햬허헤혀혜호화홰회효후훠훼휘휴íí¬ížˆ]?[á… -ᆢ]+|[ê°€-힣])[ᆨ-ᇹ]*|[á„€-á…Ÿ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])'; + + public static function grapheme_extract($s, $size, $type = GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0) + { + if (\PHP_VERSION_ID >= 70100 && 0 > $start) { + $start = \strlen($s) + $start; + } + + if (!\is_scalar($s)) { + $hasError = false; + set_error_handler(function () use (&$hasError) { $hasError = true; }); + $next = substr($s, $start); + restore_error_handler(); + if ($hasError) { + substr($s, $start); + $s = ''; + } else { + $s = $next; + } + } else { + $s = substr($s, $start); + } + $size = (int) $size; + $type = (int) $type; + $start = (int) $start; + + if (!isset($s[0]) || 0 > $size || 0 > $start || 0 > $type || 2 < $type) { + return false; + } + if (0 === $size) { + return ''; + } + + $next = $start; + + $s = preg_split('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + + if (!isset($s[1])) { + return false; + } + + $i = 1; + $ret = ''; + + do { + if (GRAPHEME_EXTR_COUNT === $type) { + --$size; + } elseif (GRAPHEME_EXTR_MAXBYTES === $type) { + $size -= \strlen($s[$i]); + } else { + $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE'); + } + + if ($size >= 0) { + $ret .= $s[$i]; + } + } while (isset($s[++$i]) && $size > 0); + + $next += \strlen($ret); + + return $ret; + } + + public static function grapheme_strlen($s) + { + preg_replace('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len); + + return 0 === $len && '' !== $s ? null : $len; + } + + public static function grapheme_substr($s, $start, $len = 2147483647) + { + preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s, $s); + + $slen = \count($s[0]); + $start = (int) $start; + + if (0 > $start) { + $start += $slen; + } + if (0 > $start) { + return false; + } + if ($start >= $slen) { + return false; + } + + $rem = $slen - $start; + + if (0 > $len) { + $len += $rem; + } + if (0 === $len) { + return ''; + } + if (0 > $len) { + return false; + } + if ($len > $rem) { + $len = $rem; + } + + return implode('', \array_slice($s[0], $start, $len)); + } + + public static function grapheme_strpos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 0); + } + + public static function grapheme_stripos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 1); + } + + public static function grapheme_strrpos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 2); + } + + public static function grapheme_strripos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 3); + } + + public static function grapheme_stristr($s, $needle, $beforeNeedle = false) + { + return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8'); + } + + public static function grapheme_strstr($s, $needle, $beforeNeedle = false) + { + return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8'); + } + + private static function grapheme_position($s, $needle, $offset, $mode) + { + $needle = (string) $needle; + if (!preg_match('/./us', $needle)) { + return false; + } + $s = (string) $s; + if (!preg_match('/./us', $s)) { + return false; + } + if ($offset > 0) { + $s = self::grapheme_substr($s, $offset); + } elseif ($offset < 0) { + if (\PHP_VERSION_ID < 50535 || (50600 <= \PHP_VERSION_ID && \PHP_VERSION_ID < 50621) || (70000 <= \PHP_VERSION_ID && \PHP_VERSION_ID < 70006)) { + $offset = 0; + } elseif (2 > $mode) { + $offset += self::grapheme_strlen($s); + $s = self::grapheme_substr($s, $offset); + if (0 > $offset) { + $offset = 0; + } + } elseif (0 > $offset += self::grapheme_strlen($needle)) { + $s = self::grapheme_substr($s, 0, $offset); + $offset = 0; + } else { + $offset = 0; + } + } + + switch ($mode) { + case 0: $needle = iconv_strpos($s, $needle, 0, 'UTF-8'); break; + case 1: $needle = mb_stripos($s, $needle, 0, 'UTF-8'); break; + case 2: $needle = iconv_strrpos($s, $needle, 'UTF-8'); break; + default: $needle = mb_strripos($s, $needle, 0, 'UTF-8'); break; + } + + return false !== $needle ? self::grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')) + $offset : false; + } +} diff --git a/vendor/symfony/polyfill-intl-grapheme/LICENSE b/vendor/symfony/polyfill-intl-grapheme/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-grapheme/README.md b/vendor/symfony/polyfill-intl-grapheme/README.md new file mode 100644 index 0000000..77523ea --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/README.md @@ -0,0 +1,31 @@ +Symfony Polyfill / Intl: Grapheme +================================= + +This component provides a partial, native PHP implementation of the +[Grapheme functions](https://php.net/intl.grapheme) from the +[Intl](https://php.net/intl) extension. + +- [`grapheme_extract`](https://php.net/grapheme_extract): Extract a sequence of grapheme + clusters from a text buffer, which must be encoded in UTF-8 +- [`grapheme_stripos`](https://php.net/grapheme_stripos): Find position (in grapheme units) + of first occurrence of a case-insensitive string +- [`grapheme_stristr`](https://php.net/grapheme_stristr): Returns part of haystack string + from the first occurrence of case-insensitive needle to the end of haystack +- [`grapheme_strlen`](https://php.net/grapheme_strlen): Get string length in grapheme units +- [`grapheme_strpos`](https://php.net/grapheme_strpos): Find position (in grapheme units) + of first occurrence of a string +- [`grapheme_strripos`](https://php.net/grapheme_strripos): Find position (in grapheme units) + of last occurrence of a case-insensitive string +- [`grapheme_strrpos`](https://php.net/grapheme_strrpos): Find position (in grapheme units) + of last occurrence of a string +- [`grapheme_strstr`](https://php.net/grapheme_strstr): Returns part of haystack string from + the first occurrence of needle to the end of haystack +- [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-grapheme/bootstrap.php b/vendor/symfony/polyfill-intl-grapheme/bootstrap.php new file mode 100644 index 0000000..b290c80 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/bootstrap.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Grapheme as p; + +if (extension_loaded('intl')) { + return; +} + +if (!defined('GRAPHEME_EXTR_COUNT')) { + define('GRAPHEME_EXTR_COUNT', 0); +} +if (!defined('GRAPHEME_EXTR_MAXBYTES')) { + define('GRAPHEME_EXTR_MAXBYTES', 1); +} +if (!defined('GRAPHEME_EXTR_MAXCHARS')) { + define('GRAPHEME_EXTR_MAXCHARS', 2); +} + +if (!function_exists('grapheme_extract')) { + function grapheme_extract($s, $size, $type = 0, $start = 0, &$next = 0) { return p\Grapheme::grapheme_extract($s, $size, $type, $start, $next); } +} +if (!function_exists('grapheme_stripos')) { + function grapheme_stripos($s, $needle, $offset = 0) { return p\Grapheme::grapheme_stripos($s, $needle, $offset); } +} +if (!function_exists('grapheme_stristr')) { + function grapheme_stristr($s, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_stristr($s, $needle, $beforeNeedle); } +} +if (!function_exists('grapheme_strlen')) { + function grapheme_strlen($s) { return p\Grapheme::grapheme_strlen($s); } +} +if (!function_exists('grapheme_strpos')) { + function grapheme_strpos($s, $needle, $offset = 0) { return p\Grapheme::grapheme_strpos($s, $needle, $offset); } +} +if (!function_exists('grapheme_strripos')) { + function grapheme_strripos($s, $needle, $offset = 0) { return p\Grapheme::grapheme_strripos($s, $needle, $offset); } +} +if (!function_exists('grapheme_strrpos')) { + function grapheme_strrpos($s, $needle, $offset = 0) { return p\Grapheme::grapheme_strrpos($s, $needle, $offset); } +} +if (!function_exists('grapheme_strstr')) { + function grapheme_strstr($s, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_strstr($s, $needle, $beforeNeedle); } +} +if (!function_exists('grapheme_substr')) { + function grapheme_substr($s, $start, $len = 2147483647) { return p\Grapheme::grapheme_substr($s, $start, $len); } +} diff --git a/vendor/symfony/polyfill-intl-grapheme/composer.json b/vendor/symfony/polyfill-intl-grapheme/composer.json new file mode 100644 index 0000000..d846944 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/composer.json @@ -0,0 +1,34 @@ +{ + "name": "symfony/polyfill-intl-grapheme", + "type": "library", + "description": "Symfony polyfill for intl's grapheme_* functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "grapheme"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Grapheme\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + } +} diff --git a/vendor/symfony/polyfill-intl-idn/Idn.php b/vendor/symfony/polyfill-intl-idn/Idn.php new file mode 100644 index 0000000..f54ffd5 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Idn.php @@ -0,0 +1,287 @@ + + * @author Sebastian Kroczek + * @author Dmitry Lukashin + * @author Laurent Bassin + * + * @internal + */ +final class Idn +{ + const INTL_IDNA_VARIANT_2003 = 0; + const INTL_IDNA_VARIANT_UTS46 = 1; + + private static $encodeTable = array( + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', + 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', + 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + ); + + private static $decodeTable = array( + 'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5, + 'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, + 'm' => 12, 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17, + 's' => 18, 't' => 19, 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23, + 'y' => 24, 'z' => 25, '0' => 26, '1' => 27, '2' => 28, '3' => 29, + '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34, '9' => 35, + ); + + public static function idn_to_ascii($domain, $options, $variant, &$idna_info = array()) + { + if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { + @trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED); + } + + if (self::INTL_IDNA_VARIANT_UTS46 === $variant) { + $domain = mb_strtolower($domain, 'utf-8'); + } + + $parts = explode('.', $domain); + + foreach ($parts as $i => &$part) { + if ('' === $part && \count($parts) > 1 + $i) { + return false; + } + if (false === $part = self::encodePart($part)) { + return false; + } + } + + $output = implode('.', $parts); + + $idna_info = array( + 'result' => \strlen($output) > 255 ? false : $output, + 'isTransitionalDifferent' => false, + 'errors' => 0, + ); + + return $idna_info['result']; + } + + public static function idn_to_utf8($domain, $options, $variant, &$idna_info = array()) + { + if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { + @trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED); + } + + $parts = explode('.', $domain); + + foreach ($parts as &$part) { + $length = \strlen($part); + if ($length < 1 || 63 < $length) { + continue; + } + if (0 !== strpos($part, 'xn--')) { + continue; + } + + $part = substr($part, 4); + $part = self::decodePart($part); + } + + $output = implode('.', $parts); + + $idna_info = array( + 'result' => \strlen($output) > 255 ? false : $output, + 'isTransitionalDifferent' => false, + 'errors' => 0, + ); + + return $idna_info['result']; + } + + private static function encodePart($input) + { + if (\substr($input, 0, 1) === '-' || \substr($input, -1) === '-') { + return false; + } + + $codePoints = self::listCodePoints($input); + + $n = 128; + $bias = 72; + $delta = 0; + $h = $b = \count($codePoints['basic']); + + $output = ''; + foreach ($codePoints['basic'] as $code) { + $output .= mb_chr($code, 'utf-8'); + } + if ($input === $output) { + return $output; + } + if ($b > 0) { + $output .= '-'; + } + + $codePoints['nonBasic'] = array_unique($codePoints['nonBasic']); + sort($codePoints['nonBasic']); + + $i = 0; + $length = mb_strlen($input, 'utf-8'); + while ($h < $length) { + $m = $codePoints['nonBasic'][$i++]; + $delta += ($m - $n) * ($h + 1); + $n = $m; + + foreach ($codePoints['all'] as $c) { + if ($c < $n || $c < 128) { + ++$delta; + } + if ($c === $n) { + $q = $delta; + for ($k = 36;; $k += 36) { + $t = self::calculateThreshold($k, $bias); + if ($q < $t) { + break; + } + + $code = $t + (($q - $t) % (36 - $t)); + $output .= self::$encodeTable[$code]; + + $q = ($q - $t) / (36 - $t); + } + + $output .= self::$encodeTable[$q]; + $bias = self::adapt($delta, $h + 1, ($h === $b)); + $delta = 0; + ++$h; + } + } + + ++$delta; + ++$n; + } + + $output = 'xn--'.$output; + + return \strlen($output) < 1 || 63 < \strlen($output) ? false : strtolower($output); + } + + private static function listCodePoints($input) + { + $codePoints = array( + 'all' => array(), + 'basic' => array(), + 'nonBasic' => array(), + ); + + $length = mb_strlen($input, 'utf-8'); + for ($i = 0; $i < $length; ++$i) { + $char = mb_substr($input, $i, 1, 'utf-8'); + $code = mb_ord($char, 'utf-8'); + if ($code < 128) { + $codePoints['all'][] = $codePoints['basic'][] = $code; + } else { + $codePoints['all'][] = $codePoints['nonBasic'][] = $code; + } + } + + return $codePoints; + } + + private static function calculateThreshold($k, $bias) + { + if ($k <= $bias + 1) { + return 1; + } + if ($k >= $bias + 26) { + return 26; + } + + return $k - $bias; + } + + private static function adapt($delta, $numPoints, $firstTime) + { + $delta = (int) ($firstTime ? $delta / 700 : $delta / 2); + $delta += (int) ($delta / $numPoints); + + $k = 0; + while ($delta > 35 * 13) { + $delta = (int) ($delta / 35); + $k = $k + 36; + } + + return $k + (int) (36 * $delta / ($delta + 38)); + } + + private static function decodePart($input) + { + $n = 128; + $i = 0; + $bias = 72; + $output = ''; + + $pos = strrpos($input, '-'); + if (false !== $pos) { + $output = substr($input, 0, $pos++); + } else { + $pos = 0; + } + + $outputLength = \strlen($output); + $inputLength = \strlen($input); + + while ($pos < $inputLength) { + $oldi = $i; + $w = 1; + + for ($k = 36;; $k += 36) { + $digit = self::$decodeTable[$input[$pos++]]; + $i += $digit * $w; + $t = self::calculateThreshold($k, $bias); + + if ($digit < $t) { + break; + } + + $w *= 36 - $t; + } + + $bias = self::adapt($i - $oldi, ++$outputLength, 0 === $oldi); + $n = $n + (int) ($i / $outputLength); + $i = $i % $outputLength; + $output = mb_substr($output, 0, $i, 'utf-8').mb_chr($n, 'utf-8').mb_substr($output, $i, $outputLength - 1, 'utf-8'); + + ++$i; + } + + return $output; + } +} diff --git a/vendor/symfony/polyfill-intl-idn/LICENSE b/vendor/symfony/polyfill-intl-idn/LICENSE new file mode 100644 index 0000000..3f853aa --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-idn/README.md b/vendor/symfony/polyfill-intl-idn/README.md new file mode 100644 index 0000000..2e75f2e --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Intl: Idn +============================ + +This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-idn/bootstrap.php b/vendor/symfony/polyfill-intl-idn/bootstrap.php new file mode 100644 index 0000000..f02d5de --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/bootstrap.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Idn as p; + +if (extension_loaded('intl')) { + return; +} + +if (!defined('U_IDNA_PROHIBITED_ERROR')) { + define('U_IDNA_PROHIBITED_ERROR', 66560); +} +if (!defined('U_IDNA_ERROR_START')) { + define('U_IDNA_ERROR_START', 66560); +} +if (!defined('U_IDNA_UNASSIGNED_ERROR')) { + define('U_IDNA_UNASSIGNED_ERROR', 66561); +} +if (!defined('U_IDNA_CHECK_BIDI_ERROR')) { + define('U_IDNA_CHECK_BIDI_ERROR', 66562); +} +if (!defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { + define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); +} +if (!defined('U_IDNA_ACE_PREFIX_ERROR')) { + define('U_IDNA_ACE_PREFIX_ERROR', 66564); +} +if (!defined('U_IDNA_VERIFICATION_ERROR')) { + define('U_IDNA_VERIFICATION_ERROR', 66565); +} +if (!defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { + define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); +} +if (!defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { + define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); +} +if (!defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { + define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); +} +if (!defined('U_IDNA_ERROR_LIMIT')) { + define('U_IDNA_ERROR_LIMIT', 66569); +} +if (!defined('U_STRINGPREP_PROHIBITED_ERROR')) { + define('U_STRINGPREP_PROHIBITED_ERROR', 66560); +} +if (!defined('U_STRINGPREP_UNASSIGNED_ERROR')) { + define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); +} +if (!defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { + define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); +} +if (!defined('IDNA_DEFAULT')) { + define('IDNA_DEFAULT', 0); +} +if (!defined('IDNA_ALLOW_UNASSIGNED')) { + define('IDNA_ALLOW_UNASSIGNED', 1); +} +if (!defined('IDNA_USE_STD3_RULES')) { + define('IDNA_USE_STD3_RULES', 2); +} +if (!defined('IDNA_CHECK_BIDI')) { + define('IDNA_CHECK_BIDI', 4); +} +if (!defined('IDNA_CHECK_CONTEXTJ')) { + define('IDNA_CHECK_CONTEXTJ', 8); +} +if (!defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { + define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); +} +if (!defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { + define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); +} +if (!defined('INTL_IDNA_VARIANT_2003')) { + define('INTL_IDNA_VARIANT_2003', 0); +} +if (!defined('INTL_IDNA_VARIANT_UTS46')) { + define('INTL_IDNA_VARIANT_UTS46', 1); +} +if (!defined('IDNA_ERROR_EMPTY_LABEL')) { + define('IDNA_ERROR_EMPTY_LABEL', 1); +} +if (!defined('IDNA_ERROR_LABEL_TOO_LONG')) { + define('IDNA_ERROR_LABEL_TOO_LONG', 2); +} +if (!defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { + define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); +} +if (!defined('IDNA_ERROR_LEADING_HYPHEN')) { + define('IDNA_ERROR_LEADING_HYPHEN', 8); +} +if (!defined('IDNA_ERROR_TRAILING_HYPHEN')) { + define('IDNA_ERROR_TRAILING_HYPHEN', 16); +} +if (!defined('IDNA_ERROR_HYPHEN_3_4')) { + define('IDNA_ERROR_HYPHEN_3_4', 32); +} +if (!defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { + define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); +} +if (!defined('IDNA_ERROR_DISALLOWED')) { + define('IDNA_ERROR_DISALLOWED', 128); +} +if (!defined('IDNA_ERROR_PUNYCODE')) { + define('IDNA_ERROR_PUNYCODE', 256); +} +if (!defined('IDNA_ERROR_LABEL_HAS_DOT')) { + define('IDNA_ERROR_LABEL_HAS_DOT', 512); +} +if (!defined('IDNA_ERROR_INVALID_ACE_LABEL')) { + define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); +} +if (!defined('IDNA_ERROR_BIDI')) { + define('IDNA_ERROR_BIDI', 2048); +} +if (!defined('IDNA_ERROR_CONTEXTJ')) { + define('IDNA_ERROR_CONTEXTJ', 4096); +} + +if (PHP_VERSION_ID < 70400) { + if (!function_exists('idn_to_ascii')) { + function idn_to_ascii($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } + } + if (!function_exists('idn_to_utf8')) { + function idn_to_utf8($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } + } +} else { + if (!function_exists('idn_to_ascii')) { + function idn_to_ascii($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } + } + if (!function_exists('idn_to_utf8')) { + function idn_to_utf8($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } + } +} diff --git a/vendor/symfony/polyfill-intl-idn/composer.json b/vendor/symfony/polyfill-intl-idn/composer.json new file mode 100644 index 0000000..550bdc2 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/composer.json @@ -0,0 +1,36 @@ +{ + "name": "symfony/polyfill-intl-idn", + "type": "library", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "idn"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.10" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/LICENSE b/vendor/symfony/polyfill-intl-normalizer/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php new file mode 100644 index 0000000..c5da97d --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php @@ -0,0 +1,305 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Normalizer; + +/** + * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. + * + * It has been validated with Unicode 6.3 Normalization Conformance Test. + * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. + * + * @author Nicolas Grekas + * + * @internal + */ +class Normalizer +{ + const NONE = \Normalizer::NONE; + const FORM_D = \Normalizer::FORM_D; + const FORM_KD = \Normalizer::FORM_KD; + const FORM_C = \Normalizer::FORM_C; + const FORM_KC = \Normalizer::FORM_KC; + const NFD = \Normalizer::NFD; + const NFKD = \Normalizer::NFKD; + const NFC = \Normalizer::NFC; + const NFKC = \Normalizer::NFKC; + + private static $C; + private static $D; + private static $KD; + private static $cC; + private static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); + private static $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; + + public static function isNormalized($s, $form = self::NFC) + { + if ($form <= self::NONE || self::NFKC < $form) { + return false; + } + $s = (string) $s; + if (!isset($s[strspn($s, self::$ASCII)])) { + return true; + } + if (self::NFC === $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) { + return true; + } + + return false; // Pretend false as quick checks implementented in PHP won't be so quick + } + + public static function normalize($s, $form = self::NFC) + { + $s = (string) $s; + if (!preg_match('//u', $s)) { + return false; + } + + switch ($form) { + case self::NONE: return $s; + case self::NFC: $C = true; $K = false; break; + case self::NFD: $C = false; $K = false; break; + case self::NFKC: $C = true; $K = true; break; + case self::NFKD: $C = false; $K = true; break; + default: return false; + } + + if ('' === $s) { + return ''; + } + + if ($K && null === self::$KD) { + self::$KD = self::getData('compatibilityDecomposition'); + } + + if (null === self::$D) { + self::$D = self::getData('canonicalDecomposition'); + self::$cC = self::getData('combiningClass'); + } + + if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { + mb_internal_encoding('8bit'); + } + + $r = self::decompose($s, $K); + + if ($C) { + if (null === self::$C) { + self::$C = self::getData('canonicalComposition'); + } + + $r = self::recompose($r); + } + if (null !== $mbEncoding) { + mb_internal_encoding($mbEncoding); + } + + return $r; + } + + private static function recompose($s) + { + $ASCII = self::$ASCII; + $compMap = self::$C; + $combClass = self::$cC; + $ulenMask = self::$ulenMask; + + $result = $tail = ''; + + $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xF0"]; + $len = \strlen($s); + + $lastUchr = substr($s, 0, $i); + $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0; + + while ($i < $len) { + if ($s[$i] < "\x80") { + // ASCII chars + + if ($tail) { + $lastUchr .= $tail; + $tail = ''; + } + + if ($j = strspn($s, $ASCII, $i + 1)) { + $lastUchr .= substr($s, $i, $j); + $i += $j; + } + + $result .= $lastUchr; + $lastUchr = $s[$i]; + $lastUcls = 0; + ++$i; + continue; + } + + $ulen = $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + + if ($lastUchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr + || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr + || $lastUcls) { + // Table lookup and combining chars composition + + $ucls = isset($combClass[$uchr]) ? $combClass[$uchr] : 0; + + if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) { + $lastUchr = $compMap[$lastUchr.$uchr]; + } elseif ($lastUcls = $ucls) { + $tail .= $uchr; + } else { + if ($tail) { + $lastUchr .= $tail; + $tail = ''; + } + + $result .= $lastUchr; + $lastUchr = $uchr; + } + } else { + // Hangul chars + + $L = \ord($lastUchr[2]) - 0x80; + $V = \ord($uchr[2]) - 0xA1; + $T = 0; + + $uchr = substr($s, $i + $ulen, 3); + + if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") { + $T = \ord($uchr[2]) - 0xA7; + 0 > $T && $T += 0x40; + $ulen += 3; + } + + $L = 0xAC00 + ($L * 21 + $V) * 28 + $T; + $lastUchr = \chr(0xE0 | $L >> 12).\chr(0x80 | $L >> 6 & 0x3F).\chr(0x80 | $L & 0x3F); + } + + $i += $ulen; + } + + return $result.$lastUchr.$tail; + } + + private static function decompose($s, $c) + { + $result = ''; + + $ASCII = self::$ASCII; + $decompMap = self::$D; + $combClass = self::$cC; + $ulenMask = self::$ulenMask; + if ($c) { + $compatMap = self::$KD; + } + + $c = array(); + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + if ($s[$i] < "\x80") { + // ASCII chars + + if ($c) { + ksort($c); + $result .= implode('', $c); + $c = array(); + } + + $j = 1 + strspn($s, $ASCII, $i + 1); + $result .= substr($s, $i, $j); + $i += $j; + continue; + } + + $ulen = $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) { + // Table lookup + + if ($uchr !== $j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr)) { + $uchr = $j; + + $j = \strlen($uchr); + $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"]; + + if ($ulen != $j) { + // Put trailing chars in $s + + $j -= $ulen; + $i -= $j; + + if (0 > $i) { + $s = str_repeat(' ', -$i).$s; + $len -= $i; + $i = 0; + } + + while ($j--) { + $s[$i + $j] = $uchr[$ulen + $j]; + } + + $uchr = substr($uchr, 0, $ulen); + } + } + if (isset($combClass[$uchr])) { + // Combining chars, for sorting + + if (!isset($c[$combClass[$uchr]])) { + $c[$combClass[$uchr]] = ''; + } + $c[$combClass[$uchr]] .= $uchr; + continue; + } + } else { + // Hangul chars + + $uchr = unpack('C*', $uchr); + $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80; + + $uchr = "\xE1\x84".\chr(0x80 + (int) ($j / 588)) + ."\xE1\x85".\chr(0xA1 + (int) (($j % 588) / 28)); + + if ($j %= 28) { + $uchr .= $j < 25 + ? ("\xE1\x86".\chr(0xA7 + $j)) + : ("\xE1\x87".\chr(0x67 + $j)); + } + } + if ($c) { + ksort($c); + $result .= implode('', $c); + $c = array(); + } + + $result .= $uchr; + } + + if ($c) { + ksort($c); + $result .= implode('', $c); + } + + return $result; + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/README.md b/vendor/symfony/polyfill-intl-normalizer/README.md new file mode 100644 index 0000000..15060c5 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/README.md @@ -0,0 +1,14 @@ +Symfony Polyfill / Intl: Normalizer +=================================== + +This component provides a fallback implementation for the +[`Normalizer`](https://php.net/Normalizer) class provided +by the [Intl](https://php.net/intl) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php new file mode 100644 index 0000000..894c656 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php @@ -0,0 +1,14 @@ + 'À', + 'AÌ' => 'Ã', + 'AÌ‚' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'AÌŠ' => 'Ã…', + 'Ç' => 'Ç', + 'EÌ€' => 'È', + 'EÌ' => 'É', + 'EÌ‚' => 'Ê', + 'Ë' => 'Ë', + 'IÌ€' => 'ÃŒ', + 'IÌ' => 'Ã', + 'IÌ‚' => 'ÃŽ', + 'Ï' => 'Ã', + 'Ñ' => 'Ñ', + 'OÌ€' => 'Ã’', + 'OÌ' => 'Ó', + 'OÌ‚' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + 'UÌ€' => 'Ù', + 'UÌ' => 'Ú', + 'UÌ‚' => 'Û', + 'Ü' => 'Ü', + 'YÌ' => 'Ã', + 'aÌ€' => 'à', + 'aÌ' => 'á', + 'aÌ‚' => 'â', + 'ã' => 'ã', + 'ä' => 'ä', + 'aÌŠ' => 'Ã¥', + 'ç' => 'ç', + 'eÌ€' => 'è', + 'eÌ' => 'é', + 'eÌ‚' => 'ê', + 'ë' => 'ë', + 'iÌ€' => 'ì', + 'iÌ' => 'í', + 'iÌ‚' => 'î', + 'ï' => 'ï', + 'ñ' => 'ñ', + 'oÌ€' => 'ò', + 'oÌ' => 'ó', + 'oÌ‚' => 'ô', + 'õ' => 'õ', + 'ö' => 'ö', + 'uÌ€' => 'ù', + 'uÌ' => 'ú', + 'uÌ‚' => 'û', + 'ü' => 'ü', + 'yÌ' => 'ý', + 'ÿ' => 'ÿ', + 'AÌ„' => 'Ä€', + 'aÌ„' => 'Ä', + 'Ă' => 'Ä‚', + 'ă' => 'ă', + 'Ą' => 'Ä„', + 'ą' => 'Ä…', + 'CÌ' => 'Ć', + 'cÌ' => 'ć', + 'CÌ‚' => 'Ĉ', + 'cÌ‚' => 'ĉ', + 'Ċ' => 'ÄŠ', + 'ċ' => 'Ä‹', + 'CÌŒ' => 'ÄŒ', + 'cÌŒ' => 'Ä', + 'DÌŒ' => 'ÄŽ', + 'dÌŒ' => 'Ä', + 'EÌ„' => 'Ä’', + 'eÌ„' => 'Ä“', + 'Ĕ' => 'Ä”', + 'ĕ' => 'Ä•', + 'Ė' => 'Ä–', + 'ė' => 'Ä—', + 'Ę' => 'Ę', + 'ę' => 'Ä™', + 'EÌŒ' => 'Äš', + 'eÌŒ' => 'Ä›', + 'GÌ‚' => 'Äœ', + 'gÌ‚' => 'Ä', + 'Ğ' => 'Äž', + 'ğ' => 'ÄŸ', + 'Ġ' => 'Ä ', + 'ġ' => 'Ä¡', + 'Ģ' => 'Ä¢', + 'ģ' => 'Ä£', + 'HÌ‚' => 'Ĥ', + 'hÌ‚' => 'Ä¥', + 'Ĩ' => 'Ĩ', + 'ĩ' => 'Ä©', + 'IÌ„' => 'Ī', + 'iÌ„' => 'Ä«', + 'Ĭ' => 'Ĭ', + 'ĭ' => 'Ä­', + 'Į' => 'Ä®', + 'į' => 'į', + 'İ' => 'İ', + 'JÌ‚' => 'Ä´', + 'jÌ‚' => 'ĵ', + 'Ķ' => 'Ķ', + 'ķ' => 'Ä·', + 'LÌ' => 'Ĺ', + 'lÌ' => 'ĺ', + 'Ļ' => 'Ä»', + 'ļ' => 'ļ', + 'LÌŒ' => 'Ľ', + 'lÌŒ' => 'ľ', + 'NÌ' => 'Ń', + 'nÌ' => 'Å„', + 'Ņ' => 'Å…', + 'ņ' => 'ņ', + 'NÌŒ' => 'Ň', + 'nÌŒ' => 'ň', + 'OÌ„' => 'ÅŒ', + 'oÌ„' => 'Å', + 'Ŏ' => 'ÅŽ', + 'ŏ' => 'Å', + 'OÌ‹' => 'Å', + 'oÌ‹' => 'Å‘', + 'RÌ' => 'Å”', + 'rÌ' => 'Å•', + 'Ŗ' => 'Å–', + 'ŗ' => 'Å—', + 'RÌŒ' => 'Ř', + 'rÌŒ' => 'Å™', + 'SÌ' => 'Åš', + 'sÌ' => 'Å›', + 'SÌ‚' => 'Åœ', + 'sÌ‚' => 'Å', + 'Ş' => 'Åž', + 'ş' => 'ÅŸ', + 'SÌŒ' => 'Å ', + 'sÌŒ' => 'Å¡', + 'Ţ' => 'Å¢', + 'ţ' => 'Å£', + 'TÌŒ' => 'Ť', + 'tÌŒ' => 'Å¥', + 'Ũ' => 'Ũ', + 'ũ' => 'Å©', + 'UÌ„' => 'Ū', + 'uÌ„' => 'Å«', + 'Ŭ' => 'Ŭ', + 'ŭ' => 'Å­', + 'UÌŠ' => 'Å®', + 'uÌŠ' => 'ů', + 'UÌ‹' => 'Ű', + 'uÌ‹' => 'ű', + 'Ų' => 'Ų', + 'ų' => 'ų', + 'WÌ‚' => 'Å´', + 'wÌ‚' => 'ŵ', + 'YÌ‚' => 'Ŷ', + 'yÌ‚' => 'Å·', + 'Ÿ' => 'Ÿ', + 'ZÌ' => 'Ź', + 'zÌ' => 'ź', + 'Ż' => 'Å»', + 'ż' => 'ż', + 'ZÌŒ' => 'Ž', + 'zÌŒ' => 'ž', + 'OÌ›' => 'Æ ', + 'oÌ›' => 'Æ¡', + 'UÌ›' => 'Ư', + 'uÌ›' => 'ư', + 'AÌŒ' => 'Ç', + 'aÌŒ' => 'ÇŽ', + 'IÌŒ' => 'Ç', + 'iÌŒ' => 'Ç', + 'OÌŒ' => 'Ç‘', + 'oÌŒ' => 'Ç’', + 'UÌŒ' => 'Ç“', + 'uÌŒ' => 'Ç”', + 'Ǖ' => 'Ç•', + 'ǖ' => 'Ç–', + 'ÜÌ' => 'Ç—', + 'üÌ' => 'ǘ', + 'Ǚ' => 'Ç™', + 'ǚ' => 'Çš', + 'Ǜ' => 'Ç›', + 'ǜ' => 'Çœ', + 'Ǟ' => 'Çž', + 'ǟ' => 'ÇŸ', + 'Ǡ' => 'Ç ', + 'ǡ' => 'Ç¡', + 'Ǣ' => 'Ç¢', + 'ǣ' => 'Ç£', + 'GÌŒ' => 'Ǧ', + 'gÌŒ' => 'ǧ', + 'KÌŒ' => 'Ǩ', + 'kÌŒ' => 'Ç©', + 'Ǫ' => 'Ǫ', + 'ǫ' => 'Ç«', + 'Ǭ' => 'Ǭ', + 'ǭ' => 'Ç­', + 'Æ·ÌŒ' => 'Ç®', + 'Ê’ÌŒ' => 'ǯ', + 'jÌŒ' => 'ǰ', + 'GÌ' => 'Ç´', + 'gÌ' => 'ǵ', + 'NÌ€' => 'Ǹ', + 'nÌ€' => 'ǹ', + 'Ã…Ì' => 'Ǻ', + 'Ã¥Ì' => 'Ç»', + 'ÆÌ' => 'Ǽ', + 'æÌ' => 'ǽ', + 'ØÌ' => 'Ǿ', + 'øÌ' => 'Ç¿', + 'AÌ' => 'È€', + 'aÌ' => 'È', + 'AÌ‘' => 'È‚', + 'aÌ‘' => 'ȃ', + 'EÌ' => 'È„', + 'eÌ' => 'È…', + 'EÌ‘' => 'Ȇ', + 'eÌ‘' => 'ȇ', + 'IÌ' => 'Ȉ', + 'iÌ' => 'ȉ', + 'IÌ‘' => 'ÈŠ', + 'iÌ‘' => 'È‹', + 'OÌ' => 'ÈŒ', + 'oÌ' => 'È', + 'OÌ‘' => 'ÈŽ', + 'oÌ‘' => 'È', + 'RÌ' => 'È', + 'rÌ' => 'È‘', + 'RÌ‘' => 'È’', + 'rÌ‘' => 'È“', + 'UÌ' => 'È”', + 'uÌ' => 'È•', + 'UÌ‘' => 'È–', + 'uÌ‘' => 'È—', + 'Ș' => 'Ș', + 'ș' => 'È™', + 'Ț' => 'Èš', + 'ț' => 'È›', + 'HÌŒ' => 'Èž', + 'hÌŒ' => 'ÈŸ', + 'Ȧ' => 'Ȧ', + 'ȧ' => 'ȧ', + 'Ȩ' => 'Ȩ', + 'ȩ' => 'È©', + 'Ȫ' => 'Ȫ', + 'ȫ' => 'È«', + 'Ȭ' => 'Ȭ', + 'ȭ' => 'È­', + 'Ȯ' => 'È®', + 'ȯ' => 'ȯ', + 'Ȱ' => 'Ȱ', + 'ȱ' => 'ȱ', + 'YÌ„' => 'Ȳ', + 'yÌ„' => 'ȳ', + '¨Ì' => 'Î…', + 'ΑÌ' => 'Ά', + 'ΕÌ' => 'Έ', + 'ΗÌ' => 'Ή', + 'ΙÌ' => 'Ί', + 'ΟÌ' => 'ÎŒ', + 'Î¥Ì' => 'ÎŽ', + 'ΩÌ' => 'Î', + 'ÏŠÌ' => 'Î', + 'Ϊ' => 'Ϊ', + 'Ϋ' => 'Ϋ', + 'αÌ' => 'ά', + 'εÌ' => 'έ', + 'ηÌ' => 'ή', + 'ιÌ' => 'ί', + 'Ï‹Ì' => 'ΰ', + 'ϊ' => 'ÏŠ', + 'ϋ' => 'Ï‹', + 'οÌ' => 'ÏŒ', + 'Ï…Ì' => 'Ï', + 'ωÌ' => 'ÏŽ', + 'Ï’Ì' => 'Ï“', + 'ϔ' => 'Ï”', + 'Ѐ' => 'Ѐ', + 'Ё' => 'Ð', + 'ГÌ' => 'Ѓ', + 'Ї' => 'Ї', + 'КÌ' => 'ÐŒ', + 'Ѝ' => 'Ð', + 'Ў' => 'ÐŽ', + 'Й' => 'Й', + 'й' => 'й', + 'ѐ' => 'Ñ', + 'ё' => 'Ñ‘', + 'гÌ' => 'Ñ“', + 'ї' => 'Ñ—', + 'кÌ' => 'Ñœ', + 'ѝ' => 'Ñ', + 'ў' => 'Ñž', + 'Ñ´Ì' => 'Ѷ', + 'ѵÌ' => 'Ñ·', + 'Ӂ' => 'Ó', + 'ӂ' => 'Ó‚', + 'Ð̆' => 'Ó', + 'ӑ' => 'Ó‘', + 'Ð̈' => 'Ó’', + 'ӓ' => 'Ó“', + 'Ӗ' => 'Ó–', + 'ӗ' => 'Ó—', + 'Ӛ' => 'Óš', + 'ӛ' => 'Ó›', + 'Ӝ' => 'Óœ', + 'ӝ' => 'Ó', + 'Ӟ' => 'Óž', + 'ӟ' => 'ÓŸ', + 'Ӣ' => 'Ó¢', + 'ӣ' => 'Ó£', + 'Ӥ' => 'Ó¤', + 'ӥ' => 'Ó¥', + 'Ӧ' => 'Ó¦', + 'ӧ' => 'Ó§', + 'Ӫ' => 'Óª', + 'ӫ' => 'Ó«', + 'Ӭ' => 'Ó¬', + 'Ñ̈' => 'Ó­', + 'Ӯ' => 'Ó®', + 'ӯ' => 'Ó¯', + 'Ӱ' => 'Ó°', + 'ӱ' => 'Ó±', + 'Ӳ' => 'Ó²', + 'ӳ' => 'Ó³', + 'Ӵ' => 'Ó´', + 'ӵ' => 'Óµ', + 'Ӹ' => 'Ó¸', + 'ӹ' => 'Ó¹', + 'آ' => 'Ø¢', + 'أ' => 'Ø£', + 'ÙˆÙ”' => 'ؤ', + 'إ' => 'Ø¥', + 'ÙŠÙ”' => 'ئ', + 'Û•Ù”' => 'Û€', + 'ÛÙ”' => 'Û‚', + 'Û’Ù”' => 'Û“', + 'ऩ' => 'ऩ', + 'ऱ' => 'ऱ', + 'ऴ' => 'ऴ', + 'ো' => 'à§‹', + 'ৌ' => 'à§Œ', + 'ୈ' => 'à­ˆ', + 'ୋ' => 'à­‹', + 'ୌ' => 'à­Œ', + 'ஔ' => 'à®”', + 'ொ' => 'ொ', + 'ோ' => 'ோ', + 'ௌ' => 'ௌ', + 'ై' => 'ై', + 'ೀ' => 'à³€', + 'ೇ' => 'ೇ', + 'ೈ' => 'ೈ', + 'ೊ' => 'ೊ', + 'ೋ' => 'ೋ', + 'ൊ' => 'ൊ', + 'ോ' => 'ോ', + 'ൌ' => 'ൌ', + 'ේ' => 'à·š', + 'à·™à·' => 'à·œ', + 'ෝ' => 'à·', + 'ෞ' => 'à·ž', + 'ဦ' => 'ဦ', + 'ᬆ' => 'ᬆ', + 'ᬈ' => 'ᬈ', + 'ᬊ' => 'ᬊ', + 'ᬌ' => 'ᬌ', + 'á¬á¬µ' => 'ᬎ', + 'ᬒ' => 'ᬒ', + 'ᬻ' => 'ᬻ', + 'ᬽ' => 'ᬽ', + 'ᭀ' => 'á­€', + 'ᭁ' => 'á­', + 'ᭃ' => 'á­ƒ', + 'AÌ¥' => 'Ḁ', + 'aÌ¥' => 'á¸', + 'Ḃ' => 'Ḃ', + 'ḃ' => 'ḃ', + 'BÌ£' => 'Ḅ', + 'bÌ£' => 'ḅ', + 'Ḇ' => 'Ḇ', + 'ḇ' => 'ḇ', + 'ÇÌ' => 'Ḉ', + 'çÌ' => 'ḉ', + 'Ḋ' => 'Ḋ', + 'ḋ' => 'ḋ', + 'DÌ£' => 'Ḍ', + 'dÌ£' => 'á¸', + 'Ḏ' => 'Ḏ', + 'ḏ' => 'á¸', + 'Ḑ' => 'á¸', + 'ḑ' => 'ḑ', + 'DÌ­' => 'Ḓ', + 'dÌ­' => 'ḓ', + 'Ä’Ì€' => 'Ḕ', + 'ḕ' => 'ḕ', + 'Ä’Ì' => 'Ḗ', + 'Ä“Ì' => 'ḗ', + 'EÌ­' => 'Ḙ', + 'eÌ­' => 'ḙ', + 'Ḛ' => 'Ḛ', + 'ḛ' => 'ḛ', + 'Ḝ' => 'Ḝ', + 'ḝ' => 'á¸', + 'Ḟ' => 'Ḟ', + 'ḟ' => 'ḟ', + 'GÌ„' => 'Ḡ', + 'gÌ„' => 'ḡ', + 'Ḣ' => 'Ḣ', + 'ḣ' => 'ḣ', + 'HÌ£' => 'Ḥ', + 'hÌ£' => 'ḥ', + 'Ḧ' => 'Ḧ', + 'ḧ' => 'ḧ', + 'Ḩ' => 'Ḩ', + 'ḩ' => 'ḩ', + 'HÌ®' => 'Ḫ', + 'hÌ®' => 'ḫ', + 'Ḭ' => 'Ḭ', + 'ḭ' => 'ḭ', + 'ÃÌ' => 'Ḯ', + 'ïÌ' => 'ḯ', + 'KÌ' => 'Ḱ', + 'kÌ' => 'ḱ', + 'KÌ£' => 'Ḳ', + 'kÌ£' => 'ḳ', + 'Ḵ' => 'Ḵ', + 'ḵ' => 'ḵ', + 'LÌ£' => 'Ḷ', + 'lÌ£' => 'ḷ', + 'Ḹ' => 'Ḹ', + 'ḹ' => 'ḹ', + 'Ḻ' => 'Ḻ', + 'ḻ' => 'ḻ', + 'LÌ­' => 'Ḽ', + 'lÌ­' => 'ḽ', + 'MÌ' => 'Ḿ', + 'mÌ' => 'ḿ', + 'Ṁ' => 'á¹€', + 'ṁ' => 'á¹', + 'MÌ£' => 'Ṃ', + 'mÌ£' => 'ṃ', + 'Ṅ' => 'Ṅ', + 'ṅ' => 'á¹…', + 'NÌ£' => 'Ṇ', + 'nÌ£' => 'ṇ', + 'Ṉ' => 'Ṉ', + 'ṉ' => 'ṉ', + 'NÌ­' => 'Ṋ', + 'nÌ­' => 'ṋ', + 'ÕÌ' => 'Ṍ', + 'õÌ' => 'á¹', + 'Ṏ' => 'Ṏ', + 'ṏ' => 'á¹', + 'Ṑ' => 'á¹', + 'ÅÌ€' => 'ṑ', + 'ÅŒÌ' => 'á¹’', + 'ÅÌ' => 'ṓ', + 'PÌ' => 'á¹”', + 'pÌ' => 'ṕ', + 'Ṗ' => 'á¹–', + 'ṗ' => 'á¹—', + 'Ṙ' => 'Ṙ', + 'ṙ' => 'á¹™', + 'RÌ£' => 'Ṛ', + 'rÌ£' => 'á¹›', + 'Ṝ' => 'Ṝ', + 'ṝ' => 'á¹', + 'Ṟ' => 'Ṟ', + 'ṟ' => 'ṟ', + 'Ṡ' => 'á¹ ', + 'ṡ' => 'ṡ', + 'SÌ£' => 'á¹¢', + 'sÌ£' => 'á¹£', + 'Ṥ' => 'Ṥ', + 'ṥ' => 'á¹¥', + 'Ṧ' => 'Ṧ', + 'ṧ' => 'á¹§', + 'Ṩ' => 'Ṩ', + 'ṩ' => 'ṩ', + 'Ṫ' => 'Ṫ', + 'ṫ' => 'ṫ', + 'TÌ£' => 'Ṭ', + 'tÌ£' => 'á¹­', + 'Ṯ' => 'á¹®', + 'ṯ' => 'ṯ', + 'TÌ­' => 'á¹°', + 'tÌ­' => 'á¹±', + 'Ṳ' => 'á¹²', + 'ṳ' => 'á¹³', + 'Ṵ' => 'á¹´', + 'ṵ' => 'á¹µ', + 'UÌ­' => 'á¹¶', + 'uÌ­' => 'á¹·', + 'ŨÌ' => 'Ṹ', + 'Å©Ì' => 'á¹¹', + 'Ṻ' => 'Ṻ', + 'ṻ' => 'á¹»', + 'Ṽ' => 'á¹¼', + 'ṽ' => 'á¹½', + 'VÌ£' => 'á¹¾', + 'vÌ£' => 'ṿ', + 'WÌ€' => 'Ẁ', + 'wÌ€' => 'áº', + 'WÌ' => 'Ẃ', + 'wÌ' => 'ẃ', + 'Ẅ' => 'Ẅ', + 'ẅ' => 'ẅ', + 'Ẇ' => 'Ẇ', + 'ẇ' => 'ẇ', + 'WÌ£' => 'Ẉ', + 'wÌ£' => 'ẉ', + 'Ẋ' => 'Ẋ', + 'ẋ' => 'ẋ', + 'Ẍ' => 'Ẍ', + 'ẍ' => 'áº', + 'Ẏ' => 'Ẏ', + 'ẏ' => 'áº', + 'ZÌ‚' => 'áº', + 'zÌ‚' => 'ẑ', + 'ZÌ£' => 'Ẓ', + 'zÌ£' => 'ẓ', + 'Ẕ' => 'Ẕ', + 'ẕ' => 'ẕ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'wÌŠ' => 'ẘ', + 'yÌŠ' => 'ẙ', + 'ẛ' => 'ẛ', + 'AÌ£' => 'Ạ', + 'aÌ£' => 'ạ', + 'Ả' => 'Ả', + 'ả' => 'ả', + 'ÂÌ' => 'Ấ', + 'âÌ' => 'ấ', + 'Ầ' => 'Ầ', + 'ầ' => 'ầ', + 'Ẩ' => 'Ẩ', + 'ẩ' => 'ẩ', + 'Ẫ' => 'Ẫ', + 'ẫ' => 'ẫ', + 'Ậ' => 'Ậ', + 'ậ' => 'ậ', + 'Ä‚Ì' => 'Ắ', + 'ăÌ' => 'ắ', + 'Ằ' => 'Ằ', + 'ằ' => 'ằ', + 'Ẳ' => 'Ẳ', + 'ẳ' => 'ẳ', + 'Ẵ' => 'Ẵ', + 'ẵ' => 'ẵ', + 'Ặ' => 'Ặ', + 'ặ' => 'ặ', + 'EÌ£' => 'Ẹ', + 'eÌ£' => 'ẹ', + 'Ẻ' => 'Ẻ', + 'ẻ' => 'ẻ', + 'Ẽ' => 'Ẽ', + 'ẽ' => 'ẽ', + 'ÊÌ' => 'Ế', + 'êÌ' => 'ế', + 'Ề' => 'Ề', + 'ề' => 'á»', + 'Ể' => 'Ể', + 'ể' => 'ể', + 'Ễ' => 'Ễ', + 'ễ' => 'á»…', + 'Ệ' => 'Ệ', + 'ệ' => 'ệ', + 'Ỉ' => 'Ỉ', + 'ỉ' => 'ỉ', + 'IÌ£' => 'Ị', + 'iÌ£' => 'ị', + 'OÌ£' => 'Ọ', + 'oÌ£' => 'á»', + 'Ỏ' => 'Ỏ', + 'ỏ' => 'á»', + 'ÔÌ' => 'á»', + 'ôÌ' => 'ố', + 'Ồ' => 'á»’', + 'ồ' => 'ồ', + 'Ổ' => 'á»”', + 'ổ' => 'ổ', + 'Ỗ' => 'á»–', + 'ỗ' => 'á»—', + 'Ộ' => 'Ộ', + 'á»Ì‚' => 'á»™', + 'Æ Ì' => 'Ớ', + 'Æ¡Ì' => 'á»›', + 'Ờ' => 'Ờ', + 'ờ' => 'á»', + 'Ở' => 'Ở', + 'ở' => 'ở', + 'Ỡ' => 'á» ', + 'ỡ' => 'ỡ', + 'Ợ' => 'Ợ', + 'ợ' => 'ợ', + 'UÌ£' => 'Ụ', + 'uÌ£' => 'ụ', + 'Ủ' => 'Ủ', + 'ủ' => 'á»§', + 'ƯÌ' => 'Ứ', + 'ưÌ' => 'ứ', + 'Ừ' => 'Ừ', + 'ừ' => 'ừ', + 'Ử' => 'Ử', + 'ử' => 'á»­', + 'Ữ' => 'á»®', + 'ữ' => 'ữ', + 'Ự' => 'á»°', + 'ự' => 'á»±', + 'YÌ€' => 'Ỳ', + 'yÌ€' => 'ỳ', + 'YÌ£' => 'á»´', + 'yÌ£' => 'ỵ', + 'Ỷ' => 'á»¶', + 'ỷ' => 'á»·', + 'Ỹ' => 'Ỹ', + 'ỹ' => 'ỹ', + 'ἀ' => 'á¼€', + 'ἁ' => 'á¼', + 'ἂ' => 'ἂ', + 'á¼Ì€' => 'ἃ', + 'á¼€Ì' => 'ἄ', + 'á¼Ì' => 'á¼…', + 'ἆ' => 'ἆ', + 'á¼Í‚' => 'ἇ', + 'Ἀ' => 'Ἀ', + 'Ἁ' => 'Ἁ', + 'Ἂ' => 'Ἂ', + 'Ἃ' => 'Ἃ', + 'ἈÌ' => 'Ἄ', + 'ἉÌ' => 'á¼', + 'Ἆ' => 'Ἆ', + 'Ἇ' => 'á¼', + 'ἐ' => 'á¼', + 'ἑ' => 'ἑ', + 'á¼Ì€' => 'á¼’', + 'ἓ' => 'ἓ', + 'á¼Ì' => 'á¼”', + 'ἑÌ' => 'ἕ', + 'Ἐ' => 'Ἐ', + 'Ἑ' => 'á¼™', + 'Ἒ' => 'Ἒ', + 'Ἓ' => 'á¼›', + 'ἘÌ' => 'Ἔ', + 'á¼™Ì' => 'á¼', + 'ἠ' => 'á¼ ', + 'ἡ' => 'ἡ', + 'ἢ' => 'á¼¢', + 'ἣ' => 'á¼£', + 'á¼ Ì' => 'ἤ', + 'ἡÌ' => 'á¼¥', + 'á¼ Í‚' => 'ἦ', + 'ἧ' => 'á¼§', + 'Ἠ' => 'Ἠ', + 'Ἡ' => 'Ἡ', + 'Ἢ' => 'Ἢ', + 'Ἣ' => 'Ἣ', + 'ἨÌ' => 'Ἤ', + 'ἩÌ' => 'á¼­', + 'Ἦ' => 'á¼®', + 'Ἧ' => 'Ἧ', + 'ἰ' => 'á¼°', + 'ἱ' => 'á¼±', + 'á¼°Ì€' => 'á¼²', + 'ἳ' => 'á¼³', + 'á¼°Ì' => 'á¼´', + 'á¼±Ì' => 'á¼µ', + 'á¼°Í‚' => 'á¼¶', + 'ἷ' => 'á¼·', + 'Ἰ' => 'Ἰ', + 'Ἱ' => 'á¼¹', + 'Ἲ' => 'Ἲ', + 'Ἳ' => 'á¼»', + 'ἸÌ' => 'á¼¼', + 'á¼¹Ì' => 'á¼½', + 'Ἶ' => 'á¼¾', + 'Ἷ' => 'Ἷ', + 'ὀ' => 'á½€', + 'ὁ' => 'á½', + 'ὂ' => 'ὂ', + 'á½Ì€' => 'ὃ', + 'á½€Ì' => 'ὄ', + 'á½Ì' => 'á½…', + 'Ὀ' => 'Ὀ', + 'Ὁ' => 'Ὁ', + 'Ὂ' => 'Ὂ', + 'Ὃ' => 'Ὃ', + 'ὈÌ' => 'Ὄ', + 'ὉÌ' => 'á½', + 'Ï…Ì“' => 'á½', + 'Ï…Ì”' => 'ὑ', + 'á½Ì€' => 'á½’', + 'ὓ' => 'ὓ', + 'á½Ì' => 'á½”', + 'ὑÌ' => 'ὕ', + 'á½Í‚' => 'á½–', + 'ὗ' => 'á½—', + 'Ὑ' => 'á½™', + 'Ὓ' => 'á½›', + 'á½™Ì' => 'á½', + 'Ὗ' => 'Ὗ', + 'ὠ' => 'á½ ', + 'ὡ' => 'ὡ', + 'ὢ' => 'á½¢', + 'ὣ' => 'á½£', + 'á½ Ì' => 'ὤ', + 'ὡÌ' => 'á½¥', + 'á½ Í‚' => 'ὦ', + 'ὧ' => 'á½§', + 'Ὠ' => 'Ὠ', + 'Ὡ' => 'Ὡ', + 'Ὢ' => 'Ὢ', + 'Ὣ' => 'Ὣ', + 'ὨÌ' => 'Ὤ', + 'ὩÌ' => 'á½­', + 'Ὦ' => 'á½®', + 'Ὧ' => 'Ὧ', + 'ὰ' => 'á½°', + 'ὲ' => 'á½²', + 'ὴ' => 'á½´', + 'ὶ' => 'á½¶', + 'ὸ' => 'ὸ', + 'Ï…Ì€' => 'ὺ', + 'ὼ' => 'á½¼', + 'ᾀ' => 'á¾€', + 'á¼Í…' => 'á¾', + 'ᾂ' => 'ᾂ', + 'ᾃ' => 'ᾃ', + 'ᾄ' => 'ᾄ', + 'á¼…Í…' => 'á¾…', + 'ᾆ' => 'ᾆ', + 'ᾇ' => 'ᾇ', + 'ᾈ' => 'ᾈ', + 'ᾉ' => 'ᾉ', + 'ᾊ' => 'ᾊ', + 'ᾋ' => 'ᾋ', + 'ᾌ' => 'ᾌ', + 'á¼Í…' => 'á¾', + 'ᾎ' => 'ᾎ', + 'á¼Í…' => 'á¾', + 'á¼ Í…' => 'á¾', + 'ᾑ' => 'ᾑ', + 'ᾒ' => 'á¾’', + 'ᾓ' => 'ᾓ', + 'ᾔ' => 'á¾”', + 'ᾕ' => 'ᾕ', + 'ᾖ' => 'á¾–', + 'á¼§Í…' => 'á¾—', + 'ᾘ' => 'ᾘ', + 'ᾙ' => 'á¾™', + 'ᾚ' => 'ᾚ', + 'ᾛ' => 'á¾›', + 'ᾜ' => 'ᾜ', + 'á¼­Í…' => 'á¾', + 'ᾞ' => 'ᾞ', + 'ᾟ' => 'ᾟ', + 'á½ Í…' => 'á¾ ', + 'ᾡ' => 'ᾡ', + 'ᾢ' => 'á¾¢', + 'ᾣ' => 'á¾£', + 'ᾤ' => 'ᾤ', + 'ᾥ' => 'á¾¥', + 'ᾦ' => 'ᾦ', + 'á½§Í…' => 'á¾§', + 'ᾨ' => 'ᾨ', + 'ᾩ' => 'ᾩ', + 'ᾪ' => 'ᾪ', + 'ᾫ' => 'ᾫ', + 'ᾬ' => 'ᾬ', + 'á½­Í…' => 'á¾­', + 'ᾮ' => 'á¾®', + 'ᾯ' => 'ᾯ', + 'ᾰ' => 'á¾°', + 'ᾱ' => 'á¾±', + 'á½°Í…' => 'á¾²', + 'ᾳ' => 'á¾³', + 'ᾴ' => 'á¾´', + 'ᾶ' => 'á¾¶', + 'á¾¶Í…' => 'á¾·', + 'Ᾰ' => 'Ᾰ', + 'Ᾱ' => 'á¾¹', + 'Ὰ' => 'Ὰ', + 'ᾼ' => 'á¾¼', + '῁' => 'á¿', + 'á½´Í…' => 'á¿‚', + 'ῃ' => 'ῃ', + 'ῄ' => 'á¿„', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῇ', + 'Ὲ' => 'Ὲ', + 'Ὴ' => 'Ὴ', + 'ῌ' => 'ῌ', + '῍' => 'á¿', + '᾿Ì' => '῎', + '῏' => 'á¿', + 'ῐ' => 'á¿', + 'ῑ' => 'á¿‘', + 'ÏŠÌ€' => 'á¿’', + 'ῖ' => 'á¿–', + 'ÏŠÍ‚' => 'á¿—', + 'Ῐ' => 'Ῐ', + 'Ῑ' => 'á¿™', + 'Ὶ' => 'Ὶ', + '῝' => 'á¿', + '῾Ì' => '῞', + '῟' => '῟', + 'ῠ' => 'á¿ ', + 'Ï…Ì„' => 'á¿¡', + 'ῢ' => 'á¿¢', + 'ÏÌ“' => 'ῤ', + 'ÏÌ”' => 'á¿¥', + 'Ï…Í‚' => 'ῦ', + 'ῧ' => 'á¿§', + 'Ῠ' => 'Ῠ', + 'Ῡ' => 'á¿©', + 'Ὺ' => 'Ὺ', + 'Ῥ' => 'Ῥ', + '῭' => 'á¿­', + 'ῲ' => 'ῲ', + 'ῳ' => 'ῳ', + 'ÏŽÍ…' => 'á¿´', + 'ῶ' => 'á¿¶', + 'á¿¶Í…' => 'á¿·', + 'Ὸ' => 'Ὸ', + 'Ὼ' => 'Ὼ', + 'ῼ' => 'ῼ', + 'â†Ì¸' => '↚', + '↛' => '↛', + '↮' => '↮', + 'â‡Ì¸' => 'â‡', + '⇎' => '⇎', + '⇏' => 'â‡', + '∄' => '∄', + '∉' => '∉', + '∌' => '∌', + '∤' => '∤', + '∦' => '∦', + '≁' => 'â‰', + '≄' => '≄', + '≇' => '≇', + '≉' => '≉', + '≠' => '≠', + '≢' => '≢', + 'â‰Ì¸' => '≭', + '≮' => '≮', + '≯' => '≯', + '≰' => '≰', + '≱' => '≱', + '≴' => '≴', + '≵' => '≵', + '≸' => '≸', + '≹' => '≹', + '⊀' => '⊀', + '⊁' => 'âŠ', + '⊄' => '⊄', + '⊅' => '⊅', + '⊈' => '⊈', + '⊉' => '⊉', + '⊬' => '⊬', + '⊭' => '⊭', + '⊮' => '⊮', + '⊯' => '⊯', + '⋠' => 'â‹ ', + '⋡' => 'â‹¡', + '⋢' => 'â‹¢', + '⋣' => 'â‹£', + '⋪' => '⋪', + '⋫' => 'â‹«', + '⋬' => '⋬', + '⋭' => 'â‹­', + 'ã‹ã‚™' => 'ãŒ', + 'ãã‚™' => 'ãŽ', + 'ãã‚™' => 'ã', + 'ã‘ã‚™' => 'ã’', + 'ã“ã‚™' => 'ã”', + 'ã•ã‚™' => 'ã–', + 'ã—ã‚™' => 'ã˜', + 'ã™ã‚™' => 'ãš', + 'ã›ã‚™' => 'ãœ', + 'ãã‚™' => 'ãž', + 'ãŸã‚™' => 'ã ', + 'ã¡ã‚™' => 'ã¢', + 'ã¤ã‚™' => 'ã¥', + 'ã¦ã‚™' => 'ã§', + 'ã¨ã‚™' => 'ã©', + 'ã¯ã‚™' => 'ã°', + 'ã¯ã‚š' => 'ã±', + 'ã²ã‚™' => 'ã³', + 'ã²ã‚š' => 'ã´', + 'ãµã‚™' => 'ã¶', + 'ãµã‚š' => 'ã·', + 'ã¸ã‚™' => 'ã¹', + 'ã¸ã‚š' => 'ãº', + 'ã»ã‚™' => 'ã¼', + 'ã»ã‚š' => 'ã½', + 'ã†ã‚™' => 'ã‚”', + 'ã‚ã‚™' => 'ゞ', + 'ã‚«ã‚™' => 'ガ', + 'ã‚­ã‚™' => 'ã‚®', + 'グ' => 'ã‚°', + 'ゲ' => 'ゲ', + 'ゴ' => 'ã‚´', + 'ザ' => 'ã‚¶', + 'ã‚·ã‚™' => 'ジ', + 'ズ' => 'ズ', + 'ゼ' => 'ゼ', + 'ゾ' => 'ゾ', + 'ã‚¿ã‚™' => 'ダ', + 'ãƒã‚™' => 'ヂ', + 'ヅ' => 'ヅ', + 'デ' => 'デ', + 'ド' => 'ド', + 'ãƒã‚™' => 'ãƒ', + 'ãƒã‚š' => 'パ', + 'ビ' => 'ビ', + 'ピ' => 'ピ', + 'ブ' => 'ブ', + 'プ' => 'プ', + 'ベ' => 'ベ', + 'ペ' => 'ペ', + 'ボ' => 'ボ', + 'ポ' => 'ãƒ', + 'ヴ' => 'ヴ', + 'ヷ' => 'ヷ', + 'ヸ' => 'ヸ', + 'ヹ' => 'ヹ', + 'ヺ' => 'ヺ', + 'ヾ' => 'ヾ', + '𑂚' => 'ð‘‚š', + '𑂜' => 'ð‘‚œ', + '𑂫' => 'ð‘‚«', + '𑄮' => 'ð‘„®', + '𑄯' => '𑄯', + 'ð‘‡ð‘Œ¾' => 'ð‘‹', + 'ð‘‡ð‘—' => 'ð‘Œ', + '𑒻' => 'ð‘’»', + '𑒼' => 'ð‘’¼', + '𑒾' => 'ð‘’¾', + '𑖺' => 'ð‘–º', + '𑖻' => 'ð‘–»', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php new file mode 100644 index 0000000..e9e320a --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php @@ -0,0 +1,2064 @@ + 'AÌ€', + 'Ã' => 'AÌ', + 'Â' => 'AÌ‚', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Ã…' => 'AÌŠ', + 'Ç' => 'Ç', + 'È' => 'EÌ€', + 'É' => 'EÌ', + 'Ê' => 'EÌ‚', + 'Ë' => 'Ë', + 'ÃŒ' => 'IÌ€', + 'Ã' => 'IÌ', + 'ÃŽ' => 'IÌ‚', + 'Ã' => 'Ï', + 'Ñ' => 'Ñ', + 'Ã’' => 'OÌ€', + 'Ó' => 'OÌ', + 'Ô' => 'OÌ‚', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + 'Ù' => 'UÌ€', + 'Ú' => 'UÌ', + 'Û' => 'UÌ‚', + 'Ü' => 'Ü', + 'Ã' => 'YÌ', + 'à' => 'aÌ€', + 'á' => 'aÌ', + 'â' => 'aÌ‚', + 'ã' => 'ã', + 'ä' => 'ä', + 'Ã¥' => 'aÌŠ', + 'ç' => 'ç', + 'è' => 'eÌ€', + 'é' => 'eÌ', + 'ê' => 'eÌ‚', + 'ë' => 'ë', + 'ì' => 'iÌ€', + 'í' => 'iÌ', + 'î' => 'iÌ‚', + 'ï' => 'ï', + 'ñ' => 'ñ', + 'ò' => 'oÌ€', + 'ó' => 'oÌ', + 'ô' => 'oÌ‚', + 'õ' => 'õ', + 'ö' => 'ö', + 'ù' => 'uÌ€', + 'ú' => 'uÌ', + 'û' => 'uÌ‚', + 'ü' => 'ü', + 'ý' => 'yÌ', + 'ÿ' => 'ÿ', + 'Ä€' => 'AÌ„', + 'Ä' => 'aÌ„', + 'Ä‚' => 'Ă', + 'ă' => 'ă', + 'Ä„' => 'Ą', + 'Ä…' => 'ą', + 'Ć' => 'CÌ', + 'ć' => 'cÌ', + 'Ĉ' => 'CÌ‚', + 'ĉ' => 'cÌ‚', + 'ÄŠ' => 'Ċ', + 'Ä‹' => 'ċ', + 'ÄŒ' => 'CÌŒ', + 'Ä' => 'cÌŒ', + 'ÄŽ' => 'DÌŒ', + 'Ä' => 'dÌŒ', + 'Ä’' => 'EÌ„', + 'Ä“' => 'eÌ„', + 'Ä”' => 'Ĕ', + 'Ä•' => 'ĕ', + 'Ä–' => 'Ė', + 'Ä—' => 'ė', + 'Ę' => 'Ę', + 'Ä™' => 'ę', + 'Äš' => 'EÌŒ', + 'Ä›' => 'eÌŒ', + 'Äœ' => 'GÌ‚', + 'Ä' => 'gÌ‚', + 'Äž' => 'Ğ', + 'ÄŸ' => 'ğ', + 'Ä ' => 'Ġ', + 'Ä¡' => 'ġ', + 'Ä¢' => 'Ģ', + 'Ä£' => 'ģ', + 'Ĥ' => 'HÌ‚', + 'Ä¥' => 'hÌ‚', + 'Ĩ' => 'Ĩ', + 'Ä©' => 'ĩ', + 'Ī' => 'IÌ„', + 'Ä«' => 'iÌ„', + 'Ĭ' => 'Ĭ', + 'Ä­' => 'ĭ', + 'Ä®' => 'Į', + 'į' => 'į', + 'İ' => 'İ', + 'Ä´' => 'JÌ‚', + 'ĵ' => 'jÌ‚', + 'Ķ' => 'Ķ', + 'Ä·' => 'ķ', + 'Ĺ' => 'LÌ', + 'ĺ' => 'lÌ', + 'Ä»' => 'Ļ', + 'ļ' => 'ļ', + 'Ľ' => 'LÌŒ', + 'ľ' => 'lÌŒ', + 'Ń' => 'NÌ', + 'Å„' => 'nÌ', + 'Å…' => 'Ņ', + 'ņ' => 'ņ', + 'Ň' => 'NÌŒ', + 'ň' => 'nÌŒ', + 'ÅŒ' => 'OÌ„', + 'Å' => 'oÌ„', + 'ÅŽ' => 'Ŏ', + 'Å' => 'ŏ', + 'Å' => 'OÌ‹', + 'Å‘' => 'oÌ‹', + 'Å”' => 'RÌ', + 'Å•' => 'rÌ', + 'Å–' => 'Ŗ', + 'Å—' => 'ŗ', + 'Ř' => 'RÌŒ', + 'Å™' => 'rÌŒ', + 'Åš' => 'SÌ', + 'Å›' => 'sÌ', + 'Åœ' => 'SÌ‚', + 'Å' => 'sÌ‚', + 'Åž' => 'Ş', + 'ÅŸ' => 'ş', + 'Å ' => 'SÌŒ', + 'Å¡' => 'sÌŒ', + 'Å¢' => 'Ţ', + 'Å£' => 'ţ', + 'Ť' => 'TÌŒ', + 'Å¥' => 'tÌŒ', + 'Ũ' => 'Ũ', + 'Å©' => 'ũ', + 'Ū' => 'UÌ„', + 'Å«' => 'uÌ„', + 'Ŭ' => 'Ŭ', + 'Å­' => 'ŭ', + 'Å®' => 'UÌŠ', + 'ů' => 'uÌŠ', + 'Ű' => 'UÌ‹', + 'ű' => 'uÌ‹', + 'Ų' => 'Ų', + 'ų' => 'ų', + 'Å´' => 'WÌ‚', + 'ŵ' => 'wÌ‚', + 'Ŷ' => 'YÌ‚', + 'Å·' => 'yÌ‚', + 'Ÿ' => 'Ÿ', + 'Ź' => 'ZÌ', + 'ź' => 'zÌ', + 'Å»' => 'Ż', + 'ż' => 'ż', + 'Ž' => 'ZÌŒ', + 'ž' => 'zÌŒ', + 'Æ ' => 'OÌ›', + 'Æ¡' => 'oÌ›', + 'Ư' => 'UÌ›', + 'ư' => 'uÌ›', + 'Ç' => 'AÌŒ', + 'ÇŽ' => 'aÌŒ', + 'Ç' => 'IÌŒ', + 'Ç' => 'iÌŒ', + 'Ç‘' => 'OÌŒ', + 'Ç’' => 'oÌŒ', + 'Ç“' => 'UÌŒ', + 'Ç”' => 'uÌŒ', + 'Ç•' => 'Ǖ', + 'Ç–' => 'ǖ', + 'Ç—' => 'ÜÌ', + 'ǘ' => 'üÌ', + 'Ç™' => 'Ǚ', + 'Çš' => 'ǚ', + 'Ç›' => 'Ǜ', + 'Çœ' => 'ǜ', + 'Çž' => 'Ǟ', + 'ÇŸ' => 'ǟ', + 'Ç ' => 'Ǡ', + 'Ç¡' => 'ǡ', + 'Ç¢' => 'Ǣ', + 'Ç£' => 'ǣ', + 'Ǧ' => 'GÌŒ', + 'ǧ' => 'gÌŒ', + 'Ǩ' => 'KÌŒ', + 'Ç©' => 'kÌŒ', + 'Ǫ' => 'Ǫ', + 'Ç«' => 'ǫ', + 'Ǭ' => 'Ǭ', + 'Ç­' => 'ǭ', + 'Ç®' => 'Æ·ÌŒ', + 'ǯ' => 'Ê’ÌŒ', + 'ǰ' => 'jÌŒ', + 'Ç´' => 'GÌ', + 'ǵ' => 'gÌ', + 'Ǹ' => 'NÌ€', + 'ǹ' => 'nÌ€', + 'Ǻ' => 'AÌŠÌ', + 'Ç»' => 'aÌŠÌ', + 'Ǽ' => 'ÆÌ', + 'ǽ' => 'æÌ', + 'Ǿ' => 'ØÌ', + 'Ç¿' => 'øÌ', + 'È€' => 'AÌ', + 'È' => 'aÌ', + 'È‚' => 'AÌ‘', + 'ȃ' => 'aÌ‘', + 'È„' => 'EÌ', + 'È…' => 'eÌ', + 'Ȇ' => 'EÌ‘', + 'ȇ' => 'eÌ‘', + 'Ȉ' => 'IÌ', + 'ȉ' => 'iÌ', + 'ÈŠ' => 'IÌ‘', + 'È‹' => 'iÌ‘', + 'ÈŒ' => 'OÌ', + 'È' => 'oÌ', + 'ÈŽ' => 'OÌ‘', + 'È' => 'oÌ‘', + 'È' => 'RÌ', + 'È‘' => 'rÌ', + 'È’' => 'RÌ‘', + 'È“' => 'rÌ‘', + 'È”' => 'UÌ', + 'È•' => 'uÌ', + 'È–' => 'UÌ‘', + 'È—' => 'uÌ‘', + 'Ș' => 'Ș', + 'È™' => 'ș', + 'Èš' => 'Ț', + 'È›' => 'ț', + 'Èž' => 'HÌŒ', + 'ÈŸ' => 'hÌŒ', + 'Ȧ' => 'Ȧ', + 'ȧ' => 'ȧ', + 'Ȩ' => 'Ȩ', + 'È©' => 'ȩ', + 'Ȫ' => 'Ȫ', + 'È«' => 'ȫ', + 'Ȭ' => 'Ȭ', + 'È­' => 'ȭ', + 'È®' => 'Ȯ', + 'ȯ' => 'ȯ', + 'Ȱ' => 'Ȱ', + 'ȱ' => 'ȱ', + 'Ȳ' => 'YÌ„', + 'ȳ' => 'yÌ„', + 'Í€' => 'Ì€', + 'Í' => 'Ì', + '̓' => 'Ì“', + 'Í„' => '̈Ì', + 'Í´' => 'ʹ', + ';' => ';', + 'Î…' => '¨Ì', + 'Ά' => 'ΑÌ', + '·' => '·', + 'Έ' => 'ΕÌ', + 'Ή' => 'ΗÌ', + 'Ί' => 'ΙÌ', + 'ÎŒ' => 'ΟÌ', + 'ÎŽ' => 'Î¥Ì', + 'Î' => 'ΩÌ', + 'Î' => 'ϊÌ', + 'Ϊ' => 'Ϊ', + 'Ϋ' => 'Ϋ', + 'ά' => 'αÌ', + 'έ' => 'εÌ', + 'ή' => 'ηÌ', + 'ί' => 'ιÌ', + 'ΰ' => 'ϋÌ', + 'ÏŠ' => 'ϊ', + 'Ï‹' => 'ϋ', + 'ÏŒ' => 'οÌ', + 'Ï' => 'Ï…Ì', + 'ÏŽ' => 'ωÌ', + 'Ï“' => 'Ï’Ì', + 'Ï”' => 'ϔ', + 'Ѐ' => 'Ѐ', + 'Ð' => 'Ё', + 'Ѓ' => 'ГÌ', + 'Ї' => 'Ї', + 'ÐŒ' => 'КÌ', + 'Ð' => 'Ѝ', + 'ÐŽ' => 'Ў', + 'Й' => 'Й', + 'й' => 'й', + 'Ñ' => 'ѐ', + 'Ñ‘' => 'ё', + 'Ñ“' => 'гÌ', + 'Ñ—' => 'ї', + 'Ñœ' => 'кÌ', + 'Ñ' => 'ѝ', + 'Ñž' => 'ў', + 'Ѷ' => 'Ñ´Ì', + 'Ñ·' => 'ѵÌ', + 'Ó' => 'Ӂ', + 'Ó‚' => 'ӂ', + 'Ó' => 'Ð̆', + 'Ó‘' => 'ӑ', + 'Ó’' => 'Ð̈', + 'Ó“' => 'ӓ', + 'Ó–' => 'Ӗ', + 'Ó—' => 'ӗ', + 'Óš' => 'Ӛ', + 'Ó›' => 'ӛ', + 'Óœ' => 'Ӝ', + 'Ó' => 'ӝ', + 'Óž' => 'Ӟ', + 'ÓŸ' => 'ӟ', + 'Ó¢' => 'Ӣ', + 'Ó£' => 'ӣ', + 'Ó¤' => 'Ӥ', + 'Ó¥' => 'ӥ', + 'Ó¦' => 'Ӧ', + 'Ó§' => 'ӧ', + 'Óª' => 'Ӫ', + 'Ó«' => 'ӫ', + 'Ó¬' => 'Ӭ', + 'Ó­' => 'Ñ̈', + 'Ó®' => 'Ӯ', + 'Ó¯' => 'ӯ', + 'Ó°' => 'Ӱ', + 'Ó±' => 'ӱ', + 'Ó²' => 'Ӳ', + 'Ó³' => 'ӳ', + 'Ó´' => 'Ӵ', + 'Óµ' => 'ӵ', + 'Ó¸' => 'Ӹ', + 'Ó¹' => 'ӹ', + 'Ø¢' => 'آ', + 'Ø£' => 'أ', + 'ؤ' => 'ÙˆÙ”', + 'Ø¥' => 'إ', + 'ئ' => 'ÙŠÙ”', + 'Û€' => 'Û•Ù”', + 'Û‚' => 'ÛÙ”', + 'Û“' => 'Û’Ù”', + 'ऩ' => 'ऩ', + 'ऱ' => 'ऱ', + 'ऴ' => 'ऴ', + 'क़' => 'क़', + 'ख़' => 'ख़', + 'ग़' => 'ग़', + 'ज़' => 'ज़', + 'ड़' => 'ड़', + 'à¥' => 'ढ़', + 'फ़' => 'फ़', + 'य़' => 'य़', + 'à§‹' => 'ো', + 'à§Œ' => 'ৌ', + 'à§œ' => 'ড়', + 'à§' => 'ঢ়', + 'à§Ÿ' => 'য়', + 'ਲ਼' => 'ਲ਼', + 'ਸ਼' => 'ਸ਼', + 'à©™' => 'ਖ਼', + 'ਗ਼' => 'ਗ਼', + 'à©›' => 'ਜ਼', + 'ਫ਼' => 'ਫ਼', + 'à­ˆ' => 'ୈ', + 'à­‹' => 'ୋ', + 'à­Œ' => 'ୌ', + 'à­œ' => 'ଡ଼', + 'à­' => 'ଢ଼', + 'à®”' => 'ஔ', + 'ொ' => 'ொ', + 'ோ' => 'ோ', + 'ௌ' => 'ௌ', + 'ై' => 'ై', + 'à³€' => 'ೀ', + 'ೇ' => 'ೇ', + 'ೈ' => 'ೈ', + 'ೊ' => 'ೊ', + 'ೋ' => 'ೋ', + 'ൊ' => 'ൊ', + 'ോ' => 'ോ', + 'ൌ' => 'ൌ', + 'à·š' => 'ේ', + 'à·œ' => 'à·™à·', + 'à·' => 'à·™à·à·Š', + 'à·ž' => 'ෞ', + 'གྷ' => 'གྷ', + 'à½' => 'ཌྷ', + 'དྷ' => 'དྷ', + 'བྷ' => 'བྷ', + 'ཛྷ' => 'ཛྷ', + 'ཀྵ' => 'ཀྵ', + 'ཱི' => 'ཱི', + 'ཱུ' => 'ཱུ', + 'ྲྀ' => 'ྲྀ', + 'ླྀ' => 'ླྀ', + 'à¾' => 'ཱྀ', + 'ྒྷ' => 'ྒྷ', + 'à¾' => 'ྜྷ', + 'ྡྷ' => 'ྡྷ', + 'ྦྷ' => 'ྦྷ', + 'ྫྷ' => 'ྫྷ', + 'ྐྵ' => 'à¾à¾µ', + 'ဦ' => 'ဦ', + 'ᬆ' => 'ᬆ', + 'ᬈ' => 'ᬈ', + 'ᬊ' => 'ᬊ', + 'ᬌ' => 'ᬌ', + 'ᬎ' => 'á¬á¬µ', + 'ᬒ' => 'ᬒ', + 'ᬻ' => 'ᬻ', + 'ᬽ' => 'ᬽ', + 'á­€' => 'ᭀ', + 'á­' => 'ᭁ', + 'á­ƒ' => 'ᭃ', + 'Ḁ' => 'AÌ¥', + 'á¸' => 'aÌ¥', + 'Ḃ' => 'Ḃ', + 'ḃ' => 'ḃ', + 'Ḅ' => 'BÌ£', + 'ḅ' => 'bÌ£', + 'Ḇ' => 'Ḇ', + 'ḇ' => 'ḇ', + 'Ḉ' => 'ÇÌ', + 'ḉ' => 'çÌ', + 'Ḋ' => 'Ḋ', + 'ḋ' => 'ḋ', + 'Ḍ' => 'DÌ£', + 'á¸' => 'dÌ£', + 'Ḏ' => 'Ḏ', + 'á¸' => 'ḏ', + 'á¸' => 'Ḑ', + 'ḑ' => 'ḑ', + 'Ḓ' => 'DÌ­', + 'ḓ' => 'dÌ­', + 'Ḕ' => 'Ḕ', + 'ḕ' => 'ḕ', + 'Ḗ' => 'EÌ„Ì', + 'ḗ' => 'eÌ„Ì', + 'Ḙ' => 'EÌ­', + 'ḙ' => 'eÌ­', + 'Ḛ' => 'Ḛ', + 'ḛ' => 'ḛ', + 'Ḝ' => 'Ḝ', + 'á¸' => 'ḝ', + 'Ḟ' => 'Ḟ', + 'ḟ' => 'ḟ', + 'Ḡ' => 'GÌ„', + 'ḡ' => 'gÌ„', + 'Ḣ' => 'Ḣ', + 'ḣ' => 'ḣ', + 'Ḥ' => 'HÌ£', + 'ḥ' => 'hÌ£', + 'Ḧ' => 'Ḧ', + 'ḧ' => 'ḧ', + 'Ḩ' => 'Ḩ', + 'ḩ' => 'ḩ', + 'Ḫ' => 'HÌ®', + 'ḫ' => 'hÌ®', + 'Ḭ' => 'Ḭ', + 'ḭ' => 'ḭ', + 'Ḯ' => 'ÏÌ', + 'ḯ' => 'ïÌ', + 'Ḱ' => 'KÌ', + 'ḱ' => 'kÌ', + 'Ḳ' => 'KÌ£', + 'ḳ' => 'kÌ£', + 'Ḵ' => 'Ḵ', + 'ḵ' => 'ḵ', + 'Ḷ' => 'LÌ£', + 'ḷ' => 'lÌ£', + 'Ḹ' => 'Ḹ', + 'ḹ' => 'ḹ', + 'Ḻ' => 'Ḻ', + 'ḻ' => 'ḻ', + 'Ḽ' => 'LÌ­', + 'ḽ' => 'lÌ­', + 'Ḿ' => 'MÌ', + 'ḿ' => 'mÌ', + 'á¹€' => 'Ṁ', + 'á¹' => 'ṁ', + 'Ṃ' => 'MÌ£', + 'ṃ' => 'mÌ£', + 'Ṅ' => 'Ṅ', + 'á¹…' => 'ṅ', + 'Ṇ' => 'NÌ£', + 'ṇ' => 'nÌ£', + 'Ṉ' => 'Ṉ', + 'ṉ' => 'ṉ', + 'Ṋ' => 'NÌ­', + 'ṋ' => 'nÌ­', + 'Ṍ' => 'ÕÌ', + 'á¹' => 'õÌ', + 'Ṏ' => 'Ṏ', + 'á¹' => 'ṏ', + 'á¹' => 'Ṑ', + 'ṑ' => 'ṑ', + 'á¹’' => 'OÌ„Ì', + 'ṓ' => 'oÌ„Ì', + 'á¹”' => 'PÌ', + 'ṕ' => 'pÌ', + 'á¹–' => 'Ṗ', + 'á¹—' => 'ṗ', + 'Ṙ' => 'Ṙ', + 'á¹™' => 'ṙ', + 'Ṛ' => 'RÌ£', + 'á¹›' => 'rÌ£', + 'Ṝ' => 'Ṝ', + 'á¹' => 'ṝ', + 'Ṟ' => 'Ṟ', + 'ṟ' => 'ṟ', + 'á¹ ' => 'Ṡ', + 'ṡ' => 'ṡ', + 'á¹¢' => 'SÌ£', + 'á¹£' => 'sÌ£', + 'Ṥ' => 'SÌ̇', + 'á¹¥' => 'sÌ̇', + 'Ṧ' => 'Ṧ', + 'á¹§' => 'ṧ', + 'Ṩ' => 'Ṩ', + 'ṩ' => 'ṩ', + 'Ṫ' => 'Ṫ', + 'ṫ' => 'ṫ', + 'Ṭ' => 'TÌ£', + 'á¹­' => 'tÌ£', + 'á¹®' => 'Ṯ', + 'ṯ' => 'ṯ', + 'á¹°' => 'TÌ­', + 'á¹±' => 'tÌ­', + 'á¹²' => 'Ṳ', + 'á¹³' => 'ṳ', + 'á¹´' => 'Ṵ', + 'á¹µ' => 'ṵ', + 'á¹¶' => 'UÌ­', + 'á¹·' => 'uÌ­', + 'Ṹ' => 'ŨÌ', + 'á¹¹' => 'ũÌ', + 'Ṻ' => 'Ṻ', + 'á¹»' => 'ṻ', + 'á¹¼' => 'Ṽ', + 'á¹½' => 'ṽ', + 'á¹¾' => 'VÌ£', + 'ṿ' => 'vÌ£', + 'Ẁ' => 'WÌ€', + 'áº' => 'wÌ€', + 'Ẃ' => 'WÌ', + 'ẃ' => 'wÌ', + 'Ẅ' => 'Ẅ', + 'ẅ' => 'ẅ', + 'Ẇ' => 'Ẇ', + 'ẇ' => 'ẇ', + 'Ẉ' => 'WÌ£', + 'ẉ' => 'wÌ£', + 'Ẋ' => 'Ẋ', + 'ẋ' => 'ẋ', + 'Ẍ' => 'Ẍ', + 'áº' => 'ẍ', + 'Ẏ' => 'Ẏ', + 'áº' => 'ẏ', + 'áº' => 'ZÌ‚', + 'ẑ' => 'zÌ‚', + 'Ẓ' => 'ZÌ£', + 'ẓ' => 'zÌ£', + 'Ẕ' => 'Ẕ', + 'ẕ' => 'ẕ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'wÌŠ', + 'ẙ' => 'yÌŠ', + 'ẛ' => 'ẛ', + 'Ạ' => 'AÌ£', + 'ạ' => 'aÌ£', + 'Ả' => 'Ả', + 'ả' => 'ả', + 'Ấ' => 'AÌ‚Ì', + 'ấ' => 'aÌ‚Ì', + 'Ầ' => 'Ầ', + 'ầ' => 'ầ', + 'Ẩ' => 'Ẩ', + 'ẩ' => 'ẩ', + 'Ẫ' => 'Ẫ', + 'ẫ' => 'ẫ', + 'Ậ' => 'Ậ', + 'ậ' => 'ậ', + 'Ắ' => 'ĂÌ', + 'ắ' => 'ăÌ', + 'Ằ' => 'Ằ', + 'ằ' => 'ằ', + 'Ẳ' => 'Ẳ', + 'ẳ' => 'ẳ', + 'Ẵ' => 'Ẵ', + 'ẵ' => 'ẵ', + 'Ặ' => 'Ặ', + 'ặ' => 'ặ', + 'Ẹ' => 'EÌ£', + 'ẹ' => 'eÌ£', + 'Ẻ' => 'Ẻ', + 'ẻ' => 'ẻ', + 'Ẽ' => 'Ẽ', + 'ẽ' => 'ẽ', + 'Ế' => 'EÌ‚Ì', + 'ế' => 'eÌ‚Ì', + 'Ề' => 'Ề', + 'á»' => 'ề', + 'Ể' => 'Ể', + 'ể' => 'ể', + 'Ễ' => 'Ễ', + 'á»…' => 'ễ', + 'Ệ' => 'Ệ', + 'ệ' => 'ệ', + 'Ỉ' => 'Ỉ', + 'ỉ' => 'ỉ', + 'Ị' => 'IÌ£', + 'ị' => 'iÌ£', + 'Ọ' => 'OÌ£', + 'á»' => 'oÌ£', + 'Ỏ' => 'Ỏ', + 'á»' => 'ỏ', + 'á»' => 'OÌ‚Ì', + 'ố' => 'oÌ‚Ì', + 'á»’' => 'Ồ', + 'ồ' => 'ồ', + 'á»”' => 'Ổ', + 'ổ' => 'ổ', + 'á»–' => 'Ỗ', + 'á»—' => 'ỗ', + 'Ộ' => 'Ộ', + 'á»™' => 'ộ', + 'Ớ' => 'OÌ›Ì', + 'á»›' => 'oÌ›Ì', + 'Ờ' => 'Ờ', + 'á»' => 'ờ', + 'Ở' => 'Ở', + 'ở' => 'ở', + 'á» ' => 'Ỡ', + 'ỡ' => 'ỡ', + 'Ợ' => 'Ợ', + 'ợ' => 'ợ', + 'Ụ' => 'UÌ£', + 'ụ' => 'uÌ£', + 'Ủ' => 'Ủ', + 'á»§' => 'ủ', + 'Ứ' => 'UÌ›Ì', + 'ứ' => 'uÌ›Ì', + 'Ừ' => 'Ừ', + 'ừ' => 'ừ', + 'Ử' => 'Ử', + 'á»­' => 'ử', + 'á»®' => 'Ữ', + 'ữ' => 'ữ', + 'á»°' => 'Ự', + 'á»±' => 'ự', + 'Ỳ' => 'YÌ€', + 'ỳ' => 'yÌ€', + 'á»´' => 'YÌ£', + 'ỵ' => 'yÌ£', + 'á»¶' => 'Ỷ', + 'á»·' => 'ỷ', + 'Ỹ' => 'Ỹ', + 'ỹ' => 'ỹ', + 'á¼€' => 'ἀ', + 'á¼' => 'ἁ', + 'ἂ' => 'ἂ', + 'ἃ' => 'ἃ', + 'ἄ' => 'ἀÌ', + 'á¼…' => 'ἁÌ', + 'ἆ' => 'ἆ', + 'ἇ' => 'ἇ', + 'Ἀ' => 'Ἀ', + 'Ἁ' => 'Ἁ', + 'Ἂ' => 'Ἂ', + 'Ἃ' => 'Ἃ', + 'Ἄ' => 'ἈÌ', + 'á¼' => 'ἉÌ', + 'Ἆ' => 'Ἆ', + 'á¼' => 'Ἇ', + 'á¼' => 'ἐ', + 'ἑ' => 'ἑ', + 'á¼’' => 'ἒ', + 'ἓ' => 'ἓ', + 'á¼”' => 'ἐÌ', + 'ἕ' => 'ἑÌ', + 'Ἐ' => 'Ἐ', + 'á¼™' => 'Ἑ', + 'Ἒ' => 'Ἒ', + 'á¼›' => 'Ἓ', + 'Ἔ' => 'ἘÌ', + 'á¼' => 'ἙÌ', + 'á¼ ' => 'ἠ', + 'ἡ' => 'ἡ', + 'á¼¢' => 'ἢ', + 'á¼£' => 'ἣ', + 'ἤ' => 'ἠÌ', + 'á¼¥' => 'ἡÌ', + 'ἦ' => 'ἦ', + 'á¼§' => 'ἧ', + 'Ἠ' => 'Ἠ', + 'Ἡ' => 'Ἡ', + 'Ἢ' => 'Ἢ', + 'Ἣ' => 'Ἣ', + 'Ἤ' => 'ἨÌ', + 'á¼­' => 'ἩÌ', + 'á¼®' => 'Ἦ', + 'Ἧ' => 'Ἧ', + 'á¼°' => 'ἰ', + 'á¼±' => 'ἱ', + 'á¼²' => 'ἲ', + 'á¼³' => 'ἳ', + 'á¼´' => 'ἰÌ', + 'á¼µ' => 'ἱÌ', + 'á¼¶' => 'ἶ', + 'á¼·' => 'ἷ', + 'Ἰ' => 'Ἰ', + 'á¼¹' => 'Ἱ', + 'Ἲ' => 'Ἲ', + 'á¼»' => 'Ἳ', + 'á¼¼' => 'ἸÌ', + 'á¼½' => 'ἹÌ', + 'á¼¾' => 'Ἶ', + 'Ἷ' => 'Ἷ', + 'á½€' => 'ὀ', + 'á½' => 'ὁ', + 'ὂ' => 'ὂ', + 'ὃ' => 'ὃ', + 'ὄ' => 'ὀÌ', + 'á½…' => 'ὁÌ', + 'Ὀ' => 'Ὀ', + 'Ὁ' => 'Ὁ', + 'Ὂ' => 'Ὂ', + 'Ὃ' => 'Ὃ', + 'Ὄ' => 'ὈÌ', + 'á½' => 'ὉÌ', + 'á½' => 'Ï…Ì“', + 'ὑ' => 'Ï…Ì”', + 'á½’' => 'ὒ', + 'ὓ' => 'ὓ', + 'á½”' => 'Ï…Ì“Ì', + 'ὕ' => 'Ï…Ì”Ì', + 'á½–' => 'ὖ', + 'á½—' => 'ὗ', + 'á½™' => 'Ὑ', + 'á½›' => 'Ὓ', + 'á½' => 'ὙÌ', + 'Ὗ' => 'Ὗ', + 'á½ ' => 'ὠ', + 'ὡ' => 'ὡ', + 'á½¢' => 'ὢ', + 'á½£' => 'ὣ', + 'ὤ' => 'ὠÌ', + 'á½¥' => 'ὡÌ', + 'ὦ' => 'ὦ', + 'á½§' => 'ὧ', + 'Ὠ' => 'Ὠ', + 'Ὡ' => 'Ὡ', + 'Ὢ' => 'Ὢ', + 'Ὣ' => 'Ὣ', + 'Ὤ' => 'ὨÌ', + 'á½­' => 'ὩÌ', + 'á½®' => 'Ὦ', + 'Ὧ' => 'Ὧ', + 'á½°' => 'ὰ', + 'á½±' => 'αÌ', + 'á½²' => 'ὲ', + 'á½³' => 'εÌ', + 'á½´' => 'ὴ', + 'á½µ' => 'ηÌ', + 'á½¶' => 'ὶ', + 'á½·' => 'ιÌ', + 'ὸ' => 'ὸ', + 'á½¹' => 'οÌ', + 'ὺ' => 'Ï…Ì€', + 'á½»' => 'Ï…Ì', + 'á½¼' => 'ὼ', + 'á½½' => 'ωÌ', + 'á¾€' => 'ᾀ', + 'á¾' => 'ᾁ', + 'ᾂ' => 'ᾂ', + 'ᾃ' => 'ᾃ', + 'ᾄ' => 'ἀÌÍ…', + 'á¾…' => 'ἁÌÍ…', + 'ᾆ' => 'ᾆ', + 'ᾇ' => 'ᾇ', + 'ᾈ' => 'ᾈ', + 'ᾉ' => 'ᾉ', + 'ᾊ' => 'ᾊ', + 'ᾋ' => 'ᾋ', + 'ᾌ' => 'ἈÌÍ…', + 'á¾' => 'ἉÌÍ…', + 'ᾎ' => 'ᾎ', + 'á¾' => 'ᾏ', + 'á¾' => 'ᾐ', + 'ᾑ' => 'ᾑ', + 'á¾’' => 'ᾒ', + 'ᾓ' => 'ᾓ', + 'á¾”' => 'ἠÌÍ…', + 'ᾕ' => 'ἡÌÍ…', + 'á¾–' => 'ᾖ', + 'á¾—' => 'ᾗ', + 'ᾘ' => 'ᾘ', + 'á¾™' => 'ᾙ', + 'ᾚ' => 'ᾚ', + 'á¾›' => 'ᾛ', + 'ᾜ' => 'ἨÌÍ…', + 'á¾' => 'ἩÌÍ…', + 'ᾞ' => 'ᾞ', + 'ᾟ' => 'ᾟ', + 'á¾ ' => 'ᾠ', + 'ᾡ' => 'ᾡ', + 'á¾¢' => 'ᾢ', + 'á¾£' => 'ᾣ', + 'ᾤ' => 'ὠÌÍ…', + 'á¾¥' => 'ὡÌÍ…', + 'ᾦ' => 'ᾦ', + 'á¾§' => 'ᾧ', + 'ᾨ' => 'ᾨ', + 'ᾩ' => 'ᾩ', + 'ᾪ' => 'ᾪ', + 'ᾫ' => 'ᾫ', + 'ᾬ' => 'ὨÌÍ…', + 'á¾­' => 'ὩÌÍ…', + 'á¾®' => 'ᾮ', + 'ᾯ' => 'ᾯ', + 'á¾°' => 'ᾰ', + 'á¾±' => 'ᾱ', + 'á¾²' => 'ᾲ', + 'á¾³' => 'ᾳ', + 'á¾´' => 'αÌÍ…', + 'á¾¶' => 'ᾶ', + 'á¾·' => 'ᾷ', + 'Ᾰ' => 'Ᾰ', + 'á¾¹' => 'Ᾱ', + 'Ὰ' => 'Ὰ', + 'á¾»' => 'ΑÌ', + 'á¾¼' => 'ᾼ', + 'á¾¾' => 'ι', + 'á¿' => '῁', + 'á¿‚' => 'ῂ', + 'ῃ' => 'ῃ', + 'á¿„' => 'ηÌÍ…', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῇ', + 'Ὲ' => 'Ὲ', + 'Έ' => 'ΕÌ', + 'Ὴ' => 'Ὴ', + 'á¿‹' => 'ΗÌ', + 'ῌ' => 'ῌ', + 'á¿' => '῍', + '῎' => '᾿Ì', + 'á¿' => '῏', + 'á¿' => 'ῐ', + 'á¿‘' => 'ῑ', + 'á¿’' => 'ῒ', + 'á¿“' => 'ϊÌ', + 'á¿–' => 'ῖ', + 'á¿—' => 'ῗ', + 'Ῐ' => 'Ῐ', + 'á¿™' => 'Ῑ', + 'Ὶ' => 'Ὶ', + 'á¿›' => 'ΙÌ', + 'á¿' => '῝', + '῞' => '῾Ì', + '῟' => '῟', + 'á¿ ' => 'ῠ', + 'á¿¡' => 'Ï…Ì„', + 'á¿¢' => 'ῢ', + 'á¿£' => 'ϋÌ', + 'ῤ' => 'ÏÌ“', + 'á¿¥' => 'ÏÌ”', + 'ῦ' => 'Ï…Í‚', + 'á¿§' => 'ῧ', + 'Ῠ' => 'Ῠ', + 'á¿©' => 'Ῡ', + 'Ὺ' => 'Ὺ', + 'á¿«' => 'Î¥Ì', + 'Ῥ' => 'Ῥ', + 'á¿­' => '῭', + 'á¿®' => '¨Ì', + '`' => '`', + 'ῲ' => 'ῲ', + 'ῳ' => 'ῳ', + 'á¿´' => 'ωÌÍ…', + 'á¿¶' => 'ῶ', + 'á¿·' => 'ῷ', + 'Ὸ' => 'Ὸ', + 'Ό' => 'ΟÌ', + 'Ὼ' => 'Ὼ', + 'á¿»' => 'ΩÌ', + 'ῼ' => 'ῼ', + '´' => '´', + ' ' => ' ', + 'â€' => ' ', + 'Ω' => 'Ω', + 'K' => 'K', + 'â„«' => 'AÌŠ', + '↚' => 'â†Ì¸', + '↛' => '↛', + '↮' => '↮', + 'â‡' => 'â‡Ì¸', + '⇎' => '⇎', + 'â‡' => '⇏', + '∄' => '∄', + '∉' => '∉', + '∌' => '∌', + '∤' => '∤', + '∦' => '∦', + 'â‰' => '≁', + '≄' => '≄', + '≇' => '≇', + '≉' => '≉', + '≠' => '≠', + '≢' => '≢', + '≭' => 'â‰Ì¸', + '≮' => '≮', + '≯' => '≯', + '≰' => '≰', + '≱' => '≱', + '≴' => '≴', + '≵' => '≵', + '≸' => '≸', + '≹' => '≹', + '⊀' => '⊀', + 'âŠ' => '⊁', + '⊄' => '⊄', + '⊅' => '⊅', + '⊈' => '⊈', + '⊉' => '⊉', + '⊬' => '⊬', + '⊭' => '⊭', + '⊮' => '⊮', + '⊯' => '⊯', + 'â‹ ' => '⋠', + 'â‹¡' => '⋡', + 'â‹¢' => '⋢', + 'â‹£' => '⋣', + '⋪' => '⋪', + 'â‹«' => '⋫', + '⋬' => '⋬', + 'â‹­' => '⋭', + '〈' => '〈', + '〉' => '〉', + '⫝̸' => 'â«Ì¸', + 'ãŒ' => 'ã‹ã‚™', + 'ãŽ' => 'ãã‚™', + 'ã' => 'ãã‚™', + 'ã’' => 'ã‘ã‚™', + 'ã”' => 'ã“ã‚™', + 'ã–' => 'ã•ã‚™', + 'ã˜' => 'ã—ã‚™', + 'ãš' => 'ã™ã‚™', + 'ãœ' => 'ã›ã‚™', + 'ãž' => 'ãã‚™', + 'ã ' => 'ãŸã‚™', + 'ã¢' => 'ã¡ã‚™', + 'ã¥' => 'ã¤ã‚™', + 'ã§' => 'ã¦ã‚™', + 'ã©' => 'ã¨ã‚™', + 'ã°' => 'ã¯ã‚™', + 'ã±' => 'ã¯ã‚š', + 'ã³' => 'ã²ã‚™', + 'ã´' => 'ã²ã‚š', + 'ã¶' => 'ãµã‚™', + 'ã·' => 'ãµã‚š', + 'ã¹' => 'ã¸ã‚™', + 'ãº' => 'ã¸ã‚š', + 'ã¼' => 'ã»ã‚™', + 'ã½' => 'ã»ã‚š', + 'ã‚”' => 'ã†ã‚™', + 'ゞ' => 'ã‚ã‚™', + 'ガ' => 'ã‚«ã‚™', + 'ã‚®' => 'ã‚­ã‚™', + 'ã‚°' => 'グ', + 'ゲ' => 'ゲ', + 'ã‚´' => 'ゴ', + 'ã‚¶' => 'ザ', + 'ジ' => 'ã‚·ã‚™', + 'ズ' => 'ズ', + 'ゼ' => 'ゼ', + 'ゾ' => 'ゾ', + 'ダ' => 'ã‚¿ã‚™', + 'ヂ' => 'ãƒã‚™', + 'ヅ' => 'ヅ', + 'デ' => 'デ', + 'ド' => 'ド', + 'ãƒ' => 'ãƒã‚™', + 'パ' => 'ãƒã‚š', + 'ビ' => 'ビ', + 'ピ' => 'ピ', + 'ブ' => 'ブ', + 'プ' => 'プ', + 'ベ' => 'ベ', + 'ペ' => 'ペ', + 'ボ' => 'ボ', + 'ãƒ' => 'ポ', + 'ヴ' => 'ヴ', + 'ヷ' => 'ヷ', + 'ヸ' => 'ヸ', + 'ヹ' => 'ヹ', + 'ヺ' => 'ヺ', + 'ヾ' => 'ヾ', + '豈' => '豈', + 'ï¤' => 'æ›´', + '車' => '車', + '賈' => '賈', + '滑' => '滑', + '串' => '串', + '句' => 'å¥', + '龜' => '龜', + '龜' => '龜', + '契' => '契', + '金' => '金', + '喇' => 'å–‡', + '奈' => '奈', + 'ï¤' => '懶', + '癩' => '癩', + 'ï¤' => 'ç¾…', + 'ï¤' => '蘿', + '螺' => '螺', + '裸' => '裸', + '邏' => 'é‚', + '樂' => '樂', + '洛' => 'æ´›', + '烙' => '烙', + '珞' => 'çž', + '落' => 'è½', + '酪' => 'é…ª', + '駱' => 'é§±', + '亂' => '亂', + '卵' => 'åµ', + 'ï¤' => '欄', + '爛' => '爛', + '蘭' => '蘭', + '鸞' => '鸞', + '嵐' => 'åµ', + '濫' => 'æ¿«', + '藍' => 'è—', + '襤' => '襤', + '拉' => '拉', + '臘' => '臘', + '蠟' => 'è Ÿ', + '廊' => '廊', + '朗' => '朗', + '浪' => '浪', + '狼' => '狼', + '郎' => '郎', + '來' => '來', + '冷' => '冷', + '勞' => '勞', + '擄' => 'æ“„', + '櫓' => 'æ«“', + '爐' => 'çˆ', + '盧' => 'ç›§', + '老' => 'è€', + '蘆' => '蘆', + '虜' => '虜', + '路' => 'è·¯', + '露' => '露', + '魯' => 'é­¯', + '鷺' => 'é·º', + '碌' => '碌', + '祿' => '祿', + '綠' => 'ç¶ ', + '菉' => 'è‰', + '錄' => '錄', + '鹿' => '鹿', + 'ï¥' => 'è«–', + '壟' => '壟', + '弄' => '弄', + '籠' => 'ç± ', + '聾' => 'è¾', + '牢' => '牢', + '磊' => '磊', + '賂' => '賂', + '雷' => 'é›·', + '壘' => '壘', + '屢' => 'å±¢', + '樓' => '樓', + 'ï¥' => 'æ·š', + '漏' => 'æ¼', + 'ï¥' => 'ç´¯', + 'ï¥' => '縷', + '陋' => '陋', + '勒' => 'å‹’', + '肋' => 'è‚‹', + '凜' => '凜', + '凌' => '凌', + '稜' => '稜', + '綾' => 'ç¶¾', + '菱' => 'è±', + '陵' => '陵', + '讀' => '讀', + '拏' => 'æ‹', + '樂' => '樂', + 'ï¥' => '諾', + '丹' => '丹', + '寧' => '寧', + '怒' => '怒', + '率' => '率', + '異' => 'ç•°', + '北' => '北', + '磻' => '磻', + '便' => '便', + '復' => '復', + '不' => 'ä¸', + '泌' => '泌', + '數' => '數', + '索' => 'ç´¢', + '參' => 'åƒ', + '塞' => '塞', + '省' => 'çœ', + '葉' => '葉', + '說' => '說', + '殺' => '殺', + '辰' => 'è¾°', + '沈' => '沈', + '拾' => '拾', + '若' => 'è‹¥', + '掠' => '掠', + '略' => 'ç•¥', + '亮' => '亮', + '兩' => 'å…©', + '凉' => '凉', + '梁' => 'æ¢', + '糧' => 'ç³§', + '良' => '良', + '諒' => 'è«’', + '量' => 'é‡', + '勵' => '勵', + '呂' => 'å‘‚', + 'ï¦' => '女', + '廬' => '廬', + '旅' => 'æ—…', + '濾' => '濾', + '礪' => '礪', + '閭' => 'é–­', + '驪' => '驪', + '麗' => '麗', + '黎' => '黎', + '力' => '力', + '曆' => '曆', + '歷' => 'æ­·', + 'ï¦' => 'è½¢', + '年' => 'å¹´', + 'ï¦' => 'æ†', + 'ï¦' => '戀', + '撚' => 'æ’š', + '漣' => 'æ¼£', + '煉' => 'ç…‰', + '璉' => 'ç’‰', + '秊' => 'ç§Š', + '練' => 'ç·´', + '聯' => 'è¯', + '輦' => '輦', + '蓮' => 'è“®', + '連' => '連', + '鍊' => 'éŠ', + '列' => '列', + 'ï¦' => '劣', + '咽' => 'å’½', + '烈' => '烈', + '裂' => '裂', + '說' => '說', + '廉' => '廉', + '念' => '念', + '捻' => 'æ»', + '殮' => 'æ®®', + '簾' => 'ç°¾', + '獵' => 'çµ', + '令' => '令', + '囹' => '囹', + '寧' => '寧', + '嶺' => '嶺', + '怜' => '怜', + '玲' => '玲', + '瑩' => 'ç‘©', + '羚' => '羚', + '聆' => 'è†', + '鈴' => '鈴', + '零' => 'é›¶', + '靈' => 'éˆ', + '領' => 'é ˜', + '例' => '例', + '禮' => '禮', + '醴' => '醴', + '隸' => '隸', + '惡' => '惡', + '了' => '了', + '僚' => '僚', + '寮' => '寮', + '尿' => 'å°¿', + '料' => 'æ–™', + '樂' => '樂', + 'ï§€' => '燎', + 'ï§' => '療', + 'ï§‚' => '蓼', + '遼' => 'é¼', + 'ï§„' => 'é¾', + 'ï§…' => '暈', + '阮' => '阮', + '劉' => '劉', + '杻' => 'æ»', + '柳' => '柳', + 'ï§Š' => 'æµ', + 'ï§‹' => '溜', + 'ï§Œ' => 'ç‰', + 'ï§' => 'ç•™', + 'ï§Ž' => 'ç¡«', + 'ï§' => 'ç´', + 'ï§' => '類', + 'ï§‘' => 'å…­', + 'ï§’' => '戮', + 'ï§“' => '陸', + 'ï§”' => '倫', + 'ï§•' => 'å´™', + 'ï§–' => 'æ·ª', + 'ï§—' => '輪', + '律' => '律', + 'ï§™' => 'æ…„', + 'ï§š' => 'æ —', + 'ï§›' => '率', + 'ï§œ' => '隆', + 'ï§' => '利', + 'ï§ž' => 'å', + 'ï§Ÿ' => 'å±¥', + 'ï§ ' => '易', + 'ï§¡' => 'æŽ', + 'ï§¢' => '梨', + 'ï§£' => 'æ³¥', + '理' => 'ç†', + 'ï§¥' => 'ç—¢', + '罹' => 'ç½¹', + 'ï§§' => 'è£', + '裡' => '裡', + 'ï§©' => '里', + '離' => '離', + 'ï§«' => '匿', + '溺' => '溺', + 'ï§­' => 'å', + 'ï§®' => 'ç‡', + '璘' => 'ç’˜', + 'ï§°' => 'è—º', + 'ï§±' => '隣', + 'ï§²' => 'é±—', + 'ï§³' => '麟', + 'ï§´' => 'æž—', + 'ï§µ' => 'æ·‹', + 'ï§¶' => '臨', + 'ï§·' => 'ç«‹', + '笠' => '笠', + 'ï§¹' => 'ç²’', + '狀' => 'ç‹€', + 'ï§»' => 'ç‚™', + 'ï§¼' => 'è­˜', + 'ï§½' => '什', + 'ï§¾' => '茶', + 'ï§¿' => '刺', + '切' => '切', + 'ï¨' => '度', + '拓' => 'æ‹“', + '糖' => 'ç³–', + '宅' => 'å®…', + '洞' => 'æ´ž', + '暴' => 'æš´', + '輻' => 'è¼»', + '行' => '行', + '降' => 'é™', + '見' => '見', + '廓' => '廓', + '兀' => 'å…€', + 'ï¨' => 'å—€', + 'ï¨' => '塚', + '晴' => 'æ™´', + '凞' => '凞', + '猪' => '猪', + '益' => '益', + '礼' => '礼', + '神' => '神', + '祥' => '祥', + '福' => 'ç¦', + '靖' => 'é–', + 'ï¨' => 'ç²¾', + '羽' => 'ç¾½', + '蘒' => '蘒', + '諸' => '諸', + '逸' => '逸', + '都' => '都', + '飯' => '飯', + '飼' => '飼', + '館' => '館', + '鶴' => 'é¶´', + '郞' => '郞', + '隷' => 'éš·', + '侮' => 'ä¾®', + '僧' => '僧', + '免' => 'å…', + '勉' => '勉', + '勤' => '勤', + '卑' => 'å‘', + '喝' => 'å–', + '嘆' => '嘆', + '器' => '器', + '塀' => 'å¡€', + '墨' => '墨', + '層' => '層', + '屮' => 'å±®', + '悔' => 'æ‚”', + '慨' => 'æ…¨', + '憎' => '憎', + 'ï©€' => '懲', + 'ï©' => 'æ•', + 'ï©‚' => 'æ—¢', + '暑' => 'æš‘', + 'ï©„' => '梅', + 'ï©…' => 'æµ·', + '渚' => '渚', + '漢' => 'æ¼¢', + '煮' => 'ç…®', + '爫' => '爫', + '琢' => 'ç¢', + 'ï©‹' => '碑', + '社' => '社', + 'ï©' => '祉', + '祈' => '祈', + 'ï©' => 'ç¥', + 'ï©' => '祖', + 'ï©‘' => 'ç¥', + 'ï©’' => 'ç¦', + 'ï©“' => '禎', + 'ï©”' => 'ç©€', + 'ï©•' => 'çª', + 'ï©–' => '節', + 'ï©—' => 'ç·´', + '縉' => '縉', + 'ï©™' => 'ç¹', + '署' => 'ç½²', + 'ï©›' => '者', + '臭' => '臭', + 'ï©' => '艹', + '艹' => '艹', + '著' => 'è‘—', + 'ï© ' => 'è¤', + 'ï©¡' => '視', + 'ï©¢' => 'è¬', + 'ï©£' => '謹', + '賓' => '賓', + 'ï©¥' => 'è´ˆ', + '辶' => 'è¾¶', + 'ï©§' => '逸', + '難' => '難', + 'ï©©' => '響', + '頻' => 'é »', + 'ï©«' => 'æµ', + '𤋮' => '𤋮', + 'ï©­' => '舘', + 'ï©°' => '並', + '况' => '况', + '全' => 'å…¨', + '侀' => 'ä¾€', + 'ï©´' => 'å……', + '冀' => '冀', + 'ï©¶' => '勇', + 'ï©·' => '勺', + '喝' => 'å–', + '啕' => 'å••', + '喙' => 'å–™', + 'ï©»' => 'å—¢', + '塚' => '塚', + '墳' => '墳', + '奄' => '奄', + 'ï©¿' => '奔', + '婢' => 'å©¢', + 'ïª' => '嬨', + '廒' => 'å»’', + '廙' => 'å»™', + '彩' => '彩', + '徭' => 'å¾­', + '惘' => '惘', + '慎' => 'æ…Ž', + '愈' => '愈', + '憎' => '憎', + '慠' => 'æ… ', + '懲' => '懲', + '戴' => '戴', + 'ïª' => 'æ„', + '搜' => 'æœ', + 'ïª' => 'æ‘’', + 'ïª' => 'æ•–', + '晴' => 'æ™´', + '朗' => '朗', + '望' => '望', + '杖' => 'æ–', + '歹' => 'æ­¹', + '殺' => '殺', + '流' => 'æµ', + '滛' => 'æ»›', + '滋' => '滋', + '漢' => 'æ¼¢', + '瀞' => '瀞', + '煮' => 'ç…®', + 'ïª' => 'çž§', + '爵' => '爵', + '犯' => '犯', + '猪' => '猪', + '瑱' => '瑱', + '甆' => '甆', + '画' => 'ç”»', + '瘝' => 'ç˜', + '瘟' => '瘟', + '益' => '益', + '盛' => 'ç››', + '直' => 'ç›´', + '睊' => 'çŠ', + '着' => 'ç€', + '磌' => '磌', + '窱' => '窱', + '節' => '節', + '类' => 'ç±»', + '絛' => 'çµ›', + '練' => 'ç·´', + '缾' => 'ç¼¾', + '者' => '者', + '荒' => 'è’', + '華' => 'è¯', + '蝹' => 'è¹', + '襁' => 'è¥', + '覆' => '覆', + '視' => '視', + '調' => '調', + '諸' => '諸', + '請' => 'è«‹', + '謁' => 'è¬', + '諾' => '諾', + '諭' => 'è«­', + '謹' => '謹', + 'ï«€' => '變', + 'ï«' => 'è´ˆ', + 'ï«‚' => '輸', + '遲' => 'é²', + 'ï«„' => '醙', + 'ï«…' => '鉶', + '陼' => '陼', + '難' => '難', + '靖' => 'é–', + '韛' => '韛', + '響' => '響', + 'ï«‹' => 'é ‹', + '頻' => 'é »', + 'ï«' => '鬒', + '龜' => '龜', + 'ï«' => '𢡊', + 'ï«' => '𢡄', + 'ï«‘' => 'ð£•', + 'ï«’' => 'ã®', + 'ï«“' => '䀘', + 'ï«”' => '䀹', + 'ï«•' => '𥉉', + 'ï«–' => 'ð¥³', + 'ï«—' => '𧻓', + '齃' => '齃', + 'ï«™' => '龎', + 'ï¬' => '×™Ö´', + 'ײַ' => 'ײַ', + 'שׁ' => 'ש×', + 'שׂ' => 'שׂ', + 'שּׁ' => 'שּ×', + 'שּׂ' => 'שּׂ', + 'אַ' => '×Ö·', + 'אָ' => '×Ö¸', + 'אּ' => '×Ö¼', + 'בּ' => 'בּ', + 'גּ' => '×’Ö¼', + 'דּ' => 'דּ', + 'הּ' => '×”Ö¼', + 'וּ' => 'וּ', + 'זּ' => '×–Ö¼', + 'טּ' => 'טּ', + 'יּ' => '×™Ö¼', + 'ךּ' => 'ךּ', + 'כּ' => '×›Ö¼', + 'לּ' => 'לּ', + 'מּ' => 'מּ', + 'ï­€' => '× Ö¼', + 'ï­' => 'סּ', + 'ï­ƒ' => '×£Ö¼', + 'ï­„' => 'פּ', + 'ï­†' => 'צּ', + 'ï­‡' => '×§Ö¼', + 'ï­ˆ' => 'רּ', + 'ï­‰' => 'שּ', + 'ï­Š' => 'תּ', + 'ï­‹' => 'וֹ', + 'ï­Œ' => 'בֿ', + 'ï­' => '×›Ö¿', + 'ï­Ž' => 'פֿ', + 'ð‘‚š' => '𑂚', + 'ð‘‚œ' => '𑂜', + 'ð‘‚«' => '𑂫', + 'ð‘„®' => '𑄮', + '𑄯' => '𑄯', + 'ð‘‹' => 'ð‘‡ð‘Œ¾', + 'ð‘Œ' => 'ð‘‡ð‘—', + 'ð‘’»' => '𑒻', + 'ð‘’¼' => '𑒼', + 'ð‘’¾' => '𑒾', + 'ð‘–º' => '𑖺', + 'ð‘–»' => '𑖻', + 'ð…ž' => 'ð…—ð…¥', + 'ð…Ÿ' => 'ð…˜ð…¥', + 'ð… ' => 'ð…˜ð…¥ð…®', + 'ð…¡' => 'ð…˜ð…¥ð…¯', + 'ð…¢' => 'ð…˜ð…¥ð…°', + 'ð…£' => 'ð…˜ð…¥ð…±', + 'ð…¤' => 'ð…˜ð…¥ð…²', + 'ð†»' => 'ð†¹ð…¥', + 'ð†¼' => 'ð†ºð…¥', + 'ð†½' => 'ð†¹ð…¥ð…®', + 'ð†¾' => 'ð†ºð…¥ð…®', + 'ð†¿' => 'ð†¹ð…¥ð…¯', + 'ð‡€' => 'ð†ºð…¥ð…¯', + '丽' => '丽', + 'ð¯ ' => '丸', + '乁' => 'ä¹', + '𠄢' => 'ð „¢', + '你' => 'ä½ ', + '侮' => 'ä¾®', + '侻' => 'ä¾»', + '倂' => '倂', + '偺' => 'åº', + '備' => 'å‚™', + '僧' => '僧', + '像' => 'åƒ', + '㒞' => 'ã’ž', + 'ð¯ ' => '𠘺', + '免' => 'å…', + 'ð¯ ' => 'å…”', + 'ð¯ ' => 'å…¤', + '具' => 'å…·', + '𠔜' => '𠔜', + '㒹' => 'ã’¹', + '內' => 'å…§', + '再' => 'å†', + '𠕋' => 'ð •‹', + '冗' => '冗', + '冤' => '冤', + '仌' => '仌', + '冬' => '冬', + '况' => '况', + '𩇟' => '𩇟', + 'ð¯ ' => '凵', + '刃' => '刃', + '㓟' => '㓟', + '刻' => '刻', + '剆' => '剆', + '割' => '割', + '剷' => '剷', + '㔕' => '㔕', + '勇' => '勇', + '勉' => '勉', + '勤' => '勤', + '勺' => '勺', + '包' => '包', + '匆' => '匆', + '北' => '北', + '卉' => 'å‰', + '卑' => 'å‘', + '博' => 'åš', + '即' => 'å³', + '卽' => 'å½', + '卿' => 'å¿', + '卿' => 'å¿', + '卿' => 'å¿', + '𠨬' => '𠨬', + '灰' => 'ç°', + '及' => 'åŠ', + '叟' => 'åŸ', + '𠭣' => 'ð ­£', + '叫' => 'å«', + '叱' => 'å±', + '吆' => 'å†', + '咞' => 'å’ž', + '吸' => 'å¸', + '呈' => '呈', + '周' => '周', + '咢' => 'å’¢', + 'ð¯¡' => 'å“¶', + '唐' => 'å”', + '啓' => 'å•“', + '啣' => 'å•£', + '善' => 'å–„', + '善' => 'å–„', + '喙' => 'å–™', + '喫' => 'å–«', + '喳' => 'å–³', + '嗂' => 'å—‚', + '圖' => '圖', + '嘆' => '嘆', + 'ð¯¡' => '圗', + '噑' => '噑', + 'ð¯¡' => 'å™´', + 'ð¯¡' => '切', + '壮' => '壮', + '城' => '城', + '埴' => '埴', + '堍' => 'å ', + '型' => 'åž‹', + '堲' => 'å ²', + '報' => 'å ±', + '墬' => '墬', + '𡓤' => '𡓤', + '売' => '売', + '壷' => '壷', + '夆' => '夆', + 'ð¯¡' => '多', + '夢' => '夢', + '奢' => '奢', + '𡚨' => '𡚨', + '𡛪' => '𡛪', + '姬' => '姬', + '娛' => '娛', + '娧' => '娧', + '姘' => '姘', + '婦' => '婦', + '㛮' => 'ã›®', + '㛼' => '㛼', + '嬈' => '嬈', + '嬾' => '嬾', + '嬾' => '嬾', + '𡧈' => '𡧈', + '寃' => '寃', + '寘' => '寘', + '寧' => '寧', + '寳' => '寳', + '𡬘' => '𡬘', + '寿' => '寿', + '将' => 'å°†', + '当' => '当', + '尢' => 'å°¢', + '㞁' => 'ãž', + '屠' => 'å± ', + '屮' => 'å±®', + '峀' => 'å³€', + '岍' => 'å²', + '𡷤' => 'ð¡·¤', + '嵃' => '嵃', + '𡷦' => 'ð¡·¦', + '嵮' => 'åµ®', + '嵫' => '嵫', + '嵼' => 'åµ¼', + 'ð¯¢' => 'å·¡', + '巢' => 'å·¢', + '㠯' => 'ã ¯', + '巽' => 'å·½', + '帨' => '帨', + '帽' => '帽', + '幩' => '幩', + '㡢' => 'ã¡¢', + '𢆃' => '𢆃', + '㡼' => '㡼', + '庰' => '庰', + '庳' => '庳', + 'ð¯¢' => '庶', + '廊' => '廊', + 'ð¯¢' => '𪎒', + 'ð¯¢' => '廾', + '𢌱' => '𢌱', + '𢌱' => '𢌱', + '舁' => 'èˆ', + '弢' => 'å¼¢', + '弢' => 'å¼¢', + '㣇' => '㣇', + '𣊸' => '𣊸', + '𦇚' => '𦇚', + '形' => 'å½¢', + '彫' => '彫', + '㣣' => '㣣', + '徚' => '徚', + 'ð¯¢' => 'å¿', + '志' => 'å¿—', + '忹' => '忹', + '悁' => 'æ‚', + '㤺' => '㤺', + '㤜' => '㤜', + '悔' => 'æ‚”', + '𢛔' => '𢛔', + '惇' => '惇', + '慈' => 'æ…ˆ', + '慌' => 'æ…Œ', + '慎' => 'æ…Ž', + '慌' => 'æ…Œ', + '慺' => 'æ…º', + '憎' => '憎', + '憲' => '憲', + '憤' => '憤', + '憯' => '憯', + '懞' => '懞', + '懲' => '懲', + '懶' => '懶', + '成' => 'æˆ', + '戛' => '戛', + '扝' => 'æ‰', + '抱' => '抱', + '拔' => 'æ‹”', + '捐' => 'æ', + '𢬌' => '𢬌', + '挽' => '挽', + '拼' => '拼', + '捨' => 'æ¨', + '掃' => '掃', + '揤' => 'æ¤', + '𢯱' => '𢯱', + '搢' => 'æ¢', + '揅' => 'æ…', + 'ð¯£' => '掩', + '㨮' => '㨮', + '摩' => 'æ‘©', + '摾' => '摾', + '撝' => 'æ’', + '摷' => 'æ‘·', + '㩬' => '㩬', + '敏' => 'æ•', + '敬' => '敬', + '𣀊' => '𣀊', + '旣' => 'æ—£', + '書' => '書', + 'ð¯£' => '晉', + '㬙' => '㬙', + 'ð¯£' => 'æš‘', + 'ð¯£' => '㬈', + '㫤' => '㫤', + '冒' => '冒', + '冕' => '冕', + '最' => '最', + '暜' => 'æšœ', + '肭' => 'è‚­', + '䏙' => 'ä™', + '朗' => '朗', + '望' => '望', + '朡' => '朡', + '杞' => 'æž', + '杓' => 'æ“', + 'ð¯£' => 'ð£ƒ', + '㭉' => 'ã­‰', + '柺' => '柺', + '枅' => 'æž…', + '桒' => 'æ¡’', + '梅' => '梅', + '𣑭' => '𣑭', + '梎' => '梎', + '栟' => 'æ Ÿ', + '椔' => '椔', + '㮝' => 'ã®', + '楂' => '楂', + '榣' => '榣', + '槪' => '槪', + '檨' => '檨', + '𣚣' => '𣚣', + '櫛' => 'æ«›', + '㰘' => 'ã°˜', + '次' => '次', + '𣢧' => '𣢧', + '歔' => 'æ­”', + '㱎' => '㱎', + '歲' => 'æ­²', + '殟' => '殟', + '殺' => '殺', + '殻' => 'æ®»', + '𣪍' => 'ð£ª', + '𡴋' => 'ð¡´‹', + '𣫺' => '𣫺', + '汎' => '汎', + '𣲼' => '𣲼', + '沿' => '沿', + '泍' => 'æ³', + '汧' => 'æ±§', + '洖' => 'æ´–', + '派' => 'æ´¾', + 'ð¯¤' => 'æµ·', + '流' => 'æµ', + '浩' => '浩', + '浸' => '浸', + '涅' => 'æ¶…', + '𣴞' => '𣴞', + '洴' => 'æ´´', + '港' => '港', + '湮' => 'æ¹®', + '㴳' => 'ã´³', + '滋' => '滋', + '滇' => '滇', + 'ð¯¤' => '𣻑', + '淹' => 'æ·¹', + 'ð¯¤' => 'æ½®', + 'ð¯¤' => '𣽞', + '𣾎' => '𣾎', + '濆' => '濆', + '瀹' => '瀹', + '瀞' => '瀞', + '瀛' => '瀛', + '㶖' => 'ã¶–', + '灊' => 'çŠ', + '災' => 'ç½', + '灷' => 'ç·', + '炭' => 'ç‚­', + '𠔥' => '𠔥', + '煅' => 'ç……', + 'ð¯¤' => '𤉣', + '熜' => '熜', + '𤎫' => '𤎫', + '爨' => '爨', + '爵' => '爵', + '牐' => 'ç‰', + '𤘈' => '𤘈', + '犀' => '犀', + '犕' => '犕', + '𤜵' => '𤜵', + '𤠔' => '𤠔', + '獺' => 'çº', + '王' => '王', + '㺬' => '㺬', + '玥' => '玥', + '㺸' => '㺸', + '㺸' => '㺸', + '瑇' => '瑇', + '瑜' => '瑜', + '瑱' => '瑱', + '璅' => 'ç’…', + '瓊' => '瓊', + '㼛' => 'ã¼›', + '甤' => '甤', + '𤰶' => '𤰶', + '甾' => '甾', + '𤲒' => '𤲒', + '異' => 'ç•°', + '𢆟' => '𢆟', + '瘐' => 'ç˜', + '𤾡' => '𤾡', + '𤾸' => '𤾸', + '𥁄' => 'ð¥„', + '㿼' => '㿼', + '䀈' => '䀈', + '直' => 'ç›´', + 'ð¯¥' => '𥃳', + '𥃲' => '𥃲', + '𥄙' => '𥄙', + '𥄳' => '𥄳', + '眞' => '眞', + '真' => '真', + '真' => '真', + '睊' => 'çŠ', + '䀹' => '䀹', + '瞋' => 'çž‹', + '䁆' => 'ä†', + '䂖' => 'ä‚–', + 'ð¯¥' => 'ð¥', + '硎' => '硎', + 'ð¯¥' => '碌', + 'ð¯¥' => '磌', + '䃣' => '䃣', + '𥘦' => '𥘦', + '祖' => '祖', + '𥚚' => '𥚚', + '𥛅' => '𥛅', + '福' => 'ç¦', + '秫' => 'ç§«', + '䄯' => '䄯', + '穀' => 'ç©€', + '穊' => '穊', + '穏' => 'ç©', + '𥥼' => '𥥼', + 'ð¯¥' => '𥪧', + '𥪧' => '𥪧', + '竮' => 'ç«®', + '䈂' => '䈂', + '𥮫' => '𥮫', + '篆' => '篆', + '築' => '築', + '䈧' => '䈧', + '𥲀' => '𥲀', + '糒' => 'ç³’', + '䊠' => '䊠', + '糨' => '糨', + '糣' => 'ç³£', + '紀' => 'ç´€', + '𥾆' => '𥾆', + '絣' => 'çµ£', + '䌁' => 'äŒ', + '緇' => 'ç·‡', + '縂' => '縂', + '繅' => 'ç¹…', + '䌴' => '䌴', + '𦈨' => '𦈨', + '𦉇' => '𦉇', + '䍙' => 'ä™', + '𦋙' => '𦋙', + '罺' => '罺', + '𦌾' => '𦌾', + '羕' => '羕', + '翺' => '翺', + '者' => '者', + '𦓚' => '𦓚', + '𦔣' => '𦔣', + '聠' => 'è ', + '𦖨' => '𦖨', + '聰' => 'è°', + '𣍟' => 'ð£Ÿ', + 'ð¯¦' => 'ä•', + '育' => '育', + '脃' => '脃', + '䐋' => 'ä‹', + '脾' => '脾', + '媵' => '媵', + '𦞧' => '𦞧', + '𦞵' => '𦞵', + '𣎓' => '𣎓', + '𣎜' => '𣎜', + '舁' => 'èˆ', + '舄' => '舄', + 'ð¯¦' => '辞', + '䑫' => 'ä‘«', + 'ð¯¦' => '芑', + 'ð¯¦' => '芋', + '芝' => 'èŠ', + '劳' => '劳', + '花' => '花', + '芳' => '芳', + '芽' => '芽', + '苦' => '苦', + '𦬼' => '𦬼', + '若' => 'è‹¥', + '茝' => 'èŒ', + '荣' => 'è£', + '莭' => '莭', + '茣' => '茣', + 'ð¯¦' => '莽', + '菧' => 'è§', + '著' => 'è‘—', + '荓' => 'è“', + '菊' => 'èŠ', + '菌' => 'èŒ', + '菜' => 'èœ', + '𦰶' => '𦰶', + '𦵫' => '𦵫', + '𦳕' => '𦳕', + '䔫' => '䔫', + '蓱' => '蓱', + '蓳' => '蓳', + '蔖' => 'è”–', + '𧏊' => 'ð§Š', + '蕤' => '蕤', + '𦼬' => '𦼬', + '䕝' => 'ä•', + '䕡' => 'ä•¡', + '𦾱' => '𦾱', + '𧃒' => '𧃒', + '䕫' => 'ä•«', + '虐' => 'è™', + '虜' => '虜', + '虧' => 'è™§', + '虩' => '虩', + '蚩' => 'èš©', + '蚈' => '蚈', + '蜎' => '蜎', + '蛢' => '蛢', + '蝹' => 'è¹', + '蜨' => '蜨', + '蝫' => 'è«', + '螆' => '螆', + '䗗' => 'ä——', + '蟡' => '蟡', + 'ð¯§' => 'è ', + '䗹' => 'ä—¹', + '衠' => 'è¡ ', + '衣' => 'è¡£', + '𧙧' => 'ð§™§', + '裗' => '裗', + '裞' => '裞', + '䘵' => '䘵', + '裺' => '裺', + '㒻' => 'ã’»', + '𧢮' => 'ð§¢®', + '𧥦' => '𧥦', + 'ð¯§' => 'äš¾', + '䛇' => '䛇', + 'ð¯§' => '誠', + 'ð¯§' => 'è«­', + '變' => '變', + '豕' => '豕', + '𧲨' => '𧲨', + '貫' => '貫', + '賁' => 'è³', + '贛' => 'è´›', + '起' => 'èµ·', + '𧼯' => '𧼯', + '𠠄' => 'ð  „', + '跋' => 'è·‹', + '趼' => 'è¶¼', + '跰' => 'è·°', + 'ð¯§' => '𠣞', + '軔' => 'è»”', + '輸' => '輸', + '𨗒' => '𨗒', + '𨗭' => '𨗭', + '邔' => 'é‚”', + '郱' => '郱', + '鄑' => 'é„‘', + '𨜮' => '𨜮', + '鄛' => 'é„›', + '鈸' => '鈸', + '鋗' => 'é‹—', + '鋘' => '鋘', + '鉼' => '鉼', + '鏹' => 'é¹', + '鐕' => 'é•', + '𨯺' => '𨯺', + '開' => 'é–‹', + '䦕' => '䦕', + '閷' => 'é–·', + '𨵷' => '𨵷', + '䧦' => '䧦', + '雃' => '雃', + '嶲' => 'å¶²', + '霣' => '霣', + '𩅅' => 'ð©……', + '𩈚' => '𩈚', + '䩮' => 'ä©®', + '䩶' => 'ä©¶', + '韠' => '韠', + '𩐊' => 'ð©Š', + '䪲' => '䪲', + '𩒖' => 'ð©’–', + '頋' => 'é ‹', + '頋' => 'é ‹', + '頩' => 'é ©', + 'ð¯¨' => 'ð©–¶', + '飢' => '飢', + '䬳' => '䬳', + '餩' => '餩', + '馧' => '馧', + '駂' => 'é§‚', + '駾' => 'é§¾', + '䯎' => '䯎', + '𩬰' => '𩬰', + '鬒' => '鬒', + '鱀' => 'é±€', + '鳽' => 'é³½', + 'ð¯¨' => '䳎', + '䳭' => 'ä³­', + 'ð¯¨' => 'éµ§', + 'ð¯¨' => '𪃎', + '䳸' => '䳸', + '𪄅' => '𪄅', + '𪈎' => '𪈎', + '𪊑' => '𪊑', + '麻' => '麻', + '䵖' => 'äµ–', + '黹' => '黹', + '黾' => '黾', + '鼅' => 'é¼…', + '鼏' => 'é¼', + '鼖' => 'é¼–', + '鼻' => 'é¼»', + 'ð¯¨' => '𪘀', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php new file mode 100644 index 0000000..ec8af79 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php @@ -0,0 +1,866 @@ + 230, + 'Ì' => 230, + 'Ì‚' => 230, + '̃' => 230, + 'Ì„' => 230, + 'Ì…' => 230, + '̆' => 230, + '̇' => 230, + '̈' => 230, + '̉' => 230, + 'ÌŠ' => 230, + 'Ì‹' => 230, + 'ÌŒ' => 230, + 'Ì' => 230, + 'ÌŽ' => 230, + 'Ì' => 230, + 'Ì' => 230, + 'Ì‘' => 230, + 'Ì’' => 230, + 'Ì“' => 230, + 'Ì”' => 230, + 'Ì•' => 232, + 'Ì–' => 220, + 'Ì—' => 220, + '̘' => 220, + 'Ì™' => 220, + 'Ìš' => 232, + 'Ì›' => 216, + 'Ìœ' => 220, + 'Ì' => 220, + 'Ìž' => 220, + 'ÌŸ' => 220, + 'Ì ' => 220, + 'Ì¡' => 202, + 'Ì¢' => 202, + 'Ì£' => 220, + '̤' => 220, + 'Ì¥' => 220, + '̦' => 220, + '̧' => 202, + '̨' => 202, + 'Ì©' => 220, + '̪' => 220, + 'Ì«' => 220, + '̬' => 220, + 'Ì­' => 220, + 'Ì®' => 220, + '̯' => 220, + '̰' => 220, + '̱' => 220, + '̲' => 220, + '̳' => 220, + 'Ì´' => 1, + '̵' => 1, + '̶' => 1, + 'Ì·' => 1, + '̸' => 1, + '̹' => 220, + '̺' => 220, + 'Ì»' => 220, + '̼' => 220, + '̽' => 230, + '̾' => 230, + 'Ì¿' => 230, + 'Í€' => 230, + 'Í' => 230, + 'Í‚' => 230, + '̓' => 230, + 'Í„' => 230, + 'Í…' => 240, + '͆' => 230, + '͇' => 220, + '͈' => 220, + '͉' => 220, + 'ÍŠ' => 230, + 'Í‹' => 230, + 'ÍŒ' => 230, + 'Í' => 220, + 'ÍŽ' => 220, + 'Í' => 230, + 'Í‘' => 230, + 'Í’' => 230, + 'Í“' => 220, + 'Í”' => 220, + 'Í•' => 220, + 'Í–' => 220, + 'Í—' => 230, + '͘' => 232, + 'Í™' => 220, + 'Íš' => 220, + 'Í›' => 230, + 'Íœ' => 233, + 'Í' => 234, + 'Íž' => 234, + 'ÍŸ' => 233, + 'Í ' => 234, + 'Í¡' => 234, + 'Í¢' => 233, + 'Í£' => 230, + 'ͤ' => 230, + 'Í¥' => 230, + 'ͦ' => 230, + 'ͧ' => 230, + 'ͨ' => 230, + 'Í©' => 230, + 'ͪ' => 230, + 'Í«' => 230, + 'ͬ' => 230, + 'Í­' => 230, + 'Í®' => 230, + 'ͯ' => 230, + 'Òƒ' => 230, + 'Ò„' => 230, + 'Ò…' => 230, + 'Ò†' => 230, + 'Ò‡' => 230, + 'Ö‘' => 220, + 'Ö’' => 230, + 'Ö“' => 230, + 'Ö”' => 230, + 'Ö•' => 230, + 'Ö–' => 220, + 'Ö—' => 230, + 'Ö˜' => 230, + 'Ö™' => 230, + 'Öš' => 222, + 'Ö›' => 220, + 'Öœ' => 230, + 'Ö' => 230, + 'Öž' => 230, + 'ÖŸ' => 230, + 'Ö ' => 230, + 'Ö¡' => 230, + 'Ö¢' => 220, + 'Ö£' => 220, + 'Ö¤' => 220, + 'Ö¥' => 220, + 'Ö¦' => 220, + 'Ö§' => 220, + 'Ö¨' => 230, + 'Ö©' => 230, + 'Öª' => 220, + 'Ö«' => 230, + 'Ö¬' => 230, + 'Ö­' => 222, + 'Ö®' => 228, + 'Ö¯' => 230, + 'Ö°' => 10, + 'Ö±' => 11, + 'Ö²' => 12, + 'Ö³' => 13, + 'Ö´' => 14, + 'Öµ' => 15, + 'Ö¶' => 16, + 'Ö·' => 17, + 'Ö¸' => 18, + 'Ö¹' => 19, + 'Öº' => 19, + 'Ö»' => 20, + 'Ö¼' => 21, + 'Ö½' => 22, + 'Ö¿' => 23, + '×' => 24, + 'ׂ' => 25, + 'ׄ' => 230, + '×…' => 220, + 'ׇ' => 18, + 'Ø' => 230, + 'Ø‘' => 230, + 'Ø’' => 230, + 'Ø“' => 230, + 'Ø”' => 230, + 'Ø•' => 230, + 'Ø–' => 230, + 'Ø—' => 230, + 'ؘ' => 30, + 'Ø™' => 31, + 'Øš' => 32, + 'Ù‹' => 27, + 'ÙŒ' => 28, + 'Ù' => 29, + 'ÙŽ' => 30, + 'Ù' => 31, + 'Ù' => 32, + 'Ù‘' => 33, + 'Ù’' => 34, + 'Ù“' => 230, + 'Ù”' => 230, + 'Ù•' => 220, + 'Ù–' => 220, + 'Ù—' => 230, + 'Ù˜' => 230, + 'Ù™' => 230, + 'Ùš' => 230, + 'Ù›' => 230, + 'Ùœ' => 220, + 'Ù' => 230, + 'Ùž' => 230, + 'ÙŸ' => 220, + 'Ù°' => 35, + 'Û–' => 230, + 'Û—' => 230, + 'Û˜' => 230, + 'Û™' => 230, + 'Ûš' => 230, + 'Û›' => 230, + 'Ûœ' => 230, + 'ÛŸ' => 230, + 'Û ' => 230, + 'Û¡' => 230, + 'Û¢' => 230, + 'Û£' => 220, + 'Û¤' => 230, + 'Û§' => 230, + 'Û¨' => 230, + 'Ûª' => 220, + 'Û«' => 230, + 'Û¬' => 230, + 'Û­' => 220, + 'Ü‘' => 36, + 'ܰ' => 230, + 'ܱ' => 220, + 'ܲ' => 230, + 'ܳ' => 230, + 'Ü´' => 220, + 'ܵ' => 230, + 'ܶ' => 230, + 'Ü·' => 220, + 'ܸ' => 220, + 'ܹ' => 220, + 'ܺ' => 230, + 'Ü»' => 220, + 'ܼ' => 220, + 'ܽ' => 230, + 'ܾ' => 220, + 'Ü¿' => 230, + 'Ý€' => 230, + 'Ý' => 230, + 'Ý‚' => 220, + '݃' => 230, + 'Ý„' => 220, + 'Ý…' => 230, + '݆' => 220, + '݇' => 230, + '݈' => 220, + '݉' => 230, + 'ÝŠ' => 230, + 'ß«' => 230, + '߬' => 230, + 'ß­' => 230, + 'ß®' => 230, + '߯' => 230, + 'ß°' => 230, + 'ß±' => 230, + 'ß²' => 220, + 'ß³' => 230, + 'ß½' => 220, + 'à –' => 230, + 'à —' => 230, + 'à ˜' => 230, + 'à ™' => 230, + 'à ›' => 230, + 'à œ' => 230, + 'à ' => 230, + 'à ž' => 230, + 'à Ÿ' => 230, + 'à  ' => 230, + 'à ¡' => 230, + 'à ¢' => 230, + 'à £' => 230, + 'à ¥' => 230, + 'à ¦' => 230, + 'à §' => 230, + 'à ©' => 230, + 'à ª' => 230, + 'à «' => 230, + 'à ¬' => 230, + 'à ­' => 230, + 'à¡™' => 220, + '࡚' => 220, + 'à¡›' => 220, + '࣓' => 220, + 'ࣔ' => 230, + 'ࣕ' => 230, + 'ࣖ' => 230, + 'ࣗ' => 230, + 'ࣘ' => 230, + 'ࣙ' => 230, + 'ࣚ' => 230, + 'ࣛ' => 230, + 'ࣜ' => 230, + 'à£' => 230, + 'ࣞ' => 230, + 'ࣟ' => 230, + '࣠' => 230, + '࣡' => 230, + 'ࣣ' => 220, + 'ࣤ' => 230, + 'ࣥ' => 230, + 'ࣦ' => 220, + 'ࣧ' => 230, + 'ࣨ' => 230, + 'ࣩ' => 220, + '࣪' => 230, + '࣫' => 230, + '࣬' => 230, + '࣭' => 220, + '࣮' => 220, + '࣯' => 220, + 'ࣰ' => 27, + 'ࣱ' => 28, + 'ࣲ' => 29, + 'ࣳ' => 230, + 'ࣴ' => 230, + 'ࣵ' => 230, + 'ࣶ' => 220, + 'ࣷ' => 230, + 'ࣸ' => 230, + 'ࣹ' => 220, + 'ࣺ' => 220, + 'ࣻ' => 230, + 'ࣼ' => 230, + 'ࣽ' => 230, + 'ࣾ' => 230, + 'ࣿ' => 230, + '़' => 7, + 'à¥' => 9, + '॑' => 230, + '॒' => 220, + '॓' => 230, + '॔' => 230, + '়' => 7, + 'à§' => 9, + 'à§¾' => 230, + '਼' => 7, + 'à©' => 9, + '઼' => 7, + 'à«' => 9, + '଼' => 7, + 'à­' => 9, + 'à¯' => 9, + 'à±' => 9, + 'ౕ' => 84, + 'à±–' => 91, + '಼' => 7, + 'à³' => 9, + 'à´»' => 9, + 'à´¼' => 9, + 'àµ' => 9, + 'à·Š' => 9, + 'ุ' => 103, + 'ู' => 103, + 'ฺ' => 9, + '่' => 107, + '้' => 107, + '๊' => 107, + '๋' => 107, + 'ຸ' => 118, + 'ູ' => 118, + '຺' => 9, + '່' => 122, + '້' => 122, + '໊' => 122, + '໋' => 122, + '༘' => 220, + '༙' => 220, + '༵' => 220, + '༷' => 220, + '༹' => 216, + 'ཱ' => 129, + 'ི' => 130, + 'ུ' => 132, + 'ེ' => 130, + 'ཻ' => 130, + 'ོ' => 130, + 'ཽ' => 130, + 'ྀ' => 130, + 'ྂ' => 230, + 'ྃ' => 230, + '྄' => 9, + '྆' => 230, + '྇' => 230, + '࿆' => 220, + '့' => 7, + '္' => 9, + '်' => 9, + 'á‚' => 220, + 'á' => 230, + 'áž' => 230, + 'áŸ' => 230, + '᜔' => 9, + '᜴' => 9, + '្' => 9, + 'áŸ' => 230, + 'ᢩ' => 228, + '᤹' => 222, + '᤺' => 230, + '᤻' => 220, + 'ᨗ' => 230, + 'ᨘ' => 220, + 'á© ' => 9, + '᩵' => 230, + 'á©¶' => 230, + 'á©·' => 230, + '᩸' => 230, + '᩹' => 230, + '᩺' => 230, + 'á©»' => 230, + '᩼' => 230, + 'á©¿' => 220, + '᪰' => 230, + '᪱' => 230, + '᪲' => 230, + '᪳' => 230, + '᪴' => 230, + '᪵' => 220, + '᪶' => 220, + '᪷' => 220, + '᪸' => 220, + '᪹' => 220, + '᪺' => 220, + '᪻' => 230, + '᪼' => 230, + '᪽' => 220, + '᬴' => 7, + 'á­„' => 9, + 'á­«' => 230, + 'á­¬' => 220, + 'á­­' => 230, + 'á­®' => 230, + 'á­¯' => 230, + 'á­°' => 230, + 'á­±' => 230, + 'á­²' => 230, + 'á­³' => 230, + '᮪' => 9, + '᮫' => 9, + '᯦' => 7, + '᯲' => 9, + '᯳' => 9, + 'á°·' => 7, + 'á³' => 230, + '᳑' => 230, + 'á³’' => 230, + 'á³”' => 1, + '᳕' => 220, + 'á³–' => 220, + 'á³—' => 220, + '᳘' => 220, + 'á³™' => 220, + '᳚' => 230, + 'á³›' => 230, + '᳜' => 220, + 'á³' => 220, + '᳞' => 220, + '᳟' => 220, + 'á³ ' => 230, + 'á³¢' => 1, + 'á³£' => 1, + '᳤' => 1, + 'á³¥' => 1, + '᳦' => 1, + 'á³§' => 1, + '᳨' => 1, + 'á³­' => 220, + 'á³´' => 230, + '᳸' => 230, + 'á³¹' => 230, + 'á·€' => 230, + 'á·' => 230, + 'á·‚' => 220, + 'á·ƒ' => 230, + 'á·„' => 230, + 'á·…' => 230, + 'á·†' => 230, + 'á·‡' => 230, + 'á·ˆ' => 230, + 'á·‰' => 230, + 'á·Š' => 220, + 'á·‹' => 230, + 'á·Œ' => 230, + 'á·' => 234, + 'á·Ž' => 214, + 'á·' => 220, + 'á·' => 202, + 'á·‘' => 230, + 'á·’' => 230, + 'á·“' => 230, + 'á·”' => 230, + 'á·•' => 230, + 'á·–' => 230, + 'á·—' => 230, + 'á·˜' => 230, + 'á·™' => 230, + 'á·š' => 230, + 'á·›' => 230, + 'á·œ' => 230, + 'á·' => 230, + 'á·ž' => 230, + 'á·Ÿ' => 230, + 'á· ' => 230, + 'á·¡' => 230, + 'á·¢' => 230, + 'á·£' => 230, + 'á·¤' => 230, + 'á·¥' => 230, + 'á·¦' => 230, + 'á·§' => 230, + 'á·¨' => 230, + 'á·©' => 230, + 'á·ª' => 230, + 'á·«' => 230, + 'á·¬' => 230, + 'á·­' => 230, + 'á·®' => 230, + 'á·¯' => 230, + 'á·°' => 230, + 'á·±' => 230, + 'á·²' => 230, + 'á·³' => 230, + 'á·´' => 230, + 'á·µ' => 230, + 'á·¶' => 232, + 'á··' => 228, + 'á·¸' => 228, + 'á·¹' => 220, + 'á·»' => 230, + 'á·¼' => 233, + 'á·½' => 220, + 'á·¾' => 230, + 'á·¿' => 220, + 'âƒ' => 230, + '⃑' => 230, + '⃒' => 1, + '⃓' => 1, + '⃔' => 230, + '⃕' => 230, + '⃖' => 230, + '⃗' => 230, + '⃘' => 1, + '⃙' => 1, + '⃚' => 1, + '⃛' => 230, + '⃜' => 230, + '⃡' => 230, + '⃥' => 1, + '⃦' => 1, + '⃧' => 230, + '⃨' => 220, + '⃩' => 230, + '⃪' => 1, + '⃫' => 1, + '⃬' => 220, + '⃭' => 220, + '⃮' => 220, + '⃯' => 220, + '⃰' => 230, + '⳯' => 230, + 'â³°' => 230, + 'â³±' => 230, + '⵿' => 9, + 'â· ' => 230, + 'â·¡' => 230, + 'â·¢' => 230, + 'â·£' => 230, + 'â·¤' => 230, + 'â·¥' => 230, + 'â·¦' => 230, + 'â·§' => 230, + 'â·¨' => 230, + 'â·©' => 230, + 'â·ª' => 230, + 'â·«' => 230, + 'â·¬' => 230, + 'â·­' => 230, + 'â·®' => 230, + 'â·¯' => 230, + 'â·°' => 230, + 'â·±' => 230, + 'â·²' => 230, + 'â·³' => 230, + 'â·´' => 230, + 'â·µ' => 230, + 'â·¶' => 230, + 'â··' => 230, + 'â·¸' => 230, + 'â·¹' => 230, + 'â·º' => 230, + 'â·»' => 230, + 'â·¼' => 230, + 'â·½' => 230, + 'â·¾' => 230, + 'â·¿' => 230, + '〪' => 218, + '〫' => 228, + '〬' => 232, + '〭' => 222, + '〮' => 224, + '〯' => 224, + 'ã‚™' => 8, + '゚' => 8, + '꙯' => 230, + 'ê™´' => 230, + 'ꙵ' => 230, + 'ê™¶' => 230, + 'ê™·' => 230, + 'ꙸ' => 230, + 'ꙹ' => 230, + 'ꙺ' => 230, + 'ê™»' => 230, + '꙼' => 230, + '꙽' => 230, + 'êšž' => 230, + 'ꚟ' => 230, + 'ê›°' => 230, + 'ê›±' => 230, + 'ê †' => 9, + '꣄' => 9, + '꣠' => 230, + '꣡' => 230, + '꣢' => 230, + '꣣' => 230, + '꣤' => 230, + '꣥' => 230, + '꣦' => 230, + '꣧' => 230, + '꣨' => 230, + '꣩' => 230, + '꣪' => 230, + '꣫' => 230, + '꣬' => 230, + '꣭' => 230, + '꣮' => 230, + '꣯' => 230, + '꣰' => 230, + '꣱' => 230, + '꤫' => 220, + '꤬' => 220, + '꤭' => 220, + '꥓' => 9, + '꦳' => 7, + 'ê§€' => 9, + 'ꪰ' => 230, + 'ꪲ' => 230, + 'ꪳ' => 230, + 'ꪴ' => 220, + 'ꪷ' => 230, + 'ꪸ' => 230, + 'ꪾ' => 230, + '꪿' => 230, + 'ê«' => 230, + 'ê«¶' => 9, + '꯭' => 9, + 'ﬞ' => 26, + '︠' => 230, + '︡' => 230, + '︢' => 230, + '︣' => 230, + '︤' => 230, + '︥' => 230, + '︦' => 230, + '︧' => 220, + '︨' => 220, + '︩' => 220, + '︪' => 220, + '︫' => 220, + '︬' => 220, + '︭' => 220, + '︮' => 230, + '︯' => 230, + 'ð‡½' => 220, + 'ð‹ ' => 220, + 'ð¶' => 230, + 'ð·' => 230, + 'ð¸' => 230, + 'ð¹' => 230, + 'ðº' => 230, + 'ð¨' => 220, + 'ð¨' => 230, + 'ð¨¸' => 230, + 'ð¨¹' => 1, + 'ð¨º' => 220, + 'ð¨¿' => 9, + 'ð«¥' => 230, + 'ð«¦' => 220, + 'ð´¤' => 230, + 'ð´¥' => 230, + 'ð´¦' => 230, + 'ð´§' => 230, + 'ð½†' => 220, + 'ð½‡' => 220, + 'ð½ˆ' => 230, + 'ð½‰' => 230, + 'ð½Š' => 230, + 'ð½‹' => 220, + 'ð½Œ' => 230, + 'ð½' => 220, + 'ð½Ž' => 220, + 'ð½' => 220, + 'ð½' => 220, + 'ð‘†' => 9, + 'ð‘¿' => 9, + 'ð‘‚¹' => 9, + '𑂺' => 7, + 'ð‘„€' => 230, + 'ð‘„' => 230, + 'ð‘„‚' => 230, + 'ð‘„³' => 9, + 'ð‘„´' => 9, + 'ð‘…³' => 7, + '𑇀' => 9, + '𑇊' => 7, + '𑈵' => 9, + '𑈶' => 7, + 'ð‘‹©' => 7, + '𑋪' => 9, + '𑌻' => 7, + '𑌼' => 7, + 'ð‘' => 9, + 'ð‘¦' => 230, + 'ð‘§' => 230, + 'ð‘¨' => 230, + 'ð‘©' => 230, + 'ð‘ª' => 230, + 'ð‘«' => 230, + 'ð‘¬' => 230, + 'ð‘°' => 230, + 'ð‘±' => 230, + 'ð‘²' => 230, + 'ð‘³' => 230, + 'ð‘´' => 230, + 'ð‘‘‚' => 9, + '𑑆' => 7, + 'ð‘‘ž' => 230, + 'ð‘“‚' => 9, + '𑓃' => 7, + 'ð‘–¿' => 9, + 'ð‘—€' => 7, + '𑘿' => 9, + '𑚶' => 9, + '𑚷' => 7, + '𑜫' => 9, + 'ð‘ ¹' => 9, + 'ð‘ º' => 7, + 'ð‘§ ' => 9, + '𑨴' => 9, + '𑩇' => 9, + '𑪙' => 9, + 'ð‘°¿' => 9, + '𑵂' => 7, + '𑵄' => 9, + '𑵅' => 9, + 'ð‘¶—' => 9, + 'ð–«°' => 1, + 'ð–«±' => 1, + 'ð–«²' => 1, + 'ð–«³' => 1, + 'ð–«´' => 1, + 'ð–¬°' => 230, + '𖬱' => 230, + '𖬲' => 230, + '𖬳' => 230, + 'ð–¬´' => 230, + '𖬵' => 230, + '𖬶' => 230, + '𛲞' => 1, + 'ð…¥' => 216, + 'ð…¦' => 216, + 'ð…§' => 1, + 'ð…¨' => 1, + 'ð…©' => 1, + 'ð…­' => 226, + 'ð…®' => 216, + 'ð…¯' => 216, + 'ð…°' => 216, + 'ð…±' => 216, + 'ð…²' => 216, + 'ð…»' => 220, + 'ð…¼' => 220, + 'ð…½' => 220, + 'ð…¾' => 220, + 'ð…¿' => 220, + 'ð†€' => 220, + 'ð†' => 220, + 'ð†‚' => 220, + 'ð†…' => 230, + 'ð††' => 230, + 'ð†‡' => 230, + 'ð†ˆ' => 230, + 'ð†‰' => 230, + 'ð†Š' => 220, + 'ð†‹' => 220, + 'ð†ª' => 230, + 'ð†«' => 230, + 'ð†¬' => 230, + 'ð†­' => 230, + 'ð‰‚' => 230, + 'ð‰ƒ' => 230, + 'ð‰„' => 230, + '𞀀' => 230, + 'ðž€' => 230, + '𞀂' => 230, + '𞀃' => 230, + '𞀄' => 230, + '𞀅' => 230, + '𞀆' => 230, + '𞀈' => 230, + '𞀉' => 230, + '𞀊' => 230, + '𞀋' => 230, + '𞀌' => 230, + 'ðž€' => 230, + '𞀎' => 230, + 'ðž€' => 230, + 'ðž€' => 230, + '𞀑' => 230, + '𞀒' => 230, + '𞀓' => 230, + '𞀔' => 230, + '𞀕' => 230, + '𞀖' => 230, + '𞀗' => 230, + '𞀘' => 230, + '𞀛' => 230, + '𞀜' => 230, + 'ðž€' => 230, + '𞀞' => 230, + '𞀟' => 230, + '𞀠' => 230, + '𞀡' => 230, + '𞀣' => 230, + '𞀤' => 230, + '𞀦' => 230, + '𞀧' => 230, + '𞀨' => 230, + '𞀩' => 230, + '𞀪' => 230, + 'ðž„°' => 230, + '𞄱' => 230, + '𞄲' => 230, + '𞄳' => 230, + 'ðž„´' => 230, + '𞄵' => 230, + 'ðž„¶' => 230, + '𞋬' => 230, + 'ðž‹­' => 230, + 'ðž‹®' => 230, + '𞋯' => 230, + 'ðž£' => 220, + '𞣑' => 220, + '𞣒' => 220, + '𞣓' => 220, + '𞣔' => 220, + '𞣕' => 220, + '𞣖' => 220, + '𞥄' => 230, + '𞥅' => 230, + '𞥆' => 230, + '𞥇' => 230, + '𞥈' => 230, + '𞥉' => 230, + '𞥊' => 7, +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php new file mode 100644 index 0000000..196d1bd --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php @@ -0,0 +1,3684 @@ + ' ', + '¨' => ' ̈', + 'ª' => 'a', + '¯' => ' Ì„', + '²' => '2', + '³' => '3', + '´' => ' Ì', + 'µ' => 'μ', + '¸' => ' ̧', + '¹' => '1', + 'º' => 'o', + '¼' => '1â„4', + '½' => '1â„2', + '¾' => '3â„4', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'Ä¿' => 'L·', + 'Å€' => 'l·', + 'ʼn' => 'ʼn', + 'Å¿' => 's', + 'Ç„' => 'DZÌŒ', + 'Ç…' => 'DzÌŒ', + 'dž' => 'dzÌŒ', + 'LJ' => 'LJ', + 'Lj' => 'Lj', + 'lj' => 'lj', + 'ÇŠ' => 'NJ', + 'Ç‹' => 'Nj', + 'ÇŒ' => 'nj', + 'DZ' => 'DZ', + 'Dz' => 'Dz', + 'dz' => 'dz', + 'ʰ' => 'h', + 'ʱ' => 'ɦ', + 'ʲ' => 'j', + 'ʳ' => 'r', + 'Ê´' => 'ɹ', + 'ʵ' => 'É»', + 'ʶ' => 'Ê', + 'Ê·' => 'w', + 'ʸ' => 'y', + '˘' => ' ̆', + 'Ë™' => ' ̇', + 'Ëš' => ' ÌŠ', + 'Ë›' => ' ̨', + 'Ëœ' => ' ̃', + 'Ë' => ' Ì‹', + 'Ë ' => 'É£', + 'Ë¡' => 'l', + 'Ë¢' => 's', + 'Ë£' => 'x', + 'ˤ' => 'Ê•', + 'ͺ' => ' Í…', + '΄' => ' Ì', + 'Î…' => ' ̈Ì', + 'Ï' => 'β', + 'Ï‘' => 'θ', + 'Ï’' => 'Î¥', + 'Ï“' => 'Î¥Ì', + 'Ï”' => 'Ϋ', + 'Ï•' => 'φ', + 'Ï–' => 'Ï€', + 'ϰ' => 'κ', + 'ϱ' => 'Ï', + 'ϲ' => 'Ï‚', + 'Ï´' => 'Θ', + 'ϵ' => 'ε', + 'Ϲ' => 'Σ', + 'Ö‡' => 'Õ¥Ö‚', + 'Ùµ' => 'اٴ', + 'Ù¶' => 'وٴ', + 'Ù·' => 'Û‡Ù´', + 'Ù¸' => 'يٴ', + 'ำ' => 'à¹à¸²', + 'ຳ' => 'à»àº²', + 'ໜ' => 'ຫນ', + 'à»' => 'ຫມ', + '༌' => '་', + 'ཷ' => 'ྲཱྀ', + 'ཹ' => 'ླཱྀ', + 'ჼ' => 'ნ', + 'á´¬' => 'A', + 'á´­' => 'Æ', + 'á´®' => 'B', + 'á´°' => 'D', + 'á´±' => 'E', + 'á´²' => 'ÆŽ', + 'á´³' => 'G', + 'á´´' => 'H', + 'á´µ' => 'I', + 'á´¶' => 'J', + 'á´·' => 'K', + 'á´¸' => 'L', + 'á´¹' => 'M', + 'á´º' => 'N', + 'á´¼' => 'O', + 'á´½' => 'È¢', + 'á´¾' => 'P', + 'á´¿' => 'R', + 'áµ€' => 'T', + 'áµ' => 'U', + 'ᵂ' => 'W', + 'ᵃ' => 'a', + 'ᵄ' => 'É', + 'áµ…' => 'É‘', + 'ᵆ' => 'á´‚', + 'ᵇ' => 'b', + 'ᵈ' => 'd', + 'ᵉ' => 'e', + 'ᵊ' => 'É™', + 'ᵋ' => 'É›', + 'ᵌ' => 'Éœ', + 'áµ' => 'g', + 'áµ' => 'k', + 'áµ' => 'm', + 'ᵑ' => 'Å‹', + 'áµ’' => 'o', + 'ᵓ' => 'É”', + 'áµ”' => 'á´–', + 'ᵕ' => 'á´—', + 'áµ–' => 'p', + 'áµ—' => 't', + 'ᵘ' => 'u', + 'áµ™' => 'á´', + 'ᵚ' => 'ɯ', + 'áµ›' => 'v', + 'ᵜ' => 'á´¥', + 'áµ' => 'β', + 'ᵞ' => 'γ', + 'ᵟ' => 'δ', + 'áµ ' => 'φ', + 'ᵡ' => 'χ', + 'áµ¢' => 'i', + 'áµ£' => 'r', + 'ᵤ' => 'u', + 'áµ¥' => 'v', + 'ᵦ' => 'β', + 'áµ§' => 'γ', + 'ᵨ' => 'Ï', + 'ᵩ' => 'φ', + 'ᵪ' => 'χ', + 'ᵸ' => 'н', + 'á¶›' => 'É’', + 'á¶œ' => 'c', + 'á¶' => 'É•', + 'á¶ž' => 'ð', + 'á¶Ÿ' => 'Éœ', + 'á¶ ' => 'f', + 'á¶¡' => 'ÉŸ', + 'á¶¢' => 'É¡', + 'á¶£' => 'É¥', + 'ᶤ' => 'ɨ', + 'á¶¥' => 'É©', + 'ᶦ' => 'ɪ', + 'á¶§' => 'áµ»', + 'ᶨ' => 'Ê', + 'á¶©' => 'É­', + 'ᶪ' => 'á¶…', + 'á¶«' => 'ÊŸ', + 'ᶬ' => 'ɱ', + 'á¶­' => 'ɰ', + 'á¶®' => 'ɲ', + 'ᶯ' => 'ɳ', + 'á¶°' => 'É´', + 'á¶±' => 'ɵ', + 'á¶²' => 'ɸ', + 'á¶³' => 'Ê‚', + 'á¶´' => 'ʃ', + 'á¶µ' => 'Æ«', + 'á¶¶' => 'ʉ', + 'á¶·' => 'ÊŠ', + 'ᶸ' => 'á´œ', + 'á¶¹' => 'Ê‹', + 'ᶺ' => 'ÊŒ', + 'á¶»' => 'z', + 'á¶¼' => 'Ê', + 'á¶½' => 'Ê‘', + 'á¶¾' => 'Ê’', + 'á¶¿' => 'θ', + 'ẚ' => 'aʾ', + 'ẛ' => 'ṡ', + 'á¾½' => ' Ì“', + '᾿' => ' Ì“', + 'á¿€' => ' Í‚', + 'á¿' => ' ̈͂', + 'á¿' => ' ̓̀', + '῎' => ' Ì“Ì', + 'á¿' => ' ̓͂', + 'á¿' => ' ̔̀', + '῞' => ' Ì”Ì', + '῟' => ' ̔͂', + 'á¿­' => ' ̈̀', + 'á¿®' => ' ̈Ì', + '´' => ' Ì', + '῾' => ' Ì”', + ' ' => ' ', + 'â€' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + '‑' => 'â€', + '‗' => ' ̳', + '․' => '.', + '‥' => '..', + '…' => '...', + ' ' => ' ', + '″' => '′′', + '‴' => '′′′', + '‶' => '‵‵', + '‷' => '‵‵‵', + '‼' => '!!', + '‾' => ' Ì…', + 'â‡' => '??', + 'âˆ' => '?!', + 'â‰' => '!?', + 'â—' => '′′′′', + 'âŸ' => ' ', + 'â°' => '0', + 'â±' => 'i', + 'â´' => '4', + 'âµ' => '5', + 'â¶' => '6', + 'â·' => '7', + 'â¸' => '8', + 'â¹' => '9', + 'âº' => '+', + 'â»' => '−', + 'â¼' => '=', + 'â½' => '(', + 'â¾' => ')', + 'â¿' => 'n', + 'â‚€' => '0', + 'â‚' => '1', + 'â‚‚' => '2', + '₃' => '3', + 'â‚„' => '4', + 'â‚…' => '5', + '₆' => '6', + '₇' => '7', + '₈' => '8', + '₉' => '9', + '₊' => '+', + 'â‚‹' => '−', + '₌' => '=', + 'â‚' => '(', + '₎' => ')', + 'â‚' => 'a', + 'â‚‘' => 'e', + 'â‚’' => 'o', + 'â‚“' => 'x', + 'â‚”' => 'É™', + 'â‚•' => 'h', + 'â‚–' => 'k', + 'â‚—' => 'l', + 'ₘ' => 'm', + 'â‚™' => 'n', + 'ₚ' => 'p', + 'â‚›' => 's', + 'ₜ' => 't', + '₨' => 'Rs', + 'â„€' => 'a/c', + 'â„' => 'a/s', + 'â„‚' => 'C', + '℃' => '°C', + 'â„…' => 'c/o', + '℆' => 'c/u', + 'ℇ' => 'Æ', + '℉' => '°F', + 'ℊ' => 'g', + 'â„‹' => 'H', + 'ℌ' => 'H', + 'â„' => 'H', + 'ℎ' => 'h', + 'â„' => 'ħ', + 'â„' => 'I', + 'â„‘' => 'I', + 'â„’' => 'L', + 'â„“' => 'l', + 'â„•' => 'N', + 'â„–' => 'No', + 'â„™' => 'P', + 'ℚ' => 'Q', + 'â„›' => 'R', + 'ℜ' => 'R', + 'â„' => 'R', + 'â„ ' => 'SM', + 'â„¡' => 'TEL', + 'â„¢' => 'TM', + 'ℤ' => 'Z', + 'ℨ' => 'Z', + 'ℬ' => 'B', + 'â„­' => 'C', + 'ℯ' => 'e', + 'â„°' => 'E', + 'ℱ' => 'F', + 'ℳ' => 'M', + 'â„´' => 'o', + 'ℵ' => '×', + 'â„¶' => 'ב', + 'â„·' => '×’', + 'ℸ' => 'ד', + 'ℹ' => 'i', + 'â„»' => 'FAX', + 'ℼ' => 'Ï€', + 'ℽ' => 'γ', + 'ℾ' => 'Γ', + 'â„¿' => 'Π', + 'â…€' => '∑', + 'â……' => 'D', + 'â…†' => 'd', + 'â…‡' => 'e', + 'â…ˆ' => 'i', + 'â…‰' => 'j', + 'â…' => '1â„7', + 'â…‘' => '1â„9', + 'â…’' => '1â„10', + 'â…“' => '1â„3', + 'â…”' => '2â„3', + 'â…•' => '1â„5', + 'â…–' => '2â„5', + 'â…—' => '3â„5', + 'â…˜' => '4â„5', + 'â…™' => '1â„6', + 'â…š' => '5â„6', + 'â…›' => '1â„8', + 'â…œ' => '3â„8', + 'â…' => '5â„8', + 'â…ž' => '7â„8', + 'â…Ÿ' => '1â„', + 'â… ' => 'I', + 'â…¡' => 'II', + 'â…¢' => 'III', + 'â…£' => 'IV', + 'â…¤' => 'V', + 'â…¥' => 'VI', + 'â…¦' => 'VII', + 'â…§' => 'VIII', + 'â…¨' => 'IX', + 'â…©' => 'X', + 'â…ª' => 'XI', + 'â…«' => 'XII', + 'â…¬' => 'L', + 'â…­' => 'C', + 'â…®' => 'D', + 'â…¯' => 'M', + 'â…°' => 'i', + 'â…±' => 'ii', + 'â…²' => 'iii', + 'â…³' => 'iv', + 'â…´' => 'v', + 'â…µ' => 'vi', + 'â…¶' => 'vii', + 'â…·' => 'viii', + 'â…¸' => 'ix', + 'â…¹' => 'x', + 'â…º' => 'xi', + 'â…»' => 'xii', + 'â…¼' => 'l', + 'â…½' => 'c', + 'â…¾' => 'd', + 'â…¿' => 'm', + '↉' => '0â„3', + '∬' => '∫∫', + '∭' => '∫∫∫', + '∯' => '∮∮', + '∰' => '∮∮∮', + 'â‘ ' => '1', + 'â‘¡' => '2', + 'â‘¢' => '3', + 'â‘£' => '4', + '⑤' => '5', + 'â‘¥' => '6', + '⑦' => '7', + 'â‘§' => '8', + '⑨' => '9', + 'â‘©' => '10', + '⑪' => '11', + 'â‘«' => '12', + '⑬' => '13', + 'â‘­' => '14', + 'â‘®' => '15', + '⑯' => '16', + 'â‘°' => '17', + '⑱' => '18', + '⑲' => '19', + '⑳' => '20', + 'â‘´' => '(1)', + '⑵' => '(2)', + 'â‘¶' => '(3)', + 'â‘·' => '(4)', + '⑸' => '(5)', + '⑹' => '(6)', + '⑺' => '(7)', + 'â‘»' => '(8)', + '⑼' => '(9)', + '⑽' => '(10)', + '⑾' => '(11)', + 'â‘¿' => '(12)', + 'â’€' => '(13)', + 'â’' => '(14)', + 'â’‚' => '(15)', + 'â’ƒ' => '(16)', + 'â’„' => '(17)', + 'â’…' => '(18)', + 'â’†' => '(19)', + 'â’‡' => '(20)', + 'â’ˆ' => '1.', + 'â’‰' => '2.', + 'â’Š' => '3.', + 'â’‹' => '4.', + 'â’Œ' => '5.', + 'â’' => '6.', + 'â’Ž' => '7.', + 'â’' => '8.', + 'â’' => '9.', + 'â’‘' => '10.', + 'â’’' => '11.', + 'â’“' => '12.', + 'â’”' => '13.', + 'â’•' => '14.', + 'â’–' => '15.', + 'â’—' => '16.', + 'â’˜' => '17.', + 'â’™' => '18.', + 'â’š' => '19.', + 'â’›' => '20.', + 'â’œ' => '(a)', + 'â’' => '(b)', + 'â’ž' => '(c)', + 'â’Ÿ' => '(d)', + 'â’ ' => '(e)', + 'â’¡' => '(f)', + 'â’¢' => '(g)', + 'â’£' => '(h)', + 'â’¤' => '(i)', + 'â’¥' => '(j)', + 'â’¦' => '(k)', + 'â’§' => '(l)', + 'â’¨' => '(m)', + 'â’©' => '(n)', + 'â’ª' => '(o)', + 'â’«' => '(p)', + 'â’¬' => '(q)', + 'â’­' => '(r)', + 'â’®' => '(s)', + 'â’¯' => '(t)', + 'â’°' => '(u)', + 'â’±' => '(v)', + 'â’²' => '(w)', + 'â’³' => '(x)', + 'â’´' => '(y)', + 'â’µ' => '(z)', + 'â’¶' => 'A', + 'â’·' => 'B', + 'â’¸' => 'C', + 'â’¹' => 'D', + 'â’º' => 'E', + 'â’»' => 'F', + 'â’¼' => 'G', + 'â’½' => 'H', + 'â’¾' => 'I', + 'â’¿' => 'J', + 'â“€' => 'K', + 'â“' => 'L', + 'â“‚' => 'M', + 'Ⓝ' => 'N', + 'â“„' => 'O', + 'â“…' => 'P', + 'Ⓠ' => 'Q', + 'Ⓡ' => 'R', + 'Ⓢ' => 'S', + 'Ⓣ' => 'T', + 'Ⓤ' => 'U', + 'â“‹' => 'V', + 'Ⓦ' => 'W', + 'â“' => 'X', + 'Ⓨ' => 'Y', + 'â“' => 'Z', + 'â“' => 'a', + 'â“‘' => 'b', + 'â“’' => 'c', + 'â““' => 'd', + 'â“”' => 'e', + 'â“•' => 'f', + 'â“–' => 'g', + 'â“—' => 'h', + 'ⓘ' => 'i', + 'â“™' => 'j', + 'ⓚ' => 'k', + 'â“›' => 'l', + 'ⓜ' => 'm', + 'â“' => 'n', + 'ⓞ' => 'o', + 'ⓟ' => 'p', + 'â“ ' => 'q', + 'â“¡' => 'r', + 'â“¢' => 's', + 'â“£' => 't', + 'ⓤ' => 'u', + 'â“¥' => 'v', + 'ⓦ' => 'w', + 'â“§' => 'x', + 'ⓨ' => 'y', + 'â“©' => 'z', + '⓪' => '0', + '⨌' => '∫∫∫∫', + 'â©´' => '::=', + '⩵' => '==', + 'â©¶' => '===', + 'â±¼' => 'j', + 'â±½' => 'V', + 'ⵯ' => 'ⵡ', + '⺟' => 'æ¯', + '⻳' => '龟', + 'â¼€' => '一', + 'â¼' => '丨', + '⼂' => '丶', + '⼃' => '丿', + '⼄' => 'ä¹™', + 'â¼…' => '亅', + '⼆' => '二', + '⼇' => '亠', + '⼈' => '人', + '⼉' => 'å„¿', + '⼊' => 'å…¥', + '⼋' => 'å…«', + '⼌' => '冂', + 'â¼' => '冖', + '⼎' => '冫', + 'â¼' => '几', + 'â¼' => '凵', + '⼑' => '刀', + 'â¼’' => '力', + '⼓' => '勹', + 'â¼”' => '匕', + '⼕' => '匚', + 'â¼–' => '匸', + 'â¼—' => 'å', + '⼘' => 'åœ', + 'â¼™' => 'å©', + '⼚' => '厂', + 'â¼›' => '厶', + '⼜' => 'åˆ', + 'â¼' => 'å£', + '⼞' => 'å›—', + '⼟' => '土', + 'â¼ ' => '士', + '⼡' => '夂', + 'â¼¢' => '夊', + 'â¼£' => '夕', + '⼤' => '大', + 'â¼¥' => '女', + '⼦' => 'å­', + 'â¼§' => '宀', + '⼨' => '寸', + '⼩' => 'å°', + '⼪' => 'å°¢', + '⼫' => 'å°¸', + '⼬' => 'å±®', + 'â¼­' => 'å±±', + 'â¼®' => 'å·›', + '⼯' => 'å·¥', + 'â¼°' => 'å·±', + 'â¼±' => 'å·¾', + 'â¼²' => 'å¹²', + 'â¼³' => '幺', + 'â¼´' => '广', + 'â¼µ' => 'å»´', + 'â¼¶' => '廾', + 'â¼·' => '弋', + '⼸' => '弓', + 'â¼¹' => 'å½', + '⼺' => '彡', + 'â¼»' => 'å½³', + 'â¼¼' => '心', + 'â¼½' => '戈', + 'â¼¾' => '戶', + '⼿' => '手', + 'â½€' => '支', + 'â½' => 'æ”´', + '⽂' => 'æ–‡', + '⽃' => 'æ–—', + '⽄' => 'æ–¤', + 'â½…' => 'æ–¹', + '⽆' => 'æ— ', + '⽇' => 'æ—¥', + '⽈' => 'æ›°', + '⽉' => '月', + '⽊' => '木', + '⽋' => '欠', + '⽌' => 'æ­¢', + 'â½' => 'æ­¹', + '⽎' => '殳', + 'â½' => '毋', + 'â½' => '比', + '⽑' => '毛', + 'â½’' => 'æ°', + '⽓' => 'æ°”', + 'â½”' => 'æ°´', + '⽕' => 'ç«', + 'â½–' => '爪', + 'â½—' => '父', + '⽘' => '爻', + 'â½™' => '爿', + '⽚' => '片', + 'â½›' => '牙', + '⽜' => '牛', + 'â½' => '犬', + '⽞' => '玄', + '⽟' => '玉', + 'â½ ' => '瓜', + '⽡' => '瓦', + 'â½¢' => '甘', + 'â½£' => '生', + '⽤' => '用', + 'â½¥' => 'ç”°', + '⽦' => 'ç–‹', + 'â½§' => 'ç–’', + '⽨' => 'ç™¶', + '⽩' => '白', + '⽪' => 'çš®', + '⽫' => 'çš¿', + '⽬' => 'ç›®', + 'â½­' => '矛', + 'â½®' => '矢', + '⽯' => '石', + 'â½°' => '示', + 'â½±' => '禸', + 'â½²' => '禾', + 'â½³' => 'ç©´', + 'â½´' => 'ç«‹', + 'â½µ' => '竹', + 'â½¶' => 'ç±³', + 'â½·' => '糸', + '⽸' => 'ç¼¶', + 'â½¹' => '网', + '⽺' => '羊', + 'â½»' => 'ç¾½', + 'â½¼' => 'è€', + 'â½½' => '而', + 'â½¾' => '耒', + '⽿' => '耳', + 'â¾€' => 'è¿', + 'â¾' => '肉', + '⾂' => '臣', + '⾃' => '自', + '⾄' => '至', + 'â¾…' => '臼', + '⾆' => '舌', + '⾇' => '舛', + '⾈' => '舟', + '⾉' => '艮', + '⾊' => '色', + '⾋' => '艸', + '⾌' => 'è™', + 'â¾' => '虫', + '⾎' => 'è¡€', + 'â¾' => '行', + 'â¾' => 'è¡£', + '⾑' => '襾', + 'â¾’' => '見', + '⾓' => 'è§’', + 'â¾”' => '言', + '⾕' => 'è°·', + 'â¾–' => '豆', + 'â¾—' => '豕', + '⾘' => '豸', + 'â¾™' => 'è²', + '⾚' => '赤', + 'â¾›' => 'èµ°', + '⾜' => 'è¶³', + 'â¾' => '身', + '⾞' => '車', + '⾟' => 'è¾›', + 'â¾ ' => 'è¾°', + '⾡' => 'è¾µ', + 'â¾¢' => 'é‚‘', + 'â¾£' => 'é…‰', + '⾤' => '釆', + 'â¾¥' => '里', + '⾦' => '金', + 'â¾§' => 'é•·', + '⾨' => 'é–€', + '⾩' => '阜', + '⾪' => 'éš¶', + '⾫' => 'éš¹', + '⾬' => '雨', + 'â¾­' => 'é‘', + 'â¾®' => 'éž', + '⾯' => 'é¢', + 'â¾°' => 'é©', + 'â¾±' => '韋', + 'â¾²' => '韭', + 'â¾³' => '音', + 'â¾´' => 'é ', + 'â¾µ' => '風', + 'â¾¶' => '飛', + 'â¾·' => '食', + '⾸' => '首', + 'â¾¹' => '香', + '⾺' => '馬', + 'â¾»' => '骨', + 'â¾¼' => '高', + 'â¾½' => '髟', + 'â¾¾' => '鬥', + '⾿' => '鬯', + 'â¿€' => '鬲', + 'â¿' => '鬼', + 'â¿‚' => 'é­š', + '⿃' => 'é³¥', + 'â¿„' => 'é¹µ', + 'â¿…' => '鹿', + '⿆' => '麥', + '⿇' => '麻', + '⿈' => '黃', + '⿉' => 'é»', + '⿊' => '黑', + 'â¿‹' => '黹', + '⿌' => '黽', + 'â¿' => '鼎', + '⿎' => '鼓', + 'â¿' => 'é¼ ', + 'â¿' => 'é¼»', + 'â¿‘' => '齊', + 'â¿’' => 'é½’', + 'â¿“' => 'é¾', + 'â¿”' => '龜', + 'â¿•' => 'é¾ ', + ' ' => ' ', + '〶' => '〒', + '〸' => 'å', + '〹' => 'å„', + '〺' => 'å…', + 'ã‚›' => ' ã‚™', + '゜' => ' ゚', + 'ゟ' => 'より', + 'ヿ' => 'コト', + 'ㄱ' => 'á„€', + 'ㄲ' => 'á„', + 'ㄳ' => 'ᆪ', + 'ã„´' => 'á„‚', + 'ㄵ' => 'ᆬ', + 'ã„¶' => 'ᆭ', + 'ã„·' => 'ᄃ', + 'ㄸ' => 'á„„', + 'ㄹ' => 'á„…', + 'ㄺ' => 'ᆰ', + 'ã„»' => 'ᆱ', + 'ㄼ' => 'ᆲ', + 'ㄽ' => 'ᆳ', + 'ㄾ' => 'ᆴ', + 'ã„¿' => 'ᆵ', + 'ã…€' => 'ᄚ', + 'ã…' => 'ᄆ', + 'ã…‚' => 'ᄇ', + 'ã…ƒ' => 'ᄈ', + 'ã…„' => 'á„¡', + 'ã……' => 'ᄉ', + 'ã…†' => 'ᄊ', + 'ã…‡' => 'á„‹', + 'ã…ˆ' => 'ᄌ', + 'ã…‰' => 'á„', + 'ã…Š' => 'ᄎ', + 'ã…‹' => 'á„', + 'ã…Œ' => 'á„', + 'ã…' => 'á„‘', + 'ã…Ž' => 'á„’', + 'ã…' => 'á…¡', + 'ã…' => 'á…¢', + 'ã…‘' => 'á…£', + 'ã…’' => 'á…¤', + 'ã…“' => 'á…¥', + 'ã…”' => 'á…¦', + 'ã…•' => 'á…§', + 'ã…–' => 'á…¨', + 'ã…—' => 'á…©', + 'ã…˜' => 'á…ª', + 'ã…™' => 'á…«', + 'ã…š' => 'á…¬', + 'ã…›' => 'á…­', + 'ã…œ' => 'á…®', + 'ã…' => 'á…¯', + 'ã…ž' => 'á…°', + 'ã…Ÿ' => 'á…±', + 'ã… ' => 'á…²', + 'ã…¡' => 'á…³', + 'ã…¢' => 'á…´', + 'ã…£' => 'á…µ', + 'ã…¤' => 'á… ', + 'ã…¥' => 'á„”', + 'ã…¦' => 'á„•', + 'ã…§' => 'ᇇ', + 'ã…¨' => 'ᇈ', + 'ã…©' => 'ᇌ', + 'ã…ª' => 'ᇎ', + 'ã…«' => 'ᇓ', + 'ã…¬' => 'ᇗ', + 'ã…­' => 'ᇙ', + 'ã…®' => 'ᄜ', + 'ã…¯' => 'á‡', + 'ã…°' => 'ᇟ', + 'ã…±' => 'á„', + 'ã…²' => 'ᄞ', + 'ã…³' => 'á„ ', + 'ã…´' => 'á„¢', + 'ã…µ' => 'á„£', + 'ã…¶' => 'á„§', + 'ã…·' => 'á„©', + 'ã…¸' => 'á„«', + 'ã…¹' => 'ᄬ', + 'ã…º' => 'á„­', + 'ã…»' => 'á„®', + 'ã…¼' => 'ᄯ', + 'ã…½' => 'ᄲ', + 'ã…¾' => 'á„¶', + 'ã…¿' => 'á…€', + 'ㆀ' => 'á…‡', + 'ã†' => 'á…Œ', + 'ㆂ' => 'ᇱ', + 'ㆃ' => 'ᇲ', + 'ㆄ' => 'á…—', + 'ㆅ' => 'á…˜', + 'ㆆ' => 'á…™', + 'ㆇ' => 'ᆄ', + 'ㆈ' => 'ᆅ', + 'ㆉ' => 'ᆈ', + 'ㆊ' => 'ᆑ', + 'ㆋ' => 'ᆒ', + 'ㆌ' => 'ᆔ', + 'ã†' => 'ᆞ', + 'ㆎ' => 'ᆡ', + '㆒' => '一', + '㆓' => '二', + '㆔' => '三', + '㆕' => 'å››', + '㆖' => '上', + '㆗' => '中', + '㆘' => '下', + '㆙' => '甲', + '㆚' => 'ä¹™', + '㆛' => '丙', + '㆜' => 'ä¸', + 'ã†' => '天', + '㆞' => '地', + '㆟' => '人', + '㈀' => '(á„€)', + 'ãˆ' => '(á„‚)', + '㈂' => '(ᄃ)', + '㈃' => '(á„…)', + '㈄' => '(ᄆ)', + '㈅' => '(ᄇ)', + '㈆' => '(ᄉ)', + '㈇' => '(á„‹)', + '㈈' => '(ᄌ)', + '㈉' => '(ᄎ)', + '㈊' => '(á„)', + '㈋' => '(á„)', + '㈌' => '(á„‘)', + 'ãˆ' => '(á„’)', + '㈎' => '(가)', + 'ãˆ' => '(á„‚á…¡)', + 'ãˆ' => '(다)', + '㈑' => '(á„…á…¡)', + '㈒' => '(마)', + '㈓' => '(바)', + '㈔' => '(사)', + '㈕' => '(á„‹á…¡)', + '㈖' => '(자)', + '㈗' => '(차)', + '㈘' => '(á„á…¡)', + '㈙' => '(á„á…¡)', + '㈚' => '(á„‘á…¡)', + '㈛' => '(á„’á…¡)', + '㈜' => '(주)', + 'ãˆ' => '(오전)', + '㈞' => '(á„‹á…©á„’á…®)', + '㈠' => '(一)', + '㈡' => '(二)', + '㈢' => '(三)', + '㈣' => '(å››)', + '㈤' => '(五)', + '㈥' => '(å…­)', + '㈦' => '(七)', + '㈧' => '(å…«)', + '㈨' => '(ä¹)', + '㈩' => '(å)', + '㈪' => '(月)', + '㈫' => '(ç«)', + '㈬' => '(æ°´)', + '㈭' => '(木)', + '㈮' => '(金)', + '㈯' => '(土)', + '㈰' => '(æ—¥)', + '㈱' => '(æ ª)', + '㈲' => '(有)', + '㈳' => '(社)', + '㈴' => '(å)', + '㈵' => '(特)', + '㈶' => '(財)', + '㈷' => '(ç¥)', + '㈸' => '(労)', + '㈹' => '(代)', + '㈺' => '(呼)', + '㈻' => '(å­¦)', + '㈼' => '(監)', + '㈽' => '(ä¼)', + '㈾' => '(資)', + '㈿' => '(å”)', + '㉀' => '(祭)', + 'ã‰' => '(休)', + '㉂' => '(自)', + '㉃' => '(至)', + '㉄' => 'å•', + '㉅' => 'å¹¼', + '㉆' => 'æ–‡', + '㉇' => 'ç®', + 'ã‰' => 'PTE', + '㉑' => '21', + '㉒' => '22', + '㉓' => '23', + '㉔' => '24', + '㉕' => '25', + '㉖' => '26', + '㉗' => '27', + '㉘' => '28', + '㉙' => '29', + '㉚' => '30', + '㉛' => '31', + '㉜' => '32', + 'ã‰' => '33', + '㉞' => '34', + '㉟' => '35', + '㉠' => 'á„€', + '㉡' => 'á„‚', + '㉢' => 'ᄃ', + '㉣' => 'á„…', + '㉤' => 'ᄆ', + '㉥' => 'ᄇ', + '㉦' => 'ᄉ', + '㉧' => 'á„‹', + '㉨' => 'ᄌ', + '㉩' => 'ᄎ', + '㉪' => 'á„', + '㉫' => 'á„', + '㉬' => 'á„‘', + '㉭' => 'á„’', + '㉮' => '가', + '㉯' => 'á„‚á…¡', + '㉰' => '다', + '㉱' => 'á„…á…¡', + '㉲' => '마', + '㉳' => '바', + '㉴' => '사', + '㉵' => 'á„‹á…¡', + '㉶' => '자', + '㉷' => '차', + '㉸' => 'á„á…¡', + '㉹' => 'á„á…¡', + '㉺' => 'á„‘á…¡', + '㉻' => 'á„’á…¡', + '㉼' => '참고', + '㉽' => '주의', + '㉾' => 'á„‹á…®', + '㊀' => '一', + 'ãŠ' => '二', + '㊂' => '三', + '㊃' => 'å››', + '㊄' => '五', + '㊅' => 'å…­', + '㊆' => '七', + '㊇' => 'å…«', + '㊈' => 'ä¹', + '㊉' => 'å', + '㊊' => '月', + '㊋' => 'ç«', + '㊌' => 'æ°´', + 'ãŠ' => '木', + '㊎' => '金', + 'ãŠ' => '土', + 'ãŠ' => 'æ—¥', + '㊑' => 'æ ª', + '㊒' => '有', + '㊓' => '社', + '㊔' => 'å', + '㊕' => '特', + '㊖' => '財', + '㊗' => 'ç¥', + '㊘' => '労', + '㊙' => '秘', + '㊚' => 'ç”·', + '㊛' => '女', + '㊜' => 'é©', + 'ãŠ' => '優', + '㊞' => 'å°', + '㊟' => '注', + '㊠' => 'é …', + '㊡' => '休', + '㊢' => '写', + '㊣' => 'æ­£', + '㊤' => '上', + '㊥' => '中', + '㊦' => '下', + '㊧' => 'å·¦', + '㊨' => 'å³', + '㊩' => '医', + '㊪' => 'å®—', + '㊫' => 'å­¦', + '㊬' => '監', + '㊭' => 'ä¼', + '㊮' => '資', + '㊯' => 'å”', + '㊰' => '夜', + '㊱' => '36', + '㊲' => '37', + '㊳' => '38', + '㊴' => '39', + '㊵' => '40', + '㊶' => '41', + '㊷' => '42', + '㊸' => '43', + '㊹' => '44', + '㊺' => '45', + '㊻' => '46', + '㊼' => '47', + '㊽' => '48', + '㊾' => '49', + '㊿' => '50', + 'ã‹€' => '1月', + 'ã‹' => '2月', + 'ã‹‚' => '3月', + '㋃' => '4月', + 'ã‹„' => '5月', + 'ã‹…' => '6月', + '㋆' => '7月', + '㋇' => '8月', + '㋈' => '9月', + '㋉' => '10月', + '㋊' => '11月', + 'ã‹‹' => '12月', + '㋌' => 'Hg', + 'ã‹' => 'erg', + '㋎' => 'eV', + 'ã‹' => 'LTD', + 'ã‹' => 'ã‚¢', + 'ã‹‘' => 'イ', + 'ã‹’' => 'ウ', + 'ã‹“' => 'エ', + 'ã‹”' => 'オ', + 'ã‹•' => 'ã‚«', + 'ã‹–' => 'ã‚­', + 'ã‹—' => 'ク', + '㋘' => 'ケ', + 'ã‹™' => 'コ', + '㋚' => 'サ', + 'ã‹›' => 'ã‚·', + '㋜' => 'ス', + 'ã‹' => 'ã‚»', + '㋞' => 'ソ', + '㋟' => 'ã‚¿', + 'ã‹ ' => 'ãƒ', + 'ã‹¡' => 'ツ', + 'ã‹¢' => 'テ', + 'ã‹£' => 'ト', + '㋤' => 'ナ', + 'ã‹¥' => 'ニ', + '㋦' => 'ヌ', + 'ã‹§' => 'ãƒ', + '㋨' => 'ノ', + 'ã‹©' => 'ãƒ', + '㋪' => 'ヒ', + 'ã‹«' => 'フ', + '㋬' => 'ヘ', + 'ã‹­' => 'ホ', + 'ã‹®' => 'マ', + '㋯' => 'ミ', + 'ã‹°' => 'ム', + '㋱' => 'メ', + '㋲' => 'モ', + '㋳' => 'ヤ', + 'ã‹´' => 'ユ', + '㋵' => 'ヨ', + 'ã‹¶' => 'ラ', + 'ã‹·' => 'リ', + '㋸' => 'ル', + '㋹' => 'レ', + '㋺' => 'ロ', + 'ã‹»' => 'ワ', + '㋼' => 'ヰ', + '㋽' => 'ヱ', + '㋾' => 'ヲ', + 'ã‹¿' => '令和', + '㌀' => 'ã‚¢ãƒã‚šãƒ¼ãƒˆ', + 'ãŒ' => 'アルファ', + '㌂' => 'アンペア', + '㌃' => 'アール', + '㌄' => 'イニング', + '㌅' => 'インãƒ', + '㌆' => 'ウォン', + '㌇' => 'エスクード', + '㌈' => 'エーカー', + '㌉' => 'オンス', + '㌊' => 'オーム', + '㌋' => 'カイリ', + '㌌' => 'カラット', + 'ãŒ' => 'カロリー', + '㌎' => 'ガロン', + 'ãŒ' => 'ガンマ', + 'ãŒ' => 'ギガ', + '㌑' => 'ギニー', + '㌒' => 'キュリー', + '㌓' => 'ギルダー', + '㌔' => 'キロ', + '㌕' => 'キログラム', + '㌖' => 'キロメートル', + '㌗' => 'キロワット', + '㌘' => 'グラム', + '㌙' => 'グラムトン', + '㌚' => 'クルゼイロ', + '㌛' => 'クローãƒ', + '㌜' => 'ケース', + 'ãŒ' => 'コルナ', + '㌞' => 'コーポ', + '㌟' => 'サイクル', + '㌠' => 'サンãƒãƒ¼ãƒ ', + '㌡' => 'シリング', + '㌢' => 'センãƒ', + '㌣' => 'セント', + '㌤' => 'ダース', + '㌥' => 'デシ', + '㌦' => 'ドル', + '㌧' => 'トン', + '㌨' => 'ナノ', + '㌩' => 'ノット', + '㌪' => 'ãƒã‚¤ãƒ„', + '㌫' => 'ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ', + '㌬' => 'ãƒã‚šãƒ¼ãƒ„', + '㌭' => 'ãƒã‚™ãƒ¼ãƒ¬ãƒ«', + '㌮' => 'ピアストル', + '㌯' => 'ピクル', + '㌰' => 'ピコ', + '㌱' => 'ビル', + '㌲' => 'ファラッド', + '㌳' => 'フィート', + '㌴' => 'ブッシェル', + '㌵' => 'フラン', + '㌶' => 'ヘクタール', + '㌷' => 'ペソ', + '㌸' => 'ペニヒ', + '㌹' => 'ヘルツ', + '㌺' => 'ペンス', + '㌻' => 'ページ', + '㌼' => 'ベータ', + '㌽' => 'ポイント', + '㌾' => 'ボルト', + '㌿' => 'ホン', + 'ã€' => 'ポンド', + 'ã' => 'ホール', + 'ã‚' => 'ホーン', + 'ãƒ' => 'マイクロ', + 'ã„' => 'マイル', + 'ã…' => 'マッãƒ', + 'ã†' => 'マルク', + 'ã‡' => 'マンション', + 'ãˆ' => 'ミクロン', + 'ã‰' => 'ミリ', + 'ãŠ' => 'ミリãƒã‚™ãƒ¼ãƒ«', + 'ã‹' => 'メガ', + 'ãŒ' => 'メガトン', + 'ã' => 'メートル', + 'ãŽ' => 'ヤード', + 'ã' => 'ヤール', + 'ã' => 'ユアン', + 'ã‘' => 'リットル', + 'ã’' => 'リラ', + 'ã“' => 'ルピー', + 'ã”' => 'ルーブル', + 'ã•' => 'レム', + 'ã–' => 'レントゲン', + 'ã—' => 'ワット', + 'ã˜' => '0点', + 'ã™' => '1点', + 'ãš' => '2点', + 'ã›' => '3点', + 'ãœ' => '4点', + 'ã' => '5点', + 'ãž' => '6点', + 'ãŸ' => '7点', + 'ã ' => '8点', + 'ã¡' => '9点', + 'ã¢' => '10点', + 'ã£' => '11点', + 'ã¤' => '12点', + 'ã¥' => '13点', + 'ã¦' => '14点', + 'ã§' => '15点', + 'ã¨' => '16点', + 'ã©' => '17点', + 'ãª' => '18点', + 'ã«' => '19点', + 'ã¬' => '20点', + 'ã­' => '21点', + 'ã®' => '22点', + 'ã¯' => '23点', + 'ã°' => '24点', + 'ã±' => 'hPa', + 'ã²' => 'da', + 'ã³' => 'AU', + 'ã´' => 'bar', + 'ãµ' => 'oV', + 'ã¶' => 'pc', + 'ã·' => 'dm', + 'ã¸' => 'dm2', + 'ã¹' => 'dm3', + 'ãº' => 'IU', + 'ã»' => 'å¹³æˆ', + 'ã¼' => '昭和', + 'ã½' => '大正', + 'ã¾' => '明治', + 'ã¿' => 'æ ªå¼ä¼šç¤¾', + '㎀' => 'pA', + 'ãŽ' => 'nA', + '㎂' => 'μA', + '㎃' => 'mA', + '㎄' => 'kA', + '㎅' => 'KB', + '㎆' => 'MB', + '㎇' => 'GB', + '㎈' => 'cal', + '㎉' => 'kcal', + '㎊' => 'pF', + '㎋' => 'nF', + '㎌' => 'μF', + 'ãŽ' => 'μg', + '㎎' => 'mg', + 'ãŽ' => 'kg', + 'ãŽ' => 'Hz', + '㎑' => 'kHz', + '㎒' => 'MHz', + '㎓' => 'GHz', + '㎔' => 'THz', + '㎕' => 'μl', + '㎖' => 'ml', + '㎗' => 'dl', + '㎘' => 'kl', + '㎙' => 'fm', + '㎚' => 'nm', + '㎛' => 'μm', + '㎜' => 'mm', + 'ãŽ' => 'cm', + '㎞' => 'km', + '㎟' => 'mm2', + '㎠' => 'cm2', + '㎡' => 'm2', + '㎢' => 'km2', + '㎣' => 'mm3', + '㎤' => 'cm3', + '㎥' => 'm3', + '㎦' => 'km3', + '㎧' => 'm∕s', + '㎨' => 'm∕s2', + '㎩' => 'Pa', + '㎪' => 'kPa', + '㎫' => 'MPa', + '㎬' => 'GPa', + '㎭' => 'rad', + '㎮' => 'rad∕s', + '㎯' => 'rad∕s2', + '㎰' => 'ps', + '㎱' => 'ns', + '㎲' => 'μs', + '㎳' => 'ms', + '㎴' => 'pV', + '㎵' => 'nV', + '㎶' => 'μV', + '㎷' => 'mV', + '㎸' => 'kV', + '㎹' => 'MV', + '㎺' => 'pW', + '㎻' => 'nW', + '㎼' => 'μW', + '㎽' => 'mW', + '㎾' => 'kW', + '㎿' => 'MW', + 'ã€' => 'kΩ', + 'ã' => 'MΩ', + 'ã‚' => 'a.m.', + 'ãƒ' => 'Bq', + 'ã„' => 'cc', + 'ã…' => 'cd', + 'ã†' => 'C∕kg', + 'ã‡' => 'Co.', + 'ãˆ' => 'dB', + 'ã‰' => 'Gy', + 'ãŠ' => 'ha', + 'ã‹' => 'HP', + 'ãŒ' => 'in', + 'ã' => 'KK', + 'ãŽ' => 'KM', + 'ã' => 'kt', + 'ã' => 'lm', + 'ã‘' => 'ln', + 'ã’' => 'log', + 'ã“' => 'lx', + 'ã”' => 'mb', + 'ã•' => 'mil', + 'ã–' => 'mol', + 'ã—' => 'PH', + 'ã˜' => 'p.m.', + 'ã™' => 'PPM', + 'ãš' => 'PR', + 'ã›' => 'sr', + 'ãœ' => 'Sv', + 'ã' => 'Wb', + 'ãž' => 'V∕m', + 'ãŸ' => 'A∕m', + 'ã ' => '1æ—¥', + 'ã¡' => '2æ—¥', + 'ã¢' => '3æ—¥', + 'ã£' => '4æ—¥', + 'ã¤' => '5æ—¥', + 'ã¥' => '6æ—¥', + 'ã¦' => '7æ—¥', + 'ã§' => '8æ—¥', + 'ã¨' => '9æ—¥', + 'ã©' => '10æ—¥', + 'ãª' => '11æ—¥', + 'ã«' => '12æ—¥', + 'ã¬' => '13æ—¥', + 'ã­' => '14æ—¥', + 'ã®' => '15æ—¥', + 'ã¯' => '16æ—¥', + 'ã°' => '17æ—¥', + 'ã±' => '18æ—¥', + 'ã²' => '19æ—¥', + 'ã³' => '20æ—¥', + 'ã´' => '21æ—¥', + 'ãµ' => '22æ—¥', + 'ã¶' => '23æ—¥', + 'ã·' => '24æ—¥', + 'ã¸' => '25æ—¥', + 'ã¹' => '26æ—¥', + 'ãº' => '27æ—¥', + 'ã»' => '28æ—¥', + 'ã¼' => '29æ—¥', + 'ã½' => '30æ—¥', + 'ã¾' => '31æ—¥', + 'ã¿' => 'gal', + 'êšœ' => 'ÑŠ', + 'êš' => 'ÑŒ', + 'ê°' => 'ê¯', + 'ꟸ' => 'Ħ', + 'ꟹ' => 'Å“', + 'ê­œ' => 'ꜧ', + 'ê­' => 'ꬷ', + 'ê­ž' => 'É«', + 'ê­Ÿ' => 'ê­’', + 'ff' => 'ff', + 'ï¬' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'st', + 'st' => 'st', + 'ﬓ' => 'Õ´Õ¶', + 'ﬔ' => 'Õ´Õ¥', + 'ﬕ' => 'Õ´Õ«', + 'ﬖ' => 'Õ¾Õ¶', + 'ﬗ' => 'Õ´Õ­', + 'ﬠ' => '×¢', + 'ﬡ' => '×', + 'ﬢ' => 'ד', + 'ﬣ' => '×”', + 'ﬤ' => '×›', + 'ﬥ' => 'ל', + 'ﬦ' => '×', + 'ﬧ' => 'ר', + 'ﬨ' => 'ת', + '﬩' => '+', + 'ï­' => '×ל', + 'ï­' => 'Ù±', + 'ï­‘' => 'Ù±', + 'ï­’' => 'Ù»', + 'ï­“' => 'Ù»', + 'ï­”' => 'Ù»', + 'ï­•' => 'Ù»', + 'ï­–' => 'Ù¾', + 'ï­—' => 'Ù¾', + 'ï­˜' => 'Ù¾', + 'ï­™' => 'Ù¾', + 'ï­š' => 'Ú€', + 'ï­›' => 'Ú€', + 'ï­œ' => 'Ú€', + 'ï­' => 'Ú€', + 'ï­ž' => 'Ùº', + 'ï­Ÿ' => 'Ùº', + 'ï­ ' => 'Ùº', + 'ï­¡' => 'Ùº', + 'ï­¢' => 'Ù¿', + 'ï­£' => 'Ù¿', + 'ï­¤' => 'Ù¿', + 'ï­¥' => 'Ù¿', + 'ï­¦' => 'Ù¹', + 'ï­§' => 'Ù¹', + 'ï­¨' => 'Ù¹', + 'ï­©' => 'Ù¹', + 'ï­ª' => 'Ú¤', + 'ï­«' => 'Ú¤', + 'ï­¬' => 'Ú¤', + 'ï­­' => 'Ú¤', + 'ï­®' => 'Ú¦', + 'ï­¯' => 'Ú¦', + 'ï­°' => 'Ú¦', + 'ï­±' => 'Ú¦', + 'ï­²' => 'Ú„', + 'ï­³' => 'Ú„', + 'ï­´' => 'Ú„', + 'ï­µ' => 'Ú„', + 'ï­¶' => 'Úƒ', + 'ï­·' => 'Úƒ', + 'ï­¸' => 'Úƒ', + 'ï­¹' => 'Úƒ', + 'ï­º' => 'Ú†', + 'ï­»' => 'Ú†', + 'ï­¼' => 'Ú†', + 'ï­½' => 'Ú†', + 'ï­¾' => 'Ú‡', + 'ï­¿' => 'Ú‡', + 'ﮀ' => 'Ú‡', + 'ï®' => 'Ú‡', + 'ﮂ' => 'Ú', + 'ﮃ' => 'Ú', + 'ﮄ' => 'ÚŒ', + 'ï®…' => 'ÚŒ', + 'ﮆ' => 'ÚŽ', + 'ﮇ' => 'ÚŽ', + 'ﮈ' => 'Úˆ', + 'ﮉ' => 'Úˆ', + 'ﮊ' => 'Ú˜', + 'ﮋ' => 'Ú˜', + 'ﮌ' => 'Ú‘', + 'ï®' => 'Ú‘', + 'ﮎ' => 'Ú©', + 'ï®' => 'Ú©', + 'ï®' => 'Ú©', + 'ﮑ' => 'Ú©', + 'ï®’' => 'Ú¯', + 'ﮓ' => 'Ú¯', + 'ï®”' => 'Ú¯', + 'ﮕ' => 'Ú¯', + 'ï®–' => 'Ú³', + 'ï®—' => 'Ú³', + 'ﮘ' => 'Ú³', + 'ï®™' => 'Ú³', + 'ﮚ' => 'Ú±', + 'ï®›' => 'Ú±', + 'ﮜ' => 'Ú±', + 'ï®' => 'Ú±', + 'ﮞ' => 'Úº', + 'ﮟ' => 'Úº', + 'ï® ' => 'Ú»', + 'ﮡ' => 'Ú»', + 'ﮢ' => 'Ú»', + 'ﮣ' => 'Ú»', + 'ﮤ' => 'Û•Ù”', + 'ﮥ' => 'Û•Ù”', + 'ﮦ' => 'Û', + 'ï®§' => 'Û', + 'ﮨ' => 'Û', + 'ﮩ' => 'Û', + 'ﮪ' => 'Ú¾', + 'ﮫ' => 'Ú¾', + 'ﮬ' => 'Ú¾', + 'ï®­' => 'Ú¾', + 'ï®®' => 'Û’', + 'ﮯ' => 'Û’', + 'ï®°' => 'Û’Ù”', + 'ï®±' => 'Û’Ù”', + 'ﯓ' => 'Ú­', + 'ﯔ' => 'Ú­', + 'ﯕ' => 'Ú­', + 'ﯖ' => 'Ú­', + 'ﯗ' => 'Û‡', + 'ﯘ' => 'Û‡', + 'ﯙ' => 'Û†', + 'ﯚ' => 'Û†', + 'ﯛ' => 'Ûˆ', + 'ﯜ' => 'Ûˆ', + 'ï¯' => 'Û‡Ù´', + 'ﯞ' => 'Û‹', + 'ﯟ' => 'Û‹', + 'ﯠ' => 'Û…', + 'ﯡ' => 'Û…', + 'ﯢ' => 'Û‰', + 'ﯣ' => 'Û‰', + 'ﯤ' => 'Û', + 'ﯥ' => 'Û', + 'ﯦ' => 'Û', + 'ﯧ' => 'Û', + 'ﯨ' => 'Ù‰', + 'ﯩ' => 'Ù‰', + 'ﯪ' => 'ئا', + 'ﯫ' => 'ئا', + 'ﯬ' => 'ÙŠÙ”Û•', + 'ﯭ' => 'ÙŠÙ”Û•', + 'ﯮ' => 'ÙŠÙ”Ùˆ', + 'ﯯ' => 'ÙŠÙ”Ùˆ', + 'ﯰ' => 'ÙŠÙ”Û‡', + 'ﯱ' => 'ÙŠÙ”Û‡', + 'ﯲ' => 'ÙŠÙ”Û†', + 'ﯳ' => 'ÙŠÙ”Û†', + 'ﯴ' => 'ÙŠÙ”Ûˆ', + 'ﯵ' => 'ÙŠÙ”Ûˆ', + 'ﯶ' => 'ÙŠÙ”Û', + 'ﯷ' => 'ÙŠÙ”Û', + 'ﯸ' => 'ÙŠÙ”Û', + 'ﯹ' => 'ÙŠÙ”Ù‰', + 'ﯺ' => 'ÙŠÙ”Ù‰', + 'ﯻ' => 'ÙŠÙ”Ù‰', + 'ﯼ' => 'ÛŒ', + 'ﯽ' => 'ÛŒ', + 'ﯾ' => 'ÛŒ', + 'ﯿ' => 'ÛŒ', + 'ï°€' => 'ئج', + 'ï°' => 'ئح', + 'ï°‚' => 'ÙŠÙ”Ù…', + 'ï°ƒ' => 'ÙŠÙ”Ù‰', + 'ï°„' => 'ÙŠÙ”ÙŠ', + 'ï°…' => 'بج', + 'ï°†' => 'بح', + 'ï°‡' => 'بخ', + 'ï°ˆ' => 'بم', + 'ï°‰' => 'بى', + 'ï°Š' => 'بي', + 'ï°‹' => 'تج', + 'ï°Œ' => 'تح', + 'ï°' => 'تخ', + 'ï°Ž' => 'تم', + 'ï°' => 'تى', + 'ï°' => 'تي', + 'ï°‘' => 'ثج', + 'ï°’' => 'ثم', + 'ï°“' => 'ثى', + 'ï°”' => 'ثي', + 'ï°•' => 'جح', + 'ï°–' => 'جم', + 'ï°—' => 'حج', + 'ï°˜' => 'حم', + 'ï°™' => 'خج', + 'ï°š' => 'خح', + 'ï°›' => 'خم', + 'ï°œ' => 'سج', + 'ï°' => 'سح', + 'ï°ž' => 'سخ', + 'ï°Ÿ' => 'سم', + 'ï° ' => 'صح', + 'ï°¡' => 'صم', + 'ï°¢' => 'ضج', + 'ï°£' => 'ضح', + 'ï°¤' => 'ضخ', + 'ï°¥' => 'ضم', + 'ï°¦' => 'طح', + 'ï°§' => 'طم', + 'ï°¨' => 'ظم', + 'ï°©' => 'عج', + 'ï°ª' => 'عم', + 'ï°«' => 'غج', + 'ï°¬' => 'غم', + 'ï°­' => 'ÙØ¬', + 'ï°®' => 'ÙØ­', + 'ï°¯' => 'ÙØ®', + 'ï°°' => 'ÙÙ…', + 'ï°±' => 'ÙÙ‰', + 'ï°²' => 'ÙÙŠ', + 'ï°³' => 'قح', + 'ï°´' => 'قم', + 'ï°µ' => 'قى', + 'ï°¶' => 'قي', + 'ï°·' => 'كا', + 'ï°¸' => 'كج', + 'ï°¹' => 'كح', + 'ï°º' => 'كخ', + 'ï°»' => 'كل', + 'ï°¼' => 'كم', + 'ï°½' => 'كى', + 'ï°¾' => 'كي', + 'ï°¿' => 'لج', + 'ï±€' => 'لح', + 'ï±' => 'لخ', + 'ﱂ' => 'لم', + 'ﱃ' => 'لى', + 'ﱄ' => 'لي', + 'ï±…' => 'مج', + 'ﱆ' => 'مح', + 'ﱇ' => 'مخ', + 'ﱈ' => 'مم', + 'ﱉ' => 'مى', + 'ﱊ' => 'مي', + 'ﱋ' => 'نج', + 'ﱌ' => 'نح', + 'ï±' => 'نخ', + 'ﱎ' => 'نم', + 'ï±' => 'نى', + 'ï±' => 'ني', + 'ﱑ' => 'هج', + 'ï±’' => 'هم', + 'ﱓ' => 'هى', + 'ï±”' => 'هي', + 'ﱕ' => 'يج', + 'ï±–' => 'يح', + 'ï±—' => 'يخ', + 'ﱘ' => 'يم', + 'ï±™' => 'يى', + 'ﱚ' => 'يي', + 'ï±›' => 'ذٰ', + 'ﱜ' => 'رٰ', + 'ï±' => 'ىٰ', + 'ﱞ' => ' ٌّ', + 'ﱟ' => ' ÙÙ‘', + 'ï± ' => ' ÙŽÙ‘', + 'ﱡ' => ' ÙÙ‘', + 'ï±¢' => ' ÙÙ‘', + 'ï±£' => ' ّٰ', + 'ﱤ' => 'ئر', + 'ï±¥' => 'ئز', + 'ﱦ' => 'ÙŠÙ”Ù…', + 'ï±§' => 'ÙŠÙ”Ù†', + 'ﱨ' => 'ÙŠÙ”Ù‰', + 'ﱩ' => 'ÙŠÙ”ÙŠ', + 'ﱪ' => 'بر', + 'ﱫ' => 'بز', + 'ﱬ' => 'بم', + 'ï±­' => 'بن', + 'ï±®' => 'بى', + 'ﱯ' => 'بي', + 'ï±°' => 'تر', + 'ï±±' => 'تز', + 'ï±²' => 'تم', + 'ï±³' => 'تن', + 'ï±´' => 'تى', + 'ï±µ' => 'تي', + 'ï±¶' => 'ثر', + 'ï±·' => 'ثز', + 'ﱸ' => 'ثم', + 'ï±¹' => 'ثن', + 'ﱺ' => 'ثى', + 'ï±»' => 'ثي', + 'ï±¼' => 'ÙÙ‰', + 'ï±½' => 'ÙÙŠ', + 'ï±¾' => 'قى', + 'ﱿ' => 'قي', + 'ï²€' => 'كا', + 'ï²' => 'كل', + 'ﲂ' => 'كم', + 'ﲃ' => 'كى', + 'ﲄ' => 'كي', + 'ï²…' => 'لم', + 'ﲆ' => 'لى', + 'ﲇ' => 'لي', + 'ﲈ' => 'ما', + 'ﲉ' => 'مم', + 'ﲊ' => 'نر', + 'ﲋ' => 'نز', + 'ﲌ' => 'نم', + 'ï²' => 'نن', + 'ﲎ' => 'نى', + 'ï²' => 'ني', + 'ï²' => 'ىٰ', + 'ﲑ' => 'ير', + 'ï²’' => 'يز', + 'ﲓ' => 'يم', + 'ï²”' => 'ين', + 'ﲕ' => 'يى', + 'ï²–' => 'يي', + 'ï²—' => 'ئج', + 'ﲘ' => 'ئح', + 'ï²™' => 'ئخ', + 'ﲚ' => 'ÙŠÙ”Ù…', + 'ï²›' => 'ÙŠÙ”Ù‡', + 'ﲜ' => 'بج', + 'ï²' => 'بح', + 'ﲞ' => 'بخ', + 'ﲟ' => 'بم', + 'ï² ' => 'به', + 'ﲡ' => 'تج', + 'ï²¢' => 'تح', + 'ï²£' => 'تخ', + 'ﲤ' => 'تم', + 'ï²¥' => 'ته', + 'ﲦ' => 'ثم', + 'ï²§' => 'جح', + 'ﲨ' => 'جم', + 'ﲩ' => 'حج', + 'ﲪ' => 'حم', + 'ﲫ' => 'خج', + 'ﲬ' => 'خم', + 'ï²­' => 'سج', + 'ï²®' => 'سح', + 'ﲯ' => 'سخ', + 'ï²°' => 'سم', + 'ï²±' => 'صح', + 'ï²²' => 'صخ', + 'ï²³' => 'صم', + 'ï²´' => 'ضج', + 'ï²µ' => 'ضح', + 'ï²¶' => 'ضخ', + 'ï²·' => 'ضم', + 'ﲸ' => 'طح', + 'ï²¹' => 'ظم', + 'ﲺ' => 'عج', + 'ï²»' => 'عم', + 'ï²¼' => 'غج', + 'ï²½' => 'غم', + 'ï²¾' => 'ÙØ¬', + 'ﲿ' => 'ÙØ­', + 'ï³€' => 'ÙØ®', + 'ï³' => 'ÙÙ…', + 'ﳂ' => 'قح', + 'ﳃ' => 'قم', + 'ﳄ' => 'كج', + 'ï³…' => 'كح', + 'ﳆ' => 'كخ', + 'ﳇ' => 'كل', + 'ﳈ' => 'كم', + 'ﳉ' => 'لج', + 'ﳊ' => 'لح', + 'ﳋ' => 'لخ', + 'ﳌ' => 'لم', + 'ï³' => 'له', + 'ﳎ' => 'مج', + 'ï³' => 'مح', + 'ï³' => 'مخ', + 'ﳑ' => 'مم', + 'ï³’' => 'نج', + 'ﳓ' => 'نح', + 'ï³”' => 'نخ', + 'ﳕ' => 'نم', + 'ï³–' => 'نه', + 'ï³—' => 'هج', + 'ﳘ' => 'هم', + 'ï³™' => 'هٰ', + 'ﳚ' => 'يج', + 'ï³›' => 'يح', + 'ﳜ' => 'يخ', + 'ï³' => 'يم', + 'ﳞ' => 'يه', + 'ﳟ' => 'ÙŠÙ”Ù…', + 'ï³ ' => 'ÙŠÙ”Ù‡', + 'ﳡ' => 'بم', + 'ï³¢' => 'به', + 'ï³£' => 'تم', + 'ﳤ' => 'ته', + 'ï³¥' => 'ثم', + 'ﳦ' => 'ثه', + 'ï³§' => 'سم', + 'ﳨ' => 'سه', + 'ﳩ' => 'شم', + 'ﳪ' => 'شه', + 'ﳫ' => 'كل', + 'ﳬ' => 'كم', + 'ï³­' => 'لم', + 'ï³®' => 'نم', + 'ﳯ' => 'نه', + 'ï³°' => 'يم', + 'ï³±' => 'يه', + 'ï³²' => 'Ù€ÙŽÙ‘', + 'ï³³' => 'Ù€ÙÙ‘', + 'ï³´' => 'Ù€ÙÙ‘', + 'ï³µ' => 'طى', + 'ï³¶' => 'طي', + 'ï³·' => 'عى', + 'ﳸ' => 'عي', + 'ï³¹' => 'غى', + 'ﳺ' => 'غي', + 'ï³»' => 'سى', + 'ï³¼' => 'سي', + 'ï³½' => 'شى', + 'ï³¾' => 'شي', + 'ﳿ' => 'حى', + 'ï´€' => 'حي', + 'ï´' => 'جى', + 'ï´‚' => 'جي', + 'ï´ƒ' => 'خى', + 'ï´„' => 'خي', + 'ï´…' => 'صى', + 'ï´†' => 'صي', + 'ï´‡' => 'ضى', + 'ï´ˆ' => 'ضي', + 'ï´‰' => 'شج', + 'ï´Š' => 'شح', + 'ï´‹' => 'شخ', + 'ï´Œ' => 'شم', + 'ï´' => 'شر', + 'ï´Ž' => 'سر', + 'ï´' => 'صر', + 'ï´' => 'ضر', + 'ï´‘' => 'طى', + 'ï´’' => 'طي', + 'ï´“' => 'عى', + 'ï´”' => 'عي', + 'ï´•' => 'غى', + 'ï´–' => 'غي', + 'ï´—' => 'سى', + 'ï´˜' => 'سي', + 'ï´™' => 'شى', + 'ï´š' => 'شي', + 'ï´›' => 'حى', + 'ï´œ' => 'حي', + 'ï´' => 'جى', + 'ï´ž' => 'جي', + 'ï´Ÿ' => 'خى', + 'ï´ ' => 'خي', + 'ï´¡' => 'صى', + 'ï´¢' => 'صي', + 'ï´£' => 'ضى', + 'ï´¤' => 'ضي', + 'ï´¥' => 'شج', + 'ï´¦' => 'شح', + 'ï´§' => 'شخ', + 'ï´¨' => 'شم', + 'ï´©' => 'شر', + 'ï´ª' => 'سر', + 'ï´«' => 'صر', + 'ï´¬' => 'ضر', + 'ï´­' => 'شج', + 'ï´®' => 'شح', + 'ï´¯' => 'شخ', + 'ï´°' => 'شم', + 'ï´±' => 'سه', + 'ï´²' => 'شه', + 'ï´³' => 'طم', + 'ï´´' => 'سج', + 'ï´µ' => 'سح', + 'ï´¶' => 'سخ', + 'ï´·' => 'شج', + 'ï´¸' => 'شح', + 'ï´¹' => 'شخ', + 'ï´º' => 'طم', + 'ï´»' => 'ظم', + 'ï´¼' => 'اً', + 'ï´½' => 'اً', + 'ïµ' => 'تجم', + 'ﵑ' => 'تحج', + 'ïµ’' => 'تحج', + 'ﵓ' => 'تحم', + 'ïµ”' => 'تخم', + 'ﵕ' => 'تمج', + 'ïµ–' => 'تمح', + 'ïµ—' => 'تمخ', + 'ﵘ' => 'جمح', + 'ïµ™' => 'جمح', + 'ﵚ' => 'حمي', + 'ïµ›' => 'حمى', + 'ﵜ' => 'سحج', + 'ïµ' => 'سجح', + 'ﵞ' => 'سجى', + 'ﵟ' => 'سمح', + 'ïµ ' => 'سمح', + 'ﵡ' => 'سمج', + 'ïµ¢' => 'سمم', + 'ïµ£' => 'سمم', + 'ﵤ' => 'صحح', + 'ïµ¥' => 'صحح', + 'ﵦ' => 'صمم', + 'ïµ§' => 'شحم', + 'ﵨ' => 'شحم', + 'ﵩ' => 'شجي', + 'ﵪ' => 'شمخ', + 'ﵫ' => 'شمخ', + 'ﵬ' => 'شمم', + 'ïµ­' => 'شمم', + 'ïµ®' => 'ضحى', + 'ﵯ' => 'ضخم', + 'ïµ°' => 'ضخم', + 'ïµ±' => 'طمح', + 'ïµ²' => 'طمح', + 'ïµ³' => 'طمم', + 'ïµ´' => 'طمي', + 'ïµµ' => 'عجم', + 'ïµ¶' => 'عمم', + 'ïµ·' => 'عمم', + 'ﵸ' => 'عمى', + 'ïµ¹' => 'غمم', + 'ﵺ' => 'غمي', + 'ïµ»' => 'غمى', + 'ïµ¼' => 'ÙØ®Ù…', + 'ïµ½' => 'ÙØ®Ù…', + 'ïµ¾' => 'قمح', + 'ﵿ' => 'قمم', + 'ï¶€' => 'لحم', + 'ï¶' => 'لحي', + 'ï¶‚' => 'لحى', + 'ﶃ' => 'لجج', + 'ï¶„' => 'لجج', + 'ï¶…' => 'لخم', + 'ﶆ' => 'لخم', + 'ﶇ' => 'لمح', + 'ﶈ' => 'لمح', + 'ﶉ' => 'محج', + 'ï¶Š' => 'محم', + 'ï¶‹' => 'محي', + 'ï¶Œ' => 'مجح', + 'ï¶' => 'مجم', + 'ï¶Ž' => 'مخج', + 'ï¶' => 'مخم', + 'ï¶’' => 'مجخ', + 'ï¶“' => 'همج', + 'ï¶”' => 'همم', + 'ï¶•' => 'نحم', + 'ï¶–' => 'نحى', + 'ï¶—' => 'نجم', + 'ﶘ' => 'نجم', + 'ï¶™' => 'نجى', + 'ï¶š' => 'نمي', + 'ï¶›' => 'نمى', + 'ï¶œ' => 'يمم', + 'ï¶' => 'يمم', + 'ï¶ž' => 'بخي', + 'ï¶Ÿ' => 'تجي', + 'ï¶ ' => 'تجى', + 'ï¶¡' => 'تخي', + 'ï¶¢' => 'تخى', + 'ï¶£' => 'تمي', + 'ﶤ' => 'تمى', + 'ï¶¥' => 'جمي', + 'ﶦ' => 'جحى', + 'ï¶§' => 'جمى', + 'ﶨ' => 'سخى', + 'ï¶©' => 'صحي', + 'ﶪ' => 'شحي', + 'ï¶«' => 'ضحي', + 'ﶬ' => 'لجي', + 'ï¶­' => 'لمي', + 'ï¶®' => 'يحي', + 'ﶯ' => 'يجي', + 'ï¶°' => 'يمي', + 'ï¶±' => 'ممي', + 'ï¶²' => 'قمي', + 'ï¶³' => 'نحي', + 'ï¶´' => 'قمح', + 'ï¶µ' => 'لحم', + 'ï¶¶' => 'عمي', + 'ï¶·' => 'كمي', + 'ﶸ' => 'نجح', + 'ï¶¹' => 'مخي', + 'ﶺ' => 'لجم', + 'ï¶»' => 'كمم', + 'ï¶¼' => 'لجم', + 'ï¶½' => 'نجح', + 'ï¶¾' => 'جحي', + 'ï¶¿' => 'حجي', + 'ï·€' => 'مجي', + 'ï·' => 'Ùمي', + 'ï·‚' => 'بحي', + 'ï·ƒ' => 'كمم', + 'ï·„' => 'عجم', + 'ï·…' => 'صمم', + 'ï·†' => 'سخي', + 'ï·‡' => 'نجي', + 'ï·°' => 'صلے', + 'ï·±' => 'قلے', + 'ï·²' => 'الله', + 'ï·³' => 'اكبر', + 'ï·´' => 'محمد', + 'ï·µ' => 'صلعم', + 'ï·¶' => 'رسول', + 'ï··' => 'عليه', + 'ï·¸' => 'وسلم', + 'ï·¹' => 'صلى', + 'ï·º' => 'صلى الله عليه وسلم', + 'ï·»' => 'جل جلاله', + 'ï·¼' => 'ریال', + 'ï¸' => ',', + '︑' => 'ã€', + '︒' => '。', + '︓' => ':', + '︔' => ';', + '︕' => '!', + '︖' => '?', + '︗' => '〖', + '︘' => '〗', + '︙' => '...', + '︰' => '..', + '︱' => '—', + '︲' => '–', + '︳' => '_', + '︴' => '_', + '︵' => '(', + '︶' => ')', + '︷' => '{', + '︸' => '}', + '︹' => '〔', + '︺' => '〕', + '︻' => 'ã€', + '︼' => '】', + '︽' => '《', + '︾' => '》', + '︿' => '〈', + 'ï¹€' => '〉', + 'ï¹' => '「', + '﹂' => 'ã€', + '﹃' => '『', + '﹄' => 'ã€', + '﹇' => '[', + '﹈' => ']', + '﹉' => ' Ì…', + '﹊' => ' Ì…', + '﹋' => ' Ì…', + '﹌' => ' Ì…', + 'ï¹' => '_', + '﹎' => '_', + 'ï¹' => '_', + 'ï¹' => ',', + '﹑' => 'ã€', + 'ï¹’' => '.', + 'ï¹”' => ';', + '﹕' => ':', + 'ï¹–' => '?', + 'ï¹—' => '!', + '﹘' => '—', + 'ï¹™' => '(', + '﹚' => ')', + 'ï¹›' => '{', + '﹜' => '}', + 'ï¹' => '〔', + '﹞' => '〕', + '﹟' => '#', + 'ï¹ ' => '&', + '﹡' => '*', + 'ï¹¢' => '+', + 'ï¹£' => '-', + '﹤' => '<', + 'ï¹¥' => '>', + '﹦' => '=', + '﹨' => '\\', + '﹩' => '$', + '﹪' => '%', + '﹫' => '@', + 'ï¹°' => ' Ù‹', + 'ï¹±' => 'ـً', + 'ï¹²' => ' ÙŒ', + 'ï¹´' => ' Ù', + 'ï¹¶' => ' ÙŽ', + 'ï¹·' => 'Ù€ÙŽ', + 'ﹸ' => ' Ù', + 'ï¹¹' => 'Ù€Ù', + 'ﹺ' => ' Ù', + 'ï¹»' => 'Ù€Ù', + 'ï¹¼' => ' Ù‘', + 'ï¹½' => 'ـّ', + 'ï¹¾' => ' Ù’', + 'ﹿ' => 'ـْ', + 'ﺀ' => 'Ø¡', + 'ïº' => 'آ', + 'ﺂ' => 'آ', + 'ﺃ' => 'أ', + 'ﺄ' => 'أ', + 'ﺅ' => 'ÙˆÙ”', + 'ﺆ' => 'ÙˆÙ”', + 'ﺇ' => 'إ', + 'ﺈ' => 'إ', + 'ﺉ' => 'ÙŠÙ”', + 'ﺊ' => 'ÙŠÙ”', + 'ﺋ' => 'ÙŠÙ”', + 'ﺌ' => 'ÙŠÙ”', + 'ïº' => 'ا', + 'ﺎ' => 'ا', + 'ïº' => 'ب', + 'ïº' => 'ب', + 'ﺑ' => 'ب', + 'ﺒ' => 'ب', + 'ﺓ' => 'Ø©', + 'ﺔ' => 'Ø©', + 'ﺕ' => 'ت', + 'ﺖ' => 'ت', + 'ﺗ' => 'ت', + 'ﺘ' => 'ت', + 'ﺙ' => 'Ø«', + 'ﺚ' => 'Ø«', + 'ﺛ' => 'Ø«', + 'ﺜ' => 'Ø«', + 'ïº' => 'ج', + 'ﺞ' => 'ج', + 'ﺟ' => 'ج', + 'ﺠ' => 'ج', + 'ﺡ' => 'Ø­', + 'ﺢ' => 'Ø­', + 'ﺣ' => 'Ø­', + 'ﺤ' => 'Ø­', + 'ﺥ' => 'Ø®', + 'ﺦ' => 'Ø®', + 'ﺧ' => 'Ø®', + 'ﺨ' => 'Ø®', + 'ﺩ' => 'د', + 'ﺪ' => 'د', + 'ﺫ' => 'ذ', + 'ﺬ' => 'ذ', + 'ﺭ' => 'ر', + 'ﺮ' => 'ر', + 'ﺯ' => 'ز', + 'ﺰ' => 'ز', + 'ﺱ' => 'س', + 'ﺲ' => 'س', + 'ﺳ' => 'س', + 'ﺴ' => 'س', + 'ﺵ' => 'Ø´', + 'ﺶ' => 'Ø´', + 'ﺷ' => 'Ø´', + 'ﺸ' => 'Ø´', + 'ﺹ' => 'ص', + 'ﺺ' => 'ص', + 'ﺻ' => 'ص', + 'ﺼ' => 'ص', + 'ﺽ' => 'ض', + 'ﺾ' => 'ض', + 'ﺿ' => 'ض', + 'ﻀ' => 'ض', + 'ï»' => 'Ø·', + 'ﻂ' => 'Ø·', + 'ﻃ' => 'Ø·', + 'ﻄ' => 'Ø·', + 'ï»…' => 'ظ', + 'ﻆ' => 'ظ', + 'ﻇ' => 'ظ', + 'ﻈ' => 'ظ', + 'ﻉ' => 'ع', + 'ﻊ' => 'ع', + 'ﻋ' => 'ع', + 'ﻌ' => 'ع', + 'ï»' => 'غ', + 'ﻎ' => 'غ', + 'ï»' => 'غ', + 'ï»' => 'غ', + 'ﻑ' => 'Ù', + 'ï»’' => 'Ù', + 'ﻓ' => 'Ù', + 'ï»”' => 'Ù', + 'ﻕ' => 'Ù‚', + 'ï»–' => 'Ù‚', + 'ï»—' => 'Ù‚', + 'ﻘ' => 'Ù‚', + 'ï»™' => 'Ùƒ', + 'ﻚ' => 'Ùƒ', + 'ï»›' => 'Ùƒ', + 'ﻜ' => 'Ùƒ', + 'ï»' => 'Ù„', + 'ﻞ' => 'Ù„', + 'ﻟ' => 'Ù„', + 'ï» ' => 'Ù„', + 'ﻡ' => 'Ù…', + 'ﻢ' => 'Ù…', + 'ﻣ' => 'Ù…', + 'ﻤ' => 'Ù…', + 'ﻥ' => 'Ù†', + 'ﻦ' => 'Ù†', + 'ï»§' => 'Ù†', + 'ﻨ' => 'Ù†', + 'ﻩ' => 'Ù‡', + 'ﻪ' => 'Ù‡', + 'ﻫ' => 'Ù‡', + 'ﻬ' => 'Ù‡', + 'ï»­' => 'Ùˆ', + 'ï»®' => 'Ùˆ', + 'ﻯ' => 'Ù‰', + 'ï»°' => 'Ù‰', + 'ï»±' => 'ÙŠ', + 'ﻲ' => 'ÙŠ', + 'ﻳ' => 'ÙŠ', + 'ï»´' => 'ÙŠ', + 'ﻵ' => 'لآ', + 'ï»¶' => 'لآ', + 'ï»·' => 'لأ', + 'ﻸ' => 'لأ', + 'ﻹ' => 'لإ', + 'ﻺ' => 'لإ', + 'ï»»' => 'لا', + 'ﻼ' => 'لا', + 'ï¼' => '!', + '"' => '"', + '#' => '#', + '$' => '$', + 'ï¼…' => '%', + '&' => '&', + ''' => '\'', + '(' => '(', + ')' => ')', + '*' => '*', + '+' => '+', + ',' => ',', + 'ï¼' => '-', + '.' => '.', + 'ï¼' => '/', + 'ï¼' => '0', + '1' => '1', + 'ï¼’' => '2', + '3' => '3', + 'ï¼”' => '4', + '5' => '5', + 'ï¼–' => '6', + 'ï¼—' => '7', + '8' => '8', + 'ï¼™' => '9', + ':' => ':', + 'ï¼›' => ';', + '<' => '<', + 'ï¼' => '=', + '>' => '>', + '?' => '?', + 'ï¼ ' => '@', + 'A' => 'A', + 'ï¼¢' => 'B', + 'ï¼£' => 'C', + 'D' => 'D', + 'ï¼¥' => 'E', + 'F' => 'F', + 'ï¼§' => 'G', + 'H' => 'H', + 'I' => 'I', + 'J' => 'J', + 'K' => 'K', + 'L' => 'L', + 'ï¼­' => 'M', + 'ï¼®' => 'N', + 'O' => 'O', + 'ï¼°' => 'P', + 'ï¼±' => 'Q', + 'ï¼²' => 'R', + 'ï¼³' => 'S', + 'ï¼´' => 'T', + 'ï¼µ' => 'U', + 'ï¼¶' => 'V', + 'ï¼·' => 'W', + 'X' => 'X', + 'ï¼¹' => 'Y', + 'Z' => 'Z', + 'ï¼»' => '[', + 'ï¼¼' => '\\', + 'ï¼½' => ']', + 'ï¼¾' => '^', + '_' => '_', + 'ï½€' => '`', + 'ï½' => 'a', + 'b' => 'b', + 'c' => 'c', + 'd' => 'd', + 'ï½…' => 'e', + 'f' => 'f', + 'g' => 'g', + 'h' => 'h', + 'i' => 'i', + 'j' => 'j', + 'k' => 'k', + 'l' => 'l', + 'ï½' => 'm', + 'n' => 'n', + 'ï½' => 'o', + 'ï½' => 'p', + 'q' => 'q', + 'ï½’' => 'r', + 's' => 's', + 'ï½”' => 't', + 'u' => 'u', + 'ï½–' => 'v', + 'ï½—' => 'w', + 'x' => 'x', + 'ï½™' => 'y', + 'z' => 'z', + 'ï½›' => '{', + '|' => '|', + 'ï½' => '}', + '~' => '~', + '⦅' => '⦅', + 'ï½ ' => '⦆', + '。' => '。', + 'ï½¢' => '「', + 'ï½£' => 'ã€', + '、' => 'ã€', + 'ï½¥' => '・', + 'ヲ' => 'ヲ', + 'ï½§' => 'ã‚¡', + 'ィ' => 'ã‚£', + 'ゥ' => 'ã‚¥', + 'ェ' => 'ã‚§', + 'ォ' => 'ã‚©', + 'ャ' => 'ャ', + 'ï½­' => 'ュ', + 'ï½®' => 'ョ', + 'ッ' => 'ッ', + 'ï½°' => 'ー', + 'ï½±' => 'ã‚¢', + 'ï½²' => 'イ', + 'ï½³' => 'ウ', + 'ï½´' => 'エ', + 'ï½µ' => 'オ', + 'ï½¶' => 'ã‚«', + 'ï½·' => 'ã‚­', + 'ク' => 'ク', + 'ï½¹' => 'ケ', + 'コ' => 'コ', + 'ï½»' => 'サ', + 'ï½¼' => 'ã‚·', + 'ï½½' => 'ス', + 'ï½¾' => 'ã‚»', + 'ソ' => 'ソ', + 'ï¾€' => 'ã‚¿', + 'ï¾' => 'ãƒ', + 'ツ' => 'ツ', + 'テ' => 'テ', + 'ト' => 'ト', + 'ï¾…' => 'ナ', + 'ニ' => 'ニ', + 'ヌ' => 'ヌ', + 'ネ' => 'ãƒ', + 'ノ' => 'ノ', + 'ハ' => 'ãƒ', + 'ヒ' => 'ヒ', + 'フ' => 'フ', + 'ï¾' => 'ヘ', + 'ホ' => 'ホ', + 'ï¾' => 'マ', + 'ï¾' => 'ミ', + 'ム' => 'ム', + 'ï¾’' => 'メ', + 'モ' => 'モ', + 'ï¾”' => 'ヤ', + 'ユ' => 'ユ', + 'ï¾–' => 'ヨ', + 'ï¾—' => 'ラ', + 'リ' => 'リ', + 'ï¾™' => 'ル', + 'レ' => 'レ', + 'ï¾›' => 'ロ', + 'ワ' => 'ワ', + 'ï¾' => 'ン', + '゙' => 'ã‚™', + '゚' => '゚', + 'ï¾ ' => 'á… ', + 'ᄀ' => 'á„€', + 'ï¾¢' => 'á„', + 'ï¾£' => 'ᆪ', + 'ᄂ' => 'á„‚', + 'ï¾¥' => 'ᆬ', + 'ᆭ' => 'ᆭ', + 'ï¾§' => 'ᄃ', + 'ᄄ' => 'á„„', + 'ᄅ' => 'á„…', + 'ᆰ' => 'ᆰ', + 'ᆱ' => 'ᆱ', + 'ᆲ' => 'ᆲ', + 'ï¾­' => 'ᆳ', + 'ï¾®' => 'ᆴ', + 'ᆵ' => 'ᆵ', + 'ï¾°' => 'ᄚ', + 'ï¾±' => 'ᄆ', + 'ï¾²' => 'ᄇ', + 'ï¾³' => 'ᄈ', + 'ï¾´' => 'á„¡', + 'ï¾µ' => 'ᄉ', + 'ï¾¶' => 'ᄊ', + 'ï¾·' => 'á„‹', + 'ᄌ' => 'ᄌ', + 'ï¾¹' => 'á„', + 'ᄎ' => 'ᄎ', + 'ï¾»' => 'á„', + 'ï¾¼' => 'á„', + 'ï¾½' => 'á„‘', + 'ï¾¾' => 'á„’', + 'ï¿‚' => 'á…¡', + 'ᅢ' => 'á…¢', + 'ï¿„' => 'á…£', + 'ï¿…' => 'á…¤', + 'ᅥ' => 'á…¥', + 'ᅦ' => 'á…¦', + 'ᅧ' => 'á…§', + 'ï¿‹' => 'á…¨', + 'ᅩ' => 'á…©', + 'ï¿' => 'á…ª', + 'ᅫ' => 'á…«', + 'ï¿' => 'á…¬', + 'ï¿’' => 'á…­', + 'ï¿“' => 'á…®', + 'ï¿”' => 'á…¯', + 'ï¿•' => 'á…°', + 'ï¿–' => 'á…±', + 'ï¿—' => 'á…²', + 'ᅳ' => 'á…³', + 'ï¿›' => 'á…´', + 'ᅵ' => 'á…µ', + 'ï¿ ' => '¢', + 'ï¿¡' => '£', + 'ï¿¢' => '¬', + 'ï¿£' => ' Ì„', + '¦' => '¦', + 'ï¿¥' => 'Â¥', + '₩' => 'â‚©', + '│' => '│', + 'ï¿©' => 'â†', + '↑' => '↑', + 'ï¿«' => '→', + '↓' => '↓', + 'ï¿­' => 'â– ', + 'ï¿®' => 'â—‹', + 'ð€' => 'A', + 'ð' => 'B', + 'ð‚' => 'C', + 'ðƒ' => 'D', + 'ð„' => 'E', + 'ð…' => 'F', + 'ð†' => 'G', + 'ð‡' => 'H', + 'ðˆ' => 'I', + 'ð‰' => 'J', + 'ðŠ' => 'K', + 'ð‹' => 'L', + 'ðŒ' => 'M', + 'ð' => 'N', + 'ðŽ' => 'O', + 'ð' => 'P', + 'ð' => 'Q', + 'ð‘' => 'R', + 'ð’' => 'S', + 'ð“' => 'T', + 'ð”' => 'U', + 'ð•' => 'V', + 'ð–' => 'W', + 'ð—' => 'X', + 'ð˜' => 'Y', + 'ð™' => 'Z', + 'ðš' => 'a', + 'ð›' => 'b', + 'ðœ' => 'c', + 'ð' => 'd', + 'ðž' => 'e', + 'ðŸ' => 'f', + 'ð ' => 'g', + 'ð¡' => 'h', + 'ð¢' => 'i', + 'ð£' => 'j', + 'ð¤' => 'k', + 'ð¥' => 'l', + 'ð¦' => 'm', + 'ð§' => 'n', + 'ð¨' => 'o', + 'ð©' => 'p', + 'ðª' => 'q', + 'ð«' => 'r', + 'ð¬' => 's', + 'ð­' => 't', + 'ð®' => 'u', + 'ð¯' => 'v', + 'ð°' => 'w', + 'ð±' => 'x', + 'ð²' => 'y', + 'ð³' => 'z', + 'ð´' => 'A', + 'ðµ' => 'B', + 'ð¶' => 'C', + 'ð·' => 'D', + 'ð¸' => 'E', + 'ð¹' => 'F', + 'ðº' => 'G', + 'ð»' => 'H', + 'ð¼' => 'I', + 'ð½' => 'J', + 'ð¾' => 'K', + 'ð¿' => 'L', + 'ð‘€' => 'M', + 'ð‘' => 'N', + 'ð‘‚' => 'O', + 'ð‘ƒ' => 'P', + 'ð‘„' => 'Q', + 'ð‘…' => 'R', + 'ð‘†' => 'S', + 'ð‘‡' => 'T', + 'ð‘ˆ' => 'U', + 'ð‘‰' => 'V', + 'ð‘Š' => 'W', + 'ð‘‹' => 'X', + 'ð‘Œ' => 'Y', + 'ð‘' => 'Z', + 'ð‘Ž' => 'a', + 'ð‘' => 'b', + 'ð‘' => 'c', + 'ð‘‘' => 'd', + 'ð‘’' => 'e', + 'ð‘“' => 'f', + 'ð‘”' => 'g', + 'ð‘–' => 'i', + 'ð‘—' => 'j', + 'ð‘˜' => 'k', + 'ð‘™' => 'l', + 'ð‘š' => 'm', + 'ð‘›' => 'n', + 'ð‘œ' => 'o', + 'ð‘' => 'p', + 'ð‘ž' => 'q', + 'ð‘Ÿ' => 'r', + 'ð‘ ' => 's', + 'ð‘¡' => 't', + 'ð‘¢' => 'u', + 'ð‘£' => 'v', + 'ð‘¤' => 'w', + 'ð‘¥' => 'x', + 'ð‘¦' => 'y', + 'ð‘§' => 'z', + 'ð‘¨' => 'A', + 'ð‘©' => 'B', + 'ð‘ª' => 'C', + 'ð‘«' => 'D', + 'ð‘¬' => 'E', + 'ð‘­' => 'F', + 'ð‘®' => 'G', + 'ð‘¯' => 'H', + 'ð‘°' => 'I', + 'ð‘±' => 'J', + 'ð‘²' => 'K', + 'ð‘³' => 'L', + 'ð‘´' => 'M', + 'ð‘µ' => 'N', + 'ð‘¶' => 'O', + 'ð‘·' => 'P', + 'ð‘¸' => 'Q', + 'ð‘¹' => 'R', + 'ð‘º' => 'S', + 'ð‘»' => 'T', + 'ð‘¼' => 'U', + 'ð‘½' => 'V', + 'ð‘¾' => 'W', + 'ð‘¿' => 'X', + 'ð’€' => 'Y', + 'ð’' => 'Z', + 'ð’‚' => 'a', + 'ð’ƒ' => 'b', + 'ð’„' => 'c', + 'ð’…' => 'd', + 'ð’†' => 'e', + 'ð’‡' => 'f', + 'ð’ˆ' => 'g', + 'ð’‰' => 'h', + 'ð’Š' => 'i', + 'ð’‹' => 'j', + 'ð’Œ' => 'k', + 'ð’' => 'l', + 'ð’Ž' => 'm', + 'ð’' => 'n', + 'ð’' => 'o', + 'ð’‘' => 'p', + 'ð’’' => 'q', + 'ð’“' => 'r', + 'ð’”' => 's', + 'ð’•' => 't', + 'ð’–' => 'u', + 'ð’—' => 'v', + 'ð’˜' => 'w', + 'ð’™' => 'x', + 'ð’š' => 'y', + 'ð’›' => 'z', + 'ð’œ' => 'A', + 'ð’ž' => 'C', + 'ð’Ÿ' => 'D', + 'ð’¢' => 'G', + 'ð’¥' => 'J', + 'ð’¦' => 'K', + 'ð’©' => 'N', + 'ð’ª' => 'O', + 'ð’«' => 'P', + 'ð’¬' => 'Q', + 'ð’®' => 'S', + 'ð’¯' => 'T', + 'ð’°' => 'U', + 'ð’±' => 'V', + 'ð’²' => 'W', + 'ð’³' => 'X', + 'ð’´' => 'Y', + 'ð’µ' => 'Z', + 'ð’¶' => 'a', + 'ð’·' => 'b', + 'ð’¸' => 'c', + 'ð’¹' => 'd', + 'ð’»' => 'f', + 'ð’½' => 'h', + 'ð’¾' => 'i', + 'ð’¿' => 'j', + 'ð“€' => 'k', + 'ð“' => 'l', + 'ð“‚' => 'm', + 'ð“ƒ' => 'n', + 'ð“…' => 'p', + 'ð“†' => 'q', + 'ð“‡' => 'r', + 'ð“ˆ' => 's', + 'ð“‰' => 't', + 'ð“Š' => 'u', + 'ð“‹' => 'v', + 'ð“Œ' => 'w', + 'ð“' => 'x', + 'ð“Ž' => 'y', + 'ð“' => 'z', + 'ð“' => 'A', + 'ð“‘' => 'B', + 'ð“’' => 'C', + 'ð““' => 'D', + 'ð“”' => 'E', + 'ð“•' => 'F', + 'ð“–' => 'G', + 'ð“—' => 'H', + 'ð“˜' => 'I', + 'ð“™' => 'J', + 'ð“š' => 'K', + 'ð“›' => 'L', + 'ð“œ' => 'M', + 'ð“' => 'N', + 'ð“ž' => 'O', + 'ð“Ÿ' => 'P', + 'ð“ ' => 'Q', + 'ð“¡' => 'R', + 'ð“¢' => 'S', + 'ð“£' => 'T', + 'ð“¤' => 'U', + 'ð“¥' => 'V', + 'ð“¦' => 'W', + 'ð“§' => 'X', + 'ð“¨' => 'Y', + 'ð“©' => 'Z', + 'ð“ª' => 'a', + 'ð“«' => 'b', + 'ð“¬' => 'c', + 'ð“­' => 'd', + 'ð“®' => 'e', + 'ð“¯' => 'f', + 'ð“°' => 'g', + 'ð“±' => 'h', + 'ð“²' => 'i', + 'ð“³' => 'j', + 'ð“´' => 'k', + 'ð“µ' => 'l', + 'ð“¶' => 'm', + 'ð“·' => 'n', + 'ð“¸' => 'o', + 'ð“¹' => 'p', + 'ð“º' => 'q', + 'ð“»' => 'r', + 'ð“¼' => 's', + 'ð“½' => 't', + 'ð“¾' => 'u', + 'ð“¿' => 'v', + 'ð”€' => 'w', + 'ð”' => 'x', + 'ð”‚' => 'y', + 'ð”ƒ' => 'z', + 'ð”„' => 'A', + 'ð”…' => 'B', + 'ð”‡' => 'D', + 'ð”ˆ' => 'E', + 'ð”‰' => 'F', + 'ð”Š' => 'G', + 'ð”' => 'J', + 'ð”Ž' => 'K', + 'ð”' => 'L', + 'ð”' => 'M', + 'ð”‘' => 'N', + 'ð”’' => 'O', + 'ð”“' => 'P', + 'ð””' => 'Q', + 'ð”–' => 'S', + 'ð”—' => 'T', + 'ð”˜' => 'U', + 'ð”™' => 'V', + 'ð”š' => 'W', + 'ð”›' => 'X', + 'ð”œ' => 'Y', + 'ð”ž' => 'a', + 'ð”Ÿ' => 'b', + 'ð” ' => 'c', + 'ð”¡' => 'd', + 'ð”¢' => 'e', + 'ð”£' => 'f', + 'ð”¤' => 'g', + 'ð”¥' => 'h', + 'ð”¦' => 'i', + 'ð”§' => 'j', + 'ð”¨' => 'k', + 'ð”©' => 'l', + 'ð”ª' => 'm', + 'ð”«' => 'n', + 'ð”¬' => 'o', + 'ð”­' => 'p', + 'ð”®' => 'q', + 'ð”¯' => 'r', + 'ð”°' => 's', + 'ð”±' => 't', + 'ð”²' => 'u', + 'ð”³' => 'v', + 'ð”´' => 'w', + 'ð”µ' => 'x', + 'ð”¶' => 'y', + 'ð”·' => 'z', + 'ð”¸' => 'A', + 'ð”¹' => 'B', + 'ð”»' => 'D', + 'ð”¼' => 'E', + 'ð”½' => 'F', + 'ð”¾' => 'G', + 'ð•€' => 'I', + 'ð•' => 'J', + 'ð•‚' => 'K', + 'ð•ƒ' => 'L', + 'ð•„' => 'M', + 'ð•†' => 'O', + 'ð•Š' => 'S', + 'ð•‹' => 'T', + 'ð•Œ' => 'U', + 'ð•' => 'V', + 'ð•Ž' => 'W', + 'ð•' => 'X', + 'ð•' => 'Y', + 'ð•’' => 'a', + 'ð•“' => 'b', + 'ð•”' => 'c', + 'ð••' => 'd', + 'ð•–' => 'e', + 'ð•—' => 'f', + 'ð•˜' => 'g', + 'ð•™' => 'h', + 'ð•š' => 'i', + 'ð•›' => 'j', + 'ð•œ' => 'k', + 'ð•' => 'l', + 'ð•ž' => 'm', + 'ð•Ÿ' => 'n', + 'ð• ' => 'o', + 'ð•¡' => 'p', + 'ð•¢' => 'q', + 'ð•£' => 'r', + 'ð•¤' => 's', + 'ð•¥' => 't', + 'ð•¦' => 'u', + 'ð•§' => 'v', + 'ð•¨' => 'w', + 'ð•©' => 'x', + 'ð•ª' => 'y', + 'ð•«' => 'z', + 'ð•¬' => 'A', + 'ð•­' => 'B', + 'ð•®' => 'C', + 'ð•¯' => 'D', + 'ð•°' => 'E', + 'ð•±' => 'F', + 'ð•²' => 'G', + 'ð•³' => 'H', + 'ð•´' => 'I', + 'ð•µ' => 'J', + 'ð•¶' => 'K', + 'ð•·' => 'L', + 'ð•¸' => 'M', + 'ð•¹' => 'N', + 'ð•º' => 'O', + 'ð•»' => 'P', + 'ð•¼' => 'Q', + 'ð•½' => 'R', + 'ð•¾' => 'S', + 'ð•¿' => 'T', + 'ð–€' => 'U', + 'ð–' => 'V', + 'ð–‚' => 'W', + 'ð–ƒ' => 'X', + 'ð–„' => 'Y', + 'ð–…' => 'Z', + 'ð–†' => 'a', + 'ð–‡' => 'b', + 'ð–ˆ' => 'c', + 'ð–‰' => 'd', + 'ð–Š' => 'e', + 'ð–‹' => 'f', + 'ð–Œ' => 'g', + 'ð–' => 'h', + 'ð–Ž' => 'i', + 'ð–' => 'j', + 'ð–' => 'k', + 'ð–‘' => 'l', + 'ð–’' => 'm', + 'ð–“' => 'n', + 'ð–”' => 'o', + 'ð–•' => 'p', + 'ð––' => 'q', + 'ð–—' => 'r', + 'ð–˜' => 's', + 'ð–™' => 't', + 'ð–š' => 'u', + 'ð–›' => 'v', + 'ð–œ' => 'w', + 'ð–' => 'x', + 'ð–ž' => 'y', + 'ð–Ÿ' => 'z', + 'ð– ' => 'A', + 'ð–¡' => 'B', + 'ð–¢' => 'C', + 'ð–£' => 'D', + 'ð–¤' => 'E', + 'ð–¥' => 'F', + 'ð–¦' => 'G', + 'ð–§' => 'H', + 'ð–¨' => 'I', + 'ð–©' => 'J', + 'ð–ª' => 'K', + 'ð–«' => 'L', + 'ð–¬' => 'M', + 'ð–­' => 'N', + 'ð–®' => 'O', + 'ð–¯' => 'P', + 'ð–°' => 'Q', + 'ð–±' => 'R', + 'ð–²' => 'S', + 'ð–³' => 'T', + 'ð–´' => 'U', + 'ð–µ' => 'V', + 'ð–¶' => 'W', + 'ð–·' => 'X', + 'ð–¸' => 'Y', + 'ð–¹' => 'Z', + 'ð–º' => 'a', + 'ð–»' => 'b', + 'ð–¼' => 'c', + 'ð–½' => 'd', + 'ð–¾' => 'e', + 'ð–¿' => 'f', + 'ð—€' => 'g', + 'ð—' => 'h', + 'ð—‚' => 'i', + 'ð—ƒ' => 'j', + 'ð—„' => 'k', + 'ð—…' => 'l', + 'ð—†' => 'm', + 'ð—‡' => 'n', + 'ð—ˆ' => 'o', + 'ð—‰' => 'p', + 'ð—Š' => 'q', + 'ð—‹' => 'r', + 'ð—Œ' => 's', + 'ð—' => 't', + 'ð—Ž' => 'u', + 'ð—' => 'v', + 'ð—' => 'w', + 'ð—‘' => 'x', + 'ð—’' => 'y', + 'ð—“' => 'z', + 'ð—”' => 'A', + 'ð—•' => 'B', + 'ð—–' => 'C', + 'ð——' => 'D', + 'ð—˜' => 'E', + 'ð—™' => 'F', + 'ð—š' => 'G', + 'ð—›' => 'H', + 'ð—œ' => 'I', + 'ð—' => 'J', + 'ð—ž' => 'K', + 'ð—Ÿ' => 'L', + 'ð— ' => 'M', + 'ð—¡' => 'N', + 'ð—¢' => 'O', + 'ð—£' => 'P', + 'ð—¤' => 'Q', + 'ð—¥' => 'R', + 'ð—¦' => 'S', + 'ð—§' => 'T', + 'ð—¨' => 'U', + 'ð—©' => 'V', + 'ð—ª' => 'W', + 'ð—«' => 'X', + 'ð—¬' => 'Y', + 'ð—­' => 'Z', + 'ð—®' => 'a', + 'ð—¯' => 'b', + 'ð—°' => 'c', + 'ð—±' => 'd', + 'ð—²' => 'e', + 'ð—³' => 'f', + 'ð—´' => 'g', + 'ð—µ' => 'h', + 'ð—¶' => 'i', + 'ð—·' => 'j', + 'ð—¸' => 'k', + 'ð—¹' => 'l', + 'ð—º' => 'm', + 'ð—»' => 'n', + 'ð—¼' => 'o', + 'ð—½' => 'p', + 'ð—¾' => 'q', + 'ð—¿' => 'r', + 'ð˜€' => 's', + 'ð˜' => 't', + 'ð˜‚' => 'u', + 'ð˜ƒ' => 'v', + 'ð˜„' => 'w', + 'ð˜…' => 'x', + 'ð˜†' => 'y', + 'ð˜‡' => 'z', + 'ð˜ˆ' => 'A', + 'ð˜‰' => 'B', + 'ð˜Š' => 'C', + 'ð˜‹' => 'D', + 'ð˜Œ' => 'E', + 'ð˜' => 'F', + 'ð˜Ž' => 'G', + 'ð˜' => 'H', + 'ð˜' => 'I', + 'ð˜‘' => 'J', + 'ð˜’' => 'K', + 'ð˜“' => 'L', + 'ð˜”' => 'M', + 'ð˜•' => 'N', + 'ð˜–' => 'O', + 'ð˜—' => 'P', + 'ð˜˜' => 'Q', + 'ð˜™' => 'R', + 'ð˜š' => 'S', + 'ð˜›' => 'T', + 'ð˜œ' => 'U', + 'ð˜' => 'V', + 'ð˜ž' => 'W', + 'ð˜Ÿ' => 'X', + 'ð˜ ' => 'Y', + 'ð˜¡' => 'Z', + 'ð˜¢' => 'a', + 'ð˜£' => 'b', + 'ð˜¤' => 'c', + 'ð˜¥' => 'd', + 'ð˜¦' => 'e', + 'ð˜§' => 'f', + 'ð˜¨' => 'g', + 'ð˜©' => 'h', + 'ð˜ª' => 'i', + 'ð˜«' => 'j', + 'ð˜¬' => 'k', + 'ð˜­' => 'l', + 'ð˜®' => 'm', + 'ð˜¯' => 'n', + 'ð˜°' => 'o', + 'ð˜±' => 'p', + 'ð˜²' => 'q', + 'ð˜³' => 'r', + 'ð˜´' => 's', + 'ð˜µ' => 't', + 'ð˜¶' => 'u', + 'ð˜·' => 'v', + 'ð˜¸' => 'w', + 'ð˜¹' => 'x', + 'ð˜º' => 'y', + 'ð˜»' => 'z', + 'ð˜¼' => 'A', + 'ð˜½' => 'B', + 'ð˜¾' => 'C', + 'ð˜¿' => 'D', + 'ð™€' => 'E', + 'ð™' => 'F', + 'ð™‚' => 'G', + 'ð™ƒ' => 'H', + 'ð™„' => 'I', + 'ð™…' => 'J', + 'ð™†' => 'K', + 'ð™‡' => 'L', + 'ð™ˆ' => 'M', + 'ð™‰' => 'N', + 'ð™Š' => 'O', + 'ð™‹' => 'P', + 'ð™Œ' => 'Q', + 'ð™' => 'R', + 'ð™Ž' => 'S', + 'ð™' => 'T', + 'ð™' => 'U', + 'ð™‘' => 'V', + 'ð™’' => 'W', + 'ð™“' => 'X', + 'ð™”' => 'Y', + 'ð™•' => 'Z', + 'ð™–' => 'a', + 'ð™—' => 'b', + 'ð™˜' => 'c', + 'ð™™' => 'd', + 'ð™š' => 'e', + 'ð™›' => 'f', + 'ð™œ' => 'g', + 'ð™' => 'h', + 'ð™ž' => 'i', + 'ð™Ÿ' => 'j', + 'ð™ ' => 'k', + 'ð™¡' => 'l', + 'ð™¢' => 'm', + 'ð™£' => 'n', + 'ð™¤' => 'o', + 'ð™¥' => 'p', + 'ð™¦' => 'q', + 'ð™§' => 'r', + 'ð™¨' => 's', + 'ð™©' => 't', + 'ð™ª' => 'u', + 'ð™«' => 'v', + 'ð™¬' => 'w', + 'ð™­' => 'x', + 'ð™®' => 'y', + 'ð™¯' => 'z', + 'ð™°' => 'A', + 'ð™±' => 'B', + 'ð™²' => 'C', + 'ð™³' => 'D', + 'ð™´' => 'E', + 'ð™µ' => 'F', + 'ð™¶' => 'G', + 'ð™·' => 'H', + 'ð™¸' => 'I', + 'ð™¹' => 'J', + 'ð™º' => 'K', + 'ð™»' => 'L', + 'ð™¼' => 'M', + 'ð™½' => 'N', + 'ð™¾' => 'O', + 'ð™¿' => 'P', + 'ðš€' => 'Q', + 'ðš' => 'R', + 'ðš‚' => 'S', + 'ðšƒ' => 'T', + 'ðš„' => 'U', + 'ðš…' => 'V', + 'ðš†' => 'W', + 'ðš‡' => 'X', + 'ðšˆ' => 'Y', + 'ðš‰' => 'Z', + 'ðšŠ' => 'a', + 'ðš‹' => 'b', + 'ðšŒ' => 'c', + 'ðš' => 'd', + 'ðšŽ' => 'e', + 'ðš' => 'f', + 'ðš' => 'g', + 'ðš‘' => 'h', + 'ðš’' => 'i', + 'ðš“' => 'j', + 'ðš”' => 'k', + 'ðš•' => 'l', + 'ðš–' => 'm', + 'ðš—' => 'n', + 'ðš˜' => 'o', + 'ðš™' => 'p', + 'ðšš' => 'q', + 'ðš›' => 'r', + 'ðšœ' => 's', + 'ðš' => 't', + 'ðšž' => 'u', + 'ðšŸ' => 'v', + 'ðš ' => 'w', + 'ðš¡' => 'x', + 'ðš¢' => 'y', + 'ðš£' => 'z', + 'ðš¤' => 'ı', + 'ðš¥' => 'È·', + 'ðš¨' => 'Α', + 'ðš©' => 'Î’', + 'ðšª' => 'Γ', + 'ðš«' => 'Δ', + 'ðš¬' => 'Ε', + 'ðš­' => 'Ζ', + 'ðš®' => 'Η', + 'ðš¯' => 'Θ', + 'ðš°' => 'Ι', + 'ðš±' => 'Κ', + 'ðš²' => 'Λ', + 'ðš³' => 'Μ', + 'ðš´' => 'Î', + 'ðšµ' => 'Ξ', + 'ðš¶' => 'Ο', + 'ðš·' => 'Π', + 'ðš¸' => 'Ρ', + 'ðš¹' => 'Θ', + 'ðšº' => 'Σ', + 'ðš»' => 'Τ', + 'ðš¼' => 'Î¥', + 'ðš½' => 'Φ', + 'ðš¾' => 'Χ', + 'ðš¿' => 'Ψ', + 'ð›€' => 'Ω', + 'ð›' => '∇', + 'ð›‚' => 'α', + 'ð›ƒ' => 'β', + 'ð›„' => 'γ', + 'ð›…' => 'δ', + 'ð›†' => 'ε', + 'ð›‡' => 'ζ', + 'ð›ˆ' => 'η', + 'ð›‰' => 'θ', + 'ð›Š' => 'ι', + 'ð›‹' => 'κ', + 'ð›Œ' => 'λ', + 'ð›' => 'μ', + 'ð›Ž' => 'ν', + 'ð›' => 'ξ', + 'ð›' => 'ο', + 'ð›‘' => 'Ï€', + 'ð›’' => 'Ï', + 'ð›“' => 'Ï‚', + 'ð›”' => 'σ', + 'ð›•' => 'Ï„', + 'ð›–' => 'Ï…', + 'ð›—' => 'φ', + 'ð›˜' => 'χ', + 'ð›™' => 'ψ', + 'ð›š' => 'ω', + 'ð››' => '∂', + 'ð›œ' => 'ε', + 'ð›' => 'θ', + 'ð›ž' => 'κ', + 'ð›Ÿ' => 'φ', + 'ð› ' => 'Ï', + 'ð›¡' => 'Ï€', + 'ð›¢' => 'Α', + 'ð›£' => 'Î’', + 'ð›¤' => 'Γ', + 'ð›¥' => 'Δ', + 'ð›¦' => 'Ε', + 'ð›§' => 'Ζ', + 'ð›¨' => 'Η', + 'ð›©' => 'Θ', + 'ð›ª' => 'Ι', + 'ð›«' => 'Κ', + 'ð›¬' => 'Λ', + 'ð›­' => 'Μ', + 'ð›®' => 'Î', + 'ð›¯' => 'Ξ', + 'ð›°' => 'Ο', + 'ð›±' => 'Π', + 'ð›²' => 'Ρ', + 'ð›³' => 'Θ', + 'ð›´' => 'Σ', + 'ð›µ' => 'Τ', + 'ð›¶' => 'Î¥', + 'ð›·' => 'Φ', + 'ð›¸' => 'Χ', + 'ð›¹' => 'Ψ', + 'ð›º' => 'Ω', + 'ð›»' => '∇', + 'ð›¼' => 'α', + 'ð›½' => 'β', + 'ð›¾' => 'γ', + 'ð›¿' => 'δ', + 'ðœ€' => 'ε', + 'ðœ' => 'ζ', + 'ðœ‚' => 'η', + 'ðœƒ' => 'θ', + 'ðœ„' => 'ι', + 'ðœ…' => 'κ', + 'ðœ†' => 'λ', + 'ðœ‡' => 'μ', + 'ðœˆ' => 'ν', + 'ðœ‰' => 'ξ', + 'ðœŠ' => 'ο', + 'ðœ‹' => 'Ï€', + 'ðœŒ' => 'Ï', + 'ðœ' => 'Ï‚', + 'ðœŽ' => 'σ', + 'ðœ' => 'Ï„', + 'ðœ' => 'Ï…', + 'ðœ‘' => 'φ', + 'ðœ’' => 'χ', + 'ðœ“' => 'ψ', + 'ðœ”' => 'ω', + 'ðœ•' => '∂', + 'ðœ–' => 'ε', + 'ðœ—' => 'θ', + 'ðœ˜' => 'κ', + 'ðœ™' => 'φ', + 'ðœš' => 'Ï', + 'ðœ›' => 'Ï€', + 'ðœœ' => 'Α', + 'ðœ' => 'Î’', + 'ðœž' => 'Γ', + 'ðœŸ' => 'Δ', + 'ðœ ' => 'Ε', + 'ðœ¡' => 'Ζ', + 'ðœ¢' => 'Η', + 'ðœ£' => 'Θ', + 'ðœ¤' => 'Ι', + 'ðœ¥' => 'Κ', + 'ðœ¦' => 'Λ', + 'ðœ§' => 'Μ', + 'ðœ¨' => 'Î', + 'ðœ©' => 'Ξ', + 'ðœª' => 'Ο', + 'ðœ«' => 'Π', + 'ðœ¬' => 'Ρ', + 'ðœ­' => 'Θ', + 'ðœ®' => 'Σ', + 'ðœ¯' => 'Τ', + 'ðœ°' => 'Î¥', + 'ðœ±' => 'Φ', + 'ðœ²' => 'Χ', + 'ðœ³' => 'Ψ', + 'ðœ´' => 'Ω', + 'ðœµ' => '∇', + 'ðœ¶' => 'α', + 'ðœ·' => 'β', + 'ðœ¸' => 'γ', + 'ðœ¹' => 'δ', + 'ðœº' => 'ε', + 'ðœ»' => 'ζ', + 'ðœ¼' => 'η', + 'ðœ½' => 'θ', + 'ðœ¾' => 'ι', + 'ðœ¿' => 'κ', + 'ð€' => 'λ', + 'ð' => 'μ', + 'ð‚' => 'ν', + 'ðƒ' => 'ξ', + 'ð„' => 'ο', + 'ð…' => 'Ï€', + 'ð†' => 'Ï', + 'ð‡' => 'Ï‚', + 'ðˆ' => 'σ', + 'ð‰' => 'Ï„', + 'ðŠ' => 'Ï…', + 'ð‹' => 'φ', + 'ðŒ' => 'χ', + 'ð' => 'ψ', + 'ðŽ' => 'ω', + 'ð' => '∂', + 'ð' => 'ε', + 'ð‘' => 'θ', + 'ð’' => 'κ', + 'ð“' => 'φ', + 'ð”' => 'Ï', + 'ð•' => 'Ï€', + 'ð–' => 'Α', + 'ð—' => 'Î’', + 'ð˜' => 'Γ', + 'ð™' => 'Δ', + 'ðš' => 'Ε', + 'ð›' => 'Ζ', + 'ðœ' => 'Η', + 'ð' => 'Θ', + 'ðž' => 'Ι', + 'ðŸ' => 'Κ', + 'ð ' => 'Λ', + 'ð¡' => 'Μ', + 'ð¢' => 'Î', + 'ð£' => 'Ξ', + 'ð¤' => 'Ο', + 'ð¥' => 'Π', + 'ð¦' => 'Ρ', + 'ð§' => 'Θ', + 'ð¨' => 'Σ', + 'ð©' => 'Τ', + 'ðª' => 'Î¥', + 'ð«' => 'Φ', + 'ð¬' => 'Χ', + 'ð­' => 'Ψ', + 'ð®' => 'Ω', + 'ð¯' => '∇', + 'ð°' => 'α', + 'ð±' => 'β', + 'ð²' => 'γ', + 'ð³' => 'δ', + 'ð´' => 'ε', + 'ðµ' => 'ζ', + 'ð¶' => 'η', + 'ð·' => 'θ', + 'ð¸' => 'ι', + 'ð¹' => 'κ', + 'ðº' => 'λ', + 'ð»' => 'μ', + 'ð¼' => 'ν', + 'ð½' => 'ξ', + 'ð¾' => 'ο', + 'ð¿' => 'Ï€', + 'ðž€' => 'Ï', + 'ðž' => 'Ï‚', + 'ðž‚' => 'σ', + 'ðžƒ' => 'Ï„', + 'ðž„' => 'Ï…', + 'ðž…' => 'φ', + 'ðž†' => 'χ', + 'ðž‡' => 'ψ', + 'ðžˆ' => 'ω', + 'ðž‰' => '∂', + 'ðžŠ' => 'ε', + 'ðž‹' => 'θ', + 'ðžŒ' => 'κ', + 'ðž' => 'φ', + 'ðžŽ' => 'Ï', + 'ðž' => 'Ï€', + 'ðž' => 'Α', + 'ðž‘' => 'Î’', + 'ðž’' => 'Γ', + 'ðž“' => 'Δ', + 'ðž”' => 'Ε', + 'ðž•' => 'Ζ', + 'ðž–' => 'Η', + 'ðž—' => 'Θ', + 'ðž˜' => 'Ι', + 'ðž™' => 'Κ', + 'ðžš' => 'Λ', + 'ðž›' => 'Μ', + 'ðžœ' => 'Î', + 'ðž' => 'Ξ', + 'ðžž' => 'Ο', + 'ðžŸ' => 'Π', + 'ðž ' => 'Ρ', + 'ðž¡' => 'Θ', + 'ðž¢' => 'Σ', + 'ðž£' => 'Τ', + 'ðž¤' => 'Î¥', + 'ðž¥' => 'Φ', + 'ðž¦' => 'Χ', + 'ðž§' => 'Ψ', + 'ðž¨' => 'Ω', + 'ðž©' => '∇', + 'ðžª' => 'α', + 'ðž«' => 'β', + 'ðž¬' => 'γ', + 'ðž­' => 'δ', + 'ðž®' => 'ε', + 'ðž¯' => 'ζ', + 'ðž°' => 'η', + 'ðž±' => 'θ', + 'ðž²' => 'ι', + 'ðž³' => 'κ', + 'ðž´' => 'λ', + 'ðžµ' => 'μ', + 'ðž¶' => 'ν', + 'ðž·' => 'ξ', + 'ðž¸' => 'ο', + 'ðž¹' => 'Ï€', + 'ðžº' => 'Ï', + 'ðž»' => 'Ï‚', + 'ðž¼' => 'σ', + 'ðž½' => 'Ï„', + 'ðž¾' => 'Ï…', + 'ðž¿' => 'φ', + 'ðŸ€' => 'χ', + 'ðŸ' => 'ψ', + 'ðŸ‚' => 'ω', + 'ðŸƒ' => '∂', + 'ðŸ„' => 'ε', + 'ðŸ…' => 'θ', + 'ðŸ†' => 'κ', + 'ðŸ‡' => 'φ', + 'ðŸˆ' => 'Ï', + 'ðŸ‰' => 'Ï€', + 'ðŸŠ' => 'Ïœ', + 'ðŸ‹' => 'Ï', + 'ðŸŽ' => '0', + 'ðŸ' => '1', + 'ðŸ' => '2', + 'ðŸ‘' => '3', + 'ðŸ’' => '4', + 'ðŸ“' => '5', + 'ðŸ”' => '6', + 'ðŸ•' => '7', + 'ðŸ–' => '8', + 'ðŸ—' => '9', + 'ðŸ˜' => '0', + 'ðŸ™' => '1', + 'ðŸš' => '2', + 'ðŸ›' => '3', + 'ðŸœ' => '4', + 'ðŸ' => '5', + 'ðŸž' => '6', + 'ðŸŸ' => '7', + 'ðŸ ' => '8', + 'ðŸ¡' => '9', + 'ðŸ¢' => '0', + 'ðŸ£' => '1', + 'ðŸ¤' => '2', + 'ðŸ¥' => '3', + 'ðŸ¦' => '4', + 'ðŸ§' => '5', + 'ðŸ¨' => '6', + 'ðŸ©' => '7', + 'ðŸª' => '8', + 'ðŸ«' => '9', + 'ðŸ¬' => '0', + 'ðŸ­' => '1', + 'ðŸ®' => '2', + 'ðŸ¯' => '3', + 'ðŸ°' => '4', + 'ðŸ±' => '5', + 'ðŸ²' => '6', + 'ðŸ³' => '7', + 'ðŸ´' => '8', + 'ðŸµ' => '9', + 'ðŸ¶' => '0', + 'ðŸ·' => '1', + 'ðŸ¸' => '2', + 'ðŸ¹' => '3', + 'ðŸº' => '4', + 'ðŸ»' => '5', + 'ðŸ¼' => '6', + 'ðŸ½' => '7', + 'ðŸ¾' => '8', + 'ðŸ¿' => '9', + '𞸀' => 'ا', + 'ðž¸' => 'ب', + '𞸂' => 'ج', + '𞸃' => 'د', + '𞸅' => 'Ùˆ', + '𞸆' => 'ز', + '𞸇' => 'Ø­', + '𞸈' => 'Ø·', + '𞸉' => 'ÙŠ', + '𞸊' => 'Ùƒ', + '𞸋' => 'Ù„', + '𞸌' => 'Ù…', + 'ðž¸' => 'Ù†', + '𞸎' => 'س', + 'ðž¸' => 'ع', + 'ðž¸' => 'Ù', + '𞸑' => 'ص', + '𞸒' => 'Ù‚', + '𞸓' => 'ر', + '𞸔' => 'Ø´', + '𞸕' => 'ت', + '𞸖' => 'Ø«', + '𞸗' => 'Ø®', + '𞸘' => 'ذ', + '𞸙' => 'ض', + '𞸚' => 'ظ', + '𞸛' => 'غ', + '𞸜' => 'Ù®', + 'ðž¸' => 'Úº', + '𞸞' => 'Ú¡', + '𞸟' => 'Ù¯', + '𞸡' => 'ب', + '𞸢' => 'ج', + '𞸤' => 'Ù‡', + '𞸧' => 'Ø­', + '𞸩' => 'ÙŠ', + '𞸪' => 'Ùƒ', + '𞸫' => 'Ù„', + '𞸬' => 'Ù…', + '𞸭' => 'Ù†', + '𞸮' => 'س', + '𞸯' => 'ع', + '𞸰' => 'Ù', + '𞸱' => 'ص', + '𞸲' => 'Ù‚', + '𞸴' => 'Ø´', + '𞸵' => 'ت', + '𞸶' => 'Ø«', + '𞸷' => 'Ø®', + '𞸹' => 'ض', + '𞸻' => 'غ', + '𞹂' => 'ج', + '𞹇' => 'Ø­', + '𞹉' => 'ÙŠ', + '𞹋' => 'Ù„', + 'ðž¹' => 'Ù†', + '𞹎' => 'س', + 'ðž¹' => 'ع', + '𞹑' => 'ص', + 'ðž¹’' => 'Ù‚', + 'ðž¹”' => 'Ø´', + 'ðž¹—' => 'Ø®', + 'ðž¹™' => 'ض', + 'ðž¹›' => 'غ', + 'ðž¹' => 'Úº', + '𞹟' => 'Ù¯', + '𞹡' => 'ب', + 'ðž¹¢' => 'ج', + '𞹤' => 'Ù‡', + 'ðž¹§' => 'Ø­', + '𞹨' => 'Ø·', + '𞹩' => 'ÙŠ', + '𞹪' => 'Ùƒ', + '𞹬' => 'Ù…', + 'ðž¹­' => 'Ù†', + 'ðž¹®' => 'س', + '𞹯' => 'ع', + 'ðž¹°' => 'Ù', + 'ðž¹±' => 'ص', + 'ðž¹²' => 'Ù‚', + 'ðž¹´' => 'Ø´', + 'ðž¹µ' => 'ت', + 'ðž¹¶' => 'Ø«', + 'ðž¹·' => 'Ø®', + 'ðž¹¹' => 'ض', + '𞹺' => 'ظ', + 'ðž¹»' => 'غ', + 'ðž¹¼' => 'Ù®', + 'ðž¹¾' => 'Ú¡', + '𞺀' => 'ا', + 'ðžº' => 'ب', + '𞺂' => 'ج', + '𞺃' => 'د', + '𞺄' => 'Ù‡', + '𞺅' => 'Ùˆ', + '𞺆' => 'ز', + '𞺇' => 'Ø­', + '𞺈' => 'Ø·', + '𞺉' => 'ÙŠ', + '𞺋' => 'Ù„', + '𞺌' => 'Ù…', + 'ðžº' => 'Ù†', + '𞺎' => 'س', + 'ðžº' => 'ع', + 'ðžº' => 'Ù', + '𞺑' => 'ص', + '𞺒' => 'Ù‚', + '𞺓' => 'ر', + '𞺔' => 'Ø´', + '𞺕' => 'ت', + '𞺖' => 'Ø«', + '𞺗' => 'Ø®', + '𞺘' => 'ذ', + '𞺙' => 'ض', + '𞺚' => 'ظ', + '𞺛' => 'غ', + '𞺡' => 'ب', + '𞺢' => 'ج', + '𞺣' => 'د', + '𞺥' => 'Ùˆ', + '𞺦' => 'ز', + '𞺧' => 'Ø­', + '𞺨' => 'Ø·', + '𞺩' => 'ÙŠ', + '𞺫' => 'Ù„', + '𞺬' => 'Ù…', + '𞺭' => 'Ù†', + '𞺮' => 'س', + '𞺯' => 'ع', + '𞺰' => 'Ù', + '𞺱' => 'ص', + '𞺲' => 'Ù‚', + '𞺳' => 'ر', + '𞺴' => 'Ø´', + '𞺵' => 'ت', + '𞺶' => 'Ø«', + '𞺷' => 'Ø®', + '𞺸' => 'ذ', + '𞺹' => 'ض', + '𞺺' => 'ظ', + '𞺻' => 'غ', + '🄀' => '0.', + 'ðŸ„' => '0,', + '🄂' => '1,', + '🄃' => '2,', + '🄄' => '3,', + '🄅' => '4,', + '🄆' => '5,', + '🄇' => '6,', + '🄈' => '7,', + '🄉' => '8,', + '🄊' => '9,', + 'ðŸ„' => '(A)', + '🄑' => '(B)', + '🄒' => '(C)', + '🄓' => '(D)', + '🄔' => '(E)', + '🄕' => '(F)', + '🄖' => '(G)', + '🄗' => '(H)', + '🄘' => '(I)', + '🄙' => '(J)', + '🄚' => '(K)', + '🄛' => '(L)', + '🄜' => '(M)', + 'ðŸ„' => '(N)', + '🄞' => '(O)', + '🄟' => '(P)', + '🄠' => '(Q)', + '🄡' => '(R)', + '🄢' => '(S)', + '🄣' => '(T)', + '🄤' => '(U)', + '🄥' => '(V)', + '🄦' => '(W)', + '🄧' => '(X)', + '🄨' => '(Y)', + '🄩' => '(Z)', + '🄪' => '〔S〕', + '🄫' => 'C', + '🄬' => 'R', + '🄭' => 'CD', + '🄮' => 'WZ', + '🄰' => 'A', + '🄱' => 'B', + '🄲' => 'C', + '🄳' => 'D', + '🄴' => 'E', + '🄵' => 'F', + '🄶' => 'G', + '🄷' => 'H', + '🄸' => 'I', + '🄹' => 'J', + '🄺' => 'K', + '🄻' => 'L', + '🄼' => 'M', + '🄽' => 'N', + '🄾' => 'O', + '🄿' => 'P', + '🅀' => 'Q', + 'ðŸ…' => 'R', + '🅂' => 'S', + '🅃' => 'T', + '🅄' => 'U', + '🅅' => 'V', + '🅆' => 'W', + '🅇' => 'X', + '🅈' => 'Y', + '🅉' => 'Z', + '🅊' => 'HV', + '🅋' => 'MV', + '🅌' => 'SD', + 'ðŸ…' => 'SS', + '🅎' => 'PPV', + 'ðŸ…' => 'WC', + '🅪' => 'MC', + '🅫' => 'MD', + '🅬' => 'MR', + 'ðŸ†' => 'DJ', + '🈀' => 'ã»ã‹', + 'ðŸˆ' => 'ココ', + '🈂' => 'サ', + 'ðŸˆ' => '手', + '🈑' => 'å­—', + '🈒' => 'åŒ', + '🈓' => 'デ', + '🈔' => '二', + '🈕' => '多', + '🈖' => 'è§£', + '🈗' => '天', + '🈘' => '交', + '🈙' => '映', + '🈚' => 'ç„¡', + '🈛' => 'æ–™', + '🈜' => 'å‰', + 'ðŸˆ' => '後', + '🈞' => 'å†', + '🈟' => 'æ–°', + '🈠' => 'åˆ', + '🈡' => '終', + '🈢' => '生', + '🈣' => '販', + '🈤' => '声', + '🈥' => 'å¹', + '🈦' => 'æ¼”', + '🈧' => '投', + '🈨' => 'æ•', + '🈩' => '一', + '🈪' => '三', + '🈫' => 'éŠ', + '🈬' => 'å·¦', + '🈭' => '中', + '🈮' => 'å³', + '🈯' => '指', + '🈰' => 'èµ°', + '🈱' => '打', + '🈲' => 'ç¦', + '🈳' => '空', + '🈴' => 'åˆ', + '🈵' => '満', + '🈶' => '有', + '🈷' => '月', + '🈸' => '申', + '🈹' => '割', + '🈺' => 'å–¶', + '🈻' => 'é…', + '🉀' => '〔本〕', + 'ðŸ‰' => '〔三〕', + '🉂' => '〔二〕', + '🉃' => '〔安〕', + '🉄' => '〔点〕', + '🉅' => '〔打〕', + '🉆' => '〔盗〕', + '🉇' => '〔å‹ã€•', + '🉈' => '〔敗〕', + 'ðŸ‰' => 'å¾—', + '🉑' => 'å¯', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/bootstrap.php b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php new file mode 100644 index 0000000..ba62006 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Normalizer as p; + +if (!function_exists('normalizer_is_normalized')) { + function normalizer_is_normalized($s, $form = p\Normalizer::NFC) { return p\Normalizer::isNormalized($s, $form); } +} +if (!function_exists('normalizer_normalize')) { + function normalizer_normalize($s, $form = p\Normalizer::NFC) { return p\Normalizer::normalize($s, $form); } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/composer.json b/vendor/symfony/polyfill-intl-normalizer/composer.json new file mode 100644 index 0000000..863fe35 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/polyfill-intl-normalizer", + "type": "library", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "normalizer"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + } +} diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php new file mode 100644 index 0000000..15503bc --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -0,0 +1,847 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Mbstring; + +/** + * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. + * + * Implemented: + * - mb_chr - Returns a specific character from its Unicode code point + * - mb_convert_encoding - Convert character encoding + * - mb_convert_variables - Convert character code in variable(s) + * - mb_decode_mimeheader - Decode string in MIME header field + * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED + * - mb_decode_numericentity - Decode HTML numeric string reference to character + * - mb_encode_numericentity - Encode character to HTML numeric string reference + * - mb_convert_case - Perform case folding on a string + * - mb_detect_encoding - Detect character encoding + * - mb_get_info - Get internal settings of mbstring + * - mb_http_input - Detect HTTP input character encoding + * - mb_http_output - Set/Get HTTP output character encoding + * - mb_internal_encoding - Set/Get internal character encoding + * - mb_list_encodings - Returns an array of all supported encodings + * - mb_ord - Returns the Unicode code point of a character + * - mb_output_handler - Callback function converts character encoding in output buffer + * - mb_scrub - Replaces ill-formed byte sequences with substitute characters + * - mb_strlen - Get string length + * - mb_strpos - Find position of first occurrence of string in a string + * - mb_strrpos - Find position of last occurrence of a string in a string + * - mb_str_split - Convert a string to an array + * - mb_strtolower - Make a string lowercase + * - mb_strtoupper - Make a string uppercase + * - mb_substitute_character - Set/Get substitution character + * - mb_substr - Get part of string + * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive + * - mb_stristr - Finds first occurrence of a string within another, case insensitive + * - mb_strrchr - Finds the last occurrence of a character in a string within another + * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive + * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive + * - mb_strstr - Finds first occurrence of a string within another + * - mb_strwidth - Return width of string + * - mb_substr_count - Count the number of substring occurrences + * + * Not implemented: + * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * - mb_ereg_* - Regular expression with multibyte support + * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable + * - mb_preferred_mime_name - Get MIME charset string + * - mb_regex_encoding - Returns current encoding for multibyte regex as string + * - mb_regex_set_options - Set/Get the default options for mbregex functions + * - mb_send_mail - Send encoded mail + * - mb_split - Split multibyte string using regular expression + * - mb_strcut - Get part of string + * - mb_strimwidth - Get truncated string with specified width + * + * @author Nicolas Grekas + * + * @internal + */ +final class Mbstring +{ + const MB_CASE_FOLD = PHP_INT_MAX; + + private static $encodingList = array('ASCII', 'UTF-8'); + private static $language = 'neutral'; + private static $internalEncoding = 'UTF-8'; + private static $caseFold = array( + array('µ', 'Å¿', "\xCD\x85", 'Ï‚', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"), + array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'Ï€', 'κ', 'Ï', 'ε', "\xE1\xB9\xA1", 'ι'), + ); + + public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) + { + if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) { + $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); + } else { + $fromEncoding = self::getEncoding($fromEncoding); + } + + $toEncoding = self::getEncoding($toEncoding); + + if ('BASE64' === $fromEncoding) { + $s = base64_decode($s); + $fromEncoding = $toEncoding; + } + + if ('BASE64' === $toEncoding) { + return base64_encode($s); + } + + if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { + if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { + $fromEncoding = 'Windows-1252'; + } + if ('UTF-8' !== $fromEncoding) { + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); + } + + return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s); + } + + if ('HTML-ENTITIES' === $fromEncoding) { + $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8'); + $fromEncoding = 'UTF-8'; + } + + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + } + + public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) + { + $vars = array(&$a, &$b, &$c, &$d, &$e, &$f); + + $ok = true; + array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { + if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { + $ok = false; + } + }); + + return $ok ? $fromEncoding : false; + } + + public static function mb_decode_mimeheader($s) + { + return iconv_mime_decode($s, 2, self::$internalEncoding); + } + + public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) + { + trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING); + } + + public static function mb_decode_numericentity($s, $convmap, $encoding = null) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { + trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || !$convmap) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); + + return ''; // Instead of null (cf. mb_encode_numericentity). + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $cnt = floor(\count($convmap) / 4) * 4; + + for ($i = 0; $i < $cnt; $i += 4) { + // collector_decode_htmlnumericentity ignores $convmap[$i + 3] + $convmap[$i] += $convmap[$i + 2]; + $convmap[$i + 1] += $convmap[$i + 2]; + } + + $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { + $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; + for ($i = 0; $i < $cnt; $i += 4) { + if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { + return Mbstring::mb_chr($c - $convmap[$i + 2]); + } + } + + return $m[0]; + }, $s); + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { + trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || !$convmap) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); + + return null; // Instead of '' (cf. mb_decode_numericentity). + } + + if (null !== $is_hex && !\is_scalar($is_hex)) { + trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING); + + return null; + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); + + $cnt = floor(\count($convmap) / 4) * 4; + $i = 0; + $len = \strlen($s); + $result = ''; + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + $c = self::mb_ord($uchr); + + for ($j = 0; $j < $cnt; $j += 4) { + if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { + $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; + $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; + continue 2; + } + } + $result .= $uchr; + } + + if (null === $encoding) { + return $result; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $result); + } + + public static function mb_convert_case($s, $mode, $encoding = null) + { + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + if (MB_CASE_TITLE == $mode) { + static $titleRegexp = null; + if (null === $titleRegexp) { + $titleRegexp = self::getData('titleCaseRegexp'); + } + $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s); + } else { + if (MB_CASE_UPPER == $mode) { + static $upper = null; + if (null === $upper) { + $upper = self::getData('upperCase'); + } + $map = $upper; + } else { + if (self::MB_CASE_FOLD === $mode) { + $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s); + } + + static $lower = null; + if (null === $lower) { + $lower = self::getData('lowerCase'); + } + $map = $lower; + } + + static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); + + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($map[$uchr])) { + $uchr = $map[$uchr]; + $nlen = \strlen($uchr); + + if ($nlen == $ulen) { + $nlen = $i; + do { + $s[--$nlen] = $uchr[--$ulen]; + } while ($ulen); + } else { + $s = substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_internal_encoding($encoding = null) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) { + self::$internalEncoding = $encoding; + + return true; + } + + return false; + } + + public static function mb_language($lang = null) + { + if (null === $lang) { + return self::$language; + } + + switch ($lang = strtolower($lang)) { + case 'uni': + case 'neutral': + self::$language = $lang; + + return true; + } + + return false; + } + + public static function mb_list_encodings() + { + return array('UTF-8'); + } + + public static function mb_encoding_aliases($encoding) + { + switch (strtoupper($encoding)) { + case 'UTF8': + case 'UTF-8': + return array('utf8'); + } + + return false; + } + + public static function mb_check_encoding($var = null, $encoding = null) + { + if (null === $encoding) { + if (null === $var) { + return false; + } + $encoding = self::$internalEncoding; + } + + return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var); + } + + public static function mb_detect_encoding($str, $encodingList = null, $strict = false) + { + if (null === $encodingList) { + $encodingList = self::$encodingList; + } else { + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + } + + foreach ($encodingList as $enc) { + switch ($enc) { + case 'ASCII': + if (!preg_match('/[\x80-\xFF]/', $str)) { + return $enc; + } + break; + + case 'UTF8': + case 'UTF-8': + if (preg_match('//u', $str)) { + return 'UTF-8'; + } + break; + + default: + if (0 === strncmp($enc, 'ISO-8859-', 9)) { + return $enc; + } + } + } + + return false; + } + + public static function mb_detect_order($encodingList = null) + { + if (null === $encodingList) { + return self::$encodingList; + } + + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + + foreach ($encodingList as $enc) { + switch ($enc) { + default: + if (strncmp($enc, 'ISO-8859-', 9)) { + return false; + } + // no break + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + + self::$encodingList = $encodingList; + + return true; + } + + public static function mb_strlen($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strlen($s); + } + + return @iconv_strlen($s, $encoding); + } + + public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strpos($haystack, $needle, $offset); + } + + $needle = (string) $needle; + if ('' === $needle) { + trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING); + + return false; + } + + return iconv_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strrpos($haystack, $needle, $offset); + } + + if ($offset != (int) $offset) { + $offset = 0; + } elseif ($offset = (int) $offset) { + if ($offset < 0) { + if (0 > $offset += self::mb_strlen($needle)) { + $haystack = self::mb_substr($haystack, 0, $offset, $encoding); + } + $offset = 0; + } else { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + } + + $pos = iconv_strrpos($haystack, $needle, $encoding); + + return false !== $pos ? $offset + $pos : false; + } + + public static function mb_str_split($string, $split_length = 1, $encoding = null) + { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { + trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING); + + return null; + } + + if (1 > $split_length = (int) $split_length) { + trigger_error('The length of each segment must be greater than zero', E_USER_WARNING); + + return false; + } + + if (null === $encoding) { + $encoding = mb_internal_encoding(); + } + + if ('UTF-8' === $encoding = self::getEncoding($encoding)) { + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{'.$split_length.'})/us'; + + return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + } + + $result = array(); + $length = mb_strlen($string, $encoding); + + for ($i = 0; $i < $length; $i += $split_length) { + $result[] = mb_substr($string, $i, $split_length, $encoding); + } + + return $result; + } + + public static function mb_strtolower($s, $encoding = null) + { + return self::mb_convert_case($s, MB_CASE_LOWER, $encoding); + } + + public static function mb_strtoupper($s, $encoding = null) + { + return self::mb_convert_case($s, MB_CASE_UPPER, $encoding); + } + + public static function mb_substitute_character($c = null) + { + if (0 === strcasecmp($c, 'none')) { + return true; + } + + return null !== $c ? false : 'none'; + } + + public static function mb_substr($s, $start, $length = null, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return (string) substr($s, $start, null === $length ? 2147483647 : $length); + } + + if ($start < 0) { + $start = iconv_strlen($s, $encoding) + $start; + if ($start < 0) { + $start = 0; + } + } + + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = iconv_strlen($s, $encoding) + $length - $start; + if ($length < 0) { + return ''; + } + } + + return (string) iconv_substr($s, $start, $length, $encoding); + } + + public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); + $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strrchr($haystack, $needle, $part); + } + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); + $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) + { + $pos = strpos($haystack, $needle); + if (false === $pos) { + return false; + } + if ($part) { + return substr($haystack, 0, $pos); + } + + return substr($haystack, $pos); + } + + public static function mb_get_info($type = 'all') + { + $info = array( + 'internal_encoding' => self::$internalEncoding, + 'http_output' => 'pass', + 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', + 'func_overload' => 0, + 'func_overload_list' => 'no overload', + 'mail_charset' => 'UTF-8', + 'mail_header_encoding' => 'BASE64', + 'mail_body_encoding' => 'BASE64', + 'illegal_chars' => 0, + 'encoding_translation' => 'Off', + 'language' => self::$language, + 'detect_order' => self::$encodingList, + 'substitute_character' => 'none', + 'strict_detection' => 'Off', + ); + + if ('all' === $type) { + return $info; + } + if (isset($info[$type])) { + return $info[$type]; + } + + return false; + } + + public static function mb_http_input($type = '') + { + return false; + } + + public static function mb_http_output($encoding = null) + { + return null !== $encoding ? 'pass' === $encoding : 'pass'; + } + + public static function mb_strwidth($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + + if ('UTF-8' !== $encoding) { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); + + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); + } + + public static function mb_substr_count($haystack, $needle, $encoding = null) + { + return substr_count($haystack, $needle); + } + + public static function mb_output_handler($contents, $status) + { + return $contents; + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } + + private static function getSubpart($pos, $part, $haystack, $encoding) + { + if (false === $pos) { + return false; + } + if ($part) { + return self::mb_substr($haystack, 0, $pos, $encoding); + } + + return self::mb_substr($haystack, $pos, null, $encoding); + } + + private static function html_encoding_callback(array $m) + { + $i = 1; + $entities = ''; + $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8')); + + while (isset($m[$i])) { + if (0x80 > $m[$i]) { + $entities .= \chr($m[$i++]); + continue; + } + if (0xF0 <= $m[$i]) { + $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } elseif (0xE0 <= $m[$i]) { + $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } else { + $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; + } + + $entities .= '&#'.$c.';'; + } + + return $entities; + } + + private static function title_case(array $s) + { + return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8'); + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } + + private static function getEncoding($encoding) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + if ('UTF-8' === $encoding) { + return 'UTF-8'; + } + + $encoding = strtoupper($encoding); + + if ('8BIT' === $encoding || 'BINARY' === $encoding) { + return 'CP850'; + } + + if ('UTF8' === $encoding) { + return 'UTF-8'; + } + + return $encoding; + } +} diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md new file mode 100644 index 0000000..4efb599 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/README.md @@ -0,0 +1,13 @@ +Symfony Polyfill / Mbstring +=========================== + +This component provides a partial, native PHP implementation for the +[Mbstring](https://php.net/mbstring) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php new file mode 100644 index 0000000..a22eca5 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -0,0 +1,1397 @@ + 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + 'À' => 'à', + 'Ã' => 'á', + 'Â' => 'â', + 'Ã' => 'ã', + 'Ä' => 'ä', + 'Ã…' => 'Ã¥', + 'Æ' => 'æ', + 'Ç' => 'ç', + 'È' => 'è', + 'É' => 'é', + 'Ê' => 'ê', + 'Ë' => 'ë', + 'ÃŒ' => 'ì', + 'Ã' => 'í', + 'ÃŽ' => 'î', + 'Ã' => 'ï', + 'Ã' => 'ð', + 'Ñ' => 'ñ', + 'Ã’' => 'ò', + 'Ó' => 'ó', + 'Ô' => 'ô', + 'Õ' => 'õ', + 'Ö' => 'ö', + 'Ø' => 'ø', + 'Ù' => 'ù', + 'Ú' => 'ú', + 'Û' => 'û', + 'Ü' => 'ü', + 'Ã' => 'ý', + 'Þ' => 'þ', + 'Ä€' => 'Ä', + 'Ä‚' => 'ă', + 'Ä„' => 'Ä…', + 'Ć' => 'ć', + 'Ĉ' => 'ĉ', + 'ÄŠ' => 'Ä‹', + 'ÄŒ' => 'Ä', + 'ÄŽ' => 'Ä', + 'Ä' => 'Ä‘', + 'Ä’' => 'Ä“', + 'Ä”' => 'Ä•', + 'Ä–' => 'Ä—', + 'Ę' => 'Ä™', + 'Äš' => 'Ä›', + 'Äœ' => 'Ä', + 'Äž' => 'ÄŸ', + 'Ä ' => 'Ä¡', + 'Ä¢' => 'Ä£', + 'Ĥ' => 'Ä¥', + 'Ħ' => 'ħ', + 'Ĩ' => 'Ä©', + 'Ī' => 'Ä«', + 'Ĭ' => 'Ä­', + 'Ä®' => 'į', + 'İ' => 'i', + 'IJ' => 'ij', + 'Ä´' => 'ĵ', + 'Ķ' => 'Ä·', + 'Ĺ' => 'ĺ', + 'Ä»' => 'ļ', + 'Ľ' => 'ľ', + 'Ä¿' => 'Å€', + 'Å' => 'Å‚', + 'Ń' => 'Å„', + 'Å…' => 'ņ', + 'Ň' => 'ň', + 'ÅŠ' => 'Å‹', + 'ÅŒ' => 'Å', + 'ÅŽ' => 'Å', + 'Å' => 'Å‘', + 'Å’' => 'Å“', + 'Å”' => 'Å•', + 'Å–' => 'Å—', + 'Ř' => 'Å™', + 'Åš' => 'Å›', + 'Åœ' => 'Å', + 'Åž' => 'ÅŸ', + 'Å ' => 'Å¡', + 'Å¢' => 'Å£', + 'Ť' => 'Å¥', + 'Ŧ' => 'ŧ', + 'Ũ' => 'Å©', + 'Ū' => 'Å«', + 'Ŭ' => 'Å­', + 'Å®' => 'ů', + 'Ű' => 'ű', + 'Ų' => 'ų', + 'Å´' => 'ŵ', + 'Ŷ' => 'Å·', + 'Ÿ' => 'ÿ', + 'Ź' => 'ź', + 'Å»' => 'ż', + 'Ž' => 'ž', + 'Æ' => 'É“', + 'Æ‚' => 'ƃ', + 'Æ„' => 'Æ…', + 'Ɔ' => 'É”', + 'Ƈ' => 'ƈ', + 'Ɖ' => 'É–', + 'ÆŠ' => 'É—', + 'Æ‹' => 'ÆŒ', + 'ÆŽ' => 'Ç', + 'Æ' => 'É™', + 'Æ' => 'É›', + 'Æ‘' => 'Æ’', + 'Æ“' => 'É ', + 'Æ”' => 'É£', + 'Æ–' => 'É©', + 'Æ—' => 'ɨ', + 'Ƙ' => 'Æ™', + 'Æœ' => 'ɯ', + 'Æ' => 'ɲ', + 'ÆŸ' => 'ɵ', + 'Æ ' => 'Æ¡', + 'Æ¢' => 'Æ£', + 'Ƥ' => 'Æ¥', + 'Ʀ' => 'Ê€', + 'Ƨ' => 'ƨ', + 'Æ©' => 'ʃ', + 'Ƭ' => 'Æ­', + 'Æ®' => 'ʈ', + 'Ư' => 'ư', + 'Ʊ' => 'ÊŠ', + 'Ʋ' => 'Ê‹', + 'Ƴ' => 'Æ´', + 'Ƶ' => 'ƶ', + 'Æ·' => 'Ê’', + 'Ƹ' => 'ƹ', + 'Ƽ' => 'ƽ', + 'Ç„' => 'dž', + 'Ç…' => 'dž', + 'LJ' => 'lj', + 'Lj' => 'lj', + 'ÇŠ' => 'ÇŒ', + 'Ç‹' => 'ÇŒ', + 'Ç' => 'ÇŽ', + 'Ç' => 'Ç', + 'Ç‘' => 'Ç’', + 'Ç“' => 'Ç”', + 'Ç•' => 'Ç–', + 'Ç—' => 'ǘ', + 'Ç™' => 'Çš', + 'Ç›' => 'Çœ', + 'Çž' => 'ÇŸ', + 'Ç ' => 'Ç¡', + 'Ç¢' => 'Ç£', + 'Ǥ' => 'Ç¥', + 'Ǧ' => 'ǧ', + 'Ǩ' => 'Ç©', + 'Ǫ' => 'Ç«', + 'Ǭ' => 'Ç­', + 'Ç®' => 'ǯ', + 'DZ' => 'dz', + 'Dz' => 'dz', + 'Ç´' => 'ǵ', + 'Ƕ' => 'Æ•', + 'Ç·' => 'Æ¿', + 'Ǹ' => 'ǹ', + 'Ǻ' => 'Ç»', + 'Ǽ' => 'ǽ', + 'Ǿ' => 'Ç¿', + 'È€' => 'È', + 'È‚' => 'ȃ', + 'È„' => 'È…', + 'Ȇ' => 'ȇ', + 'Ȉ' => 'ȉ', + 'ÈŠ' => 'È‹', + 'ÈŒ' => 'È', + 'ÈŽ' => 'È', + 'È' => 'È‘', + 'È’' => 'È“', + 'È”' => 'È•', + 'È–' => 'È—', + 'Ș' => 'È™', + 'Èš' => 'È›', + 'Èœ' => 'È', + 'Èž' => 'ÈŸ', + 'È ' => 'Æž', + 'È¢' => 'È£', + 'Ȥ' => 'È¥', + 'Ȧ' => 'ȧ', + 'Ȩ' => 'È©', + 'Ȫ' => 'È«', + 'Ȭ' => 'È­', + 'È®' => 'ȯ', + 'Ȱ' => 'ȱ', + 'Ȳ' => 'ȳ', + 'Ⱥ' => 'â±¥', + 'È»' => 'ȼ', + 'Ƚ' => 'Æš', + 'Ⱦ' => 'ⱦ', + 'É' => 'É‚', + 'Ƀ' => 'Æ€', + 'É„' => 'ʉ', + 'É…' => 'ÊŒ', + 'Ɇ' => 'ɇ', + 'Ɉ' => 'ɉ', + 'ÉŠ' => 'É‹', + 'ÉŒ' => 'É', + 'ÉŽ' => 'É', + 'Ͱ' => 'ͱ', + 'Ͳ' => 'ͳ', + 'Ͷ' => 'Í·', + 'Í¿' => 'ϳ', + 'Ά' => 'ά', + 'Έ' => 'έ', + 'Ή' => 'ή', + 'Ί' => 'ί', + 'ÎŒ' => 'ÏŒ', + 'ÎŽ' => 'Ï', + 'Î' => 'ÏŽ', + 'Α' => 'α', + 'Î’' => 'β', + 'Γ' => 'γ', + 'Δ' => 'δ', + 'Ε' => 'ε', + 'Ζ' => 'ζ', + 'Η' => 'η', + 'Θ' => 'θ', + 'Ι' => 'ι', + 'Κ' => 'κ', + 'Λ' => 'λ', + 'Μ' => 'μ', + 'Î' => 'ν', + 'Ξ' => 'ξ', + 'Ο' => 'ο', + 'Π' => 'Ï€', + 'Ρ' => 'Ï', + 'Σ' => 'σ', + 'Τ' => 'Ï„', + 'Î¥' => 'Ï…', + 'Φ' => 'φ', + 'Χ' => 'χ', + 'Ψ' => 'ψ', + 'Ω' => 'ω', + 'Ϊ' => 'ÏŠ', + 'Ϋ' => 'Ï‹', + 'Ï' => 'Ï—', + 'Ϙ' => 'Ï™', + 'Ïš' => 'Ï›', + 'Ïœ' => 'Ï', + 'Ïž' => 'ÏŸ', + 'Ï ' => 'Ï¡', + 'Ï¢' => 'Ï£', + 'Ϥ' => 'Ï¥', + 'Ϧ' => 'ϧ', + 'Ϩ' => 'Ï©', + 'Ϫ' => 'Ï«', + 'Ϭ' => 'Ï­', + 'Ï®' => 'ϯ', + 'Ï´' => 'θ', + 'Ï·' => 'ϸ', + 'Ϲ' => 'ϲ', + 'Ϻ' => 'Ï»', + 'Ͻ' => 'Í»', + 'Ͼ' => 'ͼ', + 'Ï¿' => 'ͽ', + 'Ѐ' => 'Ñ', + 'Ð' => 'Ñ‘', + 'Ђ' => 'Ñ’', + 'Ѓ' => 'Ñ“', + 'Є' => 'Ñ”', + 'Ð…' => 'Ñ•', + 'І' => 'Ñ–', + 'Ї' => 'Ñ—', + 'Ј' => 'ј', + 'Љ' => 'Ñ™', + 'Њ' => 'Ñš', + 'Ћ' => 'Ñ›', + 'ÐŒ' => 'Ñœ', + 'Ð' => 'Ñ', + 'ÐŽ' => 'Ñž', + 'Ð' => 'ÑŸ', + 'Ð' => 'а', + 'Б' => 'б', + 'Ð’' => 'в', + 'Г' => 'г', + 'Д' => 'д', + 'Е' => 'е', + 'Ж' => 'ж', + 'З' => 'з', + 'И' => 'и', + 'Й' => 'й', + 'К' => 'к', + 'Л' => 'л', + 'М' => 'м', + 'Ð' => 'н', + 'О' => 'о', + 'П' => 'п', + 'Р' => 'Ñ€', + 'С' => 'Ñ', + 'Т' => 'Ñ‚', + 'У' => 'у', + 'Ф' => 'Ñ„', + 'Ð¥' => 'Ñ…', + 'Ц' => 'ц', + 'Ч' => 'ч', + 'Ш' => 'ш', + 'Щ' => 'щ', + 'Ъ' => 'ÑŠ', + 'Ы' => 'Ñ‹', + 'Ь' => 'ÑŒ', + 'Э' => 'Ñ', + 'Ю' => 'ÑŽ', + 'Я' => 'Ñ', + 'Ñ ' => 'Ñ¡', + 'Ñ¢' => 'Ñ£', + 'Ѥ' => 'Ñ¥', + 'Ѧ' => 'ѧ', + 'Ѩ' => 'Ñ©', + 'Ѫ' => 'Ñ«', + 'Ѭ' => 'Ñ­', + 'Ñ®' => 'ѯ', + 'Ѱ' => 'ѱ', + 'Ѳ' => 'ѳ', + 'Ñ´' => 'ѵ', + 'Ѷ' => 'Ñ·', + 'Ѹ' => 'ѹ', + 'Ѻ' => 'Ñ»', + 'Ѽ' => 'ѽ', + 'Ѿ' => 'Ñ¿', + 'Ò€' => 'Ò', + 'ÒŠ' => 'Ò‹', + 'ÒŒ' => 'Ò', + 'ÒŽ' => 'Ò', + 'Ò' => 'Ò‘', + 'Ò’' => 'Ò“', + 'Ò”' => 'Ò•', + 'Ò–' => 'Ò—', + 'Ò˜' => 'Ò™', + 'Òš' => 'Ò›', + 'Òœ' => 'Ò', + 'Òž' => 'ÒŸ', + 'Ò ' => 'Ò¡', + 'Ò¢' => 'Ò£', + 'Ò¤' => 'Ò¥', + 'Ò¦' => 'Ò§', + 'Ò¨' => 'Ò©', + 'Òª' => 'Ò«', + 'Ò¬' => 'Ò­', + 'Ò®' => 'Ò¯', + 'Ò°' => 'Ò±', + 'Ò²' => 'Ò³', + 'Ò´' => 'Òµ', + 'Ò¶' => 'Ò·', + 'Ò¸' => 'Ò¹', + 'Òº' => 'Ò»', + 'Ò¼' => 'Ò½', + 'Ò¾' => 'Ò¿', + 'Ó€' => 'Ó', + 'Ó' => 'Ó‚', + 'Óƒ' => 'Ó„', + 'Ó…' => 'Ó†', + 'Ó‡' => 'Óˆ', + 'Ó‰' => 'ÓŠ', + 'Ó‹' => 'ÓŒ', + 'Ó' => 'ÓŽ', + 'Ó' => 'Ó‘', + 'Ó’' => 'Ó“', + 'Ó”' => 'Ó•', + 'Ó–' => 'Ó—', + 'Ó˜' => 'Ó™', + 'Óš' => 'Ó›', + 'Óœ' => 'Ó', + 'Óž' => 'ÓŸ', + 'Ó ' => 'Ó¡', + 'Ó¢' => 'Ó£', + 'Ó¤' => 'Ó¥', + 'Ó¦' => 'Ó§', + 'Ó¨' => 'Ó©', + 'Óª' => 'Ó«', + 'Ó¬' => 'Ó­', + 'Ó®' => 'Ó¯', + 'Ó°' => 'Ó±', + 'Ó²' => 'Ó³', + 'Ó´' => 'Óµ', + 'Ó¶' => 'Ó·', + 'Ó¸' => 'Ó¹', + 'Óº' => 'Ó»', + 'Ó¼' => 'Ó½', + 'Ó¾' => 'Ó¿', + 'Ô€' => 'Ô', + 'Ô‚' => 'Ôƒ', + 'Ô„' => 'Ô…', + 'Ô†' => 'Ô‡', + 'Ôˆ' => 'Ô‰', + 'ÔŠ' => 'Ô‹', + 'ÔŒ' => 'Ô', + 'ÔŽ' => 'Ô', + 'Ô' => 'Ô‘', + 'Ô’' => 'Ô“', + 'Ô”' => 'Ô•', + 'Ô–' => 'Ô—', + 'Ô˜' => 'Ô™', + 'Ôš' => 'Ô›', + 'Ôœ' => 'Ô', + 'Ôž' => 'ÔŸ', + 'Ô ' => 'Ô¡', + 'Ô¢' => 'Ô£', + 'Ô¤' => 'Ô¥', + 'Ô¦' => 'Ô§', + 'Ô¨' => 'Ô©', + 'Ôª' => 'Ô«', + 'Ô¬' => 'Ô­', + 'Ô®' => 'Ô¯', + 'Ô±' => 'Õ¡', + 'Ô²' => 'Õ¢', + 'Ô³' => 'Õ£', + 'Ô´' => 'Õ¤', + 'Ôµ' => 'Õ¥', + 'Ô¶' => 'Õ¦', + 'Ô·' => 'Õ§', + 'Ô¸' => 'Õ¨', + 'Ô¹' => 'Õ©', + 'Ôº' => 'Õª', + 'Ô»' => 'Õ«', + 'Ô¼' => 'Õ¬', + 'Ô½' => 'Õ­', + 'Ô¾' => 'Õ®', + 'Ô¿' => 'Õ¯', + 'Õ€' => 'Õ°', + 'Õ' => 'Õ±', + 'Õ‚' => 'Õ²', + 'Õƒ' => 'Õ³', + 'Õ„' => 'Õ´', + 'Õ…' => 'Õµ', + 'Õ†' => 'Õ¶', + 'Õ‡' => 'Õ·', + 'Õˆ' => 'Õ¸', + 'Õ‰' => 'Õ¹', + 'ÕŠ' => 'Õº', + 'Õ‹' => 'Õ»', + 'ÕŒ' => 'Õ¼', + 'Õ' => 'Õ½', + 'ÕŽ' => 'Õ¾', + 'Õ' => 'Õ¿', + 'Õ' => 'Ö€', + 'Õ‘' => 'Ö', + 'Õ’' => 'Ö‚', + 'Õ“' => 'Öƒ', + 'Õ”' => 'Ö„', + 'Õ•' => 'Ö…', + 'Õ–' => 'Ö†', + 'á‚ ' => 'â´€', + 'á‚¡' => 'â´', + 'á‚¢' => 'â´‚', + 'á‚£' => 'â´ƒ', + 'Ⴄ' => 'â´„', + 'á‚¥' => 'â´…', + 'Ⴆ' => 'â´†', + 'á‚§' => 'â´‡', + 'Ⴈ' => 'â´ˆ', + 'á‚©' => 'â´‰', + 'Ⴊ' => 'â´Š', + 'á‚«' => 'â´‹', + 'Ⴌ' => 'â´Œ', + 'á‚­' => 'â´', + 'á‚®' => 'â´Ž', + 'Ⴏ' => 'â´', + 'á‚°' => 'â´', + 'Ⴑ' => 'â´‘', + 'Ⴒ' => 'â´’', + 'Ⴓ' => 'â´“', + 'á‚´' => 'â´”', + 'Ⴕ' => 'â´•', + 'á‚¶' => 'â´–', + 'á‚·' => 'â´—', + 'Ⴘ' => 'â´˜', + 'Ⴙ' => 'â´™', + 'Ⴚ' => 'â´š', + 'á‚»' => 'â´›', + 'Ⴜ' => 'â´œ', + 'Ⴝ' => 'â´', + 'Ⴞ' => 'â´ž', + 'á‚¿' => 'â´Ÿ', + 'Ⴠ' => 'â´ ', + 'áƒ' => 'â´¡', + 'Ⴢ' => 'â´¢', + 'Ⴣ' => 'â´£', + 'Ⴤ' => 'â´¤', + 'Ⴥ' => 'â´¥', + 'Ⴧ' => 'â´§', + 'áƒ' => 'â´­', + 'Ꭰ' => 'ê­°', + 'Ꭱ' => 'ê­±', + 'Ꭲ' => 'ê­²', + 'Ꭳ' => 'ê­³', + 'Ꭴ' => 'ê­´', + 'Ꭵ' => 'ê­µ', + 'Ꭶ' => 'ê­¶', + 'Ꭷ' => 'ê­·', + 'Ꭸ' => 'ê­¸', + 'Ꭹ' => 'ê­¹', + 'Ꭺ' => 'ê­º', + 'Ꭻ' => 'ê­»', + 'Ꭼ' => 'ê­¼', + 'Ꭽ' => 'ê­½', + 'Ꭾ' => 'ê­¾', + 'Ꭿ' => 'ê­¿', + 'Ꮀ' => 'ꮀ', + 'Ꮁ' => 'ê®', + 'Ꮂ' => 'ꮂ', + 'Ꮃ' => 'ꮃ', + 'Ꮄ' => 'ꮄ', + 'Ꮅ' => 'ê®…', + 'Ꮆ' => 'ꮆ', + 'Ꮇ' => 'ꮇ', + 'Ꮈ' => 'ꮈ', + 'Ꮉ' => 'ꮉ', + 'Ꮊ' => 'ꮊ', + 'Ꮋ' => 'ꮋ', + 'Ꮌ' => 'ꮌ', + 'Ꮍ' => 'ê®', + 'Ꮎ' => 'ꮎ', + 'Ꮏ' => 'ê®', + 'á€' => 'ê®', + 'á' => 'ꮑ', + 'á‚' => 'ê®’', + 'áƒ' => 'ꮓ', + 'á„' => 'ê®”', + 'á…' => 'ꮕ', + 'á†' => 'ê®–', + 'á‡' => 'ê®—', + 'áˆ' => 'ꮘ', + 'á‰' => 'ê®™', + 'áŠ' => 'ꮚ', + 'á‹' => 'ê®›', + 'áŒ' => 'ꮜ', + 'á' => 'ê®', + 'áŽ' => 'ꮞ', + 'á' => 'ꮟ', + 'á' => 'ê® ', + 'á‘' => 'ꮡ', + 'á’' => 'ꮢ', + 'á“' => 'ꮣ', + 'á”' => 'ꮤ', + 'á•' => 'ꮥ', + 'á–' => 'ꮦ', + 'á—' => 'ê®§', + 'á˜' => 'ꮨ', + 'á™' => 'ꮩ', + 'áš' => 'ꮪ', + 'á›' => 'ꮫ', + 'áœ' => 'ꮬ', + 'á' => 'ê®­', + 'áž' => 'ê®®', + 'áŸ' => 'ꮯ', + 'á ' => 'ê®°', + 'á¡' => 'ê®±', + 'á¢' => 'ꮲ', + 'á£' => 'ꮳ', + 'á¤' => 'ê®´', + 'á¥' => 'ꮵ', + 'á¦' => 'ê®¶', + 'á§' => 'ê®·', + 'á¨' => 'ꮸ', + 'á©' => 'ꮹ', + 'áª' => 'ꮺ', + 'á«' => 'ê®»', + 'á¬' => 'ꮼ', + 'á­' => 'ꮽ', + 'á®' => 'ꮾ', + 'á¯' => 'ꮿ', + 'á°' => 'á¸', + 'á±' => 'á¹', + 'á²' => 'áº', + 'á³' => 'á»', + 'á´' => 'á¼', + 'áµ' => 'á½', + 'á²' => 'áƒ', + 'Ბ' => 'ბ', + 'á²’' => 'გ', + 'Დ' => 'დ', + 'á²”' => 'ე', + 'Ვ' => 'ვ', + 'á²–' => 'ზ', + 'á²—' => 'თ', + 'Ი' => 'ი', + 'á²™' => 'კ', + 'Ლ' => 'ლ', + 'á²›' => 'მ', + 'Ნ' => 'ნ', + 'á²' => 'áƒ', + 'Პ' => 'პ', + 'Ჟ' => 'ჟ', + 'á² ' => 'რ', + 'Ს' => 'ს', + 'á²¢' => 'ტ', + 'á²£' => 'უ', + 'Ფ' => 'ფ', + 'á²¥' => 'ქ', + 'Ღ' => 'ღ', + 'á²§' => 'ყ', + 'Შ' => 'შ', + 'Ჩ' => 'ჩ', + 'Ც' => 'ც', + 'Ძ' => 'ძ', + 'Წ' => 'წ', + 'á²­' => 'ჭ', + 'á²®' => 'ხ', + 'Ჯ' => 'ჯ', + 'á²°' => 'ჰ', + 'á²±' => 'ჱ', + 'á²²' => 'ჲ', + 'á²³' => 'ჳ', + 'á²´' => 'ჴ', + 'á²µ' => 'ჵ', + 'á²¶' => 'ჶ', + 'á²·' => 'ჷ', + 'Ჸ' => 'ჸ', + 'á²¹' => 'ჹ', + 'Ჺ' => 'ჺ', + 'á²½' => 'ჽ', + 'á²¾' => 'ჾ', + 'Ჿ' => 'ჿ', + 'Ḁ' => 'á¸', + 'Ḃ' => 'ḃ', + 'Ḅ' => 'ḅ', + 'Ḇ' => 'ḇ', + 'Ḉ' => 'ḉ', + 'Ḋ' => 'ḋ', + 'Ḍ' => 'á¸', + 'Ḏ' => 'á¸', + 'á¸' => 'ḑ', + 'Ḓ' => 'ḓ', + 'Ḕ' => 'ḕ', + 'Ḗ' => 'ḗ', + 'Ḙ' => 'ḙ', + 'Ḛ' => 'ḛ', + 'Ḝ' => 'á¸', + 'Ḟ' => 'ḟ', + 'Ḡ' => 'ḡ', + 'Ḣ' => 'ḣ', + 'Ḥ' => 'ḥ', + 'Ḧ' => 'ḧ', + 'Ḩ' => 'ḩ', + 'Ḫ' => 'ḫ', + 'Ḭ' => 'ḭ', + 'Ḯ' => 'ḯ', + 'Ḱ' => 'ḱ', + 'Ḳ' => 'ḳ', + 'Ḵ' => 'ḵ', + 'Ḷ' => 'ḷ', + 'Ḹ' => 'ḹ', + 'Ḻ' => 'ḻ', + 'Ḽ' => 'ḽ', + 'Ḿ' => 'ḿ', + 'á¹€' => 'á¹', + 'Ṃ' => 'ṃ', + 'Ṅ' => 'á¹…', + 'Ṇ' => 'ṇ', + 'Ṉ' => 'ṉ', + 'Ṋ' => 'ṋ', + 'Ṍ' => 'á¹', + 'Ṏ' => 'á¹', + 'á¹' => 'ṑ', + 'á¹’' => 'ṓ', + 'á¹”' => 'ṕ', + 'á¹–' => 'á¹—', + 'Ṙ' => 'á¹™', + 'Ṛ' => 'á¹›', + 'Ṝ' => 'á¹', + 'Ṟ' => 'ṟ', + 'á¹ ' => 'ṡ', + 'á¹¢' => 'á¹£', + 'Ṥ' => 'á¹¥', + 'Ṧ' => 'á¹§', + 'Ṩ' => 'ṩ', + 'Ṫ' => 'ṫ', + 'Ṭ' => 'á¹­', + 'á¹®' => 'ṯ', + 'á¹°' => 'á¹±', + 'á¹²' => 'á¹³', + 'á¹´' => 'á¹µ', + 'á¹¶' => 'á¹·', + 'Ṹ' => 'á¹¹', + 'Ṻ' => 'á¹»', + 'á¹¼' => 'á¹½', + 'á¹¾' => 'ṿ', + 'Ẁ' => 'áº', + 'Ẃ' => 'ẃ', + 'Ẅ' => 'ẅ', + 'Ẇ' => 'ẇ', + 'Ẉ' => 'ẉ', + 'Ẋ' => 'ẋ', + 'Ẍ' => 'áº', + 'Ẏ' => 'áº', + 'áº' => 'ẑ', + 'Ẓ' => 'ẓ', + 'Ẕ' => 'ẕ', + 'ẞ' => 'ß', + 'Ạ' => 'ạ', + 'Ả' => 'ả', + 'Ấ' => 'ấ', + 'Ầ' => 'ầ', + 'Ẩ' => 'ẩ', + 'Ẫ' => 'ẫ', + 'Ậ' => 'ậ', + 'Ắ' => 'ắ', + 'Ằ' => 'ằ', + 'Ẳ' => 'ẳ', + 'Ẵ' => 'ẵ', + 'Ặ' => 'ặ', + 'Ẹ' => 'ẹ', + 'Ẻ' => 'ẻ', + 'Ẽ' => 'ẽ', + 'Ế' => 'ế', + 'Ề' => 'á»', + 'Ể' => 'ể', + 'Ễ' => 'á»…', + 'Ệ' => 'ệ', + 'Ỉ' => 'ỉ', + 'Ị' => 'ị', + 'Ọ' => 'á»', + 'Ỏ' => 'á»', + 'á»' => 'ố', + 'á»’' => 'ồ', + 'á»”' => 'ổ', + 'á»–' => 'á»—', + 'Ộ' => 'á»™', + 'Ớ' => 'á»›', + 'Ờ' => 'á»', + 'Ở' => 'ở', + 'á» ' => 'ỡ', + 'Ợ' => 'ợ', + 'Ụ' => 'ụ', + 'Ủ' => 'á»§', + 'Ứ' => 'ứ', + 'Ừ' => 'ừ', + 'Ử' => 'á»­', + 'á»®' => 'ữ', + 'á»°' => 'á»±', + 'Ỳ' => 'ỳ', + 'á»´' => 'ỵ', + 'á»¶' => 'á»·', + 'Ỹ' => 'ỹ', + 'Ỻ' => 'á»»', + 'Ỽ' => 'ỽ', + 'Ỿ' => 'ỿ', + 'Ἀ' => 'á¼€', + 'Ἁ' => 'á¼', + 'Ἂ' => 'ἂ', + 'Ἃ' => 'ἃ', + 'Ἄ' => 'ἄ', + 'á¼' => 'á¼…', + 'Ἆ' => 'ἆ', + 'á¼' => 'ἇ', + 'Ἐ' => 'á¼', + 'á¼™' => 'ἑ', + 'Ἒ' => 'á¼’', + 'á¼›' => 'ἓ', + 'Ἔ' => 'á¼”', + 'á¼' => 'ἕ', + 'Ἠ' => 'á¼ ', + 'Ἡ' => 'ἡ', + 'Ἢ' => 'á¼¢', + 'Ἣ' => 'á¼£', + 'Ἤ' => 'ἤ', + 'á¼­' => 'á¼¥', + 'á¼®' => 'ἦ', + 'Ἧ' => 'á¼§', + 'Ἰ' => 'á¼°', + 'á¼¹' => 'á¼±', + 'Ἲ' => 'á¼²', + 'á¼»' => 'á¼³', + 'á¼¼' => 'á¼´', + 'á¼½' => 'á¼µ', + 'á¼¾' => 'á¼¶', + 'Ἷ' => 'á¼·', + 'Ὀ' => 'á½€', + 'Ὁ' => 'á½', + 'Ὂ' => 'ὂ', + 'Ὃ' => 'ὃ', + 'Ὄ' => 'ὄ', + 'á½' => 'á½…', + 'á½™' => 'ὑ', + 'á½›' => 'ὓ', + 'á½' => 'ὕ', + 'Ὗ' => 'á½—', + 'Ὠ' => 'á½ ', + 'Ὡ' => 'ὡ', + 'Ὢ' => 'á½¢', + 'Ὣ' => 'á½£', + 'Ὤ' => 'ὤ', + 'á½­' => 'á½¥', + 'á½®' => 'ὦ', + 'Ὧ' => 'á½§', + 'ᾈ' => 'á¾€', + 'ᾉ' => 'á¾', + 'ᾊ' => 'ᾂ', + 'ᾋ' => 'ᾃ', + 'ᾌ' => 'ᾄ', + 'á¾' => 'á¾…', + 'ᾎ' => 'ᾆ', + 'á¾' => 'ᾇ', + 'ᾘ' => 'á¾', + 'á¾™' => 'ᾑ', + 'ᾚ' => 'á¾’', + 'á¾›' => 'ᾓ', + 'ᾜ' => 'á¾”', + 'á¾' => 'ᾕ', + 'ᾞ' => 'á¾–', + 'ᾟ' => 'á¾—', + 'ᾨ' => 'á¾ ', + 'ᾩ' => 'ᾡ', + 'ᾪ' => 'á¾¢', + 'ᾫ' => 'á¾£', + 'ᾬ' => 'ᾤ', + 'á¾­' => 'á¾¥', + 'á¾®' => 'ᾦ', + 'ᾯ' => 'á¾§', + 'Ᾰ' => 'á¾°', + 'á¾¹' => 'á¾±', + 'Ὰ' => 'á½°', + 'á¾»' => 'á½±', + 'á¾¼' => 'á¾³', + 'Ὲ' => 'á½²', + 'Έ' => 'á½³', + 'Ὴ' => 'á½´', + 'á¿‹' => 'á½µ', + 'ῌ' => 'ῃ', + 'Ῐ' => 'á¿', + 'á¿™' => 'á¿‘', + 'Ὶ' => 'á½¶', + 'á¿›' => 'á½·', + 'Ῠ' => 'á¿ ', + 'á¿©' => 'á¿¡', + 'Ὺ' => 'ὺ', + 'á¿«' => 'á½»', + 'Ῥ' => 'á¿¥', + 'Ὸ' => 'ὸ', + 'Ό' => 'á½¹', + 'Ὼ' => 'á½¼', + 'á¿»' => 'á½½', + 'ῼ' => 'ῳ', + 'Ω' => 'ω', + 'K' => 'k', + 'â„«' => 'Ã¥', + 'Ⅎ' => 'â…Ž', + 'â… ' => 'â…°', + 'â…¡' => 'â…±', + 'â…¢' => 'â…²', + 'â…£' => 'â…³', + 'â…¤' => 'â…´', + 'â…¥' => 'â…µ', + 'â…¦' => 'â…¶', + 'â…§' => 'â…·', + 'â…¨' => 'â…¸', + 'â…©' => 'â…¹', + 'â…ª' => 'â…º', + 'â…«' => 'â…»', + 'â…¬' => 'â…¼', + 'â…­' => 'â…½', + 'â…®' => 'â…¾', + 'â…¯' => 'â…¿', + 'Ↄ' => 'ↄ', + 'â’¶' => 'â“', + 'â’·' => 'â“‘', + 'â’¸' => 'â“’', + 'â’¹' => 'â““', + 'â’º' => 'â“”', + 'â’»' => 'â“•', + 'â’¼' => 'â“–', + 'â’½' => 'â“—', + 'â’¾' => 'ⓘ', + 'â’¿' => 'â“™', + 'â“€' => 'ⓚ', + 'â“' => 'â“›', + 'â“‚' => 'ⓜ', + 'Ⓝ' => 'â“', + 'â“„' => 'ⓞ', + 'â“…' => 'ⓟ', + 'Ⓠ' => 'â“ ', + 'Ⓡ' => 'â“¡', + 'Ⓢ' => 'â“¢', + 'Ⓣ' => 'â“£', + 'Ⓤ' => 'ⓤ', + 'â“‹' => 'â“¥', + 'Ⓦ' => 'ⓦ', + 'â“' => 'â“§', + 'Ⓨ' => 'ⓨ', + 'â“' => 'â“©', + 'â°€' => 'â°°', + 'â°' => 'â°±', + 'â°‚' => 'â°²', + 'â°ƒ' => 'â°³', + 'â°„' => 'â°´', + 'â°…' => 'â°µ', + 'â°†' => 'â°¶', + 'â°‡' => 'â°·', + 'â°ˆ' => 'â°¸', + 'â°‰' => 'â°¹', + 'â°Š' => 'â°º', + 'â°‹' => 'â°»', + 'â°Œ' => 'â°¼', + 'â°' => 'â°½', + 'â°Ž' => 'â°¾', + 'â°' => 'â°¿', + 'â°' => 'â±€', + 'â°‘' => 'â±', + 'â°’' => 'ⱂ', + 'â°“' => 'ⱃ', + 'â°”' => 'ⱄ', + 'â°•' => 'â±…', + 'â°–' => 'ⱆ', + 'â°—' => 'ⱇ', + 'â°˜' => 'ⱈ', + 'â°™' => 'ⱉ', + 'â°š' => 'ⱊ', + 'â°›' => 'ⱋ', + 'â°œ' => 'ⱌ', + 'â°' => 'â±', + 'â°ž' => 'ⱎ', + 'â°Ÿ' => 'â±', + 'â° ' => 'â±', + 'â°¡' => 'ⱑ', + 'â°¢' => 'â±’', + 'â°£' => 'ⱓ', + 'â°¤' => 'â±”', + 'â°¥' => 'ⱕ', + 'â°¦' => 'â±–', + 'â°§' => 'â±—', + 'â°¨' => 'ⱘ', + 'â°©' => 'â±™', + 'â°ª' => 'ⱚ', + 'â°«' => 'â±›', + 'â°¬' => 'ⱜ', + 'â°­' => 'â±', + 'â°®' => 'ⱞ', + 'â± ' => 'ⱡ', + 'â±¢' => 'É«', + 'â±£' => 'áµ½', + 'Ɽ' => 'ɽ', + 'â±§' => 'ⱨ', + 'Ⱪ' => 'ⱪ', + 'Ⱬ' => 'ⱬ', + 'â±­' => 'É‘', + 'â±®' => 'ɱ', + 'Ɐ' => 'É', + 'â±°' => 'É’', + 'â±²' => 'â±³', + 'â±µ' => 'â±¶', + 'â±¾' => 'È¿', + 'Ɀ' => 'É€', + 'â²€' => 'â²', + 'Ⲃ' => 'ⲃ', + 'Ⲅ' => 'â²…', + 'Ⲇ' => 'ⲇ', + 'Ⲉ' => 'ⲉ', + 'Ⲋ' => 'ⲋ', + 'Ⲍ' => 'â²', + 'Ⲏ' => 'â²', + 'â²' => 'ⲑ', + 'â²’' => 'ⲓ', + 'â²”' => 'ⲕ', + 'â²–' => 'â²—', + 'Ⲙ' => 'â²™', + 'Ⲛ' => 'â²›', + 'Ⲝ' => 'â²', + 'Ⲟ' => 'ⲟ', + 'â² ' => 'ⲡ', + 'â²¢' => 'â²£', + 'Ⲥ' => 'â²¥', + 'Ⲧ' => 'â²§', + 'Ⲩ' => 'ⲩ', + 'Ⲫ' => 'ⲫ', + 'Ⲭ' => 'â²­', + 'â²®' => 'ⲯ', + 'â²°' => 'â²±', + 'â²²' => 'â²³', + 'â²´' => 'â²µ', + 'â²¶' => 'â²·', + 'Ⲹ' => 'â²¹', + 'Ⲻ' => 'â²»', + 'â²¼' => 'â²½', + 'â²¾' => 'ⲿ', + 'â³€' => 'â³', + 'Ⳃ' => 'ⳃ', + 'Ⳅ' => 'â³…', + 'Ⳇ' => 'ⳇ', + 'Ⳉ' => 'ⳉ', + 'Ⳋ' => 'ⳋ', + 'Ⳍ' => 'â³', + 'Ⳏ' => 'â³', + 'â³' => 'ⳑ', + 'â³’' => 'ⳓ', + 'â³”' => 'ⳕ', + 'â³–' => 'â³—', + 'Ⳙ' => 'â³™', + 'Ⳛ' => 'â³›', + 'Ⳝ' => 'â³', + 'Ⳟ' => 'ⳟ', + 'â³ ' => 'ⳡ', + 'â³¢' => 'â³£', + 'Ⳬ' => 'ⳬ', + 'â³­' => 'â³®', + 'â³²' => 'â³³', + 'Ꙁ' => 'ê™', + 'Ꙃ' => 'ꙃ', + 'Ꙅ' => 'ê™…', + 'Ꙇ' => 'ꙇ', + 'Ꙉ' => 'ꙉ', + 'Ꙋ' => 'ꙋ', + 'Ꙍ' => 'ê™', + 'Ꙏ' => 'ê™', + 'ê™' => 'ꙑ', + 'ê™’' => 'ꙓ', + 'ê™”' => 'ꙕ', + 'ê™–' => 'ê™—', + 'Ꙙ' => 'ê™™', + 'Ꙛ' => 'ê™›', + 'Ꙝ' => 'ê™', + 'Ꙟ' => 'ꙟ', + 'ê™ ' => 'ꙡ', + 'Ꙣ' => 'ꙣ', + 'Ꙥ' => 'ꙥ', + 'Ꙧ' => 'ê™§', + 'Ꙩ' => 'ꙩ', + 'Ꙫ' => 'ꙫ', + 'Ꙭ' => 'ê™­', + 'Ꚁ' => 'êš', + 'êš‚' => 'ꚃ', + 'êš„' => 'êš…', + 'Ꚇ' => 'ꚇ', + 'Ꚉ' => 'ꚉ', + 'Ꚋ' => 'êš‹', + 'Ꚍ' => 'êš', + 'Ꚏ' => 'êš', + 'êš' => 'êš‘', + 'êš’' => 'êš“', + 'êš”' => 'êš•', + 'êš–' => 'êš—', + 'Ꚙ' => 'êš™', + 'êšš' => 'êš›', + 'Ꜣ' => 'ꜣ', + 'Ꜥ' => 'ꜥ', + 'Ꜧ' => 'ꜧ', + 'Ꜩ' => 'ꜩ', + 'Ꜫ' => 'ꜫ', + 'Ꜭ' => 'ꜭ', + 'Ꜯ' => 'ꜯ', + 'Ꜳ' => 'ꜳ', + 'Ꜵ' => 'ꜵ', + 'Ꜷ' => 'ꜷ', + 'Ꜹ' => 'ꜹ', + 'Ꜻ' => 'ꜻ', + 'Ꜽ' => 'ꜽ', + 'Ꜿ' => 'ꜿ', + 'ê€' => 'ê', + 'ê‚' => 'êƒ', + 'ê„' => 'ê…', + 'ê†' => 'ê‡', + 'êˆ' => 'ê‰', + 'êŠ' => 'ê‹', + 'êŒ' => 'ê', + 'êŽ' => 'ê', + 'ê' => 'ê‘', + 'ê’' => 'ê“', + 'ê”' => 'ê•', + 'ê–' => 'ê—', + 'ê˜' => 'ê™', + 'êš' => 'ê›', + 'êœ' => 'ê', + 'êž' => 'êŸ', + 'ê ' => 'ê¡', + 'ê¢' => 'ê£', + 'ê¤' => 'ê¥', + 'ê¦' => 'ê§', + 'ê¨' => 'ê©', + 'êª' => 'ê«', + 'ê¬' => 'ê­', + 'ê®' => 'ê¯', + 'ê¹' => 'êº', + 'ê»' => 'ê¼', + 'ê½' => 'áµ¹', + 'ê¾' => 'ê¿', + 'Ꞁ' => 'êž', + 'êž‚' => 'ꞃ', + 'êž„' => 'êž…', + 'Ꞇ' => 'ꞇ', + 'êž‹' => 'ꞌ', + 'êž' => 'É¥', + 'êž' => 'êž‘', + 'êž’' => 'êž“', + 'êž–' => 'êž—', + 'Ꞙ' => 'êž™', + 'êžš' => 'êž›', + 'êžœ' => 'êž', + 'êžž' => 'ꞟ', + 'êž ' => 'êž¡', + 'Ꞣ' => 'ꞣ', + 'Ꞥ' => 'ꞥ', + 'Ꞧ' => 'êž§', + 'Ꞩ' => 'êž©', + 'Ɦ' => 'ɦ', + 'êž«' => 'Éœ', + 'Ɡ' => 'É¡', + 'êž­' => 'ɬ', + 'êž®' => 'ɪ', + 'êž°' => 'Êž', + 'êž±' => 'ʇ', + 'êž²' => 'Ê', + 'êž³' => 'ê­“', + 'êž´' => 'êžµ', + 'êž¶' => 'êž·', + 'Ꞹ' => 'êž¹', + 'Ꞻ' => 'êž»', + 'êž¼' => 'êž½', + 'êž¾' => 'êž¿', + 'Ꟃ' => 'ꟃ', + 'Ꞔ' => 'êž”', + 'Ʂ' => 'Ê‚', + 'Ᶎ' => 'á¶Ž', + 'Ꟈ' => 'ꟈ', + 'Ꟊ' => 'ꟊ', + 'Ꟶ' => 'ꟶ', + 'A' => 'ï½', + 'ï¼¢' => 'b', + 'ï¼£' => 'c', + 'D' => 'd', + 'ï¼¥' => 'ï½…', + 'F' => 'f', + 'ï¼§' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'ï¼­' => 'ï½', + 'ï¼®' => 'n', + 'O' => 'ï½', + 'ï¼°' => 'ï½', + 'ï¼±' => 'q', + 'ï¼²' => 'ï½’', + 'ï¼³' => 's', + 'ï¼´' => 'ï½”', + 'ï¼µ' => 'u', + 'ï¼¶' => 'ï½–', + 'ï¼·' => 'ï½—', + 'X' => 'x', + 'ï¼¹' => 'ï½™', + 'Z' => 'z', + 'ð€' => 'ð¨', + 'ð' => 'ð©', + 'ð‚' => 'ðª', + 'ðƒ' => 'ð«', + 'ð„' => 'ð¬', + 'ð…' => 'ð­', + 'ð†' => 'ð®', + 'ð‡' => 'ð¯', + 'ðˆ' => 'ð°', + 'ð‰' => 'ð±', + 'ðŠ' => 'ð²', + 'ð‹' => 'ð³', + 'ðŒ' => 'ð´', + 'ð' => 'ðµ', + 'ðŽ' => 'ð¶', + 'ð' => 'ð·', + 'ð' => 'ð¸', + 'ð‘' => 'ð¹', + 'ð’' => 'ðº', + 'ð“' => 'ð»', + 'ð”' => 'ð¼', + 'ð•' => 'ð½', + 'ð–' => 'ð¾', + 'ð—' => 'ð¿', + 'ð˜' => 'ð‘€', + 'ð™' => 'ð‘', + 'ðš' => 'ð‘‚', + 'ð›' => 'ð‘ƒ', + 'ðœ' => 'ð‘„', + 'ð' => 'ð‘…', + 'ðž' => 'ð‘†', + 'ðŸ' => 'ð‘‡', + 'ð ' => 'ð‘ˆ', + 'ð¡' => 'ð‘‰', + 'ð¢' => 'ð‘Š', + 'ð£' => 'ð‘‹', + 'ð¤' => 'ð‘Œ', + 'ð¥' => 'ð‘', + 'ð¦' => 'ð‘Ž', + 'ð§' => 'ð‘', + 'ð’°' => 'ð“˜', + 'ð’±' => 'ð“™', + 'ð’²' => 'ð“š', + 'ð’³' => 'ð“›', + 'ð’´' => 'ð“œ', + 'ð’µ' => 'ð“', + 'ð’¶' => 'ð“ž', + 'ð’·' => 'ð“Ÿ', + 'ð’¸' => 'ð“ ', + 'ð’¹' => 'ð“¡', + 'ð’º' => 'ð“¢', + 'ð’»' => 'ð“£', + 'ð’¼' => 'ð“¤', + 'ð’½' => 'ð“¥', + 'ð’¾' => 'ð“¦', + 'ð’¿' => 'ð“§', + 'ð“€' => 'ð“¨', + 'ð“' => 'ð“©', + 'ð“‚' => 'ð“ª', + 'ð“ƒ' => 'ð“«', + 'ð“„' => 'ð“¬', + 'ð“…' => 'ð“­', + 'ð“†' => 'ð“®', + 'ð“‡' => 'ð“¯', + 'ð“ˆ' => 'ð“°', + 'ð“‰' => 'ð“±', + 'ð“Š' => 'ð“²', + 'ð“‹' => 'ð“³', + 'ð“Œ' => 'ð“´', + 'ð“' => 'ð“µ', + 'ð“Ž' => 'ð“¶', + 'ð“' => 'ð“·', + 'ð“' => 'ð“¸', + 'ð“‘' => 'ð“¹', + 'ð“’' => 'ð“º', + 'ð““' => 'ð“»', + 'ð²€' => 'ð³€', + 'ð²' => 'ð³', + 'ð²‚' => 'ð³‚', + 'ð²ƒ' => 'ð³ƒ', + 'ð²„' => 'ð³„', + 'ð²…' => 'ð³…', + 'ð²†' => 'ð³†', + 'ð²‡' => 'ð³‡', + 'ð²ˆ' => 'ð³ˆ', + 'ð²‰' => 'ð³‰', + 'ð²Š' => 'ð³Š', + 'ð²‹' => 'ð³‹', + 'ð²Œ' => 'ð³Œ', + 'ð²' => 'ð³', + 'ð²Ž' => 'ð³Ž', + 'ð²' => 'ð³', + 'ð²' => 'ð³', + 'ð²‘' => 'ð³‘', + 'ð²’' => 'ð³’', + 'ð²“' => 'ð³“', + 'ð²”' => 'ð³”', + 'ð²•' => 'ð³•', + 'ð²–' => 'ð³–', + 'ð²—' => 'ð³—', + 'ð²˜' => 'ð³˜', + 'ð²™' => 'ð³™', + 'ð²š' => 'ð³š', + 'ð²›' => 'ð³›', + 'ð²œ' => 'ð³œ', + 'ð²' => 'ð³', + 'ð²ž' => 'ð³ž', + 'ð²Ÿ' => 'ð³Ÿ', + 'ð² ' => 'ð³ ', + 'ð²¡' => 'ð³¡', + 'ð²¢' => 'ð³¢', + 'ð²£' => 'ð³£', + 'ð²¤' => 'ð³¤', + 'ð²¥' => 'ð³¥', + 'ð²¦' => 'ð³¦', + 'ð²§' => 'ð³§', + 'ð²¨' => 'ð³¨', + 'ð²©' => 'ð³©', + 'ð²ª' => 'ð³ª', + 'ð²«' => 'ð³«', + 'ð²¬' => 'ð³¬', + 'ð²­' => 'ð³­', + 'ð²®' => 'ð³®', + 'ð²¯' => 'ð³¯', + 'ð²°' => 'ð³°', + 'ð²±' => 'ð³±', + 'ð²²' => 'ð³²', + 'ð‘¢ ' => 'ð‘£€', + '𑢡' => 'ð‘£', + 'ð‘¢¢' => '𑣂', + 'ð‘¢£' => '𑣃', + '𑢤' => '𑣄', + 'ð‘¢¥' => 'ð‘£…', + '𑢦' => '𑣆', + 'ð‘¢§' => '𑣇', + '𑢨' => '𑣈', + '𑢩' => '𑣉', + '𑢪' => '𑣊', + '𑢫' => '𑣋', + '𑢬' => '𑣌', + 'ð‘¢­' => 'ð‘£', + 'ð‘¢®' => '𑣎', + '𑢯' => 'ð‘£', + 'ð‘¢°' => 'ð‘£', + 'ð‘¢±' => '𑣑', + 'ð‘¢²' => 'ð‘£’', + 'ð‘¢³' => '𑣓', + 'ð‘¢´' => 'ð‘£”', + 'ð‘¢µ' => '𑣕', + 'ð‘¢¶' => 'ð‘£–', + 'ð‘¢·' => 'ð‘£—', + '𑢸' => '𑣘', + 'ð‘¢¹' => 'ð‘£™', + '𑢺' => '𑣚', + 'ð‘¢»' => 'ð‘£›', + 'ð‘¢¼' => '𑣜', + 'ð‘¢½' => 'ð‘£', + 'ð‘¢¾' => '𑣞', + '𑢿' => '𑣟', + 'ð–¹€' => 'ð–¹ ', + 'ð–¹' => '𖹡', + '𖹂' => 'ð–¹¢', + '𖹃' => 'ð–¹£', + '𖹄' => '𖹤', + 'ð–¹…' => 'ð–¹¥', + '𖹆' => '𖹦', + '𖹇' => 'ð–¹§', + '𖹈' => '𖹨', + '𖹉' => '𖹩', + '𖹊' => '𖹪', + '𖹋' => '𖹫', + '𖹌' => '𖹬', + 'ð–¹' => 'ð–¹­', + '𖹎' => 'ð–¹®', + 'ð–¹' => '𖹯', + 'ð–¹' => 'ð–¹°', + '𖹑' => 'ð–¹±', + 'ð–¹’' => 'ð–¹²', + '𖹓' => 'ð–¹³', + 'ð–¹”' => 'ð–¹´', + '𖹕' => 'ð–¹µ', + 'ð–¹–' => 'ð–¹¶', + 'ð–¹—' => 'ð–¹·', + '𖹘' => '𖹸', + 'ð–¹™' => 'ð–¹¹', + '𖹚' => '𖹺', + 'ð–¹›' => 'ð–¹»', + '𖹜' => 'ð–¹¼', + 'ð–¹' => 'ð–¹½', + '𖹞' => 'ð–¹¾', + '𖹟' => '𖹿', + '𞤀' => '𞤢', + 'ðž¤' => '𞤣', + '𞤂' => '𞤤', + '𞤃' => '𞤥', + '𞤄' => '𞤦', + '𞤅' => '𞤧', + '𞤆' => '𞤨', + '𞤇' => '𞤩', + '𞤈' => '𞤪', + '𞤉' => '𞤫', + '𞤊' => '𞤬', + '𞤋' => '𞤭', + '𞤌' => '𞤮', + 'ðž¤' => '𞤯', + '𞤎' => '𞤰', + 'ðž¤' => '𞤱', + 'ðž¤' => '𞤲', + '𞤑' => '𞤳', + '𞤒' => '𞤴', + '𞤓' => '𞤵', + '𞤔' => '𞤶', + '𞤕' => '𞤷', + '𞤖' => '𞤸', + '𞤗' => '𞤹', + '𞤘' => '𞤺', + '𞤙' => '𞤻', + '𞤚' => '𞤼', + '𞤛' => '𞤽', + '𞤜' => '𞤾', + 'ðž¤' => '𞤿', + '𞤞' => '𞥀', + '𞤟' => 'ðž¥', + '𞤠' => '𞥂', + '𞤡' => '𞥃', +); diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php new file mode 100644 index 0000000..2a8f6e7 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -0,0 +1,5 @@ + 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + 'µ' => 'Μ', + 'à' => 'À', + 'á' => 'Ã', + 'â' => 'Â', + 'ã' => 'Ã', + 'ä' => 'Ä', + 'Ã¥' => 'Ã…', + 'æ' => 'Æ', + 'ç' => 'Ç', + 'è' => 'È', + 'é' => 'É', + 'ê' => 'Ê', + 'ë' => 'Ë', + 'ì' => 'ÃŒ', + 'í' => 'Ã', + 'î' => 'ÃŽ', + 'ï' => 'Ã', + 'ð' => 'Ã', + 'ñ' => 'Ñ', + 'ò' => 'Ã’', + 'ó' => 'Ó', + 'ô' => 'Ô', + 'õ' => 'Õ', + 'ö' => 'Ö', + 'ø' => 'Ø', + 'ù' => 'Ù', + 'ú' => 'Ú', + 'û' => 'Û', + 'ü' => 'Ü', + 'ý' => 'Ã', + 'þ' => 'Þ', + 'ÿ' => 'Ÿ', + 'Ä' => 'Ä€', + 'ă' => 'Ä‚', + 'Ä…' => 'Ä„', + 'ć' => 'Ć', + 'ĉ' => 'Ĉ', + 'Ä‹' => 'ÄŠ', + 'Ä' => 'ÄŒ', + 'Ä' => 'ÄŽ', + 'Ä‘' => 'Ä', + 'Ä“' => 'Ä’', + 'Ä•' => 'Ä”', + 'Ä—' => 'Ä–', + 'Ä™' => 'Ę', + 'Ä›' => 'Äš', + 'Ä' => 'Äœ', + 'ÄŸ' => 'Äž', + 'Ä¡' => 'Ä ', + 'Ä£' => 'Ä¢', + 'Ä¥' => 'Ĥ', + 'ħ' => 'Ħ', + 'Ä©' => 'Ĩ', + 'Ä«' => 'Ī', + 'Ä­' => 'Ĭ', + 'į' => 'Ä®', + 'ı' => 'I', + 'ij' => 'IJ', + 'ĵ' => 'Ä´', + 'Ä·' => 'Ķ', + 'ĺ' => 'Ĺ', + 'ļ' => 'Ä»', + 'ľ' => 'Ľ', + 'Å€' => 'Ä¿', + 'Å‚' => 'Å', + 'Å„' => 'Ń', + 'ņ' => 'Å…', + 'ň' => 'Ň', + 'Å‹' => 'ÅŠ', + 'Å' => 'ÅŒ', + 'Å' => 'ÅŽ', + 'Å‘' => 'Å', + 'Å“' => 'Å’', + 'Å•' => 'Å”', + 'Å—' => 'Å–', + 'Å™' => 'Ř', + 'Å›' => 'Åš', + 'Å' => 'Åœ', + 'ÅŸ' => 'Åž', + 'Å¡' => 'Å ', + 'Å£' => 'Å¢', + 'Å¥' => 'Ť', + 'ŧ' => 'Ŧ', + 'Å©' => 'Ũ', + 'Å«' => 'Ū', + 'Å­' => 'Ŭ', + 'ů' => 'Å®', + 'ű' => 'Ű', + 'ų' => 'Ų', + 'ŵ' => 'Å´', + 'Å·' => 'Ŷ', + 'ź' => 'Ź', + 'ż' => 'Å»', + 'ž' => 'Ž', + 'Å¿' => 'S', + 'Æ€' => 'Ƀ', + 'ƃ' => 'Æ‚', + 'Æ…' => 'Æ„', + 'ƈ' => 'Ƈ', + 'ÆŒ' => 'Æ‹', + 'Æ’' => 'Æ‘', + 'Æ•' => 'Ƕ', + 'Æ™' => 'Ƙ', + 'Æš' => 'Ƚ', + 'Æž' => 'È ', + 'Æ¡' => 'Æ ', + 'Æ£' => 'Æ¢', + 'Æ¥' => 'Ƥ', + 'ƨ' => 'Ƨ', + 'Æ­' => 'Ƭ', + 'ư' => 'Ư', + 'Æ´' => 'Ƴ', + 'ƶ' => 'Ƶ', + 'ƹ' => 'Ƹ', + 'ƽ' => 'Ƽ', + 'Æ¿' => 'Ç·', + 'Ç…' => 'Ç„', + 'dž' => 'Ç„', + 'Lj' => 'LJ', + 'lj' => 'LJ', + 'Ç‹' => 'ÇŠ', + 'ÇŒ' => 'ÇŠ', + 'ÇŽ' => 'Ç', + 'Ç' => 'Ç', + 'Ç’' => 'Ç‘', + 'Ç”' => 'Ç“', + 'Ç–' => 'Ç•', + 'ǘ' => 'Ç—', + 'Çš' => 'Ç™', + 'Çœ' => 'Ç›', + 'Ç' => 'ÆŽ', + 'ÇŸ' => 'Çž', + 'Ç¡' => 'Ç ', + 'Ç£' => 'Ç¢', + 'Ç¥' => 'Ǥ', + 'ǧ' => 'Ǧ', + 'Ç©' => 'Ǩ', + 'Ç«' => 'Ǫ', + 'Ç­' => 'Ǭ', + 'ǯ' => 'Ç®', + 'Dz' => 'DZ', + 'dz' => 'DZ', + 'ǵ' => 'Ç´', + 'ǹ' => 'Ǹ', + 'Ç»' => 'Ǻ', + 'ǽ' => 'Ǽ', + 'Ç¿' => 'Ǿ', + 'È' => 'È€', + 'ȃ' => 'È‚', + 'È…' => 'È„', + 'ȇ' => 'Ȇ', + 'ȉ' => 'Ȉ', + 'È‹' => 'ÈŠ', + 'È' => 'ÈŒ', + 'È' => 'ÈŽ', + 'È‘' => 'È', + 'È“' => 'È’', + 'È•' => 'È”', + 'È—' => 'È–', + 'È™' => 'Ș', + 'È›' => 'Èš', + 'È' => 'Èœ', + 'ÈŸ' => 'Èž', + 'È£' => 'È¢', + 'È¥' => 'Ȥ', + 'ȧ' => 'Ȧ', + 'È©' => 'Ȩ', + 'È«' => 'Ȫ', + 'È­' => 'Ȭ', + 'ȯ' => 'È®', + 'ȱ' => 'Ȱ', + 'ȳ' => 'Ȳ', + 'ȼ' => 'È»', + 'È¿' => 'â±¾', + 'É€' => 'Ɀ', + 'É‚' => 'É', + 'ɇ' => 'Ɇ', + 'ɉ' => 'Ɉ', + 'É‹' => 'ÉŠ', + 'É' => 'ÉŒ', + 'É' => 'ÉŽ', + 'É' => 'Ɐ', + 'É‘' => 'â±­', + 'É’' => 'â±°', + 'É“' => 'Æ', + 'É”' => 'Ɔ', + 'É–' => 'Ɖ', + 'É—' => 'ÆŠ', + 'É™' => 'Æ', + 'É›' => 'Æ', + 'Éœ' => 'êž«', + 'É ' => 'Æ“', + 'É¡' => 'Ɡ', + 'É£' => 'Æ”', + 'É¥' => 'êž', + 'ɦ' => 'Ɦ', + 'ɨ' => 'Æ—', + 'É©' => 'Æ–', + 'ɪ' => 'êž®', + 'É«' => 'â±¢', + 'ɬ' => 'êž­', + 'ɯ' => 'Æœ', + 'ɱ' => 'â±®', + 'ɲ' => 'Æ', + 'ɵ' => 'ÆŸ', + 'ɽ' => 'Ɽ', + 'Ê€' => 'Ʀ', + 'Ê‚' => 'Ʂ', + 'ʃ' => 'Æ©', + 'ʇ' => 'êž±', + 'ʈ' => 'Æ®', + 'ʉ' => 'É„', + 'ÊŠ' => 'Ʊ', + 'Ê‹' => 'Ʋ', + 'ÊŒ' => 'É…', + 'Ê’' => 'Æ·', + 'Ê' => 'êž²', + 'Êž' => 'êž°', + 'Í…' => 'Ι', + 'ͱ' => 'Ͱ', + 'ͳ' => 'Ͳ', + 'Í·' => 'Ͷ', + 'Í»' => 'Ͻ', + 'ͼ' => 'Ͼ', + 'ͽ' => 'Ï¿', + 'ά' => 'Ά', + 'έ' => 'Έ', + 'ή' => 'Ή', + 'ί' => 'Ί', + 'α' => 'Α', + 'β' => 'Î’', + 'γ' => 'Γ', + 'δ' => 'Δ', + 'ε' => 'Ε', + 'ζ' => 'Ζ', + 'η' => 'Η', + 'θ' => 'Θ', + 'ι' => 'Ι', + 'κ' => 'Κ', + 'λ' => 'Λ', + 'μ' => 'Μ', + 'ν' => 'Î', + 'ξ' => 'Ξ', + 'ο' => 'Ο', + 'Ï€' => 'Π', + 'Ï' => 'Ρ', + 'Ï‚' => 'Σ', + 'σ' => 'Σ', + 'Ï„' => 'Τ', + 'Ï…' => 'Î¥', + 'φ' => 'Φ', + 'χ' => 'Χ', + 'ψ' => 'Ψ', + 'ω' => 'Ω', + 'ÏŠ' => 'Ϊ', + 'Ï‹' => 'Ϋ', + 'ÏŒ' => 'ÎŒ', + 'Ï' => 'ÎŽ', + 'ÏŽ' => 'Î', + 'Ï' => 'Î’', + 'Ï‘' => 'Θ', + 'Ï•' => 'Φ', + 'Ï–' => 'Π', + 'Ï—' => 'Ï', + 'Ï™' => 'Ϙ', + 'Ï›' => 'Ïš', + 'Ï' => 'Ïœ', + 'ÏŸ' => 'Ïž', + 'Ï¡' => 'Ï ', + 'Ï£' => 'Ï¢', + 'Ï¥' => 'Ϥ', + 'ϧ' => 'Ϧ', + 'Ï©' => 'Ϩ', + 'Ï«' => 'Ϫ', + 'Ï­' => 'Ϭ', + 'ϯ' => 'Ï®', + 'ϰ' => 'Κ', + 'ϱ' => 'Ρ', + 'ϲ' => 'Ϲ', + 'ϳ' => 'Í¿', + 'ϵ' => 'Ε', + 'ϸ' => 'Ï·', + 'Ï»' => 'Ϻ', + 'а' => 'Ð', + 'б' => 'Б', + 'в' => 'Ð’', + 'г' => 'Г', + 'д' => 'Д', + 'е' => 'Е', + 'ж' => 'Ж', + 'з' => 'З', + 'и' => 'И', + 'й' => 'Й', + 'к' => 'К', + 'л' => 'Л', + 'м' => 'М', + 'н' => 'Ð', + 'о' => 'О', + 'п' => 'П', + 'Ñ€' => 'Р', + 'Ñ' => 'С', + 'Ñ‚' => 'Т', + 'у' => 'У', + 'Ñ„' => 'Ф', + 'Ñ…' => 'Ð¥', + 'ц' => 'Ц', + 'ч' => 'Ч', + 'ш' => 'Ш', + 'щ' => 'Щ', + 'ÑŠ' => 'Ъ', + 'Ñ‹' => 'Ы', + 'ÑŒ' => 'Ь', + 'Ñ' => 'Э', + 'ÑŽ' => 'Ю', + 'Ñ' => 'Я', + 'Ñ' => 'Ѐ', + 'Ñ‘' => 'Ð', + 'Ñ’' => 'Ђ', + 'Ñ“' => 'Ѓ', + 'Ñ”' => 'Є', + 'Ñ•' => 'Ð…', + 'Ñ–' => 'І', + 'Ñ—' => 'Ї', + 'ј' => 'Ј', + 'Ñ™' => 'Љ', + 'Ñš' => 'Њ', + 'Ñ›' => 'Ћ', + 'Ñœ' => 'ÐŒ', + 'Ñ' => 'Ð', + 'Ñž' => 'ÐŽ', + 'ÑŸ' => 'Ð', + 'Ñ¡' => 'Ñ ', + 'Ñ£' => 'Ñ¢', + 'Ñ¥' => 'Ѥ', + 'ѧ' => 'Ѧ', + 'Ñ©' => 'Ѩ', + 'Ñ«' => 'Ѫ', + 'Ñ­' => 'Ѭ', + 'ѯ' => 'Ñ®', + 'ѱ' => 'Ѱ', + 'ѳ' => 'Ѳ', + 'ѵ' => 'Ñ´', + 'Ñ·' => 'Ѷ', + 'ѹ' => 'Ѹ', + 'Ñ»' => 'Ѻ', + 'ѽ' => 'Ѽ', + 'Ñ¿' => 'Ѿ', + 'Ò' => 'Ò€', + 'Ò‹' => 'ÒŠ', + 'Ò' => 'ÒŒ', + 'Ò' => 'ÒŽ', + 'Ò‘' => 'Ò', + 'Ò“' => 'Ò’', + 'Ò•' => 'Ò”', + 'Ò—' => 'Ò–', + 'Ò™' => 'Ò˜', + 'Ò›' => 'Òš', + 'Ò' => 'Òœ', + 'ÒŸ' => 'Òž', + 'Ò¡' => 'Ò ', + 'Ò£' => 'Ò¢', + 'Ò¥' => 'Ò¤', + 'Ò§' => 'Ò¦', + 'Ò©' => 'Ò¨', + 'Ò«' => 'Òª', + 'Ò­' => 'Ò¬', + 'Ò¯' => 'Ò®', + 'Ò±' => 'Ò°', + 'Ò³' => 'Ò²', + 'Òµ' => 'Ò´', + 'Ò·' => 'Ò¶', + 'Ò¹' => 'Ò¸', + 'Ò»' => 'Òº', + 'Ò½' => 'Ò¼', + 'Ò¿' => 'Ò¾', + 'Ó‚' => 'Ó', + 'Ó„' => 'Óƒ', + 'Ó†' => 'Ó…', + 'Óˆ' => 'Ó‡', + 'ÓŠ' => 'Ó‰', + 'ÓŒ' => 'Ó‹', + 'ÓŽ' => 'Ó', + 'Ó' => 'Ó€', + 'Ó‘' => 'Ó', + 'Ó“' => 'Ó’', + 'Ó•' => 'Ó”', + 'Ó—' => 'Ó–', + 'Ó™' => 'Ó˜', + 'Ó›' => 'Óš', + 'Ó' => 'Óœ', + 'ÓŸ' => 'Óž', + 'Ó¡' => 'Ó ', + 'Ó£' => 'Ó¢', + 'Ó¥' => 'Ó¤', + 'Ó§' => 'Ó¦', + 'Ó©' => 'Ó¨', + 'Ó«' => 'Óª', + 'Ó­' => 'Ó¬', + 'Ó¯' => 'Ó®', + 'Ó±' => 'Ó°', + 'Ó³' => 'Ó²', + 'Óµ' => 'Ó´', + 'Ó·' => 'Ó¶', + 'Ó¹' => 'Ó¸', + 'Ó»' => 'Óº', + 'Ó½' => 'Ó¼', + 'Ó¿' => 'Ó¾', + 'Ô' => 'Ô€', + 'Ôƒ' => 'Ô‚', + 'Ô…' => 'Ô„', + 'Ô‡' => 'Ô†', + 'Ô‰' => 'Ôˆ', + 'Ô‹' => 'ÔŠ', + 'Ô' => 'ÔŒ', + 'Ô' => 'ÔŽ', + 'Ô‘' => 'Ô', + 'Ô“' => 'Ô’', + 'Ô•' => 'Ô”', + 'Ô—' => 'Ô–', + 'Ô™' => 'Ô˜', + 'Ô›' => 'Ôš', + 'Ô' => 'Ôœ', + 'ÔŸ' => 'Ôž', + 'Ô¡' => 'Ô ', + 'Ô£' => 'Ô¢', + 'Ô¥' => 'Ô¤', + 'Ô§' => 'Ô¦', + 'Ô©' => 'Ô¨', + 'Ô«' => 'Ôª', + 'Ô­' => 'Ô¬', + 'Ô¯' => 'Ô®', + 'Õ¡' => 'Ô±', + 'Õ¢' => 'Ô²', + 'Õ£' => 'Ô³', + 'Õ¤' => 'Ô´', + 'Õ¥' => 'Ôµ', + 'Õ¦' => 'Ô¶', + 'Õ§' => 'Ô·', + 'Õ¨' => 'Ô¸', + 'Õ©' => 'Ô¹', + 'Õª' => 'Ôº', + 'Õ«' => 'Ô»', + 'Õ¬' => 'Ô¼', + 'Õ­' => 'Ô½', + 'Õ®' => 'Ô¾', + 'Õ¯' => 'Ô¿', + 'Õ°' => 'Õ€', + 'Õ±' => 'Õ', + 'Õ²' => 'Õ‚', + 'Õ³' => 'Õƒ', + 'Õ´' => 'Õ„', + 'Õµ' => 'Õ…', + 'Õ¶' => 'Õ†', + 'Õ·' => 'Õ‡', + 'Õ¸' => 'Õˆ', + 'Õ¹' => 'Õ‰', + 'Õº' => 'ÕŠ', + 'Õ»' => 'Õ‹', + 'Õ¼' => 'ÕŒ', + 'Õ½' => 'Õ', + 'Õ¾' => 'ÕŽ', + 'Õ¿' => 'Õ', + 'Ö€' => 'Õ', + 'Ö' => 'Õ‘', + 'Ö‚' => 'Õ’', + 'Öƒ' => 'Õ“', + 'Ö„' => 'Õ”', + 'Ö…' => 'Õ•', + 'Ö†' => 'Õ–', + 'áƒ' => 'á²', + 'ბ' => 'Ბ', + 'გ' => 'á²’', + 'დ' => 'Დ', + 'ე' => 'á²”', + 'ვ' => 'Ვ', + 'ზ' => 'á²–', + 'თ' => 'á²—', + 'ი' => 'Ი', + 'კ' => 'á²™', + 'ლ' => 'Ლ', + 'მ' => 'á²›', + 'ნ' => 'Ნ', + 'áƒ' => 'á²', + 'პ' => 'Პ', + 'ჟ' => 'Ჟ', + 'რ' => 'á² ', + 'ს' => 'Ს', + 'ტ' => 'á²¢', + 'უ' => 'á²£', + 'ფ' => 'Ფ', + 'ქ' => 'á²¥', + 'ღ' => 'Ღ', + 'ყ' => 'á²§', + 'შ' => 'Შ', + 'ჩ' => 'Ჩ', + 'ც' => 'Ც', + 'ძ' => 'Ძ', + 'წ' => 'Წ', + 'ჭ' => 'á²­', + 'ხ' => 'á²®', + 'ჯ' => 'Ჯ', + 'ჰ' => 'á²°', + 'ჱ' => 'á²±', + 'ჲ' => 'á²²', + 'ჳ' => 'á²³', + 'ჴ' => 'á²´', + 'ჵ' => 'á²µ', + 'ჶ' => 'á²¶', + 'ჷ' => 'á²·', + 'ჸ' => 'Ჸ', + 'ჹ' => 'á²¹', + 'ჺ' => 'Ჺ', + 'ჽ' => 'á²½', + 'ჾ' => 'á²¾', + 'ჿ' => 'Ჿ', + 'á¸' => 'á°', + 'á¹' => 'á±', + 'áº' => 'á²', + 'á»' => 'á³', + 'á¼' => 'á´', + 'á½' => 'áµ', + 'á²€' => 'Ð’', + 'á²' => 'Д', + 'ᲂ' => 'О', + 'ᲃ' => 'С', + 'ᲄ' => 'Т', + 'á²…' => 'Т', + 'ᲆ' => 'Ъ', + 'ᲇ' => 'Ñ¢', + 'ᲈ' => 'Ꙋ', + 'áµ¹' => 'ê½', + 'áµ½' => 'â±£', + 'á¶Ž' => 'Ᶎ', + 'á¸' => 'Ḁ', + 'ḃ' => 'Ḃ', + 'ḅ' => 'Ḅ', + 'ḇ' => 'Ḇ', + 'ḉ' => 'Ḉ', + 'ḋ' => 'Ḋ', + 'á¸' => 'Ḍ', + 'á¸' => 'Ḏ', + 'ḑ' => 'á¸', + 'ḓ' => 'Ḓ', + 'ḕ' => 'Ḕ', + 'ḗ' => 'Ḗ', + 'ḙ' => 'Ḙ', + 'ḛ' => 'Ḛ', + 'á¸' => 'Ḝ', + 'ḟ' => 'Ḟ', + 'ḡ' => 'Ḡ', + 'ḣ' => 'Ḣ', + 'ḥ' => 'Ḥ', + 'ḧ' => 'Ḧ', + 'ḩ' => 'Ḩ', + 'ḫ' => 'Ḫ', + 'ḭ' => 'Ḭ', + 'ḯ' => 'Ḯ', + 'ḱ' => 'Ḱ', + 'ḳ' => 'Ḳ', + 'ḵ' => 'Ḵ', + 'ḷ' => 'Ḷ', + 'ḹ' => 'Ḹ', + 'ḻ' => 'Ḻ', + 'ḽ' => 'Ḽ', + 'ḿ' => 'Ḿ', + 'á¹' => 'á¹€', + 'ṃ' => 'Ṃ', + 'á¹…' => 'Ṅ', + 'ṇ' => 'Ṇ', + 'ṉ' => 'Ṉ', + 'ṋ' => 'Ṋ', + 'á¹' => 'Ṍ', + 'á¹' => 'Ṏ', + 'ṑ' => 'á¹', + 'ṓ' => 'á¹’', + 'ṕ' => 'á¹”', + 'á¹—' => 'á¹–', + 'á¹™' => 'Ṙ', + 'á¹›' => 'Ṛ', + 'á¹' => 'Ṝ', + 'ṟ' => 'Ṟ', + 'ṡ' => 'á¹ ', + 'á¹£' => 'á¹¢', + 'á¹¥' => 'Ṥ', + 'á¹§' => 'Ṧ', + 'ṩ' => 'Ṩ', + 'ṫ' => 'Ṫ', + 'á¹­' => 'Ṭ', + 'ṯ' => 'á¹®', + 'á¹±' => 'á¹°', + 'á¹³' => 'á¹²', + 'á¹µ' => 'á¹´', + 'á¹·' => 'á¹¶', + 'á¹¹' => 'Ṹ', + 'á¹»' => 'Ṻ', + 'á¹½' => 'á¹¼', + 'ṿ' => 'á¹¾', + 'áº' => 'Ẁ', + 'ẃ' => 'Ẃ', + 'ẅ' => 'Ẅ', + 'ẇ' => 'Ẇ', + 'ẉ' => 'Ẉ', + 'ẋ' => 'Ẋ', + 'áº' => 'Ẍ', + 'áº' => 'Ẏ', + 'ẑ' => 'áº', + 'ẓ' => 'Ẓ', + 'ẕ' => 'Ẕ', + 'ẛ' => 'á¹ ', + 'ạ' => 'Ạ', + 'ả' => 'Ả', + 'ấ' => 'Ấ', + 'ầ' => 'Ầ', + 'ẩ' => 'Ẩ', + 'ẫ' => 'Ẫ', + 'ậ' => 'Ậ', + 'ắ' => 'Ắ', + 'ằ' => 'Ằ', + 'ẳ' => 'Ẳ', + 'ẵ' => 'Ẵ', + 'ặ' => 'Ặ', + 'ẹ' => 'Ẹ', + 'ẻ' => 'Ẻ', + 'ẽ' => 'Ẽ', + 'ế' => 'Ế', + 'á»' => 'Ề', + 'ể' => 'Ể', + 'á»…' => 'Ễ', + 'ệ' => 'Ệ', + 'ỉ' => 'Ỉ', + 'ị' => 'Ị', + 'á»' => 'Ọ', + 'á»' => 'Ỏ', + 'ố' => 'á»', + 'ồ' => 'á»’', + 'ổ' => 'á»”', + 'á»—' => 'á»–', + 'á»™' => 'Ộ', + 'á»›' => 'Ớ', + 'á»' => 'Ờ', + 'ở' => 'Ở', + 'ỡ' => 'á» ', + 'ợ' => 'Ợ', + 'ụ' => 'Ụ', + 'á»§' => 'Ủ', + 'ứ' => 'Ứ', + 'ừ' => 'Ừ', + 'á»­' => 'Ử', + 'ữ' => 'á»®', + 'á»±' => 'á»°', + 'ỳ' => 'Ỳ', + 'ỵ' => 'á»´', + 'á»·' => 'á»¶', + 'ỹ' => 'Ỹ', + 'á»»' => 'Ỻ', + 'ỽ' => 'Ỽ', + 'ỿ' => 'Ỿ', + 'á¼€' => 'Ἀ', + 'á¼' => 'Ἁ', + 'ἂ' => 'Ἂ', + 'ἃ' => 'Ἃ', + 'ἄ' => 'Ἄ', + 'á¼…' => 'á¼', + 'ἆ' => 'Ἆ', + 'ἇ' => 'á¼', + 'á¼' => 'Ἐ', + 'ἑ' => 'á¼™', + 'á¼’' => 'Ἒ', + 'ἓ' => 'á¼›', + 'á¼”' => 'Ἔ', + 'ἕ' => 'á¼', + 'á¼ ' => 'Ἠ', + 'ἡ' => 'Ἡ', + 'á¼¢' => 'Ἢ', + 'á¼£' => 'Ἣ', + 'ἤ' => 'Ἤ', + 'á¼¥' => 'á¼­', + 'ἦ' => 'á¼®', + 'á¼§' => 'Ἧ', + 'á¼°' => 'Ἰ', + 'á¼±' => 'á¼¹', + 'á¼²' => 'Ἲ', + 'á¼³' => 'á¼»', + 'á¼´' => 'á¼¼', + 'á¼µ' => 'á¼½', + 'á¼¶' => 'á¼¾', + 'á¼·' => 'Ἷ', + 'á½€' => 'Ὀ', + 'á½' => 'Ὁ', + 'ὂ' => 'Ὂ', + 'ὃ' => 'Ὃ', + 'ὄ' => 'Ὄ', + 'á½…' => 'á½', + 'ὑ' => 'á½™', + 'ὓ' => 'á½›', + 'ὕ' => 'á½', + 'á½—' => 'Ὗ', + 'á½ ' => 'Ὠ', + 'ὡ' => 'Ὡ', + 'á½¢' => 'Ὢ', + 'á½£' => 'Ὣ', + 'ὤ' => 'Ὤ', + 'á½¥' => 'á½­', + 'ὦ' => 'á½®', + 'á½§' => 'Ὧ', + 'á½°' => 'Ὰ', + 'á½±' => 'á¾»', + 'á½²' => 'Ὲ', + 'á½³' => 'Έ', + 'á½´' => 'Ὴ', + 'á½µ' => 'á¿‹', + 'á½¶' => 'Ὶ', + 'á½·' => 'á¿›', + 'ὸ' => 'Ὸ', + 'á½¹' => 'Ό', + 'ὺ' => 'Ὺ', + 'á½»' => 'á¿«', + 'á½¼' => 'Ὼ', + 'á½½' => 'á¿»', + 'á¾€' => 'ᾈ', + 'á¾' => 'ᾉ', + 'ᾂ' => 'ᾊ', + 'ᾃ' => 'ᾋ', + 'ᾄ' => 'ᾌ', + 'á¾…' => 'á¾', + 'ᾆ' => 'ᾎ', + 'ᾇ' => 'á¾', + 'á¾' => 'ᾘ', + 'ᾑ' => 'á¾™', + 'á¾’' => 'ᾚ', + 'ᾓ' => 'á¾›', + 'á¾”' => 'ᾜ', + 'ᾕ' => 'á¾', + 'á¾–' => 'ᾞ', + 'á¾—' => 'ᾟ', + 'á¾ ' => 'ᾨ', + 'ᾡ' => 'ᾩ', + 'á¾¢' => 'ᾪ', + 'á¾£' => 'ᾫ', + 'ᾤ' => 'ᾬ', + 'á¾¥' => 'á¾­', + 'ᾦ' => 'á¾®', + 'á¾§' => 'ᾯ', + 'á¾°' => 'Ᾰ', + 'á¾±' => 'á¾¹', + 'á¾³' => 'á¾¼', + 'á¾¾' => 'Ι', + 'ῃ' => 'ῌ', + 'á¿' => 'Ῐ', + 'á¿‘' => 'á¿™', + 'á¿ ' => 'Ῠ', + 'á¿¡' => 'á¿©', + 'á¿¥' => 'Ῥ', + 'ῳ' => 'ῼ', + 'â…Ž' => 'Ⅎ', + 'â…°' => 'â… ', + 'â…±' => 'â…¡', + 'â…²' => 'â…¢', + 'â…³' => 'â…£', + 'â…´' => 'â…¤', + 'â…µ' => 'â…¥', + 'â…¶' => 'â…¦', + 'â…·' => 'â…§', + 'â…¸' => 'â…¨', + 'â…¹' => 'â…©', + 'â…º' => 'â…ª', + 'â…»' => 'â…«', + 'â…¼' => 'â…¬', + 'â…½' => 'â…­', + 'â…¾' => 'â…®', + 'â…¿' => 'â…¯', + 'ↄ' => 'Ↄ', + 'â“' => 'â’¶', + 'â“‘' => 'â’·', + 'â“’' => 'â’¸', + 'â““' => 'â’¹', + 'â“”' => 'â’º', + 'â“•' => 'â’»', + 'â“–' => 'â’¼', + 'â“—' => 'â’½', + 'ⓘ' => 'â’¾', + 'â“™' => 'â’¿', + 'ⓚ' => 'â“€', + 'â“›' => 'â“', + 'ⓜ' => 'â“‚', + 'â“' => 'Ⓝ', + 'ⓞ' => 'â“„', + 'ⓟ' => 'â“…', + 'â“ ' => 'Ⓠ', + 'â“¡' => 'Ⓡ', + 'â“¢' => 'Ⓢ', + 'â“£' => 'Ⓣ', + 'ⓤ' => 'Ⓤ', + 'â“¥' => 'â“‹', + 'ⓦ' => 'Ⓦ', + 'â“§' => 'â“', + 'ⓨ' => 'Ⓨ', + 'â“©' => 'â“', + 'â°°' => 'â°€', + 'â°±' => 'â°', + 'â°²' => 'â°‚', + 'â°³' => 'â°ƒ', + 'â°´' => 'â°„', + 'â°µ' => 'â°…', + 'â°¶' => 'â°†', + 'â°·' => 'â°‡', + 'â°¸' => 'â°ˆ', + 'â°¹' => 'â°‰', + 'â°º' => 'â°Š', + 'â°»' => 'â°‹', + 'â°¼' => 'â°Œ', + 'â°½' => 'â°', + 'â°¾' => 'â°Ž', + 'â°¿' => 'â°', + 'â±€' => 'â°', + 'â±' => 'â°‘', + 'ⱂ' => 'â°’', + 'ⱃ' => 'â°“', + 'ⱄ' => 'â°”', + 'â±…' => 'â°•', + 'ⱆ' => 'â°–', + 'ⱇ' => 'â°—', + 'ⱈ' => 'â°˜', + 'ⱉ' => 'â°™', + 'ⱊ' => 'â°š', + 'ⱋ' => 'â°›', + 'ⱌ' => 'â°œ', + 'â±' => 'â°', + 'ⱎ' => 'â°ž', + 'â±' => 'â°Ÿ', + 'â±' => 'â° ', + 'ⱑ' => 'â°¡', + 'â±’' => 'â°¢', + 'ⱓ' => 'â°£', + 'â±”' => 'â°¤', + 'ⱕ' => 'â°¥', + 'â±–' => 'â°¦', + 'â±—' => 'â°§', + 'ⱘ' => 'â°¨', + 'â±™' => 'â°©', + 'ⱚ' => 'â°ª', + 'â±›' => 'â°«', + 'ⱜ' => 'â°¬', + 'â±' => 'â°­', + 'ⱞ' => 'â°®', + 'ⱡ' => 'â± ', + 'â±¥' => 'Ⱥ', + 'ⱦ' => 'Ⱦ', + 'ⱨ' => 'â±§', + 'ⱪ' => 'Ⱪ', + 'ⱬ' => 'Ⱬ', + 'â±³' => 'â±²', + 'â±¶' => 'â±µ', + 'â²' => 'â²€', + 'ⲃ' => 'Ⲃ', + 'â²…' => 'Ⲅ', + 'ⲇ' => 'Ⲇ', + 'ⲉ' => 'Ⲉ', + 'ⲋ' => 'Ⲋ', + 'â²' => 'Ⲍ', + 'â²' => 'Ⲏ', + 'ⲑ' => 'â²', + 'ⲓ' => 'â²’', + 'ⲕ' => 'â²”', + 'â²—' => 'â²–', + 'â²™' => 'Ⲙ', + 'â²›' => 'Ⲛ', + 'â²' => 'Ⲝ', + 'ⲟ' => 'Ⲟ', + 'ⲡ' => 'â² ', + 'â²£' => 'â²¢', + 'â²¥' => 'Ⲥ', + 'â²§' => 'Ⲧ', + 'ⲩ' => 'Ⲩ', + 'ⲫ' => 'Ⲫ', + 'â²­' => 'Ⲭ', + 'ⲯ' => 'â²®', + 'â²±' => 'â²°', + 'â²³' => 'â²²', + 'â²µ' => 'â²´', + 'â²·' => 'â²¶', + 'â²¹' => 'Ⲹ', + 'â²»' => 'Ⲻ', + 'â²½' => 'â²¼', + 'ⲿ' => 'â²¾', + 'â³' => 'â³€', + 'ⳃ' => 'Ⳃ', + 'â³…' => 'Ⳅ', + 'ⳇ' => 'Ⳇ', + 'ⳉ' => 'Ⳉ', + 'ⳋ' => 'Ⳋ', + 'â³' => 'Ⳍ', + 'â³' => 'Ⳏ', + 'ⳑ' => 'â³', + 'ⳓ' => 'â³’', + 'ⳕ' => 'â³”', + 'â³—' => 'â³–', + 'â³™' => 'Ⳙ', + 'â³›' => 'Ⳛ', + 'â³' => 'Ⳝ', + 'ⳟ' => 'Ⳟ', + 'ⳡ' => 'â³ ', + 'â³£' => 'â³¢', + 'ⳬ' => 'Ⳬ', + 'â³®' => 'â³­', + 'â³³' => 'â³²', + 'â´€' => 'á‚ ', + 'â´' => 'á‚¡', + 'â´‚' => 'á‚¢', + 'â´ƒ' => 'á‚£', + 'â´„' => 'Ⴄ', + 'â´…' => 'á‚¥', + 'â´†' => 'Ⴆ', + 'â´‡' => 'á‚§', + 'â´ˆ' => 'Ⴈ', + 'â´‰' => 'á‚©', + 'â´Š' => 'Ⴊ', + 'â´‹' => 'á‚«', + 'â´Œ' => 'Ⴌ', + 'â´' => 'á‚­', + 'â´Ž' => 'á‚®', + 'â´' => 'Ⴏ', + 'â´' => 'á‚°', + 'â´‘' => 'Ⴑ', + 'â´’' => 'Ⴒ', + 'â´“' => 'Ⴓ', + 'â´”' => 'á‚´', + 'â´•' => 'Ⴕ', + 'â´–' => 'á‚¶', + 'â´—' => 'á‚·', + 'â´˜' => 'Ⴘ', + 'â´™' => 'Ⴙ', + 'â´š' => 'Ⴚ', + 'â´›' => 'á‚»', + 'â´œ' => 'Ⴜ', + 'â´' => 'Ⴝ', + 'â´ž' => 'Ⴞ', + 'â´Ÿ' => 'á‚¿', + 'â´ ' => 'Ⴠ', + 'â´¡' => 'áƒ', + 'â´¢' => 'Ⴢ', + 'â´£' => 'Ⴣ', + 'â´¤' => 'Ⴤ', + 'â´¥' => 'Ⴥ', + 'â´§' => 'Ⴧ', + 'â´­' => 'áƒ', + 'ê™' => 'Ꙁ', + 'ꙃ' => 'Ꙃ', + 'ê™…' => 'Ꙅ', + 'ꙇ' => 'Ꙇ', + 'ꙉ' => 'Ꙉ', + 'ꙋ' => 'Ꙋ', + 'ê™' => 'Ꙍ', + 'ê™' => 'Ꙏ', + 'ꙑ' => 'ê™', + 'ꙓ' => 'ê™’', + 'ꙕ' => 'ê™”', + 'ê™—' => 'ê™–', + 'ê™™' => 'Ꙙ', + 'ê™›' => 'Ꙛ', + 'ê™' => 'Ꙝ', + 'ꙟ' => 'Ꙟ', + 'ꙡ' => 'ê™ ', + 'ꙣ' => 'Ꙣ', + 'ꙥ' => 'Ꙥ', + 'ê™§' => 'Ꙧ', + 'ꙩ' => 'Ꙩ', + 'ꙫ' => 'Ꙫ', + 'ê™­' => 'Ꙭ', + 'êš' => 'Ꚁ', + 'ꚃ' => 'êš‚', + 'êš…' => 'êš„', + 'ꚇ' => 'Ꚇ', + 'ꚉ' => 'Ꚉ', + 'êš‹' => 'Ꚋ', + 'êš' => 'Ꚍ', + 'êš' => 'Ꚏ', + 'êš‘' => 'êš', + 'êš“' => 'êš’', + 'êš•' => 'êš”', + 'êš—' => 'êš–', + 'êš™' => 'Ꚙ', + 'êš›' => 'êšš', + 'ꜣ' => 'Ꜣ', + 'ꜥ' => 'Ꜥ', + 'ꜧ' => 'Ꜧ', + 'ꜩ' => 'Ꜩ', + 'ꜫ' => 'Ꜫ', + 'ꜭ' => 'Ꜭ', + 'ꜯ' => 'Ꜯ', + 'ꜳ' => 'Ꜳ', + 'ꜵ' => 'Ꜵ', + 'ꜷ' => 'Ꜷ', + 'ꜹ' => 'Ꜹ', + 'ꜻ' => 'Ꜻ', + 'ꜽ' => 'Ꜽ', + 'ꜿ' => 'Ꜿ', + 'ê' => 'ê€', + 'êƒ' => 'ê‚', + 'ê…' => 'ê„', + 'ê‡' => 'ê†', + 'ê‰' => 'êˆ', + 'ê‹' => 'êŠ', + 'ê' => 'êŒ', + 'ê' => 'êŽ', + 'ê‘' => 'ê', + 'ê“' => 'ê’', + 'ê•' => 'ê”', + 'ê—' => 'ê–', + 'ê™' => 'ê˜', + 'ê›' => 'êš', + 'ê' => 'êœ', + 'êŸ' => 'êž', + 'ê¡' => 'ê ', + 'ê£' => 'ê¢', + 'ê¥' => 'ê¤', + 'ê§' => 'ê¦', + 'ê©' => 'ê¨', + 'ê«' => 'êª', + 'ê­' => 'ê¬', + 'ê¯' => 'ê®', + 'êº' => 'ê¹', + 'ê¼' => 'ê»', + 'ê¿' => 'ê¾', + 'êž' => 'Ꞁ', + 'ꞃ' => 'êž‚', + 'êž…' => 'êž„', + 'ꞇ' => 'Ꞇ', + 'ꞌ' => 'êž‹', + 'êž‘' => 'êž', + 'êž“' => 'êž’', + 'êž”' => 'Ꞔ', + 'êž—' => 'êž–', + 'êž™' => 'Ꞙ', + 'êž›' => 'êžš', + 'êž' => 'êžœ', + 'ꞟ' => 'êžž', + 'êž¡' => 'êž ', + 'ꞣ' => 'Ꞣ', + 'ꞥ' => 'Ꞥ', + 'êž§' => 'Ꞧ', + 'êž©' => 'Ꞩ', + 'êžµ' => 'êž´', + 'êž·' => 'êž¶', + 'êž¹' => 'Ꞹ', + 'êž»' => 'Ꞻ', + 'êž½' => 'êž¼', + 'êž¿' => 'êž¾', + 'ꟃ' => 'Ꟃ', + 'ꟈ' => 'Ꟈ', + 'ꟊ' => 'Ꟊ', + 'ꟶ' => 'Ꟶ', + 'ê­“' => 'êž³', + 'ê­°' => 'Ꭰ', + 'ê­±' => 'Ꭱ', + 'ê­²' => 'Ꭲ', + 'ê­³' => 'Ꭳ', + 'ê­´' => 'Ꭴ', + 'ê­µ' => 'Ꭵ', + 'ê­¶' => 'Ꭶ', + 'ê­·' => 'Ꭷ', + 'ê­¸' => 'Ꭸ', + 'ê­¹' => 'Ꭹ', + 'ê­º' => 'Ꭺ', + 'ê­»' => 'Ꭻ', + 'ê­¼' => 'Ꭼ', + 'ê­½' => 'Ꭽ', + 'ê­¾' => 'Ꭾ', + 'ê­¿' => 'Ꭿ', + 'ꮀ' => 'Ꮀ', + 'ê®' => 'Ꮁ', + 'ꮂ' => 'Ꮂ', + 'ꮃ' => 'Ꮃ', + 'ꮄ' => 'Ꮄ', + 'ê®…' => 'Ꮅ', + 'ꮆ' => 'Ꮆ', + 'ꮇ' => 'Ꮇ', + 'ꮈ' => 'Ꮈ', + 'ꮉ' => 'Ꮉ', + 'ꮊ' => 'Ꮊ', + 'ꮋ' => 'Ꮋ', + 'ꮌ' => 'Ꮌ', + 'ê®' => 'Ꮍ', + 'ꮎ' => 'Ꮎ', + 'ê®' => 'Ꮏ', + 'ê®' => 'á€', + 'ꮑ' => 'á', + 'ê®’' => 'á‚', + 'ꮓ' => 'áƒ', + 'ê®”' => 'á„', + 'ꮕ' => 'á…', + 'ê®–' => 'á†', + 'ê®—' => 'á‡', + 'ꮘ' => 'áˆ', + 'ê®™' => 'á‰', + 'ꮚ' => 'áŠ', + 'ê®›' => 'á‹', + 'ꮜ' => 'áŒ', + 'ê®' => 'á', + 'ꮞ' => 'áŽ', + 'ꮟ' => 'á', + 'ê® ' => 'á', + 'ꮡ' => 'á‘', + 'ꮢ' => 'á’', + 'ꮣ' => 'á“', + 'ꮤ' => 'á”', + 'ꮥ' => 'á•', + 'ꮦ' => 'á–', + 'ê®§' => 'á—', + 'ꮨ' => 'á˜', + 'ꮩ' => 'á™', + 'ꮪ' => 'áš', + 'ꮫ' => 'á›', + 'ꮬ' => 'áœ', + 'ê®­' => 'á', + 'ê®®' => 'áž', + 'ꮯ' => 'áŸ', + 'ê®°' => 'á ', + 'ê®±' => 'á¡', + 'ꮲ' => 'á¢', + 'ꮳ' => 'á£', + 'ê®´' => 'á¤', + 'ꮵ' => 'á¥', + 'ê®¶' => 'á¦', + 'ê®·' => 'á§', + 'ꮸ' => 'á¨', + 'ꮹ' => 'á©', + 'ꮺ' => 'áª', + 'ê®»' => 'á«', + 'ꮼ' => 'á¬', + 'ꮽ' => 'á­', + 'ꮾ' => 'á®', + 'ꮿ' => 'á¯', + 'ï½' => 'A', + 'b' => 'ï¼¢', + 'c' => 'ï¼£', + 'd' => 'D', + 'ï½…' => 'ï¼¥', + 'f' => 'F', + 'g' => 'ï¼§', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'ï½' => 'ï¼­', + 'n' => 'ï¼®', + 'ï½' => 'O', + 'ï½' => 'ï¼°', + 'q' => 'ï¼±', + 'ï½’' => 'ï¼²', + 's' => 'ï¼³', + 'ï½”' => 'ï¼´', + 'u' => 'ï¼µ', + 'ï½–' => 'ï¼¶', + 'ï½—' => 'ï¼·', + 'x' => 'X', + 'ï½™' => 'ï¼¹', + 'z' => 'Z', + 'ð¨' => 'ð€', + 'ð©' => 'ð', + 'ðª' => 'ð‚', + 'ð«' => 'ðƒ', + 'ð¬' => 'ð„', + 'ð­' => 'ð…', + 'ð®' => 'ð†', + 'ð¯' => 'ð‡', + 'ð°' => 'ðˆ', + 'ð±' => 'ð‰', + 'ð²' => 'ðŠ', + 'ð³' => 'ð‹', + 'ð´' => 'ðŒ', + 'ðµ' => 'ð', + 'ð¶' => 'ðŽ', + 'ð·' => 'ð', + 'ð¸' => 'ð', + 'ð¹' => 'ð‘', + 'ðº' => 'ð’', + 'ð»' => 'ð“', + 'ð¼' => 'ð”', + 'ð½' => 'ð•', + 'ð¾' => 'ð–', + 'ð¿' => 'ð—', + 'ð‘€' => 'ð˜', + 'ð‘' => 'ð™', + 'ð‘‚' => 'ðš', + 'ð‘ƒ' => 'ð›', + 'ð‘„' => 'ðœ', + 'ð‘…' => 'ð', + 'ð‘†' => 'ðž', + 'ð‘‡' => 'ðŸ', + 'ð‘ˆ' => 'ð ', + 'ð‘‰' => 'ð¡', + 'ð‘Š' => 'ð¢', + 'ð‘‹' => 'ð£', + 'ð‘Œ' => 'ð¤', + 'ð‘' => 'ð¥', + 'ð‘Ž' => 'ð¦', + 'ð‘' => 'ð§', + 'ð“˜' => 'ð’°', + 'ð“™' => 'ð’±', + 'ð“š' => 'ð’²', + 'ð“›' => 'ð’³', + 'ð“œ' => 'ð’´', + 'ð“' => 'ð’µ', + 'ð“ž' => 'ð’¶', + 'ð“Ÿ' => 'ð’·', + 'ð“ ' => 'ð’¸', + 'ð“¡' => 'ð’¹', + 'ð“¢' => 'ð’º', + 'ð“£' => 'ð’»', + 'ð“¤' => 'ð’¼', + 'ð“¥' => 'ð’½', + 'ð“¦' => 'ð’¾', + 'ð“§' => 'ð’¿', + 'ð“¨' => 'ð“€', + 'ð“©' => 'ð“', + 'ð“ª' => 'ð“‚', + 'ð“«' => 'ð“ƒ', + 'ð“¬' => 'ð“„', + 'ð“­' => 'ð“…', + 'ð“®' => 'ð“†', + 'ð“¯' => 'ð“‡', + 'ð“°' => 'ð“ˆ', + 'ð“±' => 'ð“‰', + 'ð“²' => 'ð“Š', + 'ð“³' => 'ð“‹', + 'ð“´' => 'ð“Œ', + 'ð“µ' => 'ð“', + 'ð“¶' => 'ð“Ž', + 'ð“·' => 'ð“', + 'ð“¸' => 'ð“', + 'ð“¹' => 'ð“‘', + 'ð“º' => 'ð“’', + 'ð“»' => 'ð““', + 'ð³€' => 'ð²€', + 'ð³' => 'ð²', + 'ð³‚' => 'ð²‚', + 'ð³ƒ' => 'ð²ƒ', + 'ð³„' => 'ð²„', + 'ð³…' => 'ð²…', + 'ð³†' => 'ð²†', + 'ð³‡' => 'ð²‡', + 'ð³ˆ' => 'ð²ˆ', + 'ð³‰' => 'ð²‰', + 'ð³Š' => 'ð²Š', + 'ð³‹' => 'ð²‹', + 'ð³Œ' => 'ð²Œ', + 'ð³' => 'ð²', + 'ð³Ž' => 'ð²Ž', + 'ð³' => 'ð²', + 'ð³' => 'ð²', + 'ð³‘' => 'ð²‘', + 'ð³’' => 'ð²’', + 'ð³“' => 'ð²“', + 'ð³”' => 'ð²”', + 'ð³•' => 'ð²•', + 'ð³–' => 'ð²–', + 'ð³—' => 'ð²—', + 'ð³˜' => 'ð²˜', + 'ð³™' => 'ð²™', + 'ð³š' => 'ð²š', + 'ð³›' => 'ð²›', + 'ð³œ' => 'ð²œ', + 'ð³' => 'ð²', + 'ð³ž' => 'ð²ž', + 'ð³Ÿ' => 'ð²Ÿ', + 'ð³ ' => 'ð² ', + 'ð³¡' => 'ð²¡', + 'ð³¢' => 'ð²¢', + 'ð³£' => 'ð²£', + 'ð³¤' => 'ð²¤', + 'ð³¥' => 'ð²¥', + 'ð³¦' => 'ð²¦', + 'ð³§' => 'ð²§', + 'ð³¨' => 'ð²¨', + 'ð³©' => 'ð²©', + 'ð³ª' => 'ð²ª', + 'ð³«' => 'ð²«', + 'ð³¬' => 'ð²¬', + 'ð³­' => 'ð²­', + 'ð³®' => 'ð²®', + 'ð³¯' => 'ð²¯', + 'ð³°' => 'ð²°', + 'ð³±' => 'ð²±', + 'ð³²' => 'ð²²', + 'ð‘£€' => 'ð‘¢ ', + 'ð‘£' => '𑢡', + '𑣂' => 'ð‘¢¢', + '𑣃' => 'ð‘¢£', + '𑣄' => '𑢤', + 'ð‘£…' => 'ð‘¢¥', + '𑣆' => '𑢦', + '𑣇' => 'ð‘¢§', + '𑣈' => '𑢨', + '𑣉' => '𑢩', + '𑣊' => '𑢪', + '𑣋' => '𑢫', + '𑣌' => '𑢬', + 'ð‘£' => 'ð‘¢­', + '𑣎' => 'ð‘¢®', + 'ð‘£' => '𑢯', + 'ð‘£' => 'ð‘¢°', + '𑣑' => 'ð‘¢±', + 'ð‘£’' => 'ð‘¢²', + '𑣓' => 'ð‘¢³', + 'ð‘£”' => 'ð‘¢´', + '𑣕' => 'ð‘¢µ', + 'ð‘£–' => 'ð‘¢¶', + 'ð‘£—' => 'ð‘¢·', + '𑣘' => '𑢸', + 'ð‘£™' => 'ð‘¢¹', + '𑣚' => '𑢺', + 'ð‘£›' => 'ð‘¢»', + '𑣜' => 'ð‘¢¼', + 'ð‘£' => 'ð‘¢½', + '𑣞' => 'ð‘¢¾', + '𑣟' => '𑢿', + 'ð–¹ ' => 'ð–¹€', + '𖹡' => 'ð–¹', + 'ð–¹¢' => '𖹂', + 'ð–¹£' => '𖹃', + '𖹤' => '𖹄', + 'ð–¹¥' => 'ð–¹…', + '𖹦' => '𖹆', + 'ð–¹§' => '𖹇', + '𖹨' => '𖹈', + '𖹩' => '𖹉', + '𖹪' => '𖹊', + '𖹫' => '𖹋', + '𖹬' => '𖹌', + 'ð–¹­' => 'ð–¹', + 'ð–¹®' => '𖹎', + '𖹯' => 'ð–¹', + 'ð–¹°' => 'ð–¹', + 'ð–¹±' => '𖹑', + 'ð–¹²' => 'ð–¹’', + 'ð–¹³' => '𖹓', + 'ð–¹´' => 'ð–¹”', + 'ð–¹µ' => '𖹕', + 'ð–¹¶' => 'ð–¹–', + 'ð–¹·' => 'ð–¹—', + '𖹸' => '𖹘', + 'ð–¹¹' => 'ð–¹™', + '𖹺' => '𖹚', + 'ð–¹»' => 'ð–¹›', + 'ð–¹¼' => '𖹜', + 'ð–¹½' => 'ð–¹', + 'ð–¹¾' => '𖹞', + '𖹿' => '𖹟', + '𞤢' => '𞤀', + '𞤣' => 'ðž¤', + '𞤤' => '𞤂', + '𞤥' => '𞤃', + '𞤦' => '𞤄', + '𞤧' => '𞤅', + '𞤨' => '𞤆', + '𞤩' => '𞤇', + '𞤪' => '𞤈', + '𞤫' => '𞤉', + '𞤬' => '𞤊', + '𞤭' => '𞤋', + '𞤮' => '𞤌', + '𞤯' => 'ðž¤', + '𞤰' => '𞤎', + '𞤱' => 'ðž¤', + '𞤲' => 'ðž¤', + '𞤳' => '𞤑', + '𞤴' => '𞤒', + '𞤵' => '𞤓', + '𞤶' => '𞤔', + '𞤷' => '𞤕', + '𞤸' => '𞤖', + '𞤹' => '𞤗', + '𞤺' => '𞤘', + '𞤻' => '𞤙', + '𞤼' => '𞤚', + '𞤽' => '𞤛', + '𞤾' => '𞤜', + '𞤿' => 'ðž¤', + '𞥀' => '𞤞', + 'ðž¥' => '𞤟', + '𞥂' => '𞤠', + '𞥃' => '𞤡', +); diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php new file mode 100644 index 0000000..b36a092 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); } +} +if (!function_exists('mb_language')) { + function mb_language($lang = null) { return p\Mbstring::mb_language($lang); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str($s, &$result = array()) { parse_str($s, $result); } +} +if (!function_exists('mb_strlen')) { + function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); } +} +if (!function_exists('mb_substr')) { + function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } +} +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); } +} +if (!function_exists('mb_ord')) { + function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); } +} +if (!function_exists('mb_chr')) { + function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); } +} + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json new file mode 100644 index 0000000..06e6b31 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/polyfill-mbstring", + "type": "library", + "description": "Symfony polyfill for the Mbstring extension", + "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-php72/LICENSE b/vendor/symfony/polyfill-php72/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-php72/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php new file mode 100644 index 0000000..9b3edc7 --- /dev/null +++ b/vendor/symfony/polyfill-php72/Php72.php @@ -0,0 +1,217 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php72; + +/** + * @author Nicolas Grekas + * @author Dariusz RumiÅ„ski + * + * @internal + */ +final class Php72 +{ + private static $hashMask; + + public static function utf8_encode($s) + { + $s .= $s; + $len = \strlen($s); + + for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { + switch (true) { + case $s[$i] < "\x80": $s[$j] = $s[$i]; break; + case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; + default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; + } + } + + return substr($s, 0, $j); + } + + public static function utf8_decode($s) + { + $s = (string) $s; + $len = \strlen($s); + + for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { + switch ($s[$i] & "\xF0") { + case "\xC0": + case "\xD0": + $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F"); + $s[$j] = $c < 256 ? \chr($c) : '?'; + break; + + case "\xF0": + ++$i; + // no break + + case "\xE0": + $s[$j] = '?'; + $i += 2; + break; + + default: + $s[$j] = $s[$i]; + } + } + + return substr($s, 0, $j); + } + + public static function php_os_family() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + return 'Windows'; + } + + $map = array( + 'Darwin' => 'Darwin', + 'DragonFly' => 'BSD', + 'FreeBSD' => 'BSD', + 'NetBSD' => 'BSD', + 'OpenBSD' => 'BSD', + 'Linux' => 'Linux', + 'SunOS' => 'Solaris', + ); + + return isset($map[PHP_OS]) ? $map[PHP_OS] : 'Unknown'; + } + + public static function spl_object_id($object) + { + if (null === self::$hashMask) { + self::initHashMask(); + } + if (null === $hash = spl_object_hash($object)) { + return; + } + + // On 32-bit systems, PHP_INT_SIZE is 4, + return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); + } + + public static function sapi_windows_vt100_support($stream, $enable = null) + { + if (!\is_resource($stream)) { + trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); + + return false; + } + + $meta = stream_get_meta_data($stream); + + if ('STDIO' !== $meta['stream_type']) { + trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING); + + return false; + } + + // We cannot actually disable vt100 support if it is set + if (false === $enable || !self::stream_isatty($stream)) { + return false; + } + + // The native function does not apply to stdin + $meta = array_map('strtolower', $meta); + $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; + + return !$stdin + && (false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM') + || 'Hyper' === getenv('TERM_PROGRAM')); + } + + public static function stream_isatty($stream) + { + if (!\is_resource($stream)) { + trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); + + return false; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + $stat = @fstat($stream); + // Check if formatted mode is S_IFCHR + return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; + } + + return \function_exists('posix_isatty') && @posix_isatty($stream); + } + + private static function initHashMask() + { + $obj = (object) array(); + self::$hashMask = -1; + + // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below + $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); + foreach (debug_backtrace(\PHP_VERSION_ID >= 50400 ? DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) { + if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { + $frame['line'] = 0; + break; + } + } + if (!empty($frame['line'])) { + ob_start(); + debug_zval_dump($obj); + self::$hashMask = (int) substr(ob_get_clean(), 17); + } + + self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if (null == $encoding) { + $s = mb_convert_encoding($s, 'UTF-8'); + } elseif ('UTF-8' !== $encoding) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } +} diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md new file mode 100644 index 0000000..59dec8a --- /dev/null +++ b/vendor/symfony/polyfill-php72/README.md @@ -0,0 +1,28 @@ +Symfony Polyfill / Php72 +======================== + +This component provides functions added to PHP 7.2 core: + +- [`spl_object_id`](https://php.net/spl_object_id) +- [`stream_isatty`](https://php.net/stream_isatty) + +On Windows only: + +- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) + +Moved to core since 7.2 (was in the optional XML extension earlier): + +- [`utf8_encode`](https://php.net/utf8_encode) +- [`utf8_decode`](https://php.net/utf8_decode) + +Also, it provides constants added to PHP 7.2: +- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) +- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php new file mode 100644 index 0000000..a27a900 --- /dev/null +++ b/vendor/symfony/polyfill-php72/bootstrap.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php72 as p; + +if (PHP_VERSION_ID >= 70200) { + return; +} + +if (!defined('PHP_FLOAT_DIG')) { + define('PHP_FLOAT_DIG', 15); +} +if (!defined('PHP_FLOAT_EPSILON')) { + define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); +} +if (!defined('PHP_FLOAT_MIN')) { + define('PHP_FLOAT_MIN', 2.2250738585072E-308); +} +if (!defined('PHP_FLOAT_MAX')) { + define('PHP_FLOAT_MAX', 1.7976931348623157E+308); +} +if (!defined('PHP_OS_FAMILY')) { + define('PHP_OS_FAMILY', p\Php72::php_os_family()); +} + +if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { + function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } +} +if (!function_exists('stream_isatty')) { + function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } +} +if (!function_exists('utf8_encode')) { + function utf8_encode($s) { return p\Php72::utf8_encode($s); } +} +if (!function_exists('utf8_decode')) { + function utf8_decode($s) { return p\Php72::utf8_decode($s); } +} +if (!function_exists('spl_object_id')) { + function spl_object_id($s) { return p\Php72::spl_object_id($s); } +} +if (!function_exists('mb_ord')) { + function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } +} +if (!function_exists('mb_chr')) { + function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } +} diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json new file mode 100644 index 0000000..314d713 --- /dev/null +++ b/vendor/symfony/polyfill-php72/composer.json @@ -0,0 +1,31 @@ +{ + "name": "symfony/polyfill-php72", + "type": "library", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, + "files": [ "bootstrap.php" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + } +} diff --git a/vendor/symfony/polyfill-php73/LICENSE b/vendor/symfony/polyfill-php73/LICENSE new file mode 100644 index 0000000..3f853aa --- /dev/null +++ b/vendor/symfony/polyfill-php73/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php73/Php73.php b/vendor/symfony/polyfill-php73/Php73.php new file mode 100644 index 0000000..7c99d19 --- /dev/null +++ b/vendor/symfony/polyfill-php73/Php73.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php73; + +/** + * @author Gabriel Caruso + * @author Ion Bazan + * + * @internal + */ +final class Php73 +{ + public static $startAt = 1533462603; + + /** + * @param bool $asNum + * + * @return array|float|int + */ + public static function hrtime($asNum = false) + { + $ns = microtime(false); + $s = substr($ns, 11) - self::$startAt; + $ns = 1E9 * (float) $ns; + + if ($asNum) { + $ns += $s * 1E9; + + return \PHP_INT_SIZE === 4 ? $ns : (int) $ns; + } + + return array($s, (int) $ns); + } +} diff --git a/vendor/symfony/polyfill-php73/README.md b/vendor/symfony/polyfill-php73/README.md new file mode 100644 index 0000000..b3ebbce --- /dev/null +++ b/vendor/symfony/polyfill-php73/README.md @@ -0,0 +1,18 @@ +Symfony Polyfill / Php73 +======================== + +This component provides functions added to PHP 7.3 core: + +- [`array_key_first`](https://php.net/array_key_first) +- [`array_key_last`](https://php.net/array_key_last) +- [`hrtime`](https://php.net/function.hrtime) +- [`is_countable`](https://php.net/is_countable) +- [`JsonException`](https://php.net/JsonException) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php b/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php new file mode 100644 index 0000000..673d100 --- /dev/null +++ b/vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class JsonException extends Exception +{ +} diff --git a/vendor/symfony/polyfill-php73/bootstrap.php b/vendor/symfony/polyfill-php73/bootstrap.php new file mode 100644 index 0000000..b3ec352 --- /dev/null +++ b/vendor/symfony/polyfill-php73/bootstrap.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php73 as p; + +if (PHP_VERSION_ID >= 70300) { + return; +} + +if (!function_exists('is_countable')) { + function is_countable($var) { return is_array($var) || $var instanceof Countable || $var instanceof ResourceBundle || $var instanceof SimpleXmlElement; } +} +if (!function_exists('hrtime')) { + require_once __DIR__.'/Php73.php'; + p\Php73::$startAt = (int) microtime(true); + function hrtime($asNum = false) { return p\Php73::hrtime($asNum); } +} +if (!function_exists('array_key_first')) { + function array_key_first(array $array) { foreach ($array as $key => $value) { return $key; } } +} +if (!function_exists('array_key_last')) { + function array_key_last(array $array) { end($array); return key($array); } +} diff --git a/vendor/symfony/polyfill-php73/composer.json b/vendor/symfony/polyfill-php73/composer.json new file mode 100644 index 0000000..5eaa9cf --- /dev/null +++ b/vendor/symfony/polyfill-php73/composer.json @@ -0,0 +1,36 @@ +{ + "name": "symfony/polyfill-php73", + "type": "library", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php73\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-php80/LICENSE b/vendor/symfony/polyfill-php80/LICENSE new file mode 100644 index 0000000..5593b1d --- /dev/null +++ b/vendor/symfony/polyfill-php80/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php80/Php80.php b/vendor/symfony/polyfill-php80/Php80.php new file mode 100644 index 0000000..c03491b --- /dev/null +++ b/vendor/symfony/polyfill-php80/Php80.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Ion Bazan + * @author Nico Oelgart + * @author Nicolas Grekas + * + * @internal + */ +final class Php80 +{ + public static function fdiv(float $dividend, float $divisor): float + { + return @($dividend / $divisor); + } + + public static function get_debug_type($value): string + { + switch (true) { + case null === $value: return 'null'; + case \is_bool($value): return 'bool'; + case \is_string($value): return 'string'; + case \is_array($value): return 'array'; + case \is_int($value): return 'int'; + case \is_float($value): return 'float'; + case \is_object($value): break; + case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; + default: + if (null === $type = @get_resource_type($value)) { + return 'unknown'; + } + + if ('Unknown' === $type) { + $type = 'closed'; + } + + return "resource ($type)"; + } + + $class = \get_class($value); + + if (false === strpos($class, '@')) { + return $class; + } + + return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; + } + + public static function get_resource_id($res): int + { + if (!\is_resource($res) && null === @get_resource_type($res)) { + throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); + } + + return (int) $res; + } + + public static function preg_last_error_msg(): string + { + switch (preg_last_error()) { + case PREG_INTERNAL_ERROR: + return 'Internal error'; + case PREG_BAD_UTF8_ERROR: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + case PREG_BAD_UTF8_OFFSET_ERROR: + return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; + case PREG_BACKTRACK_LIMIT_ERROR: + return 'Backtrack limit exhausted'; + case PREG_RECURSION_LIMIT_ERROR: + return 'Recursion limit exhausted'; + case PREG_JIT_STACKLIMIT_ERROR: + return 'JIT stack limit exhausted'; + case PREG_NO_ERROR: + return 'No error'; + default: + return 'Unknown error'; + } + } + + public static function str_contains(string $haystack, string $needle): bool + { + return '' === $needle || false !== strpos($haystack, $needle); + } + + public static function str_starts_with(string $haystack, string $needle): bool + { + return 0 === \strncmp($haystack, $needle, \strlen($needle)); + } + + public static function str_ends_with(string $haystack, string $needle): bool + { + return '' === $needle || ('' !== $haystack && 0 === \substr_compare($haystack, $needle, -\strlen($needle))); + } +} diff --git a/vendor/symfony/polyfill-php80/README.md b/vendor/symfony/polyfill-php80/README.md new file mode 100644 index 0000000..eaa3050 --- /dev/null +++ b/vendor/symfony/polyfill-php80/README.md @@ -0,0 +1,24 @@ +Symfony Polyfill / Php80 +======================== + +This component provides features added to PHP 8.0 core: + +- `Stringable` interface +- [`fdiv`](https://php.net/fdiv) +- `ValueError` class +- `UnhandledMatchError` class +- `FILTER_VALIDATE_BOOL` constant +- [`get_debug_type`](https://php.net/get_debug_type) +- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) +- [`str_contains`](https://php.net/str_contains) +- [`str_starts_with`](https://php.net/str_starts_with) +- [`str_ends_with`](https://php.net/str_ends_with) +- [`get_resource_id`](https://php.net/get_resource_id) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php new file mode 100644 index 0000000..ad0029a --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -0,0 +1,9 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php80 as p; + +if (PHP_VERSION_ID >= 80000) { + return; +} + +if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { + define('FILTER_VALIDATE_BOOL', FILTER_VALIDATE_BOOLEAN); +} + +if (!function_exists('fdiv')) { + function fdiv(float $dividend, float $divisor): float { return p\Php80::fdiv($dividend, $divisor); } +} +if (!function_exists('preg_last_error_msg')) { + function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } +} +if (!function_exists('str_contains')) { + function str_contains(string $haystack, string $needle): bool { return p\Php80::str_contains($haystack, $needle); } +} +if (!function_exists('str_starts_with')) { + function str_starts_with(string $haystack, string $needle): bool { return p\Php80::str_starts_with($haystack, $needle); } +} +if (!function_exists('str_ends_with')) { + function str_ends_with(string $haystack, string $needle): bool { return p\Php80::str_ends_with($haystack, $needle); } +} +if (!function_exists('get_debug_type')) { + function get_debug_type($value): string { return p\Php80::get_debug_type($value); } +} +if (!function_exists('get_resource_id')) { + function get_resource_id($res): int { return p\Php80::get_resource_id($res); } +} diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json new file mode 100644 index 0000000..51086cc --- /dev/null +++ b/vendor/symfony/polyfill-php80/composer.json @@ -0,0 +1,40 @@ +{ + "name": "symfony/polyfill-php80", + "type": "library", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.0.8" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/process/CHANGELOG.md b/vendor/symfony/process/CHANGELOG.md new file mode 100644 index 0000000..3f3a020 --- /dev/null +++ b/vendor/symfony/process/CHANGELOG.md @@ -0,0 +1,109 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added `Process::getStartTime()` to retrieve the start time of the process as float + +5.0.0 +----- + + * removed `Process::inheritEnvironmentVariables()` + * removed `PhpProcess::setPhpBinary()` + * `Process` must be instantiated with a command array, use `Process::fromShellCommandline()` when the command should be parsed by the shell + * removed `Process::setCommandLine()` + +4.4.0 +----- + + * deprecated `Process::inheritEnvironmentVariables()`: env variables are always inherited. + * added `Process::getLastOutputTime()` method + +4.2.0 +----- + + * added the `Process::fromShellCommandline()` to run commands in a shell wrapper + * deprecated passing a command as string when creating a `Process` instance + * deprecated the `Process::setCommandline()` and the `PhpProcess::setPhpBinary()` methods + * added the `Process::waitUntil()` method to wait for the process only for a + specific output, then continue the normal execution of your application + +4.1.0 +----- + + * added the `Process::isTtySupported()` method that allows to check for TTY support + * made `PhpExecutableFinder` look for the `PHP_BINARY` env var when searching the php binary + * added the `ProcessSignaledException` class to properly catch signaled process errors + +4.0.0 +----- + + * environment variables will always be inherited + * added a second `array $env = []` argument to the `start()`, `run()`, + `mustRun()`, and `restart()` methods of the `Process` class + * added a second `array $env = []` argument to the `start()` method of the + `PhpProcess` class + * the `ProcessUtils::escapeArgument()` method has been removed + * the `areEnvironmentVariablesInherited()`, `getOptions()`, and `setOptions()` + methods of the `Process` class have been removed + * support for passing `proc_open()` options has been removed + * removed the `ProcessBuilder` class, use the `Process` class instead + * removed the `getEnhanceWindowsCompatibility()` and `setEnhanceWindowsCompatibility()` methods of the `Process` class + * passing a not existing working directory to the constructor of the `Symfony\Component\Process\Process` class is not + supported anymore + +3.4.0 +----- + + * deprecated the ProcessBuilder class + * deprecated calling `Process::start()` without setting a valid working directory beforehand (via `setWorkingDirectory()` or constructor) + +3.3.0 +----- + + * added command line arrays in the `Process` class + * added `$env` argument to `Process::start()`, `run()`, `mustRun()` and `restart()` methods + * deprecated the `ProcessUtils::escapeArgument()` method + * deprecated not inheriting environment variables + * deprecated configuring `proc_open()` options + * deprecated configuring enhanced Windows compatibility + * deprecated configuring enhanced sigchild compatibility + +2.5.0 +----- + + * added support for PTY mode + * added the convenience method "mustRun" + * deprecation: Process::setStdin() is deprecated in favor of Process::setInput() + * deprecation: Process::getStdin() is deprecated in favor of Process::getInput() + * deprecation: Process::setInput() and ProcessBuilder::setInput() do not accept non-scalar types + +2.4.0 +----- + + * added the ability to define an idle timeout + +2.3.0 +----- + + * added ProcessUtils::escapeArgument() to fix the bug in escapeshellarg() function on Windows + * added Process::signal() + * added Process::getPid() + * added support for a TTY mode + +2.2.0 +----- + + * added ProcessBuilder::setArguments() to reset the arguments on a builder + * added a way to retrieve the standard and error output incrementally + * added Process:restart() + +2.1.0 +----- + + * added support for non-blocking processes (start(), wait(), isRunning(), stop()) + * enhanced Windows compatibility + * added Process::getExitCodeText() that returns a string representation for + the exit code returned by the process + * added ProcessBuilder diff --git a/vendor/symfony/process/Exception/ExceptionInterface.php b/vendor/symfony/process/Exception/ExceptionInterface.php new file mode 100644 index 0000000..bd4a604 --- /dev/null +++ b/vendor/symfony/process/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * Marker Interface for the Process Component. + * + * @author Johannes M. Schmitt + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/process/Exception/InvalidArgumentException.php b/vendor/symfony/process/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..926ee21 --- /dev/null +++ b/vendor/symfony/process/Exception/InvalidArgumentException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * InvalidArgumentException for the Process Component. + * + * @author Romain Neutron + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/process/Exception/LogicException.php b/vendor/symfony/process/Exception/LogicException.php new file mode 100644 index 0000000..be3d490 --- /dev/null +++ b/vendor/symfony/process/Exception/LogicException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * LogicException for the Process Component. + * + * @author Romain Neutron + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/process/Exception/ProcessFailedException.php b/vendor/symfony/process/Exception/ProcessFailedException.php new file mode 100644 index 0000000..328acfd --- /dev/null +++ b/vendor/symfony/process/Exception/ProcessFailedException.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +use Symfony\Component\Process\Process; + +/** + * Exception for failed processes. + * + * @author Johannes M. Schmitt + */ +class ProcessFailedException extends RuntimeException +{ + private $process; + + public function __construct(Process $process) + { + if ($process->isSuccessful()) { + throw new InvalidArgumentException('Expected a failed process, but the given process was successful.'); + } + + $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s", + $process->getCommandLine(), + $process->getExitCode(), + $process->getExitCodeText(), + $process->getWorkingDirectory() + ); + + if (!$process->isOutputDisabled()) { + $error .= sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s", + $process->getOutput(), + $process->getErrorOutput() + ); + } + + parent::__construct($error); + + $this->process = $process; + } + + public function getProcess() + { + return $this->process; + } +} diff --git a/vendor/symfony/process/Exception/ProcessSignaledException.php b/vendor/symfony/process/Exception/ProcessSignaledException.php new file mode 100644 index 0000000..d4d3227 --- /dev/null +++ b/vendor/symfony/process/Exception/ProcessSignaledException.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +use Symfony\Component\Process\Process; + +/** + * Exception that is thrown when a process has been signaled. + * + * @author Sullivan Senechal + */ +final class ProcessSignaledException extends RuntimeException +{ + private $process; + + public function __construct(Process $process) + { + $this->process = $process; + + parent::__construct(sprintf('The process has been signaled with signal "%s".', $process->getTermSignal())); + } + + public function getProcess(): Process + { + return $this->process; + } + + public function getSignal(): int + { + return $this->getProcess()->getTermSignal(); + } +} diff --git a/vendor/symfony/process/Exception/ProcessTimedOutException.php b/vendor/symfony/process/Exception/ProcessTimedOutException.php new file mode 100644 index 0000000..e1f6445 --- /dev/null +++ b/vendor/symfony/process/Exception/ProcessTimedOutException.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +use Symfony\Component\Process\Process; + +/** + * Exception that is thrown when a process times out. + * + * @author Johannes M. Schmitt + */ +class ProcessTimedOutException extends RuntimeException +{ + const TYPE_GENERAL = 1; + const TYPE_IDLE = 2; + + private $process; + private $timeoutType; + + public function __construct(Process $process, int $timeoutType) + { + $this->process = $process; + $this->timeoutType = $timeoutType; + + parent::__construct(sprintf( + 'The process "%s" exceeded the timeout of %s seconds.', + $process->getCommandLine(), + $this->getExceededTimeout() + )); + } + + public function getProcess() + { + return $this->process; + } + + public function isGeneralTimeout() + { + return self::TYPE_GENERAL === $this->timeoutType; + } + + public function isIdleTimeout() + { + return self::TYPE_IDLE === $this->timeoutType; + } + + public function getExceededTimeout() + { + switch ($this->timeoutType) { + case self::TYPE_GENERAL: + return $this->process->getTimeout(); + + case self::TYPE_IDLE: + return $this->process->getIdleTimeout(); + + default: + throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType)); + } + } +} diff --git a/vendor/symfony/process/Exception/RuntimeException.php b/vendor/symfony/process/Exception/RuntimeException.php new file mode 100644 index 0000000..adead25 --- /dev/null +++ b/vendor/symfony/process/Exception/RuntimeException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * RuntimeException for the Process Component. + * + * @author Johannes M. Schmitt + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/process/ExecutableFinder.php b/vendor/symfony/process/ExecutableFinder.php new file mode 100644 index 0000000..aa52cf3 --- /dev/null +++ b/vendor/symfony/process/ExecutableFinder.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +/** + * Generic executable finder. + * + * @author Fabien Potencier + * @author Johannes M. Schmitt + */ +class ExecutableFinder +{ + private $suffixes = ['.exe', '.bat', '.cmd', '.com']; + + /** + * Replaces default suffixes of executable. + */ + public function setSuffixes(array $suffixes) + { + $this->suffixes = $suffixes; + } + + /** + * Adds new possible suffix to check for executable. + */ + public function addSuffix(string $suffix) + { + $this->suffixes[] = $suffix; + } + + /** + * Finds an executable by name. + * + * @param string $name The executable name (without the extension) + * @param string|null $default The default to return if no executable is found + * @param array $extraDirs Additional dirs to check into + * + * @return string|null The executable path or default value + */ + public function find(string $name, string $default = null, array $extraDirs = []) + { + if (ini_get('open_basedir')) { + $searchPath = array_merge(explode(PATH_SEPARATOR, ini_get('open_basedir')), $extraDirs); + $dirs = []; + foreach ($searchPath as $path) { + // Silencing against https://bugs.php.net/69240 + if (@is_dir($path)) { + $dirs[] = $path; + } else { + if (basename($path) == $name && @is_executable($path)) { + return $path; + } + } + } + } else { + $dirs = array_merge( + explode(PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), + $extraDirs + ); + } + + $suffixes = ['']; + if ('\\' === \DIRECTORY_SEPARATOR) { + $pathExt = getenv('PATHEXT'); + $suffixes = array_merge($pathExt ? explode(PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); + } + foreach ($suffixes as $suffix) { + foreach ($dirs as $dir) { + if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) { + return $file; + } + } + } + + return $default; + } +} diff --git a/vendor/symfony/process/InputStream.php b/vendor/symfony/process/InputStream.php new file mode 100644 index 0000000..c86fca8 --- /dev/null +++ b/vendor/symfony/process/InputStream.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\RuntimeException; + +/** + * Provides a way to continuously write to the input of a Process until the InputStream is closed. + * + * @author Nicolas Grekas + */ +class InputStream implements \IteratorAggregate +{ + /** @var callable|null */ + private $onEmpty = null; + private $input = []; + private $open = true; + + /** + * Sets a callback that is called when the write buffer becomes empty. + */ + public function onEmpty(callable $onEmpty = null) + { + $this->onEmpty = $onEmpty; + } + + /** + * Appends an input to the write buffer. + * + * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, + * stream resource or \Traversable + */ + public function write($input) + { + if (null === $input) { + return; + } + if ($this->isClosed()) { + throw new RuntimeException(sprintf('"%s" is closed.', static::class)); + } + $this->input[] = ProcessUtils::validateInput(__METHOD__, $input); + } + + /** + * Closes the write buffer. + */ + public function close() + { + $this->open = false; + } + + /** + * Tells whether the write buffer is closed or not. + */ + public function isClosed() + { + return !$this->open; + } + + /** + * @return \Traversable + */ + public function getIterator() + { + $this->open = true; + + while ($this->open || $this->input) { + if (!$this->input) { + yield ''; + continue; + } + $current = array_shift($this->input); + + if ($current instanceof \Iterator) { + yield from $current; + } else { + yield $current; + } + if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) { + $this->write($onEmpty($this)); + } + } + } +} diff --git a/vendor/symfony/process/LICENSE b/vendor/symfony/process/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/process/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php new file mode 100644 index 0000000..c09d49a --- /dev/null +++ b/vendor/symfony/process/PhpExecutableFinder.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +/** + * An executable finder specifically designed for the PHP executable. + * + * @author Fabien Potencier + * @author Johannes M. Schmitt + */ +class PhpExecutableFinder +{ + private $executableFinder; + + public function __construct() + { + $this->executableFinder = new ExecutableFinder(); + } + + /** + * Finds The PHP executable. + * + * @return string|false The PHP executable path or false if it cannot be found + */ + public function find(bool $includeArgs = true) + { + if ($php = getenv('PHP_BINARY')) { + if (!is_executable($php)) { + $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; + if ($php = strtok(exec($command.' '.escapeshellarg($php)), PHP_EOL)) { + if (!is_executable($php)) { + return false; + } + } else { + return false; + } + } + + return $php; + } + + $args = $this->findArguments(); + $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; + + // PHP_BINARY return the current sapi executable + if (PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) { + return PHP_BINARY.$args; + } + + if ($php = getenv('PHP_PATH')) { + if (!@is_executable($php)) { + return false; + } + + return $php; + } + + if ($php = getenv('PHP_PEAR_PHP_BIN')) { + if (@is_executable($php)) { + return $php; + } + } + + if (@is_executable($php = PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php'))) { + return $php; + } + + $dirs = [PHP_BINDIR]; + if ('\\' === \DIRECTORY_SEPARATOR) { + $dirs[] = 'C:\xampp\php\\'; + } + + return $this->executableFinder->find('php', false, $dirs); + } + + /** + * Finds the PHP executable arguments. + * + * @return array The PHP executable arguments + */ + public function findArguments() + { + $arguments = []; + if ('phpdbg' === \PHP_SAPI) { + $arguments[] = '-qrr'; + } + + return $arguments; + } +} diff --git a/vendor/symfony/process/PhpProcess.php b/vendor/symfony/process/PhpProcess.php new file mode 100644 index 0000000..2bc338e --- /dev/null +++ b/vendor/symfony/process/PhpProcess.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\LogicException; +use Symfony\Component\Process\Exception\RuntimeException; + +/** + * PhpProcess runs a PHP script in an independent process. + * + * $p = new PhpProcess(''); + * $p->run(); + * print $p->getOutput()."\n"; + * + * @author Fabien Potencier + */ +class PhpProcess extends Process +{ + /** + * @param string $script The PHP script to run (as a string) + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param int $timeout The timeout in seconds + * @param array|null $php Path to the PHP binary to use with any additional arguments + */ + public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) + { + if (null === $php) { + $executableFinder = new PhpExecutableFinder(); + $php = $executableFinder->find(false); + $php = false === $php ? null : array_merge([$php], $executableFinder->findArguments()); + } + if ('phpdbg' === \PHP_SAPI) { + $file = tempnam(sys_get_temp_dir(), 'dbg'); + file_put_contents($file, $script); + register_shutdown_function('unlink', $file); + $php[] = $file; + $script = null; + } + + parent::__construct($php, $cwd, $env, $script, $timeout); + } + + /** + * {@inheritdoc} + */ + public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); + } + + /** + * {@inheritdoc} + */ + public function start(callable $callback = null, array $env = []) + { + if (null === $this->getCommandLine()) { + throw new RuntimeException('Unable to find the PHP executable.'); + } + + parent::start($callback, $env); + } +} diff --git a/vendor/symfony/process/Pipes/AbstractPipes.php b/vendor/symfony/process/Pipes/AbstractPipes.php new file mode 100644 index 0000000..77636c2 --- /dev/null +++ b/vendor/symfony/process/Pipes/AbstractPipes.php @@ -0,0 +1,178 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +use Symfony\Component\Process\Exception\InvalidArgumentException; + +/** + * @author Romain Neutron + * + * @internal + */ +abstract class AbstractPipes implements PipesInterface +{ + public $pipes = []; + + private $inputBuffer = ''; + private $input; + private $blocked = true; + private $lastError; + + /** + * @param resource|string|int|float|bool|\Iterator|null $input + */ + public function __construct($input) + { + if (\is_resource($input) || $input instanceof \Iterator) { + $this->input = $input; + } elseif (\is_string($input)) { + $this->inputBuffer = $input; + } else { + $this->inputBuffer = (string) $input; + } + } + + /** + * {@inheritdoc} + */ + public function close() + { + foreach ($this->pipes as $pipe) { + fclose($pipe); + } + $this->pipes = []; + } + + /** + * Returns true if a system call has been interrupted. + */ + protected function hasSystemCallBeenInterrupted(): bool + { + $lastError = $this->lastError; + $this->lastError = null; + + // stream_select returns false when the `select` system call is interrupted by an incoming signal + return null !== $lastError && false !== stripos($lastError, 'interrupted system call'); + } + + /** + * Unblocks streams. + */ + protected function unblock() + { + if (!$this->blocked) { + return; + } + + foreach ($this->pipes as $pipe) { + stream_set_blocking($pipe, 0); + } + if (\is_resource($this->input)) { + stream_set_blocking($this->input, 0); + } + + $this->blocked = false; + } + + /** + * Writes input to stdin. + * + * @throws InvalidArgumentException When an input iterator yields a non supported value + */ + protected function write(): ?array + { + if (!isset($this->pipes[0])) { + return null; + } + $input = $this->input; + + if ($input instanceof \Iterator) { + if (!$input->valid()) { + $input = null; + } elseif (\is_resource($input = $input->current())) { + stream_set_blocking($input, 0); + } elseif (!isset($this->inputBuffer[0])) { + if (!\is_string($input)) { + if (!is_scalar($input)) { + throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input))); + } + $input = (string) $input; + } + $this->inputBuffer = $input; + $this->input->next(); + $input = null; + } else { + $input = null; + } + } + + $r = $e = []; + $w = [$this->pipes[0]]; + + // let's have a look if something changed in streams + if (false === @stream_select($r, $w, $e, 0, 0)) { + return null; + } + + foreach ($w as $stdin) { + if (isset($this->inputBuffer[0])) { + $written = fwrite($stdin, $this->inputBuffer); + $this->inputBuffer = substr($this->inputBuffer, $written); + if (isset($this->inputBuffer[0])) { + return [$this->pipes[0]]; + } + } + + if ($input) { + for (;;) { + $data = fread($input, self::CHUNK_SIZE); + if (!isset($data[0])) { + break; + } + $written = fwrite($stdin, $data); + $data = substr($data, $written); + if (isset($data[0])) { + $this->inputBuffer = $data; + + return [$this->pipes[0]]; + } + } + if (feof($input)) { + if ($this->input instanceof \Iterator) { + $this->input->next(); + } else { + $this->input = null; + } + } + } + } + + // no input to read on resource, buffer is empty + if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) { + $this->input = null; + fclose($this->pipes[0]); + unset($this->pipes[0]); + } elseif (!$w) { + return [$this->pipes[0]]; + } + + return null; + } + + /** + * @internal + */ + public function handleError($type, $msg) + { + $this->lastError = $msg; + } +} diff --git a/vendor/symfony/process/Pipes/PipesInterface.php b/vendor/symfony/process/Pipes/PipesInterface.php new file mode 100644 index 0000000..2d63e2c --- /dev/null +++ b/vendor/symfony/process/Pipes/PipesInterface.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +/** + * PipesInterface manages descriptors and pipes for the use of proc_open. + * + * @author Romain Neutron + * + * @internal + */ +interface PipesInterface +{ + const CHUNK_SIZE = 16384; + + /** + * Returns an array of descriptors for the use of proc_open. + */ + public function getDescriptors(): array; + + /** + * Returns an array of filenames indexed by their related stream in case these pipes use temporary files. + * + * @return string[] + */ + public function getFiles(): array; + + /** + * Reads data in file handles and pipes. + * + * @param bool $blocking Whether to use blocking calls or not + * @param bool $close Whether to close pipes if they've reached EOF + * + * @return string[] An array of read data indexed by their fd + */ + public function readAndWrite(bool $blocking, bool $close = false): array; + + /** + * Returns if the current state has open file handles or pipes. + */ + public function areOpen(): bool; + + /** + * Returns if pipes are able to read output. + */ + public function haveReadSupport(): bool; + + /** + * Closes file handles and pipes. + */ + public function close(); +} diff --git a/vendor/symfony/process/Pipes/UnixPipes.php b/vendor/symfony/process/Pipes/UnixPipes.php new file mode 100644 index 0000000..70fdd29 --- /dev/null +++ b/vendor/symfony/process/Pipes/UnixPipes.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +use Symfony\Component\Process\Process; + +/** + * UnixPipes implementation uses unix pipes as handles. + * + * @author Romain Neutron + * + * @internal + */ +class UnixPipes extends AbstractPipes +{ + private $ttyMode; + private $ptyMode; + private $haveReadSupport; + + public function __construct(?bool $ttyMode, bool $ptyMode, $input, bool $haveReadSupport) + { + $this->ttyMode = $ttyMode; + $this->ptyMode = $ptyMode; + $this->haveReadSupport = $haveReadSupport; + + parent::__construct($input); + } + + public function __destruct() + { + $this->close(); + } + + /** + * {@inheritdoc} + */ + public function getDescriptors(): array + { + if (!$this->haveReadSupport) { + $nullstream = fopen('/dev/null', 'c'); + + return [ + ['pipe', 'r'], + $nullstream, + $nullstream, + ]; + } + + if ($this->ttyMode) { + return [ + ['file', '/dev/tty', 'r'], + ['file', '/dev/tty', 'w'], + ['file', '/dev/tty', 'w'], + ]; + } + + if ($this->ptyMode && Process::isPtySupported()) { + return [ + ['pty'], + ['pty'], + ['pty'], + ]; + } + + return [ + ['pipe', 'r'], + ['pipe', 'w'], // stdout + ['pipe', 'w'], // stderr + ]; + } + + /** + * {@inheritdoc} + */ + public function getFiles(): array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function readAndWrite(bool $blocking, bool $close = false): array + { + $this->unblock(); + $w = $this->write(); + + $read = $e = []; + $r = $this->pipes; + unset($r[0]); + + // let's have a look if something changed in streams + set_error_handler([$this, 'handleError']); + if (($r || $w) && false === stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) { + restore_error_handler(); + // if a system call has been interrupted, forget about it, let's try again + // otherwise, an error occurred, let's reset pipes + if (!$this->hasSystemCallBeenInterrupted()) { + $this->pipes = []; + } + + return $read; + } + restore_error_handler(); + + foreach ($r as $pipe) { + // prior PHP 5.4 the array passed to stream_select is modified and + // lose key association, we have to find back the key + $read[$type = array_search($pipe, $this->pipes, true)] = ''; + + do { + $data = @fread($pipe, self::CHUNK_SIZE); + $read[$type] .= $data; + } while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1]))); + + if (!isset($read[$type][0])) { + unset($read[$type]); + } + + if ($close && feof($pipe)) { + fclose($pipe); + unset($this->pipes[$type]); + } + } + + return $read; + } + + /** + * {@inheritdoc} + */ + public function haveReadSupport(): bool + { + return $this->haveReadSupport; + } + + /** + * {@inheritdoc} + */ + public function areOpen(): bool + { + return (bool) $this->pipes; + } +} diff --git a/vendor/symfony/process/Pipes/WindowsPipes.php b/vendor/symfony/process/Pipes/WindowsPipes.php new file mode 100644 index 0000000..c548092 --- /dev/null +++ b/vendor/symfony/process/Pipes/WindowsPipes.php @@ -0,0 +1,191 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +use Symfony\Component\Process\Exception\RuntimeException; +use Symfony\Component\Process\Process; + +/** + * WindowsPipes implementation uses temporary files as handles. + * + * @see https://bugs.php.net/51800 + * @see https://bugs.php.net/65650 + * + * @author Romain Neutron + * + * @internal + */ +class WindowsPipes extends AbstractPipes +{ + private $files = []; + private $fileHandles = []; + private $lockHandles = []; + private $readBytes = [ + Process::STDOUT => 0, + Process::STDERR => 0, + ]; + private $haveReadSupport; + + public function __construct($input, bool $haveReadSupport) + { + $this->haveReadSupport = $haveReadSupport; + + if ($this->haveReadSupport) { + // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big. + // Workaround for this problem is to use temporary files instead of pipes on Windows platform. + // + // @see https://bugs.php.net/51800 + $pipes = [ + Process::STDOUT => Process::OUT, + Process::STDERR => Process::ERR, + ]; + $tmpDir = sys_get_temp_dir(); + $lastError = 'unknown reason'; + set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; }); + for ($i = 0;; ++$i) { + foreach ($pipes as $pipe => $name) { + $file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name); + + if (!$h = fopen($file.'.lock', 'w')) { + restore_error_handler(); + throw new RuntimeException('A temporary file could not be opened to write the process output: '.$lastError); + } + if (!flock($h, LOCK_EX | LOCK_NB)) { + continue 2; + } + if (isset($this->lockHandles[$pipe])) { + flock($this->lockHandles[$pipe], LOCK_UN); + fclose($this->lockHandles[$pipe]); + } + $this->lockHandles[$pipe] = $h; + + if (!fclose(fopen($file, 'w')) || !$h = fopen($file, 'r')) { + flock($this->lockHandles[$pipe], LOCK_UN); + fclose($this->lockHandles[$pipe]); + unset($this->lockHandles[$pipe]); + continue 2; + } + $this->fileHandles[$pipe] = $h; + $this->files[$pipe] = $file; + } + break; + } + restore_error_handler(); + } + + parent::__construct($input); + } + + public function __destruct() + { + $this->close(); + } + + /** + * {@inheritdoc} + */ + public function getDescriptors(): array + { + if (!$this->haveReadSupport) { + $nullstream = fopen('NUL', 'c'); + + return [ + ['pipe', 'r'], + $nullstream, + $nullstream, + ]; + } + + // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/51800) + // We're not using file handles as it can produce corrupted output https://bugs.php.net/65650 + // So we redirect output within the commandline and pass the nul device to the process + return [ + ['pipe', 'r'], + ['file', 'NUL', 'w'], + ['file', 'NUL', 'w'], + ]; + } + + /** + * {@inheritdoc} + */ + public function getFiles(): array + { + return $this->files; + } + + /** + * {@inheritdoc} + */ + public function readAndWrite(bool $blocking, bool $close = false): array + { + $this->unblock(); + $w = $this->write(); + $read = $r = $e = []; + + if ($blocking) { + if ($w) { + @stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1E6); + } elseif ($this->fileHandles) { + usleep(Process::TIMEOUT_PRECISION * 1E6); + } + } + foreach ($this->fileHandles as $type => $fileHandle) { + $data = stream_get_contents($fileHandle, -1, $this->readBytes[$type]); + + if (isset($data[0])) { + $this->readBytes[$type] += \strlen($data); + $read[$type] = $data; + } + if ($close) { + ftruncate($fileHandle, 0); + fclose($fileHandle); + flock($this->lockHandles[$type], LOCK_UN); + fclose($this->lockHandles[$type]); + unset($this->fileHandles[$type], $this->lockHandles[$type]); + } + } + + return $read; + } + + /** + * {@inheritdoc} + */ + public function haveReadSupport(): bool + { + return $this->haveReadSupport; + } + + /** + * {@inheritdoc} + */ + public function areOpen(): bool + { + return $this->pipes && $this->fileHandles; + } + + /** + * {@inheritdoc} + */ + public function close() + { + parent::close(); + foreach ($this->fileHandles as $type => $handle) { + ftruncate($handle, 0); + fclose($handle); + flock($this->lockHandles[$type], LOCK_UN); + fclose($this->lockHandles[$type]); + } + $this->fileHandles = $this->lockHandles = []; + } +} diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php new file mode 100644 index 0000000..e1efb9c --- /dev/null +++ b/vendor/symfony/process/Process.php @@ -0,0 +1,1636 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\InvalidArgumentException; +use Symfony\Component\Process\Exception\LogicException; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Exception\ProcessSignaledException; +use Symfony\Component\Process\Exception\ProcessTimedOutException; +use Symfony\Component\Process\Exception\RuntimeException; +use Symfony\Component\Process\Pipes\PipesInterface; +use Symfony\Component\Process\Pipes\UnixPipes; +use Symfony\Component\Process\Pipes\WindowsPipes; + +/** + * Process is a thin wrapper around proc_* functions to easily + * start independent PHP processes. + * + * @author Fabien Potencier + * @author Romain Neutron + */ +class Process implements \IteratorAggregate +{ + const ERR = 'err'; + const OUT = 'out'; + + const STATUS_READY = 'ready'; + const STATUS_STARTED = 'started'; + const STATUS_TERMINATED = 'terminated'; + + const STDIN = 0; + const STDOUT = 1; + const STDERR = 2; + + // Timeout Precision in seconds. + const TIMEOUT_PRECISION = 0.2; + + const ITER_NON_BLOCKING = 1; // By default, iterating over outputs is a blocking call, use this flag to make it non-blocking + const ITER_KEEP_OUTPUT = 2; // By default, outputs are cleared while iterating, use this flag to keep them in memory + const ITER_SKIP_OUT = 4; // Use this flag to skip STDOUT while iterating + const ITER_SKIP_ERR = 8; // Use this flag to skip STDERR while iterating + + private $callback; + private $hasCallback = false; + private $commandline; + private $cwd; + private $env; + private $input; + private $starttime; + private $lastOutputTime; + private $timeout; + private $idleTimeout; + private $exitcode; + private $fallbackStatus = []; + private $processInformation; + private $outputDisabled = false; + private $stdout; + private $stderr; + private $process; + private $status = self::STATUS_READY; + private $incrementalOutputOffset = 0; + private $incrementalErrorOutputOffset = 0; + private $tty = false; + private $pty; + + private $useFileHandles = false; + /** @var PipesInterface */ + private $processPipes; + + private $latestSignal; + + private static $sigchild; + + /** + * Exit codes translation table. + * + * User-defined errors must use exit codes in the 64-113 range. + */ + public static $exitCodes = [ + 0 => 'OK', + 1 => 'General error', + 2 => 'Misuse of shell builtins', + + 126 => 'Invoked command cannot execute', + 127 => 'Command not found', + 128 => 'Invalid exit argument', + + // signals + 129 => 'Hangup', + 130 => 'Interrupt', + 131 => 'Quit and dump core', + 132 => 'Illegal instruction', + 133 => 'Trace/breakpoint trap', + 134 => 'Process aborted', + 135 => 'Bus error: "access to undefined portion of memory object"', + 136 => 'Floating point exception: "erroneous arithmetic operation"', + 137 => 'Kill (terminate immediately)', + 138 => 'User-defined 1', + 139 => 'Segmentation violation', + 140 => 'User-defined 2', + 141 => 'Write to pipe with no one reading', + 142 => 'Signal raised by alarm', + 143 => 'Termination (request to terminate)', + // 144 - not defined + 145 => 'Child process terminated, stopped (or continued*)', + 146 => 'Continue if stopped', + 147 => 'Stop executing temporarily', + 148 => 'Terminal stop signal', + 149 => 'Background process attempting to read from tty ("in")', + 150 => 'Background process attempting to write to tty ("out")', + 151 => 'Urgent data available on socket', + 152 => 'CPU time limit exceeded', + 153 => 'File size limit exceeded', + 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"', + 155 => 'Profiling timer expired', + // 156 - not defined + 157 => 'Pollable event', + // 158 - not defined + 159 => 'Bad syscall', + ]; + + /** + * @param array $command The command to run and its arguments listed as separate entries + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input + * @param int|float|null $timeout The timeout in seconds or null to disable + * + * @throws LogicException When proc_open is not installed + */ + public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + if (!\function_exists('proc_open')) { + throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.'); + } + + $this->commandline = $command; + $this->cwd = $cwd; + + // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started + // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected + // @see : https://bugs.php.net/51800 + // @see : https://bugs.php.net/50524 + if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) { + $this->cwd = getcwd(); + } + if (null !== $env) { + $this->setEnv($env); + } + + $this->setInput($input); + $this->setTimeout($timeout); + $this->useFileHandles = '\\' === \DIRECTORY_SEPARATOR; + $this->pty = false; + } + + /** + * Creates a Process instance as a command-line to be run in a shell wrapper. + * + * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.) + * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the + * shell wrapper and not to your commands. + * + * In order to inject dynamic values into command-lines, we strongly recommend using placeholders. + * This will save escaping values, which is not portable nor secure anyway: + * + * $process = Process::fromShellCommandline('my_command "$MY_VAR"'); + * $process->run(null, ['MY_VAR' => $theValue]); + * + * @param string $command The command line to pass to the shell of the OS + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input + * @param int|float|null $timeout The timeout in seconds or null to disable + * + * @return static + * + * @throws LogicException When proc_open is not installed + */ + public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + $process = new static([], $cwd, $env, $input, $timeout); + $process->commandline = $command; + + return $process; + } + + public function __destruct() + { + $this->stop(0); + } + + public function __clone() + { + $this->resetProcessData(); + } + + /** + * Runs the process. + * + * The callback receives the type of output (out or err) and + * some bytes from the output in real-time. It allows to have feedback + * from the independent process during execution. + * + * The STDOUT and STDERR are also available after the process is finished + * via the getOutput() and getErrorOutput() methods. + * + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @return int The exit status code + * + * @throws RuntimeException When process can't be launched + * @throws RuntimeException When process is already running + * @throws ProcessTimedOutException When process timed out + * @throws ProcessSignaledException When process stopped after receiving signal + * @throws LogicException In case a callback is provided and output has been disabled + * + * @final + */ + public function run(callable $callback = null, array $env = []): int + { + $this->start($callback, $env); + + return $this->wait(); + } + + /** + * Runs the process. + * + * This is identical to run() except that an exception is thrown if the process + * exits with a non-zero exit code. + * + * @return $this + * + * @throws ProcessFailedException if the process didn't terminate successfully + * + * @final + */ + public function mustRun(callable $callback = null, array $env = []): self + { + if (0 !== $this->run($callback, $env)) { + throw new ProcessFailedException($this); + } + + return $this; + } + + /** + * Starts the process and returns after writing the input to STDIN. + * + * This method blocks until all STDIN data is sent to the process then it + * returns while the process runs in the background. + * + * The termination of the process can be awaited with wait(). + * + * The callback receives the type of output (out or err) and some bytes from + * the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @throws RuntimeException When process can't be launched + * @throws RuntimeException When process is already running + * @throws LogicException In case a callback is provided and output has been disabled + */ + public function start(callable $callback = null, array $env = []) + { + if ($this->isRunning()) { + throw new RuntimeException('Process is already running.'); + } + + $this->resetProcessData(); + $this->starttime = $this->lastOutputTime = microtime(true); + $this->callback = $this->buildCallback($callback); + $this->hasCallback = null !== $callback; + $descriptors = $this->getDescriptors(); + + if ($this->env) { + $env += $this->env; + } + + $env += $this->getDefaultEnv(); + + if (\is_array($commandline = $this->commandline)) { + $commandline = implode(' ', array_map([$this, 'escapeArgument'], $commandline)); + + if ('\\' !== \DIRECTORY_SEPARATOR) { + // exec is mandatory to deal with sending a signal to the process + $commandline = 'exec '.$commandline; + } + } else { + $commandline = $this->replacePlaceholders($commandline, $env); + } + + $options = ['suppress_errors' => true]; + + if ('\\' === \DIRECTORY_SEPARATOR) { + $options['bypass_shell'] = true; + $commandline = $this->prepareWindowsCommandLine($commandline, $env); + } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) { + // last exit code is output on the fourth pipe and caught to work around --enable-sigchild + $descriptors[3] = ['pipe', 'w']; + + // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input + $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;'; + $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code'; + + // Workaround for the bug, when PTS functionality is enabled. + // @see : https://bugs.php.net/69442 + $ptsWorkaround = fopen(__FILE__, 'r'); + } + + $envPairs = []; + foreach ($env as $k => $v) { + if (false !== $v) { + $envPairs[] = $k.'='.$v; + } + } + + if (!is_dir($this->cwd)) { + throw new RuntimeException(sprintf('The provided cwd "%s" does not exist.', $this->cwd)); + } + + $this->process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $options); + + if (!\is_resource($this->process)) { + throw new RuntimeException('Unable to launch a new process.'); + } + $this->status = self::STATUS_STARTED; + + if (isset($descriptors[3])) { + $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]); + } + + if ($this->tty) { + return; + } + + $this->updateStatus(false); + $this->checkTimeout(); + } + + /** + * Restarts the process. + * + * Be warned that the process is cloned before being started. + * + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @return static + * + * @throws RuntimeException When process can't be launched + * @throws RuntimeException When process is already running + * + * @see start() + * + * @final + */ + public function restart(callable $callback = null, array $env = []): self + { + if ($this->isRunning()) { + throw new RuntimeException('Process is already running.'); + } + + $process = clone $this; + $process->start($callback, $env); + + return $process; + } + + /** + * Waits for the process to terminate. + * + * The callback receives the type of output (out or err) and some bytes + * from the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @param callable|null $callback A valid PHP callback + * + * @return int The exitcode of the process + * + * @throws ProcessTimedOutException When process timed out + * @throws ProcessSignaledException When process stopped after receiving signal + * @throws LogicException When process is not yet started + */ + public function wait(callable $callback = null) + { + $this->requireProcessIsStarted(__FUNCTION__); + + $this->updateStatus(false); + + if (null !== $callback) { + if (!$this->processPipes->haveReadSupport()) { + $this->stop(0); + throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".'); + } + $this->callback = $this->buildCallback($callback); + } + + do { + $this->checkTimeout(); + $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); + $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); + } while ($running); + + while ($this->isRunning()) { + $this->checkTimeout(); + usleep(1000); + } + + if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) { + throw new ProcessSignaledException($this); + } + + return $this->exitcode; + } + + /** + * Waits until the callback returns true. + * + * The callback receives the type of output (out or err) and some bytes + * from the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @throws RuntimeException When process timed out + * @throws LogicException When process is not yet started + * @throws ProcessTimedOutException In case the timeout was reached + */ + public function waitUntil(callable $callback): bool + { + $this->requireProcessIsStarted(__FUNCTION__); + $this->updateStatus(false); + + if (!$this->processPipes->haveReadSupport()) { + $this->stop(0); + throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".'); + } + $callback = $this->buildCallback($callback); + + $ready = false; + while (true) { + $this->checkTimeout(); + $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); + $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); + + foreach ($output as $type => $data) { + if (3 !== $type) { + $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready; + } elseif (!isset($this->fallbackStatus['signaled'])) { + $this->fallbackStatus['exitcode'] = (int) $data; + } + } + if ($ready) { + return true; + } + if (!$running) { + return false; + } + + usleep(1000); + } + } + + /** + * Returns the Pid (process identifier), if applicable. + * + * @return int|null The process id if running, null otherwise + */ + public function getPid() + { + return $this->isRunning() ? $this->processInformation['pid'] : null; + } + + /** + * Sends a POSIX signal to the process. + * + * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) + * + * @return $this + * + * @throws LogicException In case the process is not running + * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed + * @throws RuntimeException In case of failure + */ + public function signal(int $signal) + { + $this->doSignal($signal, true); + + return $this; + } + + /** + * Disables fetching output and error output from the underlying process. + * + * @return $this + * + * @throws RuntimeException In case the process is already running + * @throws LogicException if an idle timeout is set + */ + public function disableOutput() + { + if ($this->isRunning()) { + throw new RuntimeException('Disabling output while the process is running is not possible.'); + } + if (null !== $this->idleTimeout) { + throw new LogicException('Output can not be disabled while an idle timeout is set.'); + } + + $this->outputDisabled = true; + + return $this; + } + + /** + * Enables fetching output and error output from the underlying process. + * + * @return $this + * + * @throws RuntimeException In case the process is already running + */ + public function enableOutput() + { + if ($this->isRunning()) { + throw new RuntimeException('Enabling output while the process is running is not possible.'); + } + + $this->outputDisabled = false; + + return $this; + } + + /** + * Returns true in case the output is disabled, false otherwise. + * + * @return bool + */ + public function isOutputDisabled() + { + return $this->outputDisabled; + } + + /** + * Returns the current output of the process (STDOUT). + * + * @return string The process output + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + if (false === $ret = stream_get_contents($this->stdout, -1, 0)) { + return ''; + } + + return $ret; + } + + /** + * Returns the output incrementally. + * + * In comparison with the getOutput method which always return the whole + * output, this one returns the new output since the last call. + * + * @return string The process output since the last call + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getIncrementalOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + $latest = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); + $this->incrementalOutputOffset = ftell($this->stdout); + + if (false === $latest) { + return ''; + } + + return $latest; + } + + /** + * Returns an iterator to the output of the process, with the output type as keys (Process::OUT/ERR). + * + * @param int $flags A bit field of Process::ITER_* flags + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + * + * @return \Generator + */ + public function getIterator(int $flags = 0) + { + $this->readPipesForOutput(__FUNCTION__, false); + + $clearOutput = !(self::ITER_KEEP_OUTPUT & $flags); + $blocking = !(self::ITER_NON_BLOCKING & $flags); + $yieldOut = !(self::ITER_SKIP_OUT & $flags); + $yieldErr = !(self::ITER_SKIP_ERR & $flags); + + while (null !== $this->callback || ($yieldOut && !feof($this->stdout)) || ($yieldErr && !feof($this->stderr))) { + if ($yieldOut) { + $out = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); + + if (isset($out[0])) { + if ($clearOutput) { + $this->clearOutput(); + } else { + $this->incrementalOutputOffset = ftell($this->stdout); + } + + yield self::OUT => $out; + } + } + + if ($yieldErr) { + $err = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); + + if (isset($err[0])) { + if ($clearOutput) { + $this->clearErrorOutput(); + } else { + $this->incrementalErrorOutputOffset = ftell($this->stderr); + } + + yield self::ERR => $err; + } + } + + if (!$blocking && !isset($out[0]) && !isset($err[0])) { + yield self::OUT => ''; + } + + $this->checkTimeout(); + $this->readPipesForOutput(__FUNCTION__, $blocking); + } + } + + /** + * Clears the process output. + * + * @return $this + */ + public function clearOutput() + { + ftruncate($this->stdout, 0); + fseek($this->stdout, 0); + $this->incrementalOutputOffset = 0; + + return $this; + } + + /** + * Returns the current error output of the process (STDERR). + * + * @return string The process error output + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getErrorOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + if (false === $ret = stream_get_contents($this->stderr, -1, 0)) { + return ''; + } + + return $ret; + } + + /** + * Returns the errorOutput incrementally. + * + * In comparison with the getErrorOutput method which always return the + * whole error output, this one returns the new error output since the last + * call. + * + * @return string The process error output since the last call + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getIncrementalErrorOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + $latest = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); + $this->incrementalErrorOutputOffset = ftell($this->stderr); + + if (false === $latest) { + return ''; + } + + return $latest; + } + + /** + * Clears the process output. + * + * @return $this + */ + public function clearErrorOutput() + { + ftruncate($this->stderr, 0); + fseek($this->stderr, 0); + $this->incrementalErrorOutputOffset = 0; + + return $this; + } + + /** + * Returns the exit code returned by the process. + * + * @return int|null The exit status code, null if the Process is not terminated + */ + public function getExitCode() + { + $this->updateStatus(false); + + return $this->exitcode; + } + + /** + * Returns a string representation for the exit code returned by the process. + * + * This method relies on the Unix exit code status standardization + * and might not be relevant for other operating systems. + * + * @return string|null A string representation for the exit status code, null if the Process is not terminated + * + * @see http://tldp.org/LDP/abs/html/exitcodes.html + * @see http://en.wikipedia.org/wiki/Unix_signal + */ + public function getExitCodeText() + { + if (null === $exitcode = $this->getExitCode()) { + return null; + } + + return isset(self::$exitCodes[$exitcode]) ? self::$exitCodes[$exitcode] : 'Unknown error'; + } + + /** + * Checks if the process ended successfully. + * + * @return bool true if the process ended successfully, false otherwise + */ + public function isSuccessful() + { + return 0 === $this->getExitCode(); + } + + /** + * Returns true if the child process has been terminated by an uncaught signal. + * + * It always returns false on Windows. + * + * @return bool + * + * @throws LogicException In case the process is not terminated + */ + public function hasBeenSignaled() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + return $this->processInformation['signaled']; + } + + /** + * Returns the number of the signal that caused the child process to terminate its execution. + * + * It is only meaningful if hasBeenSignaled() returns true. + * + * @return int + * + * @throws RuntimeException In case --enable-sigchild is activated + * @throws LogicException In case the process is not terminated + */ + public function getTermSignal() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) { + throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.'); + } + + return $this->processInformation['termsig']; + } + + /** + * Returns true if the child process has been stopped by a signal. + * + * It always returns false on Windows. + * + * @return bool + * + * @throws LogicException In case the process is not terminated + */ + public function hasBeenStopped() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + return $this->processInformation['stopped']; + } + + /** + * Returns the number of the signal that caused the child process to stop its execution. + * + * It is only meaningful if hasBeenStopped() returns true. + * + * @return int + * + * @throws LogicException In case the process is not terminated + */ + public function getStopSignal() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + return $this->processInformation['stopsig']; + } + + /** + * Checks if the process is currently running. + * + * @return bool true if the process is currently running, false otherwise + */ + public function isRunning() + { + if (self::STATUS_STARTED !== $this->status) { + return false; + } + + $this->updateStatus(false); + + return $this->processInformation['running']; + } + + /** + * Checks if the process has been started with no regard to the current state. + * + * @return bool true if status is ready, false otherwise + */ + public function isStarted() + { + return self::STATUS_READY != $this->status; + } + + /** + * Checks if the process is terminated. + * + * @return bool true if process is terminated, false otherwise + */ + public function isTerminated() + { + $this->updateStatus(false); + + return self::STATUS_TERMINATED == $this->status; + } + + /** + * Gets the process status. + * + * The status is one of: ready, started, terminated. + * + * @return string The current process status + */ + public function getStatus() + { + $this->updateStatus(false); + + return $this->status; + } + + /** + * Stops the process. + * + * @param int|float $timeout The timeout in seconds + * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9) + * + * @return int|null The exit-code of the process or null if it's not running + */ + public function stop(float $timeout = 10, int $signal = null) + { + $timeoutMicro = microtime(true) + $timeout; + if ($this->isRunning()) { + // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here + $this->doSignal(15, false); + do { + usleep(1000); + } while ($this->isRunning() && microtime(true) < $timeoutMicro); + + if ($this->isRunning()) { + // Avoid exception here: process is supposed to be running, but it might have stopped just + // after this line. In any case, let's silently discard the error, we cannot do anything. + $this->doSignal($signal ?: 9, false); + } + } + + if ($this->isRunning()) { + if (isset($this->fallbackStatus['pid'])) { + unset($this->fallbackStatus['pid']); + + return $this->stop(0, $signal); + } + $this->close(); + } + + return $this->exitcode; + } + + /** + * Adds a line to the STDOUT stream. + * + * @internal + */ + public function addOutput(string $line) + { + $this->lastOutputTime = microtime(true); + + fseek($this->stdout, 0, SEEK_END); + fwrite($this->stdout, $line); + fseek($this->stdout, $this->incrementalOutputOffset); + } + + /** + * Adds a line to the STDERR stream. + * + * @internal + */ + public function addErrorOutput(string $line) + { + $this->lastOutputTime = microtime(true); + + fseek($this->stderr, 0, SEEK_END); + fwrite($this->stderr, $line); + fseek($this->stderr, $this->incrementalErrorOutputOffset); + } + + /** + * Gets the last output time in seconds. + * + * @return float|null The last output time in seconds or null if it isn't started + */ + public function getLastOutputTime(): ?float + { + return $this->lastOutputTime; + } + + /** + * Gets the command line to be executed. + * + * @return string The command to execute + */ + public function getCommandLine() + { + return \is_array($this->commandline) ? implode(' ', array_map([$this, 'escapeArgument'], $this->commandline)) : $this->commandline; + } + + /** + * Gets the process timeout (max. runtime). + * + * @return float|null The timeout in seconds or null if it's disabled + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * Gets the process idle timeout (max. time since last output). + * + * @return float|null The timeout in seconds or null if it's disabled + */ + public function getIdleTimeout() + { + return $this->idleTimeout; + } + + /** + * Sets the process timeout (max. runtime) in seconds. + * + * To disable the timeout, set this value to null. + * + * @return $this + * + * @throws InvalidArgumentException if the timeout is negative + */ + public function setTimeout(?float $timeout) + { + $this->timeout = $this->validateTimeout($timeout); + + return $this; + } + + /** + * Sets the process idle timeout (max. time since last output) in seconds. + * + * To disable the timeout, set this value to null. + * + * @return $this + * + * @throws LogicException if the output is disabled + * @throws InvalidArgumentException if the timeout is negative + */ + public function setIdleTimeout(?float $timeout) + { + if (null !== $timeout && $this->outputDisabled) { + throw new LogicException('Idle timeout can not be set while the output is disabled.'); + } + + $this->idleTimeout = $this->validateTimeout($timeout); + + return $this; + } + + /** + * Enables or disables the TTY mode. + * + * @return $this + * + * @throws RuntimeException In case the TTY mode is not supported + */ + public function setTty(bool $tty) + { + if ('\\' === \DIRECTORY_SEPARATOR && $tty) { + throw new RuntimeException('TTY mode is not supported on Windows platform.'); + } + + if ($tty && !self::isTtySupported()) { + throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.'); + } + + $this->tty = $tty; + + return $this; + } + + /** + * Checks if the TTY mode is enabled. + * + * @return bool true if the TTY mode is enabled, false otherwise + */ + public function isTty() + { + return $this->tty; + } + + /** + * Sets PTY mode. + * + * @return $this + */ + public function setPty(bool $bool) + { + $this->pty = $bool; + + return $this; + } + + /** + * Returns PTY state. + * + * @return bool + */ + public function isPty() + { + return $this->pty; + } + + /** + * Gets the working directory. + * + * @return string|null The current working directory or null on failure + */ + public function getWorkingDirectory() + { + if (null === $this->cwd) { + // getcwd() will return false if any one of the parent directories does not have + // the readable or search mode set, even if the current directory does + return getcwd() ?: null; + } + + return $this->cwd; + } + + /** + * Sets the current working directory. + * + * @return $this + */ + public function setWorkingDirectory(string $cwd) + { + $this->cwd = $cwd; + + return $this; + } + + /** + * Gets the environment variables. + * + * @return array The current environment variables + */ + public function getEnv() + { + return $this->env; + } + + /** + * Sets the environment variables. + * + * Each environment variable value should be a string. + * If it is an array, the variable is ignored. + * If it is false or null, it will be removed when + * env vars are otherwise inherited. + * + * That happens in PHP when 'argv' is registered into + * the $_ENV array for instance. + * + * @param array $env The new environment variables + * + * @return $this + */ + public function setEnv(array $env) + { + // Process can not handle env values that are arrays + $env = array_filter($env, function ($value) { + return !\is_array($value); + }); + + $this->env = $env; + + return $this; + } + + /** + * Gets the Process input. + * + * @return resource|string|\Iterator|null The Process input + */ + public function getInput() + { + return $this->input; + } + + /** + * Sets the input. + * + * This content will be passed to the underlying process standard input. + * + * @param string|int|float|bool|resource|\Traversable|null $input The content + * + * @return $this + * + * @throws LogicException In case the process is running + */ + public function setInput($input) + { + if ($this->isRunning()) { + throw new LogicException('Input can not be set while the process is running.'); + } + + $this->input = ProcessUtils::validateInput(__METHOD__, $input); + + return $this; + } + + /** + * Performs a check between the timeout definition and the time the process started. + * + * In case you run a background process (with the start method), you should + * trigger this method regularly to ensure the process timeout + * + * @throws ProcessTimedOutException In case the timeout was reached + */ + public function checkTimeout() + { + if (self::STATUS_STARTED !== $this->status) { + return; + } + + if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) { + $this->stop(0); + + throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL); + } + + if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) { + $this->stop(0); + + throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE); + } + } + + /** + * @throws LogicException in case process is not started + */ + public function getStartTime(): float + { + if (!$this->isStarted()) { + throw new LogicException('Start time is only available after process start.'); + } + + return $this->starttime; + } + + /** + * Returns whether TTY is supported on the current operating system. + */ + public static function isTtySupported(): bool + { + static $isTtySupported; + + if (null === $isTtySupported) { + $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + } + + return $isTtySupported; + } + + /** + * Returns whether PTY is supported on the current operating system. + * + * @return bool + */ + public static function isPtySupported() + { + static $result; + + if (null !== $result) { + return $result; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + return $result = false; + } + + return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); + } + + /** + * Creates the descriptors needed by the proc_open. + */ + private function getDescriptors(): array + { + if ($this->input instanceof \Iterator) { + $this->input->rewind(); + } + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $this->hasCallback); + } else { + $this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $this->hasCallback); + } + + return $this->processPipes->getDescriptors(); + } + + /** + * Builds up the callback used by wait(). + * + * The callbacks adds all occurred output to the specific buffer and calls + * the user callback (if present) with the received output. + * + * @param callable|null $callback The user defined PHP callback + * + * @return \Closure A PHP closure + */ + protected function buildCallback(callable $callback = null) + { + if ($this->outputDisabled) { + return function ($type, $data) use ($callback): bool { + return null !== $callback && $callback($type, $data); + }; + } + + $out = self::OUT; + + return function ($type, $data) use ($callback, $out): bool { + if ($out == $type) { + $this->addOutput($data); + } else { + $this->addErrorOutput($data); + } + + return null !== $callback && $callback($type, $data); + }; + } + + /** + * Updates the status of the process, reads pipes. + * + * @param bool $blocking Whether to use a blocking read call + */ + protected function updateStatus(bool $blocking) + { + if (self::STATUS_STARTED !== $this->status) { + return; + } + + $this->processInformation = proc_get_status($this->process); + $running = $this->processInformation['running']; + + $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running); + + if ($this->fallbackStatus && $this->isSigchildEnabled()) { + $this->processInformation = $this->fallbackStatus + $this->processInformation; + } + + if (!$running) { + $this->close(); + } + } + + /** + * Returns whether PHP has been compiled with the '--enable-sigchild' option or not. + * + * @return bool + */ + protected function isSigchildEnabled() + { + if (null !== self::$sigchild) { + return self::$sigchild; + } + + if (!\function_exists('phpinfo')) { + return self::$sigchild = false; + } + + ob_start(); + phpinfo(INFO_GENERAL); + + return self::$sigchild = false !== strpos(ob_get_clean(), '--enable-sigchild'); + } + + /** + * Reads pipes for the freshest output. + * + * @param string $caller The name of the method that needs fresh outputs + * @param bool $blocking Whether to use blocking calls or not + * + * @throws LogicException in case output has been disabled or process is not started + */ + private function readPipesForOutput(string $caller, bool $blocking = false) + { + if ($this->outputDisabled) { + throw new LogicException('Output has been disabled.'); + } + + $this->requireProcessIsStarted($caller); + + $this->updateStatus($blocking); + } + + /** + * Validates and returns the filtered timeout. + * + * @throws InvalidArgumentException if the given timeout is a negative number + */ + private function validateTimeout(?float $timeout): ?float + { + $timeout = (float) $timeout; + + if (0.0 === $timeout) { + $timeout = null; + } elseif ($timeout < 0) { + throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); + } + + return $timeout; + } + + /** + * Reads pipes, executes callback. + * + * @param bool $blocking Whether to use blocking calls or not + * @param bool $close Whether to close file handles or not + */ + private function readPipes(bool $blocking, bool $close) + { + $result = $this->processPipes->readAndWrite($blocking, $close); + + $callback = $this->callback; + foreach ($result as $type => $data) { + if (3 !== $type) { + $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data); + } elseif (!isset($this->fallbackStatus['signaled'])) { + $this->fallbackStatus['exitcode'] = (int) $data; + } + } + } + + /** + * Closes process resource, closes file handles, sets the exitcode. + * + * @return int The exitcode + */ + private function close(): int + { + $this->processPipes->close(); + if (\is_resource($this->process)) { + proc_close($this->process); + } + $this->exitcode = $this->processInformation['exitcode']; + $this->status = self::STATUS_TERMINATED; + + if (-1 === $this->exitcode) { + if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) { + // if process has been signaled, no exitcode but a valid termsig, apply Unix convention + $this->exitcode = 128 + $this->processInformation['termsig']; + } elseif ($this->isSigchildEnabled()) { + $this->processInformation['signaled'] = true; + $this->processInformation['termsig'] = -1; + } + } + + // Free memory from self-reference callback created by buildCallback + // Doing so in other contexts like __destruct or by garbage collector is ineffective + // Now pipes are closed, so the callback is no longer necessary + $this->callback = null; + + return $this->exitcode; + } + + /** + * Resets data related to the latest run of the process. + */ + private function resetProcessData() + { + $this->starttime = null; + $this->callback = null; + $this->exitcode = null; + $this->fallbackStatus = []; + $this->processInformation = null; + $this->stdout = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+b'); + $this->stderr = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+b'); + $this->process = null; + $this->latestSignal = null; + $this->status = self::STATUS_READY; + $this->incrementalOutputOffset = 0; + $this->incrementalErrorOutputOffset = 0; + } + + /** + * Sends a POSIX signal to the process. + * + * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) + * @param bool $throwException Whether to throw exception in case signal failed + * + * @return bool True if the signal was sent successfully, false otherwise + * + * @throws LogicException In case the process is not running + * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed + * @throws RuntimeException In case of failure + */ + private function doSignal(int $signal, bool $throwException): bool + { + if (null === $pid = $this->getPid()) { + if ($throwException) { + throw new LogicException('Can not send signal on a non running process.'); + } + + return false; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + exec(sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode); + if ($exitCode && $this->isRunning()) { + if ($throwException) { + throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output))); + } + + return false; + } + } else { + if (!$this->isSigchildEnabled()) { + $ok = @proc_terminate($this->process, $signal); + } elseif (\function_exists('posix_kill')) { + $ok = @posix_kill($pid, $signal); + } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { + $ok = false === fgets($pipes[2]); + } + if (!$ok) { + if ($throwException) { + throw new RuntimeException(sprintf('Error while sending signal "%s".', $signal)); + } + + return false; + } + } + + $this->latestSignal = $signal; + $this->fallbackStatus['signaled'] = true; + $this->fallbackStatus['exitcode'] = -1; + $this->fallbackStatus['termsig'] = $this->latestSignal; + + return true; + } + + private function prepareWindowsCommandLine(string $cmd, array &$env): string + { + $uid = uniqid('', true); + $varCount = 0; + $varCache = []; + $cmd = preg_replace_callback( + '/"(?:( + [^"%!^]*+ + (?: + (?: !LF! | "(?:\^[%!^])?+" ) + [^"%!^]*+ + )++ + ) | [^"]*+ )"/x', + function ($m) use (&$env, &$varCache, &$varCount, $uid) { + if (!isset($m[1])) { + return $m[0]; + } + if (isset($varCache[$m[0]])) { + return $varCache[$m[0]]; + } + if (false !== strpos($value = $m[1], "\0")) { + $value = str_replace("\0", '?', $value); + } + if (false === strpbrk($value, "\"%!\n")) { + return '"'.$value.'"'; + } + + $value = str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value); + $value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"'; + $var = $uid.++$varCount; + + $env[$var] = $value; + + return $varCache[$m[0]] = '!'.$var.'!'; + }, + $cmd + ); + + $cmd = 'cmd /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')'; + foreach ($this->processPipes->getFiles() as $offset => $filename) { + $cmd .= ' '.$offset.'>"'.$filename.'"'; + } + + return $cmd; + } + + /** + * Ensures the process is running or terminated, throws a LogicException if the process has a not started. + * + * @throws LogicException if the process has not run + */ + private function requireProcessIsStarted(string $functionName) + { + if (!$this->isStarted()) { + throw new LogicException(sprintf('Process must be started before calling "%s()".', $functionName)); + } + } + + /** + * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated". + * + * @throws LogicException if the process is not yet terminated + */ + private function requireProcessIsTerminated(string $functionName) + { + if (!$this->isTerminated()) { + throw new LogicException(sprintf('Process must be terminated before calling "%s()".', $functionName)); + } + } + + /** + * Escapes a string to be used as a shell argument. + */ + private function escapeArgument(?string $argument): string + { + if ('' === $argument || null === $argument) { + return '""'; + } + if ('\\' !== \DIRECTORY_SEPARATOR) { + return "'".str_replace("'", "'\\''", $argument)."'"; + } + if (false !== strpos($argument, "\0")) { + $argument = str_replace("\0", '?', $argument); + } + if (!preg_match('/[\/()%!^"<>&|\s]/', $argument)) { + return $argument; + } + $argument = preg_replace('/(\\\\+)$/', '$1$1', $argument); + + return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"'; + } + + private function replacePlaceholders(string $commandline, array $env) + { + return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) { + if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) { + throw new InvalidArgumentException(sprintf('Command line is missing a value for parameter "%s": ', $matches[1]).$commandline); + } + + return $this->escapeArgument($env[$matches[1]]); + }, $commandline); + } + + private function getDefaultEnv(): array + { + $env = []; + + foreach ($_SERVER as $k => $v) { + if (\is_string($v) && false !== $v = getenv($k)) { + $env[$k] = $v; + } + } + + foreach ($_ENV as $k => $v) { + if (\is_string($v)) { + $env[$k] = $v; + } + } + + return $env; + } +} diff --git a/vendor/symfony/process/ProcessUtils.php b/vendor/symfony/process/ProcessUtils.php new file mode 100644 index 0000000..3be7e61 --- /dev/null +++ b/vendor/symfony/process/ProcessUtils.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\InvalidArgumentException; + +/** + * ProcessUtils is a bunch of utility methods. + * + * This class contains static methods only and is not meant to be instantiated. + * + * @author Martin Hasoň + */ +class ProcessUtils +{ + /** + * This class should not be instantiated. + */ + private function __construct() + { + } + + /** + * Validates and normalizes a Process input. + * + * @param string $caller The name of method call that validates the input + * @param mixed $input The input to validate + * + * @return mixed The validated input + * + * @throws InvalidArgumentException In case the input is not valid + */ + public static function validateInput(string $caller, $input) + { + if (null !== $input) { + if (\is_resource($input)) { + return $input; + } + if (\is_string($input)) { + return $input; + } + if (is_scalar($input)) { + return (string) $input; + } + if ($input instanceof Process) { + return $input->getIterator($input::ITER_SKIP_ERR); + } + if ($input instanceof \Iterator) { + return $input; + } + if ($input instanceof \Traversable) { + return new \IteratorIterator($input); + } + + throw new InvalidArgumentException(sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller)); + } + + return $input; + } +} diff --git a/vendor/symfony/process/README.md b/vendor/symfony/process/README.md new file mode 100644 index 0000000..b7ca5b4 --- /dev/null +++ b/vendor/symfony/process/README.md @@ -0,0 +1,13 @@ +Process Component +================= + +The Process component executes commands in sub-processes. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/process.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/process/composer.json b/vendor/symfony/process/composer.json new file mode 100644 index 0000000..1957e56 --- /dev/null +++ b/vendor/symfony/process/composer.json @@ -0,0 +1,34 @@ +{ + "name": "symfony/process", + "type": "library", + "description": "Symfony Process Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Process\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/routing/Annotation/Route.php b/vendor/symfony/routing/Annotation/Route.php new file mode 100644 index 0000000..9d74fdd --- /dev/null +++ b/vendor/symfony/routing/Annotation/Route.php @@ -0,0 +1,195 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Annotation; + +/** + * Annotation class for @Route(). + * + * @Annotation + * @Target({"CLASS", "METHOD"}) + * + * @author Fabien Potencier + */ +class Route +{ + private $path; + private $localizedPaths = []; + private $name; + private $requirements = []; + private $options = []; + private $defaults = []; + private $host; + private $methods = []; + private $schemes = []; + private $condition; + private $priority; + + /** + * @param array $data An array of key/value parameters + * + * @throws \BadMethodCallException + */ + public function __construct(array $data) + { + if (isset($data['localized_paths'])) { + throw new \BadMethodCallException(sprintf('Unknown property "localized_paths" on annotation "%s".', static::class)); + } + + if (isset($data['value'])) { + $data[\is_array($data['value']) ? 'localized_paths' : 'path'] = $data['value']; + unset($data['value']); + } + + if (isset($data['path']) && \is_array($data['path'])) { + $data['localized_paths'] = $data['path']; + unset($data['path']); + } + + if (isset($data['locale'])) { + $data['defaults']['_locale'] = $data['locale']; + unset($data['locale']); + } + + if (isset($data['format'])) { + $data['defaults']['_format'] = $data['format']; + unset($data['format']); + } + + if (isset($data['utf8'])) { + $data['options']['utf8'] = filter_var($data['utf8'], FILTER_VALIDATE_BOOLEAN) ?: false; + unset($data['utf8']); + } + + if (isset($data['stateless'])) { + $data['defaults']['_stateless'] = filter_var($data['stateless'], FILTER_VALIDATE_BOOLEAN) ?: false; + unset($data['stateless']); + } + + foreach ($data as $key => $value) { + $method = 'set'.str_replace('_', '', $key); + if (!method_exists($this, $method)) { + throw new \BadMethodCallException(sprintf('Unknown property "%s" on annotation "%s".', $key, static::class)); + } + $this->$method($value); + } + } + + public function setPath($path) + { + $this->path = $path; + } + + public function getPath() + { + return $this->path; + } + + public function setLocalizedPaths(array $localizedPaths) + { + $this->localizedPaths = $localizedPaths; + } + + public function getLocalizedPaths(): array + { + return $this->localizedPaths; + } + + public function setHost($pattern) + { + $this->host = $pattern; + } + + public function getHost() + { + return $this->host; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setRequirements($requirements) + { + $this->requirements = $requirements; + } + + public function getRequirements() + { + return $this->requirements; + } + + public function setOptions($options) + { + $this->options = $options; + } + + public function getOptions() + { + return $this->options; + } + + public function setDefaults($defaults) + { + $this->defaults = $defaults; + } + + public function getDefaults() + { + return $this->defaults; + } + + public function setSchemes($schemes) + { + $this->schemes = \is_array($schemes) ? $schemes : [$schemes]; + } + + public function getSchemes() + { + return $this->schemes; + } + + public function setMethods($methods) + { + $this->methods = \is_array($methods) ? $methods : [$methods]; + } + + public function getMethods() + { + return $this->methods; + } + + public function setCondition($condition) + { + $this->condition = $condition; + } + + public function getCondition() + { + return $this->condition; + } + + public function setPriority(int $priority): void + { + $this->priority = $priority; + } + + public function getPriority(): ?int + { + return $this->priority; + } +} diff --git a/vendor/symfony/routing/CHANGELOG.md b/vendor/symfony/routing/CHANGELOG.md new file mode 100644 index 0000000..d14549b --- /dev/null +++ b/vendor/symfony/routing/CHANGELOG.md @@ -0,0 +1,281 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added the protected method `PhpFileLoader::callConfigurator()` as extension point to ease custom routing configuration + * deprecated `RouteCollectionBuilder` in favor of `RoutingConfigurator`. + * added "priority" option to annotated routes + * added argument `$priority` to `RouteCollection::add()` + * deprecated the `RouteCompiler::REGEX_DELIMITER` constant + * added `ExpressionLanguageProvider` to expose extra functions to route conditions + * added support for a `stateless` keyword for configuring route stateless in PHP, YAML and XML configurations. + * added the "hosts" option to be able to configure the host per locale. + * added `RequestContext::fromUri()` to ease building the default context + +5.0.0 +----- + + * removed `PhpGeneratorDumper` and `PhpMatcherDumper` + * removed `generator_base_class`, `generator_cache_class`, `matcher_base_class` and `matcher_cache_class` router options + * `Serializable` implementing methods for `Route` and `CompiledRoute` are final + * removed referencing service route loaders with a single colon + * Removed `ServiceRouterLoader` and `ObjectRouteLoader`. + +4.4.0 +----- + + * Deprecated `ServiceRouterLoader` in favor of `ContainerLoader`. + * Deprecated `ObjectRouteLoader` in favor of `ObjectLoader`. + * Added a way to exclude patterns of resources from being imported by the `import()` method + +4.3.0 +----- + + * added `CompiledUrlMatcher` and `CompiledUrlMatcherDumper` + * added `CompiledUrlGenerator` and `CompiledUrlGeneratorDumper` + * deprecated `PhpGeneratorDumper` and `PhpMatcherDumper` + * deprecated `generator_base_class`, `generator_cache_class`, `matcher_base_class` and `matcher_cache_class` router options + * `Serializable` implementing methods for `Route` and `CompiledRoute` are marked as `@internal` and `@final`. + Instead of overwriting them, use `__serialize` and `__unserialize` as extension points which are forward compatible + with the new serialization methods in PHP 7.4. + * exposed `utf8` Route option, defaults "locale" and "format" in configuration loaders and configurators + * added support for invokable service route loaders + +4.2.0 +----- + + * added fallback to cultureless locale for internationalized routes + +4.0.0 +----- + + * dropped support for using UTF-8 route patterns without using the `utf8` option + * dropped support for using UTF-8 route requirements without using the `utf8` option + +3.4.0 +----- + + * Added `NoConfigurationException`. + * Added the possibility to define a prefix for all routes of a controller via @Route(name="prefix_") + * Added support for prioritized routing loaders. + * Add matched and default parameters to redirect responses + * Added support for a `controller` keyword for configuring route controllers in YAML and XML configurations. + +3.3.0 +----- + + * [DEPRECATION] Class parameters have been deprecated and will be removed in 4.0. + * router.options.generator_class + * router.options.generator_base_class + * router.options.generator_dumper_class + * router.options.matcher_class + * router.options.matcher_base_class + * router.options.matcher_dumper_class + * router.options.matcher.cache_class + * router.options.generator.cache_class + +3.2.0 +----- + + * Added support for `bool`, `int`, `float`, `string`, `list` and `map` defaults in XML configurations. + * Added support for UTF-8 requirements + +2.8.0 +----- + + * allowed specifying a directory to recursively load all routing configuration files it contains + * Added ObjectRouteLoader and ServiceRouteLoader that allow routes to be loaded + by calling a method on an object/service. + * [DEPRECATION] Deprecated the hardcoded value for the `$referenceType` argument of the `UrlGeneratorInterface::generate` method. + Use the constants defined in the `UrlGeneratorInterface` instead. + + Before: + + ```php + $router->generate('blog_show', ['slug' => 'my-blog-post'], true); + ``` + + After: + + ```php + use Symfony\Component\Routing\Generator\UrlGeneratorInterface; + + $router->generate('blog_show', ['slug' => 'my-blog-post'], UrlGeneratorInterface::ABSOLUTE_URL); + ``` + +2.5.0 +----- + + * [DEPRECATION] The `ApacheMatcherDumper` and `ApacheUrlMatcher` were deprecated and + will be removed in Symfony 3.0, since the performance gains were minimal and + it's hard to replicate the behavior of PHP implementation. + +2.3.0 +----- + + * added RequestContext::getQueryString() + +2.2.0 +----- + + * [DEPRECATION] Several route settings have been renamed (the old ones will be removed in 3.0): + + * The `pattern` setting for a route has been deprecated in favor of `path` + * The `_scheme` and `_method` requirements have been moved to the `schemes` and `methods` settings + + Before: + + ```yaml + article_edit: + pattern: /article/{id} + requirements: { '_method': 'POST|PUT', '_scheme': 'https', 'id': '\d+' } + ``` + + ```xml + + POST|PUT + https + \d+ + + ``` + + ```php + $route = new Route(); + $route->setPattern('/article/{id}'); + $route->setRequirement('_method', 'POST|PUT'); + $route->setRequirement('_scheme', 'https'); + ``` + + After: + + ```yaml + article_edit: + path: /article/{id} + methods: [POST, PUT] + schemes: https + requirements: { 'id': '\d+' } + ``` + + ```xml + + \d+ + + ``` + + ```php + $route = new Route(); + $route->setPath('/article/{id}'); + $route->setMethods(['POST', 'PUT']); + $route->setSchemes('https'); + ``` + + * [BC BREAK] RouteCollection does not behave like a tree structure anymore but as + a flat array of Routes. So when using PHP to build the RouteCollection, you must + make sure to add routes to the sub-collection before adding it to the parent + collection (this is not relevant when using YAML or XML for Route definitions). + + Before: + + ```php + $rootCollection = new RouteCollection(); + $subCollection = new RouteCollection(); + $rootCollection->addCollection($subCollection); + $subCollection->add('foo', new Route('/foo')); + ``` + + After: + + ```php + $rootCollection = new RouteCollection(); + $subCollection = new RouteCollection(); + $subCollection->add('foo', new Route('/foo')); + $rootCollection->addCollection($subCollection); + ``` + + Also one must call `addCollection` from the bottom to the top hierarchy. + So the correct sequence is the following (and not the reverse): + + ```php + $childCollection->addCollection($grandchildCollection); + $rootCollection->addCollection($childCollection); + ``` + + * [DEPRECATION] The methods `RouteCollection::getParent()` and `RouteCollection::getRoot()` + have been deprecated and will be removed in Symfony 2.3. + * [BC BREAK] Misusing the `RouteCollection::addPrefix` method to add defaults, requirements + or options without adding a prefix is not supported anymore. So if you called `addPrefix` + with an empty prefix or `/` only (both have no relevance), like + `addPrefix('', $defaultsArray, $requirementsArray, $optionsArray)` + you need to use the new dedicated methods `addDefaults($defaultsArray)`, + `addRequirements($requirementsArray)` or `addOptions($optionsArray)` instead. + * [DEPRECATION] The `$options` parameter to `RouteCollection::addPrefix()` has been deprecated + because adding options has nothing to do with adding a path prefix. If you want to add options + to all child routes of a RouteCollection, you can use `addOptions()`. + * [DEPRECATION] The method `RouteCollection::getPrefix()` has been deprecated + because it suggested that all routes in the collection would have this prefix, which is + not necessarily true. On top of that, since there is no tree structure anymore, this method + is also useless. Don't worry about performance, prefix optimization for matching is still done + in the dumper, which was also improved in 2.2.0 to find even more grouping possibilities. + * [DEPRECATION] `RouteCollection::addCollection(RouteCollection $collection)` should now only be + used with a single parameter. The other params `$prefix`, `$default`, `$requirements` and `$options` + will still work, but have been deprecated. The `addPrefix` method should be used for this + use-case instead. + Before: `$parentCollection->addCollection($collection, '/prefix', [...], [...])` + After: + ```php + $collection->addPrefix('/prefix', [...], [...]); + $parentCollection->addCollection($collection); + ``` + * added support for the method default argument values when defining a @Route + * Adjacent placeholders without separator work now, e.g. `/{x}{y}{z}.{_format}`. + * Characters that function as separator between placeholders are now whitelisted + to fix routes with normal text around a variable, e.g. `/prefix{var}suffix`. + * [BC BREAK] The default requirement of a variable has been changed slightly. + Previously it disallowed the previous and the next char around a variable. Now + it disallows the slash (`/`) and the next char. Using the previous char added + no value and was problematic because the route `/index.{_format}` would be + matched by `/index.ht/ml`. + * The default requirement now uses possessive quantifiers when possible which + improves matching performance by up to 20% because it prevents backtracking + when it's not needed. + * The ConfigurableRequirementsInterface can now also be used to disable the requirements + check on URL generation completely by calling `setStrictRequirements(null)`. It + improves performance in production environment as you should know that params always + pass the requirements (otherwise it would break your link anyway). + * There is no restriction on the route name anymore. So non-alphanumeric characters + are now also allowed. + * [BC BREAK] `RouteCompilerInterface::compile(Route $route)` was made static + (only relevant if you implemented your own RouteCompiler). + * Added possibility to generate relative paths and network paths in the UrlGenerator, e.g. + "../parent-file" and "//example.com/dir/file". The third parameter in + `UrlGeneratorInterface::generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH)` + now accepts more values and you should use the constants defined in `UrlGeneratorInterface` for + claritiy. The old method calls with a Boolean parameter will continue to work because they + equal the signature using the constants. + +2.1.0 +----- + + * added RequestMatcherInterface + * added RequestContext::fromRequest() + * the UrlMatcher does not throw a \LogicException anymore when the required + scheme is not the current one + * added TraceableUrlMatcher + * added the possibility to define options, default values and requirements + for placeholders in prefix, including imported routes + * added RouterInterface::getRouteCollection + * [BC BREAK] the UrlMatcher urldecodes the route parameters only once, they + were decoded twice before. Note that the `urldecode()` calls have been + changed for a single `rawurldecode()` in order to support `+` for input + paths. + * added RouteCollection::getRoot method to retrieve the root of a + RouteCollection tree + * [BC BREAK] made RouteCollection::setParent private which could not have + been used anyway without creating inconsistencies + * [BC BREAK] RouteCollection::remove also removes a route from parent + collections (not only from its children) + * added ConfigurableRequirementsInterface that allows to disable exceptions + (and generate empty URLs instead) when generating a route with an invalid + parameter value diff --git a/vendor/symfony/routing/CompiledRoute.php b/vendor/symfony/routing/CompiledRoute.php new file mode 100644 index 0000000..9ffd1b5 --- /dev/null +++ b/vendor/symfony/routing/CompiledRoute.php @@ -0,0 +1,173 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * CompiledRoutes are returned by the RouteCompiler class. + * + * @author Fabien Potencier + */ +class CompiledRoute implements \Serializable +{ + private $variables; + private $tokens; + private $staticPrefix; + private $regex; + private $pathVariables; + private $hostVariables; + private $hostRegex; + private $hostTokens; + + /** + * @param string $staticPrefix The static prefix of the compiled route + * @param string $regex The regular expression to use to match this route + * @param array $tokens An array of tokens to use to generate URL for this route + * @param array $pathVariables An array of path variables + * @param string|null $hostRegex Host regex + * @param array $hostTokens Host tokens + * @param array $hostVariables An array of host variables + * @param array $variables An array of variables (variables defined in the path and in the host patterns) + */ + public function __construct(string $staticPrefix, string $regex, array $tokens, array $pathVariables, string $hostRegex = null, array $hostTokens = [], array $hostVariables = [], array $variables = []) + { + $this->staticPrefix = $staticPrefix; + $this->regex = $regex; + $this->tokens = $tokens; + $this->pathVariables = $pathVariables; + $this->hostRegex = $hostRegex; + $this->hostTokens = $hostTokens; + $this->hostVariables = $hostVariables; + $this->variables = $variables; + } + + public function __serialize(): array + { + return [ + 'vars' => $this->variables, + 'path_prefix' => $this->staticPrefix, + 'path_regex' => $this->regex, + 'path_tokens' => $this->tokens, + 'path_vars' => $this->pathVariables, + 'host_regex' => $this->hostRegex, + 'host_tokens' => $this->hostTokens, + 'host_vars' => $this->hostVariables, + ]; + } + + /** + * @internal + */ + final public function serialize(): string + { + return serialize($this->__serialize()); + } + + public function __unserialize(array $data): void + { + $this->variables = $data['vars']; + $this->staticPrefix = $data['path_prefix']; + $this->regex = $data['path_regex']; + $this->tokens = $data['path_tokens']; + $this->pathVariables = $data['path_vars']; + $this->hostRegex = $data['host_regex']; + $this->hostTokens = $data['host_tokens']; + $this->hostVariables = $data['host_vars']; + } + + /** + * @internal + */ + final public function unserialize($serialized) + { + $this->__unserialize(unserialize($serialized, ['allowed_classes' => false])); + } + + /** + * Returns the static prefix. + * + * @return string The static prefix + */ + public function getStaticPrefix() + { + return $this->staticPrefix; + } + + /** + * Returns the regex. + * + * @return string The regex + */ + public function getRegex() + { + return $this->regex; + } + + /** + * Returns the host regex. + * + * @return string|null The host regex or null + */ + public function getHostRegex() + { + return $this->hostRegex; + } + + /** + * Returns the tokens. + * + * @return array The tokens + */ + public function getTokens() + { + return $this->tokens; + } + + /** + * Returns the host tokens. + * + * @return array The tokens + */ + public function getHostTokens() + { + return $this->hostTokens; + } + + /** + * Returns the variables. + * + * @return array The variables + */ + public function getVariables() + { + return $this->variables; + } + + /** + * Returns the path variables. + * + * @return array The variables + */ + public function getPathVariables() + { + return $this->pathVariables; + } + + /** + * Returns the host variables. + * + * @return array The variables + */ + public function getHostVariables() + { + return $this->hostVariables; + } +} diff --git a/vendor/symfony/routing/DependencyInjection/RoutingResolverPass.php b/vendor/symfony/routing/DependencyInjection/RoutingResolverPass.php new file mode 100644 index 0000000..7068825 --- /dev/null +++ b/vendor/symfony/routing/DependencyInjection/RoutingResolverPass.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Adds tagged routing.loader services to routing.resolver service. + * + * @author Fabien Potencier + */ +class RoutingResolverPass implements CompilerPassInterface +{ + use PriorityTaggedServiceTrait; + + private $resolverServiceId; + private $loaderTag; + + public function __construct(string $resolverServiceId = 'routing.resolver', string $loaderTag = 'routing.loader') + { + $this->resolverServiceId = $resolverServiceId; + $this->loaderTag = $loaderTag; + } + + public function process(ContainerBuilder $container) + { + if (false === $container->hasDefinition($this->resolverServiceId)) { + return; + } + + $definition = $container->getDefinition($this->resolverServiceId); + + foreach ($this->findAndSortTaggedServices($this->loaderTag, $container) as $id) { + $definition->addMethodCall('addLoader', [new Reference($id)]); + } + } +} diff --git a/vendor/symfony/routing/Exception/ExceptionInterface.php b/vendor/symfony/routing/Exception/ExceptionInterface.php new file mode 100644 index 0000000..22e72b1 --- /dev/null +++ b/vendor/symfony/routing/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * ExceptionInterface. + * + * @author Alexandre Salomé + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/routing/Exception/InvalidParameterException.php b/vendor/symfony/routing/Exception/InvalidParameterException.php new file mode 100644 index 0000000..94d841f --- /dev/null +++ b/vendor/symfony/routing/Exception/InvalidParameterException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when a parameter is not valid. + * + * @author Alexandre Salomé + */ +class InvalidParameterException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/routing/Exception/MethodNotAllowedException.php b/vendor/symfony/routing/Exception/MethodNotAllowedException.php new file mode 100644 index 0000000..b897081 --- /dev/null +++ b/vendor/symfony/routing/Exception/MethodNotAllowedException.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * The resource was found but the request method is not allowed. + * + * This exception should trigger an HTTP 405 response in your application code. + * + * @author Kris Wallsmith + */ +class MethodNotAllowedException extends \RuntimeException implements ExceptionInterface +{ + protected $allowedMethods = []; + + public function __construct(array $allowedMethods, string $message = null, int $code = 0, \Throwable $previous = null) + { + $this->allowedMethods = array_map('strtoupper', $allowedMethods); + + parent::__construct($message, $code, $previous); + } + + /** + * Gets the allowed HTTP methods. + * + * @return array + */ + public function getAllowedMethods() + { + return $this->allowedMethods; + } +} diff --git a/vendor/symfony/routing/Exception/MissingMandatoryParametersException.php b/vendor/symfony/routing/Exception/MissingMandatoryParametersException.php new file mode 100644 index 0000000..57f3a40 --- /dev/null +++ b/vendor/symfony/routing/Exception/MissingMandatoryParametersException.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when a route cannot be generated because of missing + * mandatory parameters. + * + * @author Alexandre Salomé + */ +class MissingMandatoryParametersException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/routing/Exception/NoConfigurationException.php b/vendor/symfony/routing/Exception/NoConfigurationException.php new file mode 100644 index 0000000..333bc74 --- /dev/null +++ b/vendor/symfony/routing/Exception/NoConfigurationException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when no routes are configured. + * + * @author Yonel Ceruto + */ +class NoConfigurationException extends ResourceNotFoundException +{ +} diff --git a/vendor/symfony/routing/Exception/ResourceNotFoundException.php b/vendor/symfony/routing/Exception/ResourceNotFoundException.php new file mode 100644 index 0000000..ccbca15 --- /dev/null +++ b/vendor/symfony/routing/Exception/ResourceNotFoundException.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * The resource was not found. + * + * This exception should trigger an HTTP 404 response in your application code. + * + * @author Kris Wallsmith + */ +class ResourceNotFoundException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/routing/Exception/RouteNotFoundException.php b/vendor/symfony/routing/Exception/RouteNotFoundException.php new file mode 100644 index 0000000..24ab0b4 --- /dev/null +++ b/vendor/symfony/routing/Exception/RouteNotFoundException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Exception; + +/** + * Exception thrown when a route does not exist. + * + * @author Alexandre Salomé + */ +class RouteNotFoundException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/routing/Generator/CompiledUrlGenerator.php b/vendor/symfony/routing/Generator/CompiledUrlGenerator.php new file mode 100644 index 0000000..b10edce --- /dev/null +++ b/vendor/symfony/routing/Generator/CompiledUrlGenerator.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Routing\Exception\RouteNotFoundException; +use Symfony\Component\Routing\RequestContext; + +/** + * Generates URLs based on rules dumped by CompiledUrlGeneratorDumper. + */ +class CompiledUrlGenerator extends UrlGenerator +{ + private $compiledRoutes = []; + private $defaultLocale; + + public function __construct(array $compiledRoutes, RequestContext $context, LoggerInterface $logger = null, string $defaultLocale = null) + { + $this->compiledRoutes = $compiledRoutes; + $this->context = $context; + $this->logger = $logger; + $this->defaultLocale = $defaultLocale; + } + + public function generate(string $name, array $parameters = [], int $referenceType = self::ABSOLUTE_PATH) + { + $locale = $parameters['_locale'] + ?? $this->context->getParameter('_locale') + ?: $this->defaultLocale; + + if (null !== $locale) { + do { + if (($this->compiledRoutes[$name.'.'.$locale][1]['_canonical_route'] ?? null) === $name) { + $name .= '.'.$locale; + break; + } + } while (false !== $locale = strstr($locale, '_', true)); + } + + if (!isset($this->compiledRoutes[$name])) { + throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); + } + + list($variables, $defaults, $requirements, $tokens, $hostTokens, $requiredSchemes) = $this->compiledRoutes[$name]; + + if (isset($defaults['_canonical_route']) && isset($defaults['_locale'])) { + if (!\in_array('_locale', $variables, true)) { + unset($parameters['_locale']); + } elseif (!isset($parameters['_locale'])) { + $parameters['_locale'] = $defaults['_locale']; + } + } + + return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes); + } +} diff --git a/vendor/symfony/routing/Generator/ConfigurableRequirementsInterface.php b/vendor/symfony/routing/Generator/ConfigurableRequirementsInterface.php new file mode 100644 index 0000000..568f7f7 --- /dev/null +++ b/vendor/symfony/routing/Generator/ConfigurableRequirementsInterface.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator; + +/** + * ConfigurableRequirementsInterface must be implemented by URL generators that + * can be configured whether an exception should be generated when the parameters + * do not match the requirements. It is also possible to disable the requirements + * check for URL generation completely. + * + * The possible configurations and use-cases: + * - setStrictRequirements(true): Throw an exception for mismatching requirements. This + * is mostly useful in development environment. + * - setStrictRequirements(false): Don't throw an exception but return an empty string as URL for + * mismatching requirements and log the problem. Useful when you cannot control all + * params because they come from third party libs but don't want to have a 404 in + * production environment. It should log the mismatch so one can review it. + * - setStrictRequirements(null): Return the URL with the given parameters without + * checking the requirements at all. When generating a URL you should either trust + * your params or you validated them beforehand because otherwise it would break your + * link anyway. So in production environment you should know that params always pass + * the requirements. Thus this option allows to disable the check on URL generation for + * performance reasons (saving a preg_match for each requirement every time a URL is + * generated). + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +interface ConfigurableRequirementsInterface +{ + /** + * Enables or disables the exception on incorrect parameters. + * Passing null will deactivate the requirements check completely. + */ + public function setStrictRequirements(?bool $enabled); + + /** + * Returns whether to throw an exception on incorrect parameters. + * Null means the requirements check is deactivated completely. + * + * @return bool|null + */ + public function isStrictRequirements(); +} diff --git a/vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php b/vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php new file mode 100644 index 0000000..e90a40a --- /dev/null +++ b/vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator\Dumper; + +use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper; + +/** + * CompiledUrlGeneratorDumper creates a PHP array to be used with CompiledUrlGenerator. + * + * @author Fabien Potencier + * @author Tobias Schultze + * @author Nicolas Grekas + */ +class CompiledUrlGeneratorDumper extends GeneratorDumper +{ + public function getCompiledRoutes(): array + { + $compiledRoutes = []; + foreach ($this->getRoutes()->all() as $name => $route) { + $compiledRoute = $route->compile(); + + $compiledRoutes[$name] = [ + $compiledRoute->getVariables(), + $route->getDefaults(), + $route->getRequirements(), + $compiledRoute->getTokens(), + $compiledRoute->getHostTokens(), + $route->getSchemes(), + ]; + } + + return $compiledRoutes; + } + + /** + * {@inheritdoc} + */ + public function dump(array $options = []) + { + return <<generateDeclaredRoutes()} +]; + +EOF; + } + + /** + * Generates PHP code representing an array of defined routes + * together with the routes properties (e.g. requirements). + */ + private function generateDeclaredRoutes(): string + { + $routes = ''; + foreach ($this->getCompiledRoutes() as $name => $properties) { + $routes .= sprintf("\n '%s' => %s,", $name, CompiledUrlMatcherDumper::export($properties)); + } + + return $routes; + } +} diff --git a/vendor/symfony/routing/Generator/Dumper/GeneratorDumper.php b/vendor/symfony/routing/Generator/Dumper/GeneratorDumper.php new file mode 100644 index 0000000..659c5ba --- /dev/null +++ b/vendor/symfony/routing/Generator/Dumper/GeneratorDumper.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * GeneratorDumper is the base class for all built-in generator dumpers. + * + * @author Fabien Potencier + */ +abstract class GeneratorDumper implements GeneratorDumperInterface +{ + private $routes; + + public function __construct(RouteCollection $routes) + { + $this->routes = $routes; + } + + /** + * {@inheritdoc} + */ + public function getRoutes() + { + return $this->routes; + } +} diff --git a/vendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php b/vendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php new file mode 100644 index 0000000..26daefc --- /dev/null +++ b/vendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * GeneratorDumperInterface is the interface that all generator dumper classes must implement. + * + * @author Fabien Potencier + */ +interface GeneratorDumperInterface +{ + /** + * Dumps a set of routes to a string representation of executable code + * that can then be used to generate a URL of such a route. + * + * @return string Executable code + */ + public function dump(array $options = []); + + /** + * Gets the routes to dump. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRoutes(); +} diff --git a/vendor/symfony/routing/Generator/UrlGenerator.php b/vendor/symfony/routing/Generator/UrlGenerator.php new file mode 100644 index 0000000..5473e85 --- /dev/null +++ b/vendor/symfony/routing/Generator/UrlGenerator.php @@ -0,0 +1,366 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Routing\Exception\InvalidParameterException; +use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; +use Symfony\Component\Routing\Exception\RouteNotFoundException; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\RouteCollection; + +/** + * UrlGenerator can generate a URL or a path for any route in the RouteCollection + * based on the passed parameters. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInterface +{ + private const QUERY_FRAGMENT_DECODED = [ + // RFC 3986 explicitly allows those in the query/fragment to reference other URIs unencoded + '%2F' => '/', + '%3F' => '?', + // reserved chars that have no special meaning for HTTP URIs in a query or fragment + // this excludes esp. "&", "=" and also "+" because PHP would treat it as a space (form-encoded) + '%40' => '@', + '%3A' => ':', + '%21' => '!', + '%3B' => ';', + '%2C' => ',', + '%2A' => '*', + ]; + + protected $routes; + protected $context; + + /** + * @var bool|null + */ + protected $strictRequirements = true; + + protected $logger; + + private $defaultLocale; + + /** + * This array defines the characters (besides alphanumeric ones) that will not be percent-encoded in the path segment of the generated URL. + * + * PHP's rawurlencode() encodes all chars except "a-zA-Z0-9-._~" according to RFC 3986. But we want to allow some chars + * to be used in their literal form (reasons below). Other chars inside the path must of course be encoded, e.g. + * "?" and "#" (would be interpreted wrongly as query and fragment identifier), + * "'" and """ (are used as delimiters in HTML). + */ + protected $decodedChars = [ + // the slash can be used to designate a hierarchical structure and we want allow using it with this meaning + // some webservers don't allow the slash in encoded form in the path for security reasons anyway + // see http://stackoverflow.com/questions/4069002/http-400-if-2f-part-of-get-url-in-jboss + '%2F' => '/', + // the following chars are general delimiters in the URI specification but have only special meaning in the authority component + // so they can safely be used in the path in unencoded form + '%40' => '@', + '%3A' => ':', + // these chars are only sub-delimiters that have no predefined meaning and can therefore be used literally + // so URI producing applications can use these chars to delimit subcomponents in a path segment without being encoded for better readability + '%3B' => ';', + '%2C' => ',', + '%3D' => '=', + '%2B' => '+', + '%21' => '!', + '%2A' => '*', + '%7C' => '|', + ]; + + public function __construct(RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null, string $defaultLocale = null) + { + $this->routes = $routes; + $this->context = $context; + $this->logger = $logger; + $this->defaultLocale = $defaultLocale; + } + + /** + * {@inheritdoc} + */ + public function setContext(RequestContext $context) + { + $this->context = $context; + } + + /** + * {@inheritdoc} + */ + public function getContext() + { + return $this->context; + } + + /** + * {@inheritdoc} + */ + public function setStrictRequirements(?bool $enabled) + { + $this->strictRequirements = $enabled; + } + + /** + * {@inheritdoc} + */ + public function isStrictRequirements() + { + return $this->strictRequirements; + } + + /** + * {@inheritdoc} + */ + public function generate(string $name, array $parameters = [], int $referenceType = self::ABSOLUTE_PATH) + { + $route = null; + $locale = $parameters['_locale'] + ?? $this->context->getParameter('_locale') + ?: $this->defaultLocale; + + if (null !== $locale) { + do { + if (null !== ($route = $this->routes->get($name.'.'.$locale)) && $route->getDefault('_canonical_route') === $name) { + break; + } + } while (false !== $locale = strstr($locale, '_', true)); + } + + if (null === $route = $route ?? $this->routes->get($name)) { + throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); + } + + // the Route has a cache of its own and is not recompiled as long as it does not get modified + $compiledRoute = $route->compile(); + + $defaults = $route->getDefaults(); + $variables = $compiledRoute->getVariables(); + + if (isset($defaults['_canonical_route']) && isset($defaults['_locale'])) { + if (!\in_array('_locale', $variables, true)) { + unset($parameters['_locale']); + } elseif (!isset($parameters['_locale'])) { + $parameters['_locale'] = $defaults['_locale']; + } + } + + return $this->doGenerate($variables, $defaults, $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $referenceType, $compiledRoute->getHostTokens(), $route->getSchemes()); + } + + /** + * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route + * @throws InvalidParameterException When a parameter value for a placeholder is not correct because + * it does not match the requirement + * + * @return string + */ + protected function doGenerate(array $variables, array $defaults, array $requirements, array $tokens, array $parameters, string $name, int $referenceType, array $hostTokens, array $requiredSchemes = []) + { + $variables = array_flip($variables); + $mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters); + + // all params must be given + if ($diff = array_diff_key($variables, $mergedParams)) { + throw new MissingMandatoryParametersException(sprintf('Some mandatory parameters are missing ("%s") to generate a URL for route "%s".', implode('", "', array_keys($diff)), $name)); + } + + $url = ''; + $optional = true; + $message = 'Parameter "{parameter}" for route "{route}" must match "{expected}" ("{given}" given) to generate a corresponding URL.'; + foreach ($tokens as $token) { + if ('variable' === $token[0]) { + $varName = $token[3]; + // variable is not important by default + $important = $token[5] ?? false; + + if (!$optional || $important || !\array_key_exists($varName, $defaults) || (null !== $mergedParams[$varName] && (string) $mergedParams[$varName] !== (string) $defaults[$varName])) { + // check requirement (while ignoring look-around patterns) + if (null !== $this->strictRequirements && !preg_match('#^'.preg_replace('/\(\?(?:=|<=|!|strictRequirements) { + throw new InvalidParameterException(strtr($message, ['{parameter}' => $varName, '{route}' => $name, '{expected}' => $token[2], '{given}' => $mergedParams[$varName]])); + } + + if ($this->logger) { + $this->logger->error($message, ['parameter' => $varName, 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$varName]]); + } + + return ''; + } + + $url = $token[1].$mergedParams[$varName].$url; + $optional = false; + } + } else { + // static text + $url = $token[1].$url; + $optional = false; + } + } + + if ('' === $url) { + $url = '/'; + } + + // the contexts base URL is already encoded (see Symfony\Component\HttpFoundation\Request) + $url = strtr(rawurlencode($url), $this->decodedChars); + + // the path segments "." and ".." are interpreted as relative reference when resolving a URI; see http://tools.ietf.org/html/rfc3986#section-3.3 + // so we need to encode them as they are not used for this purpose here + // otherwise we would generate a URI that, when followed by a user agent (e.g. browser), does not match this route + $url = strtr($url, ['/../' => '/%2E%2E/', '/./' => '/%2E/']); + if ('/..' === substr($url, -3)) { + $url = substr($url, 0, -2).'%2E%2E'; + } elseif ('/.' === substr($url, -2)) { + $url = substr($url, 0, -1).'%2E'; + } + + $schemeAuthority = ''; + $host = $this->context->getHost(); + $scheme = $this->context->getScheme(); + + if ($requiredSchemes) { + if (!\in_array($scheme, $requiredSchemes, true)) { + $referenceType = self::ABSOLUTE_URL; + $scheme = current($requiredSchemes); + } + } + + if ($hostTokens) { + $routeHost = ''; + foreach ($hostTokens as $token) { + if ('variable' === $token[0]) { + // check requirement (while ignoring look-around patterns) + if (null !== $this->strictRequirements && !preg_match('#^'.preg_replace('/\(\?(?:=|<=|!|strictRequirements) { + throw new InvalidParameterException(strtr($message, ['{parameter}' => $token[3], '{route}' => $name, '{expected}' => $token[2], '{given}' => $mergedParams[$token[3]]])); + } + + if ($this->logger) { + $this->logger->error($message, ['parameter' => $token[3], 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$token[3]]]); + } + + return ''; + } + + $routeHost = $token[1].$mergedParams[$token[3]].$routeHost; + } else { + $routeHost = $token[1].$routeHost; + } + } + + if ($routeHost !== $host) { + $host = $routeHost; + if (self::ABSOLUTE_URL !== $referenceType) { + $referenceType = self::NETWORK_PATH; + } + } + } + + if (self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) { + if ('' !== $host || ('' !== $scheme && 'http' !== $scheme && 'https' !== $scheme)) { + $port = ''; + if ('http' === $scheme && 80 !== $this->context->getHttpPort()) { + $port = ':'.$this->context->getHttpPort(); + } elseif ('https' === $scheme && 443 !== $this->context->getHttpsPort()) { + $port = ':'.$this->context->getHttpsPort(); + } + + $schemeAuthority = self::NETWORK_PATH === $referenceType || '' === $scheme ? '//' : "$scheme://"; + $schemeAuthority .= $host.$port; + } + } + + if (self::RELATIVE_PATH === $referenceType) { + $url = self::getRelativePath($this->context->getPathInfo(), $url); + } else { + $url = $schemeAuthority.$this->context->getBaseUrl().$url; + } + + // add a query string if needed + $extra = array_udiff_assoc(array_diff_key($parameters, $variables), $defaults, function ($a, $b) { + return $a == $b ? 0 : 1; + }); + + // extract fragment + $fragment = $defaults['_fragment'] ?? ''; + + if (isset($extra['_fragment'])) { + $fragment = $extra['_fragment']; + unset($extra['_fragment']); + } + + if ($extra && $query = http_build_query($extra, '', '&', PHP_QUERY_RFC3986)) { + $url .= '?'.strtr($query, self::QUERY_FRAGMENT_DECODED); + } + + if ('' !== $fragment) { + $url .= '#'.strtr(rawurlencode($fragment), self::QUERY_FRAGMENT_DECODED); + } + + return $url; + } + + /** + * Returns the target path as relative reference from the base path. + * + * Only the URIs path component (no schema, host etc.) is relevant and must be given, starting with a slash. + * Both paths must be absolute and not contain relative parts. + * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. + * Furthermore, they can be used to reduce the link size in documents. + * + * Example target paths, given a base path of "/a/b/c/d": + * - "/a/b/c/d" -> "" + * - "/a/b/c/" -> "./" + * - "/a/b/" -> "../" + * - "/a/b/c/other" -> "other" + * - "/a/x/y" -> "../../x/y" + * + * @param string $basePath The base path + * @param string $targetPath The target path + * + * @return string The relative target path + */ + public static function getRelativePath(string $basePath, string $targetPath) + { + if ($basePath === $targetPath) { + return ''; + } + + $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath); + $targetDirs = explode('/', isset($targetPath[0]) && '/' === $targetPath[0] ? substr($targetPath, 1) : $targetPath); + array_pop($sourceDirs); + $targetFile = array_pop($targetDirs); + + foreach ($sourceDirs as $i => $dir) { + if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) { + unset($sourceDirs[$i], $targetDirs[$i]); + } else { + break; + } + } + + $targetDirs[] = $targetFile; + $path = str_repeat('../', \count($sourceDirs)).implode('/', $targetDirs); + + // A reference to the same base directory or an empty subdirectory must be prefixed with "./". + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name + // (see http://tools.ietf.org/html/rfc3986#section-4.2). + return '' === $path || '/' === $path[0] + || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos) + ? "./$path" : $path; + } +} diff --git a/vendor/symfony/routing/Generator/UrlGeneratorInterface.php b/vendor/symfony/routing/Generator/UrlGeneratorInterface.php new file mode 100644 index 0000000..5890ffa --- /dev/null +++ b/vendor/symfony/routing/Generator/UrlGeneratorInterface.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Generator; + +use Symfony\Component\Routing\Exception\InvalidParameterException; +use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; +use Symfony\Component\Routing\Exception\RouteNotFoundException; +use Symfony\Component\Routing\RequestContextAwareInterface; + +/** + * UrlGeneratorInterface is the interface that all URL generator classes must implement. + * + * The constants in this interface define the different types of resource references that + * are declared in RFC 3986: http://tools.ietf.org/html/rfc3986 + * We are using the term "URL" instead of "URI" as this is more common in web applications + * and we do not need to distinguish them as the difference is mostly semantical and + * less technical. Generating URIs, i.e. representation-independent resource identifiers, + * is also possible. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +interface UrlGeneratorInterface extends RequestContextAwareInterface +{ + /** + * Generates an absolute URL, e.g. "http://example.com/dir/file". + */ + const ABSOLUTE_URL = 0; + + /** + * Generates an absolute path, e.g. "/dir/file". + */ + const ABSOLUTE_PATH = 1; + + /** + * Generates a relative path based on the current request path, e.g. "../parent-file". + * + * @see UrlGenerator::getRelativePath() + */ + const RELATIVE_PATH = 2; + + /** + * Generates a network path, e.g. "//example.com/dir/file". + * Such reference reuses the current scheme but specifies the host. + */ + const NETWORK_PATH = 3; + + /** + * Generates a URL or path for a specific route based on the given parameters. + * + * Parameters that reference placeholders in the route pattern will substitute them in the + * path or host. Extra params are added as query string to the URL. + * + * When the passed reference type cannot be generated for the route because it requires a different + * host or scheme than the current one, the method will return a more comprehensive reference + * that includes the required params. For example, when you call this method with $referenceType = ABSOLUTE_PATH + * but the route requires the https scheme whereas the current scheme is http, it will instead return an + * ABSOLUTE_URL with the https scheme and the current host. This makes sure the generated URL matches + * the route in any case. + * + * If there is no route with the given name, the generator must throw the RouteNotFoundException. + * + * The special parameter _fragment will be used as the document fragment suffixed to the final URL. + * + * @return string The generated URL + * + * @throws RouteNotFoundException If the named route doesn't exist + * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route + * @throws InvalidParameterException When a parameter value for a placeholder is not correct because + * it does not match the requirement + */ + public function generate(string $name, array $parameters = [], int $referenceType = self::ABSOLUTE_PATH); +} diff --git a/vendor/symfony/routing/LICENSE b/vendor/symfony/routing/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/routing/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/routing/Loader/AnnotationClassLoader.php b/vendor/symfony/routing/Loader/AnnotationClassLoader.php new file mode 100644 index 0000000..89d0bfa --- /dev/null +++ b/vendor/symfony/routing/Loader/AnnotationClassLoader.php @@ -0,0 +1,334 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Doctrine\Common\Annotations\Reader; +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\Config\Loader\LoaderResolverInterface; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\Annotation\Route as RouteAnnotation; +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * AnnotationClassLoader loads routing information from a PHP class and its methods. + * + * You need to define an implementation for the configureRoute() method. Most of the + * time, this method should define some PHP callable to be called for the route + * (a controller in MVC speak). + * + * The @Route annotation can be set on the class (for global parameters), + * and on each method. + * + * The @Route annotation main value is the route path. The annotation also + * recognizes several parameters: requirements, options, defaults, schemes, + * methods, host, and name. The name parameter is mandatory. + * Here is an example of how you should be able to use it: + * /** + * * @Route("/Blog") + * * / + * class Blog + * { + * /** + * * @Route("/", name="blog_index") + * * / + * public function index() + * { + * } + * /** + * * @Route("/{id}", name="blog_post", requirements = {"id" = "\d+"}) + * * / + * public function show() + * { + * } + * } + * + * @author Fabien Potencier + */ +abstract class AnnotationClassLoader implements LoaderInterface +{ + protected $reader; + + /** + * @var string + */ + protected $routeAnnotationClass = 'Symfony\\Component\\Routing\\Annotation\\Route'; + + /** + * @var int + */ + protected $defaultRouteIndex = 0; + + public function __construct(Reader $reader) + { + $this->reader = $reader; + } + + /** + * Sets the annotation class to read route properties from. + */ + public function setRouteAnnotationClass(string $class) + { + $this->routeAnnotationClass = $class; + } + + /** + * Loads from annotations from a class. + * + * @param string $class A class name + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When route can't be parsed + */ + public function load($class, string $type = null) + { + if (!class_exists($class)) { + throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class)); + } + + $class = new \ReflectionClass($class); + if ($class->isAbstract()) { + throw new \InvalidArgumentException(sprintf('Annotations from class "%s" cannot be read as it is abstract.', $class->getName())); + } + + $globals = $this->getGlobals($class); + + $collection = new RouteCollection(); + $collection->addResource(new FileResource($class->getFileName())); + + foreach ($class->getMethods() as $method) { + $this->defaultRouteIndex = 0; + foreach ($this->reader->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $this->routeAnnotationClass) { + $this->addRoute($collection, $annot, $globals, $class, $method); + } + } + } + + if (0 === $collection->count() && $class->hasMethod('__invoke')) { + $globals = $this->resetGlobals(); + foreach ($this->reader->getClassAnnotations($class) as $annot) { + if ($annot instanceof $this->routeAnnotationClass) { + $this->addRoute($collection, $annot, $globals, $class, $class->getMethod('__invoke')); + } + } + } + + return $collection; + } + + /** + * @param RouteAnnotation $annot or an object that exposes a similar interface + */ + protected function addRoute(RouteCollection $collection, $annot, array $globals, \ReflectionClass $class, \ReflectionMethod $method) + { + $name = $annot->getName(); + if (null === $name) { + $name = $this->getDefaultRouteName($class, $method); + } + $name = $globals['name'].$name; + + $requirements = $annot->getRequirements(); + + foreach ($requirements as $placeholder => $requirement) { + if (\is_int($placeholder)) { + throw new \InvalidArgumentException(sprintf('A placeholder name must be a string (%d given). Did you forget to specify the placeholder key for the requirement "%s" of route "%s" in "%s::%s()"?', $placeholder, $requirement, $name, $class->getName(), $method->getName())); + } + } + + $defaults = array_replace($globals['defaults'], $annot->getDefaults()); + $requirements = array_replace($globals['requirements'], $requirements); + $options = array_replace($globals['options'], $annot->getOptions()); + $schemes = array_merge($globals['schemes'], $annot->getSchemes()); + $methods = array_merge($globals['methods'], $annot->getMethods()); + + $host = $annot->getHost(); + if (null === $host) { + $host = $globals['host']; + } + + $condition = $annot->getCondition() ?? $globals['condition']; + $priority = $annot->getPriority() ?? $globals['priority']; + + $path = $annot->getLocalizedPaths() ?: $annot->getPath(); + $prefix = $globals['localized_paths'] ?: $globals['path']; + $paths = []; + + if (\is_array($path)) { + if (!\is_array($prefix)) { + foreach ($path as $locale => $localePath) { + $paths[$locale] = $prefix.$localePath; + } + } elseif ($missing = array_diff_key($prefix, $path)) { + throw new \LogicException(sprintf('Route to "%s" is missing paths for locale(s) "%s".', $class->name.'::'.$method->name, implode('", "', array_keys($missing)))); + } else { + foreach ($path as $locale => $localePath) { + if (!isset($prefix[$locale])) { + throw new \LogicException(sprintf('Route to "%s" with locale "%s" is missing a corresponding prefix in class "%s".', $method->name, $locale, $class->name)); + } + + $paths[$locale] = $prefix[$locale].$localePath; + } + } + } elseif (\is_array($prefix)) { + foreach ($prefix as $locale => $localePrefix) { + $paths[$locale] = $localePrefix.$path; + } + } else { + $paths[] = $prefix.$path; + } + + foreach ($method->getParameters() as $param) { + if (isset($defaults[$param->name]) || !$param->isDefaultValueAvailable()) { + continue; + } + foreach ($paths as $locale => $path) { + if (preg_match(sprintf('/\{%s(?:<.*?>)?\}/', preg_quote($param->name)), $path)) { + $defaults[$param->name] = $param->getDefaultValue(); + break; + } + } + } + + foreach ($paths as $locale => $path) { + $route = $this->createRoute($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition); + $this->configureRoute($route, $class, $method, $annot); + if (0 !== $locale) { + $route->setDefault('_locale', $locale); + $route->setRequirement('_locale', preg_quote($locale)); + $route->setDefault('_canonical_route', $name); + $collection->add($name.'.'.$locale, $route, $priority); + } else { + $collection->add($name, $route, $priority); + } + } + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return \is_string($resource) && preg_match('/^(?:\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)+$/', $resource) && (!$type || 'annotation' === $type); + } + + /** + * {@inheritdoc} + */ + public function setResolver(LoaderResolverInterface $resolver) + { + } + + /** + * {@inheritdoc} + */ + public function getResolver() + { + } + + /** + * Gets the default route name for a class method. + * + * @return string + */ + protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method) + { + $name = str_replace('\\', '_', $class->name).'_'.$method->name; + $name = \function_exists('mb_strtolower') && preg_match('//u', $name) ? mb_strtolower($name, 'UTF-8') : strtolower($name); + if ($this->defaultRouteIndex > 0) { + $name .= '_'.$this->defaultRouteIndex; + } + ++$this->defaultRouteIndex; + + return $name; + } + + protected function getGlobals(\ReflectionClass $class) + { + $globals = $this->resetGlobals(); + + if ($annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) { + if (null !== $annot->getName()) { + $globals['name'] = $annot->getName(); + } + + if (null !== $annot->getPath()) { + $globals['path'] = $annot->getPath(); + } + + $globals['localized_paths'] = $annot->getLocalizedPaths(); + + if (null !== $annot->getRequirements()) { + $globals['requirements'] = $annot->getRequirements(); + } + + if (null !== $annot->getOptions()) { + $globals['options'] = $annot->getOptions(); + } + + if (null !== $annot->getDefaults()) { + $globals['defaults'] = $annot->getDefaults(); + } + + if (null !== $annot->getSchemes()) { + $globals['schemes'] = $annot->getSchemes(); + } + + if (null !== $annot->getMethods()) { + $globals['methods'] = $annot->getMethods(); + } + + if (null !== $annot->getHost()) { + $globals['host'] = $annot->getHost(); + } + + if (null !== $annot->getCondition()) { + $globals['condition'] = $annot->getCondition(); + } + + $globals['priority'] = $annot->getPriority() ?? 0; + + foreach ($globals['requirements'] as $placeholder => $requirement) { + if (\is_int($placeholder)) { + throw new \InvalidArgumentException(sprintf('A placeholder name must be a string (%d given). Did you forget to specify the placeholder key for the requirement "%s" in "%s"?', $placeholder, $requirement, $class->getName())); + } + } + } + + return $globals; + } + + private function resetGlobals(): array + { + return [ + 'path' => null, + 'localized_paths' => [], + 'requirements' => [], + 'options' => [], + 'defaults' => [], + 'schemes' => [], + 'methods' => [], + 'host' => '', + 'condition' => '', + 'name' => '', + 'priority' => 0, + ]; + } + + protected function createRoute(string $path, array $defaults, array $requirements, array $options, ?string $host, array $schemes, array $methods, ?string $condition) + { + return new Route($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition); + } + + abstract protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot); +} diff --git a/vendor/symfony/routing/Loader/AnnotationDirectoryLoader.php b/vendor/symfony/routing/Loader/AnnotationDirectoryLoader.php new file mode 100644 index 0000000..7e52f31 --- /dev/null +++ b/vendor/symfony/routing/Loader/AnnotationDirectoryLoader.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Resource\DirectoryResource; +use Symfony\Component\Routing\RouteCollection; + +/** + * AnnotationDirectoryLoader loads routing information from annotations set + * on PHP classes and methods. + * + * @author Fabien Potencier + */ +class AnnotationDirectoryLoader extends AnnotationFileLoader +{ + /** + * Loads from annotations from a directory. + * + * @param string $path A directory path + * @param string|null $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When the directory does not exist or its routes cannot be parsed + */ + public function load($path, string $type = null) + { + if (!is_dir($dir = $this->locator->locate($path))) { + return parent::supports($path, $type) ? parent::load($path, $type) : new RouteCollection(); + } + + $collection = new RouteCollection(); + $collection->addResource(new DirectoryResource($dir, '/\.php$/')); + $files = iterator_to_array(new \RecursiveIteratorIterator( + new \RecursiveCallbackFilterIterator( + new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), + function (\SplFileInfo $current) { + return '.' !== substr($current->getBasename(), 0, 1); + } + ), + \RecursiveIteratorIterator::LEAVES_ONLY + )); + usort($files, function (\SplFileInfo $a, \SplFileInfo $b) { + return (string) $a > (string) $b ? 1 : -1; + }); + + foreach ($files as $file) { + if (!$file->isFile() || '.php' !== substr($file->getFilename(), -4)) { + continue; + } + + if ($class = $this->findClass($file)) { + $refl = new \ReflectionClass($class); + if ($refl->isAbstract()) { + continue; + } + + $collection->addCollection($this->loader->load($class, $type)); + } + } + + return $collection; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + if ('annotation' === $type) { + return true; + } + + if ($type || !\is_string($resource)) { + return false; + } + + try { + return is_dir($this->locator->locate($resource)); + } catch (\Exception $e) { + return false; + } + } +} diff --git a/vendor/symfony/routing/Loader/AnnotationFileLoader.php b/vendor/symfony/routing/Loader/AnnotationFileLoader.php new file mode 100644 index 0000000..c183d77 --- /dev/null +++ b/vendor/symfony/routing/Loader/AnnotationFileLoader.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\FileLocatorInterface; +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\RouteCollection; + +/** + * AnnotationFileLoader loads routing information from annotations set + * on a PHP class and its methods. + * + * @author Fabien Potencier + */ +class AnnotationFileLoader extends FileLoader +{ + protected $loader; + + /** + * @throws \RuntimeException + */ + public function __construct(FileLocatorInterface $locator, AnnotationClassLoader $loader) + { + if (!\function_exists('token_get_all')) { + throw new \LogicException('The Tokenizer extension is required for the routing annotation loaders.'); + } + + parent::__construct($locator); + + $this->loader = $loader; + } + + /** + * Loads from annotations from a file. + * + * @param string $file A PHP file path + * @param string|null $type The resource type + * + * @return RouteCollection|null A RouteCollection instance + * + * @throws \InvalidArgumentException When the file does not exist or its routes cannot be parsed + */ + public function load($file, string $type = null) + { + $path = $this->locator->locate($file); + + $collection = new RouteCollection(); + if ($class = $this->findClass($path)) { + $refl = new \ReflectionClass($class); + if ($refl->isAbstract()) { + return null; + } + + $collection->addResource(new FileResource($path)); + $collection->addCollection($this->loader->load($class, $type)); + } + + gc_mem_caches(); + + return $collection; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return \is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'annotation' === $type); + } + + /** + * Returns the full class name for the first class in the file. + * + * @return string|false Full class name if found, false otherwise + */ + protected function findClass(string $file) + { + $class = false; + $namespace = false; + $tokens = token_get_all(file_get_contents($file)); + + if (1 === \count($tokens) && T_INLINE_HTML === $tokens[0][0]) { + throw new \InvalidArgumentException(sprintf('The file "%s" does not contain PHP code. Did you forgot to add the " 0; --$j) { + if (!isset($tokens[$j][1])) { + break; + } + + if (T_DOUBLE_COLON === $tokens[$j][0] || T_NEW === $tokens[$j][0]) { + $skipClassToken = true; + break; + } elseif (!\in_array($tokens[$j][0], [T_WHITESPACE, T_DOC_COMMENT, T_COMMENT])) { + break; + } + } + + if (!$skipClassToken) { + $class = true; + } + } + + if (T_NAMESPACE === $token[0]) { + $namespace = true; + } + } + + return false; + } +} diff --git a/vendor/symfony/routing/Loader/ClosureLoader.php b/vendor/symfony/routing/Loader/ClosureLoader.php new file mode 100644 index 0000000..cea5f9c --- /dev/null +++ b/vendor/symfony/routing/Loader/ClosureLoader.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\Loader; +use Symfony\Component\Routing\RouteCollection; + +/** + * ClosureLoader loads routes from a PHP closure. + * + * The Closure must return a RouteCollection instance. + * + * @author Fabien Potencier + */ +class ClosureLoader extends Loader +{ + /** + * Loads a Closure. + * + * @param \Closure $closure A Closure + * @param string|null $type The resource type + * + * @return RouteCollection A RouteCollection instance + */ + public function load($closure, string $type = null) + { + return $closure(); + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return $resource instanceof \Closure && (!$type || 'closure' === $type); + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/CollectionConfigurator.php b/vendor/symfony/routing/Loader/Configurator/CollectionConfigurator.php new file mode 100644 index 0000000..1d93ca5 --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/CollectionConfigurator.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator; + +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * @author Nicolas Grekas + */ +class CollectionConfigurator +{ + use Traits\AddTrait; + use Traits\HostTrait; + use Traits\RouteTrait; + + private $parent; + private $parentConfigurator; + private $parentPrefixes; + private $host; + + public function __construct(RouteCollection $parent, string $name, self $parentConfigurator = null, array $parentPrefixes = null) + { + $this->parent = $parent; + $this->name = $name; + $this->collection = new RouteCollection(); + $this->route = new Route(''); + $this->parentConfigurator = $parentConfigurator; // for GC control + $this->parentPrefixes = $parentPrefixes; + } + + public function __destruct() + { + if (null === $this->prefixes) { + $this->collection->addPrefix($this->route->getPath()); + } + if (null !== $this->host) { + $this->addHost($this->collection, $this->host); + } + + $this->parent->addCollection($this->collection); + } + + /** + * Creates a sub-collection. + */ + final public function collection(string $name = ''): self + { + return new self($this->collection, $this->name.$name, $this, $this->prefixes); + } + + /** + * Sets the prefix to add to the path of all child routes. + * + * @param string|array $prefix the prefix, or the localized prefixes + * + * @return $this + */ + final public function prefix($prefix): self + { + if (\is_array($prefix)) { + if (null === $this->parentPrefixes) { + // no-op + } elseif ($missing = array_diff_key($this->parentPrefixes, $prefix)) { + throw new \LogicException(sprintf('Collection "%s" is missing prefixes for locale(s) "%s".', $this->name, implode('", "', array_keys($missing)))); + } else { + foreach ($prefix as $locale => $localePrefix) { + if (!isset($this->parentPrefixes[$locale])) { + throw new \LogicException(sprintf('Collection "%s" with locale "%s" is missing a corresponding prefix in its parent collection.', $this->name, $locale)); + } + + $prefix[$locale] = $this->parentPrefixes[$locale].$localePrefix; + } + } + $this->prefixes = $prefix; + $this->route->setPath('/'); + } else { + $this->prefixes = null; + $this->route->setPath($prefix); + } + + return $this; + } + + /** + * Sets the host to use for all child routes. + * + * @param string|array $host the host, or the localized hosts + * + * @return $this + */ + final public function host($host): self + { + $this->host = $host; + + return $this; + } + + private function createRoute(string $path): Route + { + return (clone $this->route)->setPath($path); + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/ImportConfigurator.php b/vendor/symfony/routing/Loader/Configurator/ImportConfigurator.php new file mode 100644 index 0000000..1841253 --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/ImportConfigurator.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator; + +use Symfony\Component\Routing\RouteCollection; + +/** + * @author Nicolas Grekas + */ +class ImportConfigurator +{ + use Traits\HostTrait; + use Traits\PrefixTrait; + use Traits\RouteTrait; + + private $parent; + + public function __construct(RouteCollection $parent, RouteCollection $route) + { + $this->parent = $parent; + $this->route = $route; + } + + public function __destruct() + { + $this->parent->addCollection($this->route); + } + + /** + * Sets the prefix to add to the path of all child routes. + * + * @param string|array $prefix the prefix, or the localized prefixes + * + * @return $this + */ + final public function prefix($prefix, bool $trailingSlashOnRoot = true): self + { + $this->addPrefix($this->route, $prefix, $trailingSlashOnRoot); + + return $this; + } + + /** + * Sets the prefix to add to the name of all child routes. + * + * @return $this + */ + final public function namePrefix(string $namePrefix): self + { + $this->route->addNamePrefix($namePrefix); + + return $this; + } + + /** + * Sets the host to use for all child routes. + * + * @param string|array $host the host, or the localized hosts + * + * @return $this + */ + final public function host($host): self + { + $this->addHost($this->route, $host); + + return $this; + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/RouteConfigurator.php b/vendor/symfony/routing/Loader/Configurator/RouteConfigurator.php new file mode 100644 index 0000000..fcb3771 --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/RouteConfigurator.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator; + +use Symfony\Component\Routing\RouteCollection; + +/** + * @author Nicolas Grekas + */ +class RouteConfigurator +{ + use Traits\AddTrait; + use Traits\HostTrait; + use Traits\RouteTrait; + + protected $parentConfigurator; + + public function __construct(RouteCollection $collection, $route, string $name = '', CollectionConfigurator $parentConfigurator = null, array $prefixes = null) + { + $this->collection = $collection; + $this->route = $route; + $this->name = $name; + $this->parentConfigurator = $parentConfigurator; // for GC control + $this->prefixes = $prefixes; + } + + /** + * Sets the host to use for all child routes. + * + * @param string|array $host the host, or the localized hosts + * + * @return $this + */ + final public function host($host): self + { + $this->addHost($this->route, $host); + + return $this; + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/RoutingConfigurator.php b/vendor/symfony/routing/Loader/Configurator/RoutingConfigurator.php new file mode 100644 index 0000000..e5086e2 --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/RoutingConfigurator.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator; + +use Symfony\Component\Routing\Loader\PhpFileLoader; +use Symfony\Component\Routing\RouteCollection; + +/** + * @author Nicolas Grekas + */ +class RoutingConfigurator +{ + use Traits\AddTrait; + + private $loader; + private $path; + private $file; + + public function __construct(RouteCollection $collection, PhpFileLoader $loader, string $path, string $file) + { + $this->collection = $collection; + $this->loader = $loader; + $this->path = $path; + $this->file = $file; + } + + /** + * @param string|string[]|null $exclude Glob patterns to exclude from the import + */ + final public function import($resource, string $type = null, bool $ignoreErrors = false, $exclude = null): ImportConfigurator + { + $this->loader->setCurrentDir(\dirname($this->path)); + + $imported = $this->loader->import($resource, $type, $ignoreErrors, $this->file, $exclude) ?: []; + if (!\is_array($imported)) { + return new ImportConfigurator($this->collection, $imported); + } + + $mergedCollection = new RouteCollection(); + foreach ($imported as $subCollection) { + $mergedCollection->addCollection($subCollection); + } + + return new ImportConfigurator($this->collection, $mergedCollection); + } + + final public function collection(string $name = ''): CollectionConfigurator + { + return new CollectionConfigurator($this->collection, $name); + } + + /** + * @return static + */ + final public function withPath(string $path): self + { + $clone = clone $this; + $clone->path = $clone->file = $path; + + return $clone; + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/Traits/AddTrait.php b/vendor/symfony/routing/Loader/Configurator/Traits/AddTrait.php new file mode 100644 index 0000000..001e1a4 --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/Traits/AddTrait.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator\Traits; + +use Symfony\Component\Routing\Loader\Configurator\CollectionConfigurator; +use Symfony\Component\Routing\Loader\Configurator\RouteConfigurator; +use Symfony\Component\Routing\RouteCollection; + +/** + * @author Nicolas Grekas + */ +trait AddTrait +{ + use LocalizedRouteTrait; + + /** + * @var RouteCollection + */ + protected $collection; + protected $name = ''; + protected $prefixes; + + /** + * Adds a route. + * + * @param string|array $path the path, or the localized paths of the route + */ + public function add(string $name, $path): RouteConfigurator + { + $parentConfigurator = $this instanceof CollectionConfigurator ? $this : ($this instanceof RouteConfigurator ? $this->parentConfigurator : null); + $route = $this->createLocalizedRoute($this->collection, $name, $path, $this->name, $this->prefixes); + + return new RouteConfigurator($this->collection, $route, $this->name, $parentConfigurator, $this->prefixes); + } + + /** + * Adds a route. + * + * @param string|array $path the path, or the localized paths of the route + */ + public function __invoke(string $name, $path): RouteConfigurator + { + return $this->add($name, $path); + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/Traits/HostTrait.php b/vendor/symfony/routing/Loader/Configurator/Traits/HostTrait.php new file mode 100644 index 0000000..54ae656 --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/Traits/HostTrait.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator\Traits; + +use Symfony\Component\Routing\RouteCollection; + +/** + * @internal + */ +trait HostTrait +{ + final protected function addHost(RouteCollection $routes, $hosts) + { + if (!$hosts || !\is_array($hosts)) { + $routes->setHost($hosts ?: ''); + + return; + } + + foreach ($routes->all() as $name => $route) { + if (null === $locale = $route->getDefault('_locale')) { + $routes->remove($name); + foreach ($hosts as $locale => $host) { + $localizedRoute = clone $route; + $localizedRoute->setDefault('_locale', $locale); + $localizedRoute->setRequirement('_locale', preg_quote($locale)); + $localizedRoute->setDefault('_canonical_route', $name); + $localizedRoute->setHost($host); + $routes->add($name.'.'.$locale, $localizedRoute); + } + } elseif (!isset($hosts[$locale])) { + throw new \InvalidArgumentException(sprintf('Route "%s" with locale "%s" is missing a corresponding host in its parent collection.', $name, $locale)); + } else { + $route->setHost($hosts[$locale]); + $route->setRequirement('_locale', preg_quote($locale)); + $routes->add($name, $route); + } + } + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php b/vendor/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php new file mode 100644 index 0000000..4734a4e --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator\Traits; + +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * @internal + * + * @author Nicolas Grekas + * @author Jules Pietri + */ +trait LocalizedRouteTrait +{ + /** + * Creates one or many routes. + * + * @param string|array $path the path, or the localized paths of the route + */ + final protected function createLocalizedRoute(RouteCollection $collection, string $name, $path, string $namePrefix = '', array $prefixes = null): RouteCollection + { + $paths = []; + + $routes = new RouteCollection(); + + if (\is_array($path)) { + if (null === $prefixes) { + $paths = $path; + } elseif ($missing = array_diff_key($prefixes, $path)) { + throw new \LogicException(sprintf('Route "%s" is missing routes for locale(s) "%s".', $name, implode('", "', array_keys($missing)))); + } else { + foreach ($path as $locale => $localePath) { + if (!isset($prefixes[$locale])) { + throw new \LogicException(sprintf('Route "%s" with locale "%s" is missing a corresponding prefix in its parent collection.', $name, $locale)); + } + + $paths[$locale] = $prefixes[$locale].$localePath; + } + } + } elseif (null !== $prefixes) { + foreach ($prefixes as $locale => $prefix) { + $paths[$locale] = $prefix.$path; + } + } else { + $routes->add($namePrefix.$name, $route = $this->createRoute($path)); + $collection->add($namePrefix.$name, $route); + + return $routes; + } + + foreach ($paths as $locale => $path) { + $routes->add($name.'.'.$locale, $route = $this->createRoute($path)); + $collection->add($namePrefix.$name.'.'.$locale, $route); + $route->setDefault('_locale', $locale); + $route->setRequirement('_locale', preg_quote($locale)); + $route->setDefault('_canonical_route', $namePrefix.$name); + } + + return $routes; + } + + private function createRoute(string $path): Route + { + return new Route($path); + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php b/vendor/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php new file mode 100644 index 0000000..27053bc --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator\Traits; + +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * @internal + * + * @author Nicolas Grekas + */ +trait PrefixTrait +{ + final protected function addPrefix(RouteCollection $routes, $prefix, bool $trailingSlashOnRoot) + { + if (\is_array($prefix)) { + foreach ($prefix as $locale => $localePrefix) { + $prefix[$locale] = trim(trim($localePrefix), '/'); + } + foreach ($routes->all() as $name => $route) { + if (null === $locale = $route->getDefault('_locale')) { + $routes->remove($name); + foreach ($prefix as $locale => $localePrefix) { + $localizedRoute = clone $route; + $localizedRoute->setDefault('_locale', $locale); + $localizedRoute->setRequirement('_locale', preg_quote($locale)); + $localizedRoute->setDefault('_canonical_route', $name); + $localizedRoute->setPath($localePrefix.(!$trailingSlashOnRoot && '/' === $route->getPath() ? '' : $route->getPath())); + $routes->add($name.'.'.$locale, $localizedRoute); + } + } elseif (!isset($prefix[$locale])) { + throw new \InvalidArgumentException(sprintf('Route "%s" with locale "%s" is missing a corresponding prefix in its parent collection.', $name, $locale)); + } else { + $route->setPath($prefix[$locale].(!$trailingSlashOnRoot && '/' === $route->getPath() ? '' : $route->getPath())); + $routes->add($name, $route); + } + } + + return; + } + + $routes->addPrefix($prefix); + if (!$trailingSlashOnRoot) { + $rootPath = (new Route(trim(trim($prefix), '/').'/'))->getPath(); + foreach ($routes->all() as $route) { + if ($route->getPath() === $rootPath) { + $route->setPath(rtrim($rootPath, '/')); + } + } + } + } +} diff --git a/vendor/symfony/routing/Loader/Configurator/Traits/RouteTrait.php b/vendor/symfony/routing/Loader/Configurator/Traits/RouteTrait.php new file mode 100644 index 0000000..acdffae --- /dev/null +++ b/vendor/symfony/routing/Loader/Configurator/Traits/RouteTrait.php @@ -0,0 +1,175 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader\Configurator\Traits; + +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +trait RouteTrait +{ + /** + * @var RouteCollection|Route + */ + protected $route; + + /** + * Adds defaults. + * + * @return $this + */ + final public function defaults(array $defaults): self + { + $this->route->addDefaults($defaults); + + return $this; + } + + /** + * Adds requirements. + * + * @return $this + */ + final public function requirements(array $requirements): self + { + $this->route->addRequirements($requirements); + + return $this; + } + + /** + * Adds options. + * + * @return $this + */ + final public function options(array $options): self + { + $this->route->addOptions($options); + + return $this; + } + + /** + * Whether paths should accept utf8 encoding. + * + * @return $this + */ + final public function utf8(bool $utf8 = true): self + { + $this->route->addOptions(['utf8' => $utf8]); + + return $this; + } + + /** + * Sets the condition. + * + * @return $this + */ + final public function condition(string $condition): self + { + $this->route->setCondition($condition); + + return $this; + } + + /** + * Sets the pattern for the host. + * + * @return $this + */ + final public function host(string $pattern): self + { + $this->route->setHost($pattern); + + return $this; + } + + /** + * Sets the schemes (e.g. 'https') this route is restricted to. + * So an empty array means that any scheme is allowed. + * + * @param string[] $schemes + * + * @return $this + */ + final public function schemes(array $schemes): self + { + $this->route->setSchemes($schemes); + + return $this; + } + + /** + * Sets the HTTP methods (e.g. 'POST') this route is restricted to. + * So an empty array means that any method is allowed. + * + * @param string[] $methods + * + * @return $this + */ + final public function methods(array $methods): self + { + $this->route->setMethods($methods); + + return $this; + } + + /** + * Adds the "_controller" entry to defaults. + * + * @param callable|string $controller a callable or parseable pseudo-callable + * + * @return $this + */ + final public function controller($controller): self + { + $this->route->addDefaults(['_controller' => $controller]); + + return $this; + } + + /** + * Adds the "_locale" entry to defaults. + * + * @return $this + */ + final public function locale(string $locale): self + { + $this->route->addDefaults(['_locale' => $locale]); + + return $this; + } + + /** + * Adds the "_format" entry to defaults. + * + * @return $this + */ + final public function format(string $format): self + { + $this->route->addDefaults(['_format' => $format]); + + return $this; + } + + /** + * Adds the "_stateless" entry to defaults. + * + * @return $this + */ + final public function stateless(bool $stateless = true): self + { + $this->route->addDefaults(['_stateless' => $stateless]); + + return $this; + } +} diff --git a/vendor/symfony/routing/Loader/ContainerLoader.php b/vendor/symfony/routing/Loader/ContainerLoader.php new file mode 100644 index 0000000..92bf2a0 --- /dev/null +++ b/vendor/symfony/routing/Loader/ContainerLoader.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Psr\Container\ContainerInterface; + +/** + * A route loader that executes a service from a PSR-11 container to load the routes. + * + * @author Ryan Weaver + */ +class ContainerLoader extends ObjectLoader +{ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return 'service' === $type; + } + + /** + * {@inheritdoc} + */ + protected function getObject(string $id) + { + return $this->container->get($id); + } +} diff --git a/vendor/symfony/routing/Loader/DirectoryLoader.php b/vendor/symfony/routing/Loader/DirectoryLoader.php new file mode 100644 index 0000000..c0f3491 --- /dev/null +++ b/vendor/symfony/routing/Loader/DirectoryLoader.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Config\Resource\DirectoryResource; +use Symfony\Component\Routing\RouteCollection; + +class DirectoryLoader extends FileLoader +{ + /** + * {@inheritdoc} + */ + public function load($file, string $type = null) + { + $path = $this->locator->locate($file); + + $collection = new RouteCollection(); + $collection->addResource(new DirectoryResource($path)); + + foreach (scandir($path) as $dir) { + if ('.' !== $dir[0]) { + $this->setCurrentDir($path); + $subPath = $path.'/'.$dir; + $subType = null; + + if (is_dir($subPath)) { + $subPath .= '/'; + $subType = 'directory'; + } + + $subCollection = $this->import($subPath, $subType, false, $path); + $collection->addCollection($subCollection); + } + } + + return $collection; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + // only when type is forced to directory, not to conflict with AnnotationLoader + + return 'directory' === $type; + } +} diff --git a/vendor/symfony/routing/Loader/GlobFileLoader.php b/vendor/symfony/routing/Loader/GlobFileLoader.php new file mode 100644 index 0000000..780fb15 --- /dev/null +++ b/vendor/symfony/routing/Loader/GlobFileLoader.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Routing\RouteCollection; + +/** + * GlobFileLoader loads files from a glob pattern. + * + * @author Nicolas Grekas + */ +class GlobFileLoader extends FileLoader +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $type = null) + { + $collection = new RouteCollection(); + + foreach ($this->glob($resource, false, $globResource) as $path => $info) { + $collection->addCollection($this->import($path)); + } + + $collection->addResource($globResource); + + return $collection; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return 'glob' === $type; + } +} diff --git a/vendor/symfony/routing/Loader/ObjectLoader.php b/vendor/symfony/routing/Loader/ObjectLoader.php new file mode 100644 index 0000000..d6ec1a7 --- /dev/null +++ b/vendor/symfony/routing/Loader/ObjectLoader.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\Loader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\RouteCollection; + +/** + * A route loader that calls a method on an object to load the routes. + * + * @author Ryan Weaver + */ +abstract class ObjectLoader extends Loader +{ + /** + * Returns the object that the method will be called on to load routes. + * + * For example, if your application uses a service container, + * the $id may be a service id. + * + * @return object + */ + abstract protected function getObject(string $id); + + /** + * Calls the object method that will load the routes. + * + * @param string $resource object_id::method + * @param string|null $type The resource type + * + * @return RouteCollection + */ + public function load($resource, string $type = null) + { + if (!preg_match('/^[^\:]+(?:::(?:[^\:]+))?$/', $resource)) { + throw new \InvalidArgumentException(sprintf('Invalid resource "%s" passed to the %s route loader: use the format "object_id::method" or "object_id" if your object class has an "__invoke" method.', $resource, \is_string($type) ? '"'.$type.'"' : 'object')); + } + + $parts = explode('::', $resource); + $method = $parts[1] ?? '__invoke'; + + $loaderObject = $this->getObject($parts[0]); + + if (!\is_object($loaderObject)) { + throw new \TypeError(sprintf('"%s:getObject()" must return an object: "%s" returned.', static::class, get_debug_type($loaderObject))); + } + + if (!\is_callable([$loaderObject, $method])) { + throw new \BadMethodCallException(sprintf('Method "%s" not found on "%s" when importing routing resource "%s".', $method, get_debug_type($loaderObject), $resource)); + } + + $routeCollection = $loaderObject->$method($this); + + if (!$routeCollection instanceof RouteCollection) { + $type = get_debug_type($routeCollection); + + throw new \LogicException(sprintf('The "%s::%s()" method must return a RouteCollection: "%s" returned.', get_debug_type($loaderObject), $method, $type)); + } + + // make the object file tracked so that if it changes, the cache rebuilds + $this->addClassResource(new \ReflectionClass($loaderObject), $routeCollection); + + return $routeCollection; + } + + private function addClassResource(\ReflectionClass $class, RouteCollection $collection) + { + do { + if (is_file($class->getFileName())) { + $collection->addResource(new FileResource($class->getFileName())); + } + } while ($class = $class->getParentClass()); + } +} diff --git a/vendor/symfony/routing/Loader/PhpFileLoader.php b/vendor/symfony/routing/Loader/PhpFileLoader.php new file mode 100644 index 0000000..04d9df6 --- /dev/null +++ b/vendor/symfony/routing/Loader/PhpFileLoader.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; +use Symfony\Component\Routing\RouteCollection; + +/** + * PhpFileLoader loads routes from a PHP file. + * + * The file must return a RouteCollection instance. + * + * @author Fabien Potencier + * @author Nicolas grekas + * @author Jules Pietri + */ +class PhpFileLoader extends FileLoader +{ + /** + * Loads a PHP file. + * + * @param string $file A PHP file path + * @param string|null $type The resource type + * + * @return RouteCollection A RouteCollection instance + */ + public function load($file, string $type = null) + { + $path = $this->locator->locate($file); + $this->setCurrentDir(\dirname($path)); + + // the closure forbids access to the private scope in the included file + $loader = $this; + $load = \Closure::bind(static function ($file) use ($loader) { + return include $file; + }, null, ProtectedPhpFileLoader::class); + + $result = $load($path); + + if (\is_object($result) && \is_callable($result)) { + $collection = $this->callConfigurator($result, $path, $file); + } else { + $collection = $result; + } + + $collection->addResource(new FileResource($path)); + + return $collection; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return \is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'php' === $type); + } + + protected function callConfigurator(callable $result, string $path, string $file): RouteCollection + { + $collection = new RouteCollection(); + + $result(new RoutingConfigurator($collection, $this, $path, $file)); + + return $collection; + } +} + +/** + * @internal + */ +final class ProtectedPhpFileLoader extends PhpFileLoader +{ +} diff --git a/vendor/symfony/routing/Loader/XmlFileLoader.php b/vendor/symfony/routing/Loader/XmlFileLoader.php new file mode 100644 index 0000000..4599ee7 --- /dev/null +++ b/vendor/symfony/routing/Loader/XmlFileLoader.php @@ -0,0 +1,427 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Util\XmlUtils; +use Symfony\Component\Routing\Loader\Configurator\Traits\HostTrait; +use Symfony\Component\Routing\Loader\Configurator\Traits\LocalizedRouteTrait; +use Symfony\Component\Routing\Loader\Configurator\Traits\PrefixTrait; +use Symfony\Component\Routing\RouteCollection; + +/** + * XmlFileLoader loads XML routing files. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class XmlFileLoader extends FileLoader +{ + use HostTrait; + use LocalizedRouteTrait; + use PrefixTrait; + + const NAMESPACE_URI = 'http://symfony.com/schema/routing'; + const SCHEME_PATH = '/schema/routing/routing-1.0.xsd'; + + /** + * Loads an XML file. + * + * @param string $file An XML file path + * @param string|null $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException when the file cannot be loaded or when the XML cannot be + * parsed because it does not validate against the scheme + */ + public function load($file, string $type = null) + { + $path = $this->locator->locate($file); + + $xml = $this->loadFile($path); + + $collection = new RouteCollection(); + $collection->addResource(new FileResource($path)); + + // process routes and imports + foreach ($xml->documentElement->childNodes as $node) { + if (!$node instanceof \DOMElement) { + continue; + } + + $this->parseNode($collection, $node, $path, $file); + } + + return $collection; + } + + /** + * Parses a node from a loaded XML file. + * + * @param \DOMElement $node Element to parse + * @param string $path Full path of the XML file being processed + * @param string $file Loaded file name + * + * @throws \InvalidArgumentException When the XML is invalid + */ + protected function parseNode(RouteCollection $collection, \DOMElement $node, string $path, string $file) + { + if (self::NAMESPACE_URI !== $node->namespaceURI) { + return; + } + + switch ($node->localName) { + case 'route': + $this->parseRoute($collection, $node, $path); + break; + case 'import': + $this->parseImport($collection, $node, $path, $file); + break; + default: + throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "route" or "import".', $node->localName, $path)); + } + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return \is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'xml' === $type); + } + + /** + * Parses a route and adds it to the RouteCollection. + * + * @param \DOMElement $node Element to parse that represents a Route + * @param string $path Full path of the XML file being processed + * + * @throws \InvalidArgumentException When the XML is invalid + */ + protected function parseRoute(RouteCollection $collection, \DOMElement $node, string $path) + { + if ('' === $id = $node->getAttribute('id')) { + throw new \InvalidArgumentException(sprintf('The element in file "%s" must have an "id" attribute.', $path)); + } + + $schemes = preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY); + $methods = preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY); + + list($defaults, $requirements, $options, $condition, $paths, /* $prefixes */, $hosts) = $this->parseConfigs($node, $path); + + if (!$paths && '' === $node->getAttribute('path')) { + throw new \InvalidArgumentException(sprintf('The element in file "%s" must have a "path" attribute or child nodes.', $path)); + } + + if ($paths && '' !== $node->getAttribute('path')) { + throw new \InvalidArgumentException(sprintf('The element in file "%s" must not have both a "path" attribute and child nodes.', $path)); + } + + $routes = $this->createLocalizedRoute($collection, $id, $paths ?: $node->getAttribute('path')); + $routes->addDefaults($defaults); + $routes->addRequirements($requirements); + $routes->addOptions($options); + $routes->setSchemes($schemes); + $routes->setMethods($methods); + $routes->setCondition($condition); + + if (null !== $hosts) { + $this->addHost($routes, $hosts); + } + } + + /** + * Parses an import and adds the routes in the resource to the RouteCollection. + * + * @param \DOMElement $node Element to parse that represents a Route + * @param string $path Full path of the XML file being processed + * @param string $file Loaded file name + * + * @throws \InvalidArgumentException When the XML is invalid + */ + protected function parseImport(RouteCollection $collection, \DOMElement $node, string $path, string $file) + { + if ('' === $resource = $node->getAttribute('resource')) { + throw new \InvalidArgumentException(sprintf('The element in file "%s" must have a "resource" attribute.', $path)); + } + + $type = $node->getAttribute('type'); + $prefix = $node->getAttribute('prefix'); + $schemes = $node->hasAttribute('schemes') ? preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY) : null; + $methods = $node->hasAttribute('methods') ? preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY) : null; + $trailingSlashOnRoot = $node->hasAttribute('trailing-slash-on-root') ? XmlUtils::phpize($node->getAttribute('trailing-slash-on-root')) : true; + $namePrefix = $node->getAttribute('name-prefix') ?: null; + + list($defaults, $requirements, $options, $condition, /* $paths */, $prefixes, $hosts) = $this->parseConfigs($node, $path); + + if ('' !== $prefix && $prefixes) { + throw new \InvalidArgumentException(sprintf('The element in file "%s" must not have both a "prefix" attribute and child nodes.', $path)); + } + + $exclude = []; + foreach ($node->childNodes as $child) { + if ($child instanceof \DOMElement && $child->localName === $exclude && self::NAMESPACE_URI === $child->namespaceURI) { + $exclude[] = $child->nodeValue; + } + } + + if ($node->hasAttribute('exclude')) { + if ($exclude) { + throw new \InvalidArgumentException('You cannot use both the attribute "exclude" and tags at the same time.'); + } + $exclude = [$node->getAttribute('exclude')]; + } + + $this->setCurrentDir(\dirname($path)); + + /** @var RouteCollection[] $imported */ + $imported = $this->import($resource, ('' !== $type ? $type : null), false, $file, $exclude) ?: []; + + if (!\is_array($imported)) { + $imported = [$imported]; + } + + foreach ($imported as $subCollection) { + $this->addPrefix($subCollection, $prefixes ?: $prefix, $trailingSlashOnRoot); + + if (null !== $hosts) { + $this->addHost($subCollection, $hosts); + } + + if (null !== $condition) { + $subCollection->setCondition($condition); + } + if (null !== $schemes) { + $subCollection->setSchemes($schemes); + } + if (null !== $methods) { + $subCollection->setMethods($methods); + } + if (null !== $namePrefix) { + $subCollection->addNamePrefix($namePrefix); + } + $subCollection->addDefaults($defaults); + $subCollection->addRequirements($requirements); + $subCollection->addOptions($options); + + $collection->addCollection($subCollection); + } + } + + /** + * Loads an XML file. + * + * @param string $file An XML file path + * + * @return \DOMDocument + * + * @throws \InvalidArgumentException When loading of XML file fails because of syntax errors + * or when the XML structure is not as expected by the scheme - + * see validate() + */ + protected function loadFile(string $file) + { + return XmlUtils::loadFile($file, __DIR__.static::SCHEME_PATH); + } + + /** + * Parses the config elements (default, requirement, option). + * + * @throws \InvalidArgumentException When the XML is invalid + */ + private function parseConfigs(\DOMElement $node, string $path): array + { + $defaults = []; + $requirements = []; + $options = []; + $condition = null; + $prefixes = []; + $paths = []; + $hosts = []; + + /** @var \DOMElement $n */ + foreach ($node->getElementsByTagNameNS(self::NAMESPACE_URI, '*') as $n) { + if ($node !== $n->parentNode) { + continue; + } + + switch ($n->localName) { + case 'path': + $paths[$n->getAttribute('locale')] = trim($n->textContent); + break; + case 'host': + $hosts[$n->getAttribute('locale')] = trim($n->textContent); + break; + case 'prefix': + $prefixes[$n->getAttribute('locale')] = trim($n->textContent); + break; + case 'default': + if ($this->isElementValueNull($n)) { + $defaults[$n->getAttribute('key')] = null; + } else { + $defaults[$n->getAttribute('key')] = $this->parseDefaultsConfig($n, $path); + } + + break; + case 'requirement': + $requirements[$n->getAttribute('key')] = trim($n->textContent); + break; + case 'option': + $options[$n->getAttribute('key')] = XmlUtils::phpize(trim($n->textContent)); + break; + case 'condition': + $condition = trim($n->textContent); + break; + default: + throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "default", "requirement", "option" or "condition".', $n->localName, $path)); + } + } + + if ($controller = $node->getAttribute('controller')) { + if (isset($defaults['_controller'])) { + $name = $node->hasAttribute('id') ? sprintf('"%s".', $node->getAttribute('id')) : sprintf('the "%s" tag.', $node->tagName); + + throw new \InvalidArgumentException(sprintf('The routing file "%s" must not specify both the "controller" attribute and the defaults key "_controller" for ', $path).$name); + } + + $defaults['_controller'] = $controller; + } + if ($node->hasAttribute('locale')) { + $defaults['_locale'] = $node->getAttribute('locale'); + } + if ($node->hasAttribute('format')) { + $defaults['_format'] = $node->getAttribute('format'); + } + if ($node->hasAttribute('utf8')) { + $options['utf8'] = XmlUtils::phpize($node->getAttribute('utf8')); + } + if ($stateless = $node->getAttribute('stateless')) { + if (isset($defaults['_stateless'])) { + $name = $node->hasAttribute('id') ? sprintf('"%s".', $node->getAttribute('id')) : sprintf('the "%s" tag.', $node->tagName); + + throw new \InvalidArgumentException(sprintf('The routing file "%s" must not specify both the "stateless" attribute and the defaults key "_stateless" for ', $path).$name); + } + + $defaults['_stateless'] = XmlUtils::phpize($stateless); + } + + if (!$hosts) { + $hosts = $node->hasAttribute('host') ? $node->getAttribute('host') : null; + } + + return [$defaults, $requirements, $options, $condition, $paths, $prefixes, $hosts]; + } + + /** + * Parses the "default" elements. + * + * @return array|bool|float|int|string|null The parsed value of the "default" element + */ + private function parseDefaultsConfig(\DOMElement $element, string $path) + { + if ($this->isElementValueNull($element)) { + return null; + } + + // Check for existing element nodes in the default element. There can + // only be a single element inside a default element. So this element + // (if one was found) can safely be returned. + foreach ($element->childNodes as $child) { + if (!$child instanceof \DOMElement) { + continue; + } + + if (self::NAMESPACE_URI !== $child->namespaceURI) { + continue; + } + + return $this->parseDefaultNode($child, $path); + } + + // If the default element doesn't contain a nested "bool", "int", "float", + // "string", "list", or "map" element, the element contents will be treated + // as the string value of the associated default option. + return trim($element->textContent); + } + + /** + * Recursively parses the value of a "default" element. + * + * @return array|bool|float|int|string The parsed value + * + * @throws \InvalidArgumentException when the XML is invalid + */ + private function parseDefaultNode(\DOMElement $node, string $path) + { + if ($this->isElementValueNull($node)) { + return null; + } + + switch ($node->localName) { + case 'bool': + return 'true' === trim($node->nodeValue) || '1' === trim($node->nodeValue); + case 'int': + return (int) trim($node->nodeValue); + case 'float': + return (float) trim($node->nodeValue); + case 'string': + return trim($node->nodeValue); + case 'list': + $list = []; + + foreach ($node->childNodes as $element) { + if (!$element instanceof \DOMElement) { + continue; + } + + if (self::NAMESPACE_URI !== $element->namespaceURI) { + continue; + } + + $list[] = $this->parseDefaultNode($element, $path); + } + + return $list; + case 'map': + $map = []; + + foreach ($node->childNodes as $element) { + if (!$element instanceof \DOMElement) { + continue; + } + + if (self::NAMESPACE_URI !== $element->namespaceURI) { + continue; + } + + $map[$element->getAttribute('key')] = $this->parseDefaultNode($element, $path); + } + + return $map; + default: + throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "bool", "int", "float", "string", "list", or "map".', $node->localName, $path)); + } + } + + private function isElementValueNull(\DOMElement $element): bool + { + $namespaceUri = 'http://www.w3.org/2001/XMLSchema-instance'; + + if (!$element->hasAttributeNS($namespaceUri, 'nil')) { + return false; + } + + return 'true' === $element->getAttributeNS($namespaceUri, 'nil') || '1' === $element->getAttributeNS($namespaceUri, 'nil'); + } +} diff --git a/vendor/symfony/routing/Loader/YamlFileLoader.php b/vendor/symfony/routing/Loader/YamlFileLoader.php new file mode 100644 index 0000000..cd137ee --- /dev/null +++ b/vendor/symfony/routing/Loader/YamlFileLoader.php @@ -0,0 +1,262 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Loader; + +use Symfony\Component\Config\Loader\FileLoader; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\Loader\Configurator\Traits\HostTrait; +use Symfony\Component\Routing\Loader\Configurator\Traits\LocalizedRouteTrait; +use Symfony\Component\Routing\Loader\Configurator\Traits\PrefixTrait; +use Symfony\Component\Routing\RouteCollection; +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Parser as YamlParser; +use Symfony\Component\Yaml\Yaml; + +/** + * YamlFileLoader loads Yaml routing files. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class YamlFileLoader extends FileLoader +{ + use HostTrait; + use LocalizedRouteTrait; + use PrefixTrait; + + private static $availableKeys = [ + 'resource', 'type', 'prefix', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition', 'controller', 'name_prefix', 'trailing_slash_on_root', 'locale', 'format', 'utf8', 'exclude', 'stateless', + ]; + private $yamlParser; + + /** + * Loads a Yaml file. + * + * @param string $file A Yaml file path + * @param string|null $type The resource type + * + * @return RouteCollection A RouteCollection instance + * + * @throws \InvalidArgumentException When a route can't be parsed because YAML is invalid + */ + public function load($file, string $type = null) + { + $path = $this->locator->locate($file); + + if (!stream_is_local($path)) { + throw new \InvalidArgumentException(sprintf('This is not a local file "%s".', $path)); + } + + if (!file_exists($path)) { + throw new \InvalidArgumentException(sprintf('File "%s" not found.', $path)); + } + + if (null === $this->yamlParser) { + $this->yamlParser = new YamlParser(); + } + + try { + $parsedConfig = $this->yamlParser->parseFile($path, Yaml::PARSE_CONSTANT); + } catch (ParseException $e) { + throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML: ', $path).$e->getMessage(), 0, $e); + } + + $collection = new RouteCollection(); + $collection->addResource(new FileResource($path)); + + // empty file + if (null === $parsedConfig) { + return $collection; + } + + // not an array + if (!\is_array($parsedConfig)) { + throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $path)); + } + + foreach ($parsedConfig as $name => $config) { + $this->validate($config, $name, $path); + + if (isset($config['resource'])) { + $this->parseImport($collection, $config, $path, $file); + } else { + $this->parseRoute($collection, $name, $config, $path); + } + } + + return $collection; + } + + /** + * {@inheritdoc} + */ + public function supports($resource, string $type = null) + { + return \is_string($resource) && \in_array(pathinfo($resource, PATHINFO_EXTENSION), ['yml', 'yaml'], true) && (!$type || 'yaml' === $type); + } + + /** + * Parses a route and adds it to the RouteCollection. + * + * @param string $name Route name + * @param array $config Route definition + * @param string $path Full path of the YAML file being processed + */ + protected function parseRoute(RouteCollection $collection, string $name, array $config, string $path) + { + $defaults = isset($config['defaults']) ? $config['defaults'] : []; + $requirements = isset($config['requirements']) ? $config['requirements'] : []; + $options = isset($config['options']) ? $config['options'] : []; + + foreach ($requirements as $placeholder => $requirement) { + if (\is_int($placeholder)) { + throw new \InvalidArgumentException(sprintf('A placeholder name must be a string (%d given). Did you forget to specify the placeholder key for the requirement "%s" of route "%s" in "%s"?', $placeholder, $requirement, $name, $path)); + } + } + + if (isset($config['controller'])) { + $defaults['_controller'] = $config['controller']; + } + if (isset($config['locale'])) { + $defaults['_locale'] = $config['locale']; + } + if (isset($config['format'])) { + $defaults['_format'] = $config['format']; + } + if (isset($config['utf8'])) { + $options['utf8'] = $config['utf8']; + } + if (isset($config['stateless'])) { + $defaults['_stateless'] = $config['stateless']; + } + + $routes = $this->createLocalizedRoute($collection, $name, $config['path']); + $routes->addDefaults($defaults); + $routes->addRequirements($requirements); + $routes->addOptions($options); + $routes->setSchemes($config['schemes'] ?? []); + $routes->setMethods($config['methods'] ?? []); + $routes->setCondition($config['condition'] ?? null); + + if (isset($config['host'])) { + $this->addHost($routes, $config['host']); + } + } + + /** + * Parses an import and adds the routes in the resource to the RouteCollection. + * + * @param array $config Route definition + * @param string $path Full path of the YAML file being processed + * @param string $file Loaded file name + */ + protected function parseImport(RouteCollection $collection, array $config, string $path, string $file) + { + $type = isset($config['type']) ? $config['type'] : null; + $prefix = isset($config['prefix']) ? $config['prefix'] : ''; + $defaults = isset($config['defaults']) ? $config['defaults'] : []; + $requirements = isset($config['requirements']) ? $config['requirements'] : []; + $options = isset($config['options']) ? $config['options'] : []; + $host = isset($config['host']) ? $config['host'] : null; + $condition = isset($config['condition']) ? $config['condition'] : null; + $schemes = isset($config['schemes']) ? $config['schemes'] : null; + $methods = isset($config['methods']) ? $config['methods'] : null; + $trailingSlashOnRoot = $config['trailing_slash_on_root'] ?? true; + $namePrefix = $config['name_prefix'] ?? null; + $exclude = $config['exclude'] ?? null; + + if (isset($config['controller'])) { + $defaults['_controller'] = $config['controller']; + } + if (isset($config['locale'])) { + $defaults['_locale'] = $config['locale']; + } + if (isset($config['format'])) { + $defaults['_format'] = $config['format']; + } + if (isset($config['utf8'])) { + $options['utf8'] = $config['utf8']; + } + if (isset($config['stateless'])) { + $defaults['_stateless'] = $config['stateless']; + } + + $this->setCurrentDir(\dirname($path)); + + /** @var RouteCollection[] $imported */ + $imported = $this->import($config['resource'], $type, false, $file, $exclude) ?: []; + + if (!\is_array($imported)) { + $imported = [$imported]; + } + + foreach ($imported as $subCollection) { + $this->addPrefix($subCollection, $prefix, $trailingSlashOnRoot); + + if (null !== $host) { + $this->addHost($subCollection, $host); + } + if (null !== $condition) { + $subCollection->setCondition($condition); + } + if (null !== $schemes) { + $subCollection->setSchemes($schemes); + } + if (null !== $methods) { + $subCollection->setMethods($methods); + } + if (null !== $namePrefix) { + $subCollection->addNamePrefix($namePrefix); + } + $subCollection->addDefaults($defaults); + $subCollection->addRequirements($requirements); + $subCollection->addOptions($options); + + $collection->addCollection($subCollection); + } + } + + /** + * Validates the route configuration. + * + * @param array $config A resource config + * @param string $name The config key + * @param string $path The loaded file path + * + * @throws \InvalidArgumentException If one of the provided config keys is not supported, + * something is missing or the combination is nonsense + */ + protected function validate($config, string $name, string $path) + { + if (!\is_array($config)) { + throw new \InvalidArgumentException(sprintf('The definition of "%s" in "%s" must be a YAML array.', $name, $path)); + } + if ($extraKeys = array_diff(array_keys($config), self::$availableKeys)) { + throw new \InvalidArgumentException(sprintf('The routing file "%s" contains unsupported keys for "%s": "%s". Expected one of: "%s".', $path, $name, implode('", "', $extraKeys), implode('", "', self::$availableKeys))); + } + if (isset($config['resource']) && isset($config['path'])) { + throw new \InvalidArgumentException(sprintf('The routing file "%s" must not specify both the "resource" key and the "path" key for "%s". Choose between an import and a route definition.', $path, $name)); + } + if (!isset($config['resource']) && isset($config['type'])) { + throw new \InvalidArgumentException(sprintf('The "type" key for the route definition "%s" in "%s" is unsupported. It is only available for imports in combination with the "resource" key.', $name, $path)); + } + if (!isset($config['resource']) && !isset($config['path'])) { + throw new \InvalidArgumentException(sprintf('You must define a "path" for the route "%s" in file "%s".', $name, $path)); + } + if (isset($config['controller']) && isset($config['defaults']['_controller'])) { + throw new \InvalidArgumentException(sprintf('The routing file "%s" must not specify both the "controller" key and the defaults key "_controller" for "%s".', $path, $name)); + } + if (isset($config['stateless']) && isset($config['defaults']['_stateless'])) { + throw new \InvalidArgumentException(sprintf('The routing file "%s" must not specify both the "stateless" key and the defaults key "_stateless" for "%s".', $path, $name)); + } + } +} diff --git a/vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd b/vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd new file mode 100644 index 0000000..846d126 --- /dev/null +++ b/vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/symfony/routing/Matcher/CompiledUrlMatcher.php b/vendor/symfony/routing/Matcher/CompiledUrlMatcher.php new file mode 100644 index 0000000..e15cda7 --- /dev/null +++ b/vendor/symfony/routing/Matcher/CompiledUrlMatcher.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait; +use Symfony\Component\Routing\RequestContext; + +/** + * Matches URLs based on rules dumped by CompiledUrlMatcherDumper. + * + * @author Nicolas Grekas + */ +class CompiledUrlMatcher extends UrlMatcher +{ + use CompiledUrlMatcherTrait; + + public function __construct(array $compiledRoutes, RequestContext $context) + { + $this->context = $context; + list($this->matchHost, $this->staticRoutes, $this->regexpList, $this->dynamicRoutes, $this->checkCondition) = $compiledRoutes; + } +} diff --git a/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php b/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php new file mode 100644 index 0000000..936dd16 --- /dev/null +++ b/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php @@ -0,0 +1,501 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * CompiledUrlMatcherDumper creates PHP arrays to be used with CompiledUrlMatcher. + * + * @author Fabien Potencier + * @author Tobias Schultze + * @author Arnaud Le Blanc + * @author Nicolas Grekas + */ +class CompiledUrlMatcherDumper extends MatcherDumper +{ + private $expressionLanguage; + private $signalingException; + + /** + * @var ExpressionFunctionProviderInterface[] + */ + private $expressionLanguageProviders = []; + + /** + * {@inheritdoc} + */ + public function dump(array $options = []) + { + return <<generateCompiledRoutes()}]; + +EOF; + } + + public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) + { + $this->expressionLanguageProviders[] = $provider; + } + + /** + * Generates the arrays for CompiledUrlMatcher's constructor. + */ + public function getCompiledRoutes(bool $forDump = false): array + { + // Group hosts by same-suffix, re-order when possible + $matchHost = false; + $routes = new StaticPrefixCollection(); + foreach ($this->getRoutes()->all() as $name => $route) { + if ($host = $route->getHost()) { + $matchHost = true; + $host = '/'.strtr(strrev($host), '}.{', '(/)'); + } + + $routes->addRoute($host ?: '/(.*)', [$name, $route]); + } + + if ($matchHost) { + $compiledRoutes = [true]; + $routes = $routes->populateCollection(new RouteCollection()); + } else { + $compiledRoutes = [false]; + $routes = $this->getRoutes(); + } + + list($staticRoutes, $dynamicRoutes) = $this->groupStaticRoutes($routes); + + $conditions = [null]; + $compiledRoutes[] = $this->compileStaticRoutes($staticRoutes, $conditions); + $chunkLimit = \count($dynamicRoutes); + + while (true) { + try { + $this->signalingException = new \RuntimeException('Compilation failed: regular expression is too large'); + $compiledRoutes = array_merge($compiledRoutes, $this->compileDynamicRoutes($dynamicRoutes, $matchHost, $chunkLimit, $conditions)); + + break; + } catch (\Exception $e) { + if (1 < $chunkLimit && $this->signalingException === $e) { + $chunkLimit = 1 + ($chunkLimit >> 1); + continue; + } + throw $e; + } + } + + if ($forDump) { + $compiledRoutes[2] = $compiledRoutes[4]; + } + unset($conditions[0]); + + if ($conditions) { + foreach ($conditions as $expression => $condition) { + $conditions[$expression] = "case {$condition}: return {$expression};"; + } + + $checkConditionCode = <<indent(implode("\n", $conditions), 3)} + } + } +EOF; + $compiledRoutes[4] = $forDump ? $checkConditionCode.",\n" : eval('return '.$checkConditionCode.';'); + } else { + $compiledRoutes[4] = $forDump ? " null, // \$checkCondition\n" : null; + } + + return $compiledRoutes; + } + + private function generateCompiledRoutes(): string + { + list($matchHost, $staticRoutes, $regexpCode, $dynamicRoutes, $checkConditionCode) = $this->getCompiledRoutes(true); + + $code = self::export($matchHost).', // $matchHost'."\n"; + + $code .= '[ // $staticRoutes'."\n"; + foreach ($staticRoutes as $path => $routes) { + $code .= sprintf(" %s => [\n", self::export($path)); + foreach ($routes as $route) { + $code .= sprintf(" [%s, %s, %s, %s, %s, %s, %s],\n", ...array_map([__CLASS__, 'export'], $route)); + } + $code .= " ],\n"; + } + $code .= "],\n"; + + $code .= sprintf("[ // \$regexpList%s\n],\n", $regexpCode); + + $code .= '[ // $dynamicRoutes'."\n"; + foreach ($dynamicRoutes as $path => $routes) { + $code .= sprintf(" %s => [\n", self::export($path)); + foreach ($routes as $route) { + $code .= sprintf(" [%s, %s, %s, %s, %s, %s, %s],\n", ...array_map([__CLASS__, 'export'], $route)); + } + $code .= " ],\n"; + } + $code .= "],\n"; + $code = preg_replace('/ => \[\n (\[.+?),\n \],/', ' => [$1],', $code); + + return $this->indent($code, 1).$checkConditionCode; + } + + /** + * Splits static routes from dynamic routes, so that they can be matched first, using a simple switch. + */ + private function groupStaticRoutes(RouteCollection $collection): array + { + $staticRoutes = $dynamicRegex = []; + $dynamicRoutes = new RouteCollection(); + + foreach ($collection->all() as $name => $route) { + $compiledRoute = $route->compile(); + $staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/'); + $hostRegex = $compiledRoute->getHostRegex(); + $regex = $compiledRoute->getRegex(); + if ($hasTrailingSlash = '/' !== $route->getPath()) { + $pos = strrpos($regex, '$'); + $hasTrailingSlash = '/' === $regex[$pos - 1]; + $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); + } + + if (!$compiledRoute->getPathVariables()) { + $host = !$compiledRoute->getHostVariables() ? $route->getHost() : ''; + $url = $route->getPath(); + if ($hasTrailingSlash) { + $url = substr($url, 0, -1); + } + foreach ($dynamicRegex as list($hostRx, $rx, $prefix)) { + if (('' === $prefix || 0 === strpos($url, $prefix)) && (preg_match($rx, $url) || preg_match($rx, $url.'/')) && (!$host || !$hostRx || preg_match($hostRx, $host))) { + $dynamicRegex[] = [$hostRegex, $regex, $staticPrefix]; + $dynamicRoutes->add($name, $route); + continue 2; + } + } + + $staticRoutes[$url][$name] = [$route, $hasTrailingSlash]; + } else { + $dynamicRegex[] = [$hostRegex, $regex, $staticPrefix]; + $dynamicRoutes->add($name, $route); + } + } + + return [$staticRoutes, $dynamicRoutes]; + } + + /** + * Compiles static routes in a switch statement. + * + * Condition-less paths are put in a static array in the switch's default, with generic matching logic. + * Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases. + * + * @throws \LogicException + */ + private function compileStaticRoutes(array $staticRoutes, array &$conditions): array + { + if (!$staticRoutes) { + return []; + } + $compiledRoutes = []; + + foreach ($staticRoutes as $url => $routes) { + $compiledRoutes[$url] = []; + foreach ($routes as $name => list($route, $hasTrailingSlash)) { + $compiledRoutes[$url][] = $this->compileRoute($route, $name, (!$route->compile()->getHostVariables() ? $route->getHost() : $route->compile()->getHostRegex()) ?: null, $hasTrailingSlash, false, $conditions); + } + } + + return $compiledRoutes; + } + + /** + * Compiles a regular expression followed by a switch statement to match dynamic routes. + * + * The regular expression matches both the host and the pathinfo at the same time. For stellar performance, + * it is built as a tree of patterns, with re-ordering logic to group same-prefix routes together when possible. + * + * Patterns are named so that we know which one matched (https://pcre.org/current/doc/html/pcre2syntax.html#SEC23). + * This name is used to "switch" to the additional logic required to match the final route. + * + * Condition-less paths are put in a static array in the switch's default, with generic matching logic. + * Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases. + * + * Last but not least: + * - Because it is not possibe to mix unicode/non-unicode patterns in a single regexp, several of them can be generated. + * - The same regexp can be used several times when the logic in the switch rejects the match. When this happens, the + * matching-but-failing subpattern is blacklisted by replacing its name by "(*F)", which forces a failure-to-match. + * To ease this backlisting operation, the name of subpatterns is also the string offset where the replacement should occur. + */ + private function compileDynamicRoutes(RouteCollection $collection, bool $matchHost, int $chunkLimit, array &$conditions): array + { + if (!$collection->all()) { + return [[], [], '']; + } + $regexpList = []; + $code = ''; + $state = (object) [ + 'regexMark' => 0, + 'regex' => [], + 'routes' => [], + 'mark' => 0, + 'markTail' => 0, + 'hostVars' => [], + 'vars' => [], + ]; + $state->getVars = static function ($m) use ($state) { + if ('_route' === $m[1]) { + return '?:'; + } + + $state->vars[] = $m[1]; + + return ''; + }; + + $chunkSize = 0; + $prev = null; + $perModifiers = []; + foreach ($collection->all() as $name => $route) { + preg_match('#[a-zA-Z]*$#', $route->compile()->getRegex(), $rx); + if ($chunkLimit < ++$chunkSize || $prev !== $rx[0] && $route->compile()->getPathVariables()) { + $chunkSize = 1; + $routes = new RouteCollection(); + $perModifiers[] = [$rx[0], $routes]; + $prev = $rx[0]; + } + $routes->add($name, $route); + } + + foreach ($perModifiers as list($modifiers, $routes)) { + $prev = false; + $perHost = []; + foreach ($routes->all() as $name => $route) { + $regex = $route->compile()->getHostRegex(); + if ($prev !== $regex) { + $routes = new RouteCollection(); + $perHost[] = [$regex, $routes]; + $prev = $regex; + } + $routes->add($name, $route); + } + $prev = false; + $rx = '{^(?'; + $code .= "\n {$state->mark} => ".self::export($rx); + $startingMark = $state->mark; + $state->mark += \strlen($rx); + $state->regex = $rx; + + foreach ($perHost as list($hostRegex, $routes)) { + if ($matchHost) { + if ($hostRegex) { + preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $hostRegex, $rx); + $state->vars = []; + $hostRegex = '(?i:'.preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]).')\.'; + $state->hostVars = $state->vars; + } else { + $hostRegex = '(?:(?:[^./]*+\.)++)'; + $state->hostVars = []; + } + $state->mark += \strlen($rx = ($prev ? ')' : '')."|{$hostRegex}(?"); + $code .= "\n .".self::export($rx); + $state->regex .= $rx; + $prev = true; + } + + $tree = new StaticPrefixCollection(); + foreach ($routes->all() as $name => $route) { + preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $route->compile()->getRegex(), $rx); + + $state->vars = []; + $regex = preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]); + if ($hasTrailingSlash = '/' !== $regex && '/' === $regex[-1]) { + $regex = substr($regex, 0, -1); + } + $hasTrailingVar = (bool) preg_match('#\{\w+\}/?$#', $route->getPath()); + + $tree->addRoute($regex, [$name, $regex, $state->vars, $route, $hasTrailingSlash, $hasTrailingVar]); + } + + $code .= $this->compileStaticPrefixCollection($tree, $state, 0, $conditions); + } + if ($matchHost) { + $code .= "\n .')'"; + $state->regex .= ')'; + } + $rx = ")/?$}{$modifiers}"; + $code .= "\n .'{$rx}',"; + $state->regex .= $rx; + $state->markTail = 0; + + // if the regex is too large, throw a signaling exception to recompute with smaller chunk size + set_error_handler(function ($type, $message) { throw false !== strpos($message, $this->signalingException->getMessage()) ? $this->signalingException : new \ErrorException($message); }); + try { + preg_match($state->regex, ''); + } finally { + restore_error_handler(); + } + + $regexpList[$startingMark] = $state->regex; + } + + $state->routes[$state->mark][] = [null, null, null, null, false, false, 0]; + unset($state->getVars); + + return [$regexpList, $state->routes, $code]; + } + + /** + * Compiles a regexp tree of subpatterns that matches nested same-prefix routes. + * + * @param \stdClass $state A simple state object that keeps track of the progress of the compilation, + * and gathers the generated switch's "case" and "default" statements + */ + private function compileStaticPrefixCollection(StaticPrefixCollection $tree, \stdClass $state, int $prefixLen, array &$conditions): string + { + $code = ''; + $prevRegex = null; + $routes = $tree->getRoutes(); + + foreach ($routes as $i => $route) { + if ($route instanceof StaticPrefixCollection) { + $prevRegex = null; + $prefix = substr($route->getPrefix(), $prefixLen); + $state->mark += \strlen($rx = "|{$prefix}(?"); + $code .= "\n .".self::export($rx); + $state->regex .= $rx; + $code .= $this->indent($this->compileStaticPrefixCollection($route, $state, $prefixLen + \strlen($prefix), $conditions)); + $code .= "\n .')'"; + $state->regex .= ')'; + ++$state->markTail; + continue; + } + + list($name, $regex, $vars, $route, $hasTrailingSlash, $hasTrailingVar) = $route; + $compiledRoute = $route->compile(); + $vars = array_merge($state->hostVars, $vars); + + if ($compiledRoute->getRegex() === $prevRegex) { + $state->routes[$state->mark][] = $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions); + continue; + } + + $state->mark += 3 + $state->markTail + \strlen($regex) - $prefixLen; + $state->markTail = 2 + \strlen($state->mark); + $rx = sprintf('|%s(*:%s)', substr($regex, $prefixLen), $state->mark); + $code .= "\n .".self::export($rx); + $state->regex .= $rx; + + $prevRegex = $compiledRoute->getRegex(); + $state->routes[$state->mark] = [$this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions)]; + } + + return $code; + } + + /** + * Compiles a single Route to PHP code used to match it against the path info. + */ + private function compileRoute(Route $route, string $name, $vars, bool $hasTrailingSlash, bool $hasTrailingVar, array &$conditions): array + { + $defaults = $route->getDefaults(); + + if (isset($defaults['_canonical_route'])) { + $name = $defaults['_canonical_route']; + unset($defaults['_canonical_route']); + } + + if ($condition = $route->getCondition()) { + $condition = $this->getExpressionLanguage()->compile($condition, ['context', 'request']); + $condition = $conditions[$condition] ?? $conditions[$condition] = (false !== strpos($condition, '$request') ? 1 : -1) * \count($conditions); + } else { + $condition = null; + } + + return [ + ['_route' => $name] + $defaults, + $vars, + array_flip($route->getMethods()) ?: null, + array_flip($route->getSchemes()) ?: null, + $hasTrailingSlash, + $hasTrailingVar, + $condition, + ]; + } + + private function getExpressionLanguage(): ExpressionLanguage + { + if (null === $this->expressionLanguage) { + if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { + throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); + } + $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); + } + + return $this->expressionLanguage; + } + + private function indent(string $code, int $level = 1): string + { + return preg_replace('/^./m', str_repeat(' ', $level).'$0', $code); + } + + /** + * @internal + */ + public static function export($value): string + { + if (null === $value) { + return 'null'; + } + if (!\is_array($value)) { + if (\is_object($value)) { + throw new \InvalidArgumentException('Symfony\Component\Routing\Route cannot contain objects.'); + } + + return str_replace("\n", '\'."\n".\'', var_export($value, true)); + } + if (!$value) { + return '[]'; + } + + $i = 0; + $export = '['; + + foreach ($value as $k => $v) { + if ($i === $k) { + ++$i; + } else { + $export .= self::export($k).' => '; + + if (\is_int($k) && $i < $k) { + $i = 1 + $k; + } + } + + $export .= self::export($v).', '; + } + + return substr_replace($export, ']', -2); + } +} diff --git a/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php b/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php new file mode 100644 index 0000000..caba4e5 --- /dev/null +++ b/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php @@ -0,0 +1,187 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\NoConfigurationException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface; +use Symfony\Component\Routing\RequestContext; + +/** + * @author Nicolas Grekas + * + * @internal + * + * @property RequestContext $context + */ +trait CompiledUrlMatcherTrait +{ + private $matchHost = false; + private $staticRoutes = []; + private $regexpList = []; + private $dynamicRoutes = []; + private $checkCondition; + + public function match(string $pathinfo): array + { + $allow = $allowSchemes = []; + if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { + return $ret; + } + if ($allow) { + throw new MethodNotAllowedException(array_keys($allow)); + } + if (!$this instanceof RedirectableUrlMatcherInterface) { + throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo)); + } + if (!\in_array($this->context->getMethod(), ['HEAD', 'GET'], true)) { + // no-op + } elseif ($allowSchemes) { + redirect_scheme: + $scheme = $this->context->getScheme(); + $this->context->setScheme(key($allowSchemes)); + try { + if ($ret = $this->doMatch($pathinfo)) { + return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; + } + } finally { + $this->context->setScheme($scheme); + } + } elseif ('/' !== $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/') { + $pathinfo = $trimmedPathinfo === $pathinfo ? $pathinfo.'/' : $trimmedPathinfo; + if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { + return $this->redirect($pathinfo, $ret['_route']) + $ret; + } + if ($allowSchemes) { + goto redirect_scheme; + } + } + + throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo)); + } + + private function doMatch(string $pathinfo, array &$allow = [], array &$allowSchemes = []): array + { + $allow = $allowSchemes = []; + $pathinfo = rawurldecode($pathinfo) ?: '/'; + $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/'; + $context = $this->context; + $requestMethod = $canonicalMethod = $context->getMethod(); + + if ($this->matchHost) { + $host = strtolower($context->getHost()); + } + + if ('HEAD' === $requestMethod) { + $canonicalMethod = 'GET'; + } + $supportsRedirections = 'GET' === $canonicalMethod && $this instanceof RedirectableUrlMatcherInterface; + + foreach ($this->staticRoutes[$trimmedPathinfo] ?? [] as list($ret, $requiredHost, $requiredMethods, $requiredSchemes, $hasTrailingSlash, , $condition)) { + if ($condition && !($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) { + continue; + } + + if ($requiredHost) { + if ('{' !== $requiredHost[0] ? $requiredHost !== $host : !preg_match($requiredHost, $host, $hostMatches)) { + continue; + } + if ('{' === $requiredHost[0] && $hostMatches) { + $hostMatches['_route'] = $ret['_route']; + $ret = $this->mergeDefaults($hostMatches, $ret); + } + } + + if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + if ($supportsRedirections && (!$requiredMethods || isset($requiredMethods['GET']))) { + return $allow = $allowSchemes = []; + } + continue; + } + + $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); + if ($hasRequiredScheme && $requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { + $allow += $requiredMethods; + continue; + } + + if (!$hasRequiredScheme) { + $allowSchemes += $requiredSchemes; + continue; + } + + return $ret; + } + + $matchedPathinfo = $this->matchHost ? $host.'.'.$pathinfo : $pathinfo; + + foreach ($this->regexpList as $offset => $regex) { + while (preg_match($regex, $matchedPathinfo, $matches)) { + foreach ($this->dynamicRoutes[$m = (int) $matches['MARK']] as list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar, $condition)) { + if (null !== $condition) { + if (0 === $condition) { // marks the last route in the regexp + continue 3; + } + if (!($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) { + continue; + } + } + + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + + if ($hasTrailingVar && ($hasTrailingSlash || (null === $n = $matches[\count($vars)] ?? null) || '/' !== ($n[-1] ?? '/')) && preg_match($regex, $this->matchHost ? $host.'.'.$trimmedPathinfo : $trimmedPathinfo, $n) && $m === (int) $n['MARK']) { + if ($hasTrailingSlash) { + $matches = $n; + } else { + $hasTrailingVar = false; + } + } + + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + if ($supportsRedirections && (!$requiredMethods || isset($requiredMethods['GET']))) { + return $allow = $allowSchemes = []; + } + continue; + } + + foreach ($vars as $i => $v) { + if (isset($matches[1 + $i])) { + $ret[$v] = $matches[1 + $i]; + } + } + + if ($requiredSchemes && !isset($requiredSchemes[$context->getScheme()])) { + $allowSchemes += $requiredSchemes; + continue; + } + + if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { + $allow += $requiredMethods; + continue; + } + + return $ret; + } + + $regex = substr_replace($regex, 'F', $m - $offset, 1 + \strlen($m)); + $offset += \strlen($m); + } + } + + if ('/' === $pathinfo && !$allow && !$allowSchemes) { + throw new NoConfigurationException(); + } + + return []; + } +} diff --git a/vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php b/vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php new file mode 100644 index 0000000..ea51ab4 --- /dev/null +++ b/vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * MatcherDumper is the abstract class for all built-in matcher dumpers. + * + * @author Fabien Potencier + */ +abstract class MatcherDumper implements MatcherDumperInterface +{ + private $routes; + + public function __construct(RouteCollection $routes) + { + $this->routes = $routes; + } + + /** + * {@inheritdoc} + */ + public function getRoutes() + { + return $this->routes; + } +} diff --git a/vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php b/vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php new file mode 100644 index 0000000..34aad92 --- /dev/null +++ b/vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * MatcherDumperInterface is the interface that all matcher dumper classes must implement. + * + * @author Fabien Potencier + */ +interface MatcherDumperInterface +{ + /** + * Dumps a set of routes to a string representation of executable code + * that can then be used to match a request against these routes. + * + * @return string Executable code + */ + public function dump(array $options = []); + + /** + * Gets the routes to dump. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRoutes(); +} diff --git a/vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php b/vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php new file mode 100644 index 0000000..65b6c07 --- /dev/null +++ b/vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php @@ -0,0 +1,202 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\RouteCollection; + +/** + * Prefix tree of routes preserving routes order. + * + * @author Frank de Jonge + * @author Nicolas Grekas + * + * @internal + */ +class StaticPrefixCollection +{ + private $prefix; + + /** + * @var string[] + */ + private $staticPrefixes = []; + + /** + * @var string[] + */ + private $prefixes = []; + + /** + * @var array[]|self[] + */ + private $items = []; + + public function __construct(string $prefix = '/') + { + $this->prefix = $prefix; + } + + public function getPrefix(): string + { + return $this->prefix; + } + + /** + * @return array[]|self[] + */ + public function getRoutes(): array + { + return $this->items; + } + + /** + * Adds a route to a group. + * + * @param array|self $route + */ + public function addRoute(string $prefix, $route) + { + list($prefix, $staticPrefix) = $this->getCommonPrefix($prefix, $prefix); + + for ($i = \count($this->items) - 1; 0 <= $i; --$i) { + $item = $this->items[$i]; + + list($commonPrefix, $commonStaticPrefix) = $this->getCommonPrefix($prefix, $this->prefixes[$i]); + + if ($this->prefix === $commonPrefix) { + // the new route and a previous one have no common prefix, let's see if they are exclusive to each others + + if ($this->prefix !== $staticPrefix && $this->prefix !== $this->staticPrefixes[$i]) { + // the new route and the previous one have exclusive static prefixes + continue; + } + + if ($this->prefix === $staticPrefix && $this->prefix === $this->staticPrefixes[$i]) { + // the new route and the previous one have no static prefix + break; + } + + if ($this->prefixes[$i] !== $this->staticPrefixes[$i] && $this->prefix === $this->staticPrefixes[$i]) { + // the previous route is non-static and has no static prefix + break; + } + + if ($prefix !== $staticPrefix && $this->prefix === $staticPrefix) { + // the new route is non-static and has no static prefix + break; + } + + continue; + } + + if ($item instanceof self && $this->prefixes[$i] === $commonPrefix) { + // the new route is a child of a previous one, let's nest it + $item->addRoute($prefix, $route); + } else { + // the new route and a previous one have a common prefix, let's merge them + $child = new self($commonPrefix); + list($child->prefixes[0], $child->staticPrefixes[0]) = $child->getCommonPrefix($this->prefixes[$i], $this->prefixes[$i]); + list($child->prefixes[1], $child->staticPrefixes[1]) = $child->getCommonPrefix($prefix, $prefix); + $child->items = [$this->items[$i], $route]; + + $this->staticPrefixes[$i] = $commonStaticPrefix; + $this->prefixes[$i] = $commonPrefix; + $this->items[$i] = $child; + } + + return; + } + + // No optimised case was found, in this case we simple add the route for possible + // grouping when new routes are added. + $this->staticPrefixes[] = $staticPrefix; + $this->prefixes[] = $prefix; + $this->items[] = $route; + } + + /** + * Linearizes back a set of nested routes into a collection. + */ + public function populateCollection(RouteCollection $routes): RouteCollection + { + foreach ($this->items as $route) { + if ($route instanceof self) { + $route->populateCollection($routes); + } else { + $routes->add(...$route); + } + } + + return $routes; + } + + /** + * Gets the full and static common prefixes between two route patterns. + * + * The static prefix stops at last at the first opening bracket. + */ + private function getCommonPrefix(string $prefix, string $anotherPrefix): array + { + $baseLength = \strlen($this->prefix); + $end = min(\strlen($prefix), \strlen($anotherPrefix)); + $staticLength = null; + set_error_handler([__CLASS__, 'handleError']); + + for ($i = $baseLength; $i < $end && $prefix[$i] === $anotherPrefix[$i]; ++$i) { + if ('(' === $prefix[$i]) { + $staticLength = $staticLength ?? $i; + for ($j = 1 + $i, $n = 1; $j < $end && 0 < $n; ++$j) { + if ($prefix[$j] !== $anotherPrefix[$j]) { + break 2; + } + if ('(' === $prefix[$j]) { + ++$n; + } elseif (')' === $prefix[$j]) { + --$n; + } elseif ('\\' === $prefix[$j] && (++$j === $end || $prefix[$j] !== $anotherPrefix[$j])) { + --$j; + break; + } + } + if (0 < $n) { + break; + } + if (('?' === ($prefix[$j] ?? '') || '?' === ($anotherPrefix[$j] ?? '')) && ($prefix[$j] ?? '') !== ($anotherPrefix[$j] ?? '')) { + break; + } + $subPattern = substr($prefix, $i, $j - $i); + if ($prefix !== $anotherPrefix && !preg_match('/^\(\[[^\]]++\]\+\+\)$/', $subPattern) && !preg_match('{(?> 6) && preg_match('//u', $prefix.' '.$anotherPrefix)) { + do { + // Prevent cutting in the middle of an UTF-8 characters + --$i; + } while (0b10 === (\ord($prefix[$i]) >> 6)); + } + + return [substr($prefix, 0, $i), substr($prefix, 0, $staticLength ?? $i)]; + } + + public static function handleError($type, $msg) + { + return false !== strpos($msg, 'Compilation failed: lookbehind assertion is not fixed length'); + } +} diff --git a/vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php b/vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php new file mode 100644 index 0000000..9b1bfe3 --- /dev/null +++ b/vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\ExpressionLanguage\ExpressionFunction; +use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; +use Symfony\Contracts\Service\ServiceProviderInterface; + +/** + * Exposes functions defined in the request context to route conditions. + * + * @author Ahmed TAILOULOUTE + */ +class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface +{ + private $functions; + + public function __construct(ServiceProviderInterface $functions) + { + $this->functions = $functions; + } + + /** + * {@inheritdoc} + */ + public function getFunctions() + { + foreach ($this->functions->getProvidedServices() as $function => $type) { + yield new ExpressionFunction( + $function, + static function (...$args) use ($function) { + return sprintf('($context->getParameter(\'_functions\')->get(%s)(%s))', var_export($function, true), implode(', ', $args)); + }, + function ($values, ...$args) use ($function) { + return $values['context']->getParameter('_functions')->get($function)(...$args); + } + ); + } + } + + public function get(string $function): callable + { + return $this->functions->get($function); + } +} diff --git a/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php b/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php new file mode 100644 index 0000000..3cd7c81 --- /dev/null +++ b/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\Exception\ExceptionInterface; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; + +/** + * @author Fabien Potencier + */ +abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface +{ + /** + * {@inheritdoc} + */ + public function match(string $pathinfo) + { + try { + return parent::match($pathinfo); + } catch (ResourceNotFoundException $e) { + if (!\in_array($this->context->getMethod(), ['HEAD', 'GET'], true)) { + throw $e; + } + + if ($this->allowSchemes) { + redirect_scheme: + $scheme = $this->context->getScheme(); + $this->context->setScheme(current($this->allowSchemes)); + try { + $ret = parent::match($pathinfo); + + return $this->redirect($pathinfo, $ret['_route'] ?? null, $this->context->getScheme()) + $ret; + } catch (ExceptionInterface $e2) { + throw $e; + } finally { + $this->context->setScheme($scheme); + } + } elseif ('/' === $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/') { + throw $e; + } else { + try { + $pathinfo = $trimmedPathinfo === $pathinfo ? $pathinfo.'/' : $trimmedPathinfo; + $ret = parent::match($pathinfo); + + return $this->redirect($pathinfo, $ret['_route'] ?? null) + $ret; + } catch (ExceptionInterface $e2) { + if ($this->allowSchemes) { + goto redirect_scheme; + } + throw $e; + } + } + } + } +} diff --git a/vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php b/vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php new file mode 100644 index 0000000..144945d --- /dev/null +++ b/vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +/** + * RedirectableUrlMatcherInterface knows how to redirect the user. + * + * @author Fabien Potencier + */ +interface RedirectableUrlMatcherInterface +{ + /** + * Redirects the user to another URL. + * + * @param string $path The path info to redirect to + * @param string $route The route name that matched + * @param string|null $scheme The URL scheme (null to keep the current one) + * + * @return array An array of parameters + */ + public function redirect(string $path, string $route, string $scheme = null); +} diff --git a/vendor/symfony/routing/Matcher/RequestMatcherInterface.php b/vendor/symfony/routing/Matcher/RequestMatcherInterface.php new file mode 100644 index 0000000..0c193ff --- /dev/null +++ b/vendor/symfony/routing/Matcher/RequestMatcherInterface.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\NoConfigurationException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; + +/** + * RequestMatcherInterface is the interface that all request matcher classes must implement. + * + * @author Fabien Potencier + */ +interface RequestMatcherInterface +{ + /** + * Tries to match a request with a set of routes. + * + * If the matcher can not find information, it must throw one of the exceptions documented + * below. + * + * @return array An array of parameters + * + * @throws NoConfigurationException If no routing configuration could be found + * @throws ResourceNotFoundException If no matching resource could be found + * @throws MethodNotAllowedException If a matching resource was found but the request method is not allowed + */ + public function matchRequest(Request $request); +} diff --git a/vendor/symfony/routing/Matcher/TraceableUrlMatcher.php b/vendor/symfony/routing/Matcher/TraceableUrlMatcher.php new file mode 100644 index 0000000..627cd02 --- /dev/null +++ b/vendor/symfony/routing/Matcher/TraceableUrlMatcher.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Exception\ExceptionInterface; +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * TraceableUrlMatcher helps debug path info matching by tracing the match. + * + * @author Fabien Potencier + */ +class TraceableUrlMatcher extends UrlMatcher +{ + const ROUTE_DOES_NOT_MATCH = 0; + const ROUTE_ALMOST_MATCHES = 1; + const ROUTE_MATCHES = 2; + + protected $traces; + + public function getTraces(string $pathinfo) + { + $this->traces = []; + + try { + $this->match($pathinfo); + } catch (ExceptionInterface $e) { + } + + return $this->traces; + } + + public function getTracesForRequest(Request $request) + { + $this->request = $request; + $traces = $this->getTraces($request->getPathInfo()); + $this->request = null; + + return $traces; + } + + protected function matchCollection(string $pathinfo, RouteCollection $routes) + { + // HEAD and GET are equivalent as per RFC + if ('HEAD' === $method = $this->context->getMethod()) { + $method = 'GET'; + } + $supportsTrailingSlash = 'GET' === $method && $this instanceof RedirectableUrlMatcherInterface; + $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/'; + + foreach ($routes as $name => $route) { + $compiledRoute = $route->compile(); + $staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/'); + $requiredMethods = $route->getMethods(); + + // check the static prefix of the URL first. Only use the more expensive preg_match when it matches + if ('' !== $staticPrefix && 0 !== strpos($trimmedPathinfo, $staticPrefix)) { + $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); + continue; + } + $regex = $compiledRoute->getRegex(); + + $pos = strrpos($regex, '$'); + $hasTrailingSlash = '/' === $regex[$pos - 1]; + $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); + + if (!preg_match($regex, $pathinfo, $matches)) { + // does it match without any requirements? + $r = new Route($route->getPath(), $route->getDefaults(), [], $route->getOptions()); + $cr = $r->compile(); + if (!preg_match($cr->getRegex(), $pathinfo)) { + $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); + + continue; + } + + foreach ($route->getRequirements() as $n => $regex) { + $r = new Route($route->getPath(), $route->getDefaults(), [$n => $regex], $route->getOptions()); + $cr = $r->compile(); + + if (\in_array($n, $cr->getVariables()) && !preg_match($cr->getRegex(), $pathinfo)) { + $this->addTrace(sprintf('Requirement for "%s" does not match (%s)', $n, $regex), self::ROUTE_ALMOST_MATCHES, $name, $route); + + continue 2; + } + } + + continue; + } + + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath()); + + if ($hasTrailingVar && ($hasTrailingSlash || (null === $m = $matches[\count($compiledRoute->getPathVariables())] ?? null) || '/' !== ($m[-1] ?? '/')) && preg_match($regex, $trimmedPathinfo, $m)) { + if ($hasTrailingSlash) { + $matches = $m; + } else { + $hasTrailingVar = false; + } + } + + $hostMatches = []; + if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) { + $this->addTrace(sprintf('Host "%s" does not match the requirement ("%s")', $this->context->getHost(), $route->getHost()), self::ROUTE_ALMOST_MATCHES, $name, $route); + continue; + } + + $status = $this->handleRouteRequirements($pathinfo, $name, $route); + + if (self::REQUIREMENT_MISMATCH === $status[0]) { + $this->addTrace(sprintf('Condition "%s" does not evaluate to "true"', $route->getCondition()), self::ROUTE_ALMOST_MATCHES, $name, $route); + continue; + } + + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) { + $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route); + + return $this->allow = $this->allowSchemes = []; + } + $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); + continue; + } + + if ($route->getSchemes() && !$route->hasScheme($this->context->getScheme())) { + $this->allowSchemes = array_merge($this->allowSchemes, $route->getSchemes()); + $this->addTrace(sprintf('Scheme "%s" does not match any of the required schemes (%s)', $this->context->getScheme(), implode(', ', $route->getSchemes())), self::ROUTE_ALMOST_MATCHES, $name, $route); + continue; + } + + if ($requiredMethods && !\in_array($method, $requiredMethods)) { + $this->allow = array_merge($this->allow, $requiredMethods); + $this->addTrace(sprintf('Method "%s" does not match any of the required methods (%s)', $this->context->getMethod(), implode(', ', $requiredMethods)), self::ROUTE_ALMOST_MATCHES, $name, $route); + continue; + } + + $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route); + + return $this->getAttributes($route, $name, array_replace($matches, $hostMatches, isset($status[1]) ? $status[1] : [])); + } + + return []; + } + + private function addTrace(string $log, int $level = self::ROUTE_DOES_NOT_MATCH, string $name = null, Route $route = null) + { + $this->traces[] = [ + 'log' => $log, + 'name' => $name, + 'level' => $level, + 'path' => null !== $route ? $route->getPath() : null, + ]; + } +} diff --git a/vendor/symfony/routing/Matcher/UrlMatcher.php b/vendor/symfony/routing/Matcher/UrlMatcher.php new file mode 100644 index 0000000..4c76231 --- /dev/null +++ b/vendor/symfony/routing/Matcher/UrlMatcher.php @@ -0,0 +1,279 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\NoConfigurationException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +/** + * UrlMatcher matches URL based on a set of routes. + * + * @author Fabien Potencier + */ +class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface +{ + const REQUIREMENT_MATCH = 0; + const REQUIREMENT_MISMATCH = 1; + const ROUTE_MATCH = 2; + + /** @var RequestContext */ + protected $context; + + /** + * Collects HTTP methods that would be allowed for the request. + */ + protected $allow = []; + + /** + * Collects URI schemes that would be allowed for the request. + * + * @internal + */ + protected $allowSchemes = []; + + protected $routes; + protected $request; + protected $expressionLanguage; + + /** + * @var ExpressionFunctionProviderInterface[] + */ + protected $expressionLanguageProviders = []; + + public function __construct(RouteCollection $routes, RequestContext $context) + { + $this->routes = $routes; + $this->context = $context; + } + + /** + * {@inheritdoc} + */ + public function setContext(RequestContext $context) + { + $this->context = $context; + } + + /** + * {@inheritdoc} + */ + public function getContext() + { + return $this->context; + } + + /** + * {@inheritdoc} + */ + public function match(string $pathinfo) + { + $this->allow = $this->allowSchemes = []; + + if ($ret = $this->matchCollection(rawurldecode($pathinfo) ?: '/', $this->routes)) { + return $ret; + } + + if ('/' === $pathinfo && !$this->allow && !$this->allowSchemes) { + throw new NoConfigurationException(); + } + + throw 0 < \count($this->allow) ? new MethodNotAllowedException(array_unique($this->allow)) : new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo)); + } + + /** + * {@inheritdoc} + */ + public function matchRequest(Request $request) + { + $this->request = $request; + + $ret = $this->match($request->getPathInfo()); + + $this->request = null; + + return $ret; + } + + public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) + { + $this->expressionLanguageProviders[] = $provider; + } + + /** + * Tries to match a URL with a set of routes. + * + * @param string $pathinfo The path info to be parsed + * + * @return array An array of parameters + * + * @throws NoConfigurationException If no routing configuration could be found + * @throws ResourceNotFoundException If the resource could not be found + * @throws MethodNotAllowedException If the resource was found but the request method is not allowed + */ + protected function matchCollection(string $pathinfo, RouteCollection $routes) + { + // HEAD and GET are equivalent as per RFC + if ('HEAD' === $method = $this->context->getMethod()) { + $method = 'GET'; + } + $supportsTrailingSlash = 'GET' === $method && $this instanceof RedirectableUrlMatcherInterface; + $trimmedPathinfo = rtrim($pathinfo, '/') ?: '/'; + + foreach ($routes as $name => $route) { + $compiledRoute = $route->compile(); + $staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/'); + $requiredMethods = $route->getMethods(); + + // check the static prefix of the URL first. Only use the more expensive preg_match when it matches + if ('' !== $staticPrefix && 0 !== strpos($trimmedPathinfo, $staticPrefix)) { + continue; + } + $regex = $compiledRoute->getRegex(); + + $pos = strrpos($regex, '$'); + $hasTrailingSlash = '/' === $regex[$pos - 1]; + $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); + + if (!preg_match($regex, $pathinfo, $matches)) { + continue; + } + + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath()); + + if ($hasTrailingVar && ($hasTrailingSlash || (null === $m = $matches[\count($compiledRoute->getPathVariables())] ?? null) || '/' !== ($m[-1] ?? '/')) && preg_match($regex, $trimmedPathinfo, $m)) { + if ($hasTrailingSlash) { + $matches = $m; + } else { + $hasTrailingVar = false; + } + } + + $hostMatches = []; + if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) { + continue; + } + + $status = $this->handleRouteRequirements($pathinfo, $name, $route); + + if (self::REQUIREMENT_MISMATCH === $status[0]) { + continue; + } + + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) { + return $this->allow = $this->allowSchemes = []; + } + continue; + } + + if ($route->getSchemes() && !$route->hasScheme($this->context->getScheme())) { + $this->allowSchemes = array_merge($this->allowSchemes, $route->getSchemes()); + continue; + } + + if ($requiredMethods && !\in_array($method, $requiredMethods)) { + $this->allow = array_merge($this->allow, $requiredMethods); + continue; + } + + return $this->getAttributes($route, $name, array_replace($matches, $hostMatches, isset($status[1]) ? $status[1] : [])); + } + + return []; + } + + /** + * Returns an array of values to use as request attributes. + * + * As this method requires the Route object, it is not available + * in matchers that do not have access to the matched Route instance + * (like the PHP and Apache matcher dumpers). + * + * @return array An array of parameters + */ + protected function getAttributes(Route $route, string $name, array $attributes) + { + $defaults = $route->getDefaults(); + if (isset($defaults['_canonical_route'])) { + $name = $defaults['_canonical_route']; + unset($defaults['_canonical_route']); + } + $attributes['_route'] = $name; + + return $this->mergeDefaults($attributes, $defaults); + } + + /** + * Handles specific route requirements. + * + * @return array The first element represents the status, the second contains additional information + */ + protected function handleRouteRequirements(string $pathinfo, string $name, Route $route) + { + // expression condition + if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), ['context' => $this->context, 'request' => $this->request ?: $this->createRequest($pathinfo)])) { + return [self::REQUIREMENT_MISMATCH, null]; + } + + return [self::REQUIREMENT_MATCH, null]; + } + + /** + * Get merged default parameters. + * + * @return array Merged default parameters + */ + protected function mergeDefaults(array $params, array $defaults) + { + foreach ($params as $key => $value) { + if (!\is_int($key) && null !== $value) { + $defaults[$key] = $value; + } + } + + return $defaults; + } + + protected function getExpressionLanguage() + { + if (null === $this->expressionLanguage) { + if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { + throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); + } + $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); + } + + return $this->expressionLanguage; + } + + /** + * @internal + */ + protected function createRequest(string $pathinfo): ?Request + { + if (!class_exists('Symfony\Component\HttpFoundation\Request')) { + return null; + } + + return Request::create($this->context->getScheme().'://'.$this->context->getHost().$this->context->getBaseUrl().$pathinfo, $this->context->getMethod(), $this->context->getParameters(), [], [], [ + 'SCRIPT_FILENAME' => $this->context->getBaseUrl(), + 'SCRIPT_NAME' => $this->context->getBaseUrl(), + ]); + } +} diff --git a/vendor/symfony/routing/Matcher/UrlMatcherInterface.php b/vendor/symfony/routing/Matcher/UrlMatcherInterface.php new file mode 100644 index 0000000..24f23e3 --- /dev/null +++ b/vendor/symfony/routing/Matcher/UrlMatcherInterface.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher; + +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\NoConfigurationException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\RequestContextAwareInterface; + +/** + * UrlMatcherInterface is the interface that all URL matcher classes must implement. + * + * @author Fabien Potencier + */ +interface UrlMatcherInterface extends RequestContextAwareInterface +{ + /** + * Tries to match a URL path with a set of routes. + * + * If the matcher can not find information, it must throw one of the exceptions documented + * below. + * + * @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded) + * + * @return array An array of parameters + * + * @throws NoConfigurationException If no routing configuration could be found + * @throws ResourceNotFoundException If the resource could not be found + * @throws MethodNotAllowedException If the resource was found but the request method is not allowed + */ + public function match(string $pathinfo); +} diff --git a/vendor/symfony/routing/README.md b/vendor/symfony/routing/README.md new file mode 100644 index 0000000..03b258e --- /dev/null +++ b/vendor/symfony/routing/README.md @@ -0,0 +1,51 @@ +Routing Component +================= + +The Routing component maps an HTTP request to a set of configuration variables. + +Getting Started +--------------- + +``` +$ composer require symfony/routing +``` + +```php +use App\Controller\BlogController; +use Symfony\Component\Routing\Generator\UrlGenerator; +use Symfony\Component\Routing\Matcher\UrlMatcher; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\Route; +use Symfony\Component\Routing\RouteCollection; + +$route = new Route('/blog/{slug}', ['_controller' => BlogController::class]); +$routes = new RouteCollection(); +$routes->add('blog_show', $route); + +$context = new RequestContext(); + +// Routing can match routes with incoming requests +$matcher = new UrlMatcher($routes, $context); +$parameters = $matcher->match('/blog/lorem-ipsum'); +// $parameters = [ +// '_controller' => 'App\Controller\BlogController', +// 'slug' => 'lorem-ipsum', +// '_route' => 'blog_show' +// ] + +// Routing can also generate URLs for a given route +$generator = new UrlGenerator($routes, $context); +$url = $generator->generate('blog_show', [ + 'slug' => 'my-blog-post', +]); +// $url = '/blog/my-blog-post' +``` + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/routing.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/routing/RequestContext.php b/vendor/symfony/routing/RequestContext.php new file mode 100644 index 0000000..ac51cab --- /dev/null +++ b/vendor/symfony/routing/RequestContext.php @@ -0,0 +1,327 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\HttpFoundation\Request; + +/** + * Holds information about the current request. + * + * This class implements a fluent interface. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class RequestContext +{ + private $baseUrl; + private $pathInfo; + private $method; + private $host; + private $scheme; + private $httpPort; + private $httpsPort; + private $queryString; + private $parameters = []; + + public function __construct(string $baseUrl = '', string $method = 'GET', string $host = 'localhost', string $scheme = 'http', int $httpPort = 80, int $httpsPort = 443, string $path = '/', string $queryString = '') + { + $this->setBaseUrl($baseUrl); + $this->setMethod($method); + $this->setHost($host); + $this->setScheme($scheme); + $this->setHttpPort($httpPort); + $this->setHttpsPort($httpsPort); + $this->setPathInfo($path); + $this->setQueryString($queryString); + } + + public static function fromUri(string $uri, string $host = 'localhost', string $scheme = 'http', int $httpPort = 80, int $httpsPort = 443): self + { + $uri = parse_url($uri); + $scheme = $uri['scheme'] ?? $scheme; + $host = $uri['host'] ?? $host; + + if (isset($uri['port'])) { + if ('http' === $scheme) { + $httpPort = $uri['port']; + } elseif ('https' === $scheme) { + $httpsPort = $uri['port']; + } + } + + return new self($uri['path'] ?? '', 'GET', $host, $scheme, $httpPort, $httpsPort); + } + + /** + * Updates the RequestContext information based on a HttpFoundation Request. + * + * @return $this + */ + public function fromRequest(Request $request) + { + $this->setBaseUrl($request->getBaseUrl()); + $this->setPathInfo($request->getPathInfo()); + $this->setMethod($request->getMethod()); + $this->setHost($request->getHost()); + $this->setScheme($request->getScheme()); + $this->setHttpPort($request->isSecure() || null === $request->getPort() ? $this->httpPort : $request->getPort()); + $this->setHttpsPort($request->isSecure() && null !== $request->getPort() ? $request->getPort() : $this->httpsPort); + $this->setQueryString($request->server->get('QUERY_STRING', '')); + + return $this; + } + + /** + * Gets the base URL. + * + * @return string The base URL + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * Sets the base URL. + * + * @return $this + */ + public function setBaseUrl(string $baseUrl) + { + $this->baseUrl = $baseUrl; + + return $this; + } + + /** + * Gets the path info. + * + * @return string The path info + */ + public function getPathInfo() + { + return $this->pathInfo; + } + + /** + * Sets the path info. + * + * @return $this + */ + public function setPathInfo(string $pathInfo) + { + $this->pathInfo = $pathInfo; + + return $this; + } + + /** + * Gets the HTTP method. + * + * The method is always an uppercased string. + * + * @return string The HTTP method + */ + public function getMethod() + { + return $this->method; + } + + /** + * Sets the HTTP method. + * + * @return $this + */ + public function setMethod(string $method) + { + $this->method = strtoupper($method); + + return $this; + } + + /** + * Gets the HTTP host. + * + * The host is always lowercased because it must be treated case-insensitive. + * + * @return string The HTTP host + */ + public function getHost() + { + return $this->host; + } + + /** + * Sets the HTTP host. + * + * @return $this + */ + public function setHost(string $host) + { + $this->host = strtolower($host); + + return $this; + } + + /** + * Gets the HTTP scheme. + * + * @return string The HTTP scheme + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * Sets the HTTP scheme. + * + * @return $this + */ + public function setScheme(string $scheme) + { + $this->scheme = strtolower($scheme); + + return $this; + } + + /** + * Gets the HTTP port. + * + * @return int The HTTP port + */ + public function getHttpPort() + { + return $this->httpPort; + } + + /** + * Sets the HTTP port. + * + * @return $this + */ + public function setHttpPort(int $httpPort) + { + $this->httpPort = $httpPort; + + return $this; + } + + /** + * Gets the HTTPS port. + * + * @return int The HTTPS port + */ + public function getHttpsPort() + { + return $this->httpsPort; + } + + /** + * Sets the HTTPS port. + * + * @return $this + */ + public function setHttpsPort(int $httpsPort) + { + $this->httpsPort = $httpsPort; + + return $this; + } + + /** + * Gets the query string. + * + * @return string The query string without the "?" + */ + public function getQueryString() + { + return $this->queryString; + } + + /** + * Sets the query string. + * + * @return $this + */ + public function setQueryString(?string $queryString) + { + // string cast to be fault-tolerant, accepting null + $this->queryString = (string) $queryString; + + return $this; + } + + /** + * Returns the parameters. + * + * @return array The parameters + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Sets the parameters. + * + * @param array $parameters The parameters + * + * @return $this + */ + public function setParameters(array $parameters) + { + $this->parameters = $parameters; + + return $this; + } + + /** + * Gets a parameter value. + * + * @return mixed The parameter value or null if nonexistent + */ + public function getParameter(string $name) + { + return isset($this->parameters[$name]) ? $this->parameters[$name] : null; + } + + /** + * Checks if a parameter value is set for the given parameter. + * + * @return bool True if the parameter value is set, false otherwise + */ + public function hasParameter(string $name) + { + return \array_key_exists($name, $this->parameters); + } + + /** + * Sets a parameter value. + * + * @param mixed $parameter The parameter value + * + * @return $this + */ + public function setParameter(string $name, $parameter) + { + $this->parameters[$name] = $parameter; + + return $this; + } + + public function isSecure(): bool + { + return 'https' === $this->scheme; + } +} diff --git a/vendor/symfony/routing/RequestContextAwareInterface.php b/vendor/symfony/routing/RequestContextAwareInterface.php new file mode 100644 index 0000000..df5b9fc --- /dev/null +++ b/vendor/symfony/routing/RequestContextAwareInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +interface RequestContextAwareInterface +{ + /** + * Sets the request context. + */ + public function setContext(RequestContext $context); + + /** + * Gets the request context. + * + * @return RequestContext The context + */ + public function getContext(); +} diff --git a/vendor/symfony/routing/Route.php b/vendor/symfony/routing/Route.php new file mode 100644 index 0000000..7ed8d2b --- /dev/null +++ b/vendor/symfony/routing/Route.php @@ -0,0 +1,568 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * A Route describes a route and its parameters. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class Route implements \Serializable +{ + private $path = '/'; + private $host = ''; + private $schemes = []; + private $methods = []; + private $defaults = []; + private $requirements = []; + private $options = []; + private $condition = ''; + + /** + * @var CompiledRoute|null + */ + private $compiled; + + /** + * Constructor. + * + * Available options: + * + * * compiler_class: A class name able to compile this route instance (RouteCompiler by default) + * * utf8: Whether UTF-8 matching is enforced ot not + * + * @param string $path The path pattern to match + * @param array $defaults An array of default parameter values + * @param array $requirements An array of requirements for parameters (regexes) + * @param array $options An array of options + * @param string|null $host The host pattern to match + * @param string|string[] $schemes A required URI scheme or an array of restricted schemes + * @param string|string[] $methods A required HTTP method or an array of restricted methods + * @param string|null $condition A condition that should evaluate to true for the route to match + */ + public function __construct(string $path, array $defaults = [], array $requirements = [], array $options = [], ?string $host = '', $schemes = [], $methods = [], ?string $condition = '') + { + $this->setPath($path); + $this->addDefaults($defaults); + $this->addRequirements($requirements); + $this->setOptions($options); + $this->setHost($host); + $this->setSchemes($schemes); + $this->setMethods($methods); + $this->setCondition($condition); + } + + public function __serialize(): array + { + return [ + 'path' => $this->path, + 'host' => $this->host, + 'defaults' => $this->defaults, + 'requirements' => $this->requirements, + 'options' => $this->options, + 'schemes' => $this->schemes, + 'methods' => $this->methods, + 'condition' => $this->condition, + 'compiled' => $this->compiled, + ]; + } + + /** + * @internal + */ + final public function serialize(): string + { + return serialize($this->__serialize()); + } + + public function __unserialize(array $data): void + { + $this->path = $data['path']; + $this->host = $data['host']; + $this->defaults = $data['defaults']; + $this->requirements = $data['requirements']; + $this->options = $data['options']; + $this->schemes = $data['schemes']; + $this->methods = $data['methods']; + + if (isset($data['condition'])) { + $this->condition = $data['condition']; + } + if (isset($data['compiled'])) { + $this->compiled = $data['compiled']; + } + } + + /** + * @internal + */ + final public function unserialize($serialized) + { + $this->__unserialize(unserialize($serialized)); + } + + /** + * Returns the pattern for the path. + * + * @return string The path pattern + */ + public function getPath() + { + return $this->path; + } + + /** + * Sets the pattern for the path. + * + * This method implements a fluent interface. + * + * @return $this + */ + public function setPath(string $pattern) + { + if (false !== strpbrk($pattern, '?<')) { + $pattern = preg_replace_callback('#\{(\w++)(<.*?>)?(\?[^\}]*+)?\}#', function ($m) { + if (isset($m[3][0])) { + $this->setDefault($m[1], '?' !== $m[3] ? substr($m[3], 1) : null); + } + if (isset($m[2][0])) { + $this->setRequirement($m[1], substr($m[2], 1, -1)); + } + + return '{'.$m[1].'}'; + }, $pattern); + } + + // A pattern must start with a slash and must not have multiple slashes at the beginning because the + // generated path for this route would be confused with a network path, e.g. '//domain.com/path'. + $this->path = '/'.ltrim(trim($pattern), '/'); + $this->compiled = null; + + return $this; + } + + /** + * Returns the pattern for the host. + * + * @return string The host pattern + */ + public function getHost() + { + return $this->host; + } + + /** + * Sets the pattern for the host. + * + * This method implements a fluent interface. + * + * @return $this + */ + public function setHost(?string $pattern) + { + $this->host = (string) $pattern; + $this->compiled = null; + + return $this; + } + + /** + * Returns the lowercased schemes this route is restricted to. + * So an empty array means that any scheme is allowed. + * + * @return string[] The schemes + */ + public function getSchemes() + { + return $this->schemes; + } + + /** + * Sets the schemes (e.g. 'https') this route is restricted to. + * So an empty array means that any scheme is allowed. + * + * This method implements a fluent interface. + * + * @param string|string[] $schemes The scheme or an array of schemes + * + * @return $this + */ + public function setSchemes($schemes) + { + $this->schemes = array_map('strtolower', (array) $schemes); + $this->compiled = null; + + return $this; + } + + /** + * Checks if a scheme requirement has been set. + * + * @return bool true if the scheme requirement exists, otherwise false + */ + public function hasScheme(string $scheme) + { + return \in_array(strtolower($scheme), $this->schemes, true); + } + + /** + * Returns the uppercased HTTP methods this route is restricted to. + * So an empty array means that any method is allowed. + * + * @return string[] The methods + */ + public function getMethods() + { + return $this->methods; + } + + /** + * Sets the HTTP methods (e.g. 'POST') this route is restricted to. + * So an empty array means that any method is allowed. + * + * This method implements a fluent interface. + * + * @param string|string[] $methods The method or an array of methods + * + * @return $this + */ + public function setMethods($methods) + { + $this->methods = array_map('strtoupper', (array) $methods); + $this->compiled = null; + + return $this; + } + + /** + * Returns the options. + * + * @return array The options + */ + public function getOptions() + { + return $this->options; + } + + /** + * Sets the options. + * + * This method implements a fluent interface. + * + * @return $this + */ + public function setOptions(array $options) + { + $this->options = [ + 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler', + ]; + + return $this->addOptions($options); + } + + /** + * Adds options. + * + * This method implements a fluent interface. + * + * @return $this + */ + public function addOptions(array $options) + { + foreach ($options as $name => $option) { + $this->options[$name] = $option; + } + $this->compiled = null; + + return $this; + } + + /** + * Sets an option value. + * + * This method implements a fluent interface. + * + * @param mixed $value The option value + * + * @return $this + */ + public function setOption(string $name, $value) + { + $this->options[$name] = $value; + $this->compiled = null; + + return $this; + } + + /** + * Get an option value. + * + * @return mixed The option value or null when not given + */ + public function getOption(string $name) + { + return isset($this->options[$name]) ? $this->options[$name] : null; + } + + /** + * Checks if an option has been set. + * + * @return bool true if the option is set, false otherwise + */ + public function hasOption(string $name) + { + return \array_key_exists($name, $this->options); + } + + /** + * Returns the defaults. + * + * @return array The defaults + */ + public function getDefaults() + { + return $this->defaults; + } + + /** + * Sets the defaults. + * + * This method implements a fluent interface. + * + * @param array $defaults The defaults + * + * @return $this + */ + public function setDefaults(array $defaults) + { + $this->defaults = []; + + return $this->addDefaults($defaults); + } + + /** + * Adds defaults. + * + * This method implements a fluent interface. + * + * @param array $defaults The defaults + * + * @return $this + */ + public function addDefaults(array $defaults) + { + if (isset($defaults['_locale']) && $this->isLocalized()) { + unset($defaults['_locale']); + } + + foreach ($defaults as $name => $default) { + $this->defaults[$name] = $default; + } + $this->compiled = null; + + return $this; + } + + /** + * Gets a default value. + * + * @return mixed The default value or null when not given + */ + public function getDefault(string $name) + { + return isset($this->defaults[$name]) ? $this->defaults[$name] : null; + } + + /** + * Checks if a default value is set for the given variable. + * + * @return bool true if the default value is set, false otherwise + */ + public function hasDefault(string $name) + { + return \array_key_exists($name, $this->defaults); + } + + /** + * Sets a default value. + * + * @param mixed $default The default value + * + * @return $this + */ + public function setDefault(string $name, $default) + { + if ('_locale' === $name && $this->isLocalized()) { + return $this; + } + + $this->defaults[$name] = $default; + $this->compiled = null; + + return $this; + } + + /** + * Returns the requirements. + * + * @return array The requirements + */ + public function getRequirements() + { + return $this->requirements; + } + + /** + * Sets the requirements. + * + * This method implements a fluent interface. + * + * @param array $requirements The requirements + * + * @return $this + */ + public function setRequirements(array $requirements) + { + $this->requirements = []; + + return $this->addRequirements($requirements); + } + + /** + * Adds requirements. + * + * This method implements a fluent interface. + * + * @param array $requirements The requirements + * + * @return $this + */ + public function addRequirements(array $requirements) + { + if (isset($requirements['_locale']) && $this->isLocalized()) { + unset($requirements['_locale']); + } + + foreach ($requirements as $key => $regex) { + $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); + } + $this->compiled = null; + + return $this; + } + + /** + * Returns the requirement for the given key. + * + * @return string|null The regex or null when not given + */ + public function getRequirement(string $key) + { + return isset($this->requirements[$key]) ? $this->requirements[$key] : null; + } + + /** + * Checks if a requirement is set for the given key. + * + * @return bool true if a requirement is specified, false otherwise + */ + public function hasRequirement(string $key) + { + return \array_key_exists($key, $this->requirements); + } + + /** + * Sets a requirement for the given key. + * + * @return $this + */ + public function setRequirement(string $key, string $regex) + { + if ('_locale' === $key && $this->isLocalized()) { + return $this; + } + + $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); + $this->compiled = null; + + return $this; + } + + /** + * Returns the condition. + * + * @return string The condition + */ + public function getCondition() + { + return $this->condition; + } + + /** + * Sets the condition. + * + * This method implements a fluent interface. + * + * @return $this + */ + public function setCondition(?string $condition) + { + $this->condition = (string) $condition; + $this->compiled = null; + + return $this; + } + + /** + * Compiles the route. + * + * @return CompiledRoute A CompiledRoute instance + * + * @throws \LogicException If the Route cannot be compiled because the + * path or host pattern is invalid + * + * @see RouteCompiler which is responsible for the compilation process + */ + public function compile() + { + if (null !== $this->compiled) { + return $this->compiled; + } + + $class = $this->getOption('compiler_class'); + + return $this->compiled = $class::compile($this); + } + + private function sanitizeRequirement(string $key, string $regex) + { + if ('' !== $regex && '^' === $regex[0]) { + $regex = (string) substr($regex, 1); // returns false for a single character + } + + if ('$' === substr($regex, -1)) { + $regex = substr($regex, 0, -1); + } + + if ('' === $regex) { + throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" cannot be empty.', $key)); + } + + return $regex; + } + + private function isLocalized(): bool + { + return isset($this->defaults['_locale']) && isset($this->defaults['_canonical_route']) && ($this->requirements['_locale'] ?? null) === preg_quote($this->defaults['_locale']); + } +} diff --git a/vendor/symfony/routing/RouteCollection.php b/vendor/symfony/routing/RouteCollection.php new file mode 100644 index 0000000..b661bb1 --- /dev/null +++ b/vendor/symfony/routing/RouteCollection.php @@ -0,0 +1,306 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\Config\Resource\ResourceInterface; + +/** + * A RouteCollection represents a set of Route instances. + * + * When adding a route at the end of the collection, an existing route + * with the same name is removed first. So there can only be one route + * with a given name. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class RouteCollection implements \IteratorAggregate, \Countable +{ + /** + * @var Route[] + */ + private $routes = []; + + /** + * @var array + */ + private $resources = []; + + /** + * @var int[] + */ + private $priorities = []; + + public function __clone() + { + foreach ($this->routes as $name => $route) { + $this->routes[$name] = clone $route; + } + } + + /** + * Gets the current RouteCollection as an Iterator that includes all routes. + * + * It implements \IteratorAggregate. + * + * @see all() + * + * @return \ArrayIterator|Route[] An \ArrayIterator object for iterating over routes + */ + public function getIterator() + { + return new \ArrayIterator($this->all()); + } + + /** + * Gets the number of Routes in this collection. + * + * @return int The number of routes + */ + public function count() + { + return \count($this->routes); + } + + /** + * @param int $priority + */ + public function add(string $name, Route $route/*, int $priority = 0*/) + { + if (\func_num_args() < 3 && __CLASS__ !== static::class && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface) { + trigger_deprecation('symfony/routing', '5.1', 'The "%s()" method will have a new "int $priority = 0" argument in version 6.0, not defining it is deprecated.', __METHOD__); + } + + unset($this->routes[$name], $this->priorities[$name]); + + $this->routes[$name] = $route; + + if ($priority = 3 <= \func_num_args() ? func_get_arg(2) : 0) { + $this->priorities[$name] = $priority; + } + } + + /** + * Returns all routes in this collection. + * + * @return Route[] An array of routes + */ + public function all() + { + if ($this->priorities) { + $priorities = $this->priorities; + $keysOrder = array_flip(array_keys($this->routes)); + uksort($this->routes, static function ($n1, $n2) use ($priorities, $keysOrder) { + return (($priorities[$n2] ?? 0) <=> ($priorities[$n1] ?? 0)) ?: ($keysOrder[$n1] <=> $keysOrder[$n2]); + }); + } + + return $this->routes; + } + + /** + * Gets a route by name. + * + * @return Route|null A Route instance or null when not found + */ + public function get(string $name) + { + return isset($this->routes[$name]) ? $this->routes[$name] : null; + } + + /** + * Removes a route or an array of routes by name from the collection. + * + * @param string|string[] $name The route name or an array of route names + */ + public function remove($name) + { + foreach ((array) $name as $n) { + unset($this->routes[$n], $this->priorities[$n]); + } + } + + /** + * Adds a route collection at the end of the current set by appending all + * routes of the added collection. + */ + public function addCollection(self $collection) + { + // we need to remove all routes with the same names first because just replacing them + // would not place the new route at the end of the merged array + foreach ($collection->all() as $name => $route) { + unset($this->routes[$name], $this->priorities[$name]); + $this->routes[$name] = $route; + + if (isset($collection->priorities[$name])) { + $this->priorities[$name] = $collection->priorities[$name]; + } + } + + foreach ($collection->getResources() as $resource) { + $this->addResource($resource); + } + } + + /** + * Adds a prefix to the path of all child routes. + */ + public function addPrefix(string $prefix, array $defaults = [], array $requirements = []) + { + $prefix = trim(trim($prefix), '/'); + + if ('' === $prefix) { + return; + } + + foreach ($this->routes as $route) { + $route->setPath('/'.$prefix.$route->getPath()); + $route->addDefaults($defaults); + $route->addRequirements($requirements); + } + } + + /** + * Adds a prefix to the name of all the routes within in the collection. + */ + public function addNamePrefix(string $prefix) + { + $prefixedRoutes = []; + $prefixedPriorities = []; + + foreach ($this->routes as $name => $route) { + $prefixedRoutes[$prefix.$name] = $route; + if (null !== $canonicalName = $route->getDefault('_canonical_route')) { + $route->setDefault('_canonical_route', $prefix.$canonicalName); + } + if (isset($this->priorities[$name])) { + $prefixedPriorities[$prefix.$name] = $this->priorities[$name]; + } + } + + $this->routes = $prefixedRoutes; + $this->priorities = $prefixedPriorities; + } + + /** + * Sets the host pattern on all routes. + */ + public function setHost(?string $pattern, array $defaults = [], array $requirements = []) + { + foreach ($this->routes as $route) { + $route->setHost($pattern); + $route->addDefaults($defaults); + $route->addRequirements($requirements); + } + } + + /** + * Sets a condition on all routes. + * + * Existing conditions will be overridden. + */ + public function setCondition(?string $condition) + { + foreach ($this->routes as $route) { + $route->setCondition($condition); + } + } + + /** + * Adds defaults to all routes. + * + * An existing default value under the same name in a route will be overridden. + */ + public function addDefaults(array $defaults) + { + if ($defaults) { + foreach ($this->routes as $route) { + $route->addDefaults($defaults); + } + } + } + + /** + * Adds requirements to all routes. + * + * An existing requirement under the same name in a route will be overridden. + */ + public function addRequirements(array $requirements) + { + if ($requirements) { + foreach ($this->routes as $route) { + $route->addRequirements($requirements); + } + } + } + + /** + * Adds options to all routes. + * + * An existing option value under the same name in a route will be overridden. + */ + public function addOptions(array $options) + { + if ($options) { + foreach ($this->routes as $route) { + $route->addOptions($options); + } + } + } + + /** + * Sets the schemes (e.g. 'https') all child routes are restricted to. + * + * @param string|string[] $schemes The scheme or an array of schemes + */ + public function setSchemes($schemes) + { + foreach ($this->routes as $route) { + $route->setSchemes($schemes); + } + } + + /** + * Sets the HTTP methods (e.g. 'POST') all child routes are restricted to. + * + * @param string|string[] $methods The method or an array of methods + */ + public function setMethods($methods) + { + foreach ($this->routes as $route) { + $route->setMethods($methods); + } + } + + /** + * Returns an array of resources loaded to build this collection. + * + * @return ResourceInterface[] An array of resources + */ + public function getResources() + { + return array_values($this->resources); + } + + /** + * Adds a resource for this collection. If the resource already exists + * it is not added. + */ + public function addResource(ResourceInterface $resource) + { + $key = (string) $resource; + + if (!isset($this->resources[$key])) { + $this->resources[$key] = $resource; + } + } +} diff --git a/vendor/symfony/routing/RouteCollectionBuilder.php b/vendor/symfony/routing/RouteCollectionBuilder.php new file mode 100644 index 0000000..8abb242 --- /dev/null +++ b/vendor/symfony/routing/RouteCollectionBuilder.php @@ -0,0 +1,364 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\Config\Exception\LoaderLoadException; +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\Config\Resource\ResourceInterface; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; + +trigger_deprecation('symfony/routing', '5.1', 'The "%s" class is deprecated, use "%s" instead.', RouteCollectionBuilder::class, RoutingConfigurator::class); + +/** + * Helps add and import routes into a RouteCollection. + * + * @author Ryan Weaver + * + * @deprecated since Symfony 5.1, use RoutingConfigurator instead + */ +class RouteCollectionBuilder +{ + /** + * @var Route[]|RouteCollectionBuilder[] + */ + private $routes = []; + + private $loader; + private $defaults = []; + private $prefix; + private $host; + private $condition; + private $requirements = []; + private $options = []; + private $schemes; + private $methods; + private $resources = []; + + public function __construct(LoaderInterface $loader = null) + { + $this->loader = $loader; + } + + /** + * Import an external routing resource and returns the RouteCollectionBuilder. + * + * $routes->import('blog.yml', '/blog'); + * + * @param mixed $resource + * + * @return self + * + * @throws LoaderLoadException + */ + public function import($resource, string $prefix = '/', string $type = null) + { + /** @var RouteCollection[] $collections */ + $collections = $this->load($resource, $type); + + // create a builder from the RouteCollection + $builder = $this->createBuilder(); + + foreach ($collections as $collection) { + if (null === $collection) { + continue; + } + + foreach ($collection->all() as $name => $route) { + $builder->addRoute($route, $name); + } + + foreach ($collection->getResources() as $resource) { + $builder->addResource($resource); + } + } + + // mount into this builder + $this->mount($prefix, $builder); + + return $builder; + } + + /** + * Adds a route and returns it for future modification. + * + * @return Route + */ + public function add(string $path, string $controller, string $name = null) + { + $route = new Route($path); + $route->setDefault('_controller', $controller); + $this->addRoute($route, $name); + + return $route; + } + + /** + * Returns a RouteCollectionBuilder that can be configured and then added with mount(). + * + * @return self + */ + public function createBuilder() + { + return new self($this->loader); + } + + /** + * Add a RouteCollectionBuilder. + */ + public function mount(string $prefix, self $builder) + { + $builder->prefix = trim(trim($prefix), '/'); + $this->routes[] = $builder; + } + + /** + * Adds a Route object to the builder. + * + * @return $this + */ + public function addRoute(Route $route, string $name = null) + { + if (null === $name) { + // used as a flag to know which routes will need a name later + $name = '_unnamed_route_'.spl_object_hash($route); + } + + $this->routes[$name] = $route; + + return $this; + } + + /** + * Sets the host on all embedded routes (unless already set). + * + * @return $this + */ + public function setHost(?string $pattern) + { + $this->host = $pattern; + + return $this; + } + + /** + * Sets a condition on all embedded routes (unless already set). + * + * @return $this + */ + public function setCondition(?string $condition) + { + $this->condition = $condition; + + return $this; + } + + /** + * Sets a default value that will be added to all embedded routes (unless that + * default value is already set). + * + * @param mixed $value + * + * @return $this + */ + public function setDefault(string $key, $value) + { + $this->defaults[$key] = $value; + + return $this; + } + + /** + * Sets a requirement that will be added to all embedded routes (unless that + * requirement is already set). + * + * @param mixed $regex + * + * @return $this + */ + public function setRequirement(string $key, $regex) + { + $this->requirements[$key] = $regex; + + return $this; + } + + /** + * Sets an option that will be added to all embedded routes (unless that + * option is already set). + * + * @param mixed $value + * + * @return $this + */ + public function setOption(string $key, $value) + { + $this->options[$key] = $value; + + return $this; + } + + /** + * Sets the schemes on all embedded routes (unless already set). + * + * @param array|string $schemes + * + * @return $this + */ + public function setSchemes($schemes) + { + $this->schemes = $schemes; + + return $this; + } + + /** + * Sets the methods on all embedded routes (unless already set). + * + * @param array|string $methods + * + * @return $this + */ + public function setMethods($methods) + { + $this->methods = $methods; + + return $this; + } + + /** + * Adds a resource for this collection. + * + * @return $this + */ + private function addResource(ResourceInterface $resource): self + { + $this->resources[] = $resource; + + return $this; + } + + /** + * Creates the final RouteCollection and returns it. + * + * @return RouteCollection + */ + public function build() + { + $routeCollection = new RouteCollection(); + + foreach ($this->routes as $name => $route) { + if ($route instanceof Route) { + $route->setDefaults(array_merge($this->defaults, $route->getDefaults())); + $route->setOptions(array_merge($this->options, $route->getOptions())); + + foreach ($this->requirements as $key => $val) { + if (!$route->hasRequirement($key)) { + $route->setRequirement($key, $val); + } + } + + if (null !== $this->prefix) { + $route->setPath('/'.$this->prefix.$route->getPath()); + } + + if (!$route->getHost()) { + $route->setHost($this->host); + } + + if (!$route->getCondition()) { + $route->setCondition($this->condition); + } + + if (!$route->getSchemes()) { + $route->setSchemes($this->schemes); + } + + if (!$route->getMethods()) { + $route->setMethods($this->methods); + } + + // auto-generate the route name if it's been marked + if ('_unnamed_route_' === substr($name, 0, 15)) { + $name = $this->generateRouteName($route); + } + + $routeCollection->add($name, $route); + } else { + /* @var self $route */ + $subCollection = $route->build(); + if (null !== $this->prefix) { + $subCollection->addPrefix($this->prefix); + } + + $routeCollection->addCollection($subCollection); + } + } + + foreach ($this->resources as $resource) { + $routeCollection->addResource($resource); + } + + return $routeCollection; + } + + /** + * Generates a route name based on details of this route. + */ + private function generateRouteName(Route $route): string + { + $methods = implode('_', $route->getMethods()).'_'; + + $routeName = $methods.$route->getPath(); + $routeName = str_replace(['/', ':', '|', '-'], '_', $routeName); + $routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName); + + // Collapse consecutive underscores down into a single underscore. + $routeName = preg_replace('/_+/', '_', $routeName); + + return $routeName; + } + + /** + * Finds a loader able to load an imported resource and loads it. + * + * @param mixed $resource A resource + * @param string|null $type The resource type or null if unknown + * + * @return RouteCollection[] + * + * @throws LoaderLoadException If no loader is found + */ + private function load($resource, string $type = null): array + { + if (null === $this->loader) { + throw new \BadMethodCallException('Cannot import other routing resources: you must pass a LoaderInterface when constructing RouteCollectionBuilder.'); + } + + if ($this->loader->supports($resource, $type)) { + $collections = $this->loader->load($resource, $type); + + return \is_array($collections) ? $collections : [$collections]; + } + + if (null === $resolver = $this->loader->getResolver()) { + throw new LoaderLoadException($resource, null, null, null, $type); + } + + if (false === $loader = $resolver->resolve($resource, $type)) { + throw new LoaderLoadException($resource, null, null, null, $type); + } + + $collections = $loader->load($resource, $type); + + return \is_array($collections) ? $collections : [$collections]; + } +} diff --git a/vendor/symfony/routing/RouteCompiler.php b/vendor/symfony/routing/RouteCompiler.php new file mode 100644 index 0000000..fd09f6a --- /dev/null +++ b/vendor/symfony/routing/RouteCompiler.php @@ -0,0 +1,348 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * RouteCompiler compiles Route instances to CompiledRoute instances. + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class RouteCompiler implements RouteCompilerInterface +{ + /** + * @deprecated since Symfony 5.1, to be removed in 6.0 + */ + const REGEX_DELIMITER = '#'; + + /** + * This string defines the characters that are automatically considered separators in front of + * optional placeholders (with default and no static text following). Such a single separator + * can be left out together with the optional placeholder from matching and generating URLs. + */ + const SEPARATORS = '/,;.:-_~+*=@|'; + + /** + * The maximum supported length of a PCRE subpattern name + * http://pcre.org/current/doc/html/pcre2pattern.html#SEC16. + * + * @internal + */ + const VARIABLE_MAXIMUM_LENGTH = 32; + + /** + * {@inheritdoc} + * + * @throws \InvalidArgumentException if a path variable is named _fragment + * @throws \LogicException if a variable is referenced more than once + * @throws \DomainException if a variable name starts with a digit or if it is too long to be successfully used as + * a PCRE subpattern + */ + public static function compile(Route $route) + { + $hostVariables = []; + $variables = []; + $hostRegex = null; + $hostTokens = []; + + if ('' !== $host = $route->getHost()) { + $result = self::compilePattern($route, $host, true); + + $hostVariables = $result['variables']; + $variables = $hostVariables; + + $hostTokens = $result['tokens']; + $hostRegex = $result['regex']; + } + + $locale = $route->getDefault('_locale'); + if (null !== $locale && null !== $route->getDefault('_canonical_route') && preg_quote($locale) === $route->getRequirement('_locale')) { + $requirements = $route->getRequirements(); + unset($requirements['_locale']); + $route->setRequirements($requirements); + $route->setPath(str_replace('{_locale}', $locale, $route->getPath())); + } + + $path = $route->getPath(); + + $result = self::compilePattern($route, $path, false); + + $staticPrefix = $result['staticPrefix']; + + $pathVariables = $result['variables']; + + foreach ($pathVariables as $pathParam) { + if ('_fragment' === $pathParam) { + throw new \InvalidArgumentException(sprintf('Route pattern "%s" cannot contain "_fragment" as a path parameter.', $route->getPath())); + } + } + + $variables = array_merge($variables, $pathVariables); + + $tokens = $result['tokens']; + $regex = $result['regex']; + + return new CompiledRoute( + $staticPrefix, + $regex, + $tokens, + $pathVariables, + $hostRegex, + $hostTokens, + $hostVariables, + array_unique($variables) + ); + } + + private static function compilePattern(Route $route, string $pattern, bool $isHost): array + { + $tokens = []; + $variables = []; + $matches = []; + $pos = 0; + $defaultSeparator = $isHost ? '.' : '/'; + $useUtf8 = preg_match('//u', $pattern); + $needsUtf8 = $route->getOption('utf8'); + + if (!$needsUtf8 && $useUtf8 && preg_match('/[\x80-\xFF]/', $pattern)) { + throw new \LogicException(sprintf('Cannot use UTF-8 route patterns without setting the "utf8" option for route "%s".', $route->getPath())); + } + if (!$useUtf8 && $needsUtf8) { + throw new \LogicException(sprintf('Cannot mix UTF-8 requirements with non-UTF-8 pattern "%s".', $pattern)); + } + + // Match all variables enclosed in "{}" and iterate over them. But we only want to match the innermost variable + // in case of nested "{}", e.g. {foo{bar}}. This in ensured because \w does not match "{" or "}" itself. + preg_match_all('#\{(!)?(\w+)\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); + foreach ($matches as $match) { + $important = $match[1][1] >= 0; + $varName = $match[2][0]; + // get all static text preceding the current variable + $precedingText = substr($pattern, $pos, $match[0][1] - $pos); + $pos = $match[0][1] + \strlen($match[0][0]); + + if (!\strlen($precedingText)) { + $precedingChar = ''; + } elseif ($useUtf8) { + preg_match('/.$/u', $precedingText, $precedingChar); + $precedingChar = $precedingChar[0]; + } else { + $precedingChar = substr($precedingText, -1); + } + $isSeparator = '' !== $precedingChar && false !== strpos(static::SEPARATORS, $precedingChar); + + // A PCRE subpattern name must start with a non-digit. Also a PHP variable cannot start with a digit so the + // variable would not be usable as a Controller action argument. + if (preg_match('/^\d/', $varName)) { + throw new \DomainException(sprintf('Variable name "%s" cannot start with a digit in route pattern "%s". Please use a different name.', $varName, $pattern)); + } + if (\in_array($varName, $variables)) { + throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $pattern, $varName)); + } + + if (\strlen($varName) > self::VARIABLE_MAXIMUM_LENGTH) { + throw new \DomainException(sprintf('Variable name "%s" cannot be longer than %d characters in route pattern "%s". Please use a shorter name.', $varName, self::VARIABLE_MAXIMUM_LENGTH, $pattern)); + } + + if ($isSeparator && $precedingText !== $precedingChar) { + $tokens[] = ['text', substr($precedingText, 0, -\strlen($precedingChar))]; + } elseif (!$isSeparator && \strlen($precedingText) > 0) { + $tokens[] = ['text', $precedingText]; + } + + $regexp = $route->getRequirement($varName); + if (null === $regexp) { + $followingPattern = (string) substr($pattern, $pos); + // Find the next static character after the variable that functions as a separator. By default, this separator and '/' + // are disallowed for the variable. This default requirement makes sure that optional variables can be matched at all + // and that the generating-matching-combination of URLs unambiguous, i.e. the params used for generating the URL are + // the same that will be matched. Example: new Route('/{page}.{_format}', ['_format' => 'html']) + // If {page} would also match the separating dot, {_format} would never match as {page} will eagerly consume everything. + // Also even if {_format} was not optional the requirement prevents that {page} matches something that was originally + // part of {_format} when generating the URL, e.g. _format = 'mobile.html'. + $nextSeparator = self::findNextSeparator($followingPattern, $useUtf8); + $regexp = sprintf( + '[^%s%s]+', + preg_quote($defaultSeparator), + $defaultSeparator !== $nextSeparator && '' !== $nextSeparator ? preg_quote($nextSeparator) : '' + ); + if (('' !== $nextSeparator && !preg_match('#^\{\w+\}#', $followingPattern)) || '' === $followingPattern) { + // When we have a separator, which is disallowed for the variable, we can optimize the regex with a possessive + // quantifier. This prevents useless backtracking of PCRE and improves performance by 20% for matching those patterns. + // Given the above example, there is no point in backtracking into {page} (that forbids the dot) when a dot must follow + // after it. This optimization cannot be applied when the next char is no real separator or when the next variable is + // directly adjacent, e.g. '/{x}{y}'. + $regexp .= '+'; + } + } else { + if (!preg_match('//u', $regexp)) { + $useUtf8 = false; + } elseif (!$needsUtf8 && preg_match('/[\x80-\xFF]|(?= 0; --$i) { + $token = $tokens[$i]; + // variable is optional when it is not important and has a default value + if ('variable' === $token[0] && !($token[5] ?? false) && $route->hasDefault($token[3])) { + $firstOptional = $i; + } else { + break; + } + } + } + + // compute the matching regexp + $regexp = ''; + for ($i = 0, $nbToken = \count($tokens); $i < $nbToken; ++$i) { + $regexp .= self::computeRegexp($tokens, $i, $firstOptional); + } + $regexp = '{^'.$regexp.'$}sD'.($isHost ? 'i' : ''); + + // enable Utf8 matching if really required + if ($needsUtf8) { + $regexp .= 'u'; + for ($i = 0, $nbToken = \count($tokens); $i < $nbToken; ++$i) { + if ('variable' === $tokens[$i][0]) { + $tokens[$i][4] = true; + } + } + } + + return [ + 'staticPrefix' => self::determineStaticPrefix($route, $tokens), + 'regex' => $regexp, + 'tokens' => array_reverse($tokens), + 'variables' => $variables, + ]; + } + + /** + * Determines the longest static prefix possible for a route. + */ + private static function determineStaticPrefix(Route $route, array $tokens): string + { + if ('text' !== $tokens[0][0]) { + return ($route->hasDefault($tokens[0][3]) || '/' === $tokens[0][1]) ? '' : $tokens[0][1]; + } + + $prefix = $tokens[0][1]; + + if (isset($tokens[1][1]) && '/' !== $tokens[1][1] && false === $route->hasDefault($tokens[1][3])) { + $prefix .= $tokens[1][1]; + } + + return $prefix; + } + + /** + * Returns the next static character in the Route pattern that will serve as a separator (or the empty string when none available). + */ + private static function findNextSeparator(string $pattern, bool $useUtf8): string + { + if ('' == $pattern) { + // return empty string if pattern is empty or false (false which can be returned by substr) + return ''; + } + // first remove all placeholders from the pattern so we can find the next real static character + if ('' === $pattern = preg_replace('#\{\w+\}#', '', $pattern)) { + return ''; + } + if ($useUtf8) { + preg_match('/^./u', $pattern, $pattern); + } + + return false !== strpos(static::SEPARATORS, $pattern[0]) ? $pattern[0] : ''; + } + + /** + * Computes the regexp used to match a specific token. It can be static text or a subpattern. + * + * @param array $tokens The route tokens + * @param int $index The index of the current token + * @param int $firstOptional The index of the first optional token + * + * @return string The regexp pattern for a single token + */ + private static function computeRegexp(array $tokens, int $index, int $firstOptional): string + { + $token = $tokens[$index]; + if ('text' === $token[0]) { + // Text tokens + return preg_quote($token[1]); + } else { + // Variable tokens + if (0 === $index && 0 === $firstOptional) { + // When the only token is an optional variable token, the separator is required + return sprintf('%s(?P<%s>%s)?', preg_quote($token[1]), $token[3], $token[2]); + } else { + $regexp = sprintf('%s(?P<%s>%s)', preg_quote($token[1]), $token[3], $token[2]); + if ($index >= $firstOptional) { + // Enclose each optional token in a subpattern to make it optional. + // "?:" means it is non-capturing, i.e. the portion of the subject string that + // matched the optional subpattern is not passed back. + $regexp = "(?:$regexp"; + $nbTokens = \count($tokens); + if ($nbTokens - 1 == $index) { + // Close the optional subpatterns + $regexp .= str_repeat(')?', $nbTokens - $firstOptional - (0 === $firstOptional ? 1 : 0)); + } + } + + return $regexp; + } + } + } + + private static function transformCapturingGroupsToNonCapturings(string $regexp): string + { + for ($i = 0; $i < \strlen($regexp); ++$i) { + if ('\\' === $regexp[$i]) { + ++$i; + continue; + } + if ('(' !== $regexp[$i] || !isset($regexp[$i + 2])) { + continue; + } + if ('*' === $regexp[++$i] || '?' === $regexp[$i]) { + ++$i; + continue; + } + $regexp = substr_replace($regexp, '?:', $i, 0); + ++$i; + } + + return $regexp; + } +} diff --git a/vendor/symfony/routing/RouteCompilerInterface.php b/vendor/symfony/routing/RouteCompilerInterface.php new file mode 100644 index 0000000..ddfa7ca --- /dev/null +++ b/vendor/symfony/routing/RouteCompilerInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +/** + * RouteCompilerInterface is the interface that all RouteCompiler classes must implement. + * + * @author Fabien Potencier + */ +interface RouteCompilerInterface +{ + /** + * Compiles the current route instance. + * + * @return CompiledRoute A CompiledRoute instance + * + * @throws \LogicException If the Route cannot be compiled because the + * path or host pattern is invalid + */ + public static function compile(Route $route); +} diff --git a/vendor/symfony/routing/Router.php b/vendor/symfony/routing/Router.php new file mode 100644 index 0000000..031749b --- /dev/null +++ b/vendor/symfony/routing/Router.php @@ -0,0 +1,390 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Config\ConfigCacheFactory; +use Symfony\Component\Config\ConfigCacheFactoryInterface; +use Symfony\Component\Config\ConfigCacheInterface; +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Generator\CompiledUrlGenerator; +use Symfony\Component\Routing\Generator\ConfigurableRequirementsInterface; +use Symfony\Component\Routing\Generator\Dumper\CompiledUrlGeneratorDumper; +use Symfony\Component\Routing\Generator\Dumper\GeneratorDumperInterface; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Routing\Matcher\CompiledUrlMatcher; +use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper; +use Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface; +use Symfony\Component\Routing\Matcher\RequestMatcherInterface; +use Symfony\Component\Routing\Matcher\UrlMatcherInterface; + +/** + * The Router class is an example of the integration of all pieces of the + * routing system for easier use. + * + * @author Fabien Potencier + */ +class Router implements RouterInterface, RequestMatcherInterface +{ + /** + * @var UrlMatcherInterface|null + */ + protected $matcher; + + /** + * @var UrlGeneratorInterface|null + */ + protected $generator; + + /** + * @var RequestContext + */ + protected $context; + + /** + * @var LoaderInterface + */ + protected $loader; + + /** + * @var RouteCollection|null + */ + protected $collection; + + /** + * @var mixed + */ + protected $resource; + + /** + * @var array + */ + protected $options = []; + + /** + * @var LoggerInterface|null + */ + protected $logger; + + /** + * @var string|null + */ + protected $defaultLocale; + + /** + * @var ConfigCacheFactoryInterface|null + */ + private $configCacheFactory; + + /** + * @var ExpressionFunctionProviderInterface[] + */ + private $expressionLanguageProviders = []; + + private static $cache = []; + + /** + * @param mixed $resource The main resource to load + */ + public function __construct(LoaderInterface $loader, $resource, array $options = [], RequestContext $context = null, LoggerInterface $logger = null, string $defaultLocale = null) + { + $this->loader = $loader; + $this->resource = $resource; + $this->logger = $logger; + $this->context = $context ?: new RequestContext(); + $this->setOptions($options); + $this->defaultLocale = $defaultLocale; + } + + /** + * Sets options. + * + * Available options: + * + * * cache_dir: The cache directory (or null to disable caching) + * * debug: Whether to enable debugging or not (false by default) + * * generator_class: The name of a UrlGeneratorInterface implementation + * * generator_dumper_class: The name of a GeneratorDumperInterface implementation + * * matcher_class: The name of a UrlMatcherInterface implementation + * * matcher_dumper_class: The name of a MatcherDumperInterface implementation + * * resource_type: Type hint for the main resource (optional) + * * strict_requirements: Configure strict requirement checking for generators + * implementing ConfigurableRequirementsInterface (default is true) + * + * @throws \InvalidArgumentException When unsupported option is provided + */ + public function setOptions(array $options) + { + $this->options = [ + 'cache_dir' => null, + 'debug' => false, + 'generator_class' => CompiledUrlGenerator::class, + 'generator_dumper_class' => CompiledUrlGeneratorDumper::class, + 'matcher_class' => CompiledUrlMatcher::class, + 'matcher_dumper_class' => CompiledUrlMatcherDumper::class, + 'resource_type' => null, + 'strict_requirements' => true, + ]; + + // check option names and live merge, if errors are encountered Exception will be thrown + $invalid = []; + foreach ($options as $key => $value) { + if (\array_key_exists($key, $this->options)) { + $this->options[$key] = $value; + } else { + $invalid[] = $key; + } + } + + if ($invalid) { + throw new \InvalidArgumentException(sprintf('The Router does not support the following options: "%s".', implode('", "', $invalid))); + } + } + + /** + * Sets an option. + * + * @param mixed $value The value + * + * @throws \InvalidArgumentException + */ + public function setOption(string $key, $value) + { + if (!\array_key_exists($key, $this->options)) { + throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key)); + } + + $this->options[$key] = $value; + } + + /** + * Gets an option value. + * + * @return mixed The value + * + * @throws \InvalidArgumentException + */ + public function getOption(string $key) + { + if (!\array_key_exists($key, $this->options)) { + throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key)); + } + + return $this->options[$key]; + } + + /** + * {@inheritdoc} + */ + public function getRouteCollection() + { + if (null === $this->collection) { + $this->collection = $this->loader->load($this->resource, $this->options['resource_type']); + } + + return $this->collection; + } + + /** + * {@inheritdoc} + */ + public function setContext(RequestContext $context) + { + $this->context = $context; + + if (null !== $this->matcher) { + $this->getMatcher()->setContext($context); + } + if (null !== $this->generator) { + $this->getGenerator()->setContext($context); + } + } + + /** + * {@inheritdoc} + */ + public function getContext() + { + return $this->context; + } + + /** + * Sets the ConfigCache factory to use. + */ + public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) + { + $this->configCacheFactory = $configCacheFactory; + } + + /** + * {@inheritdoc} + */ + public function generate(string $name, array $parameters = [], int $referenceType = self::ABSOLUTE_PATH) + { + return $this->getGenerator()->generate($name, $parameters, $referenceType); + } + + /** + * {@inheritdoc} + */ + public function match(string $pathinfo) + { + return $this->getMatcher()->match($pathinfo); + } + + /** + * {@inheritdoc} + */ + public function matchRequest(Request $request) + { + $matcher = $this->getMatcher(); + if (!$matcher instanceof RequestMatcherInterface) { + // fallback to the default UrlMatcherInterface + return $matcher->match($request->getPathInfo()); + } + + return $matcher->matchRequest($request); + } + + /** + * Gets the UrlMatcher or RequestMatcher instance associated with this Router. + * + * @return UrlMatcherInterface|RequestMatcherInterface + */ + public function getMatcher() + { + if (null !== $this->matcher) { + return $this->matcher; + } + + if (null === $this->options['cache_dir']) { + $routes = $this->getRouteCollection(); + $compiled = is_a($this->options['matcher_class'], CompiledUrlMatcher::class, true); + if ($compiled) { + $routes = (new CompiledUrlMatcherDumper($routes))->getCompiledRoutes(); + } + $this->matcher = new $this->options['matcher_class']($routes, $this->context); + if (method_exists($this->matcher, 'addExpressionLanguageProvider')) { + foreach ($this->expressionLanguageProviders as $provider) { + $this->matcher->addExpressionLanguageProvider($provider); + } + } + + return $this->matcher; + } + + $cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/url_matching_routes.php', + function (ConfigCacheInterface $cache) { + $dumper = $this->getMatcherDumperInstance(); + if (method_exists($dumper, 'addExpressionLanguageProvider')) { + foreach ($this->expressionLanguageProviders as $provider) { + $dumper->addExpressionLanguageProvider($provider); + } + } + + $cache->write($dumper->dump(), $this->getRouteCollection()->getResources()); + } + ); + + return $this->matcher = new $this->options['matcher_class'](self::getCompiledRoutes($cache->getPath()), $this->context); + } + + /** + * Gets the UrlGenerator instance associated with this Router. + * + * @return UrlGeneratorInterface A UrlGeneratorInterface instance + */ + public function getGenerator() + { + if (null !== $this->generator) { + return $this->generator; + } + + if (null === $this->options['cache_dir']) { + $routes = $this->getRouteCollection(); + $compiled = is_a($this->options['generator_class'], CompiledUrlGenerator::class, true); + if ($compiled) { + $routes = (new CompiledUrlGeneratorDumper($routes))->getCompiledRoutes(); + } + $this->generator = new $this->options['generator_class']($routes, $this->context, $this->logger, $this->defaultLocale); + } else { + $cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/url_generating_routes.php', + function (ConfigCacheInterface $cache) { + $dumper = $this->getGeneratorDumperInstance(); + + $cache->write($dumper->dump(), $this->getRouteCollection()->getResources()); + } + ); + + $this->generator = new $this->options['generator_class'](self::getCompiledRoutes($cache->getPath()), $this->context, $this->logger, $this->defaultLocale); + } + + if ($this->generator instanceof ConfigurableRequirementsInterface) { + $this->generator->setStrictRequirements($this->options['strict_requirements']); + } + + return $this->generator; + } + + public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) + { + $this->expressionLanguageProviders[] = $provider; + } + + /** + * @return GeneratorDumperInterface + */ + protected function getGeneratorDumperInstance() + { + return new $this->options['generator_dumper_class']($this->getRouteCollection()); + } + + /** + * @return MatcherDumperInterface + */ + protected function getMatcherDumperInstance() + { + return new $this->options['matcher_dumper_class']($this->getRouteCollection()); + } + + /** + * Provides the ConfigCache factory implementation, falling back to a + * default implementation if necessary. + */ + private function getConfigCacheFactory(): ConfigCacheFactoryInterface + { + if (null === $this->configCacheFactory) { + $this->configCacheFactory = new ConfigCacheFactory($this->options['debug']); + } + + return $this->configCacheFactory; + } + + private static function getCompiledRoutes(string $path): array + { + if ([] === self::$cache && \function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(ini_get('opcache.enable_cli'), FILTER_VALIDATE_BOOLEAN))) { + self::$cache = null; + } + + if (null === self::$cache) { + return require $path; + } + + if (isset(self::$cache[$path])) { + return self::$cache[$path]; + } + + return self::$cache[$path] = require $path; + } +} diff --git a/vendor/symfony/routing/RouterInterface.php b/vendor/symfony/routing/RouterInterface.php new file mode 100644 index 0000000..8a3e33d --- /dev/null +++ b/vendor/symfony/routing/RouterInterface.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing; + +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Routing\Matcher\UrlMatcherInterface; + +/** + * RouterInterface is the interface that all Router classes must implement. + * + * This interface is the concatenation of UrlMatcherInterface and UrlGeneratorInterface. + * + * @author Fabien Potencier + */ +interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface +{ + /** + * Gets the RouteCollection instance associated with this Router. + * + * WARNING: This method should never be used at runtime as it is SLOW. + * You might use it in a cache warmer though. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRouteCollection(); +} diff --git a/vendor/symfony/routing/composer.json b/vendor/symfony/routing/composer.json new file mode 100644 index 0000000..e78688f --- /dev/null +++ b/vendor/symfony/routing/composer.json @@ -0,0 +1,56 @@ +{ + "name": "symfony/routing", + "type": "library", + "description": "Symfony Routing Component", + "keywords": ["routing", "router", "URL", "URI"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/config": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "doctrine/annotations": "~1.2", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "suggest": { + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/yaml": "For using the YAML loader", + "symfony/expression-language": "For using expression matching", + "doctrine/annotations": "For using the annotation loader" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Routing\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/service-contracts/.gitignore b/vendor/symfony/service-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/service-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/service-contracts/CHANGELOG.md b/vendor/symfony/service-contracts/CHANGELOG.md new file mode 100644 index 0000000..e984777 --- /dev/null +++ b/vendor/symfony/service-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/master/CHANGELOG.md diff --git a/vendor/symfony/service-contracts/LICENSE b/vendor/symfony/service-contracts/LICENSE new file mode 100644 index 0000000..69d925b --- /dev/null +++ b/vendor/symfony/service-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/service-contracts/README.md b/vendor/symfony/service-contracts/README.md new file mode 100644 index 0000000..d033a43 --- /dev/null +++ b/vendor/symfony/service-contracts/README.md @@ -0,0 +1,9 @@ +Symfony Service Contracts +========================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/master/README.md for more information. diff --git a/vendor/symfony/service-contracts/ResetInterface.php b/vendor/symfony/service-contracts/ResetInterface.php new file mode 100644 index 0000000..1af1075 --- /dev/null +++ b/vendor/symfony/service-contracts/ResetInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * Provides a way to reset an object to its initial state. + * + * When calling the "reset()" method on an object, it should be put back to its + * initial state. This usually means clearing any internal buffers and forwarding + * the call to internal dependencies. All properties of the object should be put + * back to the same state it had when it was first ready to use. + * + * This method could be called, for example, to recycle objects that are used as + * services, so that they can be used to handle several requests in the same + * process loop (note that we advise making your services stateless instead of + * implementing this interface when possible.) + */ +interface ResetInterface +{ + public function reset(); +} diff --git a/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/symfony/service-contracts/ServiceLocatorTrait.php new file mode 100644 index 0000000..0b4d60a --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceLocatorTrait.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(ContainerExceptionInterface::class); +class_exists(NotFoundExceptionInterface::class); + +/** + * A trait to help implement ServiceProviderInterface. + * + * @author Robin Chalas + * @author Nicolas Grekas + */ +trait ServiceLocatorTrait +{ + private $factories; + private $loading = []; + private $providedTypes; + + /** + * @param callable[] $factories + */ + public function __construct(array $factories) + { + $this->factories = $factories; + } + + /** + * {@inheritdoc} + * + * @return bool + */ + public function has($id) + { + return isset($this->factories[$id]); + } + + /** + * {@inheritdoc} + */ + public function get($id) + { + if (!isset($this->factories[$id])) { + throw $this->createNotFoundException($id); + } + + if (isset($this->loading[$id])) { + $ids = array_values($this->loading); + $ids = \array_slice($this->loading, array_search($id, $ids)); + $ids[] = $id; + + throw $this->createCircularReferenceException($id, $ids); + } + + $this->loading[$id] = $id; + try { + return $this->factories[$id]($this); + } finally { + unset($this->loading[$id]); + } + } + + /** + * {@inheritdoc} + */ + public function getProvidedServices(): array + { + if (null === $this->providedTypes) { + $this->providedTypes = []; + + foreach ($this->factories as $name => $factory) { + if (!\is_callable($factory)) { + $this->providedTypes[$name] = '?'; + } else { + $type = (new \ReflectionFunction($factory))->getReturnType(); + + $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').$type->getName() : '?'; + } + } + } + + return $this->providedTypes; + } + + private function createNotFoundException(string $id): NotFoundExceptionInterface + { + if (!$alternatives = array_keys($this->factories)) { + $message = 'is empty...'; + } else { + $last = array_pop($alternatives); + if ($alternatives) { + $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); + } else { + $message = sprintf('only knows about the "%s" service.', $last); + } + } + + if ($this->loading) { + $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); + } else { + $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); + } + + return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { + }; + } + + private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface + { + return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { + }; + } +} diff --git a/vendor/symfony/service-contracts/ServiceProviderInterface.php b/vendor/symfony/service-contracts/ServiceProviderInterface.php new file mode 100644 index 0000000..c60ad0b --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceProviderInterface.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerInterface; + +/** + * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. + * + * @author Nicolas Grekas + * @author Mateusz Sip + */ +interface ServiceProviderInterface extends ContainerInterface +{ + /** + * Returns an associative array of service types keyed by the identifiers provided by the current container. + * + * Examples: + * + * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface + * * ['foo' => '?'] means the container provides service name "foo" of unspecified type + * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null + * + * @return string[] The provided service types, keyed by service names + */ + public function getProvidedServices(): array; +} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php new file mode 100644 index 0000000..8bb320f --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. + * + * The getSubscribedServices method returns an array of service types required by such instances, + * optionally keyed by the service names used internally. Service types that start with an interrogation + * mark "?" are optional, while the other ones are mandatory service dependencies. + * + * The injected service locators SHOULD NOT allow access to any other services not specified by the method. + * + * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. + * This interface does not dictate any injection method for these service locators, although constructor + * injection is recommended. + * + * @author Nicolas Grekas + */ +interface ServiceSubscriberInterface +{ + /** + * Returns an array of service types required by such instances, optionally keyed by the service names used internally. + * + * For mandatory dependencies: + * + * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name + * internally to fetch a service which must implement Psr\Log\LoggerInterface. + * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name + * internally to fetch an iterable of Psr\Log\LoggerInterface instances. + * * ['Psr\Log\LoggerInterface'] is a shortcut for + * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] + * + * otherwise: + * + * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency + * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency + * * ['?Psr\Log\LoggerInterface'] is a shortcut for + * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] + * + * @return array The required service types, optionally keyed by service names + */ + public static function getSubscribedServices(); +} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php new file mode 100644 index 0000000..5d9d456 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerInterface; + +/** + * Implementation of ServiceSubscriberInterface that determines subscribed services from + * private method return types. Service ids are available as "ClassName::methodName". + * + * @author Kevin Bond + */ +trait ServiceSubscriberTrait +{ + /** @var ContainerInterface */ + protected $container; + + public static function getSubscribedServices(): array + { + static $services; + + if (null !== $services) { + return $services; + } + + $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; + + foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + continue; + } + + if (self::class === $method->getDeclaringClass()->name && ($returnType = $method->getReturnType()) && !$returnType->isBuiltin()) { + $services[self::class.'::'.$method->name] = '?'.$returnType->getName(); + } + } + + return $services; + } + + /** + * @required + */ + public function setContainer(ContainerInterface $container) + { + $this->container = $container; + + if (\is_callable(['parent', __FUNCTION__])) { + return parent::setContainer($container); + } + + return null; + } +} diff --git a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php new file mode 100644 index 0000000..5ed9149 --- /dev/null +++ b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; + +abstract class ServiceLocatorTest extends TestCase +{ + protected function getServiceLocator(array $factories) + { + return new class($factories) implements ContainerInterface { + use ServiceLocatorTrait; + }; + } + + public function testHas() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + function () { return 'dummy'; }, + ]); + + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + + public function testGet() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$i) { + ++$i; + + return 'bar'; + }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + + public function testThrowsOnUndefinedInternalService() + { + if (!$this->getExpectedException()) { + $this->expectException('Psr\Container\NotFoundExceptionInterface'); + $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); + } + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } + + public function testThrowsOnCircularReference() + { + $this->expectException('Psr\Container\ContainerExceptionInterface'); + $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + 'bar' => function () use (&$locator) { return $locator->get('baz'); }, + 'baz' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } +} diff --git a/vendor/symfony/service-contracts/composer.json b/vendor/symfony/service-contracts/composer.json new file mode 100644 index 0000000..ae7ed66 --- /dev/null +++ b/vendor/symfony/service-contracts/composer.json @@ -0,0 +1,34 @@ +{ + "name": "symfony/service-contracts", + "type": "library", + "description": "Generic abstractions related to writing services", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\Service\\": "" } + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + } +} diff --git a/vendor/symfony/string/.gitattributes b/vendor/symfony/string/.gitattributes new file mode 100644 index 0000000..4a7ef98 --- /dev/null +++ b/vendor/symfony/string/.gitattributes @@ -0,0 +1,5 @@ +/Resources/bin/update-data.php export-ignore +/Resources/WcswidthDataGenerator.php export-ignore +/Tests export-ignore +/phpunit.xml.dist export-ignore +/.gitignore export-ignore diff --git a/vendor/symfony/string/AbstractString.php b/vendor/symfony/string/AbstractString.php new file mode 100644 index 0000000..f2754a5 --- /dev/null +++ b/vendor/symfony/string/AbstractString.php @@ -0,0 +1,731 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +use Symfony\Component\String\Exception\ExceptionInterface; +use Symfony\Component\String\Exception\InvalidArgumentException; +use Symfony\Component\String\Exception\RuntimeException; + +/** + * Represents a string of abstract characters. + * + * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). + * This class is the abstract type to use as a type-hint when the logic you want to + * implement doesn't care about the exact variant it deals with. + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +abstract class AbstractString implements \Stringable, \JsonSerializable +{ + public const PREG_PATTERN_ORDER = PREG_PATTERN_ORDER; + public const PREG_SET_ORDER = PREG_SET_ORDER; + public const PREG_OFFSET_CAPTURE = PREG_OFFSET_CAPTURE; + public const PREG_UNMATCHED_AS_NULL = PREG_UNMATCHED_AS_NULL; + + public const PREG_SPLIT = 0; + public const PREG_SPLIT_NO_EMPTY = PREG_SPLIT_NO_EMPTY; + public const PREG_SPLIT_DELIM_CAPTURE = PREG_SPLIT_DELIM_CAPTURE; + public const PREG_SPLIT_OFFSET_CAPTURE = PREG_SPLIT_OFFSET_CAPTURE; + + protected $string = ''; + protected $ignoreCase = false; + + abstract public function __construct(string $string = ''); + + /** + * Unwraps instances of AbstractString back to strings. + * + * @return string[]|array + */ + public static function unwrap(array $values): array + { + foreach ($values as $k => $v) { + if ($v instanceof self) { + $values[$k] = $v->__toString(); + } elseif (\is_array($v) && $values[$k] !== $v = static::unwrap($v)) { + $values[$k] = $v; + } + } + + return $values; + } + + /** + * Wraps (and normalizes) strings in instances of AbstractString. + * + * @return static[]|array + */ + public static function wrap(array $values): array + { + $i = 0; + $keys = null; + + foreach ($values as $k => $v) { + if (\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) { + $keys = $keys ?? array_keys($values); + $keys[$i] = $j; + } + + if (\is_string($v)) { + $values[$k] = new static($v); + } elseif (\is_array($v) && $values[$k] !== $v = static::wrap($v)) { + $values[$k] = $v; + } + + ++$i; + } + + return null !== $keys ? array_combine($keys, $values) : $values; + } + + /** + * @param string|string[] $needle + * + * @return static + */ + public function after($needle, bool $includeNeedle = false, int $offset = 0): self + { + $str = clone $this; + $str->string = ''; + $i = \PHP_INT_MAX; + + foreach ((array) $needle as $n) { + $n = (string) $n; + $j = $this->indexOf($n, $offset); + + if (null !== $j && $j < $i) { + $i = $j; + $str->string = $n; + } + } + + if (\PHP_INT_MAX === $i) { + return $str; + } + + if (!$includeNeedle) { + $i += $str->length(); + } + + return $this->slice($i); + } + + /** + * @param string|string[] $needle + * + * @return static + */ + public function afterLast($needle, bool $includeNeedle = false, int $offset = 0): self + { + $str = clone $this; + $str->string = ''; + $i = null; + + foreach ((array) $needle as $n) { + $n = (string) $n; + $j = $this->indexOfLast($n, $offset); + + if (null !== $j && $j >= $i) { + $i = $offset = $j; + $str->string = $n; + } + } + + if (null === $i) { + return $str; + } + + if (!$includeNeedle) { + $i += $str->length(); + } + + return $this->slice($i); + } + + /** + * @return static + */ + abstract public function append(string ...$suffix): self; + + /** + * @param string|string[] $needle + * + * @return static + */ + public function before($needle, bool $includeNeedle = false, int $offset = 0): self + { + $str = clone $this; + $str->string = ''; + $i = \PHP_INT_MAX; + + foreach ((array) $needle as $n) { + $n = (string) $n; + $j = $this->indexOf($n, $offset); + + if (null !== $j && $j < $i) { + $i = $j; + $str->string = $n; + } + } + + if (\PHP_INT_MAX === $i) { + return $str; + } + + if ($includeNeedle) { + $i += $str->length(); + } + + return $this->slice(0, $i); + } + + /** + * @param string|string[] $needle + * + * @return static + */ + public function beforeLast($needle, bool $includeNeedle = false, int $offset = 0): self + { + $str = clone $this; + $str->string = ''; + $i = null; + + foreach ((array) $needle as $n) { + $n = (string) $n; + $j = $this->indexOfLast($n, $offset); + + if (null !== $j && $j >= $i) { + $i = $offset = $j; + $str->string = $n; + } + } + + if (null === $i) { + return $str; + } + + if ($includeNeedle) { + $i += $str->length(); + } + + return $this->slice(0, $i); + } + + /** + * @return int[] + */ + public function bytesAt(int $offset): array + { + $str = $this->slice($offset, 1); + + return '' === $str->string ? [] : array_values(unpack('C*', $str->string)); + } + + /** + * @return static + */ + abstract public function camel(): self; + + /** + * @return static[] + */ + abstract public function chunk(int $length = 1): array; + + /** + * @return static + */ + public function collapseWhitespace(): self + { + $str = clone $this; + $str->string = trim(preg_replace('/(?:\s{2,}+|[^\S ])/', ' ', $str->string)); + + return $str; + } + + /** + * @param string|string[] $needle + */ + public function containsAny($needle): bool + { + return null !== $this->indexOf($needle); + } + + /** + * @param string|string[] $suffix + */ + public function endsWith($suffix): bool + { + if (!\is_array($suffix) && !$suffix instanceof \Traversable) { + throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + + foreach ($suffix as $s) { + if ($this->endsWith((string) $s)) { + return true; + } + } + + return false; + } + + /** + * @return static + */ + public function ensureEnd(string $suffix): self + { + if (!$this->endsWith($suffix)) { + return $this->append($suffix); + } + + $suffix = preg_quote($suffix); + $regex = '{('.$suffix.')(?:'.$suffix.')++$}D'; + + return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1'); + } + + /** + * @return static + */ + public function ensureStart(string $prefix): self + { + $prefix = new static($prefix); + + if (!$this->startsWith($prefix)) { + return $this->prepend($prefix); + } + + $str = clone $this; + $i = $prefixLen = $prefix->length(); + + while ($this->indexOf($prefix, $i) === $i) { + $str = $str->slice($prefixLen); + $i += $prefixLen; + } + + return $str; + } + + /** + * @param string|string[] $string + */ + public function equalsTo($string): bool + { + if (!\is_array($string) && !$string instanceof \Traversable) { + throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + + foreach ($string as $s) { + if ($this->equalsTo((string) $s)) { + return true; + } + } + + return false; + } + + /** + * @return static + */ + abstract public function folded(): self; + + /** + * @return static + */ + public function ignoreCase(): self + { + $str = clone $this; + $str->ignoreCase = true; + + return $str; + } + + /** + * @param string|string[] $needle + */ + public function indexOf($needle, int $offset = 0): ?int + { + if (!\is_array($needle) && !$needle instanceof \Traversable) { + throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + + $i = \PHP_INT_MAX; + + foreach ($needle as $n) { + $j = $this->indexOf((string) $n, $offset); + + if (null !== $j && $j < $i) { + $i = $j; + } + } + + return \PHP_INT_MAX === $i ? null : $i; + } + + /** + * @param string|string[] $needle + */ + public function indexOfLast($needle, int $offset = 0): ?int + { + if (!\is_array($needle) && !$needle instanceof \Traversable) { + throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + + $i = null; + + foreach ($needle as $n) { + $j = $this->indexOfLast((string) $n, $offset); + + if (null !== $j && $j >= $i) { + $i = $offset = $j; + } + } + + return $i; + } + + public function isEmpty(): bool + { + return '' === $this->string; + } + + /** + * @return static + */ + abstract public function join(array $strings, string $lastGlue = null): self; + + public function jsonSerialize(): string + { + return $this->string; + } + + abstract public function length(): int; + + /** + * @return static + */ + abstract public function lower(): self; + + /** + * Matches the string using a regular expression. + * + * Pass PREG_PATTERN_ORDER or PREG_SET_ORDER as $flags to get all occurrences matching the regular expression. + * + * @return array All matches in a multi-dimensional array ordered according to flags + */ + abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array; + + /** + * @return static + */ + abstract public function padBoth(int $length, string $padStr = ' '): self; + + /** + * @return static + */ + abstract public function padEnd(int $length, string $padStr = ' '): self; + + /** + * @return static + */ + abstract public function padStart(int $length, string $padStr = ' '): self; + + /** + * @return static + */ + abstract public function prepend(string ...$prefix): self; + + /** + * @return static + */ + public function repeat(int $multiplier): self + { + if (0 > $multiplier) { + throw new InvalidArgumentException(sprintf('Multiplier must be positive, %d given.', $multiplier)); + } + + $str = clone $this; + $str->string = str_repeat($str->string, $multiplier); + + return $str; + } + + /** + * @return static + */ + abstract public function replace(string $from, string $to): self; + + /** + * @param string|callable $to + * + * @return static + */ + abstract public function replaceMatches(string $fromRegexp, $to): self; + + /** + * @return static + */ + abstract public function reverse(): self; + + /** + * @return static + */ + abstract public function slice(int $start = 0, int $length = null): self; + + /** + * @return static + */ + abstract public function snake(): self; + + /** + * @return static + */ + abstract public function splice(string $replacement, int $start = 0, int $length = null): self; + + /** + * @return static[] + */ + public function split(string $delimiter, int $limit = null, int $flags = null): array + { + if (null === $flags) { + throw new \TypeError('Split behavior when $flags is null must be implemented by child classes.'); + } + + if ($this->ignoreCase) { + $delimiter .= 'i'; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + if (false === $chunks = preg_split($delimiter, $this->string, $limit, $flags)) { + $lastError = preg_last_error(); + + foreach (get_defined_constants(true)['pcre'] as $k => $v) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { + throw new RuntimeException('Splitting failed with '.$k.'.'); + } + } + + throw new RuntimeException('Splitting failed with unknown error code.'); + } + } finally { + restore_error_handler(); + } + + $str = clone $this; + + if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) { + foreach ($chunks as &$chunk) { + $str->string = $chunk[0]; + $chunk[0] = clone $str; + } + } else { + foreach ($chunks as &$chunk) { + $str->string = $chunk; + $chunk = clone $str; + } + } + + return $chunks; + } + + /** + * @param string|string[] $prefix + */ + public function startsWith($prefix): bool + { + if (!\is_array($prefix) && !$prefix instanceof \Traversable) { + throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + + foreach ($prefix as $prefix) { + if ($this->startsWith((string) $prefix)) { + return true; + } + } + + return false; + } + + /** + * @return static + */ + abstract public function title(bool $allWords = false): self; + + public function toByteString(string $toEncoding = null): ByteString + { + $b = new ByteString(); + + $toEncoding = \in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], true) ? 'UTF-8' : $toEncoding; + + if (null === $toEncoding || $toEncoding === $fromEncoding = $this instanceof AbstractUnicodeString || preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252') { + $b->string = $this->string; + + return $b; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + try { + $b->string = mb_convert_encoding($this->string, $toEncoding, 'UTF-8'); + } catch (InvalidArgumentException $e) { + if (!\function_exists('iconv')) { + throw $e; + } + + $b->string = iconv('UTF-8', $toEncoding, $this->string); + } + } finally { + restore_error_handler(); + } + + return $b; + } + + public function toCodePointString(): CodePointString + { + return new CodePointString($this->string); + } + + public function toString(): string + { + return $this->string; + } + + public function toUnicodeString(): UnicodeString + { + return new UnicodeString($this->string); + } + + /** + * @return static + */ + abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; + + /** + * @return static + */ + abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; + + /** + * @return static + */ + abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self; + + /** + * @return static + */ + public function truncate(int $length, string $ellipsis = '', bool $cut = true): self + { + $stringLength = $this->length(); + + if ($stringLength <= $length) { + return clone $this; + } + + $ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0; + + if ($length < $ellipsisLength) { + $ellipsisLength = 0; + } + + if (!$cut) { + if (null === $length = $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1)) { + return clone $this; + } + + $length += $ellipsisLength; + } + + $str = $this->slice(0, $length - $ellipsisLength); + + return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str; + } + + /** + * @return static + */ + abstract public function upper(): self; + + /** + * Returns the printable length on a terminal. + */ + abstract public function width(bool $ignoreAnsiDecoration = true): int; + + /** + * @return static + */ + public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): self + { + $lines = '' !== $break ? $this->split($break) : [clone $this]; + $chars = []; + $mask = ''; + + if (1 === \count($lines) && '' === $lines[0]->string) { + return $lines[0]; + } + + foreach ($lines as $i => $line) { + if ($i) { + $chars[] = $break; + $mask .= '#'; + } + + foreach ($line->chunk() as $char) { + $chars[] = $char->string; + $mask .= ' ' === $char->string ? ' ' : '?'; + } + } + + $string = ''; + $j = 0; + $b = $i = -1; + $mask = wordwrap($mask, $width, '#', $cut); + + while (false !== $b = strpos($mask, '#', $b + 1)) { + for (++$i; $i < $b; ++$i) { + $string .= $chars[$j]; + unset($chars[$j++]); + } + + if ($break === $chars[$j] || ' ' === $chars[$j]) { + unset($chars[$j++]); + } + + $string .= $break; + } + + $str = clone $this; + $str->string = $string.implode('', $chars); + + return $str; + } + + public function __sleep(): array + { + return ['string']; + } + + public function __clone() + { + $this->ignoreCase = false; + } + + public function __toString(): string + { + return $this->string; + } +} diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php new file mode 100644 index 0000000..6e31dfb --- /dev/null +++ b/vendor/symfony/string/AbstractUnicodeString.php @@ -0,0 +1,576 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +use Symfony\Component\String\Exception\ExceptionInterface; +use Symfony\Component\String\Exception\InvalidArgumentException; +use Symfony\Component\String\Exception\RuntimeException; + +/** + * Represents a string of abstract Unicode characters. + * + * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). + * This class is the abstract type to use as a type-hint when the logic you want to + * implement is Unicode-aware but doesn't care about code points vs grapheme clusters. + * + * @author Nicolas Grekas + * + * @throws ExceptionInterface + */ +abstract class AbstractUnicodeString extends AbstractString +{ + public const NFC = \Normalizer::NFC; + public const NFD = \Normalizer::NFD; + public const NFKC = \Normalizer::NFKC; + public const NFKD = \Normalizer::NFKD; + + // all ASCII letters sorted by typical frequency of occurrence + private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; + + // the subset of folded case mappings that is not in lower case mappings + private const FOLD_FROM = ['İ', 'µ', 'Å¿', "\xCD\x85", 'Ï‚', 'Ï', 'Ï‘', 'Ï•', 'Ï–', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'İ', 'ʼn', 'ǰ', 'Î', 'ΰ', 'Ö‡', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'á½', 'á½’', 'á½”', 'á½–', 'á¾€', 'á¾', 'ᾂ', 'ᾃ', 'ᾄ', 'á¾…', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'á¾', 'ᾎ', 'á¾', 'á¾', 'ᾑ', 'á¾’', 'ᾓ', 'á¾”', 'ᾕ', 'á¾–', 'á¾—', 'ᾘ', 'á¾™', 'ᾚ', 'á¾›', 'ᾜ', 'á¾', 'ᾞ', 'ᾟ', 'á¾ ', 'ᾡ', 'á¾¢', 'á¾£', 'ᾤ', 'á¾¥', 'ᾦ', 'á¾§', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'á¾­', 'á¾®', 'ᾯ', 'á¾²', 'á¾³', 'á¾´', 'á¾¶', 'á¾·', 'á¾¼', 'á¿‚', 'ῃ', 'á¿„', 'ῆ', 'ῇ', 'ῌ', 'á¿’', 'Î', 'á¿–', 'á¿—', 'á¿¢', 'ΰ', 'ῤ', 'ῦ', 'á¿§', 'ῲ', 'ῳ', 'á¿´', 'á¿¶', 'á¿·', 'ῼ', 'ff', 'ï¬', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ']; + private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'Ï€', 'κ', 'Ï', 'ε', 'ṡ', 'ι', 'ss', 'i̇', 'ʼn', 'ǰ', 'Î', 'ΰ', 'Õ¥Ö‚', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'á½', 'á½’', 'á½”', 'á½–', 'ἀι', 'á¼Î¹', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'á¼Î¹', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'á¾¶', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'á¿’', 'Î', 'á¿–', 'á¿—', 'á¿¢', 'ΰ', 'ῤ', 'ῦ', 'á¿§', 'ὼι', 'ωι', 'ώι', 'á¿¶', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'Õ´Õ¶', 'Õ´Õ¥', 'Õ´Õ«', 'Õ¾Õ¶', 'Õ´Õ­']; + + // the subset of upper case mappings that map one code point to many code points + private const UPPER_FROM = ['ß', 'ff', 'ï¬', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'Ö‡', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ', 'ʼn', 'Î', 'ΰ', 'ǰ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'á½', 'á½’', 'á½”', 'á½–', 'á¾¶', 'ῆ', 'á¿’', 'á¿“', 'á¿–', 'á¿—', 'á¿¢', 'á¿£', 'ῤ', 'ῦ', 'á¿§', 'á¿¶']; + private const UPPER_TO = ['SS', 'FF', 'FI', 'FL', 'FFI', 'FFL', 'ST', 'ST', 'ÔµÕ’', 'Õ„Õ†', 'Õ„Ôµ', 'Õ„Ô»', 'ÕŽÕ†', 'Õ„Ô½', 'ʼN', 'ΪÌ', 'ΫÌ', 'JÌŒ', 'H̱', 'T̈', 'WÌŠ', 'YÌŠ', 'Aʾ', 'Υ̓', 'Υ̓̀', 'Υ̓Ì', 'Υ̓͂', 'Α͂', 'Η͂', 'Ϊ̀', 'ΪÌ', 'Ι͂', 'Ϊ͂', 'Ϋ̀', 'ΫÌ', 'Ρ̓', 'Υ͂', 'Ϋ͂', 'Ω͂']; + + // the subset of https://github.com/unicode-org/cldr/blob/master/common/transforms/Latin-ASCII.xml that is not in NFKD + private const TRANSLIT_FROM = ['Æ', 'Ã', 'Ø', 'Þ', 'ß', 'æ', 'ð', 'ø', 'þ', 'Ä', 'Ä‘', 'Ħ', 'ħ', 'ı', 'ĸ', 'Ä¿', 'Å€', 'Å', 'Å‚', 'ʼn', 'ÅŠ', 'Å‹', 'Å’', 'Å“', 'Ŧ', 'ŧ', 'Æ€', 'Æ', 'Æ‚', 'ƃ', 'Ƈ', 'ƈ', 'Ɖ', 'ÆŠ', 'Æ‹', 'ÆŒ', 'Æ', 'Æ‘', 'Æ’', 'Æ“', 'Æ•', 'Æ–', 'Æ—', 'Ƙ', 'Æ™', 'Æš', 'Æ', 'Æž', 'Æ¢', 'Æ£', 'Ƥ', 'Æ¥', 'Æ«', 'Ƭ', 'Æ­', 'Æ®', 'Ʋ', 'Ƴ', 'Æ´', 'Ƶ', 'ƶ', 'Ç„', 'Ç…', 'dž', 'Ǥ', 'Ç¥', 'È¡', 'Ȥ', 'È¥', 'È´', 'ȵ', 'ȶ', 'È·', 'ȸ', 'ȹ', 'Ⱥ', 'È»', 'ȼ', 'Ƚ', 'Ⱦ', 'È¿', 'É€', 'Ƀ', 'É„', 'Ɇ', 'ɇ', 'Ɉ', 'ɉ', 'ÉŒ', 'É', 'ÉŽ', 'É', 'É“', 'É•', 'É–', 'É—', 'É›', 'ÉŸ', 'É ', 'É¡', 'É¢', 'ɦ', 'ɧ', 'ɨ', 'ɪ', 'É«', 'ɬ', 'É­', 'ɱ', 'ɲ', 'ɳ', 'É´', 'ɶ', 'ɼ', 'ɽ', 'ɾ', 'Ê€', 'Ê‚', 'ʈ', 'ʉ', 'Ê‹', 'Ê', 'Ê', 'Ê‘', 'Ê™', 'Ê›', 'Êœ', 'Ê', 'ÊŸ', 'Ê ', 'Ê£', 'Ê¥', 'ʦ', 'ʪ', 'Ê«', 'á´€', 'á´', 'á´ƒ', 'á´„', 'á´…', 'á´†', 'á´‡', 'á´Š', 'á´‹', 'á´Œ', 'á´', 'á´', 'á´˜', 'á´›', 'á´œ', 'á´ ', 'á´¡', 'á´¢', 'ᵫ', 'ᵬ', 'áµ­', 'áµ®', 'ᵯ', 'áµ°', 'áµ±', 'áµ²', 'áµ³', 'áµ´', 'áµµ', 'áµ¶', 'ᵺ', 'áµ»', 'áµ½', 'áµ¾', 'á¶€', 'á¶', 'á¶‚', 'ᶃ', 'á¶„', 'á¶…', 'ᶆ', 'ᶇ', 'ᶈ', 'ᶉ', 'á¶Š', 'á¶Œ', 'á¶', 'á¶Ž', 'á¶', 'á¶‘', 'á¶’', 'á¶“', 'á¶–', 'á¶™', 'ẚ', 'ẜ', 'áº', 'ẞ', 'Ỻ', 'á»»', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', '©', '®', 'â‚ ', 'â‚¢', 'â‚£', '₤', 'â‚§', '₺', '₹', 'ℌ', '℞', '㎧', '㎮', 'ã†', 'ã—', 'ãž', 'ãŸ', '¼', '½', '¾', 'â…“', 'â…”', 'â…•', 'â…–', 'â…—', 'â…˜', 'â…™', 'â…š', 'â…›', 'â…œ', 'â…', 'â…ž', 'â…Ÿ', '〇', '‘', '’', '‚', '‛', '“', 'â€', '„', '‟', '′', '″', 'ã€', '〞', '«', '»', '‹', '›', 'â€', '‑', '‒', '–', '—', '―', '︱', '︲', '﹘', '‖', 'â„', 'â…', 'â†', 'âŽ', 'ã€', '。', '〈', '〉', '《', '》', '〔', '〕', '〘', '〙', '〚', '〛', '︑', '︒', '︹', '︺', '︽', '︾', '︿', 'ï¹€', '﹑', 'ï¹', '﹞', '⦅', 'ï½ ', '。', '、', '×', '÷', '−', '∕', '∖', '∣', '∥', '≪', '≫', '⦅', '⦆']; + private const TRANSLIT_TO = ['AE', 'D', 'O', 'TH', 'ss', 'ae', 'd', 'o', 'th', 'D', 'd', 'H', 'h', 'i', 'q', 'L', 'l', 'L', 'l', '\'n', 'N', 'n', 'OE', 'oe', 'T', 't', 'b', 'B', 'B', 'b', 'C', 'c', 'D', 'D', 'D', 'd', 'E', 'F', 'f', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'N', 'n', 'OI', 'oi', 'P', 'p', 't', 'T', 't', 'T', 'V', 'Y', 'y', 'Z', 'z', 'DZ', 'Dz', 'dz', 'G', 'g', 'd', 'Z', 'z', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'B', 'U', 'E', 'e', 'J', 'j', 'R', 'r', 'Y', 'y', 'b', 'c', 'd', 'd', 'e', 'j', 'g', 'g', 'G', 'h', 'h', 'i', 'I', 'l', 'l', 'l', 'm', 'n', 'n', 'N', 'OE', 'r', 'r', 'r', 'R', 's', 't', 'u', 'v', 'Y', 'z', 'z', 'B', 'G', 'H', 'j', 'L', 'q', 'dz', 'dz', 'ts', 'ls', 'lz', 'A', 'AE', 'B', 'C', 'D', 'D', 'E', 'J', 'K', 'L', 'M', 'O', 'P', 'T', 'U', 'V', 'W', 'Z', 'ue', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'th', 'I', 'p', 'U', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 'v', 'x', 'z', 'a', 'd', 'e', 'e', 'i', 'u', 'a', 's', 's', 'SS', 'LL', 'll', 'V', 'v', 'Y', 'y', '(C)', '(R)', 'CE', 'Cr', 'Fr.', 'L.', 'Pts', 'TL', 'Rs', 'x', 'Rx', 'm/s', 'rad/s', 'C/kg', 'pH', 'V/m', 'A/m', ' 1/4', ' 1/2', ' 3/4', ' 1/3', ' 2/3', ' 1/5', ' 2/5', ' 3/5', ' 4/5', ' 1/6', ' 5/6', ' 1/8', ' 3/8', ' 5/8', ' 7/8', ' 1/', '0', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '\'', '"', '"', '"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))']; + + private static $transliterators = []; + + /** + * @return static + */ + public static function fromCodePoints(int ...$codes): self + { + $string = ''; + + foreach ($codes as $code) { + if (0x80 > $code %= 0x200000) { + $string .= \chr($code); + } elseif (0x800 > $code) { + $string .= \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $string .= \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $string .= \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + } + + return new static($string); + } + + /** + * Generic UTF-8 to ASCII transliteration. + * + * Install the intl extension for best results. + * + * @param string[]|\Transliterator[] $rules See "*-Latin" rules from Transliterator::listIDs() + */ + public function ascii(array $rules = []): self + { + $str = clone $this; + $s = $str->string; + $str->string = ''; + + array_unshift($rules, 'nfd'); + $rules[] = 'latin-ascii'; + + if (\function_exists('transliterator_transliterate')) { + $rules[] = 'any-latin/bgn'; + } + + $rules[] = 'nfkd'; + $rules[] = '[:nonspacing mark:] remove'; + + while (\strlen($s) - 1 > $i = strspn($s, self::ASCII)) { + if (0 < --$i) { + $str->string .= substr($s, 0, $i); + $s = substr($s, $i); + } + + if (!$rule = array_shift($rules)) { + $rules = []; // An empty rule interrupts the next ones + } + + if ($rule instanceof \Transliterator) { + $s = $rule->transliterate($s); + } elseif ($rule) { + if ('nfd' === $rule = strtolower($rule)) { + normalizer_is_normalized($s, self::NFD) ?: $s = normalizer_normalize($s, self::NFD); + } elseif ('nfkd' === $rule) { + normalizer_is_normalized($s, self::NFKD) ?: $s = normalizer_normalize($s, self::NFKD); + } elseif ('[:nonspacing mark:] remove' === $rule) { + $s = preg_replace('/\p{Mn}++/u', '', $s); + } elseif ('latin-ascii' === $rule) { + $s = str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s); + } elseif ('de-ascii' === $rule) { + $s = preg_replace("/([AUO])\u{0308}(?=\p{Ll})/u", '$1e', $s); + $s = str_replace(["a\u{0308}", "o\u{0308}", "u\u{0308}", "A\u{0308}", "O\u{0308}", "U\u{0308}"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s); + } elseif (\function_exists('transliterator_transliterate')) { + if (null === $transliterator = self::$transliterators[$rule] ?? self::$transliterators[$rule] = \Transliterator::create($rule)) { + if ('any-latin/bgn' === $rule) { + $rule = 'any-latin'; + $transliterator = self::$transliterators[$rule] ?? self::$transliterators[$rule] = \Transliterator::create($rule); + } + + if (null === $transliterator) { + throw new InvalidArgumentException(sprintf('Unknown transliteration rule "%s".', $rule)); + } + + self::$transliterators['any-latin/bgn'] = $transliterator; + } + + $s = $transliterator->transliterate($s); + } + } elseif (!\function_exists('iconv')) { + $s = preg_replace('/[^\x00-\x7F]/u', '?', $s); + } elseif (ICONV_IMPL === 'glibc') { + $s = iconv('UTF-8', 'ASCII//TRANSLIT', $s); + } else { + $s = preg_replace_callback('/[^\x00-\x7F]/u', static function ($c) { + $c = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $c[0]); + + return 1 < \strlen($c) ? ltrim($c, '\'`"^~') : (\strlen($c) ? $c : '?'); + }, $s); + } + } + + $str->string .= $s; + + return $str; + } + + public function camel(): parent + { + $str = clone $this; + $str->string = str_replace(' ', '', preg_replace_callback('/\b./u', static function ($m) use (&$i) { + return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], MB_CASE_TITLE, 'UTF-8'); + }, preg_replace('/[^\pL0-9]++/u', ' ', $this->string))); + + return $str; + } + + /** + * @return int[] + */ + public function codePointsAt(int $offset): array + { + $str = $this->slice($offset, 1); + + if ('' === $str->string) { + return []; + } + + $codePoints = []; + + foreach (preg_split('//u', $str->string, -1, PREG_SPLIT_NO_EMPTY) as $c) { + $codePoints[] = mb_ord($c, 'UTF-8'); + } + + return $codePoints; + } + + public function folded(bool $compat = true): parent + { + $str = clone $this; + + if (!$compat || \PHP_VERSION_ID < 70300 || !\defined('Normalizer::NFKC_CF')) { + $str->string = normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC); + $str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8'); + } else { + $str->string = normalizer_normalize($str->string, \Normalizer::NFKC_CF); + } + + return $str; + } + + public function join(array $strings, string $lastGlue = null): parent + { + $str = clone $this; + + $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : ''; + $str->string = implode($this->string, $strings).$tail; + + if (!preg_match('//u', $str->string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + return $str; + } + + public function lower(): parent + { + $str = clone $this; + $str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8'); + + return $str; + } + + public function match(string $regexp, int $flags = 0, int $offset = 0): array + { + $match = ((PREG_PATTERN_ORDER | PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match'; + + if ($this->ignoreCase) { + $regexp .= 'i'; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + if (false === $match($regexp.'u', $this->string, $matches, $flags | PREG_UNMATCHED_AS_NULL, $offset)) { + $lastError = preg_last_error(); + + foreach (get_defined_constants(true)['pcre'] as $k => $v) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { + throw new RuntimeException('Matching failed with '.$k.'.'); + } + } + + throw new RuntimeException('Matching failed with unknown error code.'); + } + } finally { + restore_error_handler(); + } + + return $matches; + } + + /** + * @return static + */ + public function normalize(int $form = self::NFC): self + { + if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) { + throw new InvalidArgumentException('Unsupported normalization form.'); + } + + $str = clone $this; + normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form); + + return $str; + } + + public function padBoth(int $length, string $padStr = ' '): parent + { + if ('' === $padStr || !preg_match('//u', $padStr)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + $pad = clone $this; + $pad->string = $padStr; + + return $this->pad($length, $pad, STR_PAD_BOTH); + } + + public function padEnd(int $length, string $padStr = ' '): parent + { + if ('' === $padStr || !preg_match('//u', $padStr)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + $pad = clone $this; + $pad->string = $padStr; + + return $this->pad($length, $pad, STR_PAD_RIGHT); + } + + public function padStart(int $length, string $padStr = ' '): parent + { + if ('' === $padStr || !preg_match('//u', $padStr)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + $pad = clone $this; + $pad->string = $padStr; + + return $this->pad($length, $pad, STR_PAD_LEFT); + } + + public function replaceMatches(string $fromRegexp, $to): parent + { + if ($this->ignoreCase) { + $fromRegexp .= 'i'; + } + + if (\is_array($to) || $to instanceof \Closure) { + if (!\is_callable($to)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); + } + + $replace = 'preg_replace_callback'; + $to = static function (array $m) use ($to): string { + $to = $to($m); + + if ('' !== $to && (!\is_string($to) || !preg_match('//u', $to))) { + throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.'); + } + + return $to; + }; + } elseif ('' !== $to && !preg_match('//u', $to)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } else { + $replace = 'preg_replace'; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + if (null === $string = $replace($fromRegexp.'u', $to, $this->string)) { + $lastError = preg_last_error(); + + foreach (get_defined_constants(true)['pcre'] as $k => $v) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { + throw new RuntimeException('Matching failed with '.$k.'.'); + } + } + + throw new RuntimeException('Matching failed with unknown error code.'); + } + } finally { + restore_error_handler(); + } + + $str = clone $this; + $str->string = $string; + + return $str; + } + + public function reverse(): parent + { + $str = clone $this; + $str->string = implode('', array_reverse(preg_split('/(\X)/u', $str->string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY))); + + return $str; + } + + public function snake(): parent + { + $str = $this->camel()->title(); + $str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8'); + + return $str; + } + + public function title(bool $allWords = false): parent + { + $str = clone $this; + + $limit = $allWords ? -1 : 1; + + $str->string = preg_replace_callback('/\b./u', static function (array $m): string { + return mb_convert_case($m[0], MB_CASE_TITLE, 'UTF-8'); + }, $str->string, $limit); + + return $str; + } + + public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent + { + if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { + throw new InvalidArgumentException('Invalid UTF-8 chars.'); + } + $chars = preg_quote($chars); + + $str = clone $this; + $str->string = preg_replace("{^[$chars]++|[$chars]++$}uD", '', $str->string); + + return $str; + } + + public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent + { + if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { + throw new InvalidArgumentException('Invalid UTF-8 chars.'); + } + $chars = preg_quote($chars); + + $str = clone $this; + $str->string = preg_replace("{[$chars]++$}uD", '', $str->string); + + return $str; + } + + public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent + { + if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) { + throw new InvalidArgumentException('Invalid UTF-8 chars.'); + } + $chars = preg_quote($chars); + + $str = clone $this; + $str->string = preg_replace("{^[$chars]++}uD", '', $str->string); + + return $str; + } + + public function upper(): parent + { + $str = clone $this; + $str->string = mb_strtoupper($str->string, 'UTF-8'); + + if (\PHP_VERSION_ID < 70300) { + $str->string = str_replace(self::UPPER_FROM, self::UPPER_TO, $str->string); + } + + return $str; + } + + public function width(bool $ignoreAnsiDecoration = true): int + { + $width = 0; + $s = str_replace(["\x00", "\x05", "\x07"], '', $this->string); + + if (false !== strpos($s, "\r")) { + $s = str_replace(["\r\n", "\r"], "\n", $s); + } + + if (!$ignoreAnsiDecoration) { + $s = preg_replace('/[\p{Cc}\x7F]++/u', '', $s); + } + + foreach (explode("\n", $s) as $s) { + if ($ignoreAnsiDecoration) { + $s = preg_replace('/(?:\x1B(?: + \[ [\x30-\x3F]*+ [\x20-\x2F]*+ [0x40-\x7E] + | [P\]X^_] .*? \x1B\\\\ + | [\x41-\x7E] + )|[\p{Cc}\x7F]++)/xu', '', $s); + } + + // Non printable characters have been dropped, so wcswidth cannot logically return -1. + $width += $this->wcswidth($s); + } + + return $width; + } + + /** + * @return static + */ + private function pad(int $len, self $pad, int $type): parent + { + $sLen = $this->length(); + + if ($len <= $sLen) { + return clone $this; + } + + $padLen = $pad->length(); + $freeLen = $len - $sLen; + $len = $freeLen % $padLen; + + switch ($type) { + case STR_PAD_RIGHT: + return $this->append(str_repeat($pad->string, $freeLen / $padLen).($len ? $pad->slice(0, $len) : '')); + + case STR_PAD_LEFT: + return $this->prepend(str_repeat($pad->string, $freeLen / $padLen).($len ? $pad->slice(0, $len) : '')); + + case STR_PAD_BOTH: + $freeLen /= 2; + + $rightLen = ceil($freeLen); + $len = $rightLen % $padLen; + $str = $this->append(str_repeat($pad->string, $rightLen / $padLen).($len ? $pad->slice(0, $len) : '')); + + $leftLen = floor($freeLen); + $len = $leftLen % $padLen; + + return $str->prepend(str_repeat($pad->string, $leftLen / $padLen).($len ? $pad->slice(0, $len) : '')); + + default: + throw new InvalidArgumentException('Invalid padding type.'); + } + } + + /** + * Based on https://github.com/jquast/wcwidth, a Python implementation of https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c. + */ + private function wcswidth(string $string): int + { + $width = 0; + + foreach (preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY) as $c) { + $codePoint = mb_ord($c, 'UTF-8'); + + if (0 === $codePoint // NULL + || 0x034F === $codePoint // COMBINING GRAPHEME JOINER + || (0x200B <= $codePoint && 0x200F >= $codePoint) // ZERO WIDTH SPACE to RIGHT-TO-LEFT MARK + || 0x2028 === $codePoint // LINE SEPARATOR + || 0x2029 === $codePoint // PARAGRAPH SEPARATOR + || (0x202A <= $codePoint && 0x202E >= $codePoint) // LEFT-TO-RIGHT EMBEDDING to RIGHT-TO-LEFT OVERRIDE + || (0x2060 <= $codePoint && 0x2063 >= $codePoint) // WORD JOINER to INVISIBLE SEPARATOR + ) { + continue; + } + + // Non printable characters + if (32 > $codePoint // C0 control characters + || (0x07F <= $codePoint && 0x0A0 > $codePoint) // C1 control characters and DEL + ) { + return -1; + } + + static $tableZero; + if (null === $tableZero) { + $tableZero = require __DIR__.'/Resources/data/wcswidth_table_zero.php'; + } + + if ($codePoint >= $tableZero[0][0] && $codePoint <= $tableZero[$ubound = \count($tableZero) - 1][1]) { + $lbound = 0; + while ($ubound >= $lbound) { + $mid = floor(($lbound + $ubound) / 2); + + if ($codePoint > $tableZero[$mid][1]) { + $lbound = $mid + 1; + } elseif ($codePoint < $tableZero[$mid][0]) { + $ubound = $mid - 1; + } else { + continue 2; + } + } + } + + static $tableWide; + if (null === $tableWide) { + $tableWide = require __DIR__.'/Resources/data/wcswidth_table_wide.php'; + } + + if ($codePoint >= $tableWide[0][0] && $codePoint <= $tableWide[$ubound = \count($tableWide) - 1][1]) { + $lbound = 0; + while ($ubound >= $lbound) { + $mid = floor(($lbound + $ubound) / 2); + + if ($codePoint > $tableWide[$mid][1]) { + $lbound = $mid + 1; + } elseif ($codePoint < $tableWide[$mid][0]) { + $ubound = $mid - 1; + } else { + $width += 2; + + continue 2; + } + } + } + + ++$width; + } + + return $width; + } +} diff --git a/vendor/symfony/string/ByteString.php b/vendor/symfony/string/ByteString.php new file mode 100644 index 0000000..65f12a9 --- /dev/null +++ b/vendor/symfony/string/ByteString.php @@ -0,0 +1,506 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +use Symfony\Component\String\Exception\ExceptionInterface; +use Symfony\Component\String\Exception\InvalidArgumentException; +use Symfony\Component\String\Exception\RuntimeException; + +/** + * Represents a binary-safe string of bytes. + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +class ByteString extends AbstractString +{ + private const ALPHABET_ALPHANUMERIC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + public function __construct(string $string = '') + { + $this->string = $string; + } + + /* + * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03) + * + * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16 + * + * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE). + * + * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/) + */ + + public static function fromRandom(int $length = 16, string $alphabet = null): self + { + if ($length <= 0) { + throw new InvalidArgumentException(sprintf('A strictly positive length is expected, "%d" given.', $length)); + } + + $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC; + $alphabetSize = \strlen($alphabet); + $bits = (int) ceil(log($alphabetSize, 2.0)); + if ($bits <= 0 || $bits > 56) { + throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.'); + } + + $ret = ''; + while ($length > 0) { + $urandomLength = (int) ceil(2 * $length * $bits / 8.0); + $data = random_bytes($urandomLength); + $unpackedData = 0; + $unpackedBits = 0; + for ($i = 0; $i < $urandomLength && $length > 0; ++$i) { + // Unpack 8 bits + $unpackedData = ($unpackedData << 8) | \ord($data[$i]); + $unpackedBits += 8; + + // While we have enough bits to select a character from the alphabet, keep + // consuming the random data + for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) { + $index = ($unpackedData & ((1 << $bits) - 1)); + $unpackedData >>= $bits; + // Unfortunately, the alphabet size is not necessarily a power of two. + // Worst case, it is 2^k + 1, which means we need (k+1) bits and we + // have around a 50% chance of missing as k gets larger + if ($index < $alphabetSize) { + $ret .= $alphabet[$index]; + --$length; + } + } + } + } + + return new static($ret); + } + + public function bytesAt(int $offset): array + { + $str = $this->string[$offset] ?? ''; + + return '' === $str ? [] : [\ord($str)]; + } + + public function append(string ...$suffix): parent + { + $str = clone $this; + $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix); + + return $str; + } + + public function camel(): parent + { + $str = clone $this; + $str->string = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $this->string)))); + + return $str; + } + + public function chunk(int $length = 1): array + { + if (1 > $length) { + throw new InvalidArgumentException('The chunk length must be greater than zero.'); + } + + if ('' === $this->string) { + return []; + } + + $str = clone $this; + $chunks = []; + + foreach (str_split($this->string, $length) as $chunk) { + $str->string = $chunk; + $chunks[] = clone $str; + } + + return $chunks; + } + + public function endsWith($suffix): bool + { + if ($suffix instanceof parent) { + $suffix = $suffix->string; + } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { + return parent::endsWith($suffix); + } else { + $suffix = (string) $suffix; + } + + return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase); + } + + public function equalsTo($string): bool + { + if ($string instanceof parent) { + $string = $string->string; + } elseif (\is_array($string) || $string instanceof \Traversable) { + return parent::equalsTo($string); + } else { + $string = (string) $string; + } + + if ('' !== $string && $this->ignoreCase) { + return 0 === strcasecmp($string, $this->string); + } + + return $string === $this->string; + } + + public function folded(): parent + { + $str = clone $this; + $str->string = strtolower($str->string); + + return $str; + } + + public function indexOf($needle, int $offset = 0): ?int + { + if ($needle instanceof parent) { + $needle = $needle->string; + } elseif (\is_array($needle) || $needle instanceof \Traversable) { + return parent::indexOf($needle, $offset); + } else { + $needle = (string) $needle; + } + + if ('' === $needle) { + return null; + } + + $i = $this->ignoreCase ? stripos($this->string, $needle, $offset) : strpos($this->string, $needle, $offset); + + return false === $i ? null : $i; + } + + public function indexOfLast($needle, int $offset = 0): ?int + { + if ($needle instanceof parent) { + $needle = $needle->string; + } elseif (\is_array($needle) || $needle instanceof \Traversable) { + return parent::indexOfLast($needle, $offset); + } else { + $needle = (string) $needle; + } + + if ('' === $needle) { + return null; + } + + $i = $this->ignoreCase ? strripos($this->string, $needle, $offset) : strrpos($this->string, $needle, $offset); + + return false === $i ? null : $i; + } + + public function isUtf8(): bool + { + return '' === $this->string || preg_match('//u', $this->string); + } + + public function join(array $strings, string $lastGlue = null): parent + { + $str = clone $this; + + $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : ''; + $str->string = implode($this->string, $strings).$tail; + + return $str; + } + + public function length(): int + { + return \strlen($this->string); + } + + public function lower(): parent + { + $str = clone $this; + $str->string = strtolower($str->string); + + return $str; + } + + public function match(string $regexp, int $flags = 0, int $offset = 0): array + { + $match = ((PREG_PATTERN_ORDER | PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match'; + + if ($this->ignoreCase) { + $regexp .= 'i'; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + if (false === $match($regexp, $this->string, $matches, $flags | PREG_UNMATCHED_AS_NULL, $offset)) { + $lastError = preg_last_error(); + + foreach (get_defined_constants(true)['pcre'] as $k => $v) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { + throw new RuntimeException('Matching failed with '.$k.'.'); + } + } + + throw new RuntimeException('Matching failed with unknown error code.'); + } + } finally { + restore_error_handler(); + } + + return $matches; + } + + public function padBoth(int $length, string $padStr = ' '): parent + { + $str = clone $this; + $str->string = str_pad($this->string, $length, $padStr, STR_PAD_BOTH); + + return $str; + } + + public function padEnd(int $length, string $padStr = ' '): parent + { + $str = clone $this; + $str->string = str_pad($this->string, $length, $padStr, STR_PAD_RIGHT); + + return $str; + } + + public function padStart(int $length, string $padStr = ' '): parent + { + $str = clone $this; + $str->string = str_pad($this->string, $length, $padStr, STR_PAD_LEFT); + + return $str; + } + + public function prepend(string ...$prefix): parent + { + $str = clone $this; + $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string; + + return $str; + } + + public function replace(string $from, string $to): parent + { + $str = clone $this; + + if ('' !== $from) { + $str->string = $this->ignoreCase ? str_ireplace($from, $to, $this->string) : str_replace($from, $to, $this->string); + } + + return $str; + } + + public function replaceMatches(string $fromRegexp, $to): parent + { + if ($this->ignoreCase) { + $fromRegexp .= 'i'; + } + + if (\is_array($to)) { + if (!\is_callable($to)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); + } + + $replace = 'preg_replace_callback'; + } else { + $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace'; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + if (null === $string = $replace($fromRegexp, $to, $this->string)) { + $lastError = preg_last_error(); + + foreach (get_defined_constants(true)['pcre'] as $k => $v) { + if ($lastError === $v && '_ERROR' === substr($k, -6)) { + throw new RuntimeException('Matching failed with '.$k.'.'); + } + } + + throw new RuntimeException('Matching failed with unknown error code.'); + } + } finally { + restore_error_handler(); + } + + $str = clone $this; + $str->string = $string; + + return $str; + } + + public function reverse(): parent + { + $str = clone $this; + $str->string = strrev($str->string); + + return $str; + } + + public function slice(int $start = 0, int $length = null): parent + { + $str = clone $this; + $str->string = (string) substr($this->string, $start, $length ?? \PHP_INT_MAX); + + return $str; + } + + public function snake(): parent + { + $str = $this->camel()->title(); + $str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string)); + + return $str; + } + + public function splice(string $replacement, int $start = 0, int $length = null): parent + { + $str = clone $this; + $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); + + return $str; + } + + public function split(string $delimiter, int $limit = null, int $flags = null): array + { + if (1 > $limit = $limit ?? \PHP_INT_MAX) { + throw new InvalidArgumentException('Split limit must be a positive integer.'); + } + + if ('' === $delimiter) { + throw new InvalidArgumentException('Split delimiter is empty.'); + } + + if (null !== $flags) { + return parent::split($delimiter, $limit, $flags); + } + + $str = clone $this; + $chunks = $this->ignoreCase + ? preg_split('{'.preg_quote($delimiter).'}iD', $this->string, $limit) + : explode($delimiter, $this->string, $limit); + + foreach ($chunks as &$chunk) { + $str->string = $chunk; + $chunk = clone $str; + } + + return $chunks; + } + + public function startsWith($prefix): bool + { + if ($prefix instanceof parent) { + $prefix = $prefix->string; + } elseif (!\is_string($prefix)) { + return parent::startsWith($prefix); + } + + return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \strlen($prefix)) : strncmp($this->string, $prefix, \strlen($prefix))); + } + + public function title(bool $allWords = false): parent + { + $str = clone $this; + $str->string = $allWords ? ucwords($str->string) : ucfirst($str->string); + + return $str; + } + + public function toUnicodeString(string $fromEncoding = null): UnicodeString + { + return new UnicodeString($this->toCodePointString($fromEncoding)->string); + } + + public function toCodePointString(string $fromEncoding = null): CodePointString + { + $u = new CodePointString(); + + if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], true) && preg_match('//u', $this->string)) { + $u->string = $this->string; + + return $u; + } + + set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); + + try { + try { + $validEncoding = false !== mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', true); + } catch (InvalidArgumentException $e) { + if (!\function_exists('iconv')) { + throw $e; + } + + $u->string = iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string); + + return $u; + } + } finally { + restore_error_handler(); + } + + if (!$validEncoding) { + throw new InvalidArgumentException(sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252')); + } + + $u->string = mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252'); + + return $u; + } + + public function trim(string $chars = " \t\n\r\0\x0B\x0C"): parent + { + $str = clone $this; + $str->string = trim($str->string, $chars); + + return $str; + } + + public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): parent + { + $str = clone $this; + $str->string = rtrim($str->string, $chars); + + return $str; + } + + public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): parent + { + $str = clone $this; + $str->string = ltrim($str->string, $chars); + + return $str; + } + + public function upper(): parent + { + $str = clone $this; + $str->string = strtoupper($str->string); + + return $str; + } + + public function width(bool $ignoreAnsiDecoration = true): int + { + $string = preg_match('//u', $this->string) ? $this->string : preg_replace('/[\x80-\xFF]/', '?', $this->string); + + return (new CodePointString($string))->width($ignoreAnsiDecoration); + } +} diff --git a/vendor/symfony/string/CHANGELOG.md b/vendor/symfony/string/CHANGELOG.md new file mode 100644 index 0000000..1251fe5 --- /dev/null +++ b/vendor/symfony/string/CHANGELOG.md @@ -0,0 +1,20 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added the `AbstractString::reverse()` method + * made `AbstractString::width()` follow POSIX.1-2001 + * added `LazyString` which provides memoizing stringable objects + * The component is not marked as `@experimental` anymore + * added the `s()` helper method to get either an `UnicodeString` or `ByteString` instance, + depending of the input string UTF-8 compliancy + * added `$cut` parameter to `Symfony\Component\String\AbstractString::truncate()` + * added `AbstractString::containsAny()` + * allow passing a string of custom characters to `ByteString::fromRandom()` + +5.0.0 +----- + + * added the component as experimental diff --git a/vendor/symfony/string/CodePointString.php b/vendor/symfony/string/CodePointString.php new file mode 100644 index 0000000..8f0034a --- /dev/null +++ b/vendor/symfony/string/CodePointString.php @@ -0,0 +1,270 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +use Symfony\Component\String\Exception\ExceptionInterface; +use Symfony\Component\String\Exception\InvalidArgumentException; + +/** + * Represents a string of Unicode code points encoded as UTF-8. + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +class CodePointString extends AbstractUnicodeString +{ + public function __construct(string $string = '') + { + if ('' !== $string && !preg_match('//u', $string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + $this->string = $string; + } + + public function append(string ...$suffix): AbstractString + { + $str = clone $this; + $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix); + + if (!preg_match('//u', $str->string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + return $str; + } + + public function chunk(int $length = 1): array + { + if (1 > $length) { + throw new InvalidArgumentException('The chunk length must be greater than zero.'); + } + + if ('' === $this->string) { + return []; + } + + $rx = '/('; + while (65535 < $length) { + $rx .= '.{65535}'; + $length -= 65535; + } + $rx .= '.{'.$length.'})/us'; + + $str = clone $this; + $chunks = []; + + foreach (preg_split($rx, $this->string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $chunk) { + $str->string = $chunk; + $chunks[] = clone $str; + } + + return $chunks; + } + + public function codePointsAt(int $offset): array + { + $str = $offset ? $this->slice($offset, 1) : $this; + + return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')]; + } + + public function endsWith($suffix): bool + { + if ($suffix instanceof AbstractString) { + $suffix = $suffix->string; + } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { + return parent::endsWith($suffix); + } else { + $suffix = (string) $suffix; + } + + if ('' === $suffix || !preg_match('//u', $suffix)) { + return false; + } + + if ($this->ignoreCase) { + return preg_match('{'.preg_quote($suffix).'$}iuD', $this->string); + } + + return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix)); + } + + public function equalsTo($string): bool + { + if ($string instanceof AbstractString) { + $string = $string->string; + } elseif (\is_array($string) || $string instanceof \Traversable) { + return parent::equalsTo($string); + } else { + $string = (string) $string; + } + + if ('' !== $string && $this->ignoreCase) { + return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8'); + } + + return $string === $this->string; + } + + public function indexOf($needle, int $offset = 0): ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (\is_array($needle) || $needle instanceof \Traversable) { + return parent::indexOf($needle, $offset); + } else { + $needle = (string) $needle; + } + + if ('' === $needle) { + return null; + } + + $i = $this->ignoreCase ? mb_stripos($this->string, $needle, $offset, 'UTF-8') : mb_strpos($this->string, $needle, $offset, 'UTF-8'); + + return false === $i ? null : $i; + } + + public function indexOfLast($needle, int $offset = 0): ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (\is_array($needle) || $needle instanceof \Traversable) { + return parent::indexOfLast($needle, $offset); + } else { + $needle = (string) $needle; + } + + if ('' === $needle) { + return null; + } + + $i = $this->ignoreCase ? mb_strripos($this->string, $needle, $offset, 'UTF-8') : mb_strrpos($this->string, $needle, $offset, 'UTF-8'); + + return false === $i ? null : $i; + } + + public function length(): int + { + return mb_strlen($this->string, 'UTF-8'); + } + + public function prepend(string ...$prefix): AbstractString + { + $str = clone $this; + $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string; + + if (!preg_match('//u', $str->string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + return $str; + } + + public function replace(string $from, string $to): AbstractString + { + $str = clone $this; + + if ('' === $from || !preg_match('//u', $from)) { + return $str; + } + + if ('' !== $to && !preg_match('//u', $to)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + if ($this->ignoreCase) { + $str->string = implode($to, preg_split('{'.preg_quote($from).'}iuD', $this->string)); + } else { + $str->string = str_replace($from, $to, $this->string); + } + + return $str; + } + + public function slice(int $start = 0, int $length = null): AbstractString + { + $str = clone $this; + $str->string = mb_substr($this->string, $start, $length, 'UTF-8'); + + return $str; + } + + public function splice(string $replacement, int $start = 0, int $length = null): AbstractString + { + if (!preg_match('//u', $replacement)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + $str = clone $this; + $start = $start ? \strlen(mb_substr($this->string, 0, $start, 'UTF-8')) : 0; + $length = $length ? \strlen(mb_substr($this->string, $start, $length, 'UTF-8')) : $length; + $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); + + return $str; + } + + public function split(string $delimiter, int $limit = null, int $flags = null): array + { + if (1 > $limit = $limit ?? \PHP_INT_MAX) { + throw new InvalidArgumentException('Split limit must be a positive integer.'); + } + + if ('' === $delimiter) { + throw new InvalidArgumentException('Split delimiter is empty.'); + } + + if (null !== $flags) { + return parent::split($delimiter.'u', $limit, $flags); + } + + if (!preg_match('//u', $delimiter)) { + throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); + } + + $str = clone $this; + $chunks = $this->ignoreCase + ? preg_split('{'.preg_quote($delimiter).'}iuD', $this->string, $limit) + : explode($delimiter, $this->string, $limit); + + foreach ($chunks as &$chunk) { + $str->string = $chunk; + $chunk = clone $str; + } + + return $chunks; + } + + public function startsWith($prefix): bool + { + if ($prefix instanceof AbstractString) { + $prefix = $prefix->string; + } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { + return parent::startsWith($prefix); + } else { + $prefix = (string) $prefix; + } + + if ('' === $prefix || !preg_match('//u', $prefix)) { + return false; + } + + if ($this->ignoreCase) { + return 0 === mb_stripos($this->string, $prefix, 0, 'UTF-8'); + } + + return 0 === strncmp($this->string, $prefix, \strlen($prefix)); + } +} diff --git a/vendor/symfony/string/Exception/ExceptionInterface.php b/vendor/symfony/string/Exception/ExceptionInterface.php new file mode 100644 index 0000000..3619786 --- /dev/null +++ b/vendor/symfony/string/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Exception; + +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/string/Exception/InvalidArgumentException.php b/vendor/symfony/string/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..6aa586b --- /dev/null +++ b/vendor/symfony/string/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/string/Exception/RuntimeException.php b/vendor/symfony/string/Exception/RuntimeException.php new file mode 100644 index 0000000..77cb091 --- /dev/null +++ b/vendor/symfony/string/Exception/RuntimeException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Exception; + +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php new file mode 100644 index 0000000..4cd0543 --- /dev/null +++ b/vendor/symfony/string/Inflector/EnglishInflector.php @@ -0,0 +1,477 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Inflector; + +final class EnglishInflector implements InflectorInterface +{ + /** + * Map English plural to singular suffixes. + * + * @see http://english-zone.com/spelling/plurals.html + */ + private static $pluralMap = [ + // First entry: plural suffix, reversed + // Second entry: length of plural suffix + // Third entry: Whether the suffix may succeed a vocal + // Fourth entry: Whether the suffix may succeed a consonant + // Fifth entry: singular suffix, normal + + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['a', 1, true, true, ['on', 'um']], + + // nebulae (nebula) + ['ea', 2, true, true, 'a'], + + // services (service) + ['secivres', 8, true, true, 'service'], + + // mice (mouse), lice (louse) + ['eci', 3, false, true, 'ouse'], + + // geese (goose) + ['esee', 4, false, true, 'oose'], + + // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) + ['i', 1, true, true, 'us'], + + // men (man), women (woman) + ['nem', 3, true, true, 'man'], + + // children (child) + ['nerdlihc', 8, true, true, 'child'], + + // oxen (ox) + ['nexo', 4, false, false, 'ox'], + + // indices (index), appendices (appendix), prices (price) + ['seci', 4, false, true, ['ex', 'ix', 'ice']], + + // selfies (selfie) + ['seifles', 7, true, true, 'selfie'], + + // movies (movie) + ['seivom', 6, true, true, 'movie'], + + // feet (foot) + ['teef', 4, true, true, 'foot'], + + // geese (goose) + ['eseeg', 5, true, true, 'goose'], + + // teeth (tooth) + ['hteet', 5, true, true, 'tooth'], + + // news (news) + ['swen', 4, true, true, 'news'], + + // series (series) + ['seires', 6, true, true, 'series'], + + // babies (baby) + ['sei', 3, false, true, 'y'], + + // accesses (access), addresses (address), kisses (kiss) + ['sess', 4, true, false, 'ss'], + + // analyses (analysis), ellipses (ellipsis), fungi (fungus), + // neuroses (neurosis), theses (thesis), emphases (emphasis), + // oases (oasis), crises (crisis), houses (house), bases (base), + // atlases (atlas) + ['ses', 3, true, true, ['s', 'se', 'sis']], + + // objectives (objective), alternative (alternatives) + ['sevit', 5, true, true, 'tive'], + + // drives (drive) + ['sevird', 6, false, true, 'drive'], + + // lives (life), wives (wife) + ['sevi', 4, false, true, 'ife'], + + // moves (move) + ['sevom', 5, true, true, 'move'], + + // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff) + ['sev', 3, true, true, ['f', 've', 'ff']], + + // axes (axis), axes (ax), axes (axe) + ['sexa', 4, false, false, ['ax', 'axe', 'axis']], + + // indexes (index), matrixes (matrix) + ['sex', 3, true, false, 'x'], + + // quizzes (quiz) + ['sezz', 4, true, false, 'z'], + + // bureaus (bureau) + ['suae', 4, false, true, 'eau'], + + // fees (fee), trees (tree), employees (employee) + ['see', 3, true, true, 'ee'], + + // roses (rose), garages (garage), cassettes (cassette), + // waltzes (waltz), heroes (hero), bushes (bush), arches (arch), + // shoes (shoe) + ['se', 2, true, true, ['', 'e']], + + // tags (tag) + ['s', 1, true, true, ''], + + // chateaux (chateau) + ['xuae', 4, false, true, 'eau'], + + // people (person) + ['elpoep', 6, true, true, 'person'], + ]; + + /** + * Map English singular to plural suffixes. + * + * @see http://english-zone.com/spelling/plurals.html + */ + private static $singularMap = [ + // First entry: singular suffix, reversed + // Second entry: length of singular suffix + // Third entry: Whether the suffix may succeed a vocal + // Fourth entry: Whether the suffix may succeed a consonant + // Fifth entry: plural suffix, normal + + // criterion (criteria) + ['airetirc', 8, false, false, 'criterion'], + + // nebulae (nebula) + ['aluben', 6, false, false, 'nebulae'], + + // children (child) + ['dlihc', 5, true, true, 'children'], + + // prices (price) + ['eci', 3, false, true, 'ices'], + + // services (service) + ['ecivres', 7, true, true, 'services'], + + // lives (life), wives (wife) + ['efi', 3, false, true, 'ives'], + + // selfies (selfie) + ['eifles', 6, true, true, 'selfies'], + + // movies (movie) + ['eivom', 5, true, true, 'movies'], + + // lice (louse) + ['esuol', 5, false, true, 'lice'], + + // mice (mouse) + ['esuom', 5, false, true, 'mice'], + + // geese (goose) + ['esoo', 4, false, true, 'eese'], + + // houses (house), bases (base) + ['es', 2, true, true, 'ses'], + + // geese (goose) + ['esoog', 5, true, true, 'geese'], + + // caves (cave) + ['ev', 2, true, true, 'ves'], + + // drives (drive) + ['evird', 5, false, true, 'drives'], + + // objectives (objective), alternative (alternatives) + ['evit', 4, true, true, 'tives'], + + // moves (move) + ['evom', 4, true, true, 'moves'], + + // staves (staff) + ['ffats', 5, true, true, 'staves'], + + // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) + ['ff', 2, true, true, 'ffs'], + + // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) + ['f', 1, true, true, ['fs', 'ves']], + + // arches (arch) + ['hc', 2, true, true, 'ches'], + + // bushes (bush) + ['hs', 2, true, true, 'shes'], + + // teeth (tooth) + ['htoot', 5, true, true, 'teeth'], + + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['mu', 2, true, true, 'a'], + + // men (man), women (woman) + ['nam', 3, true, true, 'men'], + + // people (person) + ['nosrep', 6, true, true, ['persons', 'people']], + + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['noi', 3, true, true, 'ions'], + + // seasons (season), treasons (treason), poisons (poison), lessons (lesson) + ['nos', 3, true, true, 'sons'], + + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['no', 2, true, true, 'a'], + + // echoes (echo) + ['ohce', 4, true, true, 'echoes'], + + // heroes (hero) + ['oreh', 4, true, true, 'heroes'], + + // atlases (atlas) + ['salta', 5, true, true, 'atlases'], + + // irises (iris) + ['siri', 4, true, true, 'irises'], + + // analyses (analysis), ellipses (ellipsis), neuroses (neurosis) + // theses (thesis), emphases (emphasis), oases (oasis), + // crises (crisis) + ['sis', 3, true, true, 'ses'], + + // accesses (access), addresses (address), kisses (kiss) + ['ss', 2, true, false, 'sses'], + + // syllabi (syllabus) + ['suballys', 8, true, true, 'syllabi'], + + // buses (bus) + ['sub', 3, true, true, 'buses'], + + // circuses (circus) + ['suc', 3, true, true, 'cuses'], + + // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) + ['su', 2, true, true, 'i'], + + // news (news) + ['swen', 4, true, true, 'news'], + + // feet (foot) + ['toof', 4, true, true, 'feet'], + + // chateaux (chateau), bureaus (bureau) + ['uae', 3, false, true, ['eaus', 'eaux']], + + // oxen (ox) + ['xo', 2, false, false, 'oxen'], + + // hoaxes (hoax) + ['xaoh', 4, true, false, 'hoaxes'], + + // indices (index) + ['xedni', 5, false, true, ['indicies', 'indexes']], + + // boxes (box) + ['xo', 2, false, true, 'oxes'], + + // indexes (index), matrixes (matrix) + ['x', 1, true, false, ['cies', 'xes']], + + // appendices (appendix) + ['xi', 2, false, true, 'ices'], + + // babies (baby) + ['y', 1, false, true, 'ies'], + + // quizzes (quiz) + ['ziuq', 4, true, false, 'quizzes'], + + // waltzes (waltz) + ['z', 1, true, true, 'zes'], + ]; + + /** + * A list of words which should not be inflected, reversed. + */ + private static $uninflected = [ + 'atad', + 'reed', + 'kcabdeef', + 'hsif', + 'ofni', + 'esoom', + 'seires', + 'peehs', + 'seiceps', + ]; + + /** + * {@inheritdoc} + */ + public function singularize(string $plural): array + { + $pluralRev = strrev($plural); + $lowerPluralRev = strtolower($pluralRev); + $pluralLength = \strlen($lowerPluralRev); + + // Check if the word is one which is not inflected, return early if so + if (\in_array($lowerPluralRev, self::$uninflected, true)) { + return [$plural]; + } + + // The outer loop iterates over the entries of the plural table + // The inner loop $j iterates over the characters of the plural suffix + // in the plural table to compare them with the characters of the actual + // given plural suffix + foreach (self::$pluralMap as $map) { + $suffix = $map[0]; + $suffixLength = $map[1]; + $j = 0; + + // Compare characters in the plural table and of the suffix of the + // given plural one by one + while ($suffix[$j] === $lowerPluralRev[$j]) { + // Let $j point to the next character + ++$j; + + // Successfully compared the last character + // Add an entry with the singular suffix to the singular array + if ($j === $suffixLength) { + // Is there any character preceding the suffix in the plural string? + if ($j < $pluralLength) { + $nextIsVocal = false !== strpos('aeiou', $lowerPluralRev[$j]); + + if (!$map[2] && $nextIsVocal) { + // suffix may not succeed a vocal but next char is one + break; + } + + if (!$map[3] && !$nextIsVocal) { + // suffix may not succeed a consonant but next char is one + break; + } + } + + $newBase = substr($plural, 0, $pluralLength - $suffixLength); + $newSuffix = $map[4]; + + // Check whether the first character in the plural suffix + // is uppercased. If yes, uppercase the first character in + // the singular suffix too + $firstUpper = ctype_upper($pluralRev[$j - 1]); + + if (\is_array($newSuffix)) { + $singulars = []; + + foreach ($newSuffix as $newSuffixEntry) { + $singulars[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry); + } + + return $singulars; + } + + return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)]; + } + + // Suffix is longer than word + if ($j === $pluralLength) { + break; + } + } + } + + // Assume that plural and singular is identical + return [$plural]; + } + + /** + * {@inheritdoc} + */ + public function pluralize(string $singular): array + { + $singularRev = strrev($singular); + $lowerSingularRev = strtolower($singularRev); + $singularLength = \strlen($lowerSingularRev); + + // Check if the word is one which is not inflected, return early if so + if (\in_array($lowerSingularRev, self::$uninflected, true)) { + return [$singular]; + } + + // The outer loop iterates over the entries of the singular table + // The inner loop $j iterates over the characters of the singular suffix + // in the singular table to compare them with the characters of the actual + // given singular suffix + foreach (self::$singularMap as $map) { + $suffix = $map[0]; + $suffixLength = $map[1]; + $j = 0; + + // Compare characters in the singular table and of the suffix of the + // given plural one by one + + while ($suffix[$j] === $lowerSingularRev[$j]) { + // Let $j point to the next character + ++$j; + + // Successfully compared the last character + // Add an entry with the plural suffix to the plural array + if ($j === $suffixLength) { + // Is there any character preceding the suffix in the plural string? + if ($j < $singularLength) { + $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]); + + if (!$map[2] && $nextIsVocal) { + // suffix may not succeed a vocal but next char is one + break; + } + + if (!$map[3] && !$nextIsVocal) { + // suffix may not succeed a consonant but next char is one + break; + } + } + + $newBase = substr($singular, 0, $singularLength - $suffixLength); + $newSuffix = $map[4]; + + // Check whether the first character in the singular suffix + // is uppercased. If yes, uppercase the first character in + // the singular suffix too + $firstUpper = ctype_upper($singularRev[$j - 1]); + + if (\is_array($newSuffix)) { + $plurals = []; + + foreach ($newSuffix as $newSuffixEntry) { + $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry); + } + + return $plurals; + } + + return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)]; + } + + // Suffix is longer than word + if ($j === $singularLength) { + break; + } + } + } + + // Assume that plural is singular with a trailing `s` + return [$singular.'s']; + } +} diff --git a/vendor/symfony/string/Inflector/InflectorInterface.php b/vendor/symfony/string/Inflector/InflectorInterface.php new file mode 100644 index 0000000..ad78070 --- /dev/null +++ b/vendor/symfony/string/Inflector/InflectorInterface.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Inflector; + +interface InflectorInterface +{ + /** + * Returns the singular forms of a string. + * + * If the method can't determine the form with certainty, several possible singulars are returned. + * + * @return string[] An array of possible singular forms + */ + public function singularize(string $plural): array; + + /** + * Returns the plural forms of a string. + * + * If the method can't determine the form with certainty, several possible plurals are returned. + * + * @return string[] An array of possible plural forms + */ + public function pluralize(string $singular): array; +} diff --git a/vendor/symfony/string/LICENSE b/vendor/symfony/string/LICENSE new file mode 100644 index 0000000..4bf0fef --- /dev/null +++ b/vendor/symfony/string/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2019-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/string/LazyString.php b/vendor/symfony/string/LazyString.php new file mode 100644 index 0000000..9b9c667 --- /dev/null +++ b/vendor/symfony/string/LazyString.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +/** + * A string whose value is computed lazily by a callback. + * + * @author Nicolas Grekas + */ +class LazyString implements \Stringable, \JsonSerializable +{ + private $value; + + /** + * @param callable|array $callback A callable or a [Closure, method] lazy-callable + * + * @return static + */ + public static function fromCallable($callback, ...$arguments): self + { + if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, get_debug_type($callback))); + } + + $lazyString = new static(); + $lazyString->value = static function () use (&$callback, &$arguments, &$value): string { + if (null !== $arguments) { + if (!\is_callable($callback)) { + $callback[0] = $callback[0](); + $callback[1] = $callback[1] ?? '__invoke'; + } + $value = $callback(...$arguments); + $callback = self::getPrettyName($callback); + $arguments = null; + } + + return $value ?? ''; + }; + + return $lazyString; + } + + /** + * @param string|int|float|bool|\Stringable $value + * + * @return static + */ + public static function fromStringable($value): self + { + if (!self::isStringable($value)) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a scalar or a stringable object, "%s" given.', __METHOD__, get_debug_type($value))); + } + + if (\is_object($value)) { + return static::fromCallable([$value, '__toString']); + } + + $lazyString = new static(); + $lazyString->value = (string) $value; + + return $lazyString; + } + + /** + * Tells whether the provided value can be cast to string. + */ + final public static function isStringable($value): bool + { + return \is_string($value) || $value instanceof self || (\is_object($value) ? method_exists($value, '__toString') : is_scalar($value)); + } + + /** + * Casts scalars and stringable objects to strings. + * + * @param object|string|int|float|bool $value + * + * @throws \TypeError When the provided value is not stringable + */ + final public static function resolve($value): string + { + return $value; + } + + /** + * @return string + */ + public function __toString() + { + if (\is_string($this->value)) { + return $this->value; + } + + try { + return $this->value = ($this->value)(); + } catch (\Throwable $e) { + if (\TypeError::class === \get_class($e) && __FILE__ === $e->getFile()) { + $type = explode(', ', $e->getMessage()); + $type = substr(array_pop($type), 0, -\strlen(' returned')); + $r = new \ReflectionFunction($this->value); + $callback = $r->getStaticVariables()['callback']; + + $e = new \TypeError(sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type)); + } + + if (\PHP_VERSION_ID < 70400) { + // leverage the ErrorHandler component with graceful fallback when it's not available + return trigger_error($e, E_USER_ERROR); + } + + throw $e; + } + } + + public function __sleep(): array + { + $this->__toString(); + + return ['value']; + } + + public function jsonSerialize(): string + { + return $this->__toString(); + } + + private function __construct() + { + } + + private static function getPrettyName(callable $callback): string + { + if (\is_string($callback)) { + return $callback; + } + + if (\is_array($callback)) { + $class = \is_object($callback[0]) ? get_debug_type($callback[0]) : $callback[0]; + $method = $callback[1]; + } elseif ($callback instanceof \Closure) { + $r = new \ReflectionFunction($callback); + + if (false !== strpos($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) { + return $r->name; + } + + $class = $class->name; + $method = $r->name; + } else { + $class = get_debug_type($callback); + $method = '__invoke'; + } + + return $class.'::'.$method; + } +} diff --git a/vendor/symfony/string/README.md b/vendor/symfony/string/README.md new file mode 100644 index 0000000..23ad86a --- /dev/null +++ b/vendor/symfony/string/README.md @@ -0,0 +1,14 @@ +String Component +================ + +The String component provides an object-oriented API to strings and deals +with bytes, UTF-8 code points and grapheme clusters in a unified way. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/string.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/string/Resources/data/wcswidth_table_wide.php b/vendor/symfony/string/Resources/data/wcswidth_table_wide.php new file mode 100644 index 0000000..e3a41cd --- /dev/null +++ b/vendor/symfony/string/Resources/data/wcswidth_table_wide.php @@ -0,0 +1,1119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +function u(string $string = ''): UnicodeString +{ + return new UnicodeString($string); +} + +function b(string $string = ''): ByteString +{ + return new ByteString($string); +} + +/** + * @return UnicodeString|ByteString + */ +function s(string $string): AbstractString +{ + return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string); +} diff --git a/vendor/symfony/string/Slugger/AsciiSlugger.php b/vendor/symfony/string/Slugger/AsciiSlugger.php new file mode 100644 index 0000000..0fb4c9b --- /dev/null +++ b/vendor/symfony/string/Slugger/AsciiSlugger.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Slugger; + +use Symfony\Component\String\AbstractUnicodeString; +use Symfony\Component\String\UnicodeString; +use Symfony\Contracts\Translation\LocaleAwareInterface; + +/** + * @author Titouan Galopin + */ +class AsciiSlugger implements SluggerInterface, LocaleAwareInterface +{ + private const LOCALE_TO_TRANSLITERATOR_ID = [ + 'am' => 'Amharic-Latin', + 'ar' => 'Arabic-Latin', + 'az' => 'Azerbaijani-Latin', + 'be' => 'Belarusian-Latin', + 'bg' => 'Bulgarian-Latin', + 'bn' => 'Bengali-Latin', + 'de' => 'de-ASCII', + 'el' => 'Greek-Latin', + 'fa' => 'Persian-Latin', + 'he' => 'Hebrew-Latin', + 'hy' => 'Armenian-Latin', + 'ka' => 'Georgian-Latin', + 'kk' => 'Kazakh-Latin', + 'ky' => 'Kirghiz-Latin', + 'ko' => 'Korean-Latin', + 'mk' => 'Macedonian-Latin', + 'mn' => 'Mongolian-Latin', + 'or' => 'Oriya-Latin', + 'ps' => 'Pashto-Latin', + 'ru' => 'Russian-Latin', + 'sr' => 'Serbian-Latin', + 'sr_Cyrl' => 'Serbian-Latin', + 'th' => 'Thai-Latin', + 'tk' => 'Turkmen-Latin', + 'uk' => 'Ukrainian-Latin', + 'uz' => 'Uzbek-Latin', + 'zh' => 'Han-Latin', + ]; + + private $defaultLocale; + private $symbolsMap = [ + 'en' => ['@' => 'at', '&' => 'and'], + ]; + + /** + * Cache of transliterators per locale. + * + * @var \Transliterator[] + */ + private $transliterators = []; + + public function __construct(string $defaultLocale = null, array $symbolsMap = null) + { + $this->defaultLocale = $defaultLocale; + $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; + } + + /** + * {@inheritdoc} + */ + public function setLocale($locale) + { + $this->defaultLocale = $locale; + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->defaultLocale; + } + + /** + * {@inheritdoc} + */ + public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString + { + $locale = $locale ?? $this->defaultLocale; + + $transliterator = []; + if ('de' === $locale || 0 === strpos($locale, 'de_')) { + // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl) + $transliterator = ['de-ASCII']; + } elseif (\function_exists('transliterator_transliterate') && $locale) { + $transliterator = (array) $this->createTransliterator($locale); + } + + $unicodeString = (new UnicodeString($string))->ascii($transliterator); + + if (isset($this->symbolsMap[$locale])) { + foreach ($this->symbolsMap[$locale] as $char => $replace) { + $unicodeString = $unicodeString->replace($char, ' '.$replace.' '); + } + } + + return $unicodeString + ->replaceMatches('/[^A-Za-z0-9]++/', $separator) + ->trim($separator) + ; + } + + private function createTransliterator(string $locale): ?\Transliterator + { + if (\array_key_exists($locale, $this->transliterators)) { + return $this->transliterators[$locale]; + } + + // Exact locale supported, cache and return + if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) { + return $this->transliterators[$locale] = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id); + } + + // Locale not supported and no parent, fallback to any-latin + if (false === $str = strrchr($locale, '_')) { + return $this->transliterators[$locale] = null; + } + + // Try to use the parent locale (ie. try "de" for "de_AT") and cache both locales + $parent = substr($locale, 0, -\strlen($str)); + + if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) { + $transliterator = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id); + } + + return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null; + } +} diff --git a/vendor/symfony/string/Slugger/SluggerInterface.php b/vendor/symfony/string/Slugger/SluggerInterface.php new file mode 100644 index 0000000..c679ed9 --- /dev/null +++ b/vendor/symfony/string/Slugger/SluggerInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String\Slugger; + +use Symfony\Component\String\AbstractUnicodeString; + +/** + * Creates a URL-friendly slug from a given string. + * + * @author Titouan Galopin + */ +interface SluggerInterface +{ + /** + * Creates a slug for the given string and locale, using appropriate transliteration when needed. + */ + public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString; +} diff --git a/vendor/symfony/string/UnicodeString.php b/vendor/symfony/string/UnicodeString.php new file mode 100644 index 0000000..7a81ac6 --- /dev/null +++ b/vendor/symfony/string/UnicodeString.php @@ -0,0 +1,361 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\String; + +use Symfony\Component\String\Exception\ExceptionInterface; +use Symfony\Component\String\Exception\InvalidArgumentException; + +/** + * Represents a string of Unicode grapheme clusters encoded as UTF-8. + * + * A letter followed by combining characters (accents typically) form what Unicode defines + * as a grapheme cluster: a character as humans mean it in written texts. This class knows + * about the concept and won't split a letter apart from its combining accents. It also + * ensures all string comparisons happen on their canonically-composed representation, + * ignoring e.g. the order in which accents are listed when a letter has many of them. + * + * @see https://unicode.org/reports/tr15/ + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +class UnicodeString extends AbstractUnicodeString +{ + public function __construct(string $string = '') + { + $this->string = normalizer_is_normalized($string) ? $string : normalizer_normalize($string); + + if (false === $this->string) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + } + + public function append(string ...$suffix): AbstractString + { + $str = clone $this; + $str->string = $this->string.(1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix)); + normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); + + if (false === $str->string) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + return $str; + } + + public function chunk(int $length = 1): array + { + if (1 > $length) { + throw new InvalidArgumentException('The chunk length must be greater than zero.'); + } + + if ('' === $this->string) { + return []; + } + + $rx = '/('; + while (65535 < $length) { + $rx .= '\X{65535}'; + $length -= 65535; + } + $rx .= '\X{'.$length.'})/u'; + + $str = clone $this; + $chunks = []; + + foreach (preg_split($rx, $this->string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $chunk) { + $str->string = $chunk; + $chunks[] = clone $str; + } + + return $chunks; + } + + public function endsWith($suffix): bool + { + if ($suffix instanceof AbstractString) { + $suffix = $suffix->string; + } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { + return parent::endsWith($suffix); + } else { + $suffix = (string) $suffix; + } + + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + normalizer_is_normalized($suffix, $form) ?: $suffix = normalizer_normalize($suffix, $form); + + if ('' === $suffix || false === $suffix) { + return false; + } + + if ($this->ignoreCase) { + return 0 === mb_stripos(grapheme_extract($this->string, \strlen($suffix), GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)), $suffix, 0, 'UTF-8'); + } + + return $suffix === grapheme_extract($this->string, \strlen($suffix), GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)); + } + + public function equalsTo($string): bool + { + if ($string instanceof AbstractString) { + $string = $string->string; + } elseif (\is_array($string) || $string instanceof \Traversable) { + return parent::equalsTo($string); + } else { + $string = (string) $string; + } + + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + normalizer_is_normalized($string, $form) ?: $string = normalizer_normalize($string, $form); + + if ('' !== $string && false !== $string && $this->ignoreCase) { + return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8'); + } + + return $string === $this->string; + } + + public function indexOf($needle, int $offset = 0): ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (\is_array($needle) || $needle instanceof \Traversable) { + return parent::indexOf($needle, $offset); + } else { + $needle = (string) $needle; + } + + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form); + + if ('' === $needle || false === $needle) { + return null; + } + + $i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset); + + return false === $i ? null : $i; + } + + public function indexOfLast($needle, int $offset = 0): ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (\is_array($needle) || $needle instanceof \Traversable) { + return parent::indexOfLast($needle, $offset); + } else { + $needle = (string) $needle; + } + + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form); + + if ('' === $needle || false === $needle) { + return null; + } + + $string = $this->string; + + if (0 > $offset) { + // workaround https://bugs.php.net/74264 + if (0 > $offset += grapheme_strlen($needle)) { + $string = grapheme_substr($string, 0, $offset); + } + $offset = 0; + } + + $i = $this->ignoreCase ? grapheme_strripos($string, $needle, $offset) : grapheme_strrpos($string, $needle, $offset); + + return false === $i ? null : $i; + } + + public function join(array $strings, string $lastGlue = null): AbstractString + { + $str = parent::join($strings, $lastGlue); + normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); + + return $str; + } + + public function length(): int + { + return grapheme_strlen($this->string); + } + + /** + * @return static + */ + public function normalize(int $form = self::NFC): parent + { + $str = clone $this; + + if (\in_array($form, [self::NFC, self::NFKC], true)) { + normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form); + } elseif (!\in_array($form, [self::NFD, self::NFKD], true)) { + throw new InvalidArgumentException('Unsupported normalization form.'); + } elseif (!normalizer_is_normalized($str->string, $form)) { + $str->string = normalizer_normalize($str->string, $form); + $str->ignoreCase = null; + } + + return $str; + } + + public function prepend(string ...$prefix): AbstractString + { + $str = clone $this; + $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string; + normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); + + if (false === $str->string) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + return $str; + } + + public function replace(string $from, string $to): AbstractString + { + $str = clone $this; + normalizer_is_normalized($from) ?: $from = normalizer_normalize($from); + + if ('' !== $from && false !== $from) { + $tail = $str->string; + $result = ''; + $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; + + while (false !== $i = $indexOf($tail, $from)) { + $slice = grapheme_substr($tail, 0, $i); + $result .= $slice.$to; + $tail = substr($tail, \strlen($slice) + \strlen($from)); + } + + $str->string = $result.$tail; + normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); + + if (false === $str->string) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + } + + return $str; + } + + public function replaceMatches(string $fromRegexp, $to): AbstractString + { + $str = parent::replaceMatches($fromRegexp, $to); + normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); + + return $str; + } + + public function slice(int $start = 0, int $length = null): AbstractString + { + $str = clone $this; + $str->string = (string) grapheme_substr($this->string, $start, $length ?? \PHP_INT_MAX); + + return $str; + } + + public function splice(string $replacement, int $start = 0, int $length = null): AbstractString + { + $str = clone $this; + $start = $start ? \strlen(grapheme_substr($this->string, 0, $start)) : 0; + $length = $length ? \strlen(grapheme_substr($this->string, $start, $length ?? \PHP_INT_MAX)) : $length; + $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); + normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string); + + if (false === $str->string) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + + return $str; + } + + public function split(string $delimiter, int $limit = null, int $flags = null): array + { + if (1 > $limit = $limit ?? \PHP_INT_MAX) { + throw new InvalidArgumentException('Split limit must be a positive integer.'); + } + + if ('' === $delimiter) { + throw new InvalidArgumentException('Split delimiter is empty.'); + } + + if (null !== $flags) { + return parent::split($delimiter.'u', $limit, $flags); + } + + normalizer_is_normalized($delimiter) ?: $delimiter = normalizer_normalize($delimiter); + + if (false === $delimiter) { + throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); + } + + $str = clone $this; + $tail = $this->string; + $chunks = []; + $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; + + while (1 < $limit && false !== $i = $indexOf($tail, $delimiter)) { + $str->string = grapheme_substr($tail, 0, $i); + $chunks[] = clone $str; + $tail = substr($tail, \strlen($str->string) + \strlen($delimiter)); + --$limit; + } + + $str->string = $tail; + $chunks[] = clone $str; + + return $chunks; + } + + public function startsWith($prefix): bool + { + if ($prefix instanceof AbstractString) { + $prefix = $prefix->string; + } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { + return parent::startsWith($prefix); + } else { + $prefix = (string) $prefix; + } + + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + normalizer_is_normalized($prefix, $form) ?: $prefix = normalizer_normalize($prefix, $form); + + if ('' === $prefix || false === $prefix) { + return false; + } + + if ($this->ignoreCase) { + return 0 === mb_stripos(grapheme_extract($this->string, \strlen($prefix), GRAPHEME_EXTR_MAXBYTES), $prefix, 0, 'UTF-8'); + } + + return $prefix === grapheme_extract($this->string, \strlen($prefix), GRAPHEME_EXTR_MAXBYTES); + } + + public function __wakeup() + { + normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string); + } + + public function __clone() + { + if (null === $this->ignoreCase) { + normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string); + } + + $this->ignoreCase = false; + } +} diff --git a/vendor/symfony/string/composer.json b/vendor/symfony/string/composer.json new file mode 100644 index 0000000..75f39c6 --- /dev/null +++ b/vendor/symfony/string/composer.json @@ -0,0 +1,45 @@ +{ + "name": "symfony/string", + "type": "library", + "description": "Symfony String component", + "keywords": ["string", "utf8", "utf-8", "grapheme", "i18n", "unicode"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\String\\": "" }, + "files": [ "Resources/functions.php" ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/translation-contracts/.gitignore b/vendor/symfony/translation-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/translation-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/translation-contracts/CHANGELOG.md b/vendor/symfony/translation-contracts/CHANGELOG.md new file mode 100644 index 0000000..e984777 --- /dev/null +++ b/vendor/symfony/translation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/master/CHANGELOG.md diff --git a/vendor/symfony/translation-contracts/LICENSE b/vendor/symfony/translation-contracts/LICENSE new file mode 100644 index 0000000..69d925b --- /dev/null +++ b/vendor/symfony/translation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/vendor/symfony/translation-contracts/LocaleAwareInterface.php new file mode 100644 index 0000000..922ec1d --- /dev/null +++ b/vendor/symfony/translation-contracts/LocaleAwareInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +interface LocaleAwareInterface +{ + /** + * Sets the current locale. + * + * @param string $locale The locale + * + * @throws \InvalidArgumentException If the locale contains invalid characters + */ + public function setLocale(string $locale); + + /** + * Returns the current locale. + * + * @return string The locale + */ + public function getLocale(); +} diff --git a/vendor/symfony/translation-contracts/README.md b/vendor/symfony/translation-contracts/README.md new file mode 100644 index 0000000..6c693ce --- /dev/null +++ b/vendor/symfony/translation-contracts/README.md @@ -0,0 +1,9 @@ +Symfony Translation Contracts +============================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/master/README.md for more information. diff --git a/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/vendor/symfony/translation-contracts/Test/TranslatorTest.php new file mode 100644 index 0000000..5bfb0f8 --- /dev/null +++ b/vendor/symfony/translation-contracts/Test/TranslatorTest.php @@ -0,0 +1,353 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation\Test; + +use PHPUnit\Framework\TestCase; +use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorTrait; + +/** + * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms + * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms. + * + * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. + * The mozilla code is also interesting to check for. + * + * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199 + * + * The goal to cover all languages is to far fetched so this test case is smaller. + * + * @author Clemens Tolboom clemens@build2be.nl + */ +class TranslatorTest extends TestCase +{ + public function getTranslator() + { + return new class() implements TranslatorInterface { + use TranslatorTrait; + }; + } + + /** + * @dataProvider getTransTests + */ + public function testTrans($expected, $id, $parameters) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, $parameters)); + } + + /** + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithExplicitLocale($expected, $id, $number) + { + $translator = $this->getTranslator(); + $translator->setLocale('en'); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); + } + + /** + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithDefaultLocale($expected, $id, $number) + { + \Locale::setDefault('en'); + + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); + } + + public function testGetSetLocale() + { + $translator = $this->getTranslator(); + $translator->setLocale('en'); + + $this->assertEquals('en', $translator->getLocale()); + } + + /** + * @requires extension intl + */ + public function testGetLocaleReturnsDefaultLocaleIfNotSet() + { + $translator = $this->getTranslator(); + + \Locale::setDefault('pt_BR'); + $this->assertEquals('pt_BR', $translator->getLocale()); + + \Locale::setDefault('en'); + $this->assertEquals('en', $translator->getLocale()); + } + + public function getTransTests() + { + return [ + ['Symfony is great!', 'Symfony is great!', []], + ['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']], + ]; + } + + public function getTransChoiceTests() + { + return [ + ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], + ['There are 0 apples', 'There is 1 apple|There are %count% apples', 0], + ['There is 1 apple', 'There is 1 apple|There are %count% apples', 1], + ['There are 10 apples', 'There is 1 apple|There are %count% apples', 10], + // custom validation messages may be coded with a fixed value + ['There are 2 apples', 'There are 2 apples', 2], + ]; + } + + /** + * @dataProvider getInternal + */ + public function testInterval($expected, $number, $interval) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($interval.' foo|[1,Inf[ bar', ['%count%' => $number])); + } + + public function getInternal() + { + return [ + ['foo', 3, '{1,2, 3 ,4}'], + ['bar', 10, '{1,2, 3 ,4}'], + ['bar', 3, '[1,2]'], + ['foo', 1, '[1,2]'], + ['foo', 2, '[1,2]'], + ['bar', 1, ']1,2['], + ['bar', 2, ']1,2['], + ['foo', log(0), '[-Inf,2['], + ['foo', -log(0), '[-2,+Inf]'], + ]; + } + + /** + * @dataProvider getChooseTests + */ + public function testChoose($expected, $id, $number) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); + } + + public function testReturnMessageIfExactlyOneStandardRuleIsGiven() + { + $translator = $this->getTranslator(); + + $this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2])); + } + + /** + * @dataProvider getNonMatchingMessages + */ + public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number) + { + $this->expectException('InvalidArgumentException'); + $translator = $this->getTranslator(); + + $translator->trans($id, ['%count%' => $number]); + } + + public function getNonMatchingMessages() + { + return [ + ['{0} There are no apples|{1} There is one apple', 2], + ['{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['{1} There is one apple|]2,Inf] There are %count% apples', 2], + ['{0} There are no apples|There is one apple', 2], + ]; + } + + public function getChooseTests() + { + return [ + ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + + ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], + + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10], + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], + + ['There are 0 apples', 'There is one apple|There are %count% apples', 0], + ['There is one apple', 'There is one apple|There are %count% apples', 1], + ['There are 10 apples', 'There is one apple|There are %count% apples', 10], + + ['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0], + ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1], + ['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10], + + ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0], + ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1], + ['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10], + + ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1], + + // Indexed only tests which are Gettext PoFile* compatible strings. + ['There are 0 apples', 'There is one apple|There are %count% apples', 0], + ['There is one apple', 'There is one apple|There are %count% apples', 1], + ['There are 2 apples', 'There is one apple|There are %count% apples', 2], + + // Tests for float numbers + ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7], + ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1], + ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7], + ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], + ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0], + ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], + + // Test texts with new-lines + // with double-quotes and \n in id & double-quotes and actual newlines in text + ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 0], + // with double-quotes and \n in id and single-quotes and actual newlines in text + ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 1], + ["This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 5], + // with double-quotes and id split accros lines + ['This is a text with a + new-line in it. Selector = 1.', '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 1], + // with single-quotes and id split accros lines + ['This is a text with a + new-line in it. Selector > 1.', '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 5], + // with single-quotes and \n in text + ['This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0], + // with double-quotes and id split accros lines + ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1], + // esacape pipe + ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0], + // Empty plural set (2 plural forms) from a .PO file + ['', '|', 1], + // Empty plural set (3 plural forms) from a .PO file + ['', '||', 1], + ]; + } + + /** + * @dataProvider failingLangcodes + */ + public function testFailedLangcodes($nplural, $langCodes) + { + $matrix = $this->generateTestData($langCodes); + $this->validateMatrix($nplural, $matrix, false); + } + + /** + * @dataProvider successLangcodes + */ + public function testLangcodes($nplural, $langCodes) + { + $matrix = $this->generateTestData($langCodes); + $this->validateMatrix($nplural, $matrix); + } + + /** + * This array should contain all currently known langcodes. + * + * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. + * + * @return array + */ + public function successLangcodes() + { + return [ + ['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], + ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM']], + ['3', ['be', 'bs', 'cs', 'hr']], + ['4', ['cy', 'mt', 'sl']], + ['6', ['ar']], + ]; + } + + /** + * This array should be at least empty within the near future. + * + * This both depends on a complete list trying to add above as understanding + * the plural rules of the current failing languages. + * + * @return array with nplural together with langcodes + */ + public function failingLangcodes() + { + return [ + ['1', ['fa']], + ['2', ['jbo']], + ['3', ['cbs']], + ['4', ['gd', 'kw']], + ['5', ['ga']], + ]; + } + + /** + * We validate only on the plural coverage. Thus the real rules is not tested. + * + * @param string $nplural Plural expected + * @param array $matrix Containing langcodes and their plural index values + * @param bool $expectSuccess + */ + protected function validateMatrix($nplural, $matrix, $expectSuccess = true) + { + foreach ($matrix as $langCode => $data) { + $indexes = array_flip($data); + if ($expectSuccess) { + $this->assertEquals($nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); + } else { + $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); + } + } + } + + protected function generateTestData($langCodes) + { + $translator = new class() { + use TranslatorTrait { + getPluralizationRule as public; + } + }; + + $matrix = []; + foreach ($langCodes as $langCode) { + for ($count = 0; $count < 200; ++$count) { + $plural = $translator->getPluralizationRule($count, $langCode); + $matrix[$langCode][$count] = $plural; + } + } + + return $matrix; + } +} diff --git a/vendor/symfony/translation-contracts/TranslatorInterface.php b/vendor/symfony/translation-contracts/TranslatorInterface.php new file mode 100644 index 0000000..b62df5e --- /dev/null +++ b/vendor/symfony/translation-contracts/TranslatorInterface.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +/** + * @author Fabien Potencier + */ +interface TranslatorInterface +{ + /** + * Translates the given message. + * + * When a number is provided as a parameter named "%count%", the message is parsed for plural + * forms and a translation is chosen according to this number using the following rules: + * + * Given a message with different plural translations separated by a + * pipe (|), this method returns the correct portion of the message based + * on the given number, locale and the pluralization rules in the message + * itself. + * + * The message supports two different types of pluralization rules: + * + * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples + * indexed: There is one apple|There are %count% apples + * + * The indexed solution can also contain labels (e.g. one: There is one apple). + * This is purely for making the translations more clear - it does not + * affect the functionality. + * + * The two methods can also be mixed: + * {0} There are no apples|one: There is one apple|more: There are %count% apples + * + * An interval can represent a finite set of numbers: + * {1,2,3,4} + * + * An interval can represent numbers between two numbers: + * [1, +Inf] + * ]-1,2[ + * + * The left delimiter can be [ (inclusive) or ] (exclusive). + * The right delimiter can be [ (exclusive) or ] (inclusive). + * Beside numbers, you can use -Inf and +Inf for the infinite. + * + * @see https://en.wikipedia.org/wiki/ISO_31-11 + * + * @param string $id The message id (may also be an object that can be cast to string) + * @param array $parameters An array of parameters for the message + * @param string|null $domain The domain for the message or null to use the default + * @param string|null $locale The locale or null to use the default + * + * @return string The translated string + * + * @throws \InvalidArgumentException If the locale contains invalid characters + */ + public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null); +} diff --git a/vendor/symfony/translation-contracts/TranslatorTrait.php b/vendor/symfony/translation-contracts/TranslatorTrait.php new file mode 100644 index 0000000..f81637a --- /dev/null +++ b/vendor/symfony/translation-contracts/TranslatorTrait.php @@ -0,0 +1,257 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * A trait to help implement TranslatorInterface and LocaleAwareInterface. + * + * @author Fabien Potencier + */ +trait TranslatorTrait +{ + private $locale; + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $this->locale = $locale; + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->locale ?: \Locale::getDefault(); + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + { + if (null === $id || '' === $id) { + return ''; + } + + if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) { + return strtr($id, $parameters); + } + + $number = (float) $parameters['%count%']; + $locale = $locale ?: $this->getLocale(); + + $parts = []; + if (preg_match('/^\|++$/', $id)) { + $parts = explode('|', $id); + } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { + $parts = $matches[0]; + } + + $intervalRegexp = <<<'EOF' +/^(?P + ({\s* + (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) + \s*}) + + | + + (?P[\[\]]) + \s* + (?P-Inf|\-?\d+(\.\d+)?) + \s*,\s* + (?P\+?Inf|\-?\d+(\.\d+)?) + \s* + (?P[\[\]]) +)\s*(?P.*?)$/xs +EOF; + + $standardRules = []; + foreach ($parts as $part) { + $part = trim(str_replace('||', '|', $part)); + + // try to match an explicit rule, then fallback to the standard ones + if (preg_match($intervalRegexp, $part, $matches)) { + if ($matches[2]) { + foreach (explode(',', $matches[3]) as $n) { + if ($number == $n) { + return strtr($matches['message'], $parameters); + } + } + } else { + $leftNumber = '-Inf' === $matches['left'] ? -INF : (float) $matches['left']; + $rightNumber = is_numeric($matches['right']) ? (float) $matches['right'] : INF; + + if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) + && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber) + ) { + return strtr($matches['message'], $parameters); + } + } + } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) { + $standardRules[] = $matches[1]; + } else { + $standardRules[] = $part; + } + } + + $position = $this->getPluralizationRule($number, $locale); + + if (!isset($standardRules[$position])) { + // when there's exactly one rule given, and that rule is a standard + // rule, use this rule + if (1 === \count($parts) && isset($standardRules[0])) { + return strtr($standardRules[0], $parameters); + } + + $message = sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); + + if (class_exists(InvalidArgumentException::class)) { + throw new InvalidArgumentException($message); + } + + throw new \InvalidArgumentException($message); + } + + return strtr($standardRules[$position], $parameters); + } + + /** + * Returns the plural position to use for the given locale and number. + * + * The plural rules are derived from code of the Zend Framework (2010-09-25), + * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd). + * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + */ + private function getPluralizationRule(int $number, string $locale): int + { + switch ('pt_BR' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) { + case 'af': + case 'bn': + case 'bg': + case 'ca': + case 'da': + case 'de': + case 'el': + case 'en': + case 'eo': + case 'es': + case 'et': + case 'eu': + case 'fa': + case 'fi': + case 'fo': + case 'fur': + case 'fy': + case 'gl': + case 'gu': + case 'ha': + case 'he': + case 'hu': + case 'is': + case 'it': + case 'ku': + case 'lb': + case 'ml': + case 'mn': + case 'mr': + case 'nah': + case 'nb': + case 'ne': + case 'nl': + case 'nn': + case 'no': + case 'oc': + case 'om': + case 'or': + case 'pa': + case 'pap': + case 'ps': + case 'pt': + case 'so': + case 'sq': + case 'sv': + case 'sw': + case 'ta': + case 'te': + case 'tk': + case 'ur': + case 'zu': + return (1 == $number) ? 0 : 1; + + case 'am': + case 'bh': + case 'fil': + case 'fr': + case 'gun': + case 'hi': + case 'hy': + case 'ln': + case 'mg': + case 'nso': + case 'pt_BR': + case 'ti': + case 'wa': + return ((0 == $number) || (1 == $number)) ? 0 : 1; + + case 'be': + case 'bs': + case 'hr': + case 'ru': + case 'sh': + case 'sr': + case 'uk': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'cs': + case 'sk': + return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); + + case 'ga': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2); + + case 'lt': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'sl': + return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)); + + case 'mk': + return (1 == $number % 10) ? 0 : 1; + + case 'mt': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); + + case 'lv': + return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2); + + case 'pl': + return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2); + + case 'cy': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)); + + case 'ro': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); + + case 'ar': + return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); + + default: + return 0; + } + } +} diff --git a/vendor/symfony/translation-contracts/composer.json b/vendor/symfony/translation-contracts/composer.json new file mode 100644 index 0000000..da97f05 --- /dev/null +++ b/vendor/symfony/translation-contracts/composer.json @@ -0,0 +1,33 @@ +{ + "name": "symfony/translation-contracts", + "type": "library", + "description": "Generic abstractions related to translation", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\Translation\\": "" } + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + } +} diff --git a/vendor/symfony/translation/CHANGELOG.md b/vendor/symfony/translation/CHANGELOG.md new file mode 100644 index 0000000..e2930a4 --- /dev/null +++ b/vendor/symfony/translation/CHANGELOG.md @@ -0,0 +1,153 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added support for `name` attribute on `unit` element from xliff2 to be used as a translation key instead of always the `source` element + +5.0.0 +----- + + * removed support for using `null` as the locale in `Translator` + * removed `TranslatorInterface` + * removed `MessageSelector` + * removed `ChoiceMessageFormatterInterface` + * removed `PluralizationRule` + * removed `Interval` + * removed `transChoice()` methods, use the trans() method instead with a %count% parameter + * removed `FileDumper::setBackup()` and `TranslationWriter::disableBackup()` + * removed `MessageFormatter::choiceFormat()` + * added argument `$filename` to `PhpExtractor::parseTokens()` + * removed support for implicit STDIN usage in the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit. + +4.4.0 +----- + + * deprecated support for using `null` as the locale in `Translator` + * deprecated accepting STDIN implicitly when using the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit. + * Marked the `TranslationDataCollector` class as `@final`. + +4.3.0 +----- + + * Improved Xliff 1.2 loader to load the original file's metadata + * Added `TranslatorPathsPass` + +4.2.0 +----- + + * Started using ICU parent locales as fallback locales. + * allow using the ICU message format using domains with the "+intl-icu" suffix + * deprecated `Translator::transChoice()` in favor of using `Translator::trans()` with a `%count%` parameter + * deprecated `TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface` + * deprecated `MessageSelector`, `Interval` and `PluralizationRules`; use `IdentityTranslator` instead + * Added `IntlFormatter` and `IntlFormatterInterface` + * added support for multiple files and directories in `XliffLintCommand` + * Marked `Translator::getFallbackLocales()` and `TranslationDataCollector::getFallbackLocales()` as internal + +4.1.0 +----- + + * The `FileDumper::setBackup()` method is deprecated. + * The `TranslationWriter::disableBackup()` method is deprecated. + * The `XliffFileDumper` will write "name" on the "unit" node when dumping XLIFF 2.0. + +4.0.0 +----- + + * removed the backup feature of the `FileDumper` class + * removed `TranslationWriter::writeTranslations()` method + * removed support for passing `MessageSelector` instances to the constructor of the `Translator` class + +3.4.0 +----- + + * Added `TranslationDumperPass` + * Added `TranslationExtractorPass` + * Added `TranslatorPass` + * Added `TranslationReader` and `TranslationReaderInterface` + * Added `` section to the Xliff 2.0 dumper. + * Improved Xliff 2.0 loader to load `` section. + * Added `TranslationWriterInterface` + * Deprecated `TranslationWriter::writeTranslations` in favor of `TranslationWriter::write` + * added support for adding custom message formatter and decoupling the default one. + * Added `PhpExtractor` + * Added `PhpStringTokenParser` + +3.2.0 +----- + + * Added support for escaping `|` in plural translations with double pipe. + +3.1.0 +----- + + * Deprecated the backup feature of the file dumper classes. + +3.0.0 +----- + + * removed `FileDumper::format()` method. + * Changed the visibility of the locale property in `Translator` from protected to private. + +2.8.0 +----- + + * deprecated FileDumper::format(), overwrite FileDumper::formatCatalogue() instead. + * deprecated Translator::getMessages(), rely on TranslatorBagInterface::getCatalogue() instead. + * added `FileDumper::formatCatalogue` which allows format the catalogue without dumping it into file. + * added option `json_encoding` to JsonFileDumper + * added options `as_tree`, `inline` to YamlFileDumper + * added support for XLIFF 2.0. + * added support for XLIFF target and tool attributes. + * added message parameters to DataCollectorTranslator. + * [DEPRECATION] The `DiffOperation` class has been deprecated and + will be removed in Symfony 3.0, since its operation has nothing to do with 'diff', + so the class name is misleading. The `TargetOperation` class should be used for + this use-case instead. + +2.7.0 +----- + + * added DataCollectorTranslator for collecting the translated messages. + +2.6.0 +----- + + * added possibility to cache catalogues + * added TranslatorBagInterface + * added LoggingTranslator + * added Translator::getMessages() for retrieving the message catalogue as an array + +2.5.0 +----- + + * added relative file path template to the file dumpers + * added optional backup to the file dumpers + * changed IcuResFileDumper to extend FileDumper + +2.3.0 +----- + + * added classes to make operations on catalogues (like making a diff or a merge on 2 catalogues) + * added Translator::getFallbackLocales() + * deprecated Translator::setFallbackLocale() in favor of the new Translator::setFallbackLocales() method + +2.2.0 +----- + + * QtTranslationsLoader class renamed to QtFileLoader. QtTranslationsLoader is deprecated and will be removed in 2.3. + * [BC BREAK] uniformized the exception thrown by the load() method when an error occurs. The load() method now + throws Symfony\Component\Translation\Exception\NotFoundResourceException when a resource cannot be found + and Symfony\Component\Translation\Exception\InvalidResourceException when a resource is invalid. + * changed the exception class thrown by some load() methods from \RuntimeException to \InvalidArgumentException + (IcuDatFileLoader, IcuResFileLoader and QtFileLoader) + +2.1.0 +----- + + * added support for more than one fallback locale + * added support for extracting translation messages from templates (Twig and PHP) + * added dumpers for translation catalogs + * added support for QT, gettext, and ResourceBundles diff --git a/vendor/symfony/translation/Catalogue/AbstractOperation.php b/vendor/symfony/translation/Catalogue/AbstractOperation.php new file mode 100644 index 0000000..17c257f --- /dev/null +++ b/vendor/symfony/translation/Catalogue/AbstractOperation.php @@ -0,0 +1,157 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\LogicException; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Base catalogues binary operation class. + * + * A catalogue binary operation performs operation on + * source (the left argument) and target (the right argument) catalogues. + * + * @author Jean-François Simon + */ +abstract class AbstractOperation implements OperationInterface +{ + protected $source; + protected $target; + protected $result; + + /** + * @var array|null The domains affected by this operation + */ + private $domains; + + /** + * This array stores 'all', 'new' and 'obsolete' messages for all valid domains. + * + * The data structure of this array is as follows: + * + * [ + * 'domain 1' => [ + * 'all' => [...], + * 'new' => [...], + * 'obsolete' => [...] + * ], + * 'domain 2' => [ + * 'all' => [...], + * 'new' => [...], + * 'obsolete' => [...] + * ], + * ... + * ] + * + * @var array The array that stores 'all', 'new' and 'obsolete' messages + */ + protected $messages; + + /** + * @throws LogicException + */ + public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target) + { + if ($source->getLocale() !== $target->getLocale()) { + throw new LogicException('Operated catalogues must belong to the same locale.'); + } + + $this->source = $source; + $this->target = $target; + $this->result = new MessageCatalogue($source->getLocale()); + $this->messages = []; + } + + /** + * {@inheritdoc} + */ + public function getDomains() + { + if (null === $this->domains) { + $this->domains = array_values(array_unique(array_merge($this->source->getDomains(), $this->target->getDomains()))); + } + + return $this->domains; + } + + /** + * {@inheritdoc} + */ + public function getMessages(string $domain) + { + if (!\in_array($domain, $this->getDomains())) { + throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); + } + + if (!isset($this->messages[$domain]['all'])) { + $this->processDomain($domain); + } + + return $this->messages[$domain]['all']; + } + + /** + * {@inheritdoc} + */ + public function getNewMessages(string $domain) + { + if (!\in_array($domain, $this->getDomains())) { + throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); + } + + if (!isset($this->messages[$domain]['new'])) { + $this->processDomain($domain); + } + + return $this->messages[$domain]['new']; + } + + /** + * {@inheritdoc} + */ + public function getObsoleteMessages(string $domain) + { + if (!\in_array($domain, $this->getDomains())) { + throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); + } + + if (!isset($this->messages[$domain]['obsolete'])) { + $this->processDomain($domain); + } + + return $this->messages[$domain]['obsolete']; + } + + /** + * {@inheritdoc} + */ + public function getResult() + { + foreach ($this->getDomains() as $domain) { + if (!isset($this->messages[$domain])) { + $this->processDomain($domain); + } + } + + return $this->result; + } + + /** + * Performs operation on source and target catalogues for the given domain and + * stores the results. + * + * @param string $domain The domain which the operation will be performed for + */ + abstract protected function processDomain(string $domain); +} diff --git a/vendor/symfony/translation/Catalogue/MergeOperation.php b/vendor/symfony/translation/Catalogue/MergeOperation.php new file mode 100644 index 0000000..2a23e85 --- /dev/null +++ b/vendor/symfony/translation/Catalogue/MergeOperation.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Merge operation between two catalogues as follows: + * all = source ∪ target = {x: x ∈ source ∨ x ∈ target} + * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} + * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅ + * Basically, the result contains messages from both catalogues. + * + * @author Jean-François Simon + */ +class MergeOperation extends AbstractOperation +{ + /** + * {@inheritdoc} + */ + protected function processDomain(string $domain) + { + $this->messages[$domain] = [ + 'all' => [], + 'new' => [], + 'obsolete' => [], + ]; + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + + foreach ($this->source->all($domain) as $id => $message) { + $this->messages[$domain]['all'][$id] = $message; + $this->result->add([$id => $message], $this->source->defines($id, $intlDomain) ? $intlDomain : $domain); + if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) { + $this->result->setMetadata($id, $keyMetadata, $domain); + } + } + + foreach ($this->target->all($domain) as $id => $message) { + if (!$this->source->has($id, $domain)) { + $this->messages[$domain]['all'][$id] = $message; + $this->messages[$domain]['new'][$id] = $message; + $this->result->add([$id => $message], $this->target->defines($id, $intlDomain) ? $intlDomain : $domain); + if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) { + $this->result->setMetadata($id, $keyMetadata, $domain); + } + } + } + } +} diff --git a/vendor/symfony/translation/Catalogue/OperationInterface.php b/vendor/symfony/translation/Catalogue/OperationInterface.php new file mode 100644 index 0000000..9ffac88 --- /dev/null +++ b/vendor/symfony/translation/Catalogue/OperationInterface.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Represents an operation on catalogue(s). + * + * An instance of this interface performs an operation on one or more catalogues and + * stores intermediate and final results of the operation. + * + * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and + * the following results are stored: + * + * Messages: also called 'all', are valid messages for the given domain after the operation is performed. + * + * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}). + * + * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}). + * + * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'. + * + * @author Jean-François Simon + */ +interface OperationInterface +{ + /** + * Returns domains affected by operation. + * + * @return array + */ + public function getDomains(); + + /** + * Returns all valid messages ('all') after operation. + * + * @return array + */ + public function getMessages(string $domain); + + /** + * Returns new messages ('new') after operation. + * + * @return array + */ + public function getNewMessages(string $domain); + + /** + * Returns obsolete messages ('obsolete') after operation. + * + * @return array + */ + public function getObsoleteMessages(string $domain); + + /** + * Returns resulting catalogue ('result'). + * + * @return MessageCatalogueInterface + */ + public function getResult(); +} diff --git a/vendor/symfony/translation/Catalogue/TargetOperation.php b/vendor/symfony/translation/Catalogue/TargetOperation.php new file mode 100644 index 0000000..249a521 --- /dev/null +++ b/vendor/symfony/translation/Catalogue/TargetOperation.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Target operation between two catalogues: + * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target} + * all = intersection ∪ (target ∖ intersection) = target + * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} + * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target} + * Basically, the result contains messages from the target catalogue. + * + * @author Michael Lee + */ +class TargetOperation extends AbstractOperation +{ + /** + * {@inheritdoc} + */ + protected function processDomain(string $domain) + { + $this->messages[$domain] = [ + 'all' => [], + 'new' => [], + 'obsolete' => [], + ]; + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + + // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``, + // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} + // + // For 'new' messages, the code can't be simplified as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));`` + // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback} + // + // For 'obsolete' messages, the code can't be simplified as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))`` + // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} + + foreach ($this->source->all($domain) as $id => $message) { + if ($this->target->has($id, $domain)) { + $this->messages[$domain]['all'][$id] = $message; + $this->result->add([$id => $message], $this->target->defines($id, $intlDomain) ? $intlDomain : $domain); + if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) { + $this->result->setMetadata($id, $keyMetadata, $domain); + } + } else { + $this->messages[$domain]['obsolete'][$id] = $message; + } + } + + foreach ($this->target->all($domain) as $id => $message) { + if (!$this->source->has($id, $domain)) { + $this->messages[$domain]['all'][$id] = $message; + $this->messages[$domain]['new'][$id] = $message; + $this->result->add([$id => $message], $this->target->defines($id, $intlDomain) ? $intlDomain : $domain); + if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) { + $this->result->setMetadata($id, $keyMetadata, $domain); + } + } + } + } +} diff --git a/vendor/symfony/translation/Command/XliffLintCommand.php b/vendor/symfony/translation/Command/XliffLintCommand.php new file mode 100644 index 0000000..4376804 --- /dev/null +++ b/vendor/symfony/translation/Command/XliffLintCommand.php @@ -0,0 +1,266 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Util\XliffUtils; + +/** + * Validates XLIFF files syntax and outputs encountered errors. + * + * @author Grégoire Pineau + * @author Robin Chalas + * @author Javier Eguiluz + */ +class XliffLintCommand extends Command +{ + protected static $defaultName = 'lint:xliff'; + + private $format; + private $displayCorrectFiles; + private $directoryIteratorProvider; + private $isReadableProvider; + private $requireStrictFileNames; + + public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null, bool $requireStrictFileNames = true) + { + parent::__construct($name); + + $this->directoryIteratorProvider = $directoryIteratorProvider; + $this->isReadableProvider = $isReadableProvider; + $this->requireStrictFileNames = $requireStrictFileNames; + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setDescription('Lints a XLIFF file and outputs encountered errors') + ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN') + ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt') + ->setHelp(<<%command.name% command lints a XLIFF file and outputs to STDOUT +the first encountered syntax error. + +You can validates XLIFF contents passed from STDIN: + + cat filename | php %command.full_name% - + +You can also validate the syntax of a file: + + php %command.full_name% filename + +Or of a whole directory: + + php %command.full_name% dirname + php %command.full_name% dirname --format=json + +EOF + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $io = new SymfonyStyle($input, $output); + $filenames = (array) $input->getArgument('filename'); + $this->format = $input->getOption('format'); + $this->displayCorrectFiles = $output->isVerbose(); + + if (['-'] === $filenames) { + return $this->display($io, [$this->validate(file_get_contents('php://stdin'))]); + } + + if (!$filenames) { + throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); + } + + $filesInfo = []; + foreach ($filenames as $filename) { + if (!$this->isReadable($filename)) { + throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); + } + + foreach ($this->getFiles($filename) as $file) { + $filesInfo[] = $this->validate(file_get_contents($file), $file); + } + } + + return $this->display($io, $filesInfo); + } + + private function validate(string $content, string $file = null): array + { + $errors = []; + + // Avoid: Warning DOMDocument::loadXML(): Empty string supplied as input + if ('' === trim($content)) { + return ['file' => $file, 'valid' => true]; + } + + $internal = libxml_use_internal_errors(true); + + $document = new \DOMDocument(); + $document->loadXML($content); + + if (null !== $targetLanguage = $this->getTargetLanguageFromFile($document)) { + $normalizedLocale = preg_quote(str_replace('-', '_', $targetLanguage), '/'); + // strict file names require translation files to be named '____.locale.xlf' + // otherwise, both '____.locale.xlf' and 'locale.____.xlf' are allowed + // also, the regexp matching must be case-insensitive, as defined for 'target-language' values + // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#target-language + $expectedFilenamePattern = $this->requireStrictFileNames ? sprintf('/^.*\.(?i:%s)\.(?:xlf|xliff)/', $normalizedLocale) : sprintf('/^(?:.*\.(?i:%s)|(?i:%s)\..*)\.(?:xlf|xliff)/', $normalizedLocale, $normalizedLocale); + + if (0 === preg_match($expectedFilenamePattern, basename($file))) { + $errors[] = [ + 'line' => -1, + 'column' => -1, + 'message' => sprintf('There is a mismatch between the language included in the file name ("%s") and the "%s" value used in the "target-language" attribute of the file.', basename($file), $targetLanguage), + ]; + } + } + + foreach (XliffUtils::validateSchema($document) as $xmlError) { + $errors[] = [ + 'line' => $xmlError['line'], + 'column' => $xmlError['column'], + 'message' => $xmlError['message'], + ]; + } + + libxml_clear_errors(); + libxml_use_internal_errors($internal); + + return ['file' => $file, 'valid' => 0 === \count($errors), 'messages' => $errors]; + } + + private function display(SymfonyStyle $io, array $files) + { + switch ($this->format) { + case 'txt': + return $this->displayTxt($io, $files); + case 'json': + return $this->displayJson($io, $files); + default: + throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format)); + } + } + + private function displayTxt(SymfonyStyle $io, array $filesInfo) + { + $countFiles = \count($filesInfo); + $erroredFiles = 0; + + foreach ($filesInfo as $info) { + if ($info['valid'] && $this->displayCorrectFiles) { + $io->comment('OK'.($info['file'] ? sprintf(' in %s', $info['file']) : '')); + } elseif (!$info['valid']) { + ++$erroredFiles; + $io->text(' ERROR '.($info['file'] ? sprintf(' in %s', $info['file']) : '')); + $io->listing(array_map(function ($error) { + // general document errors have a '-1' line number + return -1 === $error['line'] ? $error['message'] : sprintf('Line %d, Column %d: %s', $error['line'], $error['column'], $error['message']); + }, $info['messages'])); + } + } + + if (0 === $erroredFiles) { + $io->success(sprintf('All %d XLIFF files contain valid syntax.', $countFiles)); + } else { + $io->warning(sprintf('%d XLIFF files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles)); + } + + return min($erroredFiles, 1); + } + + private function displayJson(SymfonyStyle $io, array $filesInfo) + { + $errors = 0; + + array_walk($filesInfo, function (&$v) use (&$errors) { + $v['file'] = (string) $v['file']; + if (!$v['valid']) { + ++$errors; + } + }); + + $io->writeln(json_encode($filesInfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + + return min($errors, 1); + } + + private function getFiles(string $fileOrDirectory) + { + if (is_file($fileOrDirectory)) { + yield new \SplFileInfo($fileOrDirectory); + + return; + } + + foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) { + if (!\in_array($file->getExtension(), ['xlf', 'xliff'])) { + continue; + } + + yield $file; + } + } + + private function getDirectoryIterator(string $directory) + { + $default = function ($directory) { + return new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + }; + + if (null !== $this->directoryIteratorProvider) { + return ($this->directoryIteratorProvider)($directory, $default); + } + + return $default($directory); + } + + private function isReadable(string $fileOrDirectory) + { + $default = function ($fileOrDirectory) { + return is_readable($fileOrDirectory); + }; + + if (null !== $this->isReadableProvider) { + return ($this->isReadableProvider)($fileOrDirectory, $default); + } + + return $default($fileOrDirectory); + } + + private function getTargetLanguageFromFile(\DOMDocument $xliffContents): ?string + { + foreach ($xliffContents->getElementsByTagName('file')[0]->attributes ?? [] as $attribute) { + if ('target-language' === $attribute->nodeName) { + return $attribute->nodeValue; + } + } + + return null; + } +} diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php new file mode 100644 index 0000000..3b00429 --- /dev/null +++ b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\DataCollector\DataCollector; +use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; +use Symfony\Component\Translation\DataCollectorTranslator; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * @author Abdellatif Ait boudad + * + * @final + */ +class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface +{ + private $translator; + + public function __construct(DataCollectorTranslator $translator) + { + $this->translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function lateCollect() + { + $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages()); + + $this->data += $this->computeCount($messages); + $this->data['messages'] = $messages; + + $this->data = $this->cloneVar($this->data); + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->data['locale'] = $this->translator->getLocale(); + $this->data['fallback_locales'] = $this->translator->getFallbackLocales(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = []; + } + + /** + * @return array|Data + */ + public function getMessages() + { + return isset($this->data['messages']) ? $this->data['messages'] : []; + } + + /** + * @return int + */ + public function getCountMissings() + { + return isset($this->data[DataCollectorTranslator::MESSAGE_MISSING]) ? $this->data[DataCollectorTranslator::MESSAGE_MISSING] : 0; + } + + /** + * @return int + */ + public function getCountFallbacks() + { + return isset($this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK]) ? $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] : 0; + } + + /** + * @return int + */ + public function getCountDefines() + { + return isset($this->data[DataCollectorTranslator::MESSAGE_DEFINED]) ? $this->data[DataCollectorTranslator::MESSAGE_DEFINED] : 0; + } + + public function getLocale() + { + return !empty($this->data['locale']) ? $this->data['locale'] : null; + } + + /** + * @internal + */ + public function getFallbackLocales() + { + return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : []; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'translation'; + } + + private function sanitizeCollectedMessages(array $messages) + { + $result = []; + foreach ($messages as $key => $message) { + $messageId = $message['locale'].$message['domain'].$message['id']; + + if (!isset($result[$messageId])) { + $message['count'] = 1; + $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : []; + $messages[$key]['translation'] = $this->sanitizeString($message['translation']); + $result[$messageId] = $message; + } else { + if (!empty($message['parameters'])) { + $result[$messageId]['parameters'][] = $message['parameters']; + } + + ++$result[$messageId]['count']; + } + + unset($messages[$key]); + } + + return $result; + } + + private function computeCount(array $messages) + { + $count = [ + DataCollectorTranslator::MESSAGE_DEFINED => 0, + DataCollectorTranslator::MESSAGE_MISSING => 0, + DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0, + ]; + + foreach ($messages as $message) { + ++$count[$message['state']]; + } + + return $count; + } + + private function sanitizeString(string $string, int $length = 80) + { + $string = trim(preg_replace('/\s+/', ' ', $string)); + + if (false !== $encoding = mb_detect_encoding($string, null, true)) { + if (mb_strlen($string, $encoding) > $length) { + return mb_substr($string, 0, $length - 3, $encoding).'...'; + } + } elseif (\strlen($string) > $length) { + return substr($string, 0, $length - 3).'...'; + } + + return $string; + } +} diff --git a/vendor/symfony/translation/DataCollectorTranslator.php b/vendor/symfony/translation/DataCollectorTranslator.php new file mode 100644 index 0000000..6767a2a --- /dev/null +++ b/vendor/symfony/translation/DataCollectorTranslator.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * @author Abdellatif Ait boudad + */ +class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface, WarmableInterface +{ + const MESSAGE_DEFINED = 0; + const MESSAGE_MISSING = 1; + const MESSAGE_EQUALS_FALLBACK = 2; + + /** + * @var TranslatorInterface|TranslatorBagInterface + */ + private $translator; + + private $messages = []; + + /** + * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface + */ + public function __construct(TranslatorInterface $translator) + { + if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { + throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', get_debug_type($translator))); + } + + $this->translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) + { + $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); + $this->collectMessage($locale, $domain, $id, $trans, $parameters); + + return $trans; + } + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $this->translator->setLocale($locale); + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->translator->getLocale(); + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null) + { + return $this->translator->getCatalogue($locale); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function warmUp(string $cacheDir) + { + if ($this->translator instanceof WarmableInterface) { + return (array) $this->translator->warmUp($cacheDir); + } + + return []; + } + + /** + * Gets the fallback locales. + * + * @return array The fallback locales + */ + public function getFallbackLocales() + { + if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { + return $this->translator->getFallbackLocales(); + } + + return []; + } + + /** + * Passes through all unknown calls onto the translator object. + */ + public function __call(string $method, array $args) + { + return $this->translator->{$method}(...$args); + } + + /** + * @return array + */ + public function getCollectedMessages() + { + return $this->messages; + } + + private function collectMessage(?string $locale, ?string $domain, string $id, string $translation, ?array $parameters = []) + { + if (null === $domain) { + $domain = 'messages'; + } + + $catalogue = $this->translator->getCatalogue($locale); + $locale = $catalogue->getLocale(); + $fallbackLocale = null; + if ($catalogue->defines($id, $domain)) { + $state = self::MESSAGE_DEFINED; + } elseif ($catalogue->has($id, $domain)) { + $state = self::MESSAGE_EQUALS_FALLBACK; + + $fallbackCatalogue = $catalogue->getFallbackCatalogue(); + while ($fallbackCatalogue) { + if ($fallbackCatalogue->defines($id, $domain)) { + $fallbackLocale = $fallbackCatalogue->getLocale(); + break; + } + $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); + } + } else { + $state = self::MESSAGE_MISSING; + } + + $this->messages[] = [ + 'locale' => $locale, + 'fallbackLocale' => $fallbackLocale, + 'domain' => $domain, + 'id' => $id, + 'translation' => $translation, + 'parameters' => $parameters, + 'state' => $state, + 'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null, + ]; + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php new file mode 100644 index 0000000..930f36d --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Adds tagged translation.formatter services to translation writer. + */ +class TranslationDumperPass implements CompilerPassInterface +{ + private $writerServiceId; + private $dumperTag; + + public function __construct(string $writerServiceId = 'translation.writer', string $dumperTag = 'translation.dumper') + { + $this->writerServiceId = $writerServiceId; + $this->dumperTag = $dumperTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->writerServiceId)) { + return; + } + + $definition = $container->getDefinition($this->writerServiceId); + + foreach ($container->findTaggedServiceIds($this->dumperTag, true) as $id => $attributes) { + $definition->addMethodCall('addDumper', [$attributes[0]['alias'], new Reference($id)]); + } + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php new file mode 100644 index 0000000..d08b2ba --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Adds tagged translation.extractor services to translation extractor. + */ +class TranslationExtractorPass implements CompilerPassInterface +{ + private $extractorServiceId; + private $extractorTag; + + public function __construct(string $extractorServiceId = 'translation.extractor', string $extractorTag = 'translation.extractor') + { + $this->extractorServiceId = $extractorServiceId; + $this->extractorTag = $extractorTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->extractorServiceId)) { + return; + } + + $definition = $container->getDefinition($this->extractorServiceId); + + foreach ($container->findTaggedServiceIds($this->extractorTag, true) as $id => $attributes) { + if (!isset($attributes[0]['alias'])) { + throw new RuntimeException(sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id)); + } + + $definition->addMethodCall('addExtractor', [$attributes[0]['alias'], new Reference($id)]); + } + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php new file mode 100644 index 0000000..27315f6 --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +class TranslatorPass implements CompilerPassInterface +{ + private $translatorServiceId; + private $readerServiceId; + private $loaderTag; + private $debugCommandServiceId; + private $updateCommandServiceId; + + public function __construct(string $translatorServiceId = 'translator.default', string $readerServiceId = 'translation.reader', string $loaderTag = 'translation.loader', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_update') + { + $this->translatorServiceId = $translatorServiceId; + $this->readerServiceId = $readerServiceId; + $this->loaderTag = $loaderTag; + $this->debugCommandServiceId = $debugCommandServiceId; + $this->updateCommandServiceId = $updateCommandServiceId; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->translatorServiceId)) { + return; + } + + $loaders = []; + $loaderRefs = []; + foreach ($container->findTaggedServiceIds($this->loaderTag, true) as $id => $attributes) { + $loaderRefs[$id] = new Reference($id); + $loaders[$id][] = $attributes[0]['alias']; + if (isset($attributes[0]['legacy-alias'])) { + $loaders[$id][] = $attributes[0]['legacy-alias']; + } + } + + if ($container->hasDefinition($this->readerServiceId)) { + $definition = $container->getDefinition($this->readerServiceId); + foreach ($loaders as $id => $formats) { + foreach ($formats as $format) { + $definition->addMethodCall('addLoader', [$format, $loaderRefs[$id]]); + } + } + } + + $container + ->findDefinition($this->translatorServiceId) + ->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs)) + ->replaceArgument(3, $loaders) + ; + + if (!$container->hasParameter('twig.default_path')) { + return; + } + + $paths = array_keys($container->getDefinition('twig.template_iterator')->getArgument(1)); + if ($container->hasDefinition($this->debugCommandServiceId)) { + $definition = $container->getDefinition($this->debugCommandServiceId); + $definition->replaceArgument(4, $container->getParameter('twig.default_path')); + + if (\count($definition->getArguments()) > 6) { + $definition->replaceArgument(6, $paths); + } + } + if ($container->hasDefinition($this->updateCommandServiceId)) { + $definition = $container->getDefinition($this->updateCommandServiceId); + $definition->replaceArgument(5, $container->getParameter('twig.default_path')); + + if (\count($definition->getArguments()) > 7) { + $definition->replaceArgument(7, $paths); + } + } + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php new file mode 100644 index 0000000..04975b1 --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\ServiceLocator; + +/** + * @author Yonel Ceruto + */ +class TranslatorPathsPass extends AbstractRecursivePass +{ + private $translatorServiceId; + private $debugCommandServiceId; + private $updateCommandServiceId; + private $resolverServiceId; + private $level = 0; + private $paths = []; + private $definitions = []; + private $controllers = []; + + public function __construct(string $translatorServiceId = 'translator', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_update', string $resolverServiceId = 'argument_resolver.service') + { + $this->translatorServiceId = $translatorServiceId; + $this->debugCommandServiceId = $debugCommandServiceId; + $this->updateCommandServiceId = $updateCommandServiceId; + $this->resolverServiceId = $resolverServiceId; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->translatorServiceId)) { + return; + } + + foreach ($this->findControllerArguments($container) as $controller => $argument) { + $id = substr($controller, 0, strpos($controller, ':') ?: \strlen($controller)); + if ($container->hasDefinition($id)) { + list($locatorRef) = $argument->getValues(); + $this->controllers[(string) $locatorRef][$container->getDefinition($id)->getClass()] = true; + } + } + + try { + parent::process($container); + + $paths = []; + foreach ($this->paths as $class => $_) { + if (($r = $container->getReflectionClass($class)) && !$r->isInterface()) { + $paths[] = $r->getFileName(); + } + } + if ($paths) { + if ($container->hasDefinition($this->debugCommandServiceId)) { + $definition = $container->getDefinition($this->debugCommandServiceId); + $definition->replaceArgument(6, array_merge($definition->getArgument(6), $paths)); + } + if ($container->hasDefinition($this->updateCommandServiceId)) { + $definition = $container->getDefinition($this->updateCommandServiceId); + $definition->replaceArgument(7, array_merge($definition->getArgument(7), $paths)); + } + } + } finally { + $this->level = 0; + $this->paths = []; + $this->definitions = []; + } + } + + protected function processValue($value, bool $isRoot = false) + { + if ($value instanceof Reference) { + if ((string) $value === $this->translatorServiceId) { + for ($i = $this->level - 1; $i >= 0; --$i) { + $class = $this->definitions[$i]->getClass(); + + if (ServiceLocator::class === $class) { + if (!isset($this->controllers[$this->currentId])) { + continue; + } + foreach ($this->controllers[$this->currentId] as $class => $_) { + $this->paths[$class] = true; + } + } else { + $this->paths[$class] = true; + } + + break; + } + } + + return $value; + } + + if ($value instanceof Definition) { + $this->definitions[$this->level++] = $value; + $value = parent::processValue($value, $isRoot); + unset($this->definitions[--$this->level]); + + return $value; + } + + return parent::processValue($value, $isRoot); + } + + private function findControllerArguments(ContainerBuilder $container): array + { + if ($container->hasDefinition($this->resolverServiceId)) { + $argument = $container->getDefinition($this->resolverServiceId)->getArgument(0); + if ($argument instanceof Reference) { + $argument = $container->getDefinition($argument); + } + + return $argument->getArgument(0); + } + + if ($container->hasDefinition('debug.'.$this->resolverServiceId)) { + $argument = $container->getDefinition('debug.'.$this->resolverServiceId)->getArgument(0); + if ($argument instanceof Reference) { + $argument = $container->getDefinition($argument); + } + $argument = $argument->getArgument(0); + if ($argument instanceof Reference) { + $argument = $container->getDefinition($argument); + } + + return $argument->getArgument(0); + } + + return []; + } +} diff --git a/vendor/symfony/translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Dumper/CsvFileDumper.php new file mode 100644 index 0000000..32accb6 --- /dev/null +++ b/vendor/symfony/translation/Dumper/CsvFileDumper.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * CsvFileDumper generates a csv formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class CsvFileDumper extends FileDumper +{ + private $delimiter = ';'; + private $enclosure = '"'; + + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $handle = fopen('php://memory', 'r+b'); + + foreach ($messages->all($domain) as $source => $target) { + fputcsv($handle, [$source, $target], $this->delimiter, $this->enclosure); + } + + rewind($handle); + $output = stream_get_contents($handle); + fclose($handle); + + return $output; + } + + /** + * Sets the delimiter and escape character for CSV. + */ + public function setCsvControl(string $delimiter = ';', string $enclosure = '"') + { + $this->delimiter = $delimiter; + $this->enclosure = $enclosure; + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'csv'; + } +} diff --git a/vendor/symfony/translation/Dumper/DumperInterface.php b/vendor/symfony/translation/Dumper/DumperInterface.php new file mode 100644 index 0000000..7cdaef5 --- /dev/null +++ b/vendor/symfony/translation/Dumper/DumperInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * DumperInterface is the interface implemented by all translation dumpers. + * There is no common option. + * + * @author Michel Salib + */ +interface DumperInterface +{ + /** + * Dumps the message catalogue. + * + * @param array $options Options that are used by the dumper + */ + public function dump(MessageCatalogue $messages, array $options = []); +} diff --git a/vendor/symfony/translation/Dumper/FileDumper.php b/vendor/symfony/translation/Dumper/FileDumper.php new file mode 100644 index 0000000..e257e72 --- /dev/null +++ b/vendor/symfony/translation/Dumper/FileDumper.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s). + * + * Options: + * - path (mandatory): the directory where the files should be saved + * + * @author Michel Salib + */ +abstract class FileDumper implements DumperInterface +{ + /** + * A template for the relative paths to files. + * + * @var string + */ + protected $relativePathTemplate = '%domain%.%locale%.%extension%'; + + /** + * Sets the template for the relative paths to files. + * + * @param string $relativePathTemplate A template for the relative paths to files + */ + public function setRelativePathTemplate(string $relativePathTemplate) + { + $this->relativePathTemplate = $relativePathTemplate; + } + + /** + * {@inheritdoc} + */ + public function dump(MessageCatalogue $messages, array $options = []) + { + if (!\array_key_exists('path', $options)) { + throw new InvalidArgumentException('The file dumper needs a path option.'); + } + + // save a file for each domain + foreach ($messages->getDomains() as $domain) { + $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale()); + if (!file_exists($fullpath)) { + $directory = \dirname($fullpath); + if (!file_exists($directory) && !@mkdir($directory, 0777, true)) { + throw new RuntimeException(sprintf('Unable to create directory "%s".', $directory)); + } + } + + $intlDomain = $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX; + $intlMessages = $messages->all($intlDomain); + + if ($intlMessages) { + $intlPath = $options['path'].'/'.$this->getRelativePath($intlDomain, $messages->getLocale()); + file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options)); + + $messages->replace([], $intlDomain); + + try { + if ($messages->all($domain)) { + file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); + } + continue; + } finally { + $messages->replace($intlMessages, $intlDomain); + } + } + + file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); + } + } + + /** + * Transforms a domain of a message catalogue to its string representation. + * + * @return string representation + */ + abstract public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []); + + /** + * Gets the file extension of the dumper. + * + * @return string file extension + */ + abstract protected function getExtension(); + + /** + * Gets the relative file path using the template. + */ + private function getRelativePath(string $domain, string $locale): string + { + return strtr($this->relativePathTemplate, [ + '%domain%' => $domain, + '%locale%' => $locale, + '%extension%' => $this->getExtension(), + ]); + } +} diff --git a/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Dumper/IcuResFileDumper.php new file mode 100644 index 0000000..cdc5991 --- /dev/null +++ b/vendor/symfony/translation/Dumper/IcuResFileDumper.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class IcuResFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + protected $relativePathTemplate = '%domain%/%locale%.%extension%'; + + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $data = $indexes = $resources = ''; + + foreach ($messages->all($domain) as $source => $target) { + $indexes .= pack('v', \strlen($data) + 28); + $data .= $source."\0"; + } + + $data .= $this->writePadding($data); + + $keyTop = $this->getPosition($data); + + foreach ($messages->all($domain) as $source => $target) { + $resources .= pack('V', $this->getPosition($data)); + + $data .= pack('V', \strlen($target)) + .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8') + .$this->writePadding($data) + ; + } + + $resOffset = $this->getPosition($data); + + $data .= pack('v', \count($messages->all($domain))) + .$indexes + .$this->writePadding($data) + .$resources + ; + + $bundleTop = $this->getPosition($data); + + $root = pack('V7', + $resOffset + (2 << 28), // Resource Offset + Resource Type + 6, // Index length + $keyTop, // Index keys top + $bundleTop, // Index resources top + $bundleTop, // Index bundle top + \count($messages->all($domain)), // Index max table length + 0 // Index attributes + ); + + $header = pack('vC2v4C12@32', + 32, // Header size + 0xDA, 0x27, // Magic number 1 and 2 + 20, 0, 0, 2, // Rest of the header, ..., Size of a char + 0x52, 0x65, 0x73, 0x42, // Data format identifier + 1, 2, 0, 0, // Data version + 1, 4, 0, 0 // Unicode version + ); + + return $header.$root.$data; + } + + private function writePadding(string $data): ?string + { + $padding = \strlen($data) % 4; + + return $padding ? str_repeat("\xAA", 4 - $padding) : null; + } + + private function getPosition(string $data) + { + return (\strlen($data) + 28) / 4; + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'res'; + } +} diff --git a/vendor/symfony/translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Dumper/IniFileDumper.php new file mode 100644 index 0000000..93c900a --- /dev/null +++ b/vendor/symfony/translation/Dumper/IniFileDumper.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IniFileDumper generates an ini formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class IniFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $output = ''; + + foreach ($messages->all($domain) as $source => $target) { + $escapeTarget = str_replace('"', '\"', $target); + $output .= $source.'="'.$escapeTarget."\"\n"; + } + + return $output; + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'ini'; + } +} diff --git a/vendor/symfony/translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Dumper/JsonFileDumper.php new file mode 100644 index 0000000..c6700ae --- /dev/null +++ b/vendor/symfony/translation/Dumper/JsonFileDumper.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * JsonFileDumper generates an json formatted string representation of a message catalogue. + * + * @author singles + */ +class JsonFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $flags = $options['json_encoding'] ?? JSON_PRETTY_PRINT; + + return json_encode($messages->all($domain), $flags); + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'json'; + } +} diff --git a/vendor/symfony/translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Dumper/MoFileDumper.php new file mode 100644 index 0000000..54d0da8 --- /dev/null +++ b/vendor/symfony/translation/Dumper/MoFileDumper.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Loader\MoFileLoader; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * MoFileDumper generates a gettext formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class MoFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $sources = $targets = $sourceOffsets = $targetOffsets = ''; + $offsets = []; + $size = 0; + + foreach ($messages->all($domain) as $source => $target) { + $offsets[] = array_map('strlen', [$sources, $source, $targets, $target]); + $sources .= "\0".$source; + $targets .= "\0".$target; + ++$size; + } + + $header = [ + 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC, + 'formatRevision' => 0, + 'count' => $size, + 'offsetId' => MoFileLoader::MO_HEADER_SIZE, + 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size), + 'sizeHashes' => 0, + 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size), + ]; + + $sourcesSize = \strlen($sources); + $sourcesStart = $header['offsetHashes'] + 1; + + foreach ($offsets as $offset) { + $sourceOffsets .= $this->writeLong($offset[1]) + .$this->writeLong($offset[0] + $sourcesStart); + $targetOffsets .= $this->writeLong($offset[3]) + .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize); + } + + $output = implode('', array_map([$this, 'writeLong'], $header)) + .$sourceOffsets + .$targetOffsets + .$sources + .$targets + ; + + return $output; + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'mo'; + } + + private function writeLong($str): string + { + return pack('V*', $str); + } +} diff --git a/vendor/symfony/translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Dumper/PhpFileDumper.php new file mode 100644 index 0000000..6163b52 --- /dev/null +++ b/vendor/symfony/translation/Dumper/PhpFileDumper.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * PhpFileDumper generates PHP files from a message catalogue. + * + * @author Michel Salib + */ +class PhpFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + return "all($domain), true).";\n"; + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'php'; + } +} diff --git a/vendor/symfony/translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Dumper/PoFileDumper.php new file mode 100644 index 0000000..3b18138 --- /dev/null +++ b/vendor/symfony/translation/Dumper/PoFileDumper.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * PoFileDumper generates a gettext formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class PoFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $output = 'msgid ""'."\n"; + $output .= 'msgstr ""'."\n"; + $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n"; + $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n"; + $output .= '"Language: '.$messages->getLocale().'\n"'."\n"; + $output .= "\n"; + + $newLine = false; + foreach ($messages->all($domain) as $source => $target) { + if ($newLine) { + $output .= "\n"; + } else { + $newLine = true; + } + $metadata = $messages->getMetadata($source, $domain); + + if (isset($metadata['comments'])) { + $output .= $this->formatComments($metadata['comments']); + } + if (isset($metadata['flags'])) { + $output .= $this->formatComments(implode(',', (array) $metadata['flags']), ','); + } + if (isset($metadata['sources'])) { + $output .= $this->formatComments(implode(' ', (array) $metadata['sources']), ':'); + } + + $sourceRules = $this->getStandardRules($source); + $targetRules = $this->getStandardRules($target); + if (2 == \count($sourceRules) && $targetRules !== []) { + $output .= sprintf('msgid "%s"'."\n", $this->escape($sourceRules[0])); + $output .= sprintf('msgid_plural "%s"'."\n", $this->escape($sourceRules[1])); + foreach ($targetRules as $i => $targetRule) { + $output .= sprintf('msgstr[%d] "%s"'."\n", $i, $this->escape($targetRule)); + } + } else { + $output .= sprintf('msgid "%s"'."\n", $this->escape($source)); + $output .= sprintf('msgstr "%s"'."\n", $this->escape($target)); + } + } + + return $output; + } + + private function getStandardRules(string $id) + { + // Partly copied from TranslatorTrait::trans. + $parts = []; + if (preg_match('/^\|++$/', $id)) { + $parts = explode('|', $id); + } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { + $parts = $matches[0]; + } + + $intervalRegexp = <<<'EOF' +/^(?P + ({\s* + (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) + \s*}) + + | + + (?P[\[\]]) + \s* + (?P-Inf|\-?\d+(\.\d+)?) + \s*,\s* + (?P\+?Inf|\-?\d+(\.\d+)?) + \s* + (?P[\[\]]) +)\s*(?P.*?)$/xs +EOF; + + $standardRules = []; + foreach ($parts as $part) { + $part = trim(str_replace('||', '|', $part)); + + if (preg_match($intervalRegexp, $part)) { + // Explicit rule is not a standard rule. + return []; + } else { + $standardRules[] = $part; + } + } + + return $standardRules; + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'po'; + } + + private function escape(string $str): string + { + return addcslashes($str, "\0..\37\42\134"); + } + + private function formatComments($comments, string $prefix = ''): ?string + { + $output = null; + + foreach ((array) $comments as $comment) { + $output .= sprintf('#%s %s'."\n", $prefix, $comment); + } + + return $output; + } +} diff --git a/vendor/symfony/translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Dumper/QtFileDumper.php new file mode 100644 index 0000000..406e9f0 --- /dev/null +++ b/vendor/symfony/translation/Dumper/QtFileDumper.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * QtFileDumper generates ts files from a message catalogue. + * + * @author Benjamin Eberlei + */ +class QtFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + $ts = $dom->appendChild($dom->createElement('TS')); + $context = $ts->appendChild($dom->createElement('context')); + $context->appendChild($dom->createElement('name', $domain)); + + foreach ($messages->all($domain) as $source => $target) { + $message = $context->appendChild($dom->createElement('message')); + $metadata = $messages->getMetadata($source, $domain); + if (isset($metadata['sources'])) { + foreach ((array) $metadata['sources'] as $location) { + $loc = explode(':', $location, 2); + $location = $message->appendChild($dom->createElement('location')); + $location->setAttribute('filename', $loc[0]); + if (isset($loc[1])) { + $location->setAttribute('line', $loc[1]); + } + } + } + $message->appendChild($dom->createElement('source', $source)); + $message->appendChild($dom->createElement('translation', $target)); + } + + return $dom->saveXML(); + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'ts'; + } +} diff --git a/vendor/symfony/translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Dumper/XliffFileDumper.php new file mode 100644 index 0000000..d9dfd43 --- /dev/null +++ b/vendor/symfony/translation/Dumper/XliffFileDumper.php @@ -0,0 +1,203 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * XliffFileDumper generates xliff files from a message catalogue. + * + * @author Michel Salib + */ +class XliffFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + $xliffVersion = '1.2'; + if (\array_key_exists('xliff_version', $options)) { + $xliffVersion = $options['xliff_version']; + } + + if (\array_key_exists('default_locale', $options)) { + $defaultLocale = $options['default_locale']; + } else { + $defaultLocale = \Locale::getDefault(); + } + + if ('1.2' === $xliffVersion) { + return $this->dumpXliff1($defaultLocale, $messages, $domain, $options); + } + if ('2.0' === $xliffVersion) { + return $this->dumpXliff2($defaultLocale, $messages, $domain); + } + + throw new InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion)); + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return 'xlf'; + } + + private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?string $domain, array $options = []) + { + $toolInfo = ['tool-id' => 'symfony', 'tool-name' => 'Symfony']; + if (\array_key_exists('tool_info', $options)) { + $toolInfo = array_merge($toolInfo, $options['tool_info']); + } + + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + + $xliff = $dom->appendChild($dom->createElement('xliff')); + $xliff->setAttribute('version', '1.2'); + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); + + $xliffFile = $xliff->appendChild($dom->createElement('file')); + $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale)); + $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale())); + $xliffFile->setAttribute('datatype', 'plaintext'); + $xliffFile->setAttribute('original', 'file.ext'); + + $xliffHead = $xliffFile->appendChild($dom->createElement('header')); + $xliffTool = $xliffHead->appendChild($dom->createElement('tool')); + foreach ($toolInfo as $id => $value) { + $xliffTool->setAttribute($id, $value); + } + + $xliffBody = $xliffFile->appendChild($dom->createElement('body')); + foreach ($messages->all($domain) as $source => $target) { + $translation = $dom->createElement('trans-unit'); + + $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._')); + $translation->setAttribute('resname', $source); + + $s = $translation->appendChild($dom->createElement('source')); + $s->appendChild($dom->createTextNode($source)); + + // Does the target contain characters requiring a CDATA section? + $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); + + $targetElement = $dom->createElement('target'); + $metadata = $messages->getMetadata($source, $domain); + if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { + foreach ($metadata['target-attributes'] as $name => $value) { + $targetElement->setAttribute($name, $value); + } + } + $t = $translation->appendChild($targetElement); + $t->appendChild($text); + + if ($this->hasMetadataArrayInfo('notes', $metadata)) { + foreach ($metadata['notes'] as $note) { + if (!isset($note['content'])) { + continue; + } + + $n = $translation->appendChild($dom->createElement('note')); + $n->appendChild($dom->createTextNode($note['content'])); + + if (isset($note['priority'])) { + $n->setAttribute('priority', $note['priority']); + } + + if (isset($note['from'])) { + $n->setAttribute('from', $note['from']); + } + } + } + + $xliffBody->appendChild($translation); + } + + return $dom->saveXML(); + } + + private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?string $domain) + { + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + + $xliff = $dom->appendChild($dom->createElement('xliff')); + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0'); + $xliff->setAttribute('version', '2.0'); + $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale)); + $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale())); + + $xliffFile = $xliff->appendChild($dom->createElement('file')); + if (MessageCatalogue::INTL_DOMAIN_SUFFIX === substr($domain, -($suffixLength = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX)))) { + $xliffFile->setAttribute('id', substr($domain, 0, -$suffixLength).'.'.$messages->getLocale()); + } else { + $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale()); + } + + foreach ($messages->all($domain) as $source => $target) { + $translation = $dom->createElement('unit'); + $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._')); + $name = $source; + if (\strlen($source) > 80) { + $name = substr(md5($source), -7); + } + $translation->setAttribute('name', $name); + $metadata = $messages->getMetadata($source, $domain); + + // Add notes section + if ($this->hasMetadataArrayInfo('notes', $metadata)) { + $notesElement = $dom->createElement('notes'); + foreach ($metadata['notes'] as $note) { + $n = $dom->createElement('note'); + $n->appendChild($dom->createTextNode(isset($note['content']) ? $note['content'] : '')); + unset($note['content']); + + foreach ($note as $name => $value) { + $n->setAttribute($name, $value); + } + $notesElement->appendChild($n); + } + $translation->appendChild($notesElement); + } + + $segment = $translation->appendChild($dom->createElement('segment')); + + $s = $segment->appendChild($dom->createElement('source')); + $s->appendChild($dom->createTextNode($source)); + + // Does the target contain characters requiring a CDATA section? + $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); + + $targetElement = $dom->createElement('target'); + if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { + foreach ($metadata['target-attributes'] as $name => $value) { + $targetElement->setAttribute($name, $value); + } + } + $t = $segment->appendChild($targetElement); + $t->appendChild($text); + + $xliffFile->appendChild($translation); + } + + return $dom->saveXML(); + } + + private function hasMetadataArrayInfo(string $key, array $metadata = null): bool + { + return null !== $metadata && \array_key_exists($key, $metadata) && ($metadata[$key] instanceof \Traversable || \is_array($metadata[$key])); + } +} diff --git a/vendor/symfony/translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Dumper/YamlFileDumper.php new file mode 100644 index 0000000..ac589c9 --- /dev/null +++ b/vendor/symfony/translation/Dumper/YamlFileDumper.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Exception\LogicException; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\Util\ArrayConverter; +use Symfony\Component\Yaml\Yaml; + +/** + * YamlFileDumper generates yaml files from a message catalogue. + * + * @author Michel Salib + */ +class YamlFileDumper extends FileDumper +{ + private $extension; + + public function __construct(string $extension = 'yml') + { + $this->extension = $extension; + } + + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) + { + if (!class_exists('Symfony\Component\Yaml\Yaml')) { + throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.'); + } + + $data = $messages->all($domain); + + if (isset($options['as_tree']) && $options['as_tree']) { + $data = ArrayConverter::expandToTree($data); + } + + if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) { + return Yaml::dump($data, $inline); + } + + return Yaml::dump($data); + } + + /** + * {@inheritdoc} + */ + protected function getExtension() + { + return $this->extension; + } +} diff --git a/vendor/symfony/translation/Exception/ExceptionInterface.php b/vendor/symfony/translation/Exception/ExceptionInterface.php new file mode 100644 index 0000000..8f9c54e --- /dev/null +++ b/vendor/symfony/translation/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Fabien Potencier + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/translation/Exception/InvalidArgumentException.php b/vendor/symfony/translation/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..90d0669 --- /dev/null +++ b/vendor/symfony/translation/Exception/InvalidArgumentException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Base InvalidArgumentException for the Translation component. + * + * @author Abdellatif Ait boudad + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/InvalidResourceException.php b/vendor/symfony/translation/Exception/InvalidResourceException.php new file mode 100644 index 0000000..cf07943 --- /dev/null +++ b/vendor/symfony/translation/Exception/InvalidResourceException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Thrown when a resource cannot be loaded. + * + * @author Fabien Potencier + */ +class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/LogicException.php b/vendor/symfony/translation/Exception/LogicException.php new file mode 100644 index 0000000..9019c7e --- /dev/null +++ b/vendor/symfony/translation/Exception/LogicException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Base LogicException for Translation component. + * + * @author Abdellatif Ait boudad + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/NotFoundResourceException.php b/vendor/symfony/translation/Exception/NotFoundResourceException.php new file mode 100644 index 0000000..cff73ae --- /dev/null +++ b/vendor/symfony/translation/Exception/NotFoundResourceException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Thrown when a resource does not exist. + * + * @author Fabien Potencier + */ +class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/RuntimeException.php b/vendor/symfony/translation/Exception/RuntimeException.php new file mode 100644 index 0000000..dcd7940 --- /dev/null +++ b/vendor/symfony/translation/Exception/RuntimeException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Base RuntimeException for the Translation component. + * + * @author Abdellatif Ait boudad + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Extractor/AbstractFileExtractor.php b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php new file mode 100644 index 0000000..729dd17 --- /dev/null +++ b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * Base class used by classes that extract translation messages from files. + * + * @author Marcos D. Sánchez + */ +abstract class AbstractFileExtractor +{ + /** + * @param string|iterable $resource Files, a file or a directory + * + * @return iterable + */ + protected function extractFiles($resource) + { + if (is_iterable($resource)) { + $files = []; + foreach ($resource as $file) { + if ($this->canBeExtracted($file)) { + $files[] = $this->toSplFileInfo($file); + } + } + } elseif (is_file($resource)) { + $files = $this->canBeExtracted($resource) ? [$this->toSplFileInfo($resource)] : []; + } else { + $files = $this->extractFromDirectory($resource); + } + + return $files; + } + + private function toSplFileInfo(string $file): \SplFileInfo + { + return new \SplFileInfo($file); + } + + /** + * @return bool + * + * @throws InvalidArgumentException + */ + protected function isFile(string $file) + { + if (!is_file($file)) { + throw new InvalidArgumentException(sprintf('The "%s" file does not exist.', $file)); + } + + return true; + } + + /** + * @return bool + */ + abstract protected function canBeExtracted(string $file); + + /** + * @param string|array $resource Files, a file or a directory + * + * @return iterable files to be extracted + */ + abstract protected function extractFromDirectory($resource); +} diff --git a/vendor/symfony/translation/Extractor/ChainExtractor.php b/vendor/symfony/translation/Extractor/ChainExtractor.php new file mode 100644 index 0000000..6b6e182 --- /dev/null +++ b/vendor/symfony/translation/Extractor/ChainExtractor.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * ChainExtractor extracts translation messages from template files. + * + * @author Michel Salib + */ +class ChainExtractor implements ExtractorInterface +{ + /** + * The extractors. + * + * @var ExtractorInterface[] + */ + private $extractors = []; + + /** + * Adds a loader to the translation extractor. + * + * @param string $format The format of the loader + */ + public function addExtractor(string $format, ExtractorInterface $extractor) + { + $this->extractors[$format] = $extractor; + } + + /** + * {@inheritdoc} + */ + public function setPrefix(string $prefix) + { + foreach ($this->extractors as $extractor) { + $extractor->setPrefix($prefix); + } + } + + /** + * {@inheritdoc} + */ + public function extract($directory, MessageCatalogue $catalogue) + { + foreach ($this->extractors as $extractor) { + $extractor->extract($directory, $catalogue); + } + } +} diff --git a/vendor/symfony/translation/Extractor/ExtractorInterface.php b/vendor/symfony/translation/Extractor/ExtractorInterface.php new file mode 100644 index 0000000..39cc006 --- /dev/null +++ b/vendor/symfony/translation/Extractor/ExtractorInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * Extracts translation messages from a directory or files to the catalogue. + * New found messages are injected to the catalogue using the prefix. + * + * @author Michel Salib + */ +interface ExtractorInterface +{ + /** + * Extracts translation messages from files, a file or a directory to the catalogue. + * + * @param string|array $resource Files, a file or a directory + */ + public function extract($resource, MessageCatalogue $catalogue); + + /** + * Sets the prefix that should be used for new found messages. + * + * @param string $prefix The prefix + */ + public function setPrefix(string $prefix); +} diff --git a/vendor/symfony/translation/Extractor/PhpExtractor.php b/vendor/symfony/translation/Extractor/PhpExtractor.php new file mode 100644 index 0000000..549754a --- /dev/null +++ b/vendor/symfony/translation/Extractor/PhpExtractor.php @@ -0,0 +1,247 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Finder\Finder; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * PhpExtractor extracts translation messages from a PHP template. + * + * @author Michel Salib + */ +class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface +{ + const MESSAGE_TOKEN = 300; + const METHOD_ARGUMENTS_TOKEN = 1000; + const DOMAIN_TOKEN = 1001; + + /** + * Prefix for new found message. + * + * @var string + */ + private $prefix = ''; + + /** + * The sequence that captures translation messages. + * + * @var array + */ + protected $sequences = [ + [ + '->', + 'trans', + '(', + self::MESSAGE_TOKEN, + ',', + self::METHOD_ARGUMENTS_TOKEN, + ',', + self::DOMAIN_TOKEN, + ], + [ + '->', + 'trans', + '(', + self::MESSAGE_TOKEN, + ], + ]; + + /** + * {@inheritdoc} + */ + public function extract($resource, MessageCatalogue $catalog) + { + $files = $this->extractFiles($resource); + foreach ($files as $file) { + $this->parseTokens(token_get_all(file_get_contents($file)), $catalog, $file); + + gc_mem_caches(); + } + } + + /** + * {@inheritdoc} + */ + public function setPrefix(string $prefix) + { + $this->prefix = $prefix; + } + + /** + * Normalizes a token. + * + * @param mixed $token + * + * @return string|null + */ + protected function normalizeToken($token) + { + if (isset($token[1]) && 'b"' !== $token) { + return $token[1]; + } + + return $token; + } + + /** + * Seeks to a non-whitespace token. + */ + private function seekToNextRelevantToken(\Iterator $tokenIterator) + { + for (; $tokenIterator->valid(); $tokenIterator->next()) { + $t = $tokenIterator->current(); + if (T_WHITESPACE !== $t[0]) { + break; + } + } + } + + private function skipMethodArgument(\Iterator $tokenIterator) + { + $openBraces = 0; + + for (; $tokenIterator->valid(); $tokenIterator->next()) { + $t = $tokenIterator->current(); + + if ('[' === $t[0] || '(' === $t[0]) { + ++$openBraces; + } + + if (']' === $t[0] || ')' === $t[0]) { + --$openBraces; + } + + if ((0 === $openBraces && ',' === $t[0]) || (-1 === $openBraces && ')' === $t[0])) { + break; + } + } + } + + /** + * Extracts the message from the iterator while the tokens + * match allowed message tokens. + */ + private function getValue(\Iterator $tokenIterator) + { + $message = ''; + $docToken = ''; + $docPart = ''; + + for (; $tokenIterator->valid(); $tokenIterator->next()) { + $t = $tokenIterator->current(); + if ('.' === $t) { + // Concatenate with next token + continue; + } + if (!isset($t[1])) { + break; + } + + switch ($t[0]) { + case T_START_HEREDOC: + $docToken = $t[1]; + break; + case T_ENCAPSED_AND_WHITESPACE: + case T_CONSTANT_ENCAPSED_STRING: + if ('' === $docToken) { + $message .= PhpStringTokenParser::parse($t[1]); + } else { + $docPart = $t[1]; + } + break; + case T_END_HEREDOC: + $message .= PhpStringTokenParser::parseDocString($docToken, $docPart); + $docToken = ''; + $docPart = ''; + break; + case T_WHITESPACE: + break; + default: + break 2; + } + } + + return $message; + } + + /** + * Extracts trans message from PHP tokens. + */ + protected function parseTokens(array $tokens, MessageCatalogue $catalog, string $filename) + { + $tokenIterator = new \ArrayIterator($tokens); + + for ($key = 0; $key < $tokenIterator->count(); ++$key) { + foreach ($this->sequences as $sequence) { + $message = ''; + $domain = 'messages'; + $tokenIterator->seek($key); + + foreach ($sequence as $sequenceKey => $item) { + $this->seekToNextRelevantToken($tokenIterator); + + if ($this->normalizeToken($tokenIterator->current()) === $item) { + $tokenIterator->next(); + continue; + } elseif (self::MESSAGE_TOKEN === $item) { + $message = $this->getValue($tokenIterator); + + if (\count($sequence) === ($sequenceKey + 1)) { + break; + } + } elseif (self::METHOD_ARGUMENTS_TOKEN === $item) { + $this->skipMethodArgument($tokenIterator); + } elseif (self::DOMAIN_TOKEN === $item) { + $domainToken = $this->getValue($tokenIterator); + if ('' !== $domainToken) { + $domain = $domainToken; + } + + break; + } else { + break; + } + } + + if ($message) { + $catalog->set($message, $this->prefix.$message, $domain); + $metadata = $catalog->getMetadata($message, $domain) ?? []; + $normalizedFilename = preg_replace('{[\\\\/]+}', '/', $filename); + $metadata['sources'][] = $normalizedFilename.':'.$tokens[$key][2]; + $catalog->setMetadata($message, $metadata, $domain); + break; + } + } + } + } + + /** + * @return bool + * + * @throws \InvalidArgumentException + */ + protected function canBeExtracted(string $file) + { + return $this->isFile($file) && 'php' === pathinfo($file, PATHINFO_EXTENSION); + } + + /** + * {@inheritdoc} + */ + protected function extractFromDirectory($directory) + { + $finder = new Finder(); + + return $finder->files()->name('*.php')->in($directory); + } +} diff --git a/vendor/symfony/translation/Extractor/PhpStringTokenParser.php b/vendor/symfony/translation/Extractor/PhpStringTokenParser.php new file mode 100644 index 0000000..e68b0e5 --- /dev/null +++ b/vendor/symfony/translation/Extractor/PhpStringTokenParser.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +/* + * The following is derived from code at http://github.com/nikic/PHP-Parser + * + * Copyright (c) 2011 by Nikita Popov + * + * Some rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * * The names of the contributors may not be used to endorse or + * promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +class PhpStringTokenParser +{ + protected static $replacements = [ + '\\' => '\\', + '$' => '$', + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'f' => "\f", + 'v' => "\v", + 'e' => "\x1B", + ]; + + /** + * Parses a string token. + * + * @param string $str String token content + * + * @return string The parsed string + */ + public static function parse(string $str) + { + $bLength = 0; + if ('b' === $str[0]) { + $bLength = 1; + } + + if ('\'' === $str[$bLength]) { + return str_replace( + ['\\\\', '\\\''], + ['\\', '\''], + substr($str, $bLength + 1, -1) + ); + } else { + return self::parseEscapeSequences(substr($str, $bLength + 1, -1), '"'); + } + } + + /** + * Parses escape sequences in strings (all string types apart from single quoted). + * + * @param string $str String without quotes + * @param string|null $quote Quote type + * + * @return string String with escape sequences parsed + */ + public static function parseEscapeSequences(string $str, string $quote = null) + { + if (null !== $quote) { + $str = str_replace('\\'.$quote, $quote, $str); + } + + return preg_replace_callback( + '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~', + [__CLASS__, 'parseCallback'], + $str + ); + } + + private static function parseCallback(array $matches): string + { + $str = $matches[1]; + + if (isset(self::$replacements[$str])) { + return self::$replacements[$str]; + } elseif ('x' === $str[0] || 'X' === $str[0]) { + return \chr(hexdec($str)); + } else { + return \chr(octdec($str)); + } + } + + /** + * Parses a constant doc string. + * + * @param string $startToken Doc string start token content (<< + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\LogicException; + +/** + * @author Guilherme Blanco + * @author Abdellatif Ait boudad + */ +class IntlFormatter implements IntlFormatterInterface +{ + private $hasMessageFormatter; + private $cache = []; + + /** + * {@inheritdoc} + */ + public function formatIntl(string $message, string $locale, array $parameters = []): string + { + // MessageFormatter constructor throws an exception if the message is empty + if ('' === $message) { + return ''; + } + + if (!$formatter = $this->cache[$locale][$message] ?? null) { + if (!($this->hasMessageFormatter ?? $this->hasMessageFormatter = class_exists(\MessageFormatter::class))) { + throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.'); + } + try { + $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message); + } catch (\IntlException $e) { + throw new InvalidArgumentException(sprintf('Invalid message format (error #%d): ', intl_get_error_code()).intl_get_error_message(), 0, $e); + } + } + + foreach ($parameters as $key => $value) { + if (\in_array($key[0] ?? null, ['%', '{'], true)) { + unset($parameters[$key]); + $parameters[trim($key, '%{ }')] = $value; + } + } + + if (false === $message = $formatter->format($parameters)) { + throw new InvalidArgumentException(sprintf('Unable to format message (error #%s): ', $formatter->getErrorCode()).$formatter->getErrorMessage()); + } + + return $message; + } +} diff --git a/vendor/symfony/translation/Formatter/IntlFormatterInterface.php b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php new file mode 100644 index 0000000..02fc6ac --- /dev/null +++ b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +/** + * Formats ICU message patterns. + * + * @author Nicolas Grekas + */ +interface IntlFormatterInterface +{ + /** + * Formats a localized message using rules defined by ICU MessageFormat. + * + * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details + */ + public function formatIntl(string $message, string $locale, array $parameters = []): string; +} diff --git a/vendor/symfony/translation/Formatter/MessageFormatter.php b/vendor/symfony/translation/Formatter/MessageFormatter.php new file mode 100644 index 0000000..0407964 --- /dev/null +++ b/vendor/symfony/translation/Formatter/MessageFormatter.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +use Symfony\Component\Translation\IdentityTranslator; +use Symfony\Contracts\Translation\TranslatorInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(IntlFormatter::class); + +/** + * @author Abdellatif Ait boudad + */ +class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterface +{ + private $translator; + private $intlFormatter; + + /** + * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization + */ + public function __construct(TranslatorInterface $translator = null, IntlFormatterInterface $intlFormatter = null) + { + $this->translator = $translator ?? new IdentityTranslator(); + $this->intlFormatter = $intlFormatter ?? new IntlFormatter(); + } + + /** + * {@inheritdoc} + */ + public function format(string $message, string $locale, array $parameters = []) + { + if ($this->translator instanceof TranslatorInterface) { + return $this->translator->trans($message, $parameters, null, $locale); + } + + return strtr($message, $parameters); + } + + /** + * {@inheritdoc} + */ + public function formatIntl(string $message, string $locale, array $parameters = []): string + { + return $this->intlFormatter->formatIntl($message, $locale, $parameters); + } +} diff --git a/vendor/symfony/translation/Formatter/MessageFormatterInterface.php b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php new file mode 100644 index 0000000..b85dbfd --- /dev/null +++ b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +/** + * @author Guilherme Blanco + * @author Abdellatif Ait boudad + */ +interface MessageFormatterInterface +{ + /** + * Formats a localized message pattern with given arguments. + * + * @param string $message The message (may also be an object that can be cast to string) + * @param string $locale The message locale + * @param array $parameters An array of parameters for the message + * + * @return string + */ + public function format(string $message, string $locale, array $parameters = []); +} diff --git a/vendor/symfony/translation/IdentityTranslator.php b/vendor/symfony/translation/IdentityTranslator.php new file mode 100644 index 0000000..46875ed --- /dev/null +++ b/vendor/symfony/translation/IdentityTranslator.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorTrait; + +/** + * IdentityTranslator does not translate anything. + * + * @author Fabien Potencier + */ +class IdentityTranslator implements TranslatorInterface, LocaleAwareInterface +{ + use TranslatorTrait; +} diff --git a/vendor/symfony/translation/LICENSE b/vendor/symfony/translation/LICENSE new file mode 100644 index 0000000..9e936ec --- /dev/null +++ b/vendor/symfony/translation/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/translation/Loader/ArrayLoader.php b/vendor/symfony/translation/Loader/ArrayLoader.php new file mode 100644 index 0000000..0758da8 --- /dev/null +++ b/vendor/symfony/translation/Loader/ArrayLoader.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * ArrayLoader loads translations from a PHP array. + * + * @author Fabien Potencier + */ +class ArrayLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $locale, string $domain = 'messages') + { + $resource = $this->flatten($resource); + $catalogue = new MessageCatalogue($locale); + $catalogue->add($resource, $domain); + + return $catalogue; + } + + /** + * Flattens an nested array of translations. + * + * The scheme used is: + * 'key' => ['key2' => ['key3' => 'value']] + * Becomes: + * 'key.key2.key3' => 'value' + */ + private function flatten(array $messages): array + { + $result = []; + foreach ($messages as $key => $value) { + if (\is_array($value)) { + foreach ($this->flatten($value) as $k => $v) { + $result[$key.'.'.$k] = $v; + } + } else { + $result[$key] = $value; + } + } + + return $result; + } +} diff --git a/vendor/symfony/translation/Loader/CsvFileLoader.php b/vendor/symfony/translation/Loader/CsvFileLoader.php new file mode 100644 index 0000000..25ac2f5 --- /dev/null +++ b/vendor/symfony/translation/Loader/CsvFileLoader.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\NotFoundResourceException; + +/** + * CsvFileLoader loads translations from CSV files. + * + * @author Saša Stamenković + */ +class CsvFileLoader extends FileLoader +{ + private $delimiter = ';'; + private $enclosure = '"'; + private $escape = '\\'; + + /** + * {@inheritdoc} + */ + protected function loadResource($resource) + { + $messages = []; + + try { + $file = new \SplFileObject($resource, 'rb'); + } catch (\RuntimeException $e) { + throw new NotFoundResourceException(sprintf('Error opening file "%s".', $resource), 0, $e); + } + + $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY); + $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape); + + foreach ($file as $data) { + if (false === $data) { + continue; + } + + if ('#' !== substr($data[0], 0, 1) && isset($data[1]) && 2 === \count($data)) { + $messages[$data[0]] = $data[1]; + } + } + + return $messages; + } + + /** + * Sets the delimiter, enclosure, and escape character for CSV. + */ + public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = '\\') + { + $this->delimiter = $delimiter; + $this->enclosure = $enclosure; + $this->escape = $escape; + } +} diff --git a/vendor/symfony/translation/Loader/FileLoader.php b/vendor/symfony/translation/Loader/FileLoader.php new file mode 100644 index 0000000..60c5b34 --- /dev/null +++ b/vendor/symfony/translation/Loader/FileLoader.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; + +/** + * @author Abdellatif Ait boudad + */ +abstract class FileLoader extends ArrayLoader +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $locale, string $domain = 'messages') + { + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + $messages = $this->loadResource($resource); + + // empty resource + if (null === $messages) { + $messages = []; + } + + // not an array + if (!\is_array($messages)) { + throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource)); + } + + $catalogue = parent::load($messages, $locale, $domain); + + if (class_exists('Symfony\Component\Config\Resource\FileResource')) { + $catalogue->addResource(new FileResource($resource)); + } + + return $catalogue; + } + + /** + * @param string $resource + * + * @return array + * + * @throws InvalidResourceException if stream content has an invalid format + */ + abstract protected function loadResource($resource); +} diff --git a/vendor/symfony/translation/Loader/IcuDatFileLoader.php b/vendor/symfony/translation/Loader/IcuDatFileLoader.php new file mode 100644 index 0000000..0b71681 --- /dev/null +++ b/vendor/symfony/translation/Loader/IcuDatFileLoader.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IcuResFileLoader loads translations from a resource bundle. + * + * @author stealth35 + */ +class IcuDatFileLoader extends IcuResFileLoader +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $locale, string $domain = 'messages') + { + if (!stream_is_local($resource.'.dat')) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource.'.dat')) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + try { + $rb = new \ResourceBundle($locale, $resource); + } catch (\Exception $e) { + $rb = null; + } + + if (!$rb) { + throw new InvalidResourceException(sprintf('Cannot load resource "%s".', $resource)); + } elseif (intl_is_failure($rb->getErrorCode())) { + throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); + } + + $messages = $this->flatten($rb); + $catalogue = new MessageCatalogue($locale); + $catalogue->add($messages, $domain); + + if (class_exists('Symfony\Component\Config\Resource\FileResource')) { + $catalogue->addResource(new FileResource($resource.'.dat')); + } + + return $catalogue; + } +} diff --git a/vendor/symfony/translation/Loader/IcuResFileLoader.php b/vendor/symfony/translation/Loader/IcuResFileLoader.php new file mode 100644 index 0000000..9aa30bd --- /dev/null +++ b/vendor/symfony/translation/Loader/IcuResFileLoader.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\DirectoryResource; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IcuResFileLoader loads translations from a resource bundle. + * + * @author stealth35 + */ +class IcuResFileLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $locale, string $domain = 'messages') + { + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!is_dir($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + try { + $rb = new \ResourceBundle($locale, $resource); + } catch (\Exception $e) { + $rb = null; + } + + if (!$rb) { + throw new InvalidResourceException(sprintf('Cannot load resource "%s".', $resource)); + } elseif (intl_is_failure($rb->getErrorCode())) { + throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); + } + + $messages = $this->flatten($rb); + $catalogue = new MessageCatalogue($locale); + $catalogue->add($messages, $domain); + + if (class_exists('Symfony\Component\Config\Resource\DirectoryResource')) { + $catalogue->addResource(new DirectoryResource($resource)); + } + + return $catalogue; + } + + /** + * Flattens an ResourceBundle. + * + * The scheme used is: + * key { key2 { key3 { "value" } } } + * Becomes: + * 'key.key2.key3' => 'value' + * + * This function takes an array by reference and will modify it + * + * @param \ResourceBundle $rb The ResourceBundle that will be flattened + * @param array $messages Used internally for recursive calls + * @param string $path Current path being parsed, used internally for recursive calls + * + * @return array the flattened ResourceBundle + */ + protected function flatten(\ResourceBundle $rb, array &$messages = [], string $path = null) + { + foreach ($rb as $key => $value) { + $nodePath = $path ? $path.'.'.$key : $key; + if ($value instanceof \ResourceBundle) { + $this->flatten($value, $messages, $nodePath); + } else { + $messages[$nodePath] = $value; + } + } + + return $messages; + } +} diff --git a/vendor/symfony/translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Loader/IniFileLoader.php new file mode 100644 index 0000000..11d9b27 --- /dev/null +++ b/vendor/symfony/translation/Loader/IniFileLoader.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +/** + * IniFileLoader loads translations from an ini file. + * + * @author stealth35 + */ +class IniFileLoader extends FileLoader +{ + /** + * {@inheritdoc} + */ + protected function loadResource($resource) + { + return parse_ini_file($resource, true); + } +} diff --git a/vendor/symfony/translation/Loader/JsonFileLoader.php b/vendor/symfony/translation/Loader/JsonFileLoader.php new file mode 100644 index 0000000..9f15dbc --- /dev/null +++ b/vendor/symfony/translation/Loader/JsonFileLoader.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * JsonFileLoader loads translations from an json file. + * + * @author singles + */ +class JsonFileLoader extends FileLoader +{ + /** + * {@inheritdoc} + */ + protected function loadResource($resource) + { + $messages = []; + if ($data = file_get_contents($resource)) { + $messages = json_decode($data, true); + + if (0 < $errorCode = json_last_error()) { + throw new InvalidResourceException('Error parsing JSON: '.$this->getJSONErrorMessage($errorCode)); + } + } + + return $messages; + } + + /** + * Translates JSON_ERROR_* constant into meaningful message. + */ + private function getJSONErrorMessage(int $errorCode): string + { + switch ($errorCode) { + case JSON_ERROR_DEPTH: + return 'Maximum stack depth exceeded'; + case JSON_ERROR_STATE_MISMATCH: + return 'Underflow or the modes mismatch'; + case JSON_ERROR_CTRL_CHAR: + return 'Unexpected control character found'; + case JSON_ERROR_SYNTAX: + return 'Syntax error, malformed JSON'; + case JSON_ERROR_UTF8: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + default: + return 'Unknown error'; + } + } +} diff --git a/vendor/symfony/translation/Loader/LoaderInterface.php b/vendor/symfony/translation/Loader/LoaderInterface.php new file mode 100644 index 0000000..2073f2b --- /dev/null +++ b/vendor/symfony/translation/Loader/LoaderInterface.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * LoaderInterface is the interface implemented by all translation loaders. + * + * @author Fabien Potencier + */ +interface LoaderInterface +{ + /** + * Loads a locale. + * + * @param mixed $resource A resource + * @param string $locale A locale + * @param string $domain The domain + * + * @return MessageCatalogue A MessageCatalogue instance + * + * @throws NotFoundResourceException when the resource cannot be found + * @throws InvalidResourceException when the resource cannot be loaded + */ + public function load($resource, string $locale, string $domain = 'messages'); +} diff --git a/vendor/symfony/translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Loader/MoFileLoader.php new file mode 100644 index 0000000..d344c6e --- /dev/null +++ b/vendor/symfony/translation/Loader/MoFileLoader.php @@ -0,0 +1,140 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/) + */ +class MoFileLoader extends FileLoader +{ + /** + * Magic used for validating the format of a MO file as well as + * detecting if the machine used to create that file was little endian. + */ + const MO_LITTLE_ENDIAN_MAGIC = 0x950412de; + + /** + * Magic used for validating the format of a MO file as well as + * detecting if the machine used to create that file was big endian. + */ + const MO_BIG_ENDIAN_MAGIC = 0xde120495; + + /** + * The size of the header of a MO file in bytes. + */ + const MO_HEADER_SIZE = 28; + + /** + * Parses machine object (MO) format, independent of the machine's endian it + * was created on. Both 32bit and 64bit systems are supported. + * + * {@inheritdoc} + */ + protected function loadResource($resource) + { + $stream = fopen($resource, 'r'); + + $stat = fstat($stream); + + if ($stat['size'] < self::MO_HEADER_SIZE) { + throw new InvalidResourceException('MO stream content has an invalid format.'); + } + $magic = unpack('V1', fread($stream, 4)); + $magic = hexdec(substr(dechex(current($magic)), -8)); + + if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) { + $isBigEndian = false; + } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) { + $isBigEndian = true; + } else { + throw new InvalidResourceException('MO stream content has an invalid format.'); + } + + // formatRevision + $this->readLong($stream, $isBigEndian); + $count = $this->readLong($stream, $isBigEndian); + $offsetId = $this->readLong($stream, $isBigEndian); + $offsetTranslated = $this->readLong($stream, $isBigEndian); + // sizeHashes + $this->readLong($stream, $isBigEndian); + // offsetHashes + $this->readLong($stream, $isBigEndian); + + $messages = []; + + for ($i = 0; $i < $count; ++$i) { + $pluralId = null; + $translated = null; + + fseek($stream, $offsetId + $i * 8); + + $length = $this->readLong($stream, $isBigEndian); + $offset = $this->readLong($stream, $isBigEndian); + + if ($length < 1) { + continue; + } + + fseek($stream, $offset); + $singularId = fread($stream, $length); + + if (false !== strpos($singularId, "\000")) { + list($singularId, $pluralId) = explode("\000", $singularId); + } + + fseek($stream, $offsetTranslated + $i * 8); + $length = $this->readLong($stream, $isBigEndian); + $offset = $this->readLong($stream, $isBigEndian); + + if ($length < 1) { + continue; + } + + fseek($stream, $offset); + $translated = fread($stream, $length); + + if (false !== strpos($translated, "\000")) { + $translated = explode("\000", $translated); + } + + $ids = ['singular' => $singularId, 'plural' => $pluralId]; + $item = compact('ids', 'translated'); + + if (!empty($item['ids']['singular'])) { + $id = $item['ids']['singular']; + if (isset($item['ids']['plural'])) { + $id .= '|'.$item['ids']['plural']; + } + $messages[$id] = stripcslashes(implode('|', (array) $item['translated'])); + } + } + + fclose($stream); + + return array_filter($messages); + } + + /** + * Reads an unsigned long from stream respecting endianness. + * + * @param resource $stream + */ + private function readLong($stream, bool $isBigEndian): int + { + $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4)); + $result = current($result); + + return (int) substr($result, -8); + } +} diff --git a/vendor/symfony/translation/Loader/PhpFileLoader.php b/vendor/symfony/translation/Loader/PhpFileLoader.php new file mode 100644 index 0000000..0991c3d --- /dev/null +++ b/vendor/symfony/translation/Loader/PhpFileLoader.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +/** + * PhpFileLoader loads translations from PHP files returning an array of translations. + * + * @author Fabien Potencier + */ +class PhpFileLoader extends FileLoader +{ + private static $cache = []; + + /** + * {@inheritdoc} + */ + protected function loadResource($resource) + { + if ([] === self::$cache && \function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(ini_get('opcache.enable_cli'), FILTER_VALIDATE_BOOLEAN))) { + self::$cache = null; + } + + if (null === self::$cache) { + return require $resource; + } + + if (isset(self::$cache[$resource])) { + return self::$cache[$resource]; + } + + return self::$cache[$resource] = require $resource; + } +} diff --git a/vendor/symfony/translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Loader/PoFileLoader.php new file mode 100644 index 0000000..5e460fb --- /dev/null +++ b/vendor/symfony/translation/Loader/PoFileLoader.php @@ -0,0 +1,149 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +/** + * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium + * @copyright Copyright (c) 2012, Clemens Tolboom + */ +class PoFileLoader extends FileLoader +{ + /** + * Parses portable object (PO) format. + * + * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files + * we should be able to parse files having: + * + * white-space + * # translator-comments + * #. extracted-comments + * #: reference... + * #, flag... + * #| msgid previous-untranslated-string + * msgid untranslated-string + * msgstr translated-string + * + * extra or different lines are: + * + * #| msgctxt previous-context + * #| msgid previous-untranslated-string + * msgctxt context + * + * #| msgid previous-untranslated-string-singular + * #| msgid_plural previous-untranslated-string-plural + * msgid untranslated-string-singular + * msgid_plural untranslated-string-plural + * msgstr[0] translated-string-case-0 + * ... + * msgstr[N] translated-string-case-n + * + * The definition states: + * - white-space and comments are optional. + * - msgid "" that an empty singleline defines a header. + * + * This parser sacrifices some features of the reference implementation the + * differences to that implementation are as follows. + * - No support for comments spanning multiple lines. + * - Translator and extracted comments are treated as being the same type. + * - Message IDs are allowed to have other encodings as just US-ASCII. + * + * Items with an empty id are ignored. + * + * {@inheritdoc} + */ + protected function loadResource($resource) + { + $stream = fopen($resource, 'r'); + + $defaults = [ + 'ids' => [], + 'translated' => null, + ]; + + $messages = []; + $item = $defaults; + $flags = []; + + while ($line = fgets($stream)) { + $line = trim($line); + + if ('' === $line) { + // Whitespace indicated current item is done + if (!\in_array('fuzzy', $flags)) { + $this->addMessage($messages, $item); + } + $item = $defaults; + $flags = []; + } elseif ('#,' === substr($line, 0, 2)) { + $flags = array_map('trim', explode(',', substr($line, 2))); + } elseif ('msgid "' === substr($line, 0, 7)) { + // We start a new msg so save previous + // TODO: this fails when comments or contexts are added + $this->addMessage($messages, $item); + $item = $defaults; + $item['ids']['singular'] = substr($line, 7, -1); + } elseif ('msgstr "' === substr($line, 0, 8)) { + $item['translated'] = substr($line, 8, -1); + } elseif ('"' === $line[0]) { + $continues = isset($item['translated']) ? 'translated' : 'ids'; + + if (\is_array($item[$continues])) { + end($item[$continues]); + $item[$continues][key($item[$continues])] .= substr($line, 1, -1); + } else { + $item[$continues] .= substr($line, 1, -1); + } + } elseif ('msgid_plural "' === substr($line, 0, 14)) { + $item['ids']['plural'] = substr($line, 14, -1); + } elseif ('msgstr[' === substr($line, 0, 7)) { + $size = strpos($line, ']'); + $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1); + } + } + // save last item + if (!\in_array('fuzzy', $flags)) { + $this->addMessage($messages, $item); + } + fclose($stream); + + return $messages; + } + + /** + * Save a translation item to the messages. + * + * A .po file could contain by error missing plural indexes. We need to + * fix these before saving them. + */ + private function addMessage(array &$messages, array $item) + { + if (!empty($item['ids']['singular'])) { + $id = stripcslashes($item['ids']['singular']); + if (isset($item['ids']['plural'])) { + $id .= '|'.stripcslashes($item['ids']['plural']); + } + + $translated = (array) $item['translated']; + // PO are by definition indexed so sort by index. + ksort($translated); + // Make sure every index is filled. + end($translated); + $count = key($translated); + // Fill missing spots with '-'. + $empties = array_fill(0, $count + 1, '-'); + $translated += $empties; + ksort($translated); + + $messages[$id] = stripcslashes(implode('|', $translated)); + } + } +} diff --git a/vendor/symfony/translation/Loader/QtFileLoader.php b/vendor/symfony/translation/Loader/QtFileLoader.php new file mode 100644 index 0000000..aa89e03 --- /dev/null +++ b/vendor/symfony/translation/Loader/QtFileLoader.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Util\XmlUtils; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * QtFileLoader loads translations from QT Translations XML files. + * + * @author Benjamin Eberlei + */ +class QtFileLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $locale, string $domain = 'messages') + { + if (!class_exists(XmlUtils::class)) { + throw new RuntimeException('Loading translations from the QT format requires the Symfony Config component.'); + } + + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + try { + $dom = XmlUtils::loadFile($resource); + } catch (\InvalidArgumentException $e) { + throw new InvalidResourceException(sprintf('Unable to load "%s".', $resource), $e->getCode(), $e); + } + + $internalErrors = libxml_use_internal_errors(true); + libxml_clear_errors(); + + $xpath = new \DOMXPath($dom); + $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]'); + + $catalogue = new MessageCatalogue($locale); + if (1 == $nodes->length) { + $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message'); + foreach ($translations as $translation) { + $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue; + + if (!empty($translationValue)) { + $catalogue->set( + (string) $translation->getElementsByTagName('source')->item(0)->nodeValue, + $translationValue, + $domain + ); + } + $translation = $translation->nextSibling; + } + + if (class_exists('Symfony\Component\Config\Resource\FileResource')) { + $catalogue->addResource(new FileResource($resource)); + } + } + + libxml_use_internal_errors($internalErrors); + + return $catalogue; + } +} diff --git a/vendor/symfony/translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Loader/XliffFileLoader.php new file mode 100644 index 0000000..dc7e936 --- /dev/null +++ b/vendor/symfony/translation/Loader/XliffFileLoader.php @@ -0,0 +1,214 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Util\XmlUtils; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\Util\XliffUtils; + +/** + * XliffFileLoader loads translations from XLIFF files. + * + * @author Fabien Potencier + */ +class XliffFileLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load($resource, string $locale, string $domain = 'messages') + { + if (!class_exists(XmlUtils::class)) { + throw new RuntimeException('Loading translations from the Xliff format requires the Symfony Config component.'); + } + + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + $catalogue = new MessageCatalogue($locale); + $this->extract($resource, $catalogue, $domain); + + if (class_exists('Symfony\Component\Config\Resource\FileResource')) { + $catalogue->addResource(new FileResource($resource)); + } + + return $catalogue; + } + + private function extract($resource, MessageCatalogue $catalogue, string $domain) + { + try { + $dom = XmlUtils::loadFile($resource); + } catch (\InvalidArgumentException $e) { + throw new InvalidResourceException(sprintf('Unable to load "%s": ', $resource).$e->getMessage(), $e->getCode(), $e); + } + + $xliffVersion = XliffUtils::getVersionNumber($dom); + if ($errors = XliffUtils::validateSchema($dom)) { + throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: ', $resource).XliffUtils::getErrorsAsString($errors)); + } + + if ('1.2' === $xliffVersion) { + $this->extractXliff1($dom, $catalogue, $domain); + } + + if ('2.0' === $xliffVersion) { + $this->extractXliff2($dom, $catalogue, $domain); + } + } + + /** + * Extract messages and metadata from DOMDocument into a MessageCatalogue. + */ + private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) + { + $xml = simplexml_import_dom($dom); + $encoding = strtoupper($dom->encoding); + + $namespace = 'urn:oasis:names:tc:xliff:document:1.2'; + $xml->registerXPathNamespace('xliff', $namespace); + + foreach ($xml->xpath('//xliff:file') as $file) { + $fileAttributes = $file->attributes(); + + $file->registerXPathNamespace('xliff', $namespace); + + foreach ($file->xpath('.//xliff:trans-unit') as $translation) { + $attributes = $translation->attributes(); + + if (!(isset($attributes['resname']) || isset($translation->source))) { + continue; + } + + $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source; + // If the xlf file has another encoding specified, try to convert it because + // simple_xml will always return utf-8 encoded values + $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding); + + $catalogue->set((string) $source, $target, $domain); + + $metadata = [ + 'source' => (string) $translation->source, + 'file' => [ + 'original' => (string) $fileAttributes['original'], + ], + ]; + if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) { + $metadata['notes'] = $notes; + } + + if (isset($translation->target) && $translation->target->attributes()) { + $metadata['target-attributes'] = []; + foreach ($translation->target->attributes() as $key => $value) { + $metadata['target-attributes'][$key] = (string) $value; + } + } + + if (isset($attributes['id'])) { + $metadata['id'] = (string) $attributes['id']; + } + + $catalogue->setMetadata((string) $source, $metadata, $domain); + } + } + } + + private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) + { + $xml = simplexml_import_dom($dom); + $encoding = strtoupper($dom->encoding); + + $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0'); + + foreach ($xml->xpath('//xliff:unit') as $unit) { + foreach ($unit->segment as $segment) { + $attributes = $unit->attributes(); + $source = $attributes['name'] ?? $segment->source; + + // If the xlf file has another encoding specified, try to convert it because + // simple_xml will always return utf-8 encoded values + $target = $this->utf8ToCharset((string) ($segment->target ?? $segment->source), $encoding); + + $catalogue->set((string) $source, $target, $domain); + + $metadata = []; + if (isset($segment->target) && $segment->target->attributes()) { + $metadata['target-attributes'] = []; + foreach ($segment->target->attributes() as $key => $value) { + $metadata['target-attributes'][$key] = (string) $value; + } + } + + if (isset($unit->notes)) { + $metadata['notes'] = []; + foreach ($unit->notes->note as $noteNode) { + $note = []; + foreach ($noteNode->attributes() as $key => $value) { + $note[$key] = (string) $value; + } + $note['content'] = (string) $noteNode; + $metadata['notes'][] = $note; + } + } + + $catalogue->setMetadata((string) $source, $metadata, $domain); + } + } + } + + /** + * Convert a UTF8 string to the specified encoding. + */ + private function utf8ToCharset(string $content, string $encoding = null): string + { + if ('UTF-8' !== $encoding && !empty($encoding)) { + return mb_convert_encoding($content, $encoding, 'UTF-8'); + } + + return $content; + } + + private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, string $encoding = null): array + { + $notes = []; + + if (null === $noteElement) { + return $notes; + } + + /** @var \SimpleXMLElement $xmlNote */ + foreach ($noteElement as $xmlNote) { + $noteAttributes = $xmlNote->attributes(); + $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)]; + if (isset($noteAttributes['priority'])) { + $note['priority'] = (int) $noteAttributes['priority']; + } + + if (isset($noteAttributes['from'])) { + $note['from'] = (string) $noteAttributes['from']; + } + + $notes[] = $note; + } + + return $notes; + } +} diff --git a/vendor/symfony/translation/Loader/YamlFileLoader.php b/vendor/symfony/translation/Loader/YamlFileLoader.php new file mode 100644 index 0000000..e4bee0c --- /dev/null +++ b/vendor/symfony/translation/Loader/YamlFileLoader.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\LogicException; +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Parser as YamlParser; +use Symfony\Component\Yaml\Yaml; + +/** + * YamlFileLoader loads translations from Yaml files. + * + * @author Fabien Potencier + */ +class YamlFileLoader extends FileLoader +{ + private $yamlParser; + + /** + * {@inheritdoc} + */ + protected function loadResource($resource) + { + if (null === $this->yamlParser) { + if (!class_exists('Symfony\Component\Yaml\Parser')) { + throw new LogicException('Loading translations from the YAML format requires the Symfony Yaml component.'); + } + + $this->yamlParser = new YamlParser(); + } + + try { + $messages = $this->yamlParser->parseFile($resource, Yaml::PARSE_CONSTANT); + } catch (ParseException $e) { + throw new InvalidResourceException(sprintf('The file "%s" does not contain valid YAML: ', $resource).$e->getMessage(), 0, $e); + } + + if (null !== $messages && !\is_array($messages)) { + throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource)); + } + + return $messages ?: []; + } +} diff --git a/vendor/symfony/translation/LoggingTranslator.php b/vendor/symfony/translation/LoggingTranslator.php new file mode 100644 index 0000000..9e72ecb --- /dev/null +++ b/vendor/symfony/translation/LoggingTranslator.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * @author Abdellatif Ait boudad + */ +class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface +{ + /** + * @var TranslatorInterface|TranslatorBagInterface + */ + private $translator; + + private $logger; + + /** + * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface + */ + public function __construct(TranslatorInterface $translator, LoggerInterface $logger) + { + if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { + throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', get_debug_type($translator))); + } + + $this->translator = $translator; + $this->logger = $logger; + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) + { + $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); + $this->log($id, $domain, $locale); + + return $trans; + } + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $prev = $this->translator->getLocale(); + $this->translator->setLocale($locale); + if ($prev === $locale) { + return; + } + + $this->logger->debug(sprintf('The locale of the translator has changed from "%s" to "%s".', $prev, $locale)); + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->translator->getLocale(); + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null) + { + return $this->translator->getCatalogue($locale); + } + + /** + * Gets the fallback locales. + * + * @return array The fallback locales + */ + public function getFallbackLocales() + { + if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { + return $this->translator->getFallbackLocales(); + } + + return []; + } + + /** + * Passes through all unknown calls onto the translator object. + */ + public function __call(string $method, array $args) + { + return $this->translator->{$method}(...$args); + } + + /** + * Logs for missing translations. + */ + private function log(string $id, ?string $domain, ?string $locale) + { + if (null === $domain) { + $domain = 'messages'; + } + + $catalogue = $this->translator->getCatalogue($locale); + if ($catalogue->defines($id, $domain)) { + return; + } + + if ($catalogue->has($id, $domain)) { + $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); + } else { + $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); + } + } +} diff --git a/vendor/symfony/translation/MessageCatalogue.php b/vendor/symfony/translation/MessageCatalogue.php new file mode 100644 index 0000000..d50ae03 --- /dev/null +++ b/vendor/symfony/translation/MessageCatalogue.php @@ -0,0 +1,318 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Config\Resource\ResourceInterface; +use Symfony\Component\Translation\Exception\LogicException; + +/** + * @author Fabien Potencier + */ +class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface +{ + private $messages = []; + private $metadata = []; + private $resources = []; + private $locale; + private $fallbackCatalogue; + private $parent; + + /** + * @param string $locale The locale + * @param array $messages An array of messages classified by domain + */ + public function __construct(string $locale, array $messages = []) + { + $this->locale = $locale; + $this->messages = $messages; + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->locale; + } + + /** + * {@inheritdoc} + */ + public function getDomains() + { + $domains = []; + $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX); + + foreach ($this->messages as $domain => $messages) { + if (\strlen($domain) > $suffixLength && false !== $i = strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) { + $domain = substr($domain, 0, $i); + } + $domains[$domain] = $domain; + } + + return array_values($domains); + } + + /** + * {@inheritdoc} + */ + public function all(string $domain = null) + { + if (null !== $domain) { + // skip messages merge if intl-icu requested explicitly + if (false !== strpos($domain, self::INTL_DOMAIN_SUFFIX)) { + return $this->messages[$domain] ?? []; + } + + return ($this->messages[$domain.self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []); + } + + $allMessages = []; + $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX); + + foreach ($this->messages as $domain => $messages) { + if (\strlen($domain) > $suffixLength && false !== $i = strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) { + $domain = substr($domain, 0, $i); + $allMessages[$domain] = $messages + ($allMessages[$domain] ?? []); + } else { + $allMessages[$domain] = ($allMessages[$domain] ?? []) + $messages; + } + } + + return $allMessages; + } + + /** + * {@inheritdoc} + */ + public function set(string $id, string $translation, string $domain = 'messages') + { + $this->add([$id => $translation], $domain); + } + + /** + * {@inheritdoc} + */ + public function has(string $id, string $domain = 'messages') + { + if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { + return true; + } + + if (null !== $this->fallbackCatalogue) { + return $this->fallbackCatalogue->has($id, $domain); + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function defines(string $id, string $domain = 'messages') + { + return isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]); + } + + /** + * {@inheritdoc} + */ + public function get(string $id, string $domain = 'messages') + { + if (isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { + return $this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]; + } + + if (isset($this->messages[$domain][$id])) { + return $this->messages[$domain][$id]; + } + + if (null !== $this->fallbackCatalogue) { + return $this->fallbackCatalogue->get($id, $domain); + } + + return $id; + } + + /** + * {@inheritdoc} + */ + public function replace(array $messages, string $domain = 'messages') + { + unset($this->messages[$domain], $this->messages[$domain.self::INTL_DOMAIN_SUFFIX]); + + $this->add($messages, $domain); + } + + /** + * {@inheritdoc} + */ + public function add(array $messages, string $domain = 'messages') + { + if (!isset($this->messages[$domain])) { + $this->messages[$domain] = []; + } + $intlDomain = $domain; + $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX); + if (\strlen($domain) > $suffixLength && false !== strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) { + $intlDomain .= self::INTL_DOMAIN_SUFFIX; + } + foreach ($messages as $id => $message) { + if (isset($this->messages[$intlDomain]) && \array_key_exists($id, $this->messages[$intlDomain])) { + $this->messages[$intlDomain][$id] = $message; + } else { + $this->messages[$domain][$id] = $message; + } + } + } + + /** + * {@inheritdoc} + */ + public function addCatalogue(MessageCatalogueInterface $catalogue) + { + if ($catalogue->getLocale() !== $this->locale) { + throw new LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s".', $catalogue->getLocale(), $this->locale)); + } + + foreach ($catalogue->all() as $domain => $messages) { + if ($intlMessages = $catalogue->all($domain.self::INTL_DOMAIN_SUFFIX)) { + $this->add($intlMessages, $domain.self::INTL_DOMAIN_SUFFIX); + $messages = array_diff_key($messages, $intlMessages); + } + $this->add($messages, $domain); + } + + foreach ($catalogue->getResources() as $resource) { + $this->addResource($resource); + } + + if ($catalogue instanceof MetadataAwareInterface) { + $metadata = $catalogue->getMetadata('', ''); + $this->addMetadata($metadata); + } + } + + /** + * {@inheritdoc} + */ + public function addFallbackCatalogue(MessageCatalogueInterface $catalogue) + { + // detect circular references + $c = $catalogue; + while ($c = $c->getFallbackCatalogue()) { + if ($c->getLocale() === $this->getLocale()) { + throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); + } + } + + $c = $this; + do { + if ($c->getLocale() === $catalogue->getLocale()) { + throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); + } + + foreach ($catalogue->getResources() as $resource) { + $c->addResource($resource); + } + } while ($c = $c->parent); + + $catalogue->parent = $this; + $this->fallbackCatalogue = $catalogue; + + foreach ($catalogue->getResources() as $resource) { + $this->addResource($resource); + } + } + + /** + * {@inheritdoc} + */ + public function getFallbackCatalogue() + { + return $this->fallbackCatalogue; + } + + /** + * {@inheritdoc} + */ + public function getResources() + { + return array_values($this->resources); + } + + /** + * {@inheritdoc} + */ + public function addResource(ResourceInterface $resource) + { + $this->resources[$resource->__toString()] = $resource; + } + + /** + * {@inheritdoc} + */ + public function getMetadata(string $key = '', string $domain = 'messages') + { + if ('' == $domain) { + return $this->metadata; + } + + if (isset($this->metadata[$domain])) { + if ('' == $key) { + return $this->metadata[$domain]; + } + + if (isset($this->metadata[$domain][$key])) { + return $this->metadata[$domain][$key]; + } + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function setMetadata(string $key, $value, string $domain = 'messages') + { + $this->metadata[$domain][$key] = $value; + } + + /** + * {@inheritdoc} + */ + public function deleteMetadata(string $key = '', string $domain = 'messages') + { + if ('' == $domain) { + $this->metadata = []; + } elseif ('' == $key) { + unset($this->metadata[$domain]); + } else { + unset($this->metadata[$domain][$key]); + } + } + + /** + * Adds current values with the new values. + * + * @param array $values Values to add + */ + private function addMetadata(array $values) + { + foreach ($values as $domain => $keys) { + foreach ($keys as $key => $value) { + $this->setMetadata($key, $value, $domain); + } + } + } +} diff --git a/vendor/symfony/translation/MessageCatalogueInterface.php b/vendor/symfony/translation/MessageCatalogueInterface.php new file mode 100644 index 0000000..6683eeb --- /dev/null +++ b/vendor/symfony/translation/MessageCatalogueInterface.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Config\Resource\ResourceInterface; + +/** + * MessageCatalogueInterface. + * + * @author Fabien Potencier + */ +interface MessageCatalogueInterface +{ + const INTL_DOMAIN_SUFFIX = '+intl-icu'; + + /** + * Gets the catalogue locale. + * + * @return string The locale + */ + public function getLocale(); + + /** + * Gets the domains. + * + * @return array An array of domains + */ + public function getDomains(); + + /** + * Gets the messages within a given domain. + * + * If $domain is null, it returns all messages. + * + * @param string $domain The domain name + * + * @return array An array of messages + */ + public function all(string $domain = null); + + /** + * Sets a message translation. + * + * @param string $id The message id + * @param string $translation The messages translation + * @param string $domain The domain name + */ + public function set(string $id, string $translation, string $domain = 'messages'); + + /** + * Checks if a message has a translation. + * + * @param string $id The message id + * @param string $domain The domain name + * + * @return bool true if the message has a translation, false otherwise + */ + public function has(string $id, string $domain = 'messages'); + + /** + * Checks if a message has a translation (it does not take into account the fallback mechanism). + * + * @param string $id The message id + * @param string $domain The domain name + * + * @return bool true if the message has a translation, false otherwise + */ + public function defines(string $id, string $domain = 'messages'); + + /** + * Gets a message translation. + * + * @param string $id The message id + * @param string $domain The domain name + * + * @return string The message translation + */ + public function get(string $id, string $domain = 'messages'); + + /** + * Sets translations for a given domain. + * + * @param array $messages An array of translations + * @param string $domain The domain name + */ + public function replace(array $messages, string $domain = 'messages'); + + /** + * Adds translations for a given domain. + * + * @param array $messages An array of translations + * @param string $domain The domain name + */ + public function add(array $messages, string $domain = 'messages'); + + /** + * Merges translations from the given Catalogue into the current one. + * + * The two catalogues must have the same locale. + */ + public function addCatalogue(self $catalogue); + + /** + * Merges translations from the given Catalogue into the current one + * only when the translation does not exist. + * + * This is used to provide default translations when they do not exist for the current locale. + */ + public function addFallbackCatalogue(self $catalogue); + + /** + * Gets the fallback catalogue. + * + * @return self|null A MessageCatalogueInterface instance or null when no fallback has been set + */ + public function getFallbackCatalogue(); + + /** + * Returns an array of resources loaded to build this collection. + * + * @return ResourceInterface[] An array of resources + */ + public function getResources(); + + /** + * Adds a resource for this collection. + */ + public function addResource(ResourceInterface $resource); +} diff --git a/vendor/symfony/translation/MetadataAwareInterface.php b/vendor/symfony/translation/MetadataAwareInterface.php new file mode 100644 index 0000000..d157a07 --- /dev/null +++ b/vendor/symfony/translation/MetadataAwareInterface.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +/** + * MetadataAwareInterface. + * + * @author Fabien Potencier + */ +interface MetadataAwareInterface +{ + /** + * Gets metadata for the given domain and key. + * + * Passing an empty domain will return an array with all metadata indexed by + * domain and then by key. Passing an empty key will return an array with all + * metadata for the given domain. + * + * @param string $key The key + * @param string $domain The domain name + * + * @return mixed The value that was set or an array with the domains/keys or null + */ + public function getMetadata(string $key = '', string $domain = 'messages'); + + /** + * Adds metadata to a message domain. + * + * @param string $key The key + * @param mixed $value The value + * @param string $domain The domain name + */ + public function setMetadata(string $key, $value, string $domain = 'messages'); + + /** + * Deletes metadata for the given key and domain. + * + * Passing an empty domain will delete all metadata. Passing an empty key will + * delete all metadata for the given domain. + * + * @param string $key The key + * @param string $domain The domain name + */ + public function deleteMetadata(string $key = '', string $domain = 'messages'); +} diff --git a/vendor/symfony/translation/README.md b/vendor/symfony/translation/README.md new file mode 100644 index 0000000..f4f1706 --- /dev/null +++ b/vendor/symfony/translation/README.md @@ -0,0 +1,31 @@ +Translation Component +===================== + +The Translation component provides tools to internationalize your application. + +Getting Started +--------------- + +``` +$ composer require symfony/translation +``` + +```php +use Symfony\Component\Translation\Translator; + +$translator = new Translator('fr_FR'); +$translator->addResource('array', [ + 'Hello World!' => 'Bonjour !', +], 'fr_FR'); + +echo $translator->trans('Hello World!'); // outputs « Bonjour ! » +``` + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/translation.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/translation/Reader/TranslationReader.php b/vendor/symfony/translation/Reader/TranslationReader.php new file mode 100644 index 0000000..9e51b15 --- /dev/null +++ b/vendor/symfony/translation/Reader/TranslationReader.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Reader; + +use Symfony\Component\Finder\Finder; +use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationReader reads translation messages from translation files. + * + * @author Michel Salib + */ +class TranslationReader implements TranslationReaderInterface +{ + /** + * Loaders used for import. + * + * @var array + */ + private $loaders = []; + + /** + * Adds a loader to the translation extractor. + * + * @param string $format The format of the loader + */ + public function addLoader(string $format, LoaderInterface $loader) + { + $this->loaders[$format] = $loader; + } + + /** + * {@inheritdoc} + */ + public function read(string $directory, MessageCatalogue $catalogue) + { + if (!is_dir($directory)) { + return; + } + + foreach ($this->loaders as $format => $loader) { + // load any existing translation files + $finder = new Finder(); + $extension = $catalogue->getLocale().'.'.$format; + $files = $finder->files()->name('*.'.$extension)->in($directory); + foreach ($files as $file) { + $domain = substr($file->getFilename(), 0, -1 * \strlen($extension) - 1); + $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain)); + } + } + } +} diff --git a/vendor/symfony/translation/Reader/TranslationReaderInterface.php b/vendor/symfony/translation/Reader/TranslationReaderInterface.php new file mode 100644 index 0000000..bc37204 --- /dev/null +++ b/vendor/symfony/translation/Reader/TranslationReaderInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Reader; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationReader reads translation messages from translation files. + * + * @author Tobias Nyholm + */ +interface TranslationReaderInterface +{ + /** + * Reads translation messages from a directory to the catalogue. + */ + public function read(string $directory, MessageCatalogue $catalogue); +} diff --git a/vendor/symfony/translation/Resources/bin/translation-status.php b/vendor/symfony/translation/Resources/bin/translation-status.php new file mode 100644 index 0000000..44918c9 --- /dev/null +++ b/vendor/symfony/translation/Resources/bin/translation-status.php @@ -0,0 +1,207 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$usageInstructions = << false, + // NULL = analyze all locales + 'locale_to_analyze' => null, + // the reference files all the other translations are compared to + 'original_files' => [ + 'src/Symfony/Component/Form/Resources/translations/validators.en.xlf', + 'src/Symfony/Component/Security/Core/Resources/translations/security.en.xlf', + 'src/Symfony/Component/Validator/Resources/translations/validators.en.xlf', + ], +]; + +$argc = $_SERVER['argc']; +$argv = $_SERVER['argv']; + +if ($argc > 3) { + echo str_replace('translation-status.php', $argv[0], $usageInstructions); + exit(1); +} + +foreach (array_slice($argv, 1) as $argumentOrOption) { + if (0 === strpos($argumentOrOption, '-')) { + $config['verbose_output'] = true; + } else { + $config['locale_to_analyze'] = $argumentOrOption; + } +} + +foreach ($config['original_files'] as $originalFilePath) { + if (!file_exists($originalFilePath)) { + echo sprintf('The following file does not exist. Make sure that you execute this command at the root dir of the Symfony code repository.%s %s', PHP_EOL, $originalFilePath); + exit(1); + } +} + +$totalMissingTranslations = 0; + +foreach ($config['original_files'] as $originalFilePath) { + $translationFilePaths = findTranslationFiles($originalFilePath, $config['locale_to_analyze']); + $translationStatus = calculateTranslationStatus($originalFilePath, $translationFilePaths); + + $totalMissingTranslations += array_sum(array_map(function ($translation) { + return count($translation['missingKeys']); + }, array_values($translationStatus))); + + printTranslationStatus($originalFilePath, $translationStatus, $config['verbose_output']); +} + +exit($totalMissingTranslations > 0 ? 1 : 0); + +function findTranslationFiles($originalFilePath, $localeToAnalyze) +{ + $translations = []; + + $translationsDir = dirname($originalFilePath); + $originalFileName = basename($originalFilePath); + $translationFileNamePattern = str_replace('.en.', '.*.', $originalFileName); + + $translationFiles = glob($translationsDir.'/'.$translationFileNamePattern, GLOB_NOSORT); + sort($translationFiles); + foreach ($translationFiles as $filePath) { + $locale = extractLocaleFromFilePath($filePath); + + if (null !== $localeToAnalyze && $locale !== $localeToAnalyze) { + continue; + } + + $translations[$locale] = $filePath; + } + + return $translations; +} + +function calculateTranslationStatus($originalFilePath, $translationFilePaths) +{ + $translationStatus = []; + $allTranslationKeys = extractTranslationKeys($originalFilePath); + + foreach ($translationFilePaths as $locale => $translationPath) { + $translatedKeys = extractTranslationKeys($translationPath); + $missingKeys = array_diff_key($allTranslationKeys, $translatedKeys); + + $translationStatus[$locale] = [ + 'total' => count($allTranslationKeys), + 'translated' => count($translatedKeys), + 'missingKeys' => $missingKeys, + ]; + } + + return $translationStatus; +} + +function printTranslationStatus($originalFilePath, $translationStatus, $verboseOutput) +{ + printTitle($originalFilePath); + printTable($translationStatus, $verboseOutput); + echo PHP_EOL.PHP_EOL; +} + +function extractLocaleFromFilePath($filePath) +{ + $parts = explode('.', $filePath); + + return $parts[count($parts) - 2]; +} + +function extractTranslationKeys($filePath) +{ + $translationKeys = []; + $contents = new \SimpleXMLElement(file_get_contents($filePath)); + + foreach ($contents->file->body->{'trans-unit'} as $translationKey) { + $translationId = (string) $translationKey['id']; + $translationKey = (string) $translationKey->source; + + $translationKeys[$translationId] = $translationKey; + } + + return $translationKeys; +} + +function printTitle($title) +{ + echo $title.PHP_EOL; + echo str_repeat('=', strlen($title)).PHP_EOL.PHP_EOL; +} + +function printTable($translations, $verboseOutput) +{ + if (0 === count($translations)) { + echo 'No translations found'; + + return; + } + $longestLocaleNameLength = max(array_map('strlen', array_keys($translations))); + + foreach ($translations as $locale => $translation) { + if ($translation['translated'] > $translation['total']) { + textColorRed(); + } elseif ($translation['translated'] === $translation['total']) { + textColorGreen(); + } + + echo sprintf('| Locale: %-'.$longestLocaleNameLength.'s | Translated: %d/%d', $locale, $translation['translated'], $translation['total']).PHP_EOL; + + textColorNormal(); + + if (true === $verboseOutput && count($translation['missingKeys']) > 0) { + echo str_repeat('-', 80).PHP_EOL; + echo '| Missing Translations:'.PHP_EOL; + + foreach ($translation['missingKeys'] as $id => $content) { + echo sprintf('| (id=%s) %s', $id, $content).PHP_EOL; + } + + echo str_repeat('-', 80).PHP_EOL; + } + } +} + +function textColorGreen() +{ + echo "\033[32m"; +} + +function textColorRed() +{ + echo "\033[31m"; +} + +function textColorNormal() +{ + echo "\033[0m"; +} diff --git a/vendor/symfony/translation/Resources/data/parents.json b/vendor/symfony/translation/Resources/data/parents.json new file mode 100644 index 0000000..d334b29 --- /dev/null +++ b/vendor/symfony/translation/Resources/data/parents.json @@ -0,0 +1,138 @@ +{ + "az_Cyrl": "root", + "bs_Cyrl": "root", + "en_150": "en_001", + "en_AG": "en_001", + "en_AI": "en_001", + "en_AT": "en_150", + "en_AU": "en_001", + "en_BB": "en_001", + "en_BE": "en_150", + "en_BM": "en_001", + "en_BS": "en_001", + "en_BW": "en_001", + "en_BZ": "en_001", + "en_CA": "en_001", + "en_CC": "en_001", + "en_CH": "en_150", + "en_CK": "en_001", + "en_CM": "en_001", + "en_CX": "en_001", + "en_CY": "en_001", + "en_DE": "en_150", + "en_DG": "en_001", + "en_DK": "en_150", + "en_DM": "en_001", + "en_ER": "en_001", + "en_FI": "en_150", + "en_FJ": "en_001", + "en_FK": "en_001", + "en_FM": "en_001", + "en_GB": "en_001", + "en_GD": "en_001", + "en_GG": "en_001", + "en_GH": "en_001", + "en_GI": "en_001", + "en_GM": "en_001", + "en_GY": "en_001", + "en_HK": "en_001", + "en_IE": "en_001", + "en_IL": "en_001", + "en_IM": "en_001", + "en_IN": "en_001", + "en_IO": "en_001", + "en_JE": "en_001", + "en_JM": "en_001", + "en_KE": "en_001", + "en_KI": "en_001", + "en_KN": "en_001", + "en_KY": "en_001", + "en_LC": "en_001", + "en_LR": "en_001", + "en_LS": "en_001", + "en_MG": "en_001", + "en_MO": "en_001", + "en_MS": "en_001", + "en_MT": "en_001", + "en_MU": "en_001", + "en_MW": "en_001", + "en_MY": "en_001", + "en_NA": "en_001", + "en_NF": "en_001", + "en_NG": "en_001", + "en_NL": "en_150", + "en_NR": "en_001", + "en_NU": "en_001", + "en_NZ": "en_001", + "en_PG": "en_001", + "en_PH": "en_001", + "en_PK": "en_001", + "en_PN": "en_001", + "en_PW": "en_001", + "en_RW": "en_001", + "en_SB": "en_001", + "en_SC": "en_001", + "en_SD": "en_001", + "en_SE": "en_150", + "en_SG": "en_001", + "en_SH": "en_001", + "en_SI": "en_150", + "en_SL": "en_001", + "en_SS": "en_001", + "en_SX": "en_001", + "en_SZ": "en_001", + "en_TC": "en_001", + "en_TK": "en_001", + "en_TO": "en_001", + "en_TT": "en_001", + "en_TV": "en_001", + "en_TZ": "en_001", + "en_UG": "en_001", + "en_VC": "en_001", + "en_VG": "en_001", + "en_VU": "en_001", + "en_WS": "en_001", + "en_ZA": "en_001", + "en_ZM": "en_001", + "en_ZW": "en_001", + "es_AR": "es_419", + "es_BO": "es_419", + "es_BR": "es_419", + "es_BZ": "es_419", + "es_CL": "es_419", + "es_CO": "es_419", + "es_CR": "es_419", + "es_CU": "es_419", + "es_DO": "es_419", + "es_EC": "es_419", + "es_GT": "es_419", + "es_HN": "es_419", + "es_MX": "es_419", + "es_NI": "es_419", + "es_PA": "es_419", + "es_PE": "es_419", + "es_PR": "es_419", + "es_PY": "es_419", + "es_SV": "es_419", + "es_US": "es_419", + "es_UY": "es_419", + "es_VE": "es_419", + "ff_Adlm": "root", + "pa_Arab": "root", + "pt_AO": "pt_PT", + "pt_CH": "pt_PT", + "pt_CV": "pt_PT", + "pt_GQ": "pt_PT", + "pt_GW": "pt_PT", + "pt_LU": "pt_PT", + "pt_MO": "pt_PT", + "pt_MZ": "pt_PT", + "pt_ST": "pt_PT", + "pt_TL": "pt_PT", + "sd_Deva": "root", + "sr_Latn": "root", + "uz_Arab": "root", + "uz_Cyrl": "root", + "zh_Hant": "root", + "zh_Hant_MO": "zh_Hant_HK" +} diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd new file mode 100644 index 0000000..dface62 --- /dev/null +++ b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd @@ -0,0 +1,2223 @@ + + + + + + + + + + + + + + + Values for the attribute 'context-type'. + + + + + Indicates a database content. + + + + + Indicates the content of an element within an XML document. + + + + + Indicates the name of an element within an XML document. + + + + + Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found. + + + + + Indicates a the number of parameters contained within the <source>. + + + + + Indicates notes pertaining to the parameters in the <source>. + + + + + Indicates the content of a record within a database. + + + + + Indicates the name of a record within a database. + + + + + Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file. + + + + + + + Values for the attribute 'count-type'. + + + + + Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts. + + + + + Indicates the count units are translation units existing already in the same document. + + + + + Indicates a total count. + + + + + + + Values for the attribute 'ctype' when used other elements than <ph> or <x>. + + + + + Indicates a run of bolded text. + + + + + Indicates a run of text in italics. + + + + + Indicates a run of underlined text. + + + + + Indicates a run of hyper-text. + + + + + + + Values for the attribute 'ctype' when used with <ph> or <x>. + + + + + Indicates a inline image. + + + + + Indicates a page break. + + + + + Indicates a line break. + + + + + + + + + + + + Values for the attribute 'datatype'. + + + + + Indicates Active Server Page data. + + + + + Indicates C source file data. + + + + + Indicates Channel Definition Format (CDF) data. + + + + + Indicates ColdFusion data. + + + + + Indicates C++ source file data. + + + + + Indicates C-Sharp data. + + + + + Indicates strings from C, ASM, and driver files data. + + + + + Indicates comma-separated values data. + + + + + Indicates database data. + + + + + Indicates portions of document that follows data and contains metadata. + + + + + Indicates portions of document that precedes data and contains metadata. + + + + + Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import). + + + + + Indicates standard user input screen data. + + + + + Indicates HyperText Markup Language (HTML) data - document instance. + + + + + Indicates content within an HTML document’s <body> element. + + + + + Indicates Windows INI file data. + + + + + Indicates Interleaf data. + + + + + Indicates Java source file data (extension '.java'). + + + + + Indicates Java property resource bundle data. + + + + + Indicates Java list resource bundle data. + + + + + Indicates JavaScript source file data. + + + + + Indicates JScript source file data. + + + + + Indicates information relating to formatting. + + + + + Indicates LISP source file data. + + + + + Indicates information relating to margin formats. + + + + + Indicates a file containing menu. + + + + + Indicates numerically identified string table. + + + + + Indicates Maker Interchange Format (MIF) data. + + + + + Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute. + + + + + Indicates GNU Machine Object data. + + + + + Indicates Message Librarian strings created by Novell's Message Librarian Tool. + + + + + Indicates information to be displayed at the bottom of each page of a document. + + + + + Indicates information to be displayed at the top of each page of a document. + + + + + Indicates a list of property values (e.g., settings within INI files or preferences dialog). + + + + + Indicates Pascal source file data. + + + + + Indicates Hypertext Preprocessor data. + + + + + Indicates plain text file (no formatting other than, possibly, wrapping). + + + + + Indicates GNU Portable Object file. + + + + + Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc. + + + + + Indicates Windows .NET binary resources. + + + + + Indicates Windows .NET Resources. + + + + + Indicates Rich Text Format (RTF) data. + + + + + Indicates Standard Generalized Markup Language (SGML) data - document instance. + + + + + Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD). + + + + + Indicates Scalable Vector Graphic (SVG) data. + + + + + Indicates VisualBasic Script source file. + + + + + Indicates warning message. + + + + + Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file). + + + + + Indicates Extensible HyperText Markup Language (XHTML) data - document instance. + + + + + Indicates Extensible Markup Language (XML) data - document instance. + + + + + Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD). + + + + + Indicates Extensible Stylesheet Language (XSL) data. + + + + + Indicates XUL elements. + + + + + + + Values for the attribute 'mtype'. + + + + + Indicates the marked text is an abbreviation. + + + + + ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept. + + + + + ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective'). + + + + + ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging'). + + + + + ISO-12620: A proper-name term, such as the name of an agency or other proper entity. + + + + + ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another. + + + + + ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language. + + + + + Indicates the marked text is a date and/or time. + + + + + ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign. + + + + + ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form. + + + + + ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula. + + + + + ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record. + + + + + ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy'). + + + + + ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body. + + + + + ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages. + + + + + ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like. + + + + + ISO-12620 2.1.17: A unit to track object. + + + + + Indicates the marked text is a name. + + + + + ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others. + + + + + ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system. + + + + + Indicates the marked text is a phrase. + + + + + ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase. + + + + + Indicates the marked text should not be translated. + + + + + ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet. + + + + + Indicates that the marked text represents a segment. + + + + + ISO-12620 2.1.18.2: A fixed, lexicalized phrase. + + + + + ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs'). + + + + + ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system. + + + + + ISO-12620 2.1.19: A fixed chunk of recurring text. + + + + + ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof. + + + + + ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry. + + + + + ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language. + + + + + Indicates the marked text is a term. + + + + + ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted. + + + + + ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system. + + + + + ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza'). + + + + + ISO-12620 2.1.9: One of the alternate forms of a term. + + + + + + + Values for the attribute 'restype'. + + + + + Indicates a Windows RC AUTO3STATE control. + + + + + Indicates a Windows RC AUTOCHECKBOX control. + + + + + Indicates a Windows RC AUTORADIOBUTTON control. + + + + + Indicates a Windows RC BEDIT control. + + + + + Indicates a bitmap, for example a BITMAP resource in Windows. + + + + + Indicates a button object, for example a BUTTON control Windows. + + + + + Indicates a caption, such as the caption of a dialog box. + + + + + Indicates the cell in a table, for example the content of the <td> element in HTML. + + + + + Indicates check box object, for example a CHECKBOX control in Windows. + + + + + Indicates a menu item with an associated checkbox. + + + + + Indicates a list box, but with a check-box for each item. + + + + + Indicates a color selection dialog. + + + + + Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows. + + + + + Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234). + + + + + Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403). + + + + + Indicates a UI base class element that cannot be represented by any other element. + + + + + Indicates a context menu. + + + + + Indicates a Windows RC CTEXT control. + + + + + Indicates a cursor, for example a CURSOR resource in Windows. + + + + + Indicates a date/time picker. + + + + + Indicates a Windows RC DEFPUSHBUTTON control. + + + + + Indicates a dialog box. + + + + + Indicates a Windows RC DLGINIT resource block. + + + + + Indicates an edit box object, for example an EDIT control in Windows. + + + + + Indicates a filename. + + + + + Indicates a file dialog. + + + + + Indicates a footnote. + + + + + Indicates a font name. + + + + + Indicates a footer. + + + + + Indicates a frame object. + + + + + Indicates a XUL grid element. + + + + + Indicates a groupbox object, for example a GROUPBOX control in Windows. + + + + + Indicates a header item. + + + + + Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML. + + + + + Indicates a Windows RC HEDIT control. + + + + + Indicates a horizontal scrollbar. + + + + + Indicates an icon, for example an ICON resource in Windows. + + + + + Indicates a Windows RC IEDIT control. + + + + + Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF. + + + + + Indicates a label object. + + + + + Indicates a label that is also a HTML link (not necessarily a URL). + + + + + Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML). + + + + + Indicates a listbox object, for example an LISTBOX control in Windows. + + + + + Indicates an list item (an entry in a list). + + + + + Indicates a Windows RC LTEXT control. + + + + + Indicates a menu (a group of menu-items). + + + + + Indicates a toolbar containing one or more tope level menus. + + + + + Indicates a menu item (an entry in a menu). + + + + + Indicates a XUL menuseparator element. + + + + + Indicates a message, for example an entry in a MESSAGETABLE resource in Windows. + + + + + Indicates a calendar control. + + + + + Indicates an edit box beside a spin control. + + + + + Indicates a catch all for rectangular areas. + + + + + Indicates a standalone menu not necessarily associated with a menubar. + + + + + Indicates a pushbox object, for example a PUSHBOX control in Windows. + + + + + Indicates a Windows RC PUSHBUTTON control. + + + + + Indicates a radio button object. + + + + + Indicates a menuitem with associated radio button. + + + + + Indicates raw data resources for an application. + + + + + Indicates a row in a table. + + + + + Indicates a Windows RC RTEXT control. + + + + + Indicates a user navigable container used to show a portion of a document. + + + + + Indicates a generic divider object (e.g. menu group separator). + + + + + Windows accelerators, shortcuts in resource or property files. + + + + + Indicates a UI control to indicate process activity but not progress. + + + + + Indicates a splitter bar. + + + + + Indicates a Windows RC STATE3 control. + + + + + Indicates a window for providing feedback to the users, like 'read-only', etc. + + + + + Indicates a string, for example an entry in a STRINGTABLE resource in Windows. + + + + + Indicates a layers of controls with a tab to select layers. + + + + + Indicates a display and edits regular two-dimensional tables of cells. + + + + + Indicates a XUL textbox element. + + + + + Indicates a UI button that can be toggled to on or off state. + + + + + Indicates an array of controls, usually buttons. + + + + + Indicates a pop up tool tip text. + + + + + Indicates a bar with a pointer indicating a position within a certain range. + + + + + Indicates a control that displays a set of hierarchical data. + + + + + Indicates a URI (URN or URL). + + + + + Indicates a Windows RC USERBUTTON control. + + + + + Indicates a user-defined control like CONTROL control in Windows. + + + + + Indicates the text of a variable. + + + + + Indicates version information about a resource like VERSIONINFO in Windows. + + + + + Indicates a vertical scrollbar. + + + + + Indicates a graphical window. + + + + + + + Values for the attribute 'size-unit'. + + + + + Indicates a size in 8-bit bytes. + + + + + Indicates a size in Unicode characters. + + + + + Indicates a size in columns. Used for HTML text area. + + + + + Indicates a size in centimeters. + + + + + Indicates a size in dialog units, as defined in Windows resources. + + + + + Indicates a size in 'font-size' units (as defined in CSS). + + + + + Indicates a size in 'x-height' units (as defined in CSS). + + + + + Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster' + + + + + Indicates a size in inches. + + + + + Indicates a size in millimeters. + + + + + Indicates a size in percentage. + + + + + Indicates a size in pixels. + + + + + Indicates a size in point. + + + + + Indicates a size in rows. Used for HTML text area. + + + + + + + Values for the attribute 'state'. + + + + + Indicates the terminating state. + + + + + Indicates only non-textual information needs adaptation. + + + + + Indicates both text and non-textual information needs adaptation. + + + + + Indicates only non-textual information needs review. + + + + + Indicates both text and non-textual information needs review. + + + + + Indicates that only the text of the item needs to be reviewed. + + + + + Indicates that the item needs to be translated. + + + + + Indicates that the item is new. For example, translation units that were not in a previous version of the document. + + + + + Indicates that changes are reviewed and approved. + + + + + Indicates that the item has been translated. + + + + + + + Values for the attribute 'state-qualifier'. + + + + + Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously. + + + + + Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.). + + + + + Indicates a match based on matching IDs (in addition to matching text). + + + + + Indicates a translation derived from a glossary. + + + + + Indicates a translation derived from existing translation. + + + + + Indicates a translation derived from machine translation. + + + + + Indicates a translation derived from a translation repository. + + + + + Indicates a translation derived from a translation memory. + + + + + Indicates the translation is suggested by machine translation. + + + + + Indicates that the item has been rejected because of incorrect grammar. + + + + + Indicates that the item has been rejected because it is incorrect. + + + + + Indicates that the item has been rejected because it is too long or too short. + + + + + Indicates that the item has been rejected because of incorrect spelling. + + + + + Indicates the translation is suggested by translation memory. + + + + + + + Values for the attribute 'unit'. + + + + + Refers to words. + + + + + Refers to pages. + + + + + Refers to <trans-unit> elements. + + + + + Refers to <bin-unit> elements. + + + + + Refers to glyphs. + + + + + Refers to <trans-unit> and/or <bin-unit> elements. + + + + + Refers to the occurrences of instances defined by the count-type value. + + + + + Refers to characters. + + + + + Refers to lines. + + + + + Refers to sentences. + + + + + Refers to paragraphs. + + + + + Refers to segments. + + + + + Refers to placeables (inline elements). + + + + + + + Values for the attribute 'priority'. + + + + + Highest priority. + + + + + High priority. + + + + + High priority, but not as important as 2. + + + + + High priority, but not as important as 3. + + + + + Medium priority, but more important than 6. + + + + + Medium priority, but less important than 5. + + + + + Low priority, but more important than 8. + + + + + Low priority, but more important than 9. + + + + + Low priority. + + + + + Lowest priority. + + + + + + + + + This value indicates that all properties can be reformatted. This value must be used alone. + + + + + This value indicates that no properties should be reformatted. This value must be used alone. + + + + + + + + + + + + + This value indicates that all information in the coord attribute can be modified. + + + + + This value indicates that the x information in the coord attribute can be modified. + + + + + This value indicates that the y information in the coord attribute can be modified. + + + + + This value indicates that the cx information in the coord attribute can be modified. + + + + + This value indicates that the cy information in the coord attribute can be modified. + + + + + This value indicates that all the information in the font attribute can be modified. + + + + + This value indicates that the name information in the font attribute can be modified. + + + + + This value indicates that the size information in the font attribute can be modified. + + + + + This value indicates that the weight information in the font attribute can be modified. + + + + + This value indicates that the information in the css-style attribute can be modified. + + + + + This value indicates that the information in the style attribute can be modified. + + + + + This value indicates that the information in the exstyle attribute can be modified. + + + + + + + + + + + + + Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document. + + + + + Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed. + + + + + Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed. + + + + + + + + + Represents a translation proposal from a translation memory or other resource. + + + + + Represents a previous version of the target element. + + + + + Represents a rejected version of the target element. + + + + + Represents a translation to be used for reference purposes only, for example from a related product or a different language. + + + + + Represents a proposed translation that was used for the translation of the trans-unit, possibly modified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Values for the attribute 'coord'. + + + + + + + + Version values: 1.0 and 1.1 are allowed for backward compatibility. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd new file mode 100644 index 0000000..963232f --- /dev/null +++ b/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/symfony/translation/Resources/schemas/xml.xsd b/vendor/symfony/translation/Resources/schemas/xml.xsd new file mode 100644 index 0000000..a46162a --- /dev/null +++ b/vendor/symfony/translation/Resources/schemas/xml.xsd @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + +
    + +

    lang (as an attribute name)

    +

    + + denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.

    + +
    +
    +

    Notes

    +

    + Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. +

    +

    + + See BCP 47 at + http://www.rfc-editor.org/rfc/bcp/bcp47.txt + and the IANA language subtag registry at + + http://www.iana.org/assignments/language-subtag-registry + for further information. +

    +

    + + The union allows for the 'un-declaration' of xml:lang with + the empty string. +

    +
    +
    +
    + + + + + + + + + + +
    + + + + + +
    + +

    space (as an attribute name)

    +

    + denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.

    + +
    +
    +
    + + + + + + + +
    + + + + +
    + +

    base (as an attribute name)

    +

    + denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.

    + +

    + See http://www.w3.org/TR/xmlbase/ + for information about this attribute. +

    + +
    +
    +
    +
    + + + + +
    + +

    id (as an attribute name)

    +

    + + denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.

    + +

    + See http://www.w3.org/TR/xml-id/ + for information about this attribute. +

    +
    +
    +
    + +
    + + + + + + + + + + + +
    + +

    Father (in any context at all)

    + +
    +

    + denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: +

    +
    +

    + + In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father". +

    +
    +
    +
    +
    +
    + + + + +
    +

    About this schema document

    + +
    +

    + This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow xml:base, + xml:lang, xml:space or + xml:id attributes on elements they define. +

    + +

    + To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows: +

    +
    +          <schema.. .>
    +          .. .
    +           <import namespace="http://www.w3.org/XML/1998/namespace"
    +                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
    +     
    +

    + or +

    +
    +
    +           <import namespace="http://www.w3.org/XML/1998/namespace"
    +                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
    +     
    +

    + Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g. +

    +
    +          <type.. .>
    +          .. .
    +           <attributeGroup ref="xml:specialAttrs"/>
    +     
    +

    + will define a type which will schema-validate an instance element + with any of those attributes. +

    + +
    +
    +
    +
    + + + +
    +

    Versioning policy for this schema document

    + +
    +

    + In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + + http://www.w3.org/2009/01/xml.xsd. +

    +

    + At the date of issue it can also be found at + + http://www.w3.org/2001/xml.xsd. +

    + +

    + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at + http://www.w3.org/2001/xml.xsd + + will change accordingly; the version at + + http://www.w3.org/2009/01/xml.xsd + + will not change. +

    +

    + + Previous dated (and unchanging) versions of this schema + document are at: +

    + +
    +
    +
    +
    + + diff --git a/vendor/symfony/translation/Translator.php b/vendor/symfony/translation/Translator.php new file mode 100644 index 0000000..81a71d1 --- /dev/null +++ b/vendor/symfony/translation/Translator.php @@ -0,0 +1,479 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Config\ConfigCacheFactory; +use Symfony\Component\Config\ConfigCacheFactoryInterface; +use Symfony\Component\Config\ConfigCacheInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\Formatter\IntlFormatterInterface; +use Symfony\Component\Translation\Formatter\MessageFormatter; +use Symfony\Component\Translation\Formatter\MessageFormatterInterface; +use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(MessageCatalogue::class); + +/** + * @author Fabien Potencier + */ +class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface +{ + /** + * @var MessageCatalogueInterface[] + */ + protected $catalogues = []; + + /** + * @var string + */ + private $locale; + + /** + * @var array + */ + private $fallbackLocales = []; + + /** + * @var LoaderInterface[] + */ + private $loaders = []; + + /** + * @var array + */ + private $resources = []; + + /** + * @var MessageFormatterInterface + */ + private $formatter; + + /** + * @var string + */ + private $cacheDir; + + /** + * @var bool + */ + private $debug; + + private $cacheVary; + + /** + * @var ConfigCacheFactoryInterface|null + */ + private $configCacheFactory; + + /** + * @var array|null + */ + private $parentLocales; + + private $hasIntlFormatter; + + /** + * @throws InvalidArgumentException If a locale contains invalid characters + */ + public function __construct(string $locale, MessageFormatterInterface $formatter = null, string $cacheDir = null, bool $debug = false, array $cacheVary = []) + { + $this->setLocale($locale); + + if (null === $formatter) { + $formatter = new MessageFormatter(); + } + + $this->formatter = $formatter; + $this->cacheDir = $cacheDir; + $this->debug = $debug; + $this->cacheVary = $cacheVary; + $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface; + } + + public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) + { + $this->configCacheFactory = $configCacheFactory; + } + + /** + * Adds a Loader. + * + * @param string $format The name of the loader (@see addResource()) + */ + public function addLoader(string $format, LoaderInterface $loader) + { + $this->loaders[$format] = $loader; + } + + /** + * Adds a Resource. + * + * @param string $format The name of the loader (@see addLoader()) + * @param mixed $resource The resource name + * + * @throws InvalidArgumentException If the locale contains invalid characters + */ + public function addResource(string $format, $resource, string $locale, string $domain = null) + { + if (null === $domain) { + $domain = 'messages'; + } + + $this->assertValidLocale($locale); + + $this->resources[$locale][] = [$format, $resource, $domain]; + + if (\in_array($locale, $this->fallbackLocales)) { + $this->catalogues = []; + } else { + unset($this->catalogues[$locale]); + } + } + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $this->assertValidLocale($locale); + $this->locale = $locale; + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->locale; + } + + /** + * Sets the fallback locales. + * + * @param array $locales The fallback locales + * + * @throws InvalidArgumentException If a locale contains invalid characters + */ + public function setFallbackLocales(array $locales) + { + // needed as the fallback locales are linked to the already loaded catalogues + $this->catalogues = []; + + foreach ($locales as $locale) { + $this->assertValidLocale($locale); + } + + $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales; + } + + /** + * Gets the fallback locales. + * + * @internal + */ + public function getFallbackLocales(): array + { + return $this->fallbackLocales; + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) + { + if (null === $id || '' === $id) { + return ''; + } + + if (null === $domain) { + $domain = 'messages'; + } + + $catalogue = $this->getCatalogue($locale); + $locale = $catalogue->getLocale(); + while (!$catalogue->defines($id, $domain)) { + if ($cat = $catalogue->getFallbackCatalogue()) { + $catalogue = $cat; + $locale = $catalogue->getLocale(); + } else { + break; + } + } + + if ($this->hasIntlFormatter && $catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters); + } + + return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters); + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null) + { + if (null === $locale) { + $locale = $this->getLocale(); + } else { + $this->assertValidLocale($locale); + } + + if (!isset($this->catalogues[$locale])) { + $this->loadCatalogue($locale); + } + + return $this->catalogues[$locale]; + } + + /** + * Gets the loaders. + * + * @return array LoaderInterface[] + */ + protected function getLoaders() + { + return $this->loaders; + } + + protected function loadCatalogue(string $locale) + { + if (null === $this->cacheDir) { + $this->initializeCatalogue($locale); + } else { + $this->initializeCacheCatalogue($locale); + } + } + + protected function initializeCatalogue(string $locale) + { + $this->assertValidLocale($locale); + + try { + $this->doLoadCatalogue($locale); + } catch (NotFoundResourceException $e) { + if (!$this->computeFallbackLocales($locale)) { + throw $e; + } + } + $this->loadFallbackCatalogues($locale); + } + + private function initializeCacheCatalogue(string $locale): void + { + if (isset($this->catalogues[$locale])) { + /* Catalogue already initialized. */ + return; + } + + $this->assertValidLocale($locale); + $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale), + function (ConfigCacheInterface $cache) use ($locale) { + $this->dumpCatalogue($locale, $cache); + } + ); + + if (isset($this->catalogues[$locale])) { + /* Catalogue has been initialized as it was written out to cache. */ + return; + } + + /* Read catalogue from cache. */ + $this->catalogues[$locale] = include $cache->getPath(); + } + + private function dumpCatalogue(string $locale, ConfigCacheInterface $cache): void + { + $this->initializeCatalogue($locale); + $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]); + + $content = sprintf(<<getAllMessages($this->catalogues[$locale]), true), + $fallbackContent + ); + + $cache->write($content, $this->catalogues[$locale]->getResources()); + } + + private function getFallbackContent(MessageCatalogue $catalogue): string + { + $fallbackContent = ''; + $current = ''; + $replacementPattern = '/[^a-z0-9_]/i'; + $fallbackCatalogue = $catalogue->getFallbackCatalogue(); + while ($fallbackCatalogue) { + $fallback = $fallbackCatalogue->getLocale(); + $fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback)); + $currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current)); + + $fallbackContent .= sprintf(<<<'EOF' +$catalogue%s = new MessageCatalogue('%s', %s); +$catalogue%s->addFallbackCatalogue($catalogue%s); + +EOF + , + $fallbackSuffix, + $fallback, + var_export($this->getAllMessages($fallbackCatalogue), true), + $currentSuffix, + $fallbackSuffix + ); + $current = $fallbackCatalogue->getLocale(); + $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); + } + + return $fallbackContent; + } + + private function getCatalogueCachePath(string $locale): string + { + return $this->cacheDir.'/catalogue.'.$locale.'.'.strtr(substr(base64_encode(hash('sha256', serialize($this->cacheVary), true)), 0, 7), '/', '_').'.php'; + } + + /** + * @internal + */ + protected function doLoadCatalogue(string $locale): void + { + $this->catalogues[$locale] = new MessageCatalogue($locale); + + if (isset($this->resources[$locale])) { + foreach ($this->resources[$locale] as $resource) { + if (!isset($this->loaders[$resource[0]])) { + if (\is_string($resource[1])) { + throw new RuntimeException(sprintf('No loader is registered for the "%s" format when loading the "%s" resource.', $resource[0], $resource[1])); + } + + throw new RuntimeException(sprintf('No loader is registered for the "%s" format.', $resource[0])); + } + $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2])); + } + } + } + + private function loadFallbackCatalogues(string $locale): void + { + $current = $this->catalogues[$locale]; + + foreach ($this->computeFallbackLocales($locale) as $fallback) { + if (!isset($this->catalogues[$fallback])) { + $this->initializeCatalogue($fallback); + } + + $fallbackCatalogue = new MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback])); + foreach ($this->catalogues[$fallback]->getResources() as $resource) { + $fallbackCatalogue->addResource($resource); + } + $current->addFallbackCatalogue($fallbackCatalogue); + $current = $fallbackCatalogue; + } + } + + protected function computeFallbackLocales(string $locale) + { + if (null === $this->parentLocales) { + $parentLocales = json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true); + } + + $locales = []; + foreach ($this->fallbackLocales as $fallback) { + if ($fallback === $locale) { + continue; + } + + $locales[] = $fallback; + } + + while ($locale) { + $parent = $parentLocales[$locale] ?? null; + + if ($parent) { + $locale = 'root' !== $parent ? $parent : null; + } elseif (\function_exists('locale_parse')) { + $localeSubTags = locale_parse($locale); + $locale = null; + if (1 < \count($localeSubTags)) { + array_pop($localeSubTags); + $locale = locale_compose($localeSubTags) ?: null; + } + } elseif ($i = strrpos($locale, '_') ?: strrpos($locale, '-')) { + $locale = substr($locale, 0, $i); + } else { + $locale = null; + } + + if (null !== $locale) { + array_unshift($locales, $locale); + } + } + + return array_unique($locales); + } + + /** + * Asserts that the locale is valid, throws an Exception if not. + * + * @throws InvalidArgumentException If the locale contains invalid characters + */ + protected function assertValidLocale(string $locale) + { + if (1 !== preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) { + throw new InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale)); + } + } + + /** + * Provides the ConfigCache factory implementation, falling back to a + * default implementation if necessary. + */ + private function getConfigCacheFactory(): ConfigCacheFactoryInterface + { + if (!$this->configCacheFactory) { + $this->configCacheFactory = new ConfigCacheFactory($this->debug); + } + + return $this->configCacheFactory; + } + + private function getAllMessages(MessageCatalogueInterface $catalogue): array + { + $allMessages = []; + + foreach ($catalogue->all() as $domain => $messages) { + if ($intlMessages = $catalogue->all($domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + $allMessages[$domain.MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages; + $messages = array_diff_key($messages, $intlMessages); + } + if ($messages) { + $allMessages[$domain] = $messages; + } + } + + return $allMessages; + } +} diff --git a/vendor/symfony/translation/TranslatorBagInterface.php b/vendor/symfony/translation/TranslatorBagInterface.php new file mode 100644 index 0000000..e40ca8a --- /dev/null +++ b/vendor/symfony/translation/TranslatorBagInterface.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * TranslatorBagInterface. + * + * @author Abdellatif Ait boudad + */ +interface TranslatorBagInterface +{ + /** + * Gets the catalogue by locale. + * + * @param string|null $locale The locale or null to use the default + * + * @return MessageCatalogueInterface + * + * @throws InvalidArgumentException If the locale contains invalid characters + */ + public function getCatalogue(string $locale = null); +} diff --git a/vendor/symfony/translation/Util/ArrayConverter.php b/vendor/symfony/translation/Util/ArrayConverter.php new file mode 100644 index 0000000..acfbfc3 --- /dev/null +++ b/vendor/symfony/translation/Util/ArrayConverter.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Util; + +/** + * ArrayConverter generates tree like structure from a message catalogue. + * e.g. this + * 'foo.bar1' => 'test1', + * 'foo.bar2' => 'test2' + * converts to follows: + * foo: + * bar1: test1 + * bar2: test2. + * + * @author Gennady Telegin + */ +class ArrayConverter +{ + /** + * Converts linear messages array to tree-like array. + * For example this array('foo.bar' => 'value') will be converted to ['foo' => ['bar' => 'value']]. + * + * @param array $messages Linear messages array + * + * @return array Tree-like messages array + */ + public static function expandToTree(array $messages) + { + $tree = []; + + foreach ($messages as $id => $value) { + $referenceToElement = &self::getElementByPath($tree, explode('.', $id)); + + $referenceToElement = $value; + + unset($referenceToElement); + } + + return $tree; + } + + private static function &getElementByPath(array &$tree, array $parts) + { + $elem = &$tree; + $parentOfElem = null; + + foreach ($parts as $i => $part) { + if (isset($elem[$part]) && \is_string($elem[$part])) { + /* Process next case: + * 'foo': 'test1', + * 'foo.bar': 'test2' + * + * $tree['foo'] was string before we found array {bar: test2}. + * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2'; + */ + $elem = &$elem[implode('.', \array_slice($parts, $i))]; + break; + } + $parentOfElem = &$elem; + $elem = &$elem[$part]; + } + + if ($elem && \is_array($elem) && $parentOfElem) { + /* Process next case: + * 'foo.bar': 'test1' + * 'foo': 'test2' + * + * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`. + * Cancel treating $tree['foo'] as array and cancel back it expansion, + * e.g. make it $tree['foo.bar'] = 'test1' again. + */ + self::cancelExpand($parentOfElem, $part, $elem); + } + + return $elem; + } + + private static function cancelExpand(array &$tree, string $prefix, array $node) + { + $prefix .= '.'; + + foreach ($node as $id => $value) { + if (\is_string($value)) { + $tree[$prefix.$id] = $value; + } else { + self::cancelExpand($tree, $prefix.$id, $value); + } + } + } +} diff --git a/vendor/symfony/translation/Util/XliffUtils.php b/vendor/symfony/translation/Util/XliffUtils.php new file mode 100644 index 0000000..b5ff4ef --- /dev/null +++ b/vendor/symfony/translation/Util/XliffUtils.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Util; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * Provides some utility methods for XLIFF translation files, such as validating + * their contents according to the XSD schema. + * + * @author Fabien Potencier + */ +class XliffUtils +{ + /** + * Gets xliff file version based on the root "version" attribute. + * + * Defaults to 1.2 for backwards compatibility. + * + * @throws InvalidArgumentException + */ + public static function getVersionNumber(\DOMDocument $dom): string + { + /** @var \DOMNode $xliff */ + foreach ($dom->getElementsByTagName('xliff') as $xliff) { + $version = $xliff->attributes->getNamedItem('version'); + if ($version) { + return $version->nodeValue; + } + + $namespace = $xliff->attributes->getNamedItem('xmlns'); + if ($namespace) { + if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) { + throw new InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s".', $namespace)); + } + + return substr($namespace, 34); + } + } + + // Falls back to v1.2 + return '1.2'; + } + + /** + * Validates and parses the given file into a DOMDocument. + * + * @throws InvalidResourceException + */ + public static function validateSchema(\DOMDocument $dom): array + { + $xliffVersion = static::getVersionNumber($dom); + $internalErrors = libxml_use_internal_errors(true); + $disableEntities = libxml_disable_entity_loader(false); + + $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion)); + if (!$isValid) { + libxml_disable_entity_loader($disableEntities); + + return self::getXmlErrors($internalErrors); + } + + libxml_disable_entity_loader($disableEntities); + + $dom->normalizeDocument(); + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return []; + } + + public static function getErrorsAsString(array $xmlErrors): string + { + $errorsAsString = ''; + + foreach ($xmlErrors as $error) { + $errorsAsString .= sprintf("[%s %s] %s (in %s - line %d, column %d)\n", + LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR', + $error['code'], + $error['message'], + $error['file'], + $error['line'], + $error['column'] + ); + } + + return $errorsAsString; + } + + private static function getSchema(string $xliffVersion): string + { + if ('1.2' === $xliffVersion) { + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd'); + $xmlUri = 'http://www.w3.org/2001/xml.xsd'; + } elseif ('2.0' === $xliffVersion) { + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-2.0.xsd'); + $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd'; + } else { + throw new InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion)); + } + + return self::fixXmlLocation($schemaSource, $xmlUri); + } + + /** + * Internally changes the URI of a dependent xsd to be loaded locally. + */ + private static function fixXmlLocation(string $schemaSource, string $xmlUri): string + { + $newPath = str_replace('\\', '/', __DIR__).'/../Resources/schemas/xml.xsd'; + $parts = explode('/', $newPath); + $locationstart = 'file:///'; + if (0 === stripos($newPath, 'phar://')) { + $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); + if ($tmpfile) { + copy($newPath, $tmpfile); + $parts = explode('/', str_replace('\\', '/', $tmpfile)); + } else { + array_shift($parts); + $locationstart = 'phar:///'; + } + } + + $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; + $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); + + return str_replace($xmlUri, $newPath, $schemaSource); + } + + /** + * Returns the XML errors of the internal XML parser. + */ + private static function getXmlErrors(bool $internalErrors): array + { + $errors = []; + foreach (libxml_get_errors() as $error) { + $errors[] = [ + 'level' => LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', + 'code' => $error->code, + 'message' => trim($error->message), + 'file' => $error->file ?: 'n/a', + 'line' => $error->line, + 'column' => $error->column, + ]; + } + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return $errors; + } +} diff --git a/vendor/symfony/translation/Writer/TranslationWriter.php b/vendor/symfony/translation/Writer/TranslationWriter.php new file mode 100644 index 0000000..e0260b7 --- /dev/null +++ b/vendor/symfony/translation/Writer/TranslationWriter.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Writer; + +use Symfony\Component\Translation\Dumper\DumperInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationWriter writes translation messages. + * + * @author Michel Salib + */ +class TranslationWriter implements TranslationWriterInterface +{ + private $dumpers = []; + + /** + * Adds a dumper to the writer. + * + * @param string $format The format of the dumper + */ + public function addDumper($format, DumperInterface $dumper) + { + $this->dumpers[$format] = $dumper; + } + + /** + * Obtains the list of supported formats. + * + * @return array + */ + public function getFormats() + { + return array_keys($this->dumpers); + } + + /** + * Writes translation from the catalogue according to the selected format. + * + * @param string $format The format to use to dump the messages + * @param array $options Options that are passed to the dumper + * + * @throws InvalidArgumentException + */ + public function write(MessageCatalogue $catalogue, string $format, array $options = []) + { + if (!isset($this->dumpers[$format])) { + throw new InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format)); + } + + // get the right dumper + $dumper = $this->dumpers[$format]; + + if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) { + throw new RuntimeException(sprintf('Translation Writer was not able to create directory "%s".', $options['path'])); + } + + // save + $dumper->dump($catalogue, $options); + } +} diff --git a/vendor/symfony/translation/Writer/TranslationWriterInterface.php b/vendor/symfony/translation/Writer/TranslationWriterInterface.php new file mode 100644 index 0000000..4321309 --- /dev/null +++ b/vendor/symfony/translation/Writer/TranslationWriterInterface.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Writer; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationWriter writes translation messages. + * + * @author Michel Salib + */ +interface TranslationWriterInterface +{ + /** + * Writes translation from the catalogue according to the selected format. + * + * @param string $format The format to use to dump the messages + * @param array $options Options that are passed to the dumper + * + * @throws InvalidArgumentException + */ + public function write(MessageCatalogue $catalogue, string $format, array $options = []); +} diff --git a/vendor/symfony/translation/composer.json b/vendor/symfony/translation/composer.json new file mode 100644 index 0000000..7aede94 --- /dev/null +++ b/vendor/symfony/translation/composer.json @@ -0,0 +1,62 @@ +{ + "name": "symfony/translation", + "type": "library", + "description": "Symfony Translation Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^2" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.0" + }, + "suggest": { + "symfony/config": "", + "symfony/yaml": "", + "psr/log-implementation": "To use logging capability in translator" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Translation\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/symfony/var-dumper/CHANGELOG.md b/vendor/symfony/var-dumper/CHANGELOG.md new file mode 100644 index 0000000..b163801 --- /dev/null +++ b/vendor/symfony/var-dumper/CHANGELOG.md @@ -0,0 +1,58 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added `RdKafka` support + +4.4.0 +----- + + * added `VarDumperTestTrait::setUpVarDumper()` and `VarDumperTestTrait::tearDownVarDumper()` + to configure casters & flags to use in tests + * added `ImagineCaster` and infrastructure to dump images + * added the stamps of a message after it is dispatched in `TraceableMessageBus` and `MessengerDataCollector` collected data + * added `UuidCaster` + * made all casters final + * added support for the `NO_COLOR` env var (https://no-color.org/) + +4.3.0 +----- + + * added `DsCaster` to support dumping the contents of data structures from the Ds extension + +4.2.0 +----- + + * support selecting the format to use by setting the environment variable `VAR_DUMPER_FORMAT` to `html` or `cli` + +4.1.0 +----- + + * added a `ServerDumper` to send serialized Data clones to a server + * added a `ServerDumpCommand` and `DumpServer` to run a server collecting + and displaying dumps on a single place with multiple formats support + * added `CliDescriptor` and `HtmlDescriptor` descriptors for `server:dump` CLI and HTML formats support + +4.0.0 +----- + + * support for passing `\ReflectionClass` instances to the `Caster::castObject()` + method has been dropped, pass class names as strings instead + * the `Data::getRawData()` method has been removed + * the `VarDumperTestTrait::assertDumpEquals()` method expects a 3rd `$filter = 0` + argument and moves `$message = ''` argument at 4th position. + * the `VarDumperTestTrait::assertDumpMatchesFormat()` method expects a 3rd `$filter = 0` + argument and moves `$message = ''` argument at 4th position. + +3.4.0 +----- + + * added `AbstractCloner::setMinDepth()` function to ensure minimum tree depth + * deprecated `MongoCaster` + +2.7.0 +----- + + * deprecated `Cloner\Data::getLimitedClone()`. Use `withMaxDepth`, `withMaxItemsPerDepth` or `withRefHandles` instead. diff --git a/vendor/symfony/var-dumper/Caster/AmqpCaster.php b/vendor/symfony/var-dumper/Caster/AmqpCaster.php new file mode 100644 index 0000000..883d02b --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/AmqpCaster.php @@ -0,0 +1,212 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Amqp related classes to array representation. + * + * @author Grégoire Pineau + * + * @final + */ +class AmqpCaster +{ + private static $flags = [ + AMQP_DURABLE => 'AMQP_DURABLE', + AMQP_PASSIVE => 'AMQP_PASSIVE', + AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE', + AMQP_AUTODELETE => 'AMQP_AUTODELETE', + AMQP_INTERNAL => 'AMQP_INTERNAL', + AMQP_NOLOCAL => 'AMQP_NOLOCAL', + AMQP_AUTOACK => 'AMQP_AUTOACK', + AMQP_IFEMPTY => 'AMQP_IFEMPTY', + AMQP_IFUNUSED => 'AMQP_IFUNUSED', + AMQP_MANDATORY => 'AMQP_MANDATORY', + AMQP_IMMEDIATE => 'AMQP_IMMEDIATE', + AMQP_MULTIPLE => 'AMQP_MULTIPLE', + AMQP_NOWAIT => 'AMQP_NOWAIT', + AMQP_REQUEUE => 'AMQP_REQUEUE', + ]; + + private static $exchangeTypes = [ + AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT', + AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT', + AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC', + AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS', + ]; + + public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPConnection\x00login"])) { + return $a; + } + + // BC layer in the amqp lib + if (method_exists($c, 'getReadTimeout')) { + $timeout = $c->getReadTimeout(); + } else { + $timeout = $c->getTimeout(); + } + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + $prefix.'login' => $c->getLogin(), + $prefix.'password' => $c->getPassword(), + $prefix.'host' => $c->getHost(), + $prefix.'vhost' => $c->getVhost(), + $prefix.'port' => $c->getPort(), + $prefix.'read_timeout' => $timeout, + ]; + + return $a; + } + + public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + $prefix.'channel_id' => $c->getChannelId(), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPChannel\x00connection"])) { + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'prefetch_size' => $c->getPrefetchSize(), + $prefix.'prefetch_count' => $c->getPrefetchCount(), + ]; + + return $a; + } + + public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'flags' => self::extractFlags($c->getFlags()), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPQueue\x00name"])) { + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'channel' => $c->getChannel(), + $prefix.'name' => $c->getName(), + $prefix.'arguments' => $c->getArguments(), + ]; + + return $a; + } + + public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'flags' => self::extractFlags($c->getFlags()), + ]; + + $type = isset(self::$exchangeTypes[$c->getType()]) ? new ConstStub(self::$exchangeTypes[$c->getType()], $c->getType()) : $c->getType(); + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPExchange\x00name"])) { + $a["\x00AMQPExchange\x00type"] = $type; + + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'channel' => $c->getChannel(), + $prefix.'name' => $c->getName(), + $prefix.'type' => $type, + $prefix.'arguments' => $c->getArguments(), + ]; + + return $a; + } + + public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode()); + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPEnvelope\x00body"])) { + $a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode; + + return $a; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $a += [$prefix.'body' => $c->getBody()]; + } + + $a += [ + $prefix.'delivery_tag' => $c->getDeliveryTag(), + $prefix.'is_redelivery' => $c->isRedelivery(), + $prefix.'exchange_name' => $c->getExchangeName(), + $prefix.'routing_key' => $c->getRoutingKey(), + $prefix.'content_type' => $c->getContentType(), + $prefix.'content_encoding' => $c->getContentEncoding(), + $prefix.'headers' => $c->getHeaders(), + $prefix.'delivery_mode' => $deliveryMode, + $prefix.'priority' => $c->getPriority(), + $prefix.'correlation_id' => $c->getCorrelationId(), + $prefix.'reply_to' => $c->getReplyTo(), + $prefix.'expiration' => $c->getExpiration(), + $prefix.'message_id' => $c->getMessageId(), + $prefix.'timestamp' => $c->getTimeStamp(), + $prefix.'type' => $c->getType(), + $prefix.'user_id' => $c->getUserId(), + $prefix.'app_id' => $c->getAppId(), + ]; + + return $a; + } + + private static function extractFlags(int $flags): ConstStub + { + $flagsArray = []; + + foreach (self::$flags as $value => $name) { + if ($flags & $value) { + $flagsArray[] = $name; + } + } + + if (!$flagsArray) { + $flagsArray = ['AMQP_NOPARAM']; + } + + return new ConstStub(implode('|', $flagsArray), $flags); + } +} diff --git a/vendor/symfony/var-dumper/Caster/ArgsStub.php b/vendor/symfony/var-dumper/Caster/ArgsStub.php new file mode 100644 index 0000000..591c7e2 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ArgsStub.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a list of function arguments. + * + * @author Nicolas Grekas + */ +class ArgsStub extends EnumStub +{ + private static $parameters = []; + + public function __construct(array $args, string $function, ?string $class) + { + list($variadic, $params) = self::getParameters($function, $class); + + $values = []; + foreach ($args as $k => $v) { + $values[$k] = !is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v; + } + if (null === $params) { + parent::__construct($values, false); + + return; + } + if (\count($values) < \count($params)) { + $params = \array_slice($params, 0, \count($values)); + } elseif (\count($values) > \count($params)) { + $values[] = new EnumStub(array_splice($values, \count($params)), false); + $params[] = $variadic; + } + if (['...'] === $params) { + $this->dumpKeys = false; + $this->value = $values[0]->value; + } else { + $this->value = array_combine($params, $values); + } + } + + private static function getParameters(string $function, ?string $class): array + { + if (isset(self::$parameters[$k = $class.'::'.$function])) { + return self::$parameters[$k]; + } + + try { + $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function); + } catch (\ReflectionException $e) { + return [null, null]; + } + + $variadic = '...'; + $params = []; + foreach ($r->getParameters() as $v) { + $k = '$'.$v->name; + if ($v->isPassedByReference()) { + $k = '&'.$k; + } + if ($v->isVariadic()) { + $variadic .= $k; + } else { + $params[] = $k; + } + } + + return self::$parameters[$k] = [$variadic, $params]; + } +} diff --git a/vendor/symfony/var-dumper/Caster/Caster.php b/vendor/symfony/var-dumper/Caster/Caster.php new file mode 100644 index 0000000..0a8e936 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/Caster.php @@ -0,0 +1,174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Helper for filtering out properties in casters. + * + * @author Nicolas Grekas + * + * @final + */ +class Caster +{ + const EXCLUDE_VERBOSE = 1; + const EXCLUDE_VIRTUAL = 2; + const EXCLUDE_DYNAMIC = 4; + const EXCLUDE_PUBLIC = 8; + const EXCLUDE_PROTECTED = 16; + const EXCLUDE_PRIVATE = 32; + const EXCLUDE_NULL = 64; + const EXCLUDE_EMPTY = 128; + const EXCLUDE_NOT_IMPORTANT = 256; + const EXCLUDE_STRICT = 512; + + const PREFIX_VIRTUAL = "\0~\0"; + const PREFIX_DYNAMIC = "\0+\0"; + const PREFIX_PROTECTED = "\0*\0"; + + /** + * Casts objects to arrays and adds the dynamic property prefix. + * + * @param bool $hasDebugInfo Whether the __debugInfo method exists on $obj or not + * + * @return array The array-cast of the object, with prefixed dynamic properties + */ + public static function castObject(object $obj, string $class, bool $hasDebugInfo = false, string $debugClass = null): array + { + if ($hasDebugInfo) { + try { + $debugInfo = $obj->__debugInfo(); + } catch (\Exception $e) { + // ignore failing __debugInfo() + $hasDebugInfo = false; + } + } + + $a = $obj instanceof \Closure ? [] : (array) $obj; + + if ($obj instanceof \__PHP_Incomplete_Class) { + return $a; + } + + if ($a) { + static $publicProperties = []; + $debugClass = $debugClass ?? get_debug_type($obj); + + $i = 0; + $prefixedKeys = []; + foreach ($a as $k => $v) { + if ("\0" !== ($k[0] ?? '')) { + if (!isset($publicProperties[$class])) { + foreach ((new \ReflectionClass($class))->getProperties(\ReflectionProperty::IS_PUBLIC) as $prop) { + $publicProperties[$class][$prop->name] = true; + } + } + if (!isset($publicProperties[$class][$k])) { + $prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k; + } + } elseif ($debugClass !== $class && 1 === strpos($k, $class)) { + $prefixedKeys[$i] = "\0".$debugClass.strrchr($k, "\0"); + } + ++$i; + } + if ($prefixedKeys) { + $keys = array_keys($a); + foreach ($prefixedKeys as $i => $k) { + $keys[$i] = $k; + } + $a = array_combine($keys, $a); + } + } + + if ($hasDebugInfo && \is_array($debugInfo)) { + foreach ($debugInfo as $k => $v) { + if (!isset($k[0]) || "\0" !== $k[0]) { + if (\array_key_exists(self::PREFIX_DYNAMIC.$k, $a)) { + continue; + } + $k = self::PREFIX_VIRTUAL.$k; + } + + unset($a[$k]); + $a[$k] = $v; + } + } + + return $a; + } + + /** + * Filters out the specified properties. + * + * By default, a single match in the $filter bit field filters properties out, following an "or" logic. + * When EXCLUDE_STRICT is set, an "and" logic is applied: all bits must match for a property to be removed. + * + * @param array $a The array containing the properties to filter + * @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out + * @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set + * @param int &$count Set to the number of removed properties + * + * @return array The filtered array + */ + public static function filter(array $a, int $filter, array $listedProperties = [], ?int &$count = 0): array + { + $count = 0; + + foreach ($a as $k => $v) { + $type = self::EXCLUDE_STRICT & $filter; + + if (null === $v) { + $type |= self::EXCLUDE_NULL & $filter; + $type |= self::EXCLUDE_EMPTY & $filter; + } elseif (false === $v || '' === $v || '0' === $v || 0 === $v || 0.0 === $v || [] === $v) { + $type |= self::EXCLUDE_EMPTY & $filter; + } + if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) { + $type |= self::EXCLUDE_NOT_IMPORTANT; + } + if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) { + $type |= self::EXCLUDE_VERBOSE; + } + + if (!isset($k[1]) || "\0" !== $k[0]) { + $type |= self::EXCLUDE_PUBLIC & $filter; + } elseif ('~' === $k[1]) { + $type |= self::EXCLUDE_VIRTUAL & $filter; + } elseif ('+' === $k[1]) { + $type |= self::EXCLUDE_DYNAMIC & $filter; + } elseif ('*' === $k[1]) { + $type |= self::EXCLUDE_PROTECTED & $filter; + } else { + $type |= self::EXCLUDE_PRIVATE & $filter; + } + + if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) { + unset($a[$k]); + ++$count; + } + } + + return $a; + } + + public static function castPhpIncompleteClass(\__PHP_Incomplete_Class $c, array $a, Stub $stub, bool $isNested): array + { + if (isset($a['__PHP_Incomplete_Class_Name'])) { + $stub->class .= '('.$a['__PHP_Incomplete_Class_Name'].')'; + unset($a['__PHP_Incomplete_Class_Name']); + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ClassStub.php b/vendor/symfony/var-dumper/Caster/ClassStub.php new file mode 100644 index 0000000..612a7ca --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ClassStub.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a PHP class identifier. + * + * @author Nicolas Grekas + */ +class ClassStub extends ConstStub +{ + /** + * @param string $identifier A PHP identifier, e.g. a class, method, interface, etc. name + * @param callable $callable The callable targeted by the identifier when it is ambiguous or not a real PHP identifier + */ + public function __construct(string $identifier, $callable = null) + { + $this->value = $identifier; + + try { + if (null !== $callable) { + if ($callable instanceof \Closure) { + $r = new \ReflectionFunction($callable); + } elseif (\is_object($callable)) { + $r = [$callable, '__invoke']; + } elseif (\is_array($callable)) { + $r = $callable; + } elseif (false !== $i = strpos($callable, '::')) { + $r = [substr($callable, 0, $i), substr($callable, 2 + $i)]; + } else { + $r = new \ReflectionFunction($callable); + } + } elseif (0 < $i = strpos($identifier, '::') ?: strpos($identifier, '->')) { + $r = [substr($identifier, 0, $i), substr($identifier, 2 + $i)]; + } else { + $r = new \ReflectionClass($identifier); + } + + if (\is_array($r)) { + try { + $r = new \ReflectionMethod($r[0], $r[1]); + } catch (\ReflectionException $e) { + $r = new \ReflectionClass($r[0]); + } + } + + if (false !== strpos($identifier, "@anonymous\0")) { + $this->value = $identifier = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { + return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; + }, $identifier); + } + + if (null !== $callable && $r instanceof \ReflectionFunctionAbstract) { + $s = ReflectionCaster::castFunctionAbstract($r, [], new Stub(), true, Caster::EXCLUDE_VERBOSE); + $s = ReflectionCaster::getSignature($s); + + if ('()' === substr($identifier, -2)) { + $this->value = substr_replace($identifier, $s, -2); + } else { + $this->value .= $s; + } + } + } catch (\ReflectionException $e) { + return; + } finally { + if (0 < $i = strrpos($this->value, '\\')) { + $this->attr['ellipsis'] = \strlen($this->value) - $i; + $this->attr['ellipsis-type'] = 'class'; + $this->attr['ellipsis-tail'] = 1; + } + } + + if ($f = $r->getFileName()) { + $this->attr['file'] = $f; + $this->attr['line'] = $r->getStartLine(); + } + } + + public static function wrapCallable($callable) + { + if (\is_object($callable) || !\is_callable($callable)) { + return $callable; + } + + if (!\is_array($callable)) { + $callable = new static($callable, $callable); + } elseif (\is_string($callable[0])) { + $callable[0] = new static($callable[0], $callable); + } else { + $callable[1] = new static($callable[1], $callable); + } + + return $callable; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ConstStub.php b/vendor/symfony/var-dumper/Caster/ConstStub.php new file mode 100644 index 0000000..8b01797 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ConstStub.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a PHP constant and its value. + * + * @author Nicolas Grekas + */ +class ConstStub extends Stub +{ + public function __construct(string $name, $value = null) + { + $this->class = $name; + $this->value = 1 < \func_num_args() ? $value : $name; + } + + /** + * @return string + */ + public function __toString() + { + return (string) $this->value; + } +} diff --git a/vendor/symfony/var-dumper/Caster/CutArrayStub.php b/vendor/symfony/var-dumper/Caster/CutArrayStub.php new file mode 100644 index 0000000..0e4fb36 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/CutArrayStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a cut array. + * + * @author Nicolas Grekas + */ +class CutArrayStub extends CutStub +{ + public $preservedSubset; + + public function __construct(array $value, array $preservedKeys) + { + parent::__construct($value); + + $this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys)); + $this->cut -= \count($this->preservedSubset); + } +} diff --git a/vendor/symfony/var-dumper/Caster/CutStub.php b/vendor/symfony/var-dumper/Caster/CutStub.php new file mode 100644 index 0000000..464c6db --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/CutStub.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents the main properties of a PHP variable, pre-casted by a caster. + * + * @author Nicolas Grekas + */ +class CutStub extends Stub +{ + public function __construct($value) + { + $this->value = $value; + + switch (\gettype($value)) { + case 'object': + $this->type = self::TYPE_OBJECT; + $this->class = \get_class($value); + + if ($value instanceof \Closure) { + ReflectionCaster::castClosure($value, [], $this, true, Caster::EXCLUDE_VERBOSE); + } + + $this->cut = -1; + break; + + case 'array': + $this->type = self::TYPE_ARRAY; + $this->class = self::ARRAY_ASSOC; + $this->cut = $this->value = \count($value); + break; + + case 'resource': + case 'unknown type': + case 'resource (closed)': + $this->type = self::TYPE_RESOURCE; + $this->handle = (int) $value; + if ('Unknown' === $this->class = @get_resource_type($value)) { + $this->class = 'Closed'; + } + $this->cut = -1; + break; + + case 'string': + $this->type = self::TYPE_STRING; + $this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY; + $this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8'); + $this->value = ''; + break; + } + } +} diff --git a/vendor/symfony/var-dumper/Caster/DOMCaster.php b/vendor/symfony/var-dumper/Caster/DOMCaster.php new file mode 100644 index 0000000..98359ff --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/DOMCaster.php @@ -0,0 +1,304 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts DOM related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class DOMCaster +{ + private static $errorCodes = [ + DOM_PHP_ERR => 'DOM_PHP_ERR', + DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR', + DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR', + DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR', + DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR', + DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR', + DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR', + DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR', + DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR', + DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR', + DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR', + DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR', + DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR', + DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR', + DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR', + DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR', + DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR', + ]; + + private static $nodeTypes = [ + XML_ELEMENT_NODE => 'XML_ELEMENT_NODE', + XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE', + XML_TEXT_NODE => 'XML_TEXT_NODE', + XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE', + XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE', + XML_ENTITY_NODE => 'XML_ENTITY_NODE', + XML_PI_NODE => 'XML_PI_NODE', + XML_COMMENT_NODE => 'XML_COMMENT_NODE', + XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE', + XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE', + XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE', + XML_NOTATION_NODE => 'XML_NOTATION_NODE', + XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE', + XML_DTD_NODE => 'XML_DTD_NODE', + XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE', + XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE', + XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE', + XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE', + ]; + + public static function castException(\DOMException $e, array $a, Stub $stub, bool $isNested) + { + $k = Caster::PREFIX_PROTECTED.'code'; + if (isset($a[$k], self::$errorCodes[$a[$k]])) { + $a[$k] = new ConstStub(self::$errorCodes[$a[$k]], $a[$k]); + } + + return $a; + } + + public static function castLength($dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'length' => $dom->length, + ]; + + return $a; + } + + public static function castImplementation($dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'Core' => '1.0', + Caster::PREFIX_VIRTUAL.'XML' => '2.0', + ]; + + return $a; + } + + public static function castNode(\DOMNode $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'nodeName' => $dom->nodeName, + 'nodeValue' => new CutStub($dom->nodeValue), + 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType), + 'parentNode' => new CutStub($dom->parentNode), + 'childNodes' => $dom->childNodes, + 'firstChild' => new CutStub($dom->firstChild), + 'lastChild' => new CutStub($dom->lastChild), + 'previousSibling' => new CutStub($dom->previousSibling), + 'nextSibling' => new CutStub($dom->nextSibling), + 'attributes' => $dom->attributes, + 'ownerDocument' => new CutStub($dom->ownerDocument), + 'namespaceURI' => $dom->namespaceURI, + 'prefix' => $dom->prefix, + 'localName' => $dom->localName, + 'baseURI' => $dom->baseURI ? new LinkStub($dom->baseURI) : $dom->baseURI, + 'textContent' => new CutStub($dom->textContent), + ]; + + return $a; + } + + public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'nodeName' => $dom->nodeName, + 'nodeValue' => new CutStub($dom->nodeValue), + 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType), + 'prefix' => $dom->prefix, + 'localName' => $dom->localName, + 'namespaceURI' => $dom->namespaceURI, + 'ownerDocument' => new CutStub($dom->ownerDocument), + 'parentNode' => new CutStub($dom->parentNode), + ]; + + return $a; + } + + public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $a += [ + 'doctype' => $dom->doctype, + 'implementation' => $dom->implementation, + 'documentElement' => new CutStub($dom->documentElement), + 'actualEncoding' => $dom->actualEncoding, + 'encoding' => $dom->encoding, + 'xmlEncoding' => $dom->xmlEncoding, + 'standalone' => $dom->standalone, + 'xmlStandalone' => $dom->xmlStandalone, + 'version' => $dom->version, + 'xmlVersion' => $dom->xmlVersion, + 'strictErrorChecking' => $dom->strictErrorChecking, + 'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI, + 'config' => $dom->config, + 'formatOutput' => $dom->formatOutput, + 'validateOnParse' => $dom->validateOnParse, + 'resolveExternals' => $dom->resolveExternals, + 'preserveWhiteSpace' => $dom->preserveWhiteSpace, + 'recover' => $dom->recover, + 'substituteEntities' => $dom->substituteEntities, + ]; + + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $formatOutput = $dom->formatOutput; + $dom->formatOutput = true; + $a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()]; + $dom->formatOutput = $formatOutput; + } + + return $a; + } + + public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'data' => $dom->data, + 'length' => $dom->length, + ]; + + return $a; + } + + public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'name' => $dom->name, + 'specified' => $dom->specified, + 'value' => $dom->value, + 'ownerElement' => $dom->ownerElement, + 'schemaTypeInfo' => $dom->schemaTypeInfo, + ]; + + return $a; + } + + public static function castElement(\DOMElement $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'tagName' => $dom->tagName, + 'schemaTypeInfo' => $dom->schemaTypeInfo, + ]; + + return $a; + } + + public static function castText(\DOMText $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'wholeText' => $dom->wholeText, + ]; + + return $a; + } + + public static function castTypeinfo(\DOMTypeinfo $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'typeName' => $dom->typeName, + 'typeNamespace' => $dom->typeNamespace, + ]; + + return $a; + } + + public static function castDomError(\DOMDomError $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'severity' => $dom->severity, + 'message' => $dom->message, + 'type' => $dom->type, + 'relatedException' => $dom->relatedException, + 'related_data' => $dom->related_data, + 'location' => $dom->location, + ]; + + return $a; + } + + public static function castLocator(\DOMLocator $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'lineNumber' => $dom->lineNumber, + 'columnNumber' => $dom->columnNumber, + 'offset' => $dom->offset, + 'relatedNode' => $dom->relatedNode, + 'uri' => $dom->uri ? new LinkStub($dom->uri, $dom->lineNumber) : $dom->uri, + ]; + + return $a; + } + + public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'name' => $dom->name, + 'entities' => $dom->entities, + 'notations' => $dom->notations, + 'publicId' => $dom->publicId, + 'systemId' => $dom->systemId, + 'internalSubset' => $dom->internalSubset, + ]; + + return $a; + } + + public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'publicId' => $dom->publicId, + 'systemId' => $dom->systemId, + ]; + + return $a; + } + + public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'publicId' => $dom->publicId, + 'systemId' => $dom->systemId, + 'notationName' => $dom->notationName, + 'actualEncoding' => $dom->actualEncoding, + 'encoding' => $dom->encoding, + 'version' => $dom->version, + ]; + + return $a; + } + + public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'target' => $dom->target, + 'data' => $dom->data, + ]; + + return $a; + } + + public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, bool $isNested) + { + $a += [ + 'document' => $dom->document, + ]; + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/DateCaster.php b/vendor/symfony/var-dumper/Caster/DateCaster.php new file mode 100644 index 0000000..e3708b7 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/DateCaster.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts DateTimeInterface related classes to array representation. + * + * @author Dany Maillard + * + * @final + */ +class DateCaster +{ + private const PERIOD_LIMIT = 3; + + public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, bool $isNested, int $filter) + { + $prefix = Caster::PREFIX_VIRTUAL; + $location = $d->getTimezone()->getLocation(); + $fromNow = (new \DateTime())->diff($d); + + $title = $d->format('l, F j, Y') + ."\n".self::formatInterval($fromNow).' from now' + .($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '') + ; + + unset( + $a[Caster::PREFIX_DYNAMIC.'date'], + $a[Caster::PREFIX_DYNAMIC.'timezone'], + $a[Caster::PREFIX_DYNAMIC.'timezone_type'] + ); + $a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title); + + $stub->class .= $d->format(' @U'); + + return $a; + } + + public static function castInterval(\DateInterval $interval, array $a, Stub $stub, bool $isNested, int $filter) + { + $now = new \DateTimeImmutable(); + $numberOfSeconds = $now->add($interval)->getTimestamp() - $now->getTimestamp(); + $title = number_format($numberOfSeconds, 0, '.', ' ').'s'; + + $i = [Caster::PREFIX_VIRTUAL.'interval' => new ConstStub(self::formatInterval($interval), $title)]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $i : $i + $a; + } + + private static function formatInterval(\DateInterval $i): string + { + $format = '%R '; + + if (0 === $i->y && 0 === $i->m && ($i->h >= 24 || $i->i >= 60 || $i->s >= 60)) { + $i = date_diff($d = new \DateTime(), date_add(clone $d, $i)); // recalculate carry over points + $format .= 0 < $i->days ? '%ad ' : ''; + } else { + $format .= ($i->y ? '%yy ' : '').($i->m ? '%mm ' : '').($i->d ? '%dd ' : ''); + } + + $format .= $i->h || $i->i || $i->s || $i->f ? '%H:%I:'.self::formatSeconds($i->s, substr($i->f, 2)) : ''; + $format = '%R ' === $format ? '0s' : $format; + + return $i->format(rtrim($format)); + } + + public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, bool $isNested, int $filter) + { + $location = $timeZone->getLocation(); + $formatted = (new \DateTime('now', $timeZone))->format($location ? 'e (P)' : 'P'); + $title = $location && \extension_loaded('intl') ? \Locale::getDisplayRegion('-'.$location['country_code']) : ''; + + $z = [Caster::PREFIX_VIRTUAL.'timezone' => new ConstStub($formatted, $title)]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a; + } + + public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, bool $isNested, int $filter) + { + $dates = []; + foreach (clone $p as $i => $d) { + if (self::PERIOD_LIMIT === $i) { + $now = new \DateTimeImmutable(); + $dates[] = sprintf('%s more', ($end = $p->getEndDate()) + ? ceil(($end->format('U.u') - $d->format('U.u')) / ((int) $now->add($p->getDateInterval())->format('U.u') - (int) $now->format('U.u'))) + : $p->recurrences - $i + ); + break; + } + $dates[] = sprintf('%s) %s', $i + 1, self::formatDateTime($d)); + } + + $period = sprintf( + 'every %s, from %s (%s) %s', + self::formatInterval($p->getDateInterval()), + self::formatDateTime($p->getStartDate()), + $p->include_start_date ? 'included' : 'excluded', + ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end) : 'recurring '.$p->recurrences.' time/s' + ); + + $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $p : $p + $a; + } + + private static function formatDateTime(\DateTimeInterface $d, string $extra = ''): string + { + return $d->format('Y-m-d H:i:'.self::formatSeconds($d->format('s'), $d->format('u')).$extra); + } + + private static function formatSeconds(string $s, string $us): string + { + return sprintf('%02d.%s', $s, 0 === ($len = \strlen($t = rtrim($us, '0'))) ? '0' : ($len <= 3 ? str_pad($t, 3, '0') : $us)); + } +} diff --git a/vendor/symfony/var-dumper/Caster/DoctrineCaster.php b/vendor/symfony/var-dumper/Caster/DoctrineCaster.php new file mode 100644 index 0000000..129b2cb --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/DoctrineCaster.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Doctrine\Common\Proxy\Proxy as CommonProxy; +use Doctrine\ORM\PersistentCollection; +use Doctrine\ORM\Proxy\Proxy as OrmProxy; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Doctrine related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class DoctrineCaster +{ + public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, bool $isNested) + { + foreach (['__cloner__', '__initializer__'] as $k) { + if (\array_key_exists($k, $a)) { + unset($a[$k]); + ++$stub->cut; + } + } + + return $a; + } + + public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, bool $isNested) + { + foreach (['_entityPersister', '_identifier'] as $k) { + if (\array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) { + unset($a[$k]); + ++$stub->cut; + } + } + + return $a; + } + + public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, bool $isNested) + { + foreach (['snapshot', 'association', 'typeClass'] as $k) { + if (\array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) { + $a[$k] = new CutStub($a[$k]); + } + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/DsCaster.php b/vendor/symfony/var-dumper/Caster/DsCaster.php new file mode 100644 index 0000000..b34b670 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/DsCaster.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Ds\Collection; +use Ds\Map; +use Ds\Pair; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Ds extension classes to array representation. + * + * @author Jáchym Toušek + * + * @final + */ +class DsCaster +{ + public static function castCollection(Collection $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'count'] = $c->count(); + $a[Caster::PREFIX_VIRTUAL.'capacity'] = $c->capacity(); + + if (!$c instanceof Map) { + $a += $c->toArray(); + } + + return $a; + } + + public static function castMap(Map $c, array $a, Stub $stub, bool $isNested): array + { + foreach ($c as $k => $v) { + $a[] = new DsPairStub($k, $v); + } + + return $a; + } + + public static function castPair(Pair $c, array $a, Stub $stub, bool $isNested): array + { + foreach ($c->toArray() as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + + return $a; + } + + public static function castPairStub(DsPairStub $c, array $a, Stub $stub, bool $isNested): array + { + if ($isNested) { + $stub->class = Pair::class; + $stub->value = null; + $stub->handle = 0; + + $a = $c->value; + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/DsPairStub.php b/vendor/symfony/var-dumper/Caster/DsPairStub.php new file mode 100644 index 0000000..a1dcc15 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/DsPairStub.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + */ +class DsPairStub extends Stub +{ + public function __construct($key, $value) + { + $this->value = [ + Caster::PREFIX_VIRTUAL.'key' => $key, + Caster::PREFIX_VIRTUAL.'value' => $value, + ]; + } +} diff --git a/vendor/symfony/var-dumper/Caster/EnumStub.php b/vendor/symfony/var-dumper/Caster/EnumStub.php new file mode 100644 index 0000000..7a4e98a --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/EnumStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents an enumeration of values. + * + * @author Nicolas Grekas + */ +class EnumStub extends Stub +{ + public $dumpKeys = true; + + public function __construct(array $values, bool $dumpKeys = true) + { + $this->value = $values; + $this->dumpKeys = $dumpKeys; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/vendor/symfony/var-dumper/Caster/ExceptionCaster.php new file mode 100644 index 0000000..c2eb6be --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ExceptionCaster.php @@ -0,0 +1,382 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarDumper\Exception\ThrowingCasterException; + +/** + * Casts common Exception classes to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class ExceptionCaster +{ + public static $srcContext = 1; + public static $traceArgs = true; + public static $errorTypes = [ + E_DEPRECATED => 'E_DEPRECATED', + E_USER_DEPRECATED => 'E_USER_DEPRECATED', + E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', + E_ERROR => 'E_ERROR', + E_WARNING => 'E_WARNING', + E_PARSE => 'E_PARSE', + E_NOTICE => 'E_NOTICE', + E_CORE_ERROR => 'E_CORE_ERROR', + E_CORE_WARNING => 'E_CORE_WARNING', + E_COMPILE_ERROR => 'E_COMPILE_ERROR', + E_COMPILE_WARNING => 'E_COMPILE_WARNING', + E_USER_ERROR => 'E_USER_ERROR', + E_USER_WARNING => 'E_USER_WARNING', + E_USER_NOTICE => 'E_USER_NOTICE', + E_STRICT => 'E_STRICT', + ]; + + private static $framesCache = []; + + public static function castError(\Error $e, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter); + } + + public static function castException(\Exception $e, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter); + } + + public static function castErrorException(\ErrorException $e, array $a, Stub $stub, bool $isNested) + { + if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) { + $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); + } + + return $a; + } + + public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, bool $isNested) + { + $trace = Caster::PREFIX_VIRTUAL.'trace'; + $prefix = Caster::PREFIX_PROTECTED; + $xPrefix = "\0Exception\0"; + + if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) { + $b = (array) $a[$xPrefix.'previous']; + $class = get_debug_type($a[$xPrefix.'previous']); + self::traceUnshift($b[$xPrefix.'trace'], $class, $b[$prefix.'file'], $b[$prefix.'line']); + $a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value)); + } + + unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']); + + return $a; + } + + public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, bool $isNested) + { + $sPrefix = "\0".SilencedErrorContext::class."\0"; + + if (!isset($a[$s = $sPrefix.'severity'])) { + return $a; + } + + if (isset(self::$errorTypes[$a[$s]])) { + $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); + } + + $trace = [[ + 'file' => $a[$sPrefix.'file'], + 'line' => $a[$sPrefix.'line'], + ]]; + + if (isset($a[$sPrefix.'trace'])) { + $trace = array_merge($trace, $a[$sPrefix.'trace']); + } + + unset($a[$sPrefix.'file'], $a[$sPrefix.'line'], $a[$sPrefix.'trace']); + $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); + + return $a; + } + + public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, bool $isNested) + { + if (!$isNested) { + return $a; + } + $stub->class = ''; + $stub->handle = 0; + $frames = $trace->value; + $prefix = Caster::PREFIX_VIRTUAL; + + $a = []; + $j = \count($frames); + if (0 > $i = $trace->sliceOffset) { + $i = max(0, $j + $i); + } + if (!isset($trace->value[$i])) { + return []; + } + $lastCall = isset($frames[$i]['function']) ? (isset($frames[$i]['class']) ? $frames[0]['class'].$frames[$i]['type'] : '').$frames[$i]['function'].'()' : ''; + $frames[] = ['function' => '']; + $collapse = false; + + for ($j += $trace->numberingOffset - $i++; isset($frames[$i]); ++$i, --$j) { + $f = $frames[$i]; + $call = isset($f['function']) ? (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'] : '???'; + + $frame = new FrameStub( + [ + 'object' => isset($f['object']) ? $f['object'] : null, + 'class' => isset($f['class']) ? $f['class'] : null, + 'type' => isset($f['type']) ? $f['type'] : null, + 'function' => isset($f['function']) ? $f['function'] : null, + ] + $frames[$i - 1], + false, + true + ); + $f = self::castFrameStub($frame, [], $frame, true); + if (isset($f[$prefix.'src'])) { + foreach ($f[$prefix.'src']->value as $label => $frame) { + if (0 === strpos($label, "\0~collapse=0")) { + if ($collapse) { + $label = substr_replace($label, '1', 11, 1); + } else { + $collapse = true; + } + } + $label = substr_replace($label, "title=Stack level $j.&", 2, 0); + } + $f = $frames[$i - 1]; + if ($trace->keepArgs && !empty($f['args']) && $frame instanceof EnumStub) { + $frame->value['arguments'] = new ArgsStub($f['args'], isset($f['function']) ? $f['function'] : null, isset($f['class']) ? $f['class'] : null); + } + } elseif ('???' !== $lastCall) { + $label = new ClassStub($lastCall); + if (isset($label->attr['ellipsis'])) { + $label->attr['ellipsis'] += 2; + $label = substr_replace($prefix, "ellipsis-type=class&ellipsis={$label->attr['ellipsis']}&ellipsis-tail=1&title=Stack level $j.", 2, 0).$label->value.'()'; + } else { + $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$label->value.'()'; + } + } else { + $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$lastCall; + } + $a[substr_replace($label, sprintf('separator=%s&', $frame instanceof EnumStub ? ' ' : ':'), 2, 0)] = $frame; + + $lastCall = $call; + } + if (null !== $trace->sliceLength) { + $a = \array_slice($a, 0, $trace->sliceLength, true); + } + + return $a; + } + + public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, bool $isNested) + { + if (!$isNested) { + return $a; + } + $f = $frame->value; + $prefix = Caster::PREFIX_VIRTUAL; + + if (isset($f['file'], $f['line'])) { + $cacheKey = $f; + unset($cacheKey['object'], $cacheKey['args']); + $cacheKey[] = self::$srcContext; + $cacheKey = implode('-', $cacheKey); + + if (isset(self::$framesCache[$cacheKey])) { + $a[$prefix.'src'] = self::$framesCache[$cacheKey]; + } else { + if (preg_match('/\((\d+)\)(?:\([\da-f]{32}\))? : (?:eval\(\)\'d code|runtime-created function)$/', $f['file'], $match)) { + $f['file'] = substr($f['file'], 0, -\strlen($match[0])); + $f['line'] = (int) $match[1]; + } + $src = $f['line']; + $srcKey = $f['file']; + $ellipsis = new LinkStub($srcKey, 0); + $srcAttr = 'collapse='.(int) $ellipsis->inVendor; + $ellipsisTail = isset($ellipsis->attr['ellipsis-tail']) ? $ellipsis->attr['ellipsis-tail'] : 0; + $ellipsis = isset($ellipsis->attr['ellipsis']) ? $ellipsis->attr['ellipsis'] : 0; + + if (is_file($f['file']) && 0 <= self::$srcContext) { + if (!empty($f['class']) && (is_subclass_of($f['class'], 'Twig\Template') || is_subclass_of($f['class'], 'Twig_Template')) && method_exists($f['class'], 'getDebugInfo')) { + $template = isset($f['object']) ? $f['object'] : unserialize(sprintf('O:%d:"%s":0:{}', \strlen($f['class']), $f['class'])); + + $ellipsis = 0; + $templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : ''); + $templateInfo = $template->getDebugInfo(); + if (isset($templateInfo[$f['line']])) { + if (!method_exists($template, 'getSourceContext') || !is_file($templatePath = $template->getSourceContext()->getPath())) { + $templatePath = null; + } + if ($templateSrc) { + $src = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext, 'twig', $templatePath, $f); + $srcKey = ($templatePath ?: $template->getTemplateName()).':'.$templateInfo[$f['line']]; + } + } + } + if ($srcKey == $f['file']) { + $src = self::extractSource(file_get_contents($f['file']), $f['line'], self::$srcContext, 'php', $f['file'], $f); + $srcKey .= ':'.$f['line']; + if ($ellipsis) { + $ellipsis += 1 + \strlen($f['line']); + } + } + $srcAttr .= sprintf('&separator= &file=%s&line=%d', rawurlencode($f['file']), $f['line']); + } else { + $srcAttr .= '&separator=:'; + } + $srcAttr .= $ellipsis ? '&ellipsis-type=path&ellipsis='.$ellipsis.'&ellipsis-tail='.$ellipsisTail : ''; + self::$framesCache[$cacheKey] = $a[$prefix.'src'] = new EnumStub(["\0~$srcAttr\0$srcKey" => $src]); + } + } + + unset($a[$prefix.'args'], $a[$prefix.'line'], $a[$prefix.'file']); + if ($frame->inTraceStub) { + unset($a[$prefix.'class'], $a[$prefix.'type'], $a[$prefix.'function']); + } + foreach ($a as $k => $v) { + if (!$v) { + unset($a[$k]); + } + } + if ($frame->keepArgs && !empty($f['args'])) { + $a[$prefix.'arguments'] = new ArgsStub($f['args'], $f['function'], $f['class']); + } + + return $a; + } + + private static function filterExceptionArray(string $xClass, array $a, string $xPrefix, int $filter): array + { + if (isset($a[$xPrefix.'trace'])) { + $trace = $a[$xPrefix.'trace']; + unset($a[$xPrefix.'trace']); // Ensures the trace is always last + } else { + $trace = []; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && $trace) { + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { + self::traceUnshift($trace, $xClass, $a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); + } + $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); + } + if (empty($a[$xPrefix.'previous'])) { + unset($a[$xPrefix.'previous']); + } + unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message'], $a[Caster::PREFIX_DYNAMIC.'__destructorException']); + + if (isset($a[Caster::PREFIX_PROTECTED.'message']) && false !== strpos($a[Caster::PREFIX_PROTECTED.'message'], "@anonymous\0")) { + $a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { + return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; + }, $a[Caster::PREFIX_PROTECTED.'message']); + } + + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { + $a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); + } + + return $a; + } + + private static function traceUnshift(array &$trace, ?string $class, string $file, int $line): void + { + if (isset($trace[0]['file'], $trace[0]['line']) && $trace[0]['file'] === $file && $trace[0]['line'] === $line) { + return; + } + array_unshift($trace, [ + 'function' => $class ? 'new '.$class : null, + 'file' => $file, + 'line' => $line, + ]); + } + + private static function extractSource(string $srcLines, int $line, int $srcContext, string $lang, ?string $file, array $frame): EnumStub + { + $srcLines = explode("\n", $srcLines); + $src = []; + + for ($i = $line - 1 - $srcContext; $i <= $line - 1 + $srcContext; ++$i) { + $src[] = (isset($srcLines[$i]) ? $srcLines[$i] : '')."\n"; + } + + if ($frame['function'] ?? false) { + $stub = new CutStub(new \stdClass()); + $stub->class = (isset($frame['class']) ? $frame['class'].$frame['type'] : '').$frame['function']; + $stub->type = Stub::TYPE_OBJECT; + $stub->attr['cut_hash'] = true; + $stub->attr['file'] = $frame['file']; + $stub->attr['line'] = $frame['line']; + + try { + $caller = isset($frame['class']) ? new \ReflectionMethod($frame['class'], $frame['function']) : new \ReflectionFunction($frame['function']); + $stub->class .= ReflectionCaster::getSignature(ReflectionCaster::castFunctionAbstract($caller, [], $stub, true, Caster::EXCLUDE_VERBOSE)); + + if ($f = $caller->getFileName()) { + $stub->attr['file'] = $f; + $stub->attr['line'] = $caller->getStartLine(); + } + } catch (\ReflectionException $e) { + // ignore fake class/function + } + + $srcLines = ["\0~separator=\0" => $stub]; + } else { + $stub = null; + $srcLines = []; + } + + $ltrim = 0; + do { + $pad = null; + for ($i = $srcContext << 1; $i >= 0; --$i) { + if (isset($src[$i][$ltrim]) && "\r" !== ($c = $src[$i][$ltrim]) && "\n" !== $c) { + if (null === $pad) { + $pad = $c; + } + if ((' ' !== $c && "\t" !== $c) || $pad !== $c) { + break; + } + } + } + ++$ltrim; + } while (0 > $i && null !== $pad); + + --$ltrim; + + foreach ($src as $i => $c) { + if ($ltrim) { + $c = isset($c[$ltrim]) && "\r" !== $c[$ltrim] ? substr($c, $ltrim) : ltrim($c, " \t"); + } + $c = substr($c, 0, -1); + if ($i !== $srcContext) { + $c = new ConstStub('default', $c); + } else { + $c = new ConstStub($c, $stub ? 'in '.$stub->class : ''); + if (null !== $file) { + $c->attr['file'] = $file; + $c->attr['line'] = $line; + } + } + $c->attr['lang'] = $lang; + $srcLines[sprintf("\0~separator=› &%d\0", $i + $line - $srcContext)] = $c; + } + + return new EnumStub($srcLines); + } +} diff --git a/vendor/symfony/var-dumper/Caster/FrameStub.php b/vendor/symfony/var-dumper/Caster/FrameStub.php new file mode 100644 index 0000000..8786755 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/FrameStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a single backtrace frame as returned by debug_backtrace() or Exception->getTrace(). + * + * @author Nicolas Grekas + */ +class FrameStub extends EnumStub +{ + public $keepArgs; + public $inTraceStub; + + public function __construct(array $frame, bool $keepArgs = true, bool $inTraceStub = false) + { + $this->value = $frame; + $this->keepArgs = $keepArgs; + $this->inTraceStub = $inTraceStub; + } +} diff --git a/vendor/symfony/var-dumper/Caster/GmpCaster.php b/vendor/symfony/var-dumper/Caster/GmpCaster.php new file mode 100644 index 0000000..b018cc7 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/GmpCaster.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts GMP objects to array representation. + * + * @author Hamza Amrouche + * @author Nicolas Grekas + * + * @final + */ +class GmpCaster +{ + public static function castGmp(\GMP $gmp, array $a, Stub $stub, bool $isNested, int $filter): array + { + $a[Caster::PREFIX_VIRTUAL.'value'] = new ConstStub(gmp_strval($gmp), gmp_strval($gmp)); + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ImagineCaster.php b/vendor/symfony/var-dumper/Caster/ImagineCaster.php new file mode 100644 index 0000000..d1289da --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ImagineCaster.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Imagine\Image\ImageInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Grégoire Pineau + */ +final class ImagineCaster +{ + public static function castImage(ImageInterface $c, array $a, Stub $stub, bool $isNested): array + { + $imgData = $c->get('png'); + if (\strlen($imgData) > 1 * 1000 * 1000) { + $a += [ + Caster::PREFIX_VIRTUAL.'image' => new ConstStub($c->getSize()), + ]; + } else { + $a += [ + Caster::PREFIX_VIRTUAL.'image' => new ImgStub($imgData, 'image/png', $c->getSize()), + ]; + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ImgStub.php b/vendor/symfony/var-dumper/Caster/ImgStub.php new file mode 100644 index 0000000..a16681f --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ImgStub.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * @author Grégoire Pineau + */ +class ImgStub extends ConstStub +{ + public function __construct(string $data, string $contentType, string $size = '') + { + $this->value = ''; + $this->attr['img-data'] = $data; + $this->attr['img-size'] = $size; + $this->attr['content-type'] = $contentType; + } +} diff --git a/vendor/symfony/var-dumper/Caster/IntlCaster.php b/vendor/symfony/var-dumper/Caster/IntlCaster.php new file mode 100644 index 0000000..23b9d5d --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/IntlCaster.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * @author Jan Schädlich + * + * @final + */ +class IntlCaster +{ + public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub $stub, bool $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + ]; + + return self::castError($c, $a); + } + + public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $a += [ + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + ]; + + if ($filter & Caster::EXCLUDE_VERBOSE) { + $stub->cut += 3; + + return self::castError($c, $a); + } + + $a += [ + Caster::PREFIX_VIRTUAL.'attributes' => new EnumStub( + [ + 'PARSE_INT_ONLY' => $c->getAttribute(\NumberFormatter::PARSE_INT_ONLY), + 'GROUPING_USED' => $c->getAttribute(\NumberFormatter::GROUPING_USED), + 'DECIMAL_ALWAYS_SHOWN' => $c->getAttribute(\NumberFormatter::DECIMAL_ALWAYS_SHOWN), + 'MAX_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_INTEGER_DIGITS), + 'MIN_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_INTEGER_DIGITS), + 'INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::INTEGER_DIGITS), + 'MAX_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_FRACTION_DIGITS), + 'MIN_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_FRACTION_DIGITS), + 'FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::FRACTION_DIGITS), + 'MULTIPLIER' => $c->getAttribute(\NumberFormatter::MULTIPLIER), + 'GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::GROUPING_SIZE), + 'ROUNDING_MODE' => $c->getAttribute(\NumberFormatter::ROUNDING_MODE), + 'ROUNDING_INCREMENT' => $c->getAttribute(\NumberFormatter::ROUNDING_INCREMENT), + 'FORMAT_WIDTH' => $c->getAttribute(\NumberFormatter::FORMAT_WIDTH), + 'PADDING_POSITION' => $c->getAttribute(\NumberFormatter::PADDING_POSITION), + 'SECONDARY_GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE), + 'SIGNIFICANT_DIGITS_USED' => $c->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED), + 'MIN_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS), + 'MAX_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS), + 'LENIENT_PARSE' => $c->getAttribute(\NumberFormatter::LENIENT_PARSE), + ] + ), + Caster::PREFIX_VIRTUAL.'text_attributes' => new EnumStub( + [ + 'POSITIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX), + 'POSITIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_SUFFIX), + 'NEGATIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_PREFIX), + 'NEGATIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_SUFFIX), + 'PADDING_CHARACTER' => $c->getTextAttribute(\NumberFormatter::PADDING_CHARACTER), + 'CURRENCY_CODE' => $c->getTextAttribute(\NumberFormatter::CURRENCY_CODE), + 'DEFAULT_RULESET' => $c->getTextAttribute(\NumberFormatter::DEFAULT_RULESET), + 'PUBLIC_RULESETS' => $c->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS), + ] + ), + Caster::PREFIX_VIRTUAL.'symbols' => new EnumStub( + [ + 'DECIMAL_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), + 'GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL), + 'PATTERN_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::PATTERN_SEPARATOR_SYMBOL), + 'PERCENT_SYMBOL' => $c->getSymbol(\NumberFormatter::PERCENT_SYMBOL), + 'ZERO_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::ZERO_DIGIT_SYMBOL), + 'DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::DIGIT_SYMBOL), + 'MINUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL), + 'PLUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::PLUS_SIGN_SYMBOL), + 'CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::CURRENCY_SYMBOL), + 'INTL_CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL), + 'MONETARY_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_SEPARATOR_SYMBOL), + 'EXPONENTIAL_SYMBOL' => $c->getSymbol(\NumberFormatter::EXPONENTIAL_SYMBOL), + 'PERMILL_SYMBOL' => $c->getSymbol(\NumberFormatter::PERMILL_SYMBOL), + 'PAD_ESCAPE_SYMBOL' => $c->getSymbol(\NumberFormatter::PAD_ESCAPE_SYMBOL), + 'INFINITY_SYMBOL' => $c->getSymbol(\NumberFormatter::INFINITY_SYMBOL), + 'NAN_SYMBOL' => $c->getSymbol(\NumberFormatter::NAN_SYMBOL), + 'SIGNIFICANT_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL), + 'MONETARY_GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL), + ] + ), + ]; + + return self::castError($c, $a); + } + + public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, bool $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'display_name' => $c->getDisplayName(), + Caster::PREFIX_VIRTUAL.'id' => $c->getID(), + Caster::PREFIX_VIRTUAL.'raw_offset' => $c->getRawOffset(), + ]; + + if ($c->useDaylightTime()) { + $a += [ + Caster::PREFIX_VIRTUAL.'dst_savings' => $c->getDSTSavings(), + ]; + } + + return self::castError($c, $a); + } + + public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $a += [ + Caster::PREFIX_VIRTUAL.'type' => $c->getType(), + Caster::PREFIX_VIRTUAL.'first_day_of_week' => $c->getFirstDayOfWeek(), + Caster::PREFIX_VIRTUAL.'minimal_days_in_first_week' => $c->getMinimalDaysInFirstWeek(), + Caster::PREFIX_VIRTUAL.'repeated_wall_time_option' => $c->getRepeatedWallTimeOption(), + Caster::PREFIX_VIRTUAL.'skipped_wall_time_option' => $c->getSkippedWallTimeOption(), + Caster::PREFIX_VIRTUAL.'time' => $c->getTime(), + Caster::PREFIX_VIRTUAL.'in_daylight_time' => $c->inDaylightTime(), + Caster::PREFIX_VIRTUAL.'is_lenient' => $c->isLenient(), + Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), + ]; + + return self::castError($c, $a); + } + + public static function castIntlDateFormatter(\IntlDateFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $a += [ + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + Caster::PREFIX_VIRTUAL.'calendar' => $c->getCalendar(), + Caster::PREFIX_VIRTUAL.'time_zone_id' => $c->getTimeZoneId(), + Caster::PREFIX_VIRTUAL.'time_type' => $c->getTimeType(), + Caster::PREFIX_VIRTUAL.'date_type' => $c->getDateType(), + Caster::PREFIX_VIRTUAL.'calendar_object' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getCalendarObject()) : $c->getCalendarObject(), + Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), + ]; + + return self::castError($c, $a); + } + + private static function castError(object $c, array $a): array + { + if ($errorCode = $c->getErrorCode()) { + $a += [ + Caster::PREFIX_VIRTUAL.'error_code' => $errorCode, + Caster::PREFIX_VIRTUAL.'error_message' => $c->getErrorMessage(), + ]; + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/LinkStub.php b/vendor/symfony/var-dumper/Caster/LinkStub.php new file mode 100644 index 0000000..0aa076a --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/LinkStub.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a file or a URL. + * + * @author Nicolas Grekas + */ +class LinkStub extends ConstStub +{ + public $inVendor = false; + + private static $vendorRoots; + private static $composerRoots; + + public function __construct($label, int $line = 0, $href = null) + { + $this->value = $label; + + if (null === $href) { + $href = $label; + } + if (!\is_string($href)) { + return; + } + if (0 === strpos($href, 'file://')) { + if ($href === $label) { + $label = substr($label, 7); + } + $href = substr($href, 7); + } elseif (false !== strpos($href, '://')) { + $this->attr['href'] = $href; + + return; + } + if (!is_file($href)) { + return; + } + if ($line) { + $this->attr['line'] = $line; + } + if ($label !== $this->attr['file'] = realpath($href) ?: $href) { + return; + } + if ($composerRoot = $this->getComposerRoot($href, $this->inVendor)) { + $this->attr['ellipsis'] = \strlen($href) - \strlen($composerRoot) + 1; + $this->attr['ellipsis-type'] = 'path'; + $this->attr['ellipsis-tail'] = 1 + ($this->inVendor ? 2 + \strlen(implode('', \array_slice(explode(\DIRECTORY_SEPARATOR, substr($href, 1 - $this->attr['ellipsis'])), 0, 2))) : 0); + } elseif (3 < \count($ellipsis = explode(\DIRECTORY_SEPARATOR, $href))) { + $this->attr['ellipsis'] = 2 + \strlen(implode('', \array_slice($ellipsis, -2))); + $this->attr['ellipsis-type'] = 'path'; + $this->attr['ellipsis-tail'] = 1; + } + } + + private function getComposerRoot(string $file, bool &$inVendor) + { + if (null === self::$vendorRoots) { + self::$vendorRoots = []; + + foreach (get_declared_classes() as $class) { + if ('C' === $class[0] && 0 === strpos($class, 'ComposerAutoloaderInit')) { + $r = new \ReflectionClass($class); + $v = \dirname($r->getFileName(), 2); + if (is_file($v.'/composer/installed.json')) { + self::$vendorRoots[] = $v.\DIRECTORY_SEPARATOR; + } + } + } + } + $inVendor = false; + + if (isset(self::$composerRoots[$dir = \dirname($file)])) { + return self::$composerRoots[$dir]; + } + + foreach (self::$vendorRoots as $root) { + if ($inVendor = 0 === strpos($file, $root)) { + return $root; + } + } + + $parent = $dir; + while (!@is_file($parent.'/composer.json')) { + if (!@file_exists($parent)) { + // open_basedir restriction in effect + break; + } + if ($parent === \dirname($parent)) { + return self::$composerRoots[$dir] = false; + } + + $parent = \dirname($parent); + } + + return self::$composerRoots[$dir] = $parent.\DIRECTORY_SEPARATOR; + } +} diff --git a/vendor/symfony/var-dumper/Caster/MemcachedCaster.php b/vendor/symfony/var-dumper/Caster/MemcachedCaster.php new file mode 100644 index 0000000..111b060 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/MemcachedCaster.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Jan Schädlich + * + * @final + */ +class MemcachedCaster +{ + private static $optionConstants; + private static $defaultOptions; + + public static function castMemcached(\Memcached $c, array $a, Stub $stub, bool $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'servers' => $c->getServerList(), + Caster::PREFIX_VIRTUAL.'options' => new EnumStub( + self::getNonDefaultOptions($c) + ), + ]; + + return $a; + } + + private static function getNonDefaultOptions(\Memcached $c): array + { + self::$defaultOptions = self::$defaultOptions ?? self::discoverDefaultOptions(); + self::$optionConstants = self::$optionConstants ?? self::getOptionConstants(); + + $nonDefaultOptions = []; + foreach (self::$optionConstants as $constantKey => $value) { + if (self::$defaultOptions[$constantKey] !== $option = $c->getOption($value)) { + $nonDefaultOptions[$constantKey] = $option; + } + } + + return $nonDefaultOptions; + } + + private static function discoverDefaultOptions(): array + { + $defaultMemcached = new \Memcached(); + $defaultMemcached->addServer('127.0.0.1', 11211); + + $defaultOptions = []; + self::$optionConstants = self::$optionConstants ?? self::getOptionConstants(); + + foreach (self::$optionConstants as $constantKey => $value) { + $defaultOptions[$constantKey] = $defaultMemcached->getOption($value); + } + + return $defaultOptions; + } + + private static function getOptionConstants(): array + { + $reflectedMemcached = new \ReflectionClass(\Memcached::class); + + $optionConstants = []; + foreach ($reflectedMemcached->getConstants() as $constantKey => $value) { + if (0 === strpos($constantKey, 'OPT_')) { + $optionConstants[$constantKey] = $value; + } + } + + return $optionConstants; + } +} diff --git a/vendor/symfony/var-dumper/Caster/PdoCaster.php b/vendor/symfony/var-dumper/Caster/PdoCaster.php new file mode 100644 index 0000000..4ba302b --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/PdoCaster.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts PDO related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class PdoCaster +{ + private static $pdoAttributes = [ + 'CASE' => [ + \PDO::CASE_LOWER => 'LOWER', + \PDO::CASE_NATURAL => 'NATURAL', + \PDO::CASE_UPPER => 'UPPER', + ], + 'ERRMODE' => [ + \PDO::ERRMODE_SILENT => 'SILENT', + \PDO::ERRMODE_WARNING => 'WARNING', + \PDO::ERRMODE_EXCEPTION => 'EXCEPTION', + ], + 'TIMEOUT', + 'PREFETCH', + 'AUTOCOMMIT', + 'PERSISTENT', + 'DRIVER_NAME', + 'SERVER_INFO', + 'ORACLE_NULLS' => [ + \PDO::NULL_NATURAL => 'NATURAL', + \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING', + \PDO::NULL_TO_STRING => 'TO_STRING', + ], + 'CLIENT_VERSION', + 'SERVER_VERSION', + 'STATEMENT_CLASS', + 'EMULATE_PREPARES', + 'CONNECTION_STATUS', + 'STRINGIFY_FETCHES', + 'DEFAULT_FETCH_MODE' => [ + \PDO::FETCH_ASSOC => 'ASSOC', + \PDO::FETCH_BOTH => 'BOTH', + \PDO::FETCH_LAZY => 'LAZY', + \PDO::FETCH_NUM => 'NUM', + \PDO::FETCH_OBJ => 'OBJ', + ], + ]; + + public static function castPdo(\PDO $c, array $a, Stub $stub, bool $isNested) + { + $attr = []; + $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE); + $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + foreach (self::$pdoAttributes as $k => $v) { + if (!isset($k[0])) { + $k = $v; + $v = []; + } + + try { + $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k)); + if ($v && isset($v[$attr[$k]])) { + $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]); + } + } catch (\Exception $e) { + } + } + if (isset($attr[$k = 'STATEMENT_CLASS'][1])) { + if ($attr[$k][1]) { + $attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]); + } + $attr[$k][0] = new ClassStub($attr[$k][0]); + } + + $prefix = Caster::PREFIX_VIRTUAL; + $a += [ + $prefix.'inTransaction' => method_exists($c, 'inTransaction'), + $prefix.'errorInfo' => $c->errorInfo(), + $prefix.'attributes' => new EnumStub($attr), + ]; + + if ($a[$prefix.'inTransaction']) { + $a[$prefix.'inTransaction'] = $c->inTransaction(); + } else { + unset($a[$prefix.'inTransaction']); + } + + if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { + unset($a[$prefix.'errorInfo']); + } + + $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode); + + return $a; + } + + public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $a[$prefix.'errorInfo'] = $c->errorInfo(); + + if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { + unset($a[$prefix.'errorInfo']); + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/PgSqlCaster.php b/vendor/symfony/var-dumper/Caster/PgSqlCaster.php new file mode 100644 index 0000000..f9f3c6f --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/PgSqlCaster.php @@ -0,0 +1,156 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts pqsql resources to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class PgSqlCaster +{ + private static $paramCodes = [ + 'server_encoding', + 'client_encoding', + 'is_superuser', + 'session_authorization', + 'DateStyle', + 'TimeZone', + 'IntervalStyle', + 'integer_datetimes', + 'application_name', + 'standard_conforming_strings', + ]; + + private static $transactionStatus = [ + PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE', + PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE', + PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS', + PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR', + PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN', + ]; + + private static $resultStatus = [ + PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY', + PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK', + PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK', + PGSQL_COPY_OUT => 'PGSQL_COPY_OUT', + PGSQL_COPY_IN => 'PGSQL_COPY_IN', + PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE', + PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR', + PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR', + ]; + + private static $diagCodes = [ + 'severity' => PGSQL_DIAG_SEVERITY, + 'sqlstate' => PGSQL_DIAG_SQLSTATE, + 'message' => PGSQL_DIAG_MESSAGE_PRIMARY, + 'detail' => PGSQL_DIAG_MESSAGE_DETAIL, + 'hint' => PGSQL_DIAG_MESSAGE_HINT, + 'statement position' => PGSQL_DIAG_STATEMENT_POSITION, + 'internal position' => PGSQL_DIAG_INTERNAL_POSITION, + 'internal query' => PGSQL_DIAG_INTERNAL_QUERY, + 'context' => PGSQL_DIAG_CONTEXT, + 'file' => PGSQL_DIAG_SOURCE_FILE, + 'line' => PGSQL_DIAG_SOURCE_LINE, + 'function' => PGSQL_DIAG_SOURCE_FUNCTION, + ]; + + public static function castLargeObject($lo, array $a, Stub $stub, bool $isNested) + { + $a['seek position'] = pg_lo_tell($lo); + + return $a; + } + + public static function castLink($link, array $a, Stub $stub, bool $isNested) + { + $a['status'] = pg_connection_status($link); + $a['status'] = new ConstStub(PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']); + $a['busy'] = pg_connection_busy($link); + + $a['transaction'] = pg_transaction_status($link); + if (isset(self::$transactionStatus[$a['transaction']])) { + $a['transaction'] = new ConstStub(self::$transactionStatus[$a['transaction']], $a['transaction']); + } + + $a['pid'] = pg_get_pid($link); + $a['last error'] = pg_last_error($link); + $a['last notice'] = pg_last_notice($link); + $a['host'] = pg_host($link); + $a['port'] = pg_port($link); + $a['dbname'] = pg_dbname($link); + $a['options'] = pg_options($link); + $a['version'] = pg_version($link); + + foreach (self::$paramCodes as $v) { + if (false !== $s = pg_parameter_status($link, $v)) { + $a['param'][$v] = $s; + } + } + + $a['param']['client_encoding'] = pg_client_encoding($link); + $a['param'] = new EnumStub($a['param']); + + return $a; + } + + public static function castResult($result, array $a, Stub $stub, bool $isNested) + { + $a['num rows'] = pg_num_rows($result); + $a['status'] = pg_result_status($result); + if (isset(self::$resultStatus[$a['status']])) { + $a['status'] = new ConstStub(self::$resultStatus[$a['status']], $a['status']); + } + $a['command-completion tag'] = pg_result_status($result, PGSQL_STATUS_STRING); + + if (-1 === $a['num rows']) { + foreach (self::$diagCodes as $k => $v) { + $a['error'][$k] = pg_result_error_field($result, $v); + } + } + + $a['affected rows'] = pg_affected_rows($result); + $a['last OID'] = pg_last_oid($result); + + $fields = pg_num_fields($result); + + for ($i = 0; $i < $fields; ++$i) { + $field = [ + 'name' => pg_field_name($result, $i), + 'table' => sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)), + 'type' => sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)), + 'nullable' => (bool) pg_field_is_null($result, $i), + 'storage' => pg_field_size($result, $i).' bytes', + 'display' => pg_field_prtlen($result, $i).' chars', + ]; + if (' (OID: )' === $field['table']) { + $field['table'] = null; + } + if ('-1 bytes' === $field['storage']) { + $field['storage'] = 'variable size'; + } elseif ('1 bytes' === $field['storage']) { + $field['storage'] = '1 byte'; + } + if ('1 chars' === $field['display']) { + $field['display'] = '1 char'; + } + $a['fields'][] = new EnumStub($field); + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php b/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php new file mode 100644 index 0000000..e712019 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use ProxyManager\Proxy\ProxyInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @final + */ +class ProxyManagerCaster +{ + public static function castProxy(ProxyInterface $c, array $a, Stub $stub, bool $isNested) + { + if ($parent = get_parent_class($c)) { + $stub->class .= ' - '.$parent; + } + $stub->class .= '@proxy'; + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php b/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php new file mode 100644 index 0000000..c3e4eb9 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php @@ -0,0 +1,186 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use RdKafka\Conf; +use RdKafka\Exception as RdKafkaException; +use RdKafka\KafkaConsumer; +use RdKafka\Message; +use RdKafka\Metadata\Broker as BrokerMetadata; +use RdKafka\Metadata\Collection as CollectionMetadata; +use RdKafka\Metadata\Partition as PartitionMetadata; +use RdKafka\Metadata\Topic as TopicMetadata; +use RdKafka\Topic; +use RdKafka\TopicConf; +use RdKafka\TopicPartition; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts RdKafka related classes to array representation. + * + * @author Romain Neutron + */ +class RdKafkaCaster +{ + public static function castKafkaConsumer(KafkaConsumer $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + try { + $assignment = $c->getAssignment(); + } catch (RdKafkaException $e) { + $assignment = []; + } + + $a += [ + $prefix.'subscription' => $c->getSubscription(), + $prefix.'assignment' => $assignment, + ]; + + $a += self::extractMetadata($c); + + return $a; + } + + public static function castTopic(Topic $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'name' => $c->getName(), + ]; + + return $a; + } + + public static function castTopicPartition(TopicPartition $c, array $a) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'offset' => $c->getOffset(), + $prefix.'partition' => $c->getPartition(), + $prefix.'topic' => $c->getTopic(), + ]; + + return $a; + } + + public static function castMessage(Message $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'errstr' => $c->errstr(), + ]; + + return $a; + } + + public static function castConf(Conf $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($c->dump() as $key => $value) { + $a[$prefix.$key] = $value; + } + + return $a; + } + + public static function castTopicConf(TopicConf $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($c->dump() as $key => $value) { + $a[$prefix.$key] = $value; + } + + return $a; + } + + public static function castRdKafka(\RdKafka $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'out_q_len' => $c->getOutQLen(), + ]; + + $a += self::extractMetadata($c); + + return $a; + } + + public static function castCollectionMetadata(CollectionMetadata $c, array $a, Stub $stub, $isNested) + { + $a += iterator_to_array($c); + + return $a; + } + + public static function castTopicMetadata(TopicMetadata $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'name' => $c->getTopic(), + $prefix.'partitions' => $c->getPartitions(), + ]; + + return $a; + } + + public static function castPartitionMetadata(PartitionMetadata $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'id' => $c->getId(), + $prefix.'err' => $c->getErr(), + $prefix.'leader' => $c->getLeader(), + ]; + + return $a; + } + + public static function castBrokerMetadata(BrokerMetadata $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'id' => $c->getId(), + $prefix.'host' => $c->getHost(), + $prefix.'port' => $c->getPort(), + ]; + + return $a; + } + + private static function extractMetadata($c) + { + $prefix = Caster::PREFIX_VIRTUAL; + + try { + $m = $c->getMetadata(true, null, 500); + } catch (RdKafkaException $e) { + return []; + } + + return [ + $prefix.'orig_broker_id' => $m->getOrigBrokerId(), + $prefix.'orig_broker_name' => $m->getOrigBrokerName(), + $prefix.'brokers' => $m->getBrokers(), + $prefix.'topics' => $m->getTopics(), + ]; + } +} diff --git a/vendor/symfony/var-dumper/Caster/RedisCaster.php b/vendor/symfony/var-dumper/Caster/RedisCaster.php new file mode 100644 index 0000000..a7ca8ec --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/RedisCaster.php @@ -0,0 +1,152 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Redis class from ext-redis to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class RedisCaster +{ + private static $serializer = [ + \Redis::SERIALIZER_NONE => 'NONE', + \Redis::SERIALIZER_PHP => 'PHP', + 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY + ]; + + private static $mode = [ + \Redis::ATOMIC => 'ATOMIC', + \Redis::MULTI => 'MULTI', + \Redis::PIPELINE => 'PIPELINE', + ]; + + private static $compression = [ + 0 => 'NONE', // Redis::COMPRESSION_NONE + 1 => 'LZF', // Redis::COMPRESSION_LZF + ]; + + private static $failover = [ + \RedisCluster::FAILOVER_NONE => 'NONE', + \RedisCluster::FAILOVER_ERROR => 'ERROR', + \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE', + \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES', + ]; + + public static function castRedis(\Redis $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + if (!$connected = $c->isConnected()) { + return $a + [ + $prefix.'isConnected' => $connected, + ]; + } + + $mode = $c->getMode(); + + return $a + [ + $prefix.'isConnected' => $connected, + $prefix.'host' => $c->getHost(), + $prefix.'port' => $c->getPort(), + $prefix.'auth' => $c->getAuth(), + $prefix.'mode' => isset(self::$mode[$mode]) ? new ConstStub(self::$mode[$mode], $mode) : $mode, + $prefix.'dbNum' => $c->getDbNum(), + $prefix.'timeout' => $c->getTimeout(), + $prefix.'lastError' => $c->getLastError(), + $prefix.'persistentId' => $c->getPersistentID(), + $prefix.'options' => self::getRedisOptions($c), + ]; + } + + public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + return $a + [ + $prefix.'hosts' => $c->_hosts(), + $prefix.'function' => ClassStub::wrapCallable($c->_function()), + $prefix.'lastError' => $c->getLastError(), + $prefix.'options' => self::getRedisOptions($c), + ]; + } + + public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER); + + $a += [ + $prefix.'_masters' => $c->_masters(), + $prefix.'_redir' => $c->_redir(), + $prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()), + $prefix.'lastError' => $c->getLastError(), + $prefix.'options' => self::getRedisOptions($c, [ + 'SLAVE_FAILOVER' => isset(self::$failover[$failover]) ? new ConstStub(self::$failover[$failover], $failover) : $failover, + ]), + ]; + + return $a; + } + + /** + * @param \Redis|\RedisArray|\RedisCluster $redis + */ + private static function getRedisOptions($redis, array $options = []): EnumStub + { + $serializer = $redis->getOption(\Redis::OPT_SERIALIZER); + if (\is_array($serializer)) { + foreach ($serializer as &$v) { + if (isset(self::$serializer[$v])) { + $v = new ConstStub(self::$serializer[$v], $v); + } + } + } elseif (isset(self::$serializer[$serializer])) { + $serializer = new ConstStub(self::$serializer[$serializer], $serializer); + } + + $compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0; + if (\is_array($compression)) { + foreach ($compression as &$v) { + if (isset(self::$compression[$v])) { + $v = new ConstStub(self::$compression[$v], $v); + } + } + } elseif (isset(self::$compression[$compression])) { + $compression = new ConstStub(self::$compression[$compression], $compression); + } + + $retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0; + if (\is_array($retry)) { + foreach ($retry as &$v) { + $v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v); + } + } else { + $retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry); + } + + $options += [ + 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : 0, + 'READ_TIMEOUT' => $redis->getOption(\Redis::OPT_READ_TIMEOUT), + 'COMPRESSION' => $compression, + 'SERIALIZER' => $serializer, + 'PREFIX' => $redis->getOption(\Redis::OPT_PREFIX), + 'SCAN' => $retry, + ]; + + return new EnumStub($options); + } +} diff --git a/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/vendor/symfony/var-dumper/Caster/ReflectionCaster.php new file mode 100644 index 0000000..470229b --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ReflectionCaster.php @@ -0,0 +1,392 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Reflector related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class ReflectionCaster +{ + const UNSET_CLOSURE_FILE_INFO = ['Closure' => __CLASS__.'::unsetClosureFileInfo']; + + private static $extraMap = [ + 'docComment' => 'getDocComment', + 'extension' => 'getExtensionName', + 'isDisabled' => 'isDisabled', + 'isDeprecated' => 'isDeprecated', + 'isInternal' => 'isInternal', + 'isUserDefined' => 'isUserDefined', + 'isGenerator' => 'isGenerator', + 'isVariadic' => 'isVariadic', + ]; + + public static function castClosure(\Closure $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + $c = new \ReflectionFunction($c); + + $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter); + + if (false === strpos($c->name, '{closure}')) { + $stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name; + unset($a[$prefix.'class']); + } + unset($a[$prefix.'extra']); + + $stub->class .= self::getSignature($a); + + if ($f = $c->getFileName()) { + $stub->attr['file'] = $f; + $stub->attr['line'] = $c->getStartLine(); + } + + unset($a[$prefix.'parameters']); + + if ($filter & Caster::EXCLUDE_VERBOSE) { + $stub->cut += ($c->getFileName() ? 2 : 0) + \count($a); + + return []; + } + + if ($f) { + $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine()); + $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine(); + } + + return $a; + } + + public static function unsetClosureFileInfo(\Closure $c, array $a) + { + unset($a[Caster::PREFIX_VIRTUAL.'file'], $a[Caster::PREFIX_VIRTUAL.'line']); + + return $a; + } + + public static function castGenerator(\Generator $c, array $a, Stub $stub, bool $isNested) + { + // Cannot create ReflectionGenerator based on a terminated Generator + try { + $reflectionGenerator = new \ReflectionGenerator($c); + } catch (\Exception $e) { + $a[Caster::PREFIX_VIRTUAL.'closed'] = true; + + return $a; + } + + return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested); + } + + public static function castType(\ReflectionType $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'name' => $c instanceof \ReflectionNamedType ? $c->getName() : (string) $c, + $prefix.'allowsNull' => $c->allowsNull(), + $prefix.'isBuiltin' => $c->isBuiltin(), + ]; + + return $a; + } + + public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($c->getThis()) { + $a[$prefix.'this'] = new CutStub($c->getThis()); + } + $function = $c->getFunction(); + $frame = [ + 'class' => isset($function->class) ? $function->class : null, + 'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null, + 'function' => $function->name, + 'file' => $c->getExecutingFile(), + 'line' => $c->getExecutingLine(), + ]; + if ($trace = $c->getTrace(DEBUG_BACKTRACE_IGNORE_ARGS)) { + $function = new \ReflectionGenerator($c->getExecutingGenerator()); + array_unshift($trace, [ + 'function' => 'yield', + 'file' => $function->getExecutingFile(), + 'line' => $function->getExecutingLine() - 1, + ]); + $trace[] = $frame; + $a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1); + } else { + $function = new FrameStub($frame, false, true); + $function = ExceptionCaster::castFrameStub($function, [], $function, true); + $a[$prefix.'executing'] = $function[$prefix.'src']; + } + + $a[Caster::PREFIX_VIRTUAL.'closed'] = false; + + return $a; + } + + public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($n = \Reflection::getModifierNames($c->getModifiers())) { + $a[$prefix.'modifiers'] = implode(' ', $n); + } + + self::addMap($a, $c, [ + 'extends' => 'getParentClass', + 'implements' => 'getInterfaceNames', + 'constants' => 'getConstants', + ]); + + foreach ($c->getProperties() as $n) { + $a[$prefix.'properties'][$n->name] = $n; + } + + foreach ($c->getMethods() as $n) { + $a[$prefix.'methods'][$n->name] = $n; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { + self::addExtra($a, $c); + } + + return $a; + } + + public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + + self::addMap($a, $c, [ + 'returnsReference' => 'returnsReference', + 'returnType' => 'getReturnType', + 'class' => 'getClosureScopeClass', + 'this' => 'getClosureThis', + ]); + + if (isset($a[$prefix.'returnType'])) { + $v = $a[$prefix.'returnType']; + $v = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; + $a[$prefix.'returnType'] = new ClassStub($a[$prefix.'returnType']->allowsNull() ? '?'.$v : $v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); + } + if (isset($a[$prefix.'class'])) { + $a[$prefix.'class'] = new ClassStub($a[$prefix.'class']); + } + if (isset($a[$prefix.'this'])) { + $a[$prefix.'this'] = new CutStub($a[$prefix.'this']); + } + + foreach ($c->getParameters() as $v) { + $k = '$'.$v->name; + if ($v->isVariadic()) { + $k = '...'.$k; + } + if ($v->isPassedByReference()) { + $k = '&'.$k; + } + $a[$prefix.'parameters'][$k] = $v; + } + if (isset($a[$prefix.'parameters'])) { + $a[$prefix.'parameters'] = new EnumStub($a[$prefix.'parameters']); + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && $v = $c->getStaticVariables()) { + foreach ($v as $k => &$v) { + if (\is_object($v)) { + $a[$prefix.'use']['$'.$k] = new CutStub($v); + } else { + $a[$prefix.'use']['$'.$k] = &$v; + } + } + unset($v); + $a[$prefix.'use'] = new EnumStub($a[$prefix.'use']); + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { + self::addExtra($a, $c); + } + + return $a; + } + + public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bool $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + + return $a; + } + + public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + self::addMap($a, $c, [ + 'position' => 'getPosition', + 'isVariadic' => 'isVariadic', + 'byReference' => 'isPassedByReference', + 'allowsNull' => 'allowsNull', + ]); + + if ($v = $c->getType()) { + $a[$prefix.'typeHint'] = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; + } + + if (isset($a[$prefix.'typeHint'])) { + $v = $a[$prefix.'typeHint']; + $a[$prefix.'typeHint'] = new ClassStub($v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); + } else { + unset($a[$prefix.'allowsNull']); + } + + try { + $a[$prefix.'default'] = $v = $c->getDefaultValue(); + if ($c->isDefaultValueConstant()) { + $a[$prefix.'default'] = new ConstStub($c->getDefaultValueConstantName(), $v); + } + if (null === $v) { + unset($a[$prefix.'allowsNull']); + } + } catch (\ReflectionException $e) { + } + + return $a; + } + + public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, bool $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + self::addExtra($a, $c); + + return $a; + } + + public static function castReference(\ReflectionReference $c, array $a, Stub $stub, bool $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'id'] = $c->getId(); + + return $a; + } + + public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, bool $isNested) + { + self::addMap($a, $c, [ + 'version' => 'getVersion', + 'dependencies' => 'getDependencies', + 'iniEntries' => 'getIniEntries', + 'isPersistent' => 'isPersistent', + 'isTemporary' => 'isTemporary', + 'constants' => 'getConstants', + 'functions' => 'getFunctions', + 'classes' => 'getClasses', + ]); + + return $a; + } + + public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, bool $isNested) + { + self::addMap($a, $c, [ + 'version' => 'getVersion', + 'author' => 'getAuthor', + 'copyright' => 'getCopyright', + 'url' => 'getURL', + ]); + + return $a; + } + + public static function getSignature(array $a) + { + $prefix = Caster::PREFIX_VIRTUAL; + $signature = ''; + + if (isset($a[$prefix.'parameters'])) { + foreach ($a[$prefix.'parameters']->value as $k => $param) { + $signature .= ', '; + if ($type = $param->getType()) { + if (!$type instanceof \ReflectionNamedType) { + $signature .= $type.' '; + } else { + if (!$param->isOptional() && $param->allowsNull()) { + $signature .= '?'; + } + $signature .= substr(strrchr('\\'.$type->getName(), '\\'), 1).' '; + } + } + $signature .= $k; + + if (!$param->isDefaultValueAvailable()) { + continue; + } + $v = $param->getDefaultValue(); + $signature .= ' = '; + + if ($param->isDefaultValueConstant()) { + $signature .= substr(strrchr('\\'.$param->getDefaultValueConstantName(), '\\'), 1); + } elseif (null === $v) { + $signature .= 'null'; + } elseif (\is_array($v)) { + $signature .= $v ? '[…'.\count($v).']' : '[]'; + } elseif (\is_string($v)) { + $signature .= 10 > \strlen($v) && false === strpos($v, '\\') ? "'{$v}'" : "'…".\strlen($v)."'"; + } elseif (\is_bool($v)) { + $signature .= $v ? 'true' : 'false'; + } else { + $signature .= $v; + } + } + } + $signature = (empty($a[$prefix.'returnsReference']) ? '' : '&').'('.substr($signature, 2).')'; + + if (isset($a[$prefix.'returnType'])) { + $signature .= ': '.substr(strrchr('\\'.$a[$prefix.'returnType'], '\\'), 1); + } + + return $signature; + } + + private static function addExtra(array &$a, \Reflector $c) + { + $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : []; + + if (method_exists($c, 'getFileName') && $m = $c->getFileName()) { + $x['file'] = new LinkStub($m, $c->getStartLine()); + $x['line'] = $c->getStartLine().' to '.$c->getEndLine(); + } + + self::addMap($x, $c, self::$extraMap, ''); + + if ($x) { + $a[Caster::PREFIX_VIRTUAL.'extra'] = new EnumStub($x); + } + } + + private static function addMap(array &$a, \Reflector $c, array $map, string $prefix = Caster::PREFIX_VIRTUAL) + { + foreach ($map as $k => $m) { + if (\PHP_VERSION_ID >= 80000 && 'isDisabled' === $k) { + continue; + } + + if (method_exists($c, $m) && false !== ($m = $c->$m()) && null !== $m) { + $a[$prefix.$k] = $m instanceof \Reflector ? $m->name : $m; + } + } + } +} diff --git a/vendor/symfony/var-dumper/Caster/ResourceCaster.php b/vendor/symfony/var-dumper/Caster/ResourceCaster.php new file mode 100644 index 0000000..6b2ed52 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ResourceCaster.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts common resource types to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class ResourceCaster +{ + /** + * @param \CurlHandle|resource $h + * + * @return array + */ + public static function castCurl($h, array $a, Stub $stub, bool $isNested) + { + return curl_getinfo($h); + } + + public static function castDba($dba, array $a, Stub $stub, bool $isNested) + { + $list = dba_list(); + $a['file'] = $list[(int) $dba]; + + return $a; + } + + public static function castProcess($process, array $a, Stub $stub, bool $isNested) + { + return proc_get_status($process); + } + + public static function castStream($stream, array $a, Stub $stub, bool $isNested) + { + $a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested); + if (isset($a['uri'])) { + $a['uri'] = new LinkStub($a['uri']); + } + + return $a; + } + + public static function castStreamContext($stream, array $a, Stub $stub, bool $isNested) + { + return @stream_context_get_params($stream) ?: $a; + } + + public static function castGd($gd, array $a, Stub $stub, $isNested) + { + $a['size'] = imagesx($gd).'x'.imagesy($gd); + $a['trueColor'] = imageistruecolor($gd); + + return $a; + } + + public static function castMysqlLink($h, array $a, Stub $stub, bool $isNested) + { + $a['host'] = mysql_get_host_info($h); + $a['protocol'] = mysql_get_proto_info($h); + $a['server'] = mysql_get_server_info($h); + + return $a; + } + + public static function castOpensslX509($h, array $a, Stub $stub, bool $isNested) + { + $stub->cut = -1; + $info = openssl_x509_parse($h, false); + + $pin = openssl_pkey_get_public($h); + $pin = openssl_pkey_get_details($pin)['key']; + $pin = \array_slice(explode("\n", $pin), 1, -2); + $pin = base64_decode(implode('', $pin)); + $pin = base64_encode(hash('sha256', $pin, true)); + + $a += [ + 'subject' => new EnumStub(array_intersect_key($info['subject'], ['organizationName' => true, 'commonName' => true])), + 'issuer' => new EnumStub(array_intersect_key($info['issuer'], ['organizationName' => true, 'commonName' => true])), + 'expiry' => new ConstStub(date(\DateTime::ISO8601, $info['validTo_time_t']), $info['validTo_time_t']), + 'fingerprint' => new EnumStub([ + 'md5' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'md5')), 2, ':', true)), + 'sha1' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha1')), 2, ':', true)), + 'sha256' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha256')), 2, ':', true)), + 'pin-sha256' => new ConstStub($pin), + ]), + ]; + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/SplCaster.php b/vendor/symfony/var-dumper/Caster/SplCaster.php new file mode 100644 index 0000000..ae11252 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/SplCaster.php @@ -0,0 +1,223 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts SPL related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class SplCaster +{ + private static $splFileObjectFlags = [ + \SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE', + \SplFileObject::READ_AHEAD => 'READ_AHEAD', + \SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY', + \SplFileObject::READ_CSV => 'READ_CSV', + ]; + + public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, bool $isNested) + { + return self::castSplArray($c, $a, $stub, $isNested); + } + + public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, bool $isNested) + { + return self::castSplArray($c, $a, $stub, $isNested); + } + + public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c), + ]; + + return $a; + } + + public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, bool $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $mode = $c->getIteratorMode(); + $c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE); + + $a += [ + $prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode), + $prefix.'dllist' => iterator_to_array($c), + ]; + $c->setIteratorMode($mode); + + return $a; + } + + public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, bool $isNested) + { + static $map = [ + 'path' => 'getPath', + 'filename' => 'getFilename', + 'basename' => 'getBasename', + 'pathname' => 'getPathname', + 'extension' => 'getExtension', + 'realPath' => 'getRealPath', + 'aTime' => 'getATime', + 'mTime' => 'getMTime', + 'cTime' => 'getCTime', + 'inode' => 'getInode', + 'size' => 'getSize', + 'perms' => 'getPerms', + 'owner' => 'getOwner', + 'group' => 'getGroup', + 'type' => 'getType', + 'writable' => 'isWritable', + 'readable' => 'isReadable', + 'executable' => 'isExecutable', + 'file' => 'isFile', + 'dir' => 'isDir', + 'link' => 'isLink', + 'linkTarget' => 'getLinkTarget', + ]; + + $prefix = Caster::PREFIX_VIRTUAL; + unset($a["\0SplFileInfo\0fileName"]); + unset($a["\0SplFileInfo\0pathName"]); + + if (false === $c->getPathname()) { + $a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state'; + + return $a; + } + + foreach ($map as $key => $accessor) { + try { + $a[$prefix.$key] = $c->$accessor(); + } catch (\Exception $e) { + } + } + + if (isset($a[$prefix.'realPath'])) { + $a[$prefix.'realPath'] = new LinkStub($a[$prefix.'realPath']); + } + + if (isset($a[$prefix.'perms'])) { + $a[$prefix.'perms'] = new ConstStub(sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']); + } + + static $mapDate = ['aTime', 'mTime', 'cTime']; + foreach ($mapDate as $key) { + if (isset($a[$prefix.$key])) { + $a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]); + } + } + + return $a; + } + + public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, bool $isNested) + { + static $map = [ + 'csvControl' => 'getCsvControl', + 'flags' => 'getFlags', + 'maxLineLen' => 'getMaxLineLen', + 'fstat' => 'fstat', + 'eof' => 'eof', + 'key' => 'key', + ]; + + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($map as $key => $accessor) { + try { + $a[$prefix.$key] = $c->$accessor(); + } catch (\Exception $e) { + } + } + + if (isset($a[$prefix.'flags'])) { + $flagsArray = []; + foreach (self::$splFileObjectFlags as $value => $name) { + if ($a[$prefix.'flags'] & $value) { + $flagsArray[] = $name; + } + } + $a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']); + } + + if (isset($a[$prefix.'fstat'])) { + $a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], ['dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks']); + } + + return $a; + } + + public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, bool $isNested) + { + $storage = []; + unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); // Don't hit https://bugs.php.net/65967 + unset($a["\0SplObjectStorage\0storage"]); + + $clone = clone $c; + foreach ($clone as $obj) { + $storage[] = [ + 'object' => $obj, + 'info' => $clone->getInfo(), + ]; + } + + $a += [ + Caster::PREFIX_VIRTUAL.'storage' => $storage, + ]; + + return $a; + } + + public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, bool $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator(); + + return $a; + } + + public static function castWeakReference(\WeakReference $c, array $a, Stub $stub, bool $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'object'] = $c->get(); + + return $a; + } + + private static function castSplArray($c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $flags = $c->getFlags(); + + if (!($flags & \ArrayObject::STD_PROP_LIST)) { + $c->setFlags(\ArrayObject::STD_PROP_LIST); + $a = Caster::castObject($c, \get_class($c), method_exists($c, '__debugInfo'), $stub->class); + $c->setFlags($flags); + } + if (\PHP_VERSION_ID < 70400) { + $a[$prefix.'storage'] = $c->getArrayCopy(); + } + $a += [ + $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST), + $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), + ]; + if ($c instanceof \ArrayObject) { + $a[$prefix.'iteratorClass'] = new ClassStub($c->getIteratorClass()); + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/StubCaster.php b/vendor/symfony/var-dumper/Caster/StubCaster.php new file mode 100644 index 0000000..32ead7c --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/StubCaster.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts a caster's Stub. + * + * @author Nicolas Grekas + * + * @final + */ +class StubCaster +{ + public static function castStub(Stub $c, array $a, Stub $stub, bool $isNested) + { + if ($isNested) { + $stub->type = $c->type; + $stub->class = $c->class; + $stub->value = $c->value; + $stub->handle = $c->handle; + $stub->cut = $c->cut; + $stub->attr = $c->attr; + + if (Stub::TYPE_REF === $c->type && !$c->class && \is_string($c->value) && !preg_match('//u', $c->value)) { + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_BINARY; + } + + $a = []; + } + + return $a; + } + + public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, bool $isNested) + { + return $isNested ? $c->preservedSubset : $a; + } + + public static function cutInternals($obj, array $a, Stub $stub, bool $isNested) + { + if ($isNested) { + $stub->cut += \count($a); + + return []; + } + + return $a; + } + + public static function castEnum(EnumStub $c, array $a, Stub $stub, bool $isNested) + { + if ($isNested) { + $stub->class = $c->dumpKeys ? '' : null; + $stub->handle = 0; + $stub->value = null; + $stub->cut = $c->cut; + $stub->attr = $c->attr; + + $a = []; + + if ($c->value) { + foreach (array_keys($c->value) as $k) { + $keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k; + } + // Preserve references with array_combine() + $a = array_combine($keys, $c->value); + } + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/SymfonyCaster.php b/vendor/symfony/var-dumper/Caster/SymfonyCaster.php new file mode 100644 index 0000000..6b87bde --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/SymfonyCaster.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @final + */ +class SymfonyCaster +{ + private static $requestGetters = [ + 'pathInfo' => 'getPathInfo', + 'requestUri' => 'getRequestUri', + 'baseUrl' => 'getBaseUrl', + 'basePath' => 'getBasePath', + 'method' => 'getMethod', + 'format' => 'getRequestFormat', + ]; + + public static function castRequest(Request $request, array $a, Stub $stub, bool $isNested) + { + $clone = null; + + foreach (self::$requestGetters as $prop => $getter) { + $key = Caster::PREFIX_PROTECTED.$prop; + if (\array_key_exists($key, $a) && null === $a[$key]) { + if (null === $clone) { + $clone = clone $request; + } + $a[Caster::PREFIX_VIRTUAL.$prop] = $clone->{$getter}(); + } + } + + return $a; + } + + public static function castHttpClient($client, array $a, Stub $stub, bool $isNested) + { + $multiKey = sprintf("\0%s\0multi", \get_class($client)); + if (isset($a[$multiKey])) { + $a[$multiKey] = new CutStub($a[$multiKey]); + } + + return $a; + } + + public static function castHttpClientResponse($response, array $a, Stub $stub, bool $isNested) + { + $stub->cut += \count($a); + $a = []; + + foreach ($response->getInfo() as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/TraceStub.php b/vendor/symfony/var-dumper/Caster/TraceStub.php new file mode 100644 index 0000000..5eea1c8 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/TraceStub.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a backtrace as returned by debug_backtrace() or Exception->getTrace(). + * + * @author Nicolas Grekas + */ +class TraceStub extends Stub +{ + public $keepArgs; + public $sliceOffset; + public $sliceLength; + public $numberingOffset; + + public function __construct(array $trace, bool $keepArgs = true, int $sliceOffset = 0, int $sliceLength = null, int $numberingOffset = 0) + { + $this->value = $trace; + $this->keepArgs = $keepArgs; + $this->sliceOffset = $sliceOffset; + $this->sliceLength = $sliceLength; + $this->numberingOffset = $numberingOffset; + } +} diff --git a/vendor/symfony/var-dumper/Caster/UuidCaster.php b/vendor/symfony/var-dumper/Caster/UuidCaster.php new file mode 100644 index 0000000..b102774 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/UuidCaster.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Ramsey\Uuid\UuidInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Grégoire Pineau + */ +final class UuidCaster +{ + public static function castRamseyUuid(UuidInterface $c, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'uuid' => (string) $c, + ]; + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php new file mode 100644 index 0000000..1bca357 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts XmlReader class to array representation. + * + * @author Baptiste Clavié + * + * @final + */ +class XmlReaderCaster +{ + private static $nodeTypes = [ + \XMLReader::NONE => 'NONE', + \XMLReader::ELEMENT => 'ELEMENT', + \XMLReader::ATTRIBUTE => 'ATTRIBUTE', + \XMLReader::TEXT => 'TEXT', + \XMLReader::CDATA => 'CDATA', + \XMLReader::ENTITY_REF => 'ENTITY_REF', + \XMLReader::ENTITY => 'ENTITY', + \XMLReader::PI => 'PI (Processing Instruction)', + \XMLReader::COMMENT => 'COMMENT', + \XMLReader::DOC => 'DOC', + \XMLReader::DOC_TYPE => 'DOC_TYPE', + \XMLReader::DOC_FRAGMENT => 'DOC_FRAGMENT', + \XMLReader::NOTATION => 'NOTATION', + \XMLReader::WHITESPACE => 'WHITESPACE', + \XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE', + \XMLReader::END_ELEMENT => 'END_ELEMENT', + \XMLReader::END_ENTITY => 'END_ENTITY', + \XMLReader::XML_DECLARATION => 'XML_DECLARATION', + ]; + + public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, bool $isNested) + { + $props = Caster::PREFIX_VIRTUAL.'parserProperties'; + $info = [ + 'localName' => $reader->localName, + 'prefix' => $reader->prefix, + 'nodeType' => new ConstStub(self::$nodeTypes[$reader->nodeType], $reader->nodeType), + 'depth' => $reader->depth, + 'isDefault' => $reader->isDefault, + 'isEmptyElement' => \XMLReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement, + 'xmlLang' => $reader->xmlLang, + 'attributeCount' => $reader->attributeCount, + 'value' => $reader->value, + 'namespaceURI' => $reader->namespaceURI, + 'baseURI' => $reader->baseURI ? new LinkStub($reader->baseURI) : $reader->baseURI, + $props => [ + 'LOADDTD' => $reader->getParserProperty(\XMLReader::LOADDTD), + 'DEFAULTATTRS' => $reader->getParserProperty(\XMLReader::DEFAULTATTRS), + 'VALIDATE' => $reader->getParserProperty(\XMLReader::VALIDATE), + 'SUBST_ENTITIES' => $reader->getParserProperty(\XMLReader::SUBST_ENTITIES), + ], + ]; + + if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, [], $count)) { + $info[$props] = new EnumStub($info[$props]); + $info[$props]->cut = $count; + } + + $info = Caster::filter($info, Caster::EXCLUDE_EMPTY, [], $count); + // +2 because hasValue and hasAttributes are always filtered + $stub->cut += $count + 2; + + return $a + $info; + } +} diff --git a/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php b/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php new file mode 100644 index 0000000..edece30 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts XML resources to array representation. + * + * @author Nicolas Grekas + * + * @final + */ +class XmlResourceCaster +{ + private static $xmlErrors = [ + XML_ERROR_NONE => 'XML_ERROR_NONE', + XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY', + XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX', + XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS', + XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN', + XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN', + XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR', + XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH', + XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE', + XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT', + XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF', + XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY', + XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF', + XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY', + XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF', + XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF', + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF', + XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI', + XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING', + XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING', + XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION', + XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING', + ]; + + public static function castXml($h, array $a, Stub $stub, bool $isNested) + { + $a['current_byte_index'] = xml_get_current_byte_index($h); + $a['current_column_number'] = xml_get_current_column_number($h); + $a['current_line_number'] = xml_get_current_line_number($h); + $a['error_code'] = xml_get_error_code($h); + + if (isset(self::$xmlErrors[$a['error_code']])) { + $a['error_code'] = new ConstStub(self::$xmlErrors[$a['error_code']], $a['error_code']); + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php new file mode 100644 index 0000000..ee36e9f --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php @@ -0,0 +1,374 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Exception\ThrowingCasterException; + +/** + * AbstractCloner implements a generic caster mechanism for objects and resources. + * + * @author Nicolas Grekas + */ +abstract class AbstractCloner implements ClonerInterface +{ + public static $defaultCasters = [ + '__PHP_Incomplete_Class' => ['Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'], + + 'Symfony\Component\VarDumper\Caster\CutStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], + 'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'], + 'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], + 'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'], + + 'Closure' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'], + 'Generator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'], + 'ReflectionType' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'], + 'ReflectionGenerator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'], + 'ReflectionClass' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'], + 'ReflectionFunctionAbstract' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'], + 'ReflectionMethod' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'], + 'ReflectionParameter' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'], + 'ReflectionProperty' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'], + 'ReflectionReference' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReference'], + 'ReflectionExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'], + 'ReflectionZendExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'], + + 'Doctrine\Common\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Doctrine\Common\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'], + 'Doctrine\ORM\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'], + 'Doctrine\ORM\PersistentCollection' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'], + 'Doctrine\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + + 'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'], + 'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'], + 'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'], + 'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNameSpaceNode'], + 'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'], + 'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMCharacterData' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'], + 'DOMAttr' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'], + 'DOMElement' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'], + 'DOMText' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'], + 'DOMTypeinfo' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castTypeinfo'], + 'DOMDomError' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDomError'], + 'DOMLocator' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLocator'], + 'DOMDocumentType' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'], + 'DOMNotation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'], + 'DOMEntity' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'], + 'DOMProcessingInstruction' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'], + 'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXPath'], + + 'XMLReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'], + + 'ErrorException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'], + 'Exception' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'], + 'Error' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'], + 'Symfony\Bridge\Monolog\Logger' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\EventDispatcher\EventDispatcherInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\HttpClient\CurlHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], + 'Symfony\Component\HttpClient\NativeHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], + 'Symfony\Component\HttpClient\Response\CurlResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpClient\Response\NativeResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'], + 'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'], + 'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'], + 'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'], + 'Symfony\Component\VarDumper\Cloner\AbstractCloner' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\ErrorHandler\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'], + + 'Imagine\Image\ImageInterface' => ['Symfony\Component\VarDumper\Caster\ImagineCaster', 'castImage'], + + 'Ramsey\Uuid\UuidInterface' => ['Symfony\Component\VarDumper\Caster\UuidCaster', 'castRamseyUuid'], + + 'ProxyManager\Proxy\ProxyInterface' => ['Symfony\Component\VarDumper\Caster\ProxyManagerCaster', 'castProxy'], + 'PHPUnit_Framework_MockObject_MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'PHPUnit\Framework\MockObject\MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'PHPUnit\Framework\MockObject\Stub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Prophecy\Prophecy\ProphecySubjectInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Mockery\MockInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + + 'PDO' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'], + 'PDOStatement' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'], + + 'AMQPConnection' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'], + 'AMQPChannel' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'], + 'AMQPQueue' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'], + 'AMQPExchange' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'], + 'AMQPEnvelope' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'], + + 'ArrayObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'], + 'ArrayIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayIterator'], + 'SplDoublyLinkedList' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'], + 'SplFileInfo' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'], + 'SplFileObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'], + 'SplHeap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], + 'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'], + 'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], + 'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'], + 'WeakReference' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakReference'], + + 'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], + 'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'], + 'RedisCluster' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisCluster'], + + 'DateTimeInterface' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'], + 'DateInterval' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'], + 'DateTimeZone' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castTimeZone'], + 'DatePeriod' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castPeriod'], + + 'GMP' => ['Symfony\Component\VarDumper\Caster\GmpCaster', 'castGmp'], + + 'MessageFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castMessageFormatter'], + 'NumberFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castNumberFormatter'], + 'IntlTimeZone' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlTimeZone'], + 'IntlCalendar' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlCalendar'], + 'IntlDateFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlDateFormatter'], + + 'Memcached' => ['Symfony\Component\VarDumper\Caster\MemcachedCaster', 'castMemcached'], + + 'Ds\Collection' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castCollection'], + 'Ds\Map' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castMap'], + 'Ds\Pair' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPair'], + 'Symfony\Component\VarDumper\Caster\DsPairStub' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPairStub'], + + 'CurlHandle' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], + ':curl' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], + + ':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + ':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + ':gd' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castGd'], + ':mysql link' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castMysqlLink'], + ':pgsql large object' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'], + ':pgsql link' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], + ':pgsql link persistent' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], + ':pgsql result' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'], + ':process' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'], + ':stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], + ':OpenSSL X.509' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castOpensslX509'], + ':persistent stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], + ':stream-context' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'], + ':xml' => ['Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'], + + 'RdKafka' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castRdKafka'], + 'RdKafka\Conf' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castConf'], + 'RdKafka\KafkaConsumer' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castKafkaConsumer'], + 'RdKafka\Metadata\Broker' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castBrokerMetadata'], + 'RdKafka\Metadata\Collection' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castCollectionMetadata'], + 'RdKafka\Metadata\Partition' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castPartitionMetadata'], + 'RdKafka\Metadata\Topic' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicMetadata'], + 'RdKafka\Message' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castMessage'], + 'RdKafka\Topic' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopic'], + 'RdKafka\TopicPartition' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicPartition'], + 'RdKafka\TopicConf' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicConf'], + ]; + + protected $maxItems = 2500; + protected $maxString = -1; + protected $minDepth = 1; + + private $casters = []; + private $prevErrorHandler; + private $classInfo = []; + private $filter = 0; + + /** + * @param callable[]|null $casters A map of casters + * + * @see addCasters + */ + public function __construct(array $casters = null) + { + if (null === $casters) { + $casters = static::$defaultCasters; + } + $this->addCasters($casters); + } + + /** + * Adds casters for resources and objects. + * + * Maps resources or objects types to a callback. + * Types are in the key, with a callable caster for value. + * Resource types are to be prefixed with a `:`, + * see e.g. static::$defaultCasters. + * + * @param callable[] $casters A map of casters + */ + public function addCasters(array $casters) + { + foreach ($casters as $type => $callback) { + $this->casters[$type][] = $callback; + } + } + + /** + * Sets the maximum number of items to clone past the minimum depth in nested structures. + */ + public function setMaxItems(int $maxItems) + { + $this->maxItems = $maxItems; + } + + /** + * Sets the maximum cloned length for strings. + */ + public function setMaxString(int $maxString) + { + $this->maxString = $maxString; + } + + /** + * Sets the minimum tree depth where we are guaranteed to clone all the items. After this + * depth is reached, only setMaxItems items will be cloned. + */ + public function setMinDepth(int $minDepth) + { + $this->minDepth = $minDepth; + } + + /** + * Clones a PHP variable. + * + * @param mixed $var Any PHP variable + * @param int $filter A bit field of Caster::EXCLUDE_* constants + * + * @return Data The cloned variable represented by a Data object + */ + public function cloneVar($var, int $filter = 0) + { + $this->prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) { + if (E_RECOVERABLE_ERROR === $type || E_USER_ERROR === $type) { + // Cloner never dies + throw new \ErrorException($msg, 0, $type, $file, $line); + } + + if ($this->prevErrorHandler) { + return ($this->prevErrorHandler)($type, $msg, $file, $line, $context); + } + + return false; + }); + $this->filter = $filter; + + if ($gc = gc_enabled()) { + gc_disable(); + } + try { + return new Data($this->doClone($var)); + } finally { + if ($gc) { + gc_enable(); + } + restore_error_handler(); + $this->prevErrorHandler = null; + } + } + + /** + * Effectively clones the PHP variable. + * + * @param mixed $var Any PHP variable + * + * @return array The cloned variable represented in an array + */ + abstract protected function doClone($var); + + /** + * Casts an object to an array representation. + * + * @param bool $isNested True if the object is nested in the dumped structure + * + * @return array The object casted as array + */ + protected function castObject(Stub $stub, bool $isNested) + { + $obj = $stub->value; + $class = $stub->class; + + if (\PHP_VERSION_ID < 80000 ? "\0" === ($class[15] ?? null) : false !== strpos($class, "@anonymous\0")) { + $stub->class = get_debug_type($obj); + } + if (isset($this->classInfo[$class])) { + list($i, $parents, $hasDebugInfo, $fileInfo) = $this->classInfo[$class]; + } else { + $i = 2; + $parents = [$class]; + $hasDebugInfo = method_exists($class, '__debugInfo'); + + foreach (class_parents($class) as $p) { + $parents[] = $p; + ++$i; + } + foreach (class_implements($class) as $p) { + $parents[] = $p; + ++$i; + } + $parents[] = '*'; + + $r = new \ReflectionClass($class); + $fileInfo = $r->isInternal() || $r->isSubclassOf(Stub::class) ? [] : [ + 'file' => $r->getFileName(), + 'line' => $r->getStartLine(), + ]; + + $this->classInfo[$class] = [$i, $parents, $hasDebugInfo, $fileInfo]; + } + + $stub->attr += $fileInfo; + $a = Caster::castObject($obj, $class, $hasDebugInfo, $stub->class); + + try { + while ($i--) { + if (!empty($this->casters[$p = $parents[$i]])) { + foreach ($this->casters[$p] as $callback) { + $a = $callback($obj, $a, $stub, $isNested, $this->filter); + } + } + } + } catch (\Exception $e) { + $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; + } + + return $a; + } + + /** + * Casts a resource to an array representation. + * + * @param bool $isNested True if the object is nested in the dumped structure + * + * @return array The resource casted as array + */ + protected function castResource(Stub $stub, bool $isNested) + { + $a = []; + $res = $stub->value; + $type = $stub->class; + + try { + if (!empty($this->casters[':'.$type])) { + foreach ($this->casters[':'.$type] as $callback) { + $a = $callback($res, $a, $stub, $isNested, $this->filter); + } + } + } catch (\Exception $e) { + $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Cloner/ClonerInterface.php b/vendor/symfony/var-dumper/Cloner/ClonerInterface.php new file mode 100644 index 0000000..7ed287a --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/ClonerInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * @author Nicolas Grekas + */ +interface ClonerInterface +{ + /** + * Clones a PHP variable. + * + * @param mixed $var Any PHP variable + * + * @return Data The cloned variable represented by a Data object + */ + public function cloneVar($var); +} diff --git a/vendor/symfony/var-dumper/Cloner/Cursor.php b/vendor/symfony/var-dumper/Cloner/Cursor.php new file mode 100644 index 0000000..5b0542f --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/Cursor.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * Represents the current state of a dumper while dumping. + * + * @author Nicolas Grekas + */ +class Cursor +{ + const HASH_INDEXED = Stub::ARRAY_INDEXED; + const HASH_ASSOC = Stub::ARRAY_ASSOC; + const HASH_OBJECT = Stub::TYPE_OBJECT; + const HASH_RESOURCE = Stub::TYPE_RESOURCE; + + public $depth = 0; + public $refIndex = 0; + public $softRefTo = 0; + public $softRefCount = 0; + public $softRefHandle = 0; + public $hardRefTo = 0; + public $hardRefCount = 0; + public $hardRefHandle = 0; + public $hashType; + public $hashKey; + public $hashKeyIsBinary; + public $hashIndex = 0; + public $hashLength = 0; + public $hashCut = 0; + public $stop = false; + public $attr = []; + public $skipChildren = false; +} diff --git a/vendor/symfony/var-dumper/Cloner/Data.php b/vendor/symfony/var-dumper/Cloner/Data.php new file mode 100644 index 0000000..e4a5887 --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/Data.php @@ -0,0 +1,451 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; + +/** + * @author Nicolas Grekas + */ +class Data implements \ArrayAccess, \Countable, \IteratorAggregate +{ + private $data; + private $position = 0; + private $key = 0; + private $maxDepth = 20; + private $maxItemsPerDepth = -1; + private $useRefHandles = -1; + private $context = []; + + /** + * @param array $data An array as returned by ClonerInterface::cloneVar() + */ + public function __construct(array $data) + { + $this->data = $data; + } + + /** + * @return string|null The type of the value + */ + public function getType() + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!$item instanceof Stub) { + return \gettype($item); + } + if (Stub::TYPE_STRING === $item->type) { + return 'string'; + } + if (Stub::TYPE_ARRAY === $item->type) { + return 'array'; + } + if (Stub::TYPE_OBJECT === $item->type) { + return $item->class; + } + if (Stub::TYPE_RESOURCE === $item->type) { + return $item->class.' resource'; + } + + return null; + } + + /** + * @param array|bool $recursive Whether values should be resolved recursively or not + * + * @return string|int|float|bool|array|Data[]|null A native representation of the original value + */ + public function getValue($recursive = false) + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!($item = $this->getStub($item)) instanceof Stub) { + return $item; + } + if (Stub::TYPE_STRING === $item->type) { + return $item->value; + } + + $children = $item->position ? $this->data[$item->position] : []; + + foreach ($children as $k => $v) { + if ($recursive && !($v = $this->getStub($v)) instanceof Stub) { + continue; + } + $children[$k] = clone $this; + $children[$k]->key = $k; + $children[$k]->position = $item->position; + + if ($recursive) { + if (Stub::TYPE_REF === $v->type && ($v = $this->getStub($v->value)) instanceof Stub) { + $recursive = (array) $recursive; + if (isset($recursive[$v->position])) { + continue; + } + $recursive[$v->position] = true; + } + $children[$k] = $children[$k]->getValue($recursive); + } + } + + return $children; + } + + /** + * @return int + */ + public function count() + { + return \count($this->getValue()); + } + + /** + * @return \Traversable + */ + public function getIterator() + { + if (!\is_array($value = $this->getValue())) { + throw new \LogicException(sprintf('"%s" object holds non-iterable type "%s".', self::class, get_debug_type($value))); + } + + yield from $value; + } + + public function __get(string $key) + { + if (null !== $data = $this->seek($key)) { + $item = $this->getStub($data->data[$data->position][$data->key]); + + return $item instanceof Stub || [] === $item ? $data : $item; + } + + return null; + } + + /** + * @return bool + */ + public function __isset(string $key) + { + return null !== $this->seek($key); + } + + /** + * @return bool + */ + public function offsetExists($key) + { + return $this->__isset($key); + } + + public function offsetGet($key) + { + return $this->__get($key); + } + + public function offsetSet($key, $value) + { + throw new \BadMethodCallException(self::class.' objects are immutable.'); + } + + public function offsetUnset($key) + { + throw new \BadMethodCallException(self::class.' objects are immutable.'); + } + + /** + * @return string + */ + public function __toString() + { + $value = $this->getValue(); + + if (!\is_array($value)) { + return (string) $value; + } + + return sprintf('%s (count=%d)', $this->getType(), \count($value)); + } + + /** + * Returns a depth limited clone of $this. + * + * @return static + */ + public function withMaxDepth(int $maxDepth) + { + $data = clone $this; + $data->maxDepth = (int) $maxDepth; + + return $data; + } + + /** + * Limits the number of elements per depth level. + * + * @return static + */ + public function withMaxItemsPerDepth(int $maxItemsPerDepth) + { + $data = clone $this; + $data->maxItemsPerDepth = (int) $maxItemsPerDepth; + + return $data; + } + + /** + * Enables/disables objects' identifiers tracking. + * + * @param bool $useRefHandles False to hide global ref. handles + * + * @return static + */ + public function withRefHandles(bool $useRefHandles) + { + $data = clone $this; + $data->useRefHandles = $useRefHandles ? -1 : 0; + + return $data; + } + + /** + * @return static + */ + public function withContext(array $context) + { + $data = clone $this; + $data->context = $context; + + return $data; + } + + /** + * Seeks to a specific key in nested data structures. + * + * @param string|int $key The key to seek to + * + * @return static|null Null if the key is not set + */ + public function seek($key) + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!($item = $this->getStub($item)) instanceof Stub || !$item->position) { + return null; + } + $keys = [$key]; + + switch ($item->type) { + case Stub::TYPE_OBJECT: + $keys[] = Caster::PREFIX_DYNAMIC.$key; + $keys[] = Caster::PREFIX_PROTECTED.$key; + $keys[] = Caster::PREFIX_VIRTUAL.$key; + $keys[] = "\0$item->class\0$key"; + // no break + case Stub::TYPE_ARRAY: + case Stub::TYPE_RESOURCE: + break; + default: + return null; + } + + $data = null; + $children = $this->data[$item->position]; + + foreach ($keys as $key) { + if (isset($children[$key]) || \array_key_exists($key, $children)) { + $data = clone $this; + $data->key = $key; + $data->position = $item->position; + break; + } + } + + return $data; + } + + /** + * Dumps data with a DumperInterface dumper. + */ + public function dump(DumperInterface $dumper) + { + $refs = [0]; + $cursor = new Cursor(); + + if ($cursor->attr = $this->context[SourceContextProvider::class] ?? []) { + $cursor->attr['if_links'] = true; + $cursor->hashType = -1; + $dumper->dumpScalar($cursor, 'default', '^'); + $cursor->attr = ['if_links' => true]; + $dumper->dumpScalar($cursor, 'default', ' '); + $cursor->hashType = 0; + } + + $this->dumpItem($dumper, $cursor, $refs, $this->data[$this->position][$this->key]); + } + + /** + * Depth-first dumping of items. + * + * @param mixed $item A Stub object or the original value being dumped + */ + private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, $item) + { + $cursor->refIndex = 0; + $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0; + $cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0; + $firstSeen = true; + + if (!$item instanceof Stub) { + $cursor->attr = []; + $type = \gettype($item); + if ($item && 'array' === $type) { + $item = $this->getStub($item); + } + } elseif (Stub::TYPE_REF === $item->type) { + if ($item->handle) { + if (!isset($refs[$r = $item->handle - (PHP_INT_MAX >> 1)])) { + $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; + } else { + $firstSeen = false; + } + $cursor->hardRefTo = $refs[$r]; + $cursor->hardRefHandle = $this->useRefHandles & $item->handle; + $cursor->hardRefCount = $item->refCount; + } + $cursor->attr = $item->attr; + $type = $item->class ?: \gettype($item->value); + $item = $this->getStub($item->value); + } + if ($item instanceof Stub) { + if ($item->refCount) { + if (!isset($refs[$r = $item->handle])) { + $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; + } else { + $firstSeen = false; + } + $cursor->softRefTo = $refs[$r]; + } + $cursor->softRefHandle = $this->useRefHandles & $item->handle; + $cursor->softRefCount = $item->refCount; + $cursor->attr = $item->attr; + $cut = $item->cut; + + if ($item->position && $firstSeen) { + $children = $this->data[$item->position]; + + if ($cursor->stop) { + if ($cut >= 0) { + $cut += \count($children); + } + $children = []; + } + } else { + $children = []; + } + switch ($item->type) { + case Stub::TYPE_STRING: + $dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut); + break; + + case Stub::TYPE_ARRAY: + $item = clone $item; + $item->type = $item->class; + $item->class = $item->value; + // no break + case Stub::TYPE_OBJECT: + case Stub::TYPE_RESOURCE: + $withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth; + $dumper->enterHash($cursor, $item->type, $item->class, $withChildren); + if ($withChildren) { + if ($cursor->skipChildren) { + $withChildren = false; + $cut = -1; + } else { + $cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type, null !== $item->class); + } + } elseif ($children && 0 <= $cut) { + $cut += \count($children); + } + $cursor->skipChildren = false; + $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut); + break; + + default: + throw new \RuntimeException(sprintf('Unexpected Stub type: "%s".', $item->type)); + } + } elseif ('array' === $type) { + $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false); + $dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0); + } elseif ('string' === $type) { + $dumper->dumpString($cursor, $item, false, 0); + } else { + $dumper->dumpScalar($cursor, $type, $item); + } + } + + /** + * Dumps children of hash structures. + * + * @return int The final number of removed items + */ + private function dumpChildren(DumperInterface $dumper, Cursor $parentCursor, array &$refs, array $children, int $hashCut, int $hashType, bool $dumpKeys): int + { + $cursor = clone $parentCursor; + ++$cursor->depth; + $cursor->hashType = $hashType; + $cursor->hashIndex = 0; + $cursor->hashLength = \count($children); + $cursor->hashCut = $hashCut; + foreach ($children as $key => $child) { + $cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key); + $cursor->hashKey = $dumpKeys ? $key : null; + $this->dumpItem($dumper, $cursor, $refs, $child); + if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) { + $parentCursor->stop = true; + + return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut; + } + } + + return $hashCut; + } + + private function getStub($item) + { + if (!$item || !\is_array($item)) { + return $item; + } + + $stub = new Stub(); + $stub->type = Stub::TYPE_ARRAY; + foreach ($item as $stub->class => $stub->position) { + } + if (isset($item[0])) { + $stub->cut = $item[0]; + } + $stub->value = $stub->cut + ($stub->position ? \count($this->data[$stub->position]) : 0); + + return $stub; + } +} diff --git a/vendor/symfony/var-dumper/Cloner/DumperInterface.php b/vendor/symfony/var-dumper/Cloner/DumperInterface.php new file mode 100644 index 0000000..6d60b72 --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/DumperInterface.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * DumperInterface used by Data objects. + * + * @author Nicolas Grekas + */ +interface DumperInterface +{ + /** + * Dumps a scalar value. + * + * @param string $type The PHP type of the value being dumped + * @param string|int|float|bool $value The scalar value being dumped + */ + public function dumpScalar(Cursor $cursor, string $type, $value); + + /** + * Dumps a string. + * + * @param string $str The string being dumped + * @param bool $bin Whether $str is UTF-8 or binary encoded + * @param int $cut The number of characters $str has been cut by + */ + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut); + + /** + * Dumps while entering an hash. + * + * @param int $type A Cursor::HASH_* const for the type of hash + * @param string|int $class The object class, resource type or array count + * @param bool $hasChild When the dump of the hash has child item + */ + public function enterHash(Cursor $cursor, int $type, $class, bool $hasChild); + + /** + * Dumps while leaving an hash. + * + * @param int $type A Cursor::HASH_* const for the type of hash + * @param string|int $class The object class, resource type or array count + * @param bool $hasChild When the dump of the hash has child item + * @param int $cut The number of items the hash has been cut by + */ + public function leaveHash(Cursor $cursor, int $type, $class, bool $hasChild, int $cut); +} diff --git a/vendor/symfony/var-dumper/Cloner/Stub.php b/vendor/symfony/var-dumper/Cloner/Stub.php new file mode 100644 index 0000000..7f6d05d --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/Stub.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * Represents the main properties of a PHP variable. + * + * @author Nicolas Grekas + */ +class Stub +{ + const TYPE_REF = 1; + const TYPE_STRING = 2; + const TYPE_ARRAY = 3; + const TYPE_OBJECT = 4; + const TYPE_RESOURCE = 5; + + const STRING_BINARY = 1; + const STRING_UTF8 = 2; + + const ARRAY_ASSOC = 1; + const ARRAY_INDEXED = 2; + + public $type = self::TYPE_REF; + public $class = ''; + public $value; + public $cut = 0; + public $handle = 0; + public $refCount = 0; + public $position = 0; + public $attr = []; + + private static $defaultProperties = []; + + /** + * @internal + */ + public function __sleep(): array + { + $properties = []; + + if (!isset(self::$defaultProperties[$c = static::class])) { + self::$defaultProperties[$c] = get_class_vars($c); + + foreach ((new \ReflectionClass($c))->getStaticProperties() as $k => $v) { + unset(self::$defaultProperties[$c][$k]); + } + } + + foreach (self::$defaultProperties[$c] as $k => $v) { + if ($this->$k !== $v) { + $properties[] = $k; + } + } + + return $properties; + } +} diff --git a/vendor/symfony/var-dumper/Cloner/VarCloner.php b/vendor/symfony/var-dumper/Cloner/VarCloner.php new file mode 100644 index 0000000..bdbe3c2 --- /dev/null +++ b/vendor/symfony/var-dumper/Cloner/VarCloner.php @@ -0,0 +1,283 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * @author Nicolas Grekas + */ +class VarCloner extends AbstractCloner +{ + private static $gid; + private static $arrayCache = []; + + /** + * {@inheritdoc} + */ + protected function doClone($var) + { + $len = 1; // Length of $queue + $pos = 0; // Number of cloned items past the minimum depth + $refsCounter = 0; // Hard references counter + $queue = [[$var]]; // This breadth-first queue is the return value + $hardRefs = []; // Map of original zval ids to stub objects + $objRefs = []; // Map of original object handles to their stub object counterpart + $objects = []; // Keep a ref to objects to ensure their handle cannot be reused while cloning + $resRefs = []; // Map of original resource handles to their stub object counterpart + $values = []; // Map of stub objects' ids to original values + $maxItems = $this->maxItems; + $maxString = $this->maxString; + $minDepth = $this->minDepth; + $currentDepth = 0; // Current tree depth + $currentDepthFinalIndex = 0; // Final $queue index for current tree depth + $minimumDepthReached = 0 === $minDepth; // Becomes true when minimum tree depth has been reached + $cookie = (object) []; // Unique object used to detect hard references + $a = null; // Array cast for nested structures + $stub = null; // Stub capturing the main properties of an original item value + // or null if the original value is used directly + + if (!$gid = self::$gid) { + $gid = self::$gid = md5(random_bytes(6)); // Unique string used to detect the special $GLOBALS variable + } + $arrayStub = new Stub(); + $arrayStub->type = Stub::TYPE_ARRAY; + $fromObjCast = false; + + for ($i = 0; $i < $len; ++$i) { + // Detect when we move on to the next tree depth + if ($i > $currentDepthFinalIndex) { + ++$currentDepth; + $currentDepthFinalIndex = $len - 1; + if ($currentDepth >= $minDepth) { + $minimumDepthReached = true; + } + } + + $refs = $vals = $queue[$i]; + foreach ($vals as $k => $v) { + // $v is the original value or a stub object in case of hard references + + if (\PHP_VERSION_ID >= 70400) { + $zvalIsRef = null !== \ReflectionReference::fromArrayElement($vals, $k); + } else { + $refs[$k] = $cookie; + $zvalIsRef = $vals[$k] === $cookie; + } + + if ($zvalIsRef) { + $vals[$k] = &$stub; // Break hard references to make $queue completely + unset($stub); // independent from the original structure + if ($v instanceof Stub && isset($hardRefs[spl_object_id($v)])) { + $vals[$k] = $refs[$k] = $v; + if ($v->value instanceof Stub && (Stub::TYPE_OBJECT === $v->value->type || Stub::TYPE_RESOURCE === $v->value->type)) { + ++$v->value->refCount; + } + ++$v->refCount; + continue; + } + $refs[$k] = $vals[$k] = new Stub(); + $refs[$k]->value = $v; + $h = spl_object_id($refs[$k]); + $hardRefs[$h] = &$refs[$k]; + $values[$h] = $v; + $vals[$k]->handle = ++$refsCounter; + } + // Create $stub when the original value $v can not be used directly + // If $v is a nested structure, put that structure in array $a + switch (true) { + case null === $v: + case \is_bool($v): + case \is_int($v): + case \is_float($v): + continue 2; + case \is_string($v): + if ('' === $v) { + continue 2; + } + if (!preg_match('//u', $v)) { + $stub = new Stub(); + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_BINARY; + if (0 <= $maxString && 0 < $cut = \strlen($v) - $maxString) { + $stub->cut = $cut; + $stub->value = substr($v, 0, -$cut); + } else { + $stub->value = $v; + } + } elseif (0 <= $maxString && isset($v[1 + ($maxString >> 2)]) && 0 < $cut = mb_strlen($v, 'UTF-8') - $maxString) { + $stub = new Stub(); + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_UTF8; + $stub->cut = $cut; + $stub->value = mb_substr($v, 0, $maxString, 'UTF-8'); + } else { + continue 2; + } + $a = null; + break; + + case \is_array($v): + if (!$v) { + continue 2; + } + $stub = $arrayStub; + $stub->class = Stub::ARRAY_INDEXED; + + $j = -1; + foreach ($v as $gk => $gv) { + if ($gk !== ++$j) { + $stub->class = Stub::ARRAY_ASSOC; + break; + } + } + $a = $v; + + if (Stub::ARRAY_ASSOC === $stub->class) { + // Copies of $GLOBALS have very strange behavior, + // let's detect them with some black magic + $a[$gid] = true; + + // Happens with copies of $GLOBALS + if (isset($v[$gid])) { + unset($v[$gid]); + $a = []; + foreach ($v as $gk => &$gv) { + $a[$gk] = &$gv; + } + unset($gv); + } else { + $a = $v; + } + } + break; + + case \is_object($v): + case $v instanceof \__PHP_Incomplete_Class: + if (empty($objRefs[$h = spl_object_id($v)])) { + $stub = new Stub(); + $stub->type = Stub::TYPE_OBJECT; + $stub->class = \get_class($v); + $stub->value = $v; + $stub->handle = $h; + $a = $this->castObject($stub, 0 < $i); + if ($v !== $stub->value) { + if (Stub::TYPE_OBJECT !== $stub->type || null === $stub->value) { + break; + } + $stub->handle = $h = spl_object_id($stub->value); + } + $stub->value = null; + if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { + $stub->cut = \count($a); + $a = null; + } + } + if (empty($objRefs[$h])) { + $objRefs[$h] = $stub; + $objects[] = $v; + } else { + $stub = $objRefs[$h]; + ++$stub->refCount; + $a = null; + } + break; + + default: // resource + if (empty($resRefs[$h = (int) $v])) { + $stub = new Stub(); + $stub->type = Stub::TYPE_RESOURCE; + if ('Unknown' === $stub->class = @get_resource_type($v)) { + $stub->class = 'Closed'; + } + $stub->value = $v; + $stub->handle = $h; + $a = $this->castResource($stub, 0 < $i); + $stub->value = null; + if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { + $stub->cut = \count($a); + $a = null; + } + } + if (empty($resRefs[$h])) { + $resRefs[$h] = $stub; + } else { + $stub = $resRefs[$h]; + ++$stub->refCount; + $a = null; + } + break; + } + + if ($a) { + if (!$minimumDepthReached || 0 > $maxItems) { + $queue[$len] = $a; + $stub->position = $len++; + } elseif ($pos < $maxItems) { + if ($maxItems < $pos += \count($a)) { + $a = \array_slice($a, 0, $maxItems - $pos); + if ($stub->cut >= 0) { + $stub->cut += $pos - $maxItems; + } + } + $queue[$len] = $a; + $stub->position = $len++; + } elseif ($stub->cut >= 0) { + $stub->cut += \count($a); + $stub->position = 0; + } + } + + if ($arrayStub === $stub) { + if ($arrayStub->cut) { + $stub = [$arrayStub->cut, $arrayStub->class => $arrayStub->position]; + $arrayStub->cut = 0; + } elseif (isset(self::$arrayCache[$arrayStub->class][$arrayStub->position])) { + $stub = self::$arrayCache[$arrayStub->class][$arrayStub->position]; + } else { + self::$arrayCache[$arrayStub->class][$arrayStub->position] = $stub = [$arrayStub->class => $arrayStub->position]; + } + } + + if ($zvalIsRef) { + $refs[$k]->value = $stub; + } else { + $vals[$k] = $stub; + } + } + + if ($fromObjCast) { + $fromObjCast = false; + $refs = $vals; + $vals = []; + $j = -1; + foreach ($queue[$i] as $k => $v) { + foreach ([$k => true] as $gk => $gv) { + } + if ($gk !== $k) { + $vals = (object) $vals; + $vals->{$k} = $refs[++$j]; + $vals = (array) $vals; + } else { + $vals[$k] = $refs[++$j]; + } + } + } + + $queue[$i] = $vals; + } + + foreach ($values as $h => $v) { + $hardRefs[$h] = $v; + } + + return $queue; + } +} diff --git a/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php b/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php new file mode 100644 index 0000000..dc77d03 --- /dev/null +++ b/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command\Descriptor; + +use Symfony\Component\Console\Formatter\OutputFormatterStyle; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +/** + * Describe collected data clones for cli output. + * + * @author Maxime Steinhausser + * + * @final + */ +class CliDescriptor implements DumpDescriptorInterface +{ + private $dumper; + private $lastIdentifier; + private $supportsHref; + + public function __construct(CliDumper $dumper) + { + $this->dumper = $dumper; + $this->supportsHref = method_exists(OutputFormatterStyle::class, 'setHref'); + } + + public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void + { + $io = $output instanceof SymfonyStyle ? $output : new SymfonyStyle(new ArrayInput([]), $output); + $this->dumper->setColors($output->isDecorated()); + + $rows = [['date', date('r', $context['timestamp'])]]; + $lastIdentifier = $this->lastIdentifier; + $this->lastIdentifier = $clientId; + + $section = "Received from client #$clientId"; + if (isset($context['request'])) { + $request = $context['request']; + $this->lastIdentifier = $request['identifier']; + $section = sprintf('%s %s', $request['method'], $request['uri']); + if ($controller = $request['controller']) { + $rows[] = ['controller', rtrim($this->dumper->dump($controller, true), "\n")]; + } + } elseif (isset($context['cli'])) { + $this->lastIdentifier = $context['cli']['identifier']; + $section = '$ '.$context['cli']['command_line']; + } + + if ($this->lastIdentifier !== $lastIdentifier) { + $io->section($section); + } + + if (isset($context['source'])) { + $source = $context['source']; + $sourceInfo = sprintf('%s on line %d', $source['name'], $source['line']); + $fileLink = $source['file_link'] ?? null; + if ($this->supportsHref && $fileLink) { + $sourceInfo = sprintf('%s', $fileLink, $sourceInfo); + } + $rows[] = ['source', $sourceInfo]; + $file = $source['file_relative'] ?? $source['file']; + $rows[] = ['file', $file]; + } + + $io->table([], $rows); + + if (!$this->supportsHref && isset($fileLink)) { + $io->writeln(['Open source in your IDE/browser:', $fileLink]); + $io->newLine(); + } + + $this->dumper->dump($data); + $io->newLine(); + } +} diff --git a/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php b/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php new file mode 100644 index 0000000..267d27b --- /dev/null +++ b/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command\Descriptor; + +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * @author Maxime Steinhausser + */ +interface DumpDescriptorInterface +{ + public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void; +} diff --git a/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php b/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php new file mode 100644 index 0000000..35a203b --- /dev/null +++ b/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command\Descriptor; + +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; + +/** + * Describe collected data clones for html output. + * + * @author Maxime Steinhausser + * + * @final + */ +class HtmlDescriptor implements DumpDescriptorInterface +{ + private $dumper; + private $initialized = false; + + public function __construct(HtmlDumper $dumper) + { + $this->dumper = $dumper; + } + + public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void + { + if (!$this->initialized) { + $styles = file_get_contents(__DIR__.'/../../Resources/css/htmlDescriptor.css'); + $scripts = file_get_contents(__DIR__.'/../../Resources/js/htmlDescriptor.js'); + $output->writeln(""); + $this->initialized = true; + } + + $title = '-'; + if (isset($context['request'])) { + $request = $context['request']; + $controller = "{$this->dumper->dump($request['controller'], true, ['maxDepth' => 0])}"; + $title = sprintf('%s %s', $request['method'], $uri = $request['uri'], $uri); + $dedupIdentifier = $request['identifier']; + } elseif (isset($context['cli'])) { + $title = '$ '.$context['cli']['command_line']; + $dedupIdentifier = $context['cli']['identifier']; + } else { + $dedupIdentifier = uniqid('', true); + } + + $sourceDescription = ''; + if (isset($context['source'])) { + $source = $context['source']; + $projectDir = $source['project_dir'] ?? null; + $sourceDescription = sprintf('%s on line %d', $source['name'], $source['line']); + if (isset($source['file_link'])) { + $sourceDescription = sprintf('%s', $source['file_link'], $sourceDescription); + } + } + + $isoDate = $this->extractDate($context, 'c'); + $tags = array_filter([ + 'controller' => $controller ?? null, + 'project dir' => $projectDir ?? null, + ]); + + $output->writeln(<< +
    +
    +

    $title

    + +
    + {$this->renderTags($tags)} +
    +
    +

    + $sourceDescription +

    + {$this->dumper->dump($data, true)} +
    + +HTML + ); + } + + private function extractDate(array $context, string $format = 'r'): string + { + return date($format, $context['timestamp']); + } + + private function renderTags(array $tags): string + { + if (!$tags) { + return ''; + } + + $renderedTags = ''; + foreach ($tags as $key => $value) { + $renderedTags .= sprintf('
    +

    About the XML namespace

    + +
    +

    + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. +

    +

    + See + http://www.w3.org/XML/1998/namespace.html and + + http://www.w3.org/TR/REC-xml for information + about this namespace. +

    + +

    + Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance. +

    +

    + See further below in this document for more information about how to refer to this schema document from your own + XSD schema documents and about the + namespace-versioning policy governing this schema document. +

    +
    +
  • %s%s
  • ', $key, $value); + } + + return << +
      + $renderedTags +
    + +HTML; + } +} diff --git a/vendor/symfony/var-dumper/Command/ServerDumpCommand.php b/vendor/symfony/var-dumper/Command/ServerDumpCommand.php new file mode 100644 index 0000000..c8a61da --- /dev/null +++ b/vendor/symfony/var-dumper/Command/ServerDumpCommand.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Command\Descriptor\CliDescriptor; +use Symfony\Component\VarDumper\Command\Descriptor\DumpDescriptorInterface; +use Symfony\Component\VarDumper\Command\Descriptor\HtmlDescriptor; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Server\DumpServer; + +/** + * Starts a dump server to collect and output dumps on a single place with multiple formats support. + * + * @author Maxime Steinhausser + * + * @final + */ +class ServerDumpCommand extends Command +{ + protected static $defaultName = 'server:dump'; + + private $server; + + /** @var DumpDescriptorInterface[] */ + private $descriptors; + + public function __construct(DumpServer $server, array $descriptors = []) + { + $this->server = $server; + $this->descriptors = $descriptors + [ + 'cli' => new CliDescriptor(new CliDumper()), + 'html' => new HtmlDescriptor(new HtmlDumper()), + ]; + + parent::__construct(); + } + + protected function configure() + { + $availableFormats = implode(', ', array_keys($this->descriptors)); + + $this + ->addOption('format', null, InputOption::VALUE_REQUIRED, sprintf('The output format (%s)', $availableFormats), 'cli') + ->setDescription('Starts a dump server that collects and displays dumps in a single place') + ->setHelp(<<<'EOF' +%command.name% starts a dump server that collects and displays +dumps in a single place for debugging you application: + + php %command.full_name% + +You can consult dumped data in HTML format in your browser by providing the --format=html option +and redirecting the output to a file: + + php %command.full_name% --format="html" > dump.html + +EOF + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $format = $input->getOption('format'); + + if (!$descriptor = $this->descriptors[$format] ?? null) { + throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $format)); + } + + $errorIo = $io->getErrorStyle(); + $errorIo->title('Symfony Var Dumper Server'); + + $this->server->start(); + + $errorIo->success(sprintf('Server listening on %s', $this->server->getHost())); + $errorIo->comment('Quit the server with CONTROL-C.'); + + $this->server->listen(function (Data $data, array $context, int $clientId) use ($descriptor, $io) { + $descriptor->describe($io, $data, $context, $clientId); + }); + } +} diff --git a/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/vendor/symfony/var-dumper/Dumper/AbstractDumper.php new file mode 100644 index 0000000..1a00038 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/AbstractDumper.php @@ -0,0 +1,204 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\DumperInterface; + +/** + * Abstract mechanism for dumping a Data object. + * + * @author Nicolas Grekas + */ +abstract class AbstractDumper implements DataDumperInterface, DumperInterface +{ + const DUMP_LIGHT_ARRAY = 1; + const DUMP_STRING_LENGTH = 2; + const DUMP_COMMA_SEPARATOR = 4; + const DUMP_TRAILING_COMMA = 8; + + public static $defaultOutput = 'php://output'; + + protected $line = ''; + protected $lineDumper; + protected $outputStream; + protected $decimalPoint; // This is locale dependent + protected $indentPad = ' '; + protected $flags; + + private $charset = ''; + + /** + * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path, defaults to static::$defaultOutput + * @param string|null $charset The default character encoding to use for non-UTF8 strings + * @param int $flags A bit field of static::DUMP_* constants to fine tune dumps representation + */ + public function __construct($output = null, string $charset = null, int $flags = 0) + { + $this->flags = $flags; + $this->setCharset($charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8'); + $this->decimalPoint = localeconv(); + $this->decimalPoint = $this->decimalPoint['decimal_point']; + $this->setOutput($output ?: static::$defaultOutput); + if (!$output && \is_string(static::$defaultOutput)) { + static::$defaultOutput = $this->outputStream; + } + } + + /** + * Sets the output destination of the dumps. + * + * @param callable|resource|string $output A line dumper callable, an opened stream or an output path + * + * @return callable|resource|string The previous output destination + */ + public function setOutput($output) + { + $prev = null !== $this->outputStream ? $this->outputStream : $this->lineDumper; + + if (\is_callable($output)) { + $this->outputStream = null; + $this->lineDumper = $output; + } else { + if (\is_string($output)) { + $output = fopen($output, 'wb'); + } + $this->outputStream = $output; + $this->lineDumper = [$this, 'echoLine']; + } + + return $prev; + } + + /** + * Sets the default character encoding to use for non-UTF8 strings. + * + * @return string The previous charset + */ + public function setCharset(string $charset) + { + $prev = $this->charset; + + $charset = strtoupper($charset); + $charset = null === $charset || 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset; + + $this->charset = $charset; + + return $prev; + } + + /** + * Sets the indentation pad string. + * + * @param string $pad A string that will be prepended to dumped lines, repeated by nesting level + * + * @return string The previous indent pad + */ + public function setIndentPad(string $pad) + { + $prev = $this->indentPad; + $this->indentPad = $pad; + + return $prev; + } + + /** + * Dumps a Data object. + * + * @param callable|resource|string|true|null $output A line dumper callable, an opened stream, an output path or true to return the dump + * + * @return string|null The dump as string when $output is true + */ + public function dump(Data $data, $output = null) + { + $this->decimalPoint = localeconv(); + $this->decimalPoint = $this->decimalPoint['decimal_point']; + + if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(LC_NUMERIC, 0) : null) { + setlocale(LC_NUMERIC, 'C'); + } + + if ($returnDump = true === $output) { + $output = fopen('php://memory', 'r+b'); + } + if ($output) { + $prevOutput = $this->setOutput($output); + } + try { + $data->dump($this); + $this->dumpLine(-1); + + if ($returnDump) { + $result = stream_get_contents($output, -1, 0); + fclose($output); + + return $result; + } + } finally { + if ($output) { + $this->setOutput($prevOutput); + } + if ($locale) { + setlocale(LC_NUMERIC, $locale); + } + } + + return null; + } + + /** + * Dumps the current line. + * + * @param int $depth The recursive depth in the dumped structure for the line being dumped, + * or -1 to signal the end-of-dump to the line dumper callable + */ + protected function dumpLine(int $depth) + { + ($this->lineDumper)($this->line, $depth, $this->indentPad); + $this->line = ''; + } + + /** + * Generic line dumper callback. + */ + protected function echoLine(string $line, int $depth, string $indentPad) + { + if (-1 !== $depth) { + fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n"); + } + } + + /** + * Converts a non-UTF-8 string to UTF-8. + * + * @return string|null The string converted to UTF-8 + */ + protected function utf8Encode(?string $s) + { + if (null === $s || preg_match('//u', $s)) { + return $s; + } + + if (!\function_exists('iconv')) { + throw new \RuntimeException('Unable to convert a non-UTF-8 string to UTF-8: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.'); + } + + if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) { + return $c; + } + if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) { + return $c; + } + + return iconv('CP850', 'UTF-8', $s); + } +} diff --git a/vendor/symfony/var-dumper/Dumper/CliDumper.php b/vendor/symfony/var-dumper/Dumper/CliDumper.php new file mode 100644 index 0000000..14c0088 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/CliDumper.php @@ -0,0 +1,640 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Cursor; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * CliDumper dumps variables for command line output. + * + * @author Nicolas Grekas + */ +class CliDumper extends AbstractDumper +{ + public static $defaultColors; + public static $defaultOutput = 'php://stdout'; + + protected $colors; + protected $maxStringWidth = 0; + protected $styles = [ + // See http://en.wikipedia.org/wiki/ANSI_escape_code#graphics + 'default' => '0;38;5;208', + 'num' => '1;38;5;38', + 'const' => '1;38;5;208', + 'str' => '1;38;5;113', + 'note' => '38;5;38', + 'ref' => '38;5;247', + 'public' => '', + 'protected' => '', + 'private' => '', + 'meta' => '38;5;170', + 'key' => '38;5;113', + 'index' => '38;5;38', + ]; + + protected static $controlCharsRx = '/[\x00-\x1F\x7F]+/'; + protected static $controlCharsMap = [ + "\t" => '\t', + "\n" => '\n', + "\v" => '\v', + "\f" => '\f', + "\r" => '\r', + "\033" => '\e', + ]; + + protected $collapseNextHash = false; + protected $expandNextHash = false; + + private $displayOptions = [ + 'fileLinkFormat' => null, + ]; + + private $handlesHrefGracefully; + + /** + * {@inheritdoc} + */ + public function __construct($output = null, string $charset = null, int $flags = 0) + { + parent::__construct($output, $charset, $flags); + + if ('\\' === \DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) { + // Use only the base 16 xterm colors when using ANSICON or standard Windows 10 CLI + $this->setStyles([ + 'default' => '31', + 'num' => '1;34', + 'const' => '1;31', + 'str' => '1;32', + 'note' => '34', + 'ref' => '1;30', + 'meta' => '35', + 'key' => '32', + 'index' => '34', + ]); + } + + $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f#L%l'; + } + + /** + * Enables/disables colored output. + */ + public function setColors(bool $colors) + { + $this->colors = $colors; + } + + /** + * Sets the maximum number of characters per line for dumped strings. + */ + public function setMaxStringWidth(int $maxStringWidth) + { + $this->maxStringWidth = $maxStringWidth; + } + + /** + * Configures styles. + * + * @param array $styles A map of style names to style definitions + */ + public function setStyles(array $styles) + { + $this->styles = $styles + $this->styles; + } + + /** + * Configures display options. + * + * @param array $displayOptions A map of display options to customize the behavior + */ + public function setDisplayOptions(array $displayOptions) + { + $this->displayOptions = $displayOptions + $this->displayOptions; + } + + /** + * {@inheritdoc} + */ + public function dumpScalar(Cursor $cursor, string $type, $value) + { + $this->dumpKey($cursor); + + $style = 'const'; + $attr = $cursor->attr; + + switch ($type) { + case 'default': + $style = 'default'; + break; + + case 'integer': + $style = 'num'; + break; + + case 'double': + $style = 'num'; + + switch (true) { + case INF === $value: $value = 'INF'; break; + case -INF === $value: $value = '-INF'; break; + case is_nan($value): $value = 'NAN'; break; + default: + $value = (string) $value; + if (false === strpos($value, $this->decimalPoint)) { + $value .= $this->decimalPoint.'0'; + } + break; + } + break; + + case 'NULL': + $value = 'null'; + break; + + case 'boolean': + $value = $value ? 'true' : 'false'; + break; + + default: + $attr += ['value' => $this->utf8Encode($value)]; + $value = $this->utf8Encode($type); + break; + } + + $this->line .= $this->style($style, $value, $attr); + + $this->endValue($cursor); + } + + /** + * {@inheritdoc} + */ + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) + { + $this->dumpKey($cursor); + $attr = $cursor->attr; + + if ($bin) { + $str = $this->utf8Encode($str); + } + if ('' === $str) { + $this->line .= '""'; + $this->endValue($cursor); + } else { + $attr += [ + 'length' => 0 <= $cut ? mb_strlen($str, 'UTF-8') + $cut : 0, + 'binary' => $bin, + ]; + $str = $bin && false !== strpos($str, "\0") ? [$str] : explode("\n", $str); + if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) { + unset($str[1]); + $str[0] .= "\n"; + } + $m = \count($str) - 1; + $i = $lineCut = 0; + + if (self::DUMP_STRING_LENGTH & $this->flags) { + $this->line .= '('.$attr['length'].') '; + } + if ($bin) { + $this->line .= 'b'; + } + + if ($m) { + $this->line .= '"""'; + $this->dumpLine($cursor->depth); + } else { + $this->line .= '"'; + } + + foreach ($str as $str) { + if ($i < $m) { + $str .= "\n"; + } + if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = mb_strlen($str, 'UTF-8')) { + $str = mb_substr($str, 0, $this->maxStringWidth, 'UTF-8'); + $lineCut = $len - $this->maxStringWidth; + } + if ($m && 0 < $cursor->depth) { + $this->line .= $this->indentPad; + } + if ('' !== $str) { + $this->line .= $this->style('str', $str, $attr); + } + if ($i++ == $m) { + if ($m) { + if ('' !== $str) { + $this->dumpLine($cursor->depth); + if (0 < $cursor->depth) { + $this->line .= $this->indentPad; + } + } + $this->line .= '"""'; + } else { + $this->line .= '"'; + } + if ($cut < 0) { + $this->line .= '…'; + $lineCut = 0; + } elseif ($cut) { + $lineCut += $cut; + } + } + if ($lineCut) { + $this->line .= '…'.$lineCut; + $lineCut = 0; + } + + if ($i > $m) { + $this->endValue($cursor); + } else { + $this->dumpLine($cursor->depth); + } + } + } + } + + /** + * {@inheritdoc} + */ + public function enterHash(Cursor $cursor, int $type, $class, bool $hasChild) + { + if (null === $this->colors) { + $this->colors = $this->supportsColors(); + } + + $this->dumpKey($cursor); + $attr = $cursor->attr; + + if ($this->collapseNextHash) { + $cursor->skipChildren = true; + $this->collapseNextHash = $hasChild = false; + } + + $class = $this->utf8Encode($class); + if (Cursor::HASH_OBJECT === $type) { + $prefix = $class && 'stdClass' !== $class ? $this->style('note', $class, $attr).(empty($attr['cut_hash']) ? ' {' : '') : '{'; + } elseif (Cursor::HASH_RESOURCE === $type) { + $prefix = $this->style('note', $class.' resource', $attr).($hasChild ? ' {' : ' '); + } else { + $prefix = $class && !(self::DUMP_LIGHT_ARRAY & $this->flags) ? $this->style('note', 'array:'.$class).' [' : '['; + } + + if (($cursor->softRefCount || 0 < $cursor->softRefHandle) && empty($attr['cut_hash'])) { + $prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), ['count' => $cursor->softRefCount]); + } elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) { + $prefix .= $this->style('ref', '&'.$cursor->hardRefTo, ['count' => $cursor->hardRefCount]); + } elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) { + $prefix = substr($prefix, 0, -1); + } + + $this->line .= $prefix; + + if ($hasChild) { + $this->dumpLine($cursor->depth); + } + } + + /** + * {@inheritdoc} + */ + public function leaveHash(Cursor $cursor, int $type, $class, bool $hasChild, int $cut) + { + if (empty($cursor->attr['cut_hash'])) { + $this->dumpEllipsis($cursor, $hasChild, $cut); + $this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : '')); + } + + $this->endValue($cursor); + } + + /** + * Dumps an ellipsis for cut children. + * + * @param bool $hasChild When the dump of the hash has child item + * @param int $cut The number of items the hash has been cut by + */ + protected function dumpEllipsis(Cursor $cursor, $hasChild, $cut) + { + if ($cut) { + $this->line .= ' …'; + if (0 < $cut) { + $this->line .= $cut; + } + if ($hasChild) { + $this->dumpLine($cursor->depth + 1); + } + } + } + + /** + * Dumps a key in a hash structure. + */ + protected function dumpKey(Cursor $cursor) + { + if (null !== $key = $cursor->hashKey) { + if ($cursor->hashKeyIsBinary) { + $key = $this->utf8Encode($key); + } + $attr = ['binary' => $cursor->hashKeyIsBinary]; + $bin = $cursor->hashKeyIsBinary ? 'b' : ''; + $style = 'key'; + switch ($cursor->hashType) { + default: + case Cursor::HASH_INDEXED: + if (self::DUMP_LIGHT_ARRAY & $this->flags) { + break; + } + $style = 'index'; + // no break + case Cursor::HASH_ASSOC: + if (\is_int($key)) { + $this->line .= $this->style($style, $key).' => '; + } else { + $this->line .= $bin.'"'.$this->style($style, $key).'" => '; + } + break; + + case Cursor::HASH_RESOURCE: + $key = "\0~\0".$key; + // no break + case Cursor::HASH_OBJECT: + if (!isset($key[0]) || "\0" !== $key[0]) { + $this->line .= '+'.$bin.$this->style('public', $key).': '; + } elseif (0 < strpos($key, "\0", 1)) { + $key = explode("\0", substr($key, 1), 2); + + switch ($key[0][0]) { + case '+': // User inserted keys + $attr['dynamic'] = true; + $this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": '; + break 2; + case '~': + $style = 'meta'; + if (isset($key[0][1])) { + parse_str(substr($key[0], 1), $attr); + $attr += ['binary' => $cursor->hashKeyIsBinary]; + } + break; + case '*': + $style = 'protected'; + $bin = '#'.$bin; + break; + default: + $attr['class'] = $key[0]; + $style = 'private'; + $bin = '-'.$bin; + break; + } + + if (isset($attr['collapse'])) { + if ($attr['collapse']) { + $this->collapseNextHash = true; + } else { + $this->expandNextHash = true; + } + } + + $this->line .= $bin.$this->style($style, $key[1], $attr).(isset($attr['separator']) ? $attr['separator'] : ': '); + } else { + // This case should not happen + $this->line .= '-'.$bin.'"'.$this->style('private', $key, ['class' => '']).'": '; + } + break; + } + + if ($cursor->hardRefTo) { + $this->line .= $this->style('ref', '&'.($cursor->hardRefCount ? $cursor->hardRefTo : ''), ['count' => $cursor->hardRefCount]).' '; + } + } + } + + /** + * Decorates a value with some style. + * + * @param string $style The type of style being applied + * @param string $value The value being styled + * @param array $attr Optional context information + * + * @return string The value with style decoration + */ + protected function style($style, $value, $attr = []) + { + if (null === $this->colors) { + $this->colors = $this->supportsColors(); + } + + if (null === $this->handlesHrefGracefully) { + $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') && !getenv('KONSOLE_VERSION'); + } + + if (isset($attr['ellipsis'], $attr['ellipsis-type'])) { + $prefix = substr($value, 0, -$attr['ellipsis']); + if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && 0 === strpos($prefix, $_SERVER[$pwd])) { + $prefix = '.'.substr($prefix, \strlen($_SERVER[$pwd])); + } + if (!empty($attr['ellipsis-tail'])) { + $prefix .= substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']); + $value = substr($value, -$attr['ellipsis'] + $attr['ellipsis-tail']); + } else { + $value = substr($value, -$attr['ellipsis']); + } + + $value = $this->style('default', $prefix).$this->style($style, $value); + + goto href; + } + + $map = static::$controlCharsMap; + $startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : ''; + $endCchr = $this->colors ? "\033[m\033[{$this->styles[$style]}m" : ''; + $value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) { + $s = $startCchr; + $c = $c[$i = 0]; + do { + $s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', \ord($c[$i])); + } while (isset($c[++$i])); + + return $s.$endCchr; + }, $value, -1, $cchrCount); + + if ($this->colors) { + if ($cchrCount && "\033" === $value[0]) { + $value = substr($value, \strlen($startCchr)); + } else { + $value = "\033[{$this->styles[$style]}m".$value; + } + if ($cchrCount && $endCchr === substr($value, -\strlen($endCchr))) { + $value = substr($value, 0, -\strlen($endCchr)); + } else { + $value .= "\033[{$this->styles['default']}m"; + } + } + + href: + if ($this->colors && $this->handlesHrefGracefully) { + if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) { + if ('note' === $style) { + $value .= "\033]8;;{$href}\033\\^\033]8;;\033\\"; + } else { + $attr['href'] = $href; + } + } + if (isset($attr['href'])) { + $value = "\033]8;;{$attr['href']}\033\\{$value}\033]8;;\033\\"; + } + } elseif ($attr['if_links'] ?? false) { + return ''; + } + + return $value; + } + + /** + * @return bool Tells if the current output stream supports ANSI colors or not + */ + protected function supportsColors() + { + if ($this->outputStream !== static::$defaultOutput) { + return $this->hasColorSupport($this->outputStream); + } + if (null !== static::$defaultColors) { + return static::$defaultColors; + } + if (isset($_SERVER['argv'][1])) { + $colors = $_SERVER['argv']; + $i = \count($colors); + while (--$i > 0) { + if (isset($colors[$i][5])) { + switch ($colors[$i]) { + case '--ansi': + case '--color': + case '--color=yes': + case '--color=force': + case '--color=always': + return static::$defaultColors = true; + + case '--no-ansi': + case '--color=no': + case '--color=none': + case '--color=never': + return static::$defaultColors = false; + } + } + } + } + + $h = stream_get_meta_data($this->outputStream) + ['wrapper_type' => null]; + $h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream; + + return static::$defaultColors = $this->hasColorSupport($h); + } + + /** + * {@inheritdoc} + */ + protected function dumpLine(int $depth, bool $endOfValue = false) + { + if ($this->colors) { + $this->line = sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line); + } + parent::dumpLine($depth); + } + + protected function endValue(Cursor $cursor) + { + if (-1 === $cursor->hashType) { + return; + } + + if (Stub::ARRAY_INDEXED === $cursor->hashType || Stub::ARRAY_ASSOC === $cursor->hashType) { + if (self::DUMP_TRAILING_COMMA & $this->flags && 0 < $cursor->depth) { + $this->line .= ','; + } elseif (self::DUMP_COMMA_SEPARATOR & $this->flags && 1 < $cursor->hashLength - $cursor->hashIndex) { + $this->line .= ','; + } + } + + $this->dumpLine($cursor->depth, true); + } + + /** + * Returns true if the stream supports colorization. + * + * Reference: Composer\XdebugHandler\Process::supportsColor + * https://github.com/composer/xdebug-handler + * + * @param mixed $stream A CLI output stream + */ + private function hasColorSupport($stream): bool + { + if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { + return false; + } + + // Follow https://no-color.org/ + if (isset($_SERVER['NO_COLOR']) || false !== getenv('NO_COLOR')) { + return false; + } + + if ('Hyper' === getenv('TERM_PROGRAM')) { + return true; + } + + if (\DIRECTORY_SEPARATOR === '\\') { + return (\function_exists('sapi_windows_vt100_support') + && @sapi_windows_vt100_support($stream)) + || false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM'); + } + + return stream_isatty($stream); + } + + /** + * Returns true if the Windows terminal supports true color. + * + * Note that this does not check an output stream, but relies on environment + * variables from known implementations, or a PHP and Windows version that + * supports true color. + */ + private function isWindowsTrueColor(): bool + { + $result = 183 <= getenv('ANSICON_VER') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM') + || 'Hyper' === getenv('TERM_PROGRAM'); + + if (!$result) { + $version = sprintf( + '%s.%s.%s', + PHP_WINDOWS_VERSION_MAJOR, + PHP_WINDOWS_VERSION_MINOR, + PHP_WINDOWS_VERSION_BUILD + ); + $result = $version >= '10.0.15063'; + } + + return $result; + } + + private function getSourceLink(string $file, int $line) + { + if ($fmt = $this->displayOptions['fileLinkFormat']) { + return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : ($fmt->format($file, $line) ?: 'file://'.$file.'#L'.$line); + } + + return false; + } +} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php new file mode 100644 index 0000000..38f8789 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +/** + * Tries to provide context on CLI. + * + * @author Maxime Steinhausser + */ +final class CliContextProvider implements ContextProviderInterface +{ + public function getContext(): ?array + { + if ('cli' !== \PHP_SAPI) { + return null; + } + + return [ + 'command_line' => $commandLine = implode(' ', $_SERVER['argv'] ?? []), + 'identifier' => hash('crc32b', $commandLine.$_SERVER['REQUEST_TIME_FLOAT']), + ]; + } +} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php new file mode 100644 index 0000000..38ef3b0 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +/** + * Interface to provide contextual data about dump data clones sent to a server. + * + * @author Maxime Steinhausser + */ +interface ContextProviderInterface +{ + /** + * @return array|null Context data or null if unable to provide any context + */ + public function getContext(): ?array; +} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php new file mode 100644 index 0000000..3684a47 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\VarDumper\Caster\ReflectionCaster; +use Symfony\Component\VarDumper\Cloner\VarCloner; + +/** + * Tries to provide context from a request. + * + * @author Maxime Steinhausser + */ +final class RequestContextProvider implements ContextProviderInterface +{ + private $requestStack; + private $cloner; + + public function __construct(RequestStack $requestStack) + { + $this->requestStack = $requestStack; + $this->cloner = new VarCloner(); + $this->cloner->setMaxItems(0); + $this->cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); + } + + public function getContext(): ?array + { + if (null === $request = $this->requestStack->getCurrentRequest()) { + return null; + } + + $controller = $request->attributes->get('_controller'); + + return [ + 'uri' => $request->getUri(), + 'method' => $request->getMethod(), + 'controller' => $controller ? $this->cloner->cloneVar($controller) : $controller, + 'identifier' => spl_object_hash($request), + ]; + } +} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php new file mode 100644 index 0000000..6f4caba --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +use Symfony\Component\HttpKernel\Debug\FileLinkFormatter; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\VarDumper; +use Twig\Template; + +/** + * Tries to provide context from sources (class name, file, line, code excerpt, ...). + * + * @author Nicolas Grekas + * @author Maxime Steinhausser + */ +final class SourceContextProvider implements ContextProviderInterface +{ + private $limit; + private $charset; + private $projectDir; + private $fileLinkFormatter; + + public function __construct(string $charset = null, string $projectDir = null, FileLinkFormatter $fileLinkFormatter = null, int $limit = 9) + { + $this->charset = $charset; + $this->projectDir = $projectDir; + $this->fileLinkFormatter = $fileLinkFormatter; + $this->limit = $limit; + } + + public function getContext(): ?array + { + $trace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS, $this->limit); + + $file = $trace[1]['file']; + $line = $trace[1]['line']; + $name = false; + $fileExcerpt = false; + + for ($i = 2; $i < $this->limit; ++$i) { + if (isset($trace[$i]['class'], $trace[$i]['function']) + && 'dump' === $trace[$i]['function'] + && VarDumper::class === $trace[$i]['class'] + ) { + $file = $trace[$i]['file'] ?? $file; + $line = $trace[$i]['line'] ?? $line; + + while (++$i < $this->limit) { + if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos($trace[$i]['function'], 'call_user_func')) { + $file = $trace[$i]['file']; + $line = $trace[$i]['line']; + + break; + } elseif (isset($trace[$i]['object']) && $trace[$i]['object'] instanceof Template) { + $template = $trace[$i]['object']; + $name = $template->getTemplateName(); + $src = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : false); + $info = $template->getDebugInfo(); + if (isset($info[$trace[$i - 1]['line']])) { + $line = $info[$trace[$i - 1]['line']]; + $file = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getPath() : null; + + if ($src) { + $src = explode("\n", $src); + $fileExcerpt = []; + + for ($i = max($line - 3, 1), $max = min($line + 3, \count($src)); $i <= $max; ++$i) { + $fileExcerpt[] = ''.$this->htmlEncode($src[$i - 1]).''; + } + + $fileExcerpt = '
      '.implode("\n", $fileExcerpt).'
    '; + } + } + break; + } + } + break; + } + } + + if (false === $name) { + $name = str_replace('\\', '/', $file); + $name = substr($name, strrpos($name, '/') + 1); + } + + $context = ['name' => $name, 'file' => $file, 'line' => $line]; + $context['file_excerpt'] = $fileExcerpt; + + if (null !== $this->projectDir) { + $context['project_dir'] = $this->projectDir; + if (0 === strpos($file, $this->projectDir)) { + $context['file_relative'] = ltrim(substr($file, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR); + } + } + + if ($this->fileLinkFormatter && $fileLink = $this->fileLinkFormatter->format($context['file'], $context['line'])) { + $context['file_link'] = $fileLink; + } + + return $context; + } + + private function htmlEncode(string $s): string + { + $html = ''; + + $dumper = new HtmlDumper(function ($line) use (&$html) { $html .= $line; }, $this->charset); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + + $cloner = new VarCloner(); + $dumper->dump($cloner->cloneVar($s)); + + return substr(strip_tags($html), 1, -1); + } +} diff --git a/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php b/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php new file mode 100644 index 0000000..7638417 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; + +/** + * @author Kévin Thérage + */ +class ContextualizedDumper implements DataDumperInterface +{ + private $wrappedDumper; + private $contextProviders; + + /** + * @param ContextProviderInterface[] $contextProviders + */ + public function __construct(DataDumperInterface $wrappedDumper, array $contextProviders) + { + $this->wrappedDumper = $wrappedDumper; + $this->contextProviders = $contextProviders; + } + + public function dump(Data $data) + { + $context = []; + foreach ($this->contextProviders as $contextProvider) { + $context[\get_class($contextProvider)] = $contextProvider->getContext(); + } + + $this->wrappedDumper->dump($data->withContext($context)); + } +} diff --git a/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php b/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php new file mode 100644 index 0000000..b173bcc --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * DataDumperInterface for dumping Data objects. + * + * @author Nicolas Grekas + */ +interface DataDumperInterface +{ + public function dump(Data $data); +} diff --git a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php new file mode 100644 index 0000000..c234b48 --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -0,0 +1,1004 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Cursor; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * HtmlDumper dumps variables as HTML. + * + * @author Nicolas Grekas + */ +class HtmlDumper extends CliDumper +{ + public static $defaultOutput = 'php://output'; + + protected static $themes = [ + 'dark' => [ + 'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'str' => 'font-weight:bold; color:#56DB3A', + 'note' => 'color:#1299DA', + 'ref' => 'color:#A0A0A0', + 'public' => 'color:#FFFFFF', + 'protected' => 'color:#FFFFFF', + 'private' => 'color:#FFFFFF', + 'meta' => 'color:#B729D9', + 'key' => 'color:#56DB3A', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#FF8400', + 'ns' => 'user-select:none;', + ], + 'light' => [ + 'default' => 'background:none; color:#CC7832; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'str' => 'font-weight:bold; color:#629755;', + 'note' => 'color:#6897BB', + 'ref' => 'color:#6E6E6E', + 'public' => 'color:#262626', + 'protected' => 'color:#262626', + 'private' => 'color:#262626', + 'meta' => 'color:#B729D9', + 'key' => 'color:#789339', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#CC7832', + 'ns' => 'user-select:none;', + ], + ]; + + protected $dumpHeader; + protected $dumpPrefix = '
    ';
    +    protected $dumpSuffix = '
    '; + protected $dumpId = 'sf-dump'; + protected $colors = true; + protected $headerIsDumped = false; + protected $lastDepth = -1; + protected $styles; + + private $displayOptions = [ + 'maxDepth' => 1, + 'maxStringLength' => 160, + 'fileLinkFormat' => null, + ]; + private $extraDisplayOptions = []; + + /** + * {@inheritdoc} + */ + public function __construct($output = null, string $charset = null, int $flags = 0) + { + AbstractDumper::__construct($output, $charset, $flags); + $this->dumpId = 'sf-dump-'.mt_rand(); + $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); + $this->styles = static::$themes['dark'] ?? self::$themes['dark']; + } + + /** + * {@inheritdoc} + */ + public function setStyles(array $styles) + { + $this->headerIsDumped = false; + $this->styles = $styles + $this->styles; + } + + public function setTheme(string $themeName) + { + if (!isset(static::$themes[$themeName])) { + throw new \InvalidArgumentException(sprintf('Theme "%s" does not exist in class "%s".', $themeName, static::class)); + } + + $this->setStyles(static::$themes[$themeName]); + } + + /** + * Configures display options. + * + * @param array $displayOptions A map of display options to customize the behavior + */ + public function setDisplayOptions(array $displayOptions) + { + $this->headerIsDumped = false; + $this->displayOptions = $displayOptions + $this->displayOptions; + } + + /** + * Sets an HTML header that will be dumped once in the output stream. + * + * @param string $header An HTML string + */ + public function setDumpHeader($header) + { + $this->dumpHeader = $header; + } + + /** + * Sets an HTML prefix and suffix that will encapse every single dump. + * + * @param string $prefix The prepended HTML string + * @param string $suffix The appended HTML string + */ + public function setDumpBoundaries($prefix, $suffix) + { + $this->dumpPrefix = $prefix; + $this->dumpSuffix = $suffix; + } + + /** + * {@inheritdoc} + */ + public function dump(Data $data, $output = null, array $extraDisplayOptions = []) + { + $this->extraDisplayOptions = $extraDisplayOptions; + $result = parent::dump($data, $output); + $this->dumpId = 'sf-dump-'.mt_rand(); + + return $result; + } + + /** + * Dumps the HTML header. + */ + protected function getDumpHeader() + { + $this->headerIsDumped = null !== $this->outputStream ? $this->outputStream : $this->lineDumper; + + if (null !== $this->dumpHeader) { + return $this->dumpHeader; + } + + $line = str_replace('{$options}', json_encode($this->displayOptions, JSON_FORCE_OBJECT), <<<'EOHTML' +'.$this->dumpHeader; + } + + /** + * {@inheritdoc} + */ + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) + { + if ('' === $str && isset($cursor->attr['img-data'], $cursor->attr['content-type'])) { + $this->dumpKey($cursor); + $this->line .= $this->style('default', $cursor->attr['img-size'] ?? '', []).' '; + $this->endValue($cursor); + $this->line .= $this->indentPad; + $this->line .= sprintf('', $cursor->attr['content-type'], base64_encode($cursor->attr['img-data'])); + $this->endValue($cursor); + } else { + parent::dumpString($cursor, $str, $bin, $cut); + } + } + + /** + * {@inheritdoc} + */ + public function enterHash(Cursor $cursor, int $type, $class, bool $hasChild) + { + if (Cursor::HASH_OBJECT === $type) { + $cursor->attr['depth'] = $cursor->depth; + } + parent::enterHash($cursor, $type, $class, false); + + if ($cursor->skipChildren) { + $cursor->skipChildren = false; + $eol = ' class=sf-dump-compact>'; + } elseif ($this->expandNextHash) { + $this->expandNextHash = false; + $eol = ' class=sf-dump-expanded>'; + } else { + $eol = '>'; + } + + if ($hasChild) { + $this->line .= 'refIndex) { + $r = Cursor::HASH_OBJECT !== $type ? 1 - (Cursor::HASH_RESOURCE !== $type) : 2; + $r .= $r && 0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->refIndex; + + $this->line .= sprintf(' id=%s-ref%s', $this->dumpId, $r); + } + $this->line .= $eol; + $this->dumpLine($cursor->depth); + } + } + + /** + * {@inheritdoc} + */ + public function leaveHash(Cursor $cursor, int $type, $class, bool $hasChild, int $cut) + { + $this->dumpEllipsis($cursor, $hasChild, $cut); + if ($hasChild) { + $this->line .= ''; + } + parent::leaveHash($cursor, $type, $class, $hasChild, 0); + } + + /** + * {@inheritdoc} + */ + protected function style($style, $value, $attr = []) + { + if ('' === $value) { + return ''; + } + + $v = esc($value); + + if ('ref' === $style) { + if (empty($attr['count'])) { + return sprintf('%s', $v); + } + $r = ('#' !== $v[0] ? 1 - ('@' !== $v[0]) : 2).substr($value, 1); + + return sprintf('%s', $this->dumpId, $r, 1 + $attr['count'], $v); + } + + if ('const' === $style && isset($attr['value'])) { + $style .= sprintf(' title="%s"', esc(is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value']))); + } elseif ('public' === $style) { + $style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'); + } elseif ('str' === $style && 1 < $attr['length']) { + $style .= sprintf(' title="%d%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); + } elseif ('note' === $style && 0 < ($attr['depth'] ?? 0) && false !== $c = strrpos($value, '\\')) { + $style .= ' title=""'; + $attr += [ + 'ellipsis' => \strlen($value) - $c, + 'ellipsis-type' => 'note', + 'ellipsis-tail' => 1, + ]; + } elseif ('protected' === $style) { + $style .= ' title="Protected property"'; + } elseif ('meta' === $style && isset($attr['title'])) { + $style .= sprintf(' title="%s"', esc($this->utf8Encode($attr['title']))); + } elseif ('private' === $style) { + $style .= sprintf(' title="Private property defined in class: `%s`"', esc($this->utf8Encode($attr['class']))); + } + $map = static::$controlCharsMap; + + if (isset($attr['ellipsis'])) { + $class = 'sf-dump-ellipsis'; + if (isset($attr['ellipsis-type'])) { + $class = sprintf('"%s sf-dump-ellipsis-%s"', $class, $attr['ellipsis-type']); + } + $label = esc(substr($value, -$attr['ellipsis'])); + $style = str_replace(' title="', " title=\"$v\n", $style); + $v = sprintf('%s', $class, substr($v, 0, -\strlen($label))); + + if (!empty($attr['ellipsis-tail'])) { + $tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']))); + $v .= sprintf('%s%s', $class, substr($label, 0, $tail), substr($label, $tail)); + } else { + $v .= $label; + } + } + + $v = "".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { + $s = $b = ''; + }, $v).''; + + if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) { + $attr['href'] = $href; + } + if (isset($attr['href'])) { + $target = isset($attr['file']) ? '' : ' target="_blank"'; + $v = sprintf('%s', esc($this->utf8Encode($attr['href'])), $target, $v); + } + if (isset($attr['lang'])) { + $v = sprintf('%s', esc($attr['lang']), $v); + } + + return $v; + } + + /** + * {@inheritdoc} + */ + protected function dumpLine(int $depth, bool $endOfValue = false) + { + if (-1 === $this->lastDepth) { + $this->line = sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line; + } + if ($this->headerIsDumped !== (null !== $this->outputStream ? $this->outputStream : $this->lineDumper)) { + $this->line = $this->getDumpHeader().$this->line; + } + + if (-1 === $depth) { + $args = ['"'.$this->dumpId.'"']; + if ($this->extraDisplayOptions) { + $args[] = json_encode($this->extraDisplayOptions, JSON_FORCE_OBJECT); + } + // Replace is for BC + $this->line .= sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args)); + } + $this->lastDepth = $depth; + + $this->line = mb_convert_encoding($this->line, 'HTML-ENTITIES', 'UTF-8'); + + if (-1 === $depth) { + AbstractDumper::dumpLine(0); + } + AbstractDumper::dumpLine($depth); + } + + private function getSourceLink(string $file, int $line) + { + $options = $this->extraDisplayOptions + $this->displayOptions; + + if ($fmt = $options['fileLinkFormat']) { + return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line); + } + + return false; + } +} + +function esc($str) +{ + return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); +} diff --git a/vendor/symfony/var-dumper/Dumper/ServerDumper.php b/vendor/symfony/var-dumper/Dumper/ServerDumper.php new file mode 100644 index 0000000..94795bf --- /dev/null +++ b/vendor/symfony/var-dumper/Dumper/ServerDumper.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; +use Symfony\Component\VarDumper\Server\Connection; + +/** + * ServerDumper forwards serialized Data clones to a server. + * + * @author Maxime Steinhausser + */ +class ServerDumper implements DataDumperInterface +{ + private $connection; + private $wrappedDumper; + + /** + * @param string $host The server host + * @param DataDumperInterface|null $wrappedDumper A wrapped instance used whenever we failed contacting the server + * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name + */ + public function __construct(string $host, DataDumperInterface $wrappedDumper = null, array $contextProviders = []) + { + $this->connection = new Connection($host, $contextProviders); + $this->wrappedDumper = $wrappedDumper; + } + + public function getContextProviders(): array + { + return $this->connection->getContextProviders(); + } + + /** + * {@inheritdoc} + */ + public function dump(Data $data) + { + if (!$this->connection->write($data) && $this->wrappedDumper) { + $this->wrappedDumper->dump($data); + } + } +} diff --git a/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php b/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php new file mode 100644 index 0000000..122f0d3 --- /dev/null +++ b/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Exception; + +/** + * @author Nicolas Grekas + */ +class ThrowingCasterException extends \Exception +{ + /** + * @param \Throwable $prev The exception thrown from the caster + */ + public function __construct(\Throwable $prev) + { + parent::__construct('Unexpected '.\get_class($prev).' thrown from a caster: '.$prev->getMessage(), 0, $prev); + } +} diff --git a/vendor/symfony/var-dumper/LICENSE b/vendor/symfony/var-dumper/LICENSE new file mode 100644 index 0000000..684fbf9 --- /dev/null +++ b/vendor/symfony/var-dumper/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/var-dumper/README.md b/vendor/symfony/var-dumper/README.md new file mode 100644 index 0000000..339f73e --- /dev/null +++ b/vendor/symfony/var-dumper/README.md @@ -0,0 +1,15 @@ +VarDumper Component +=================== + +The VarDumper component provides mechanisms for walking through any arbitrary +PHP variable. It provides a better `dump()` function that you can use instead +of `var_dump`. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/var_dumper/introduction.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/var-dumper/Resources/bin/var-dump-server b/vendor/symfony/var-dumper/Resources/bin/var-dump-server new file mode 100755 index 0000000..98c813a --- /dev/null +++ b/vendor/symfony/var-dumper/Resources/bin/var-dump-server @@ -0,0 +1,63 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Starts a dump server to collect and output dumps on a single place with multiple formats support. + * + * @author Maxime Steinhausser + */ + +use Psr\Log\LoggerInterface; +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Input\ArgvInput; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Logger\ConsoleLogger; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\VarDumper\Command\ServerDumpCommand; +use Symfony\Component\VarDumper\Server\DumpServer; + +function includeIfExists(string $file): bool +{ + return file_exists($file) && include $file; +} + +if ( + !includeIfExists(__DIR__ . '/../../../../autoload.php') && + !includeIfExists(__DIR__ . '/../../vendor/autoload.php') && + !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php') +) { + fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL); + exit(1); +} + +if (!class_exists(Application::class)) { + fwrite(STDERR, 'You need the "symfony/console" component in order to run the VarDumper server.'.PHP_EOL); + exit(1); +} + +$input = new ArgvInput(); +$output = new ConsoleOutput(); +$defaultHost = '127.0.0.1:9912'; +$host = $input->getParameterOption(['--host'], $_SERVER['VAR_DUMPER_SERVER'] ?? $defaultHost, true); +$logger = interface_exists(LoggerInterface::class) ? new ConsoleLogger($output->getErrorOutput()) : null; + +$app = new Application(); + +$app->getDefinition()->addOption( + new InputOption('--host', null, InputOption::VALUE_REQUIRED, 'The address the server should listen to', $defaultHost) +); + +$app->add($command = new ServerDumpCommand(new DumpServer($host, $logger))) + ->getApplication() + ->setDefaultCommand($command->getName(), true) + ->run($input, $output) +; diff --git a/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css b/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css new file mode 100644 index 0000000..8f706d6 --- /dev/null +++ b/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css @@ -0,0 +1,130 @@ +body { + display: flex; + flex-direction: column-reverse; + justify-content: flex-end; + max-width: 1140px; + margin: auto; + padding: 15px; + word-wrap: break-word; + background-color: #F9F9F9; + color: #222; + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.4; +} +p { + margin: 0; +} +a { + color: #218BC3; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +.text-small { + font-size: 12px !important; +} +article { + margin: 5px; + margin-bottom: 10px; +} +article > header > .row { + display: flex; + flex-direction: row; + align-items: baseline; + margin-bottom: 10px; +} +article > header > .row > .col { + flex: 1; + display: flex; + align-items: baseline; +} +article > header > .row > h2 { + font-size: 14px; + color: #222; + font-weight: normal; + font-family: "Lucida Console", monospace, sans-serif; + word-break: break-all; + margin: 20px 5px 0 0; + user-select: all; +} +article > header > .row > h2 > code { + white-space: nowrap; + user-select: none; + color: #cc2255; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + border-radius: 3px; + margin-right: 5px; + padding: 0 3px; +} +article > header > .row > time.col { + flex: 0; + text-align: right; + white-space: nowrap; + color: #999; + font-style: italic; +} +article > header ul.tags { + list-style: none; + padding: 0; + margin: 0; + font-size: 12px; +} +article > header ul.tags > li { + user-select: all; + margin-bottom: 2px; +} +article > header ul.tags > li > span.badge { + display: inline-block; + padding: .25em .4em; + margin-right: 5px; + border-radius: 4px; + background-color: #6c757d3b; + color: #524d4d; + font-size: 12px; + text-align: center; + font-weight: 700; + line-height: 1; + white-space: nowrap; + vertical-align: baseline; + user-select: none; +} +article > section.body { + border: 1px solid #d8d8d8; + background: #FFF; + padding: 10px; + border-radius: 3px; +} +pre.sf-dump { + border-radius: 3px; + margin-bottom: 0; +} +.hidden { + display: none !important; +} +.dumped-tag > .sf-dump { + display: inline-block; + margin: 0; + padding: 1px 5px; + line-height: 1.4; + vertical-align: top; + background-color: transparent; + user-select: auto; +} +.dumped-tag > pre.sf-dump, +.dumped-tag > .sf-dump-default { + color: #CC7832; + background: none; +} +.dumped-tag > .sf-dump .sf-dump-str { color: #629755; } +.dumped-tag > .sf-dump .sf-dump-private, +.dumped-tag > .sf-dump .sf-dump-protected, +.dumped-tag > .sf-dump .sf-dump-public { color: #262626; } +.dumped-tag > .sf-dump .sf-dump-note { color: #6897BB; } +.dumped-tag > .sf-dump .sf-dump-key { color: #789339; } +.dumped-tag > .sf-dump .sf-dump-ref { color: #6E6E6E; } +.dumped-tag > .sf-dump .sf-dump-ellipsis { color: #CC7832; max-width: 100em; } +.dumped-tag > .sf-dump .sf-dump-ellipsis-path { max-width: 5em; } +.dumped-tag > .sf-dump .sf-dump-ns { user-select: none; } diff --git a/vendor/symfony/var-dumper/Resources/functions/dump.php b/vendor/symfony/var-dumper/Resources/functions/dump.php new file mode 100644 index 0000000..a485d57 --- /dev/null +++ b/vendor/symfony/var-dumper/Resources/functions/dump.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\VarDumper\VarDumper; + +if (!function_exists('dump')) { + /** + * @author Nicolas Grekas + */ + function dump($var, ...$moreVars) + { + VarDumper::dump($var); + + foreach ($moreVars as $v) { + VarDumper::dump($v); + } + + if (1 < func_num_args()) { + return func_get_args(); + } + + return $var; + } +} + +if (!function_exists('dd')) { + function dd(...$vars) + { + foreach ($vars as $v) { + VarDumper::dump($v); + } + + exit(1); + } +} diff --git a/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js b/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js new file mode 100644 index 0000000..63101e5 --- /dev/null +++ b/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js @@ -0,0 +1,10 @@ +document.addEventListener('DOMContentLoaded', function() { + let prev = null; + Array.from(document.getElementsByTagName('article')).reverse().forEach(function (article) { + const dedupId = article.dataset.dedupId; + if (dedupId === prev) { + article.getElementsByTagName('header')[0].classList.add('hidden'); + } + prev = dedupId; + }); +}); diff --git a/vendor/symfony/var-dumper/Server/Connection.php b/vendor/symfony/var-dumper/Server/Connection.php new file mode 100644 index 0000000..8b814cb --- /dev/null +++ b/vendor/symfony/var-dumper/Server/Connection.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Server; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; + +/** + * Forwards serialized Data clones to a server. + * + * @author Maxime Steinhausser + */ +class Connection +{ + private $host; + private $contextProviders; + private $socket; + + /** + * @param string $host The server host + * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name + */ + public function __construct(string $host, array $contextProviders = []) + { + if (false === strpos($host, '://')) { + $host = 'tcp://'.$host; + } + + $this->host = $host; + $this->contextProviders = $contextProviders; + } + + public function getContextProviders(): array + { + return $this->contextProviders; + } + + public function write(Data $data): bool + { + $socketIsFresh = !$this->socket; + if (!$this->socket = $this->socket ?: $this->createSocket()) { + return false; + } + + $context = ['timestamp' => microtime(true)]; + foreach ($this->contextProviders as $name => $provider) { + $context[$name] = $provider->getContext(); + } + $context = array_filter($context); + $encodedPayload = base64_encode(serialize([$data, $context]))."\n"; + + set_error_handler([self::class, 'nullErrorHandler']); + try { + if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { + return true; + } + if (!$socketIsFresh) { + stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR); + fclose($this->socket); + $this->socket = $this->createSocket(); + } + if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { + return true; + } + } finally { + restore_error_handler(); + } + + return false; + } + + private static function nullErrorHandler($t, $m) + { + // no-op + } + + private function createSocket() + { + set_error_handler([self::class, 'nullErrorHandler']); + try { + return stream_socket_client($this->host, $errno, $errstr, 3, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT); + } finally { + restore_error_handler(); + } + } +} diff --git a/vendor/symfony/var-dumper/Server/DumpServer.php b/vendor/symfony/var-dumper/Server/DumpServer.php new file mode 100644 index 0000000..3e6343e --- /dev/null +++ b/vendor/symfony/var-dumper/Server/DumpServer.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Server; + +use Psr\Log\LoggerInterface; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * A server collecting Data clones sent by a ServerDumper. + * + * @author Maxime Steinhausser + * + * @final + */ +class DumpServer +{ + private $host; + private $socket; + private $logger; + + public function __construct(string $host, LoggerInterface $logger = null) + { + if (false === strpos($host, '://')) { + $host = 'tcp://'.$host; + } + + $this->host = $host; + $this->logger = $logger; + } + + public function start(): void + { + if (!$this->socket = stream_socket_server($this->host, $errno, $errstr)) { + throw new \RuntimeException(sprintf('Server start failed on "%s": ', $this->host).$errstr.' '.$errno); + } + } + + public function listen(callable $callback): void + { + if (null === $this->socket) { + $this->start(); + } + + foreach ($this->getMessages() as $clientId => $message) { + if ($this->logger) { + $this->logger->info('Received a payload from client {clientId}', ['clientId' => $clientId]); + } + + $payload = @unserialize(base64_decode($message), ['allowed_classes' => [Data::class, Stub::class]]); + + // Impossible to decode the message, give up. + if (false === $payload) { + if ($this->logger) { + $this->logger->warning('Unable to decode a message from {clientId} client.', ['clientId' => $clientId]); + } + + continue; + } + + if (!\is_array($payload) || \count($payload) < 2 || !$payload[0] instanceof Data || !\is_array($payload[1])) { + if ($this->logger) { + $this->logger->warning('Invalid payload from {clientId} client. Expected an array of two elements (Data $data, array $context)', ['clientId' => $clientId]); + } + + continue; + } + + list($data, $context) = $payload; + + $callback($data, $context, $clientId); + } + } + + public function getHost(): string + { + return $this->host; + } + + private function getMessages(): iterable + { + $sockets = [(int) $this->socket => $this->socket]; + $write = []; + + while (true) { + $read = $sockets; + stream_select($read, $write, $write, null); + + foreach ($read as $stream) { + if ($this->socket === $stream) { + $stream = stream_socket_accept($this->socket); + $sockets[(int) $stream] = $stream; + } elseif (feof($stream)) { + unset($sockets[(int) $stream]); + fclose($stream); + } else { + yield (int) $stream => fgets($stream); + } + } + } + } +} diff --git a/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php b/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php new file mode 100644 index 0000000..33d60c0 --- /dev/null +++ b/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Test; + +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +/** + * @author Nicolas Grekas + */ +trait VarDumperTestTrait +{ + /** + * @internal + */ + private $varDumperConfig = [ + 'casters' => [], + 'flags' => null, + ]; + + protected function setUpVarDumper(array $casters, int $flags = null): void + { + $this->varDumperConfig['casters'] = $casters; + $this->varDumperConfig['flags'] = $flags; + } + + /** + * @after + */ + protected function tearDownVarDumper(): void + { + $this->varDumperConfig['casters'] = []; + $this->varDumperConfig['flags'] = null; + } + + public function assertDumpEquals($expected, $data, int $filter = 0, string $message = '') + { + $this->assertSame($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message); + } + + public function assertDumpMatchesFormat($expected, $data, int $filter = 0, string $message = '') + { + $this->assertStringMatchesFormat($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message); + } + + protected function getDump($data, $key = null, int $filter = 0): ?string + { + if (null === $flags = $this->varDumperConfig['flags']) { + $flags = getenv('DUMP_LIGHT_ARRAY') ? CliDumper::DUMP_LIGHT_ARRAY : 0; + $flags |= getenv('DUMP_STRING_LENGTH') ? CliDumper::DUMP_STRING_LENGTH : 0; + $flags |= getenv('DUMP_COMMA_SEPARATOR') ? CliDumper::DUMP_COMMA_SEPARATOR : 0; + } + + $cloner = new VarCloner(); + $cloner->addCasters($this->varDumperConfig['casters']); + $cloner->setMaxItems(-1); + $dumper = new CliDumper(null, null, $flags); + $dumper->setColors(false); + $data = $cloner->cloneVar($data, $filter)->withRefHandles(false); + if (null !== $key && null === $data = $data->seek($key)) { + return null; + } + + return rtrim($dumper->dump($data, true)); + } + + private function prepareExpectation($expected, int $filter): string + { + if (!\is_string($expected)) { + $expected = $this->getDump($expected, null, $filter); + } + + return rtrim($expected); + } +} diff --git a/vendor/symfony/var-dumper/VarDumper.php b/vendor/symfony/var-dumper/VarDumper.php new file mode 100644 index 0000000..febc1e0 --- /dev/null +++ b/vendor/symfony/var-dumper/VarDumper.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper; + +use Symfony\Component\VarDumper\Caster\ReflectionCaster; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextualizedDumper; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; + +// Load the global dump() function +require_once __DIR__.'/Resources/functions/dump.php'; + +/** + * @author Nicolas Grekas + */ +class VarDumper +{ + private static $handler; + + public static function dump($var) + { + if (null === self::$handler) { + $cloner = new VarCloner(); + $cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); + + if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { + $dumper = 'html' === $_SERVER['VAR_DUMPER_FORMAT'] ? new HtmlDumper() : new CliDumper(); + } else { + $dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg']) ? new CliDumper() : new HtmlDumper(); + } + + $dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]); + + self::$handler = function ($var) use ($cloner, $dumper) { + $dumper->dump($cloner->cloneVar($var)); + }; + } + + return (self::$handler)($var); + } + + public static function setHandler(callable $callable = null) + { + $prevHandler = self::$handler; + + // Prevent replacing the handler with expected format as soon as the env var was set: + if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { + return $prevHandler; + } + + self::$handler = $callable; + + return $prevHandler; + } +} diff --git a/vendor/symfony/var-dumper/composer.json b/vendor/symfony/var-dumper/composer.json new file mode 100644 index 0000000..2a61aed --- /dev/null +++ b/vendor/symfony/var-dumper/composer.json @@ -0,0 +1,54 @@ +{ + "name": "symfony/var-dumper", + "type": "library", + "description": "Symfony mechanism for exploring and dumping PHP variables", + "keywords": ["dump", "debug"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "autoload": { + "files": [ "Resources/functions/dump.php" ], + "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + } +} diff --git a/vendor/theseer/tokenizer/.gitignore b/vendor/theseer/tokenizer/.gitignore new file mode 100644 index 0000000..8a6989f --- /dev/null +++ b/vendor/theseer/tokenizer/.gitignore @@ -0,0 +1,8 @@ +/.idea +/.php_cs.cache +/composer.lock +/src/autoload.php +/tools +/vendor +/build +/.phpunit.result.cache diff --git a/vendor/theseer/tokenizer/.php_cs b/vendor/theseer/tokenizer/.php_cs new file mode 100644 index 0000000..159d6a3 --- /dev/null +++ b/vendor/theseer/tokenizer/.php_cs @@ -0,0 +1,67 @@ +files() + ->in('src') + ->in('tests') + ->name('*.php'); + +return Symfony\CS\Config\Config::create() + ->setUsingCache(true) + ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) + ->fixers( + array( + 'align_double_arrow', + 'align_equals', + 'concat_with_spaces', + 'duplicate_semicolon', + 'elseif', + 'empty_return', + 'encoding', + 'eof_ending', + 'extra_empty_lines', + 'function_call_space', + 'function_declaration', + 'indentation', + 'join_function', + 'line_after_namespace', + 'linefeed', + 'list_commas', + 'lowercase_constants', + 'lowercase_keywords', + 'method_argument_space', + 'multiple_use', + 'namespace_no_leading_whitespace', + 'no_blank_lines_after_class_opening', + 'no_empty_lines_after_phpdocs', + 'parenthesis', + 'php_closing_tag', + 'phpdoc_indent', + 'phpdoc_no_access', + 'phpdoc_no_empty_return', + 'phpdoc_no_package', + 'phpdoc_params', + 'phpdoc_scalar', + 'phpdoc_separation', + 'phpdoc_to_comment', + 'phpdoc_trim', + 'phpdoc_types', + 'phpdoc_var_without_name', + 'remove_lines_between_uses', + 'return', + 'self_accessor', + 'short_array_syntax', + 'short_tag', + 'single_line_after_imports', + 'single_quote', + 'spaces_before_semicolon', + 'spaces_cast', + 'ternary_spaces', + 'trailing_spaces', + 'trim_array_spaces', + 'unused_use', + 'visibility', + 'whitespacy_lines' + ) + ) + ->finder($finder); + diff --git a/vendor/theseer/tokenizer/.travis.yml b/vendor/theseer/tokenizer/.travis.yml new file mode 100644 index 0000000..8bf6e98 --- /dev/null +++ b/vendor/theseer/tokenizer/.travis.yml @@ -0,0 +1,34 @@ +os: +- linux + +language: php + +before_install: + - wget https://phar.io/releases/phive.phar + - wget https://phar.io/releases/phive.phar.asc + - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79 + - gpg --verify phive.phar.asc phive.phar + - chmod +x phive.phar + - sudo mv phive.phar /usr/bin/phive + +install: + - ant setup + +script: ./tools/phpunit + +php: + - 7.0 + - 7.1 + - 7.0snapshot + - 7.1snapshot + - 7.2 + - 7.3 + - master + +matrix: + allow_failures: + - php: master + fast_finish: true + +notifications: + email: false diff --git a/vendor/theseer/tokenizer/CHANGELOG.md b/vendor/theseer/tokenizer/CHANGELOG.md new file mode 100644 index 0000000..4bb9817 --- /dev/null +++ b/vendor/theseer/tokenizer/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [1.1.2] - 2019-04-04 + +### Changed + +* Reverted PHPUnit 8 test update to stay PHP 7.0 compliant + + +## [1.1.1] - 2019-04-03 + +### Fixed + +* [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read + +### Changed + +* Tests should now be PHPUnit 8 compliant + + +## [1.1.0] - 2017-04-07 + +### Added + +* Allow use of custom namespace for XML serialization + + +## [1.0.0] - 2017-04-05 + +Initial Release diff --git a/vendor/theseer/tokenizer/LICENSE b/vendor/theseer/tokenizer/LICENSE new file mode 100644 index 0000000..e9694ad --- /dev/null +++ b/vendor/theseer/tokenizer/LICENSE @@ -0,0 +1,30 @@ +Tokenizer + +Copyright (c) 2017 Arne Blankerts and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of Arne Blankerts nor the names of contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/theseer/tokenizer/README.md b/vendor/theseer/tokenizer/README.md new file mode 100644 index 0000000..61ecaff --- /dev/null +++ b/vendor/theseer/tokenizer/README.md @@ -0,0 +1,49 @@ +# Tokenizer + +A small library for converting tokenized PHP source code into XML. + +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) +[![Code Coverage](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) +[![Build Status](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/build.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/build-status/master) + +## Installation + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + + composer require theseer/tokenizer + +If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: + + composer require --dev theseer/tokenizer + +## Usage examples + +```php +$tokenizer = new TheSeer\Tokenizer\Tokenizer(); +$tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php')); + +$serializer = new TheSeer\Tokenizer\XMLSerializer(); +$xml = $serializer->toXML($tokens); + +echo $xml; +``` + +The generated XML structure looks something like this: + +```xml + + + + <?php + declare + ( + strict_types + + = + + 1 + ) + ; + + +``` diff --git a/vendor/theseer/tokenizer/build.xml b/vendor/theseer/tokenizer/build.xml new file mode 100644 index 0000000..4e3694c --- /dev/null +++ b/vendor/theseer/tokenizer/build.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/theseer/tokenizer/composer.json b/vendor/theseer/tokenizer/composer.json new file mode 100644 index 0000000..2870c70 --- /dev/null +++ b/vendor/theseer/tokenizer/composer.json @@ -0,0 +1,27 @@ +{ + "name": "theseer/tokenizer", + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "support": { + "issues": "https://github.com/theseer/tokenizer/issues" + }, + "require": { + "php": "^7.0", + "ext-xmlwriter": "*", + "ext-dom": "*", + "ext-tokenizer": "*" + }, + "autoload": { + "classmap": [ + "src/" + ] + } +} + diff --git a/vendor/theseer/tokenizer/phive.xml b/vendor/theseer/tokenizer/phive.xml new file mode 100644 index 0000000..627de62 --- /dev/null +++ b/vendor/theseer/tokenizer/phive.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/theseer/tokenizer/phpunit.xml b/vendor/theseer/tokenizer/phpunit.xml new file mode 100644 index 0000000..e09d86a --- /dev/null +++ b/vendor/theseer/tokenizer/phpunit.xml @@ -0,0 +1,25 @@ + + + + tests + + + + + src + + + + + + + + diff --git a/vendor/theseer/tokenizer/src/Exception.php b/vendor/theseer/tokenizer/src/Exception.php new file mode 100644 index 0000000..a2dda46 --- /dev/null +++ b/vendor/theseer/tokenizer/src/Exception.php @@ -0,0 +1,6 @@ +ensureValidUri($value); + $this->value = $value; + } + + public function asString(): string { + return $this->value; + } + + private function ensureValidUri($value) { + if (strpos($value, ':') === false) { + throw new NamespaceUriException( + sprintf("Namespace URI '%s' must contain at least one colon", $value) + ); + } + } +} diff --git a/vendor/theseer/tokenizer/src/NamespaceUriException.php b/vendor/theseer/tokenizer/src/NamespaceUriException.php new file mode 100644 index 0000000..39cb803 --- /dev/null +++ b/vendor/theseer/tokenizer/src/NamespaceUriException.php @@ -0,0 +1,6 @@ +line = $line; + $this->name = $name; + $this->value = $value; + } + + /** + * @return int + */ + public function getLine(): int { + return $this->line; + } + + /** + * @return string + */ + public function getName(): string { + return $this->name; + } + + /** + * @return string + */ + public function getValue(): string { + return $this->value; + } + +} diff --git a/vendor/theseer/tokenizer/src/TokenCollection.php b/vendor/theseer/tokenizer/src/TokenCollection.php new file mode 100644 index 0000000..e522d29 --- /dev/null +++ b/vendor/theseer/tokenizer/src/TokenCollection.php @@ -0,0 +1,128 @@ +tokens[] = $token; + } + + /** + * @return Token + */ + public function current(): Token { + return current($this->tokens); + } + + /** + * @return int + */ + public function key(): int { + return key($this->tokens); + } + + /** + * @return void + */ + public function next() { + next($this->tokens); + $this->pos++; + } + + /** + * @return bool + */ + public function valid(): bool { + return $this->count() > $this->pos; + } + + /** + * @return void + */ + public function rewind() { + reset($this->tokens); + $this->pos = 0; + } + + /** + * @return int + */ + public function count(): int { + return count($this->tokens); + } + + /** + * @param mixed $offset + * + * @return bool + */ + public function offsetExists($offset): bool { + return isset($this->tokens[$offset]); + } + + /** + * @param mixed $offset + * + * @return Token + * @throws TokenCollectionException + */ + public function offsetGet($offset): Token { + if (!$this->offsetExists($offset)) { + throw new TokenCollectionException( + sprintf('No Token at offest %s', $offset) + ); + } + + return $this->tokens[$offset]; + } + + /** + * @param mixed $offset + * @param Token $value + * + * @throws TokenCollectionException + */ + public function offsetSet($offset, $value) { + if (!is_int($offset)) { + $type = gettype($offset); + throw new TokenCollectionException( + sprintf( + 'Offset must be of type integer, %s given', + $type === 'object' ? get_class($value) : $type + ) + ); + } + if (!$value instanceof Token) { + $type = gettype($value); + throw new TokenCollectionException( + sprintf( + 'Value must be of type %s, %s given', + Token::class, + $type === 'object' ? get_class($value) : $type + ) + ); + } + $this->tokens[$offset] = $value; + } + + /** + * @param mixed $offset + */ + public function offsetUnset($offset) { + unset($this->tokens[$offset]); + } + +} diff --git a/vendor/theseer/tokenizer/src/TokenCollectionException.php b/vendor/theseer/tokenizer/src/TokenCollectionException.php new file mode 100644 index 0000000..74c7e02 --- /dev/null +++ b/vendor/theseer/tokenizer/src/TokenCollectionException.php @@ -0,0 +1,6 @@ + 'T_OPEN_BRACKET', + ')' => 'T_CLOSE_BRACKET', + '[' => 'T_OPEN_SQUARE', + ']' => 'T_CLOSE_SQUARE', + '{' => 'T_OPEN_CURLY', + '}' => 'T_CLOSE_CURLY', + ';' => 'T_SEMICOLON', + '.' => 'T_DOT', + ',' => 'T_COMMA', + '=' => 'T_EQUAL', + '<' => 'T_LT', + '>' => 'T_GT', + '+' => 'T_PLUS', + '-' => 'T_MINUS', + '*' => 'T_MULT', + '/' => 'T_DIV', + '?' => 'T_QUESTION_MARK', + '!' => 'T_EXCLAMATION_MARK', + ':' => 'T_COLON', + '"' => 'T_DOUBLE_QUOTES', + '@' => 'T_AT', + '&' => 'T_AMPERSAND', + '%' => 'T_PERCENT', + '|' => 'T_PIPE', + '$' => 'T_DOLLAR', + '^' => 'T_CARET', + '~' => 'T_TILDE', + '`' => 'T_BACKTICK' + ]; + + public function parse(string $source): TokenCollection { + $result = new TokenCollection(); + + if ($source === '') { + return $result; + } + + $tokens = token_get_all($source); + + $lastToken = new Token( + $tokens[0][2], + 'Placeholder', + '' + ); + + foreach ($tokens as $pos => $tok) { + if (is_string($tok)) { + $token = new Token( + $lastToken->getLine(), + $this->map[$tok], + $tok + ); + $result->addToken($token); + $lastToken = $token; + continue; + } + + $line = $tok[2]; + $values = preg_split('/\R+/Uu', $tok[1]); + + foreach ($values as $v) { + $token = new Token( + $line, + token_name($tok[0]), + $v + ); + $result->addToken($token); + $line++; + $lastToken = $token; + } + } + + return $result; + } + +} diff --git a/vendor/theseer/tokenizer/src/XMLSerializer.php b/vendor/theseer/tokenizer/src/XMLSerializer.php new file mode 100644 index 0000000..6902bb5 --- /dev/null +++ b/vendor/theseer/tokenizer/src/XMLSerializer.php @@ -0,0 +1,97 @@ +xmlns = $xmlns; + } + + /** + * @param TokenCollection $tokens + * + * @return DOMDocument + */ + public function toDom(TokenCollection $tokens): DOMDocument { + $dom = new DOMDocument(); + $dom->preserveWhiteSpace = false; + $dom->loadXML($this->toXML($tokens)); + + return $dom; + } + + /** + * @param TokenCollection $tokens + * + * @return string + */ + public function toXML(TokenCollection $tokens): string { + $this->writer = new \XMLWriter(); + $this->writer->openMemory(); + $this->writer->setIndent(true); + $this->writer->startDocument(); + $this->writer->startElement('source'); + $this->writer->writeAttribute('xmlns', $this->xmlns->asString()); + + if (count($tokens) > 0) { + $this->writer->startElement('line'); + $this->writer->writeAttribute('no', '1'); + + $this->previousToken = $tokens[0]; + foreach ($tokens as $token) { + $this->addToken($token); + } + } + + $this->writer->endElement(); + $this->writer->endElement(); + $this->writer->endDocument(); + + return $this->writer->outputMemory(); + } + + /** + * @param Token $token + */ + private function addToken(Token $token) { + if ($this->previousToken->getLine() < $token->getLine()) { + $this->writer->endElement(); + + $this->writer->startElement('line'); + $this->writer->writeAttribute('no', (string)$token->getLine()); + $this->previousToken = $token; + } + + if ($token->getValue() !== '') { + $this->writer->startElement('token'); + $this->writer->writeAttribute('name', $token->getName()); + $this->writer->writeRaw(htmlspecialchars($token->getValue(), ENT_NOQUOTES | ENT_DISALLOWED | ENT_XML1)); + $this->writer->endElement(); + } + } +} diff --git a/vendor/theseer/tokenizer/tests/NamespaceUriTest.php b/vendor/theseer/tokenizer/tests/NamespaceUriTest.php new file mode 100644 index 0000000..33b3557 --- /dev/null +++ b/vendor/theseer/tokenizer/tests/NamespaceUriTest.php @@ -0,0 +1,29 @@ +assertInstanceOf( + NamespaceUri::class, + new NamespaceUri('a:b') + ); + } + + public function testInvalidNamespaceThrowsException() { + $this->expectException(NamespaceUriException::class); + new NamespaceUri('invalid-no-colon'); + } + + public function testStringRepresentationCanBeRetrieved() { + $this->assertEquals( + 'a:b', + (new NamespaceUri('a:b'))->asString() + ); + } +} diff --git a/vendor/theseer/tokenizer/tests/TokenCollectionTest.php b/vendor/theseer/tokenizer/tests/TokenCollectionTest.php new file mode 100644 index 0000000..1f3b7d9 --- /dev/null +++ b/vendor/theseer/tokenizer/tests/TokenCollectionTest.php @@ -0,0 +1,72 @@ +collection = new TokenCollection(); + } + + public function testCollectionIsInitiallyEmpty() { + $this->assertCount(0, $this->collection); + } + + public function testTokenCanBeAddedToCollection() { + $token = $this->createMock(Token::class); + $this->collection->addToken($token); + + $this->assertCount(1, $this->collection); + $this->assertSame($token, $this->collection[0]); + } + + public function testCanIterateOverTokens() { + $token = $this->createMock(Token::class); + $this->collection->addToken($token); + $this->collection->addToken($token); + + foreach($this->collection as $position => $current) { + $this->assertInternalType('integer', $position); + $this->assertSame($token, $current); + } + } + + public function testOffsetCanBeUnset() { + $token = $this->createMock(Token::class); + $this->collection->addToken($token); + + $this->assertCount(1, $this->collection); + unset($this->collection[0]); + $this->assertCount(0, $this->collection); + } + + public function testTokenCanBeSetViaOffsetPosition() { + $token = $this->createMock(Token::class); + $this->collection[0] = $token; + $this->assertCount(1, $this->collection); + $this->assertSame($token, $this->collection[0]); + } + + public function testTryingToUseNonIntegerOffsetThrowsException() { + $this->expectException(TokenCollectionException::class); + $this->collection['foo'] = $this->createMock(Token::class); + } + + public function testTryingToSetNonTokenAtOffsetThrowsException() { + $this->expectException(TokenCollectionException::class); + $this->collection[0] = 'abc'; + } + + public function testTryingToGetTokenAtNonExistingOffsetThrowsException() { + $this->expectException(TokenCollectionException::class); + $x = $this->collection[3]; + } + +} diff --git a/vendor/theseer/tokenizer/tests/TokenTest.php b/vendor/theseer/tokenizer/tests/TokenTest.php new file mode 100644 index 0000000..2091d4b --- /dev/null +++ b/vendor/theseer/tokenizer/tests/TokenTest.php @@ -0,0 +1,31 @@ +token = new Token(1,'test-dummy', 'blank'); + } + + public function testTokenCanBeCreated() { + $this->assertInstanceOf(Token::class, $this->token); + } + + public function testTokenLineCanBeRetrieved() { + $this->assertEquals(1, $this->token->getLine()); + } + + public function testTokenNameCanBeRetrieved() { + $this->assertEquals('test-dummy', $this->token->getName()); + } + + public function testTokenValueCanBeRetrieved() { + $this->assertEquals('blank', $this->token->getValue()); + } + +} diff --git a/vendor/theseer/tokenizer/tests/TokenizerTest.php b/vendor/theseer/tokenizer/tests/TokenizerTest.php new file mode 100644 index 0000000..289081b --- /dev/null +++ b/vendor/theseer/tokenizer/tests/TokenizerTest.php @@ -0,0 +1,21 @@ +parse(file_get_contents(__DIR__ . '/_files/test.php')); + + $expected = unserialize( + file_get_contents(__DIR__ . '/_files/test.php.tokens'), + [TokenCollection::class] + ); + $this->assertEquals($expected, $result); + } +} diff --git a/vendor/theseer/tokenizer/tests/XMLSerializerTest.php b/vendor/theseer/tokenizer/tests/XMLSerializerTest.php new file mode 100644 index 0000000..b72d726 --- /dev/null +++ b/vendor/theseer/tokenizer/tests/XMLSerializerTest.php @@ -0,0 +1,50 @@ +tokens = unserialize( + file_get_contents(__DIR__ . '/_files/test.php.tokens'), + [TokenCollection::class] + ); + } + + public function testCanBeSerializedToXml() { + $expected = file_get_contents(__DIR__ . '/_files/test.php.xml'); + + $serializer = new XMLSerializer(); + $this->assertEquals($expected, $serializer->toXML($this->tokens)); + } + + public function testCanBeSerializedToDomDocument() { + $serializer = new XMLSerializer(); + $result = $serializer->toDom($this->tokens); + + $this->assertInstanceOf(\DOMDocument::class, $result); + $this->assertEquals('source', $result->documentElement->localName); + } + + public function testCanBeSerializedToXmlWithCustomNamespace() { + $expected = file_get_contents(__DIR__ . '/_files/customns.xml'); + + $serializer = new XMLSerializer(new NamespaceUri('custom:xml:namespace')); + $this->assertEquals($expected, $serializer->toXML($this->tokens)); + } + + public function testEmptyCollectionCreatesEmptyDocument() { + $expected = file_get_contents(__DIR__ . '/_files/empty.xml'); + + $serializer = new XMLSerializer(); + $this->assertEquals($expected, $serializer->toXML((new TokenCollection()))); + } + +} diff --git a/vendor/theseer/tokenizer/tests/_files/customns.xml b/vendor/theseer/tokenizer/tests/_files/customns.xml new file mode 100644 index 0000000..a707a0a --- /dev/null +++ b/vendor/theseer/tokenizer/tests/_files/customns.xml @@ -0,0 +1,177 @@ + + + + <?php + declare + ( + strict_types + + = + + 1 + ) + ; + + + namespace + + foo + ; + + + + class + + bar + + { + + + + const + + x + + = + + 'abc' + ; + + + + + /** @var int */ + + + + private + + $y + + = + + 1 + ; + + + + + public + + function + + __construct + ( + ) + + { + + + + // do something + + + + } + + + + + public + + function + + getY + ( + ) + : + + int + + { + + + + return + + $this + -> + y + ; + + + + } + + + + + public + + function + + getSomeX + ( + ) + : + + string + + { + + + + return + + self + :: + x + ; + + + + } + + + + + public + + function + + some + ( + bar + + $b + ) + : + + string + + { + + + + return + + $b + -> + getSomeX + ( + ) + + . + + '-def' + ; + + + + } + + + } + + + diff --git a/vendor/theseer/tokenizer/tests/_files/empty.xml b/vendor/theseer/tokenizer/tests/_files/empty.xml new file mode 100644 index 0000000..a525f3a --- /dev/null +++ b/vendor/theseer/tokenizer/tests/_files/empty.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/theseer/tokenizer/tests/_files/test.php b/vendor/theseer/tokenizer/tests/_files/test.php new file mode 100644 index 0000000..0a30193 --- /dev/null +++ b/vendor/theseer/tokenizer/tests/_files/test.php @@ -0,0 +1,25 @@ +y; + } + + public function getSomeX(): string { + return self::x; + } + + public function some(bar $b): string { + return $b->getSomeX() . '-def'; + } +} diff --git a/vendor/theseer/tokenizer/tests/_files/test.php.tokens b/vendor/theseer/tokenizer/tests/_files/test.php.tokens new file mode 100644 index 0000000000000000000000000000000000000000..13f2ba7a4b5e635e6dd0687a12c8904276b28286 GIT binary patch literal 29474 zcmdU&Yi}Yq6o&It5Q>yG(l&T5T!!8zWZKdaCWT?!N|g{HlMPxH5Rj@Z7K ziuTxknNjm8igJ0zIX;hlYz}eYxQw`kgw>z!ZfBVsVwn(e(Ss>b9_{PQL z1AXHr5H)(PaeNi^$4U5e_7#`D@*4fo!(@Ihf36->zx`o#x2jazPuZUM}mlTPQ8H9ZA^J0*Y%FCX&rLD=~%O8EE`Szk$Tw*>HJ#yw01-M&Vk2q&m+ zw(Hq+JKla=r4;Wp>|P1<8AvkzV zmjDbH=SB(GGM)7Lqs#MXpf%D$j&!pGWZ`GA(dos*Xl#;6zLw;zGRSF4Q7VZpyPdcf z_qE2mEvZE*vNTR1nJGH(%3K&XzZu)nuwHFMzh>;~S59 z?i&I0B%9mF^0aEbT`pCK11-sh7WN4R=t@4eag5{%1?Wn*z=Q(yrB@&}P?l_LxdNnZ z&Tz>0B&`f+le1B)Z3pN|HZ@=w=m2HO<~B`#*ORqOe-2QUY-q$_10AW!EvpZm(V+Ji zKfo#9KdSKtI#QF{WG}hP+YZo@{^1iKl`Jasp++2NN;bMmf^mPSQ7p-l;Bv9qDr%r8 z+0=-62{a{}+b9Xrl>A2xHPDi5WWZ3nKu@x{t?D~2(2#6m#7F}r$>w&bW=-XiEQf@B zs;Tum;ngs@(5`4wS~;0qPfuj5yFhKSpTvH*;{vV8$F|<>xIk;x4{yz#>|LNS8;8f< zm%R(rCLcXJ1RGz(9h$9|mr-BC`B_c$?DVwqLd74HJz69&+$%J$smJRk_duT9r)>u&M{NDxaH@Trz$e4!YraPh-q! zY8-!*Q_}+~l#gvZHS_AM2XrW#+iJP!0rklyMg%s{pKNZ+13?ccPByds!q5YHl8$&HBpf&m6W+ga+ z9*f#_&||rumi#!s8U^UtCOJm|4gR4ML-=X zQvStX<4B>*l$`}-AJV6Fq)*xWa(Ql69y+VsEGwJkhje>4Tf9@xfK)5{`iI#wO{@BRyKc0so6AN2-*~ z4%i|!kSb+^o2Qn1t=>Soln)NtA~ldE<V{Ii&`zDLfPO( z%N6<|DrybsNb66z(h@bKM%nC;%9f}hHOgm)l(s|-X;L=4Rc%YukQQY#0}`XCmEuvO zDN4KNtPRrhd9$dMVo}JLm#9&z5|^lz<56Q1?P^@2hE!+)*IQ|VsQV$$H$+4YsZ#a> z$a!j4RjHKpK?It(GnqG2JYV=v8N0r$jWt z19eO!ke!AE8{TNpX`QQHt}T#lhWOC-H7+5L5@nCJ`Q*$Kx&S(qy1Nv5?_UU@Mm698 zWiBCrBGo{*Ujfjxf@z4_>Kr^^@<>Pa9-`Jd2M6D;bO~ewB0jv#=60nnf$T!WCpXWG zdC^5Uz|E)zIjGnr9N>;r1K&8q>Mpl3kD<<&(?oqJQ{Lv-P7EHYL&s8higEdlG4Yqpto5WN#uqzmb&ahh840 zBO4U)*)fOd$RR<#oq$VNsQ{{|`pS-u|&vXzkrxba-g*OACRMpXSf_&V}Mg&Nt*NCO^m z7K7|&q=60y7-WgJz^nBF*~p0c*K;Es5-doc^3egof~@cscC-G8-UgDE!LPjy + + + <?php + declare + ( + strict_types + + = + + 1 + ) + ; + + + namespace + + foo + ; + + + + class + + bar + + { + + + + const + + x + + = + + 'abc' + ; + + + + + /** @var int */ + + + + private + + $y + + = + + 1 + ; + + + + + public + + function + + __construct + ( + ) + + { + + + + // do something + + + + } + + + + + public + + function + + getY + ( + ) + : + + int + + { + + + + return + + $this + -> + y + ; + + + + } + + + + + public + + function + + getSomeX + ( + ) + : + + string + + { + + + + return + + self + :: + x + ; + + + + } + + + + + public + + function + + some + ( + bar + + $b + ) + : + + string + + { + + + + return + + $b + -> + getSomeX + ( + ) + + . + + '-def' + ; + + + + } + + + } + + + diff --git a/vendor/tijsverkoyen/css-to-inline-styles/LICENSE.md b/vendor/tijsverkoyen/css-to-inline-styles/LICENSE.md new file mode 100644 index 0000000..5f40959 --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/LICENSE.md @@ -0,0 +1,23 @@ +Copyright (c) Tijs Verkoyen. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/tijsverkoyen/css-to-inline-styles/composer.json b/vendor/tijsverkoyen/css-to-inline-styles/composer.json new file mode 100644 index 0000000..bb47c01 --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/composer.json @@ -0,0 +1,33 @@ +{ + "name": "tijsverkoyen/css-to-inline-styles", + "type": "library", + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "require": { + "php": "^5.5 || ^7.0", + "ext-dom": "*", + "ext-libxml": "*", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + } +} diff --git a/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php new file mode 100644 index 0000000..0c5ceb1 --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Processor.php @@ -0,0 +1,71 @@ +doCleanup($css); + $rulesProcessor = new RuleProcessor(); + $rules = $rulesProcessor->splitIntoSeparateRules($css); + + return $rulesProcessor->convertArrayToObjects($rules, $existingRules); + } + + /** + * Get the CSS from the style-tags in the given HTML-string + * + * @param string $html + * + * @return string + */ + public function getCssFromStyleTags($html) + { + $css = ''; + $matches = array(); + $htmlNoComments = preg_replace('||s', '', $html); + preg_match_all('|(.*)|isU', $htmlNoComments, $matches); + + if (!empty($matches[1])) { + foreach ($matches[1] as $match) { + $css .= trim($match) . "\n"; + } + } + + return $css; + } + + /** + * @param string $css + * + * @return string + */ + private function doCleanup($css) + { + // remove charset + $css = preg_replace('/@charset "[^"]++";/', '', $css); + // remove media queries + $css = preg_replace('/@media [^{]*+{([^{}]++|{[^{}]*+})*+}/', '', $css); + + $css = str_replace(array("\r", "\n"), '', $css); + $css = str_replace(array("\t"), ' ', $css); + $css = str_replace('"', '\'', $css); + $css = preg_replace('|/\*.*?\*/|', '', $css); + $css = preg_replace('/\s\s++/', ' ', $css); + $css = trim($css); + + return $css; + } +} diff --git a/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php new file mode 100644 index 0000000..3b01861 --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Processor.php @@ -0,0 +1,127 @@ +cleanup($propertiesString); + + $properties = (array) explode(';', $propertiesString); + $keysToRemove = array(); + $numberOfProperties = count($properties); + + for ($i = 0; $i < $numberOfProperties; $i++) { + $properties[$i] = trim($properties[$i]); + + // if the new property begins with base64 it is part of the current property + if (isset($properties[$i + 1]) && strpos(trim($properties[$i + 1]), 'base64,') === 0) { + $properties[$i] .= ';' . trim($properties[$i + 1]); + $keysToRemove[] = $i + 1; + } + } + + if (!empty($keysToRemove)) { + foreach ($keysToRemove as $key) { + unset($properties[$key]); + } + } + + return array_values($properties); + } + + /** + * @param string $string + * + * @return string + */ + private function cleanup($string) + { + $string = str_replace(array("\r", "\n"), '', $string); + $string = str_replace(array("\t"), ' ', $string); + $string = str_replace('"', '\'', $string); + $string = preg_replace('|/\*.*?\*/|', '', $string); + $string = preg_replace('/\s\s+/', ' ', $string); + + $string = trim($string); + $string = rtrim($string, ';'); + + return $string; + } + + /** + * Converts a property-string into an object + * + * @param string $property + * + * @return Property|null + */ + public function convertToObject($property, Specificity $specificity = null) + { + if (strpos($property, ':') === false) { + return null; + } + + list($name, $value) = explode(':', $property, 2); + + $name = trim($name); + $value = trim($value); + + if ($value === '') { + return null; + } + + return new Property($name, $value, $specificity); + } + + /** + * Converts an array of property-strings into objects + * + * @param string[] $properties + * + * @return Property[] + */ + public function convertArrayToObjects(array $properties, Specificity $specificity = null) + { + $objects = array(); + + foreach ($properties as $property) { + $object = $this->convertToObject($property, $specificity); + if ($object === null) { + continue; + } + + $objects[] = $object; + } + + return $objects; + } + + /** + * Build the property-string for multiple properties + * + * @param Property[] $properties + * + * @return string + */ + public function buildPropertiesString(array $properties) + { + $chunks = array(); + + foreach ($properties as $property) { + $chunks[] = $property->toString(); + } + + return implode(' ', $chunks); + } +} diff --git a/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php new file mode 100644 index 0000000..c8970cf --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Property/Property.php @@ -0,0 +1,90 @@ +name = $name; + $this->value = $value; + $this->originalSpecificity = $specificity; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Get originalSpecificity + * + * @return Specificity + */ + public function getOriginalSpecificity() + { + return $this->originalSpecificity; + } + + /** + * Is this property important? + * + * @return bool + */ + public function isImportant() + { + return (stripos($this->value, '!important') !== false); + } + + /** + * Get the textual representation of the property + * + * @return string + */ + public function toString() + { + return sprintf( + '%1$s: %2$s;', + $this->name, + $this->value + ); + } +} diff --git a/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php new file mode 100644 index 0000000..d183262 --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Processor.php @@ -0,0 +1,163 @@ +cleanup($rulesString); + + return (array) explode('}', $rulesString); + } + + /** + * @param string $string + * + * @return string + */ + private function cleanup($string) + { + $string = str_replace(array("\r", "\n"), '', $string); + $string = str_replace(array("\t"), ' ', $string); + $string = str_replace('"', '\'', $string); + $string = preg_replace('|/\*.*?\*/|', '', $string); + $string = preg_replace('/\s\s+/', ' ', $string); + + $string = trim($string); + $string = rtrim($string, '}'); + + return $string; + } + + /** + * Converts a rule-string into an object + * + * @param string $rule + * @param int $originalOrder + * + * @return Rule[] + */ + public function convertToObjects($rule, $originalOrder) + { + $rule = $this->cleanup($rule); + + $chunks = explode('{', $rule); + if (!isset($chunks[1])) { + return array(); + } + $propertiesProcessor = new PropertyProcessor(); + $rules = array(); + $selectors = (array) explode(',', trim($chunks[0])); + $properties = $propertiesProcessor->splitIntoSeparateProperties($chunks[1]); + + foreach ($selectors as $selector) { + $selector = trim($selector); + $specificity = $this->calculateSpecificityBasedOnASelector($selector); + + $rules[] = new Rule( + $selector, + $propertiesProcessor->convertArrayToObjects($properties, $specificity), + $specificity, + $originalOrder + ); + } + + return $rules; + } + + /** + * Calculates the specificity based on a CSS Selector string, + * Based on the patterns from premailer/css_parser by Alex Dunae + * + * @see https://github.com/premailer/css_parser/blob/master/lib/css_parser/regexps.rb + * + * @param string $selector + * + * @return Specificity + */ + public function calculateSpecificityBasedOnASelector($selector) + { + $idSelectorsPattern = " \#"; + $classAttributesPseudoClassesSelectorsPattern = " (\.[\w]+) # classes + | + \[(\w+) # attributes + | + (\:( # pseudo classes + link|visited|active + |hover|focus + |lang + |target + |enabled|disabled|checked|indeterminate + |root + |nth-child|nth-last-child|nth-of-type|nth-last-of-type + |first-child|last-child|first-of-type|last-of-type + |only-child|only-of-type + |empty|contains + ))"; + + $typePseudoElementsSelectorPattern = " ((^|[\s\+\>\~]+)[\w]+ # elements + | + \:{1,2}( # pseudo-elements + after|before + |first-letter|first-line + |selection + ) + )"; + + return new Specificity( + preg_match_all("/{$idSelectorsPattern}/ix", $selector, $matches), + preg_match_all("/{$classAttributesPseudoClassesSelectorsPattern}/ix", $selector, $matches), + preg_match_all("/{$typePseudoElementsSelectorPattern}/ix", $selector, $matches) + ); + } + + /** + * @param string[] $rules + * @param Rule[] $objects + * + * @return Rule[] + */ + public function convertArrayToObjects(array $rules, array $objects = array()) + { + $order = 1; + foreach ($rules as $rule) { + $objects = array_merge($objects, $this->convertToObjects($rule, $order)); + $order++; + } + + return $objects; + } + + /** + * Sorts an array on the specificity element in an ascending way + * Lower specificity will be sorted to the beginning of the array + * + * @param Rule $e1 The first element. + * @param Rule $e2 The second element. + * + * @return int + */ + public static function sortOnSpecificity(Rule $e1, Rule $e2) + { + $e1Specificity = $e1->getSpecificity(); + $value = $e1Specificity->compareTo($e2->getSpecificity()); + + // if the specificity is the same, use the order in which the element appeared + if ($value === 0) { + $value = $e1->getOrder() - $e2->getOrder(); + } + + return $value; + } +} diff --git a/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php new file mode 100644 index 0000000..563889e --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/src/Css/Rule/Rule.php @@ -0,0 +1,85 @@ +selector = $selector; + $this->properties = $properties; + $this->specificity = $specificity; + $this->order = $order; + } + + /** + * Get selector + * + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Get properties + * + * @return Property[] + */ + public function getProperties() + { + return $this->properties; + } + + /** + * Get specificity + * + * @return Specificity + */ + public function getSpecificity() + { + return $this->specificity; + } + + /** + * Get order + * + * @return int + */ + public function getOrder() + { + return $this->order; + } +} diff --git a/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php b/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php new file mode 100644 index 0000000..3268c5f --- /dev/null +++ b/vendor/tijsverkoyen/css-to-inline-styles/src/CssToInlineStyles.php @@ -0,0 +1,240 @@ +cssConverter = new CssSelectorConverter(); + } + } + + /** + * Will inline the $css into the given $html + * + * Remark: if the html contains